Konsole
KeyboardTranslator.h
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 #ifndef KEYBOARDTRANSLATOR_H
00023 #define KEYBOARDTRANSLATOR_H
00024
00025
00026 #include <QtCore/QHash>
00027 #include <QtCore/QList>
00028 #include <QtGui/QKeySequence>
00029 #include <QtCore/QMetaType>
00030 #include <QtCore/QVarLengthArray>
00031
00032
00033 #include <kdemacros.h>
00034
00035 class QIODevice;
00036 class QTextStream;
00037
00038 namespace Konsole
00039 {
00040
00054 class KeyboardTranslator
00055 {
00056 public:
00065 enum State
00066 {
00068 NoState = 0,
00072 NewLineState = 1,
00077 AnsiState = 2,
00081 CursorKeysState = 4,
00086 AlternateScreenState = 8,
00088 AnyModifierState = 16
00089 };
00090 Q_DECLARE_FLAGS(States,State)
00091
00092
00095 enum Command
00096 {
00098 NoCommand = 0,
00100 SendCommand = 1,
00102 ScrollPageUpCommand = 2,
00104 ScrollPageDownCommand = 4,
00106 ScrollLineUpCommand = 8,
00108 ScrollLineDownCommand = 16,
00110 ScrollLockCommand = 32,
00112 EraseCommand = 64
00113 };
00114 Q_DECLARE_FLAGS(Commands,Command)
00115
00116
00121 class Entry
00122 {
00123 public:
00127 Entry();
00128
00133 bool isNull() const;
00134
00136 Command command() const;
00138 void setCommand(Command command);
00139
00152 QByteArray text(bool expandWildCards = false,
00153 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00154
00156 void setText(const QByteArray& text);
00157
00167 QByteArray escapedText(bool expandWildCards = false,
00168 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00169
00171 int keyCode() const;
00173 void setKeyCode(int keyCode);
00174
00183 Qt::KeyboardModifiers modifiers() const;
00184
00186 Qt::KeyboardModifiers modifierMask() const;
00187
00189 void setModifiers( Qt::KeyboardModifiers modifiers );
00191 void setModifierMask( Qt::KeyboardModifiers modifiers );
00192
00201 States state() const;
00202
00204 States stateMask() const;
00205
00207 void setState( States state );
00209 void setStateMask( States mask );
00210
00215
00216
00221 QString conditionToString() const;
00222
00230 QString resultToString(bool expandWildCards = false,
00231 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00232
00237 bool matches( int keyCode ,
00238 Qt::KeyboardModifiers modifiers ,
00239 States flags ) const;
00240
00241 bool operator==(const Entry& rhs) const;
00242
00243 private:
00244 void insertModifier( QString& item , int modifier ) const;
00245 void insertState( QString& item , int state ) const;
00246 QByteArray unescape(const QByteArray& text) const;
00247
00248 int _keyCode;
00249 Qt::KeyboardModifiers _modifiers;
00250 Qt::KeyboardModifiers _modifierMask;
00251 States _state;
00252 States _stateMask;
00253
00254 Command _command;
00255 QByteArray _text;
00256 };
00257
00259 KeyboardTranslator(const QString& name);
00260
00261
00262
00264 QString name() const;
00265
00267 void setName(const QString& name);
00268
00270 QString description() const;
00271
00273 void setDescription(const QString& description);
00274
00286 Entry findEntry(int keyCode ,
00287 Qt::KeyboardModifiers modifiers ,
00288 States state = NoState) const;
00289
00294 void addEntry(const Entry& entry);
00295
00300 void replaceEntry(const Entry& existing , const Entry& replacement);
00301
00305 void removeEntry(const Entry& entry);
00306
00308 QList<Entry> entries() const;
00309
00310 private:
00311
00312 QMultiHash<int,Entry> _entries;
00313
00314
00315 QString _name;
00316 QString _description;
00317 };
00318 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States)
00319 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands)
00320
00349 class KeyboardTranslatorReader
00350 {
00351 public:
00353 KeyboardTranslatorReader( QIODevice* source );
00354
00359 QString description() const;
00360
00362 bool hasNextEntry();
00364 KeyboardTranslator::Entry nextEntry();
00365
00370 bool parseError();
00371
00378 static KeyboardTranslator::Entry createEntry( const QString& condition ,
00379 const QString& result );
00380 private:
00381 struct Token
00382 {
00383 enum Type
00384 {
00385 TitleKeyword,
00386 TitleText,
00387 KeyKeyword,
00388 KeySequence,
00389 Command,
00390 OutputText
00391 };
00392 Type type;
00393 QString text;
00394 };
00395 QList<Token> tokenize(const QString&);
00396 void readNext();
00397 bool decodeSequence(const QString& ,
00398 int& keyCode,
00399 Qt::KeyboardModifiers& modifiers,
00400 Qt::KeyboardModifiers& modifierMask,
00401 KeyboardTranslator::States& state,
00402 KeyboardTranslator::States& stateFlags);
00403
00404 static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier);
00405 static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state);
00406 static bool parseAsKeyCode(const QString& item , int& keyCode);
00407 static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command);
00408
00409 QIODevice* _source;
00410 QString _description;
00411 KeyboardTranslator::Entry _nextEntry;
00412 bool _hasNext;
00413 };
00414
00416 class KeyboardTranslatorWriter
00417 {
00418 public:
00423 KeyboardTranslatorWriter(QIODevice* destination);
00424 ~KeyboardTranslatorWriter();
00425
00430 void writeHeader( const QString& description );
00432 void writeEntry( const KeyboardTranslator::Entry& entry );
00433
00434 private:
00435 QIODevice* _destination;
00436 QTextStream* _writer;
00437 };
00438
00443 class KDE_EXPORT KeyboardTranslatorManager
00444 {
00445 public:
00453 KeyboardTranslatorManager();
00454 ~KeyboardTranslatorManager();
00455
00462 void addTranslator(KeyboardTranslator* translator);
00463
00469 bool deleteTranslator(const QString& name);
00470
00472 const KeyboardTranslator* defaultTranslator();
00473
00481 const KeyboardTranslator* findTranslator(const QString& name);
00488 QList<QString> allTranslators();
00489
00491 static KeyboardTranslatorManager* instance();
00492
00493 private:
00494 static const char* defaultTranslatorText;
00495
00496 void findTranslators();
00497 KeyboardTranslator* loadTranslator(const QString& name);
00498
00499 KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name);
00500
00501 bool saveTranslator(const KeyboardTranslator* translator);
00502 QString findTranslatorPath(const QString& name);
00503
00504 QHash<QString,KeyboardTranslator*> _translators;
00505
00506 bool _haveLoadedAll;
00507 };
00508
00509 inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; }
00510 inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; }
00511
00512 inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier )
00513 {
00514 _modifiers = modifier;
00515 }
00516 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; }
00517
00518 inline void KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask )
00519 {
00520 _modifierMask = mask;
00521 }
00522 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; }
00523
00524 inline bool KeyboardTranslator::Entry::isNull() const
00525 {
00526 return ( *this == Entry() );
00527 }
00528
00529 inline void KeyboardTranslator::Entry::setCommand( Command command )
00530 {
00531 _command = command;
00532 }
00533 inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; }
00534
00535 inline void KeyboardTranslator::Entry::setText( const QByteArray& text )
00536 {
00537 _text = unescape(text);
00538 }
00539 inline int oneOrZero(int value)
00540 {
00541 return value ? 1 : 0;
00542 }
00543 inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const
00544 {
00545 QByteArray expandedText = _text;
00546
00547 if (expandWildCards)
00548 {
00549 int modifierValue = 1;
00550 modifierValue += oneOrZero(modifiers & Qt::ShiftModifier);
00551 modifierValue += oneOrZero(modifiers & Qt::AltModifier) << 1;
00552 modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2;
00553
00554 for (int i=0;i<_text.length();i++)
00555 {
00556 if (expandedText[i] == '*')
00557 expandedText[i] = '0' + modifierValue;
00558 }
00559 }
00560
00561 return expandedText;
00562 }
00563
00564 inline void KeyboardTranslator::Entry::setState( States state )
00565 {
00566 _state = state;
00567 }
00568 inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; }
00569
00570 inline void KeyboardTranslator::Entry::setStateMask( States stateMask )
00571 {
00572 _stateMask = stateMask;
00573 }
00574 inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; }
00575
00576 }
00577
00578 Q_DECLARE_METATYPE(Konsole::KeyboardTranslator::Entry)
00579 Q_DECLARE_METATYPE(const Konsole::KeyboardTranslator*)
00580
00581 #endif // KEYBOARDTRANSLATOR_H
00582