KDEUI
kcodecaction.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "kcodecaction.h"
00029
00030 #include <kcharsets.h>
00031 #include <kdebug.h>
00032 #include <klocale.h>
00033 #include <kglobal.h>
00034
00035 #include <QMenu>
00036 #include <QVariant>
00037 #include <QtCore/QTextCodec>
00038
00039
00040
00041 #define MIB_DEFAULT 2
00042
00043 class KCodecAction::Private
00044 {
00045 public:
00046 Private(KCodecAction *parent)
00047 : q(parent),
00048 defaultAction(0),
00049 currentSubAction(0)
00050 {
00051 }
00052
00053 void init(bool);
00054
00055 void _k_subActionTriggered(QAction*);
00056
00057 KCodecAction *q;
00058 QAction *defaultAction;
00059 QAction *currentSubAction;
00060 };
00061
00062 KCodecAction::KCodecAction(QObject *parent,bool showAutoOptions)
00063 : KSelectAction(parent)
00064 , d(new Private(this))
00065 {
00066 d->init(showAutoOptions);
00067 }
00068
00069 KCodecAction::KCodecAction(const QString &text, QObject *parent,bool showAutoOptions)
00070 : KSelectAction(text, parent)
00071 , d(new Private(this))
00072 {
00073 d->init(showAutoOptions);
00074 }
00075
00076 KCodecAction::KCodecAction(const KIcon &icon, const QString &text, QObject *parent,bool showAutoOptions)
00077 : KSelectAction(icon, text, parent)
00078 , d(new Private(this))
00079 {
00080 d->init(showAutoOptions);
00081 }
00082
00083 KCodecAction::~KCodecAction()
00084 {
00085 delete d;
00086 }
00087
00088 void KCodecAction::Private::init(bool showAutoOptions)
00089 {
00090 q->setToolBarMode(MenuMode);
00091 defaultAction = q->addAction(i18nc("Encodings menu", "Default"));
00092
00093 int i;
00094 foreach(const QStringList &encodingsForScript, KGlobal::charsets()->encodingsByScript())
00095 {
00096 KSelectAction* tmp = new KSelectAction(encodingsForScript.at(0),q);
00097 if (showAutoOptions)
00098 {
00099 KEncodingDetector::AutoDetectScript scri=KEncodingDetector::scriptForName(encodingsForScript.at(0));
00100 if (KEncodingDetector::hasAutoDetectionForScript(scri))
00101 {
00102 tmp->addAction(i18nc("Encodings menu","Autodetect"))->setData(QVariant((uint)scri));
00103 tmp->menu()->addSeparator();
00104 }
00105 }
00106 for (i=1; i<encodingsForScript.size(); ++i)
00107 {
00108 tmp->addAction(encodingsForScript.at(i));
00109 }
00110 q->connect(tmp,SIGNAL(triggered(QAction*)),q,SLOT(_k_subActionTriggered(QAction*)));
00111 tmp->setCheckable(true);
00112 q->addAction(tmp);
00113 }
00114 q->setCurrentItem(0);
00115 }
00116
00117 int KCodecAction::mibForName(const QString &codecName, bool *ok) const
00118 {
00119
00120
00121 bool success = false;
00122 int mib = MIB_DEFAULT;
00123 KCharsets *charsets = KGlobal::charsets();
00124
00125 if (codecName == d->defaultAction->text())
00126 success = true;
00127 else
00128 {
00129 QTextCodec *codec = charsets->codecForName(codecName, success);
00130 if (!success)
00131 {
00132
00133 codec = charsets->codecForName(charsets->encodingForName(codecName), success);
00134 }
00135
00136 if (codec)
00137 mib = codec->mibEnum();
00138 }
00139
00140 if (ok)
00141 *ok = success;
00142
00143 if (success)
00144 return mib;
00145
00146 kWarning() << "Invalid codec name: " << codecName;
00147 return MIB_DEFAULT;
00148 }
00149
00150 QTextCodec *KCodecAction::codecForMib(int mib) const
00151 {
00152 if (mib == MIB_DEFAULT)
00153 {
00154
00155 return QTextCodec::codecForLocale();
00156 }
00157 else
00158 return QTextCodec::codecForMib(mib);
00159 }
00160
00161 void KCodecAction::actionTriggered(QAction *action)
00162 {
00163
00164
00165 if (action==d->defaultAction)
00166 {
00167 emit triggered(KEncodingDetector::SemiautomaticDetection);
00168 emit defaultItemTriggered();
00169 }
00170 }
00171
00172 void KCodecAction::Private::_k_subActionTriggered(QAction *action)
00173 {
00174 if (currentSubAction==action)
00175 return;
00176 currentSubAction=action;
00177 bool ok = false;
00178 int mib = q->mibForName(action->text(), &ok);
00179 if (ok)
00180 {
00181 emit q->triggered(action->text());
00182 emit q->triggered(q->codecForMib(mib));
00183 }
00184 else
00185 {
00186 if (!action->data().isNull())
00187 emit q->triggered((KEncodingDetector::AutoDetectScript) action->data().toUInt());
00188 }
00189 }
00190
00191 QTextCodec *KCodecAction::currentCodec() const
00192 {
00193 return codecForMib(currentCodecMib());
00194 }
00195
00196 bool KCodecAction::setCurrentCodec( QTextCodec *codec )
00197 {
00198 if (!codec)
00199 return false;
00200
00201 int i,j;
00202 for (i=0;i<actions().size();++i)
00203 {
00204 if (actions().at(i)->menu())
00205 {
00206 for (j=0;j<actions().at(i)->menu()->actions().size();++j)
00207 {
00208 if (!j && !actions().at(i)->menu()->actions().at(j)->data().isNull())
00209 continue;
00210 if (codec==KGlobal::charsets()->codecForName(actions().at(i)->menu()->actions().at(j)->text()))
00211 {
00212 d->currentSubAction=actions().at(i)->menu()->actions().at(j);
00213 d->currentSubAction->trigger();
00214 return true;
00215 }
00216 }
00217 }
00218 }
00219 return false;
00220
00221 }
00222
00223 QString KCodecAction::currentCodecName() const
00224 {
00225 return d->currentSubAction->text();
00226 }
00227
00228 bool KCodecAction::setCurrentCodec( const QString &codecName )
00229 {
00230 return setCurrentCodec(KGlobal::charsets()->codecForName(codecName));
00231 }
00232
00233 int KCodecAction::currentCodecMib() const
00234 {
00235 return mibForName(currentCodecName());
00236 }
00237
00238 bool KCodecAction::setCurrentCodec( int mib )
00239 {
00240 if (mib == MIB_DEFAULT)
00241 return setCurrentAction(d->defaultAction);
00242 else
00243 return setCurrentCodec(codecForMib(mib));
00244 }
00245
00246 KEncodingDetector::AutoDetectScript KCodecAction::currentAutoDetectScript() const
00247 {
00248 return d->currentSubAction->data().isNull()?
00249 KEncodingDetector::None :
00250 (KEncodingDetector::AutoDetectScript)d->currentSubAction->data().toUInt();
00251 }
00252
00253 bool KCodecAction::setCurrentAutoDetectScript(KEncodingDetector::AutoDetectScript scri)
00254 {
00255 if (scri==KEncodingDetector::SemiautomaticDetection)
00256 {
00257 d->currentSubAction=d->defaultAction;
00258 d->currentSubAction->trigger();
00259 return true;
00260 }
00261
00262 int i;
00263 for (i=0;i<actions().size();++i)
00264 {
00265 if (actions().at(i)->menu())
00266 {
00267 if (!actions().at(i)->menu()->actions().isEmpty()
00268 &&!actions().at(i)->menu()->actions().at(0)->data().isNull()
00269 &&actions().at(i)->menu()->actions().at(0)->data().toUInt()==(uint)scri
00270 )
00271 {
00272 d->currentSubAction=actions().at(i)->menu()->actions().at(0);
00273 d->currentSubAction->trigger();
00274 return true;
00275 }
00276 }
00277 }
00278 return false;
00279 }
00280
00281 #include "kcodecaction.moc"