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,
00090 ApplicationKeypadState = 32
00091 };
00092 Q_DECLARE_FLAGS(States,State)
00093
00094
00097 enum Command
00098 {
00100 NoCommand = 0,
00102 SendCommand = 1,
00104 ScrollPageUpCommand = 2,
00106 ScrollPageDownCommand = 4,
00108 ScrollLineUpCommand = 8,
00110 ScrollLineDownCommand = 16,
00112 ScrollLockCommand = 32,
00114 EraseCommand = 64
00115 };
00116 Q_DECLARE_FLAGS(Commands,Command)
00117
00118
00123 class Entry
00124 {
00125 public:
00129 Entry();
00130
00135 bool isNull() const;
00136
00138 Command command() const;
00140 void setCommand(Command command);
00141
00154 QByteArray text(bool expandWildCards = false,
00155 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00156
00158 void setText(const QByteArray& text);
00159
00169 QByteArray escapedText(bool expandWildCards = false,
00170 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00171
00173 int keyCode() const;
00175 void setKeyCode(int keyCode);
00176
00185 Qt::KeyboardModifiers modifiers() const;
00186
00188 Qt::KeyboardModifiers modifierMask() const;
00189
00191 void setModifiers( Qt::KeyboardModifiers modifiers );
00193 void setModifierMask( Qt::KeyboardModifiers modifiers );
00194
00203 States state() const;
00204
00206 States stateMask() const;
00207
00209 void setState( States state );
00211 void setStateMask( States mask );
00212
00217
00218
00223 QString conditionToString() const;
00224
00232 QString resultToString(bool expandWildCards = false,
00233 Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00234
00239 bool matches( int keyCode ,
00240 Qt::KeyboardModifiers modifiers ,
00241 States flags ) const;
00242
00243 bool operator==(const Entry& rhs) const;
00244
00245 private:
00246 void insertModifier( QString& item , int modifier ) const;
00247 void insertState( QString& item , int state ) const;
00248 QByteArray unescape(const QByteArray& text) const;
00249
00250 int _keyCode;
00251 Qt::KeyboardModifiers _modifiers;
00252 Qt::KeyboardModifiers _modifierMask;
00253 States _state;
00254 States _stateMask;
00255
00256 Command _command;
00257 QByteArray _text;
00258 };
00259
00261 KeyboardTranslator(const QString& name);
00262
00263
00264
00266 QString name() const;
00267
00269 void setName(const QString& name);
00270
00272 QString description() const;
00273
00275 void setDescription(const QString& description);
00276
00288 Entry findEntry(int keyCode ,
00289 Qt::KeyboardModifiers modifiers ,
00290 States state = NoState) const;
00291
00296 void addEntry(const Entry& entry);
00297
00302 void replaceEntry(const Entry& existing , const Entry& replacement);
00303
00307 void removeEntry(const Entry& entry);
00308
00310 QList<Entry> entries() const;
00311
00312 private:
00313
00314 QMultiHash<int,Entry> _entries;
00315
00316
00317 QString _name;
00318 QString _description;
00319 };
00320 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States)
00321 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands)
00322
00351 class KeyboardTranslatorReader
00352 {
00353 public:
00355 KeyboardTranslatorReader( QIODevice* source );
00356
00361 QString description() const;
00362
00364 bool hasNextEntry();
00366 KeyboardTranslator::Entry nextEntry();
00367
00372 bool parseError();
00373
00380 static KeyboardTranslator::Entry createEntry( const QString& condition ,
00381 const QString& result );
00382 private:
00383 struct Token
00384 {
00385 enum Type
00386 {
00387 TitleKeyword,
00388 TitleText,
00389 KeyKeyword,
00390 KeySequence,
00391 Command,
00392 OutputText
00393 };
00394 Type type;
00395 QString text;
00396 };
00397 QList<Token> tokenize(const QString&);
00398 void readNext();
00399 bool decodeSequence(const QString& ,
00400 int& keyCode,
00401 Qt::KeyboardModifiers& modifiers,
00402 Qt::KeyboardModifiers& modifierMask,
00403 KeyboardTranslator::States& state,
00404 KeyboardTranslator::States& stateFlags);
00405
00406 static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier);
00407 static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state);
00408 static bool parseAsKeyCode(const QString& item , int& keyCode);
00409 static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command);
00410
00411 QIODevice* _source;
00412 QString _description;
00413 KeyboardTranslator::Entry _nextEntry;
00414 bool _hasNext;
00415 };
00416
00418 class KeyboardTranslatorWriter
00419 {
00420 public:
00425 KeyboardTranslatorWriter(QIODevice* destination);
00426 ~KeyboardTranslatorWriter();
00427
00432 void writeHeader( const QString& description );
00434 void writeEntry( const KeyboardTranslator::Entry& entry );
00435
00436 private:
00437 QIODevice* _destination;
00438 QTextStream* _writer;
00439 };
00440
00445 class KDE_EXPORT KeyboardTranslatorManager
00446 {
00447 public:
00455 KeyboardTranslatorManager();
00456 ~KeyboardTranslatorManager();
00457
00464 void addTranslator(KeyboardTranslator* translator);
00465
00471 bool deleteTranslator(const QString& name);
00472
00474 const KeyboardTranslator* defaultTranslator();
00475
00483 const KeyboardTranslator* findTranslator(const QString& name);
00490 QList<QString> allTranslators();
00491
00493 static KeyboardTranslatorManager* instance();
00494
00495 private:
00496 static const char* defaultTranslatorText;
00497
00498 void findTranslators();
00499 KeyboardTranslator* loadTranslator(const QString& name);
00500
00501 KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name);
00502
00503 bool saveTranslator(const KeyboardTranslator* translator);
00504 QString findTranslatorPath(const QString& name);
00505
00506 QHash<QString,KeyboardTranslator*> _translators;
00507
00508 bool _haveLoadedAll;
00509 };
00510
00511 inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; }
00512 inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; }
00513
00514 inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier )
00515 {
00516 _modifiers = modifier;
00517 }
00518 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; }
00519
00520 inline void KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask )
00521 {
00522 _modifierMask = mask;
00523 }
00524 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; }
00525
00526 inline bool KeyboardTranslator::Entry::isNull() const
00527 {
00528 return ( *this == Entry() );
00529 }
00530
00531 inline void KeyboardTranslator::Entry::setCommand( Command command )
00532 {
00533 _command = command;
00534 }
00535 inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; }
00536
00537 inline void KeyboardTranslator::Entry::setText( const QByteArray& text )
00538 {
00539 _text = unescape(text);
00540 }
00541 inline int oneOrZero(int value)
00542 {
00543 return value ? 1 : 0;
00544 }
00545 inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const
00546 {
00547 QByteArray expandedText = _text;
00548
00549 if (expandWildCards)
00550 {
00551 int modifierValue = 1;
00552 modifierValue += oneOrZero(modifiers & Qt::ShiftModifier);
00553 modifierValue += oneOrZero(modifiers & Qt::AltModifier) << 1;
00554 modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2;
00555
00556 for (int i=0;i<_text.length();i++)
00557 {
00558 if (expandedText[i] == '*')
00559 expandedText[i] = '0' + modifierValue;
00560 }
00561 }
00562
00563 return expandedText;
00564 }
00565
00566 inline void KeyboardTranslator::Entry::setState( States state )
00567 {
00568 _state = state;
00569 }
00570 inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; }
00571
00572 inline void KeyboardTranslator::Entry::setStateMask( States stateMask )
00573 {
00574 _stateMask = stateMask;
00575 }
00576 inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; }
00577
00578 }
00579
00580 Q_DECLARE_METATYPE(Konsole::KeyboardTranslator::Entry)
00581 Q_DECLARE_METATYPE(const Konsole::KeyboardTranslator*)
00582
00583 #endif // KEYBOARDTRANSLATOR_H
00584