VirtualBox

source: vbox/trunk/src/VBox/Frontends/VirtualBox/ui/VBoxGlobalSettingsDlg.ui.h@ 3254

Last change on this file since 3254 was 3217, checked in by vboxsync, 17 years ago

FE/Qt: Improved whatsthis wording; increased the default height of the whatsthis pane to 4 lines (instead of 3).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 33.7 KB
Line 
1/**
2 *
3 * VBox frontends: Qt GUI ("VirtualBox"):
4 * "Global settings" dialog UI include (Qt Designer)
5 */
6
7/*
8 * Copyright (C) 2006-2007 innotek GmbH
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License as published by the Free Software Foundation,
14 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
15 * distribution. VirtualBox OSE is distributed in the hope that it will
16 * be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * If you received this file as part of a commercial VirtualBox
19 * distribution, then only the terms of your commercial VirtualBox
20 * license agreement apply instead of the previous paragraph.
21 */
22
23/****************************************************************************
24** ui.h extension file, included from the uic-generated form implementation.
25**
26** If you wish to add, delete or rename functions or slots use
27** Qt Designer which will update this file, preserving your code. Create an
28** init() function in place of a constructor, and a destroy() function in
29** place of a destructor.
30*****************************************************************************/
31
32
33/* defined in VBoxGlobal.cpp */
34extern const char *gVBoxLangSubDir;
35extern const char *gVBoxLangFileBase;
36extern const char *gVBoxLangFileExt;
37extern const char *gVBoxLangIDRegExp;
38extern const char *gVBoxBuiltInLangName;
39
40/**
41 * Returns the path to the item in the form of 'grandparent > parent > item'
42 * using the text of the first column of every item.
43 */
44static QString path (QListViewItem *li)
45{
46 static QString sep = ": ";
47 QString p;
48 QListViewItem *cur = li;
49 while (cur)
50 {
51 if (!p.isNull())
52 p = sep + p;
53 p = cur->text (0).simplifyWhiteSpace() + p;
54 cur = cur->parent();
55 }
56 return p;
57}
58
59
60enum
61{
62 // listView column numbers
63 listView_Category = 0,
64 listView_Id = 1,
65 listView_Link = 2,
66};
67
68
69class USBListItem : public QCheckListItem
70{
71public:
72
73 USBListItem (QListView *aParent, QListViewItem *aAfter)
74 : QCheckListItem (aParent, aAfter, QString::null, CheckBox)
75 , mId (-1) {}
76
77 int mId;
78};
79enum { lvUSBFilters_Name = 0 };
80
81
82class LanguageItem : public QListViewItem
83{
84public:
85
86 enum { TypeId = 1001 };
87
88 LanguageItem (QListView *aParent, const QTranslator &aTranslator,
89 const QString &aId, bool aBuiltIn = false)
90 : QListViewItem (aParent), mBuiltIn (aBuiltIn), mInvalid (false)
91 {
92 Assert (!aId.isEmpty());
93
94 QTranslatorMessage transMes;
95
96 /* Note: context/source/comment arguments below must match strings
97 * used in VBoxGlobal::languageName() and friends (the latter are the
98 * source of information for the lupdate tool that generates
99 * translation files) */
100
101 QString nativeLanguage = tratra (aTranslator,
102 "@@@", "English", "Native language name");
103 QString nativeCountry = tratra (aTranslator,
104 "@@@", "--", "Native language country name "
105 "(empty if this language is for all countries)");
106
107 QString englishLanguage = tratra (aTranslator,
108 "@@@", "English", "Language name, in English");
109 QString englishCountry = tratra (aTranslator,
110 "@@@", "--", "Language country name, in English "
111 "(empty if native country name is empty)");
112
113 QString translatorsName = tratra (aTranslator,
114 "@@@", "innotek", "Comma-separated list of translators");
115
116 QString itemName = nativeLanguage;
117 QString langName = englishLanguage;
118
119 if (!aBuiltIn)
120 {
121 if (nativeCountry != "--")
122 itemName += " (" + nativeCountry + ")";
123
124 if (englishCountry != "--")
125 langName += " (" + englishCountry + ")";
126
127 if (itemName != langName)
128 langName = itemName + " / " + langName;
129 }
130 else
131 {
132 itemName += VBoxGlobalSettingsDlg::tr (" (built-in)", "Language");
133 langName += VBoxGlobalSettingsDlg::tr (" (built-in)", "Language");
134 }
135
136 setText (0, itemName);
137 setText (1, aId);
138 setText (2, langName);
139 setText (3, translatorsName);
140 }
141
142 /* Constructs an item for an invalid language ID (i.e. when a language
143 * file is missing or corrupt). */
144 LanguageItem (QListView *aParent, const QString &aId)
145 : QListViewItem (aParent), mBuiltIn (false), mInvalid (true)
146 {
147 Assert (!aId.isEmpty());
148
149 setText (0, QString ("<%1>").arg (aId));
150 setText (1, aId);
151 setText (2, VBoxGlobalSettingsDlg::tr ("<unavailable>", "Language"));
152 setText (3, VBoxGlobalSettingsDlg::tr ("<unknown>", "Author(s)"));
153 }
154
155 /* Constructs an item for the default language ID (column 1 will be set
156 * to QString::null) */
157 LanguageItem (QListView *aParent)
158 : QListViewItem (aParent), mBuiltIn (false), mInvalid (false)
159 {
160 setText (0, VBoxGlobalSettingsDlg::tr ("Default", "Language"));
161 setText (1, QString::null);
162 /* empty strings of some reasonable length to prevent the info part
163 * from being shrinked too much when the list wants to be wider */
164 setText (2, " ");
165 setText (3, " ");
166 }
167
168 int rtti() const { return TypeId; }
169
170 int compare (QListViewItem *aItem, int aColumn, bool aAscending) const
171 {
172 QString thisId = text (1);
173 QString thatId = aItem->text (1);
174 if (thisId.isNull())
175 return -1;
176 if (thatId.isNull())
177 return 1;
178 if (mBuiltIn)
179 return -1;
180 if (aItem->rtti() == TypeId && ((LanguageItem *) aItem)->mBuiltIn)
181 return 1;
182 return QListViewItem::compare (aItem, aColumn, aAscending);
183 }
184
185 void paintCell (QPainter *aPainter, const QColorGroup &aGroup,
186 int aColumn, int aWidth, int aAlign)
187 {
188 QFont font = aPainter->font();
189
190 if (mInvalid)
191 font.setItalic (true);
192 /* mark the effectively active language */
193 if (text (1) == VBoxGlobal::languageId())
194 font.setBold (true);
195
196 if (aPainter->font() != font)
197 aPainter->setFont (font);
198
199 QListViewItem::paintCell (aPainter, aGroup, aColumn, aWidth, aAlign);
200
201 if (mBuiltIn)
202 {
203 int y = height() - 1;
204 aPainter->setPen (aGroup.mid());
205 aPainter->drawLine (0, y, aWidth - 1, y);
206 }
207 }
208
209 int width (const QFontMetrics &aFM, const QListView *aLV, int aC) const
210 {
211 QFont font = aLV->font();
212
213 if (mInvalid)
214 font.setItalic (true);
215 /* mark the effectively active language */
216 if (text (1) == VBoxGlobal::languageId())
217 font.setBold (true);
218
219 QFontMetrics fm = aFM;
220 if (aLV->font() != font)
221 fm = QFontMetrics (font);
222
223 return QListViewItem::width (fm, aLV, aC);
224 }
225
226 void setup ()
227 {
228 QListViewItem::setup();
229 if (mBuiltIn)
230 setHeight (height() + 1);
231 }
232
233private:
234
235 QString tratra (const QTranslator &aTranslator, const char *aCtxt,
236 const char *aSrc, const char *aCmnt)
237 {
238 QString msg = aTranslator.findMessage (aCtxt, aSrc, aCmnt).translation();
239 /* return the source text if no translation is found */
240 if (msg.isEmpty())
241 msg = QString (aSrc);
242 return msg;
243 }
244
245 bool mBuiltIn : 1;
246 bool mInvalid : 1;
247};
248
249
250void VBoxGlobalSettingsDlg::init()
251{
252 polished = false;
253
254 setIcon (QPixmap::fromMimeSource ("global_settings_16px.png"));
255
256 /* all pages are initially valid */
257 valid = true;
258 buttonOk->setEnabled (true);
259 warningSpacer->changeSize (0, 0, QSizePolicy::Expanding);
260 warningLabel->setHidden (true);
261 warningPixmap->setHidden (true);
262
263 /* disable unselecting items by clicking in the unused area of the list */
264 new QIListViewSelectionPreserver (this, listView);
265 /* hide the header and internal columns */
266 listView->header()->hide();
267 listView->setColumnWidthMode (listView_Id, QListView::Manual);
268 listView->setColumnWidthMode (listView_Link, QListView::Manual);
269 listView->hideColumn (listView_Id);
270 listView->hideColumn (listView_Link);
271 /* sort by the id column (to have pages in the desired order) */
272 listView->setSorting (listView_Id);
273 listView->sort();
274
275 warningPixmap->setMaximumSize( 16, 16 );
276 warningPixmap->setPixmap( QMessageBox::standardIcon( QMessageBox::Warning ) );
277
278 /* page title font is derived from the system font */
279 QFont f = font();
280 f.setBold( true );
281 f.setPointSize( f.pointSize() + 2 );
282 titleLabel->setFont( f );
283
284 /* setup the what's this label */
285 QApplication::setGlobalMouseTracking (true);
286 qApp->installEventFilter (this);
287 whatsThisTimer = new QTimer (this);
288 connect (whatsThisTimer, SIGNAL (timeout()), this, SLOT (updateWhatsThis()));
289 whatsThisCandidate = NULL;
290
291 whatsThisLabel = new QIRichLabel (this, "whatsThisLabel");
292 VBoxGlobalSettingsDlgLayout->addWidget (whatsThisLabel, 2, 1);
293
294#ifndef DEBUG
295 /* Enforce rich text format to avoid jumping margins (margins of plain
296 * text labels seem to be smaller). We don't do it in the DEBUG builds to
297 * be able to immediately catch badly formatted text (i.e. text that
298 * contains HTML tags but doesn't start with <qt> so that Qt isn't able to
299 * recognize it as rich text and draws all tags as is instead of doing
300 * formatting). We want to catch this text because this is how it will look
301 * in the whatsthis balloon where we cannot enforce rich text. */
302 whatsThisLabel->setTextFormat (Qt::RichText);
303#endif
304
305 whatsThisLabel->setMaxHeightMode (true);
306 whatsThisLabel->setFocusPolicy (QWidget::NoFocus);
307 whatsThisLabel->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Fixed);
308 whatsThisLabel->setBackgroundMode (QLabel::PaletteMidlight);
309 whatsThisLabel->setFrameShape (QLabel::Box);
310 whatsThisLabel->setFrameShadow (QLabel::Sunken);
311 whatsThisLabel->setMargin (7);
312 whatsThisLabel->setScaledContents (FALSE);
313 whatsThisLabel->setAlignment (int (QLabel::WordBreak |
314 QLabel::AlignJustify |
315 QLabel::AlignTop));
316
317 whatsThisLabel->setFixedHeight (whatsThisLabel->frameWidth() * 2 +
318 6 /* seems that RichText adds some margin */ +
319 whatsThisLabel->fontMetrics().lineSpacing() * 4);
320 whatsThisLabel->setMinimumWidth (whatsThisLabel->frameWidth() * 2 +
321 6 /* seems that RichText adds some margin */ +
322 whatsThisLabel->fontMetrics().width ('m') * 40);
323
324 /*
325 * create and layout non-standard widgets
326 * ----------------------------------------------------------------------
327 */
328
329 hkeHostKey = new QIHotKeyEdit (grbKeyboard, "hkeHostKey");
330 hkeHostKey->setSizePolicy (QSizePolicy (QSizePolicy::Preferred, QSizePolicy::Fixed));
331 QWhatsThis::add (hkeHostKey,
332 tr ("Displays the key used as a Host Key in the VM window. Activate the "
333 "entry field and press a new Host Key. Note that alphanumeric, "
334 "cursor movement and editing keys cannot be used as a Host Key."));
335 layoutHostKey->addWidget (hkeHostKey);
336 txHostKey->setBuddy (hkeHostKey);
337 setTabOrder (listView, hkeHostKey);
338
339 /*
340 * setup connections and set validation for pages
341 * ----------------------------------------------------------------------
342 */
343
344 /* General page */
345
346/// @todo (dmik) remove
347// leVDIFolder->setValidator (new QRegExpValidator (QRegExp (".+"), this));
348// leMachineFolder->setValidator (new QRegExpValidator (QRegExp (".+"), this));
349
350 wvalGeneral = new QIWidgetValidator (pageGeneral, this);
351 connect (wvalGeneral, SIGNAL (validityChanged (const QIWidgetValidator *)),
352 this, SLOT (enableOk( const QIWidgetValidator *)));
353
354 /* Keyboard page */
355
356 wvalKeyboard = new QIWidgetValidator( pageKeyboard, this );
357 connect (wvalKeyboard, SIGNAL (validityChanged (const QIWidgetValidator *)),
358 this, SLOT (enableOk( const QIWidgetValidator *)));
359
360 /* USB page */
361
362 lvUSBFilters->header()->hide();
363 /* disable sorting */
364 lvUSBFilters->setSorting (-1);
365 /* disable unselecting items by clicking in the unused area of the list */
366 new QIListViewSelectionPreserver (this, lvUSBFilters);
367 wstUSBFilters = new QWidgetStack (grbUSBFilters, "wstUSBFilters");
368 grbUSBFiltersLayout->addWidget (wstUSBFilters);
369 /* create a default (disabled) filter settings widget at index 0 */
370 VBoxUSBFilterSettings *settings = new VBoxUSBFilterSettings (wstUSBFilters);
371 settings->setup (VBoxUSBFilterSettings::HostType);
372 wstUSBFilters->addWidget (settings, 0);
373 lvUSBFilters_currentChanged (NULL);
374 /* setup toolbutton icons */
375 tbAddUSBFilter->setIconSet (VBoxGlobal::iconSet ("usb_new_16px.png",
376 "usb_new_disabled_16px.png"));
377 tbAddUSBFilterFrom->setIconSet (VBoxGlobal::iconSet ("usb_add_16px.png",
378 "usb_add_disabled_16px.png"));
379 tbRemoveUSBFilter->setIconSet (VBoxGlobal::iconSet ("usb_remove_16px.png",
380 "usb_remove_disabled_16px.png"));
381 tbUSBFilterUp->setIconSet (VBoxGlobal::iconSet ("usb_moveup_16px.png",
382 "usb_moveup_disabled_16px.png"));
383 tbUSBFilterDown->setIconSet (VBoxGlobal::iconSet ("usb_movedown_16px.png",
384 "usb_movedown_disabled_16px.png"));
385 /* create menu of existing usb-devices */
386 usbDevicesMenu = new VBoxUSBMenu (this);
387 connect (usbDevicesMenu, SIGNAL(activated(int)), this, SLOT(menuAddUSBFilterFrom_activated(int)));
388 mUSBFilterListModified = false;
389
390 /*
391 * set initial values
392 * ----------------------------------------------------------------------
393 */
394
395 /* General page */
396
397 /* keyboard page */
398
399 /* Language page */
400
401 lvLanguages->header()->hide();
402 lvLanguages->setSorting (0);
403 QString nlsPath = qApp->applicationDirPath() + gVBoxLangSubDir;
404 QDir nlsDir (nlsPath);
405 QStringList files = nlsDir.entryList (QString ("%1*%2")
406 .arg (gVBoxLangFileBase, gVBoxLangFileExt),
407 QDir::Files);
408 QTranslator translator;
409 /* add the default language */
410 new LanguageItem (lvLanguages);
411 /* add the built-in language */
412 new LanguageItem (lvLanguages, translator, gVBoxBuiltInLangName, true /* built-in */);
413 /* add all existing languages */
414 for (QStringList::Iterator it = files.begin(); it != files.end(); ++ it)
415 {
416 QString fileName = *it;
417 QRegExp regExp (QString (gVBoxLangFileBase) + gVBoxLangIDRegExp);
418 int pos = regExp.search (fileName);
419 if (pos == -1)
420 continue;
421
422 bool loadOk = translator.load (fileName, nlsPath);
423 if (!loadOk)
424 continue;
425
426 new LanguageItem (lvLanguages, translator, regExp.cap (1));
427 }
428 lvLanguages->adjustColumn (0);
429
430 /*
431 * update the Ok button state for pages with validation
432 * (validityChanged() connected to enableNext() will do the job)
433 */
434 wvalGeneral->revalidate();
435 wvalKeyboard->revalidate();
436}
437
438bool VBoxGlobalSettingsDlg::event (QEvent *aEvent)
439{
440 bool result = QWidget::event (aEvent);
441 if (aEvent->type() == QEvent::LanguageChange)
442 {
443 /* set the first item selected */
444 listView->setSelected (listView->firstChild(), true);
445 listView_currentChanged (listView->firstChild());
446 lvLanguages_currentChanged (lvLanguages->currentItem());
447 mLanguageChanged = false;
448 fixLanguageChange();
449 }
450 return result;
451}
452
453bool VBoxGlobalSettingsDlg::eventFilter (QObject *object, QEvent *event)
454{
455 if (!object->isWidgetType())
456 return QDialog::eventFilter (object, event);
457
458 QWidget *widget = static_cast <QWidget *> (object);
459 if (widget->topLevelWidget() != this)
460 return QDialog::eventFilter (object, event);
461
462 switch (event->type())
463 {
464 case QEvent::Enter:
465 case QEvent::Leave:
466 {
467 if (event->type() == QEvent::Enter)
468 whatsThisCandidate = widget;
469 else
470 whatsThisCandidate = NULL;
471 whatsThisTimer->start (100, true /* sshot */);
472 break;
473 }
474 case QEvent::FocusIn:
475 {
476 updateWhatsThis (true /* gotFocus */);
477 break;
478 }
479 case QEvent::Show:
480 {
481 if (widget == pageLanguage)
482 lvLanguages->updateGeometry();
483 break;
484 }
485 default:
486 break;
487 }
488
489 return QDialog::eventFilter (object, event);
490}
491
492void VBoxGlobalSettingsDlg::showEvent (QShowEvent *e)
493{
494 QDialog::showEvent (e);
495
496 /* one may think that QWidget::polish() is the right place to do things
497 * below, but apparently, by the time when QWidget::polish() is called,
498 * the widget style & layout are not fully done, at least the minimum
499 * size hint is not properly calculated. Since this is sometimes necessary,
500 * we provide our own "polish" implementation. */
501
502 if (polished)
503 return;
504
505 polished = true;
506
507 /* update geometry for the dynamically added usb-page to ensure proper
508 * sizeHint calculation by the Qt layout manager */
509 wstUSBFilters->updateGeometry();
510 /* let our toplevel widget calculate its sizeHint properly */
511 QApplication::sendPostedEvents (0, 0);
512
513 /* resize to the miminum possible size */
514 resize (minimumSize());
515
516 VBoxGlobal::centerWidget (this, parentWidget());
517}
518
519void VBoxGlobalSettingsDlg::listView_currentChanged (QListViewItem *item)
520{
521 Assert (item);
522 int id = item->text (1).toInt();
523 Assert (id >= 0);
524 titleLabel->setText (::path (item));
525 widgetStack->raiseWidget (id);
526}
527
528void VBoxGlobalSettingsDlg::enableOk (const QIWidgetValidator *wval)
529{
530 Q_UNUSED (wval);
531
532 /* detect the overall validity */
533 bool newValid = true;
534 {
535 QObjectList *l = this->queryList ("QIWidgetValidator");
536 QObjectListIt it (*l);
537 QObject *obj;
538 while ((obj = it.current()) != 0)
539 {
540 newValid &= ((QIWidgetValidator *) obj)->isValid();
541 ++it;
542 }
543 delete l;
544 }
545
546 if (valid != newValid)
547 {
548 valid = newValid;
549 buttonOk->setEnabled (valid);
550 if (valid)
551 warningSpacer->changeSize (0, 0, QSizePolicy::Expanding);
552 else
553 warningSpacer->changeSize (0, 0);
554 warningLabel->setHidden (valid);
555 warningPixmap->setHidden (valid);
556 }
557}
558
559void VBoxGlobalSettingsDlg::revalidate (QIWidgetValidator * /*wval*/)
560{
561 /* do individual validations for pages */
562
563 /* currently nothing */
564}
565
566/**
567 * Reads global settings from the given VBoxGlobalSettings instance
568 * and from the given CSystemProperties object.
569 */
570void VBoxGlobalSettingsDlg::getFrom (const CSystemProperties &props,
571 const VBoxGlobalSettings &gs)
572{
573 /* default folders */
574
575 leVDIFolder->setText (props.GetDefaultVDIFolder());
576 leMachineFolder->setText (props.GetDefaultMachineFolder());
577
578 /* vrdp lib path */
579 leVRDPLib->setText (props.GetRemoteDisplayAuthLibrary());
580
581 /* VT-x/AMD-V */
582 chbVTX->setChecked (props.GetHWVirtExEnabled());
583
584 /* proprietary GUI settings */
585
586 hkeHostKey->setKey (gs.hostKey() );
587 chbAutoCapture->setChecked (gs.autoCapture());
588
589 /* usb filters page */
590
591 /// @todo currently, we always disable USB UI on XPCOM-based hosts because
592 /// QueryInterface on CUSBDeviceFilter doesn't return CHostUSBDeviceFilter
593 /// for host filters (most likely, our XPCOM/IPC/DCONNECT bug).
594
595#ifdef DEBUG_dmik
596#ifdef Q_OS_WIN32
597 CHost host = vboxGlobal().virtualBox().GetHost();
598 CHostUSBDeviceFilterCollection coll = host.GetUSBDeviceFilters();
599 if (coll.isNull())
600 {
601#endif
602#endif
603 /* disable the USB host filters category if the USB is
604 * not available (i.e. in VirtualBox OSE) */
605
606 QListViewItem *usbItem = listView->findItem ("#usb", listView_Link);
607 Assert (usbItem);
608 usbItem->setVisible (false);
609
610 /* disable validators if any */
611 pageUSB->setEnabled (false);
612
613#ifdef DEBUG_dmik
614#ifdef Q_OS_WIN32
615 /* Show an error message (if there is any).
616 * This message box may be suppressed if the user wishes so. */
617 vboxProblem().cannotAccessUSB (host);
618 }
619 else
620 {
621 CHostUSBDeviceFilterEnumerator en = coll.Enumerate();
622 while (en.HasMore())
623 {
624 CHostUSBDeviceFilter hostFilter = en.GetNext();
625 CUSBDeviceFilter filter = CUnknown (hostFilter);
626 addUSBFilter (filter, false);
627 }
628 lvUSBFilters->setCurrentItem (lvUSBFilters->firstChild());
629 lvUSBFilters_currentChanged (lvUSBFilters->firstChild());
630 }
631#endif
632#endif
633
634 /* language properties */
635
636 QString langId = gs.languageId();
637 QListViewItem *item = lvLanguages->findItem (langId, 1);
638 if (!item)
639 {
640 /* add an item for an invalid language to represent it in the list */
641 item = new LanguageItem (lvLanguages, langId);
642 lvLanguages->adjustColumn (0);
643 }
644 Assert (item);
645 if (item)
646 {
647 lvLanguages->setCurrentItem (item);
648 lvLanguages->setSelected (item, true);
649 }
650}
651
652/**
653 * Writes global settings to the given VBoxGlobalSettings instance
654 * and to the given CSystemProperties object.
655 */
656void VBoxGlobalSettingsDlg::putBackTo (CSystemProperties &props,
657 VBoxGlobalSettings &gs)
658{
659 /* default folders */
660
661 if (leVDIFolder->isModified())
662 props.SetDefaultVDIFolder (leVDIFolder->text());
663 if (props.isOk() && leMachineFolder->isModified())
664 props.SetDefaultMachineFolder (leMachineFolder->text());
665
666 /* vrdp lib path */
667 if (leVRDPLib->isModified())
668 props.SetRemoteDisplayAuthLibrary (leVRDPLib->text());
669
670 /* VT-x/AMD-V */
671 props.SetHWVirtExEnabled (chbVTX->isChecked());
672
673 if (!props.isOk())
674 return;
675
676 /* proprietary GUI settings */
677
678 gs.setHostKey (hkeHostKey->key());
679 gs.setAutoCapture (chbAutoCapture->isChecked());
680
681 /* usb filter page */
682
683 /*
684 * first, remove all old filters (only if the list is changed,
685 * not only individual properties of filters)
686 */
687 CHost host = vboxGlobal().virtualBox().GetHost();
688 if (mUSBFilterListModified)
689 for (ulong cnt = host.GetUSBDeviceFilters().GetCount(); cnt; -- cnt)
690 host.RemoveUSBDeviceFilter (0);
691
692 /* then add all new filters */
693 for (QListViewItem *item = lvUSBFilters->firstChild(); item;
694 item = item->nextSibling())
695 {
696 USBListItem *uli = static_cast <USBListItem *> (item);
697 VBoxUSBFilterSettings *settings =
698 static_cast <VBoxUSBFilterSettings *>
699 (wstUSBFilters->widget (uli->mId));
700 Assert (settings);
701
702 COMResult res = settings->putBackToFilter();
703 if (!res.isOk())
704 return;
705
706 CUSBDeviceFilter filter = settings->filter();
707 filter.SetActive (uli->isOn());
708
709 CHostUSBDeviceFilter insertedFilter = CUnknown (filter);
710 if (mUSBFilterListModified)
711 host.InsertUSBDeviceFilter (host.GetUSBDeviceFilters().GetCount(),
712 insertedFilter);
713 }
714 mUSBFilterListModified = false;
715
716 /* language properties */
717
718 QListViewItem *selItem = lvLanguages->selectedItem();
719 Assert (selItem);
720 if (mLanguageChanged && selItem)
721 {
722 gs.setLanguageId (selItem->text (1));
723 VBoxGlobal::loadLanguage (selItem->text (1));
724 }
725}
726
727void VBoxGlobalSettingsDlg::updateWhatsThis (bool gotFocus /* = false */)
728{
729 QString text;
730
731 QWidget *widget = NULL;
732 if (!gotFocus)
733 {
734 if (whatsThisCandidate != NULL && whatsThisCandidate != this)
735 widget = whatsThisCandidate;
736 }
737 else
738 {
739 widget = focusData()->focusWidget();
740 }
741 /* if the given widget lacks the whats'this text, look at its parent */
742 while (widget && widget != this)
743 {
744 text = QWhatsThis::textFor (widget);
745 if (!text.isEmpty())
746 break;
747 widget = widget->parentWidget();
748 }
749
750 if (text.isEmpty() && !warningString.isEmpty())
751 text = warningString;
752 if (text.isEmpty())
753 text = QWhatsThis::textFor (this);
754
755 whatsThisLabel->setText (text);
756}
757
758void VBoxGlobalSettingsDlg::setWarning (const QString &warning)
759{
760 warningString = warning;
761 if (!warning.isEmpty())
762 warningString = QString ("<font color=red>%1</font>").arg (warning);
763
764 if (!warningString.isEmpty())
765 whatsThisLabel->setText (warningString);
766 else
767 updateWhatsThis (true);
768}
769
770void VBoxGlobalSettingsDlg::tbResetFolder_clicked()
771{
772 QToolButton *tb = ::qt_cast <QToolButton *> (sender());
773 Assert (tb);
774
775 QLineEdit *le = 0;
776 if (tb == tbResetVDIFolder) le = leVDIFolder;
777 else if (tb == tbResetMachineFolder) le = leMachineFolder;
778 else if (tb == tbResetVRDPLib) le = leVRDPLib;
779 Assert (le);
780
781 /*
782 * do this instead of le->setText (QString::null) to cause
783 * isModified() return true
784 */
785 le->selectAll();
786 le->del();
787}
788
789void VBoxGlobalSettingsDlg::tbSelectFolder_clicked()
790{
791 QToolButton *tb = ::qt_cast <QToolButton *> (sender());
792 Assert (tb);
793
794 QLineEdit *le = 0;
795 if (tb == tbSelectVDIFolder) le = leVDIFolder;
796 else if (tb == tbSelectMachineFolder) le = leMachineFolder;
797 else if (tb == tbSelectVRDPLib) le = leVRDPLib;
798 Assert (le);
799
800 QString initDir = VBoxGlobal::getFirstExistingDir (le->text());
801 if (initDir.isNull())
802 initDir = vboxGlobal().virtualBox().GetHomeFolder();
803
804 QString path = le == leVRDPLib ?
805 VBoxGlobal::getOpenFileName (initDir, QString::null, this,
806 "getFile", QString::null) :
807 VBoxGlobal::getExistingDirectory (initDir, this);
808 if (path.isNull())
809 return;
810
811 path = QDir::convertSeparators (path);
812 /* remove trailing slash if any */
813 path.remove (QRegExp ("[\\\\/]$"));
814
815 /*
816 * do this instead of le->setText (path) to cause
817 * isModified() return true
818 */
819 le->selectAll();
820 le->insert (path);
821}
822
823// USB Filter stuff
824////////////////////////////////////////////////////////////////////////////////
825
826void VBoxGlobalSettingsDlg::addUSBFilter (const CUSBDeviceFilter &aFilter,
827 bool aIsNew)
828{
829 QListViewItem *currentItem = aIsNew
830 ? lvUSBFilters->currentItem()
831 : lvUSBFilters->lastItem();
832
833 VBoxUSBFilterSettings *settings = new VBoxUSBFilterSettings (wstUSBFilters);
834 settings->setup (VBoxUSBFilterSettings::HostType);
835 settings->getFromFilter (aFilter);
836
837 USBListItem *item = new USBListItem (lvUSBFilters, currentItem);
838 item->setOn (aFilter.GetActive());
839 item->setText (lvUSBFilters_Name, aFilter.GetName());
840
841 item->mId = wstUSBFilters->addWidget (settings);
842
843 /* fix the tab order so that main dialog's buttons are always the last */
844 setTabOrder (settings->focusProxy(), buttonHelp);
845 setTabOrder (buttonHelp, buttonOk);
846 setTabOrder (buttonOk, buttonCancel);
847
848 if (aIsNew)
849 {
850 lvUSBFilters->setSelected (item, true);
851 lvUSBFilters_currentChanged (item);
852 settings->leUSBFilterName->setFocus();
853 }
854
855 connect (settings->leUSBFilterName, SIGNAL (textChanged (const QString &)),
856 this, SLOT (lvUSBFilters_setCurrentText (const QString &)));
857
858 /* setup validation */
859
860 QIWidgetValidator *wval = new QIWidgetValidator (settings, settings);
861 connect (wval, SIGNAL (validityChanged (const QIWidgetValidator *)),
862 this, SLOT (enableOk (const QIWidgetValidator *)));
863
864 wval->revalidate();
865}
866
867void VBoxGlobalSettingsDlg::lvUSBFilters_currentChanged (QListViewItem *item)
868{
869 if (item && lvUSBFilters->selectedItem() != item)
870 lvUSBFilters->setSelected (item, true);
871
872 tbRemoveUSBFilter->setEnabled (!!item);
873
874 tbUSBFilterUp->setEnabled (!!item && item->itemAbove());
875 tbUSBFilterDown->setEnabled (!!item && item->itemBelow());
876
877 if (item)
878 {
879 USBListItem *uli = static_cast <USBListItem *> (item);
880 wstUSBFilters->raiseWidget (uli->mId);
881 }
882 else
883 {
884 /* raise the disabled widget */
885 wstUSBFilters->raiseWidget (0);
886 }
887}
888
889void VBoxGlobalSettingsDlg::lvUSBFilters_setCurrentText (const QString &aText)
890{
891 QListViewItem *item = lvUSBFilters->currentItem();
892 Assert (item);
893
894 item->setText (lvUSBFilters_Name, aText);
895}
896
897void VBoxGlobalSettingsDlg::tbAddUSBFilter_clicked()
898{
899 /* search for the max available filter index */
900 int maxFilterIndex = 0;
901 QString usbFilterName = tr ("New Filter %1", "usb");
902 QRegExp regExp (QString ("^") + usbFilterName.arg ("([0-9]+)") + QString ("$"));
903 QListViewItemIterator iterator (lvUSBFilters);
904 while (*iterator)
905 {
906 QString filterName = (*iterator)->text (lvUSBFilters_Name);
907 int pos = regExp.search (filterName);
908 if (pos != -1)
909 maxFilterIndex = regExp.cap (1).toInt() > maxFilterIndex ?
910 regExp.cap (1).toInt() : maxFilterIndex;
911 ++ iterator;
912 }
913
914 /* create a new usb filter */
915 CHost host = vboxGlobal().virtualBox().GetHost();
916 CHostUSBDeviceFilter hostFilter = host
917 .CreateUSBDeviceFilter (usbFilterName.arg (maxFilterIndex + 1));
918 hostFilter.SetAction (CEnums::USBDeviceFilterHold);
919
920 CUSBDeviceFilter filter = CUnknown (hostFilter);
921 filter.SetActive (true);
922 addUSBFilter (filter, true);
923
924 mUSBFilterListModified = true;
925}
926
927void VBoxGlobalSettingsDlg::tbAddUSBFilterFrom_clicked()
928{
929 usbDevicesMenu->exec (QCursor::pos());
930}
931
932void VBoxGlobalSettingsDlg::menuAddUSBFilterFrom_activated (int aIndex)
933{
934 CUSBDevice usb = usbDevicesMenu->getUSB (aIndex);
935
936 // if null then some other item but a USB device is selected
937 if (usb.isNull())
938 return;
939
940 CHost host = vboxGlobal().virtualBox().GetHost();
941 CHostUSBDeviceFilter hostFilter = host
942 .CreateUSBDeviceFilter (vboxGlobal().details (usb));
943 hostFilter.SetAction (CEnums::USBDeviceFilterHold);
944
945 CUSBDeviceFilter filter = CUnknown (hostFilter);
946 filter.SetVendorId (QString().sprintf ("%04hX", usb.GetVendorId()));
947 filter.SetProductId (QString().sprintf ("%04hX", usb.GetProductId()));
948 filter.SetRevision (QString().sprintf ("%04hX", usb.GetRevision()));
949 /* The port property depends on the host computer rather than on the USB
950 * device itself; for this reason only a few people will want to use it in
951 * the filter since the same device plugged into a different socket will
952 * not match the filter in this case. */
953#if 0
954 /// @todo set it anyway if Alt is currently pressed
955 filter.SetPort (QString().sprintf ("%04hX", usb.GetPort()));
956#endif
957 filter.SetManufacturer (usb.GetManufacturer());
958 filter.SetProduct (usb.GetProduct());
959 filter.SetSerialNumber (usb.GetSerialNumber());
960 filter.SetRemote (usb.GetRemote() ? "yes" : "no");
961
962 filter.SetActive (true);
963 addUSBFilter (filter, true);
964
965 mUSBFilterListModified = true;
966}
967
968void VBoxGlobalSettingsDlg::tbRemoveUSBFilter_clicked()
969{
970 QListViewItem *item = lvUSBFilters->currentItem();
971 Assert (item);
972
973 USBListItem *uli = static_cast <USBListItem *> (item);
974 QWidget *settings = wstUSBFilters->widget (uli->mId);
975 Assert (settings);
976 wstUSBFilters->removeWidget (settings);
977 delete settings;
978
979 delete item;
980
981 lvUSBFilters->setSelected (lvUSBFilters->currentItem(), true);
982 mUSBFilterListModified = true;
983}
984
985void VBoxGlobalSettingsDlg::tbUSBFilterUp_clicked()
986{
987 QListViewItem *item = lvUSBFilters->currentItem();
988 Assert (item);
989
990 QListViewItem *itemAbove = item->itemAbove();
991 Assert (itemAbove);
992 itemAbove = itemAbove->itemAbove();
993
994 if (!itemAbove)
995 item->itemAbove()->moveItem (item);
996 else
997 item->moveItem (itemAbove);
998
999 lvUSBFilters_currentChanged (item);
1000 mUSBFilterListModified = true;
1001}
1002
1003void VBoxGlobalSettingsDlg::tbUSBFilterDown_clicked()
1004{
1005 QListViewItem *item = lvUSBFilters->currentItem();
1006 Assert (item);
1007
1008 QListViewItem *itemBelow = item->itemBelow();
1009 Assert (itemBelow);
1010
1011 item->moveItem (itemBelow);
1012
1013 lvUSBFilters_currentChanged (item);
1014 mUSBFilterListModified = true;
1015}
1016
1017void VBoxGlobalSettingsDlg::lvLanguages_currentChanged (QListViewItem *aItem)
1018{
1019 Assert (aItem);
1020 if (!aItem) return;
1021
1022 /* disable labels for the Default language item */
1023 bool enabled = !aItem->text (1).isNull();
1024
1025 tlLangName->setEnabled (enabled);
1026 tlAuthorName->setEnabled (enabled);
1027 tlLangData->setText (aItem->text (2));
1028 tlAuthorData->setText (aItem->text (3));
1029
1030 mLanguageChanged = true;
1031}
1032
1033void VBoxGlobalSettingsDlg::fixLanguageChange()
1034{
1035 /* fix for usb page */
1036
1037 /// @todo currently, we always disable USB UI on XPCOM-based hosts because
1038 /// QueryInterface on CUSBDeviceFilter doesn't return CHostUSBDeviceFilter
1039 /// for host filters (most likely, our XPCOM/IPC/DCONNECT bug).
1040
1041#ifdef DEBUG_dmik
1042#ifdef Q_OS_WIN32
1043 CHost host = vboxGlobal().virtualBox().GetHost();
1044 CHostUSBDeviceFilterCollection coll = host.GetUSBDeviceFilters();
1045 if (coll.isNull())
1046 {
1047#endif
1048#endif
1049 /* disable the USB host filters category if the USB is
1050 * not available (i.e. in VirtualBox OSE) */
1051
1052 QListViewItem *usbItem = listView->findItem ("#usb", listView_Link);
1053 Assert (usbItem);
1054 usbItem->setVisible (false);
1055
1056 /* disable validators if any */
1057 pageUSB->setEnabled (false);
1058
1059#ifdef DEBUG_dmik
1060#ifdef Q_OS_WIN32
1061 }
1062#endif
1063#endif
1064}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette