From: Ilya K. <ik...@us...> - 2002-05-25 23:12:35
|
Update of /cvsroot/licq/qt-gui/src In directory usw-pr-cvs1:/tmp/cvs-serv29471 Modified Files: chatdlg.cpp chatdlg.h mainwin.cpp mainwin.h optionsdlg.cpp optionsdlg.h usercodec.cpp usercodec.h usereventdlg.cpp usereventdlg.h Log Message: - Removed 'Translations' from the Options screen. The per-user Encodings are both a more flexible (you can talk in different languages with different people; you don't rely on the system locale) and sensible (in sense of Qt using Unicode internally) way to support multiple encodings. *** IF ANYONE HAS COMPLAINTS ABOTU THIS CHANGE, please mail me instead of rolling it back. I've been using Encodings fine for the past half a year and if something stops you from using them, I'd be happy to help. *** - Instead of a global translation, the user can select a Default Encoding now in Options. This is the encoding which'll be set for newly added users. - Now we show less encodings by default (specifically, only encodings used on Windows + UTF-8). This would be less confusing for most users (huh? 3 Russian encodings? Which is the right one?). To enable a full list of encodings, check the 'Show all encodings' option in the Options dialog. Index: chatdlg.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/chatdlg.cpp,v retrieving revision 1.67 retrieving revision 1.68 diff -u -d -r1.67 -r1.68 --- chatdlg.cpp 15 Dec 2001 12:53:18 -0000 1.67 +++ chatdlg.cpp 25 May 2002 23:12:31 -0000 1.68 @@ -295,11 +295,27 @@ QString codec_name = QString::fromLatin1( codec->name() ).lower(); // TODO: determine best codec QPopupMenu *popupEncoding = new QPopupMenu; popupEncoding->setCheckable(true); - QStringList enc = UserCodec::encodings(); - for (uint i=0; i < enc.count(); i++) { - popupEncoding->insertItem(enc[i], this, SLOT(slot_setEncoding(int)), 0, i); - if (UserCodec::encodingForName(enc[i]).lower() == codec_name) - popupEncoding->setItemChecked(i, true); + + // populate the popup menu + UserCodec::encoding_t *it = &UserCodec::m_encodings[0]; + while(it->encoding != NULL) { + + if (QString::fromLatin1(it->encoding).lower() == codec_name) { + if (mainwin->m_bShowAllEncodings || it->isMinimal) { + popupEncoding->insertItem(UserCodec::nameForEncoding(it->encoding), this, SLOT(slot_setEncoding(int)), 0, it->mib); + } else { + // if the current encoding does not appear in the minimal list + popupEncoding->insertSeparator(0); + popupEncoding->insertItem(UserCodec::nameForEncoding(it->encoding), this, SLOT(slot_setEncoding(int)), 0, it->mib, 0); + } + popupEncoding->setItemChecked(it->mib, true); + } else { + if (mainwin->m_bShowAllEncodings || it->isMinimal) { + popupEncoding->insertItem(UserCodec::nameForEncoding(it->encoding), this, SLOT(slot_setEncoding(int)), 0, it->mib); + } + } + + ++it; } tbtEncoding = new QToolButton(barChat); @@ -904,22 +920,39 @@ return chatman->LocalPort(); } -void ChatDlg::slot_setEncoding(int encoding_index) +void ChatDlg::slot_setEncoding(int encodingMib) { - QPopupMenu *popupEncoding = tbtEncoding->popup(); - if (!popupEncoding) return; + /* initialize a codec according to the encoding menu item id */ + QString encoding( UserCodec::encodingForMib(encodingMib) ); - /* uncheck all encodings */ - for (unsigned int i=0; i<popupEncoding->count(); i++) { - popupEncoding->setItemChecked(popupEncoding->idAt(i), false); - } + if (!encoding.isNull()) { + QTextCodec * _codec = QTextCodec::codecForName(encoding.latin1()); + if (_codec == NULL) + { + WarnUser(this, QString(tr("Unable to load encoding <b>%1</b>. Message contents may appear garbled.")).arg(encoding)); + return; + } + codec = _codec; - /* initialize a codec according to the encoding menu's value */ - if ((encoding_index >= 0) && ((uint)encoding_index < UserCodec::encodings().count())) { - codec = QTextCodec::codecForName(UserCodec::encodingForIndex((uint) encoding_index).latin1()); + QPopupMenu * popupEncoding = tbtEncoding->popup(); + + /* uncheck all encodings */ + for (unsigned int i=0; i<popupEncoding->count(); ++i) { + popupEncoding->setItemChecked(popupEncoding->idAt(i), false); + } /* make the chosen encoding checked */ - popupEncoding->setItemChecked(encoding_index, true); + popupEncoding->setItemChecked(encodingMib, true); + + /* save prefered character set */ + ICQUser *u = gUserManager.FetchUser(m_nUin, LOCK_W); + if (u != NULL) { + u->SetEnableSave(false); + u->SetUserEncoding(encoding.latin1()); + u->SetEnableSave(true); + u->SaveLicqInfo(); + gUserManager.DropUser(u); + } emit encodingChanged(); } Index: chatdlg.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/chatdlg.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- chatdlg.h 6 Jan 2002 14:40:44 -0000 1.26 +++ chatdlg.h 25 May 2002 23:12:31 -0000 1.27 @@ -139,7 +139,7 @@ void SwitchToPaneMode(); void SwitchToIRCMode(); - void slot_setEncoding(int encoding_index); + void slot_setEncoding(int encodingMib); }; #endif Index: mainwin.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/mainwin.cpp,v retrieving revision 1.229 retrieving revision 1.230 diff -u -d -r1.229 -r1.230 --- mainwin.cpp 15 May 2002 09:29:37 -0000 1.229 +++ mainwin.cpp 25 May 2002 23:12:31 -0000 1.230 @@ -542,6 +542,12 @@ #endif // USE_KDE #endif // USE_DOCK + // all settings relating to localization + licqConf.SetSection("locale"); + licqConf.ReadStr("DefaultEncoding", szTemp, ""); + m_DefaultEncoding = QString::fromLatin1(szTemp); + licqConf.ReadBool("ShowAllEncodings", m_bShowAllEncodings, false); + autoAwayTimer.start(10000); // start the inactivity timer for auto away connect (&autoAwayTimer, SIGNAL(timeout()), this, SLOT(autoAway())); @@ -1173,7 +1179,7 @@ } case LIST_ADD: { - ICQUser *u = gUserManager.FetchUser(sig->Uin(), LOCK_R); + ICQUser *u = gUserManager.FetchUser(sig->Uin(), LOCK_W); if (u == NULL) { gLog.Warn("%sCMainWindow::slot_updatedList(): Invalid uin received: %ld\n", @@ -1199,6 +1205,11 @@ if (u->GetInGroup(m_nGroupType, m_nCurrentGroup) && show_user(u) ) (void) new CUserViewItem(u, userView); } + // as we intercept the user's addition, we set it our default codec + if (!m_DefaultEncoding.isEmpty()) + { + u->SetUserEncoding(m_DefaultEncoding.latin1()); + } gUserManager.DropUser(u); break; } @@ -2427,6 +2438,11 @@ sprintf(key, "Floaty%d.W", i); licqConf.WriteNum(key, (unsigned short)iter->width()); } + + // save settings relating to localization + licqConf.SetSection("locale"); + licqConf.WriteStr("DefaultEncoding", m_DefaultEncoding.latin1()); + licqConf.WriteBool("ShowAllEncodings", m_bShowAllEncodings); licqConf.FlushFile(); } Index: mainwin.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/mainwin.h,v retrieving revision 1.83 retrieving revision 1.84 diff -u -d -r1.83 -r1.84 --- mainwin.h 15 May 2002 09:30:44 -0000 1.83 +++ mainwin.h 25 May 2002 23:12:31 -0000 1.84 @@ -107,9 +107,11 @@ m_bPopCellular, m_bPopIP, m_bPopLastOnline, - m_bPopOnlineSince; + m_bPopOnlineSince, + m_bShowAllEncodings; QString m_MsgAutopopupKey; + QString m_DefaultEncoding; ColumnInfos colInfo; FlashType m_nFlash; Index: optionsdlg.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/optionsdlg.cpp,v retrieving revision 1.117 retrieving revision 1.118 diff -u -d -r1.117 -r1.118 --- optionsdlg.cpp 13 May 2002 16:02:35 -0000 1.117 +++ optionsdlg.cpp 25 May 2002 23:12:31 -0000 1.118 @@ -34,6 +34,7 @@ #include <qstylesheet.h> #include <qtabwidget.h> #include <qtoolbutton.h> +#include <qtextcodec.h> #ifdef USE_KDE #include <kapp.h> #include <kfontdialog.h> @@ -54,7 +55,7 @@ #include "licq_sar.h" #include "wharf.h" #include "skin.h" - +#include "usercodec.h" OptionsDlg::OptionsDlg(CMainWindow *_mainwin, tabs settab, QWidget *parent) @@ -308,25 +309,19 @@ tr("none") : QString(mainwin->licqDaemon->getUrlViewer())); edtTerminal->setText(mainwin->licqDaemon->Terminal() == NULL ? tr("none") : QString(mainwin->licqDaemon->Terminal())); - const char *pc = gTranslator.getMapName(); - if (strcmp(pc, "none") == 0) + + cmbDefaultEncoding->setCurrentItem(0); + // first combo box item is the locale encoding, so we skip it + for (int i = 1; i < cmbDefaultEncoding->count(); i++) { - cmbTrans->setCurrentItem(0); + if (UserCodec::encodingForName(cmbDefaultEncoding->text(i)) == mainwin->m_DefaultEncoding) + { + cmbDefaultEncoding->setCurrentItem(i); + break; + } } - else - { - unsigned short n = 1, c = cmbTrans->count(); - while (n < c && pc != cmbTrans->text(n)) n++; - if (n == c) - { - gLog.Error("%sError: Unable to find current translation map '%s' in translation directory.\n", - L_ERRORxSTR, pc); - cmbTrans->setEnabled(false); - } - else - cmbTrans->setCurrentItem(n); - } - + chkShowAllEncodings->setChecked(mainwin->m_bShowAllEncodings); + // set up the columns stuff int i; for (i = 0; i < int(mainwin->colInfo.size()); i++) @@ -519,19 +514,11 @@ // Plugin tab mainwin->licqDaemon->setUrlViewer(edtUrlViewer->text().local8Bit()); mainwin->licqDaemon->SetTerminal(edtTerminal->text().local8Bit()); - if (cmbTrans->isEnabled()) - { - if (cmbTrans->currentItem() == 0) - { - gTranslator.setDefaultTranslationMap(); - } - else - { - char szTransFileName[MAX_FILENAME_LEN]; - snprintf(szTransFileName, MAX_FILENAME_LEN, "%s/%s/%s", SHARE_DIR, TRANSLATION_DIR, QFile::encodeName(cmbTrans->currentText()).data()); - gTranslator.setTranslationMap(szTransFileName); - } - } + if (cmbDefaultEncoding->currentItem() > 0) + mainwin->m_DefaultEncoding = UserCodec::encodingForName(cmbDefaultEncoding->currentText()); + else + mainwin->m_DefaultEncoding = QString::null; + mainwin->m_bShowAllEncodings = chkShowAllEncodings->isChecked(); mainwin->autoAwayTime = spnAutoAway->value(); mainwin->autoNATime = spnAutoNa->value(); @@ -693,32 +680,23 @@ QWhatsThis::add(chkMsgChatView, tr("Show the current chat history in Send Window")); l = new QVBoxLayout(l); - boxLocale = new QGroupBox(2, Vertical, tr("Locale"), w); - lblTrans = new QLabel(tr("Translation:"), boxLocale); - QWhatsThis::add(lblTrans, tr("Sets which translation table should be used for " - "translating characters.")); - - cmbTrans = new QComboBox(false, boxLocale); - QString szTransFilesDir; - szTransFilesDir.sprintf("%s%s", SHARE_DIR, TRANSLATION_DIR); - QDir dTrans(szTransFilesDir, QString::null, QDir::Name, QDir::Files | QDir::Readable); - cmbTrans->insertItem(tr("none")); - cmbTrans->insertStringList(dTrans.entryList()); - - /*QString szLocaleFilesDir; - szLocaleFilesDir.sprintf("%sqt-gui/locale", SHARE_DIR); - QDir dLocale(szLocaleFilesDir, "*.qm", QDir::Name, QDir::Files | QDir::Readable); + boxLocale = new QGroupBox(1, Horizontal, tr("Localization"), w); + lblDefaultEncoding = new QLabel(tr("Default Encoding:"), boxLocale); + QWhatsThis::add(lblDefaultEncoding, tr("Sets which default encoding should be used for newly added contacts.")); - if (!dLocale.count()) + cmbDefaultEncoding = new QComboBox(false, boxLocale); + cmbDefaultEncoding->insertItem(tr("System default (%1)").arg(QString(QTextCodec::codecForLocale()->name()))); { - cmbLocale->insertItem(tr("NONE")); - cmbLocale->setEnabled(false); + UserCodec::encoding_t * it = &UserCodec::m_encodings[0]; + while (it->encoding != NULL) { + cmbDefaultEncoding->insertItem(UserCodec::nameForEncoding(it->encoding)); + ++it; + } } - else - { - cmbLocale->insertItem(tr("Auto")); - cmbLocale->insertStringList(dLocale.entryList()); - }*/ + + chkShowAllEncodings = new QCheckBox(tr("Show all encodings"), boxLocale); + QWhatsThis::add(chkShowAllEncodings, tr("Show all available encodings in the User Encoding selection menu. Normally, this menu shows only commonly used encodings.")); + #if QT_VERSION < 210 QWidget* dummy_w = new QWidget(boxLocale); if (dummy_w); Index: optionsdlg.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/optionsdlg.h,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- optionsdlg.h 13 May 2002 16:02:35 -0000 1.53 +++ optionsdlg.h 25 May 2002 23:12:31 -0000 1.54 @@ -99,13 +99,13 @@ // misc tab QWidget* new_misc_options(); QGroupBox *boxParanoia, *boxExtensions; - QLabel *lblUrlViewer, *lblTrans; + QLabel *lblUrlViewer, *lblDefaultEncoding; QLineEdit *edtUrlViewer; - QComboBox *cmbTrans; + QComboBox *cmbDefaultEncoding; QLabel *lblTerminal; QLineEdit *edtTerminal; QCheckBox *chkWebPresence, *chkHideIp, *chkIgnoreNewUsers, - *chkIgnoreWebPanel, *chkIgnoreMassMsg, *chkIgnoreEmailPager; + *chkIgnoreWebPanel, *chkIgnoreMassMsg, *chkIgnoreEmailPager, *chkShowAllEncodings; // status tab QWidget* new_status_options(); Index: usercodec.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/usercodec.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- usercodec.cpp 23 May 2002 23:28:48 -0000 1.12 +++ usercodec.cpp 25 May 2002 23:12:31 -0000 1.13 @@ -24,67 +24,59 @@ #include "licq_user.h" #include <qapplication.h> #include <qtextcodec.h> -#ifdef USE_KDE -#include <kglobal.h> -#include <kcharsets.h> -#endif #include "licq_user.h" #include "licq_chat.h" -QStringList* UserCodec::m_encodings; - - - -#ifndef USE_KDE -const char * UserCodec::encodings_array[][2] = { - { QT_TR_NOOP("Unicode"), "UTF-8" }, +UserCodec::encoding_t UserCodec::m_encodings[] = { + { QT_TR_NOOP("Unicode"), "UTF-8", 106, true }, - { QT_TR_NOOP("Arabic"), "ISO 8859-6" }, - { QT_TR_NOOP("Arabic"), "CP 1256" }, + { QT_TR_NOOP("Arabic"), "ISO 8859-6", 82, false }, + { QT_TR_NOOP("Arabic"), "CP 1256", 2256, true }, - { QT_TR_NOOP("Baltic"), "ISO 8859-13" }, - { QT_TR_NOOP("Baltic"), "CP 1257" }, + { QT_TR_NOOP("Baltic"), "ISO 8859-13", 109, false }, + { QT_TR_NOOP("Baltic"), "CP 1257", 2257, true }, - { QT_TR_NOOP("Central European"), "ISO 8859-2" }, - { QT_TR_NOOP("Central European"), "CP 1250" }, + { QT_TR_NOOP("Central European"), "ISO 8859-2", 5, false }, + { QT_TR_NOOP("Central European"), "CP 1250", 2250, true }, - { QT_TR_NOOP("Chinese"), "GBK" }, - { QT_TR_NOOP("Chinese Traditional"), "Big5" }, + { QT_TR_NOOP("Chinese"), "GBK", -2025, false }, + { QT_TR_NOOP("Chinese Traditional"), "Big5", 2026, true }, - { QT_TR_NOOP("Cyrillic"), "ISO 8859-5" }, - { QT_TR_NOOP("Cyrillic"), "KOI8-R" }, - { QT_TR_NOOP("Cyrillic"), "CP 1251" }, + { QT_TR_NOOP("Cyrillic"), "ISO 8859-5", 8, false }, + { QT_TR_NOOP("Cyrillic"), "KOI8-R", 2084, false }, + { QT_TR_NOOP("Cyrillic"), "CP 1251", 2251, true }, - { QT_TR_NOOP("Esperanto"), "ISO 8859-3" }, + { QT_TR_NOOP("Esperanto"), "ISO 8859-3", 6, false }, - { QT_TR_NOOP("Greek"), "ISO 8859-7" }, - { QT_TR_NOOP("Greek"), "CP 1253" }, + { QT_TR_NOOP("Greek"), "ISO 8859-7", 10, false }, + { QT_TR_NOOP("Greek"), "CP 1253", 2253, true }, // Visual Hebrew is avoided on purpose -- its not usable for communications - { QT_TR_NOOP("Hebrew"), "ISO 8859-8-I" }, - { QT_TR_NOOP("Hebrew"), "CP 1255" }, + { QT_TR_NOOP("Hebrew"), "ISO 8859-8-I", 85, false }, + { QT_TR_NOOP("Hebrew"), "CP 1255", 2255, true }, - { QT_TR_NOOP("Japanese"), "Shift-JIS" }, - { QT_TR_NOOP("Japanese"), "JIS7" }, - { QT_TR_NOOP("Japanese"), "eucJP" }, + { QT_TR_NOOP("Japanese"), "Shift-JIS", 17, true }, + { QT_TR_NOOP("Japanese"), "JIS7", 16, false }, + { QT_TR_NOOP("Japanese"), "eucJP", 18, false }, - { QT_TR_NOOP("Korean"), "eucKR" }, + { QT_TR_NOOP("Korean"), "eucKR", 38, true }, - { QT_TR_NOOP("Western European"), "ISO 8859-1" }, - { QT_TR_NOOP("Western European"), "ISO 8859-15" }, - { QT_TR_NOOP("Western European"), "CP 1252" }, + { QT_TR_NOOP("Western European"), "ISO 8859-1", 4, false }, + { QT_TR_NOOP("Western European"), "ISO 8859-15", 111, false }, + { QT_TR_NOOP("Western European"), "CP 1252", 2252, true }, - { QT_TR_NOOP("Tamil"), "TSCII" }, + { QT_TR_NOOP("Tamil"), "TSCII", 2028, true }, - { QT_TR_NOOP("Thai"), "TIS-620" }, + { QT_TR_NOOP("Thai"), "TIS-620", 2259, true }, - { QT_TR_NOOP("Turkish"), "ISO 8859-9" }, - { QT_TR_NOOP("Turkish"), "CP 1254" }, + { QT_TR_NOOP("Turkish"), "ISO 8859-9", 12, false }, + { QT_TR_NOOP("Turkish"), "CP 1254", 2254, true }, - { QT_TR_NOOP("Ukrainian"), "KOI8-U" } + { QT_TR_NOOP("Ukrainian"), "KOI8-U", 2088, false }, + + { 0, 0, 0, false } // end marker }; -#endif QTextCodec* UserCodec::codecForICQUser(ICQUser *u) { @@ -125,42 +117,32 @@ return QTextCodec::codecForLocale(); } -QString UserCodec::encodingForIndex(uint index) { - if ( !m_encodings ) UserCodec::initializeEncodingNames(); - -#ifdef USE_KDE - return KGlobal::charsets()->encodingForName(( *m_encodings )[index]); -#else - return encodings_array[index][1]; -#endif -} - -QStringList UserCodec::encodings() +QString UserCodec::encodingForMib(int mib) { - if ( !m_encodings ) UserCodec::initializeEncodingNames(); - return ( *m_encodings ); + encoding_t *it = &m_encodings[0]; + while (it->encoding != NULL) { + if (it->mib == mib) + return QString::fromLatin1(it->encoding); + it++; + } + + return QString::null; } -void UserCodec::initializeEncodingNames() +QString UserCodec::nameForEncoding(const QString &encoding) { - if (!m_encodings) { - m_encodings = new QStringList; -#ifdef USE_KDE - ( *m_encodings ) = KGlobal::charsets()->descriptiveEncodingNames(); -#else - for (uint i=0; i<(sizeof(encodings_array)/sizeof(encodings_array[0])); i++) { - ( *m_encodings ).append(qApp->translate("UserCodec", encodings_array[i][0]) + " ( " + encodings_array[i][1] + " )"); - } -#endif + encoding_t *it = &m_encodings[0]; + while (it->encoding != NULL) { + if (QString::fromLatin1(it->encoding) == encoding) + return qApp->translate("UserCodec", it->script) + " ( " + it->encoding + " )"; + it++; } + + return QString::null; } -QString UserCodec::encodingForName(QString descriptiveName) +QString UserCodec::encodingForName(const QString &descriptiveName) { -#ifdef USE_KDE - return KGlobal::charsets()->encodingForName(descriptiveName); -#else int left = descriptiveName.find( " ( " ); return descriptiveName.mid( left + 3, descriptiveName.find( " )", left ) - left - 3 ); -#endif } Index: usercodec.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/usercodec.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- usercodec.h 4 May 2002 15:24:19 -0000 1.5 +++ usercodec.h 25 May 2002 23:12:31 -0000 1.6 @@ -27,21 +27,25 @@ class UserCodec { public: + struct encoding_t { + const char *script; + const char *encoding; + int mib; + bool isMinimal; + }; + // Retrieves the codec for an ICQUser object static QTextCodec * codecForICQUser(ICQUser *u); // Retrieves the codec for an CChatUser object static QTextCodec * codecForCChatUser(CChatUser *u); // Helper function to retrieve the codec for an UIN static QTextCodec * codecForUIN(uint uin); - static QString encodingForIndex(uint index); - static QString encodingForName(QString descriptiveName); -#ifndef USE_KDE - static const char * encodings_array[][2]; -#endif - static QStringList encodings(); -private: - static QStringList* m_encodings; - static void initializeEncodingNames(); + static QString encodingForMib(int mib); + static QString nameForEncoding(const QString &encoding); + static QString encodingForName(const QString &descriptiveName); + +public: + static encoding_t m_encodings[]; }; #endif Index: usereventdlg.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/usereventdlg.cpp,v retrieving revision 1.75 retrieving revision 1.76 diff -u -d -r1.75 -r1.76 --- usereventdlg.cpp 25 May 2002 22:56:47 -0000 1.75 +++ usereventdlg.cpp 25 May 2002 23:12:31 -0000 1.76 @@ -142,13 +142,29 @@ gUserManager.DropUser(u); } - QString codec_name = QString( codec->name() ).lower(); + QString codec_name = QString::fromLatin1( codec->name() ).lower(); popupEncoding->setCheckable(true); - QStringList enc = UserCodec::encodings(); - for (uint i=0; i < enc.count(); i++) { - popupEncoding->insertItem(enc[i], this, SLOT(slot_setEncoding(int)), 0, i); - if (UserCodec::encodingForName(enc[i]).lower() == codec_name) - popupEncoding->setItemChecked(i, true); + + // populate the popup menu + UserCodec::encoding_t *it = &UserCodec::m_encodings[0]; + while(it->encoding != NULL) { + + if (QString::fromLatin1(it->encoding).lower() == codec_name) { + if (mainwin->m_bShowAllEncodings || it->isMinimal) { + popupEncoding->insertItem(UserCodec::nameForEncoding(it->encoding), this, SLOT(slot_setEncoding(int)), 0, it->mib); + } else { + // if the current encoding does not appear in the minimal list + popupEncoding->insertSeparator(0); + popupEncoding->insertItem(UserCodec::nameForEncoding(it->encoding), this, SLOT(slot_setEncoding(int)), 0, it->mib, 0); + } + popupEncoding->setItemChecked(it->mib, true); + } else { + if (mainwin->m_bShowAllEncodings || it->isMinimal) { + popupEncoding->insertItem(UserCodec::nameForEncoding(it->encoding), this, SLOT(slot_setEncoding(int)), 0, it->mib); + } + } + + ++it; } connect (sigman, SIGNAL(signal_updatedUser(CICQSignal *)), @@ -158,24 +174,32 @@ top_lay->addWidget(mainWidget); } -void UserEventCommon::slot_setEncoding(int encoding_index) { - /* uncheck all encodings */ - for (unsigned int i=0; i<popupEncoding->count(); i++) { - popupEncoding->setItemChecked(popupEncoding->idAt(i), false); - } +void UserEventCommon::slot_setEncoding(int encodingMib) { + /* initialize a codec according to the encoding menu item id */ + QString encoding( UserCodec::encodingForMib(encodingMib) ); - /* initialize a codec according to the encoding menu's value */ - if ((encoding_index >= 0) && ((uint)encoding_index < UserCodec::encodings().count())) { - codec = QTextCodec::codecForName(UserCodec::encodingForIndex((uint) encoding_index).latin1()); + if (!encoding.isNull()) { + QTextCodec * _codec = QTextCodec::codecForName(encoding.latin1()); + if (_codec == NULL) + { + WarnUser(this, QString(tr("Unable to load encoding <b>%1</b>. Message contents may appear garbled.")).arg(encoding)); + return; + } + codec = _codec; + + /* uncheck all encodings */ + for (unsigned int i=0; i<popupEncoding->count(); ++i) { + popupEncoding->setItemChecked(popupEncoding->idAt(i), false); + } /* make the chosen encoding checked */ - popupEncoding->setItemChecked(encoding_index, true); + popupEncoding->setItemChecked(encodingMib, true); /* save prefered character set */ ICQUser *u = gUserManager.FetchUser(m_nUin, LOCK_W); if (u != NULL) { u->SetEnableSave(false); - u->SetUserEncoding( codec->name() ); + u->SetUserEncoding(encoding.latin1()); u->SetEnableSave(true); u->SaveLicqInfo(); gUserManager.DropUser(u); Index: usereventdlg.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/usereventdlg.h,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- usereventdlg.h 15 May 2002 09:32:26 -0000 1.34 +++ usereventdlg.h 25 May 2002 23:12:31 -0000 1.35 @@ -92,7 +92,7 @@ void showUserInfo(); void slot_usermenu() { gMainWindow->SetUserMenuUin(m_nUin); } void slot_security(); - void slot_setEncoding(int encoding_index); + void slot_setEncoding(int encodingMib); signals: void finished(unsigned long); |