languagechooser.cpp

上传用户:binglan008
上传日期:2007-01-28
资源大小:53508k
文件大小:5k
源码类别:Linux/Unix编程
开发平台:MultiPlatform
  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2005-2007 Trolltech ASA. All rights reserved.
  4. **
  5. ** This file is part of the example classes of the Qt Toolkit.
  6. **
  7. ** This file may be used under the terms of the GNU General Public
  8. ** License version 2.0 as published by the Free Software Foundation
  9. ** and appearing in the file LICENSE.GPL included in the packaging of
  10. ** this file.  Please review the following information to ensure GNU
  11. ** General Public Licensing requirements will be met:
  12. ** http://trolltech.com/products/qt/licenses/licensing/opensource/
  13. **
  14. ** If you are unsure which license is appropriate for your use, please
  15. ** review the following information:
  16. ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
  17. ** or contact the sales department at sales@trolltech.com.
  18. **
  19. ** In addition, as a special exception, Trolltech gives you certain
  20. ** additional rights. These rights are described in the Trolltech GPL
  21. ** Exception version 1.0, which can be found at
  22. ** http://www.trolltech.com/products/qt/gplexception/ and in the file
  23. ** GPL_EXCEPTION.txt in this package.
  24. **
  25. ** In addition, as a special exception, Trolltech, as the sole copyright
  26. ** holder for Qt Designer, grants users of the Qt/Eclipse Integration
  27. ** plug-in the right for the Qt/Eclipse Integration to link to
  28. ** functionality provided by Qt Designer and its related libraries.
  29. **
  30. ** Trolltech reserves all rights not expressly granted herein.
  31. **
  32. ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
  33. ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  34. **
  35. ****************************************************************************/
  36. #include <QtGui>
  37. #include "languagechooser.h"
  38. #include "mainwindow.h"
  39. #ifdef Q_WS_MAC
  40. extern void qt_mac_set_menubar_merge(bool merge);
  41. #endif
  42. LanguageChooser::LanguageChooser(QWidget *parent)
  43.     : QDialog(parent, Qt::WindowStaysOnTopHint)
  44. {
  45.     groupBox = new QGroupBox("Languages");
  46.     QGridLayout *groupBoxLayout = new QGridLayout;
  47.     QStringList qmFiles = findQmFiles();
  48.     for (int i = 0; i < qmFiles.size(); ++i) {
  49.         QCheckBox *checkBox = new QCheckBox(languageName(qmFiles[i]));
  50.         qmFileForCheckBoxMap.insert(checkBox, qmFiles[i]);
  51.         connect(checkBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxToggled()));
  52.         groupBoxLayout->addWidget(checkBox, i / 2, i % 2);
  53.     }
  54.     groupBox->setLayout(groupBoxLayout);
  55.     buttonBox = new QDialogButtonBox;
  56.     showAllButton = buttonBox->addButton("Show All",
  57.                                          QDialogButtonBox::ActionRole);
  58.     hideAllButton = buttonBox->addButton("Hide All",
  59.                                          QDialogButtonBox::ActionRole);
  60.     connect(showAllButton, SIGNAL(clicked()), this, SLOT(showAll()));
  61.     connect(hideAllButton, SIGNAL(clicked()), this, SLOT(hideAll()));
  62.     QVBoxLayout *mainLayout = new QVBoxLayout;
  63.     mainLayout->addWidget(groupBox);
  64.     mainLayout->addWidget(buttonBox);
  65.     setLayout(mainLayout);
  66. #ifdef Q_WS_MAC
  67.     qt_mac_set_menubar_merge(false);
  68. #endif
  69.     setWindowTitle("I18N");
  70. }
  71. bool LanguageChooser::eventFilter(QObject *object, QEvent *event)
  72. {
  73.     if (event->type() == QEvent::Close) {
  74.         MainWindow *window = qobject_cast<MainWindow *>(object);
  75.         if (window) {
  76.             QCheckBox *checkBox = mainWindowForCheckBoxMap.key(window);
  77.             if (checkBox)
  78.                 checkBox->setChecked(false);
  79.         }
  80.     }
  81.     return QWidget::eventFilter(object, event);
  82. }
  83. void LanguageChooser::closeEvent(QCloseEvent * /* event */)
  84. {
  85.     qApp->quit();
  86. }
  87. void LanguageChooser::checkBoxToggled()
  88. {
  89.     QCheckBox *checkBox = qobject_cast<QCheckBox *>(sender());
  90.     MainWindow *window = mainWindowForCheckBoxMap[checkBox];
  91.     if (!window) {
  92.         QTranslator translator;
  93.         translator.load(qmFileForCheckBoxMap[checkBox]);
  94.         qApp->installTranslator(&translator);
  95.         window = new MainWindow;
  96.         window->setPalette(colorForLanguage(checkBox->text()));
  97.         window->installEventFilter(this);
  98.         mainWindowForCheckBoxMap.insert(checkBox, window);
  99.     }
  100.     window->setVisible(checkBox->isChecked());
  101. }
  102. void LanguageChooser::showAll()
  103. {
  104.     foreach (QCheckBox *checkBox, qmFileForCheckBoxMap.keys())
  105.         checkBox->setChecked(true);
  106. }
  107. void LanguageChooser::hideAll()
  108. {
  109.     foreach (QCheckBox *checkBox, qmFileForCheckBoxMap.keys())
  110.         checkBox->setChecked(false);
  111. }
  112. QStringList LanguageChooser::findQmFiles()
  113. {
  114.     QDir dir(":/translations");
  115.     QStringList fileNames = dir.entryList(QStringList("*.qm"), QDir::Files,
  116.                                           QDir::Name);
  117.     QMutableStringListIterator i(fileNames);
  118.     while (i.hasNext()) {
  119.         i.next();
  120.         i.setValue(dir.filePath(i.value()));
  121.     }
  122.     return fileNames;
  123. }
  124. QString LanguageChooser::languageName(const QString &qmFile)
  125. {
  126.     QTranslator translator;
  127.     translator.load(qmFile);
  128.     return translator.translate("MainWindow", "English");
  129. }
  130. QColor LanguageChooser::colorForLanguage(const QString &language)
  131. {
  132.     uint hashValue = qHash(language);
  133.     int red = 156 + (hashValue & 0x3F);
  134.     int green = 156 + ((hashValue >> 6) & 0x3F);
  135.     int blue = 156 + ((hashValue >> 12) & 0x3F);
  136.     return QColor(red, green, blue);
  137. }