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 class QIODevice;
00033 class QTextStream;
00034
00035 namespace Konsole
00036 {
00037
00051 class KeyboardTranslator
00052 {
00053 public:
00062 enum State
00063 {
00065 NoState = 0,
00069 NewLineState = 1,
00074 AnsiState = 2,
00078 CursorKeysState = 4,
00083 AlternateScreenState = 8,
00085 AnyModifierState = 16
00086 };
00087 Q_DECLARE_FLAGS(States,State)
00088
00089
00092 enum Command
00093 {
00095 NoCommand = 0,
00097 SendCommand = 1,
00099 ScrollPageUpCommand = 2,
00101 ScrollPageDownCommand = 4,
00103 ScrollLineUpCommand = 8,
00105 ScrollLineDownCommand = 16,
00107 ScrollLockCommand = 32,
00109 EraseCommand = 64
00110 };
00111 Q_DECLARE_FLAGS(Commands,Command)
00112
00113
00118 class Entry
00119 {
00120 public:
00124 Entry();
00125
00130 bool isNull() const;
00131
00133 Command command() const;
00135 void setCommand(Command command);
00136
00149 QByteArray text(bool expandWildCards = false,
00150 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00151
00153 void setText(const QByteArray& text);
00154
00164 QByteArray escapedText(bool expandWildCards = false,
00165 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00166
00168 int keyCode() const;
00170 void setKeyCode(int keyCode);
00171
00180 Qt::KeyboardModifiers modifiers() const;
00181
00183 Qt::KeyboardModifiers modifierMask() const;
00184
00186 void setModifiers( Qt::KeyboardModifiers modifiers );
00188 void setModifierMask( Qt::KeyboardModifiers modifiers );
00189
00198 States state() const;
00199
00201 States stateMask() const;
00202
00204 void setState( States state );
00206 void setStateMask( States mask );
00207
00212
00213
00218 QString conditionToString() const;
00219
00227 QString resultToString(bool expandWildCards = false,
00228 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00229
00234 bool matches( int keyCode ,
00235 Qt::KeyboardModifiers modifiers ,
00236 States flags ) const;
00237
00238 bool operator==(const Entry& rhs) const;
00239
00240 private:
00241 void insertModifier( QString& item , int modifier ) const;
00242 void insertState( QString& item , int state ) const;
00243 QByteArray unescape(const QByteArray& text) const;
00244
00245 int _keyCode;
00246 Qt::KeyboardModifiers _modifiers;
00247 Qt::KeyboardModifiers _modifierMask;
00248 States _state;
00249 States _stateMask;
00250
00251 Command _command;
00252 QByteArray _text;
00253 };
00254
00256 KeyboardTranslator(const QString& name);
00257
00258
00259
00261 QString name() const;
00262
00264 void setName(const QString& name);
00265
00267 QString description() const;
00268
00270 void setDescription(const QString& description);
00271
00283 Entry findEntry(int keyCode ,
00284 Qt::KeyboardModifiers modifiers ,
00285 States state = NoState) const;
00286
00291 void addEntry(const Entry& entry);
00292
00297 void replaceEntry(const Entry& existing , const Entry& replacement);
00298
00302 void removeEntry(const Entry& entry);
00303
00305 QList<Entry> entries() const;
00306
00307 private:
00308
00309 QMultiHash<int,Entry> _entries;
00310
00311
00312 QString _name;
00313 QString _description;
00314 };
00315 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States)
00316 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands)
00317
00346 class KeyboardTranslatorReader
00347 {
00348 public:
00350 KeyboardTranslatorReader( QIODevice* source );
00351
00356 QString description() const;
00357
00359 bool hasNextEntry();
00361 KeyboardTranslator::Entry nextEntry();
00362
00367 bool parseError();
00368
00375 static KeyboardTranslator::Entry createEntry( const QString& condition ,
00376 const QString& result );
00377 private:
00378 struct Token
00379 {
00380 enum Type
00381 {
00382 TitleKeyword,
00383 TitleText,
00384 KeyKeyword,
00385 KeySequence,
00386 Command,
00387 OutputText
00388 };
00389 Type type;
00390 QString text;
00391 };
00392 QList<Token> tokenize(const QString&);
00393 void readNext();
00394 bool decodeSequence(const QString& ,
00395 int& keyCode,
00396 Qt::KeyboardModifiers& modifiers,
00397 Qt::KeyboardModifiers& modifierMask,
00398 KeyboardTranslator::States& state,
00399 KeyboardTranslator::States& stateFlags);
00400
00401 static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier);
00402 static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state);
00403 static bool parseAsKeyCode(const QString& item , int& keyCode);
00404 static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command);
00405
00406 QIODevice* _source;
00407 QString _description;
00408 KeyboardTranslator::Entry _nextEntry;
00409 bool _hasNext;
00410 };
00411
00413 class KeyboardTranslatorWriter
00414 {
00415 public:
00420 KeyboardTranslatorWriter(QIODevice* destination);
00421 ~KeyboardTranslatorWriter();
00422
00427 void writeHeader( const QString& description );
00429 void writeEntry( const KeyboardTranslator::Entry& entry );
00430
00431 private:
00432 QIODevice* _destination;
00433 QTextStream* _writer;
00434 };
00435
00440 class KeyboardTranslatorManager
00441 {
00442 public:
00450 KeyboardTranslatorManager();
00451 ~KeyboardTranslatorManager();
00452
00459 void addTranslator(KeyboardTranslator* translator);
00460
00466 bool deleteTranslator(const QString& name);
00467
00469 const KeyboardTranslator* defaultTranslator();
00470
00478 const KeyboardTranslator* findTranslator(const QString& name);
00485 QList<QString> allTranslators();
00486
00488 static KeyboardTranslatorManager* instance();
00489
00490 private:
00491 static const char* defaultTranslatorText;
00492
00493 void findTranslators();
00494 KeyboardTranslator* loadTranslator(const QString& name);
00495
00496 KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name);
00497
00498 bool saveTranslator(const KeyboardTranslator* translator);
00499 QString findTranslatorPath(const QString& name);
00500
00501 QHash<QString,KeyboardTranslator*> _translators;
00502
00503 bool _haveLoadedAll;
00504 };
00505
00506 inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; }
00507 inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; }
00508
00509 inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier )
00510 {
00511 _modifiers = modifier;
00512 }
00513 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; }
00514
00515 inline void KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask )
00516 {
00517 _modifierMask = mask;
00518 }
00519 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; }
00520
00521 inline bool KeyboardTranslator::Entry::isNull() const
00522 {
00523 return ( *this == Entry() );
00524 }
00525
00526 inline void KeyboardTranslator::Entry::setCommand( Command command )
00527 {
00528 _command = command;
00529 }
00530 inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; }
00531
00532 inline void KeyboardTranslator::Entry::setText( const QByteArray& text )
00533 {
00534 _text = unescape(text);
00535 }
00536 inline int oneOrZero(int value)
00537 {
00538 return value ? 1 : 0;
00539 }
00540 inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const
00541 {
00542 QByteArray expandedText = _text;
00543
00544 if (expandWildCards)
00545 {
00546 int modifierValue = 1;
00547 modifierValue += oneOrZero(modifiers & Qt::ShiftModifier);
00548 modifierValue += oneOrZero(modifiers & Qt::AltModifier) << 1;
00549 modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2;
00550
00551 for (int i=0;i<_text.length();i++)
00552 {
00553 if (expandedText[i] == '*')
00554 expandedText[i] = '0' + modifierValue;
00555 }
00556 }
00557
00558 return expandedText;
00559 }
00560
00561 inline void KeyboardTranslator::Entry::setState( States state )
00562 {
00563 _state = state;
00564 }
00565 inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; }
00566
00567 inline void KeyboardTranslator::Entry::setStateMask( States stateMask )
00568 {
00569 _stateMask = stateMask;
00570 }
00571 inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; }
00572
00573 }
00574
00575 Q_DECLARE_METATYPE(Konsole::KeyboardTranslator::Entry)
00576 Q_DECLARE_METATYPE(const Konsole::KeyboardTranslator*)
00577
00578 #endif // KEYBOARDTRANSLATOR_H
00579