VirtualBox

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

Last change on this file since 3183 was 3183, checked in by vboxsync, 18 years ago

2028: Add VT-x/AMD-V setting:

"Enable VT-x/AMD-V" setting check-box was added into VM & Global settings allowing user to choose if the VM should try to support host processor specific virtualization features.

"VRDP Auth Library" setting was added into Global settings allowing user to select the required Remote Desktop Auth library.

  • 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.215389.xyz. 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() * 3);
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.

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