File indexing completed on 2024-04-21 15:55:35
0001 /*********************************************************************************************** 0002 Copyright (C) 2004 by Jeroen Wijnhout <Jeroen.Wijnhout@kdemail.net> 0003 2008-2012 by Michel Ludwig (michel.ludwig@kdemail.net) 0004 ***********************************************************************************************/ 0005 0006 /*************************************************************************** 0007 * * 0008 * This program is free software; you can redistribute it and/or modify * 0009 * it under the terms of the GNU General Public License as published by * 0010 * the Free Software Foundation; either version 2 of the License, or * 0011 * (at your option) any later version. * 0012 * * 0013 ***************************************************************************/ 0014 0015 // 2007-03-17 dani 0016 // - select a single LaTeX command with CTRL+MouseDblClick-left 0017 // (such a double click on the middle part '\def' of '\abd\def\ghi' 0018 // will select only '\def\', not the whole text, as it does now) 0019 0020 #include "eventfilter.h" 0021 0022 #include <QMouseEvent> 0023 #include <QKeyEvent> 0024 0025 #include <KModifierKeyInfo> 0026 #include <KTextEditor/Document> 0027 #include <KTextEditor/View> 0028 0029 #include "kiledebug.h" 0030 #include "editorextension.h" 0031 #include "kileconfig.h" 0032 0033 LaTeXEventFilter::LaTeXEventFilter(KTextEditor::View *view, KileDocument::EditorExtension *edit) : QObject(view), m_view(view), m_edit(edit) 0034 { 0035 m_modifierKeyInfo = new KModifierKeyInfo(this); 0036 readConfig(); 0037 } 0038 0039 void LaTeXEventFilter::readConfig() 0040 { 0041 m_bCompleteEnvironment = KileConfig::completeEnvironment(); 0042 } 0043 0044 // querying the caps lock state directly is currrently not supported by Qt 0045 bool LaTeXEventFilter::isCapsLockEnabled() 0046 { 0047 return m_modifierKeyInfo->isKeyLatched(Qt::Key_CapsLock) 0048 || m_modifierKeyInfo->isKeyLocked(Qt::Key_CapsLock); 0049 } 0050 0051 //FIXME: there should be one central place to convert unicode chars to LaTeX; 0052 // also see 'EditorExtension::insertLatexFromUnicode'. 0053 // KateViewInternal as a child of KTextEditor::View has the focus 0054 // This was set with KTextEditor::View::setFocusProxy(viewInternal) 0055 bool LaTeXEventFilter::eventFilter(QObject* /* o */, QEvent *e) 0056 { 0057 // Handles input method events, i.e. multi-key combinations with international keyboard layouts 0058 if (e->type() == QEvent::InputMethod) { 0059 QInputMethodEvent *ime = static_cast<QInputMethodEvent*>(e); 0060 // Only single chars, please. ime->commitString() holds the non-latex unicode character string 0061 if (ime->commitString().size() == 1) { 0062 // Extract unicode representation: 0063 unsigned short rep = ime->commitString().at(0).unicode(); 0064 KILE_DEBUG_MAIN << "string= "<< ime->commitString().at(0) << " dec= "<< rep; 0065 return m_edit->insertLatexFromUnicode(rep, m_view); 0066 } 0067 } 0068 0069 if (e->type() == QEvent::KeyPress) { 0070 QKeyEvent *ke = static_cast<QKeyEvent*>(e); 0071 switch(ke->key()) 0072 { 0073 case Qt::Key_QuoteDbl: 0074 return m_edit->insertDoubleQuotes(m_view); 0075 case Qt::Key_exclamdown: 0076 return m_edit->insertSpecialCharacter("!`", m_view); 0077 case Qt::Key_cent: 0078 return m_edit->insertSpecialCharacter("\\textcent", m_view, "textcomp"); 0079 case Qt::Key_sterling: 0080 return m_edit->insertSpecialCharacter("\\pounds", m_view); 0081 case Qt::Key_currency: 0082 return m_edit->insertSpecialCharacter("\\textcurrency", m_view, "textcomp"); 0083 case Qt::Key_yen: 0084 return m_edit->insertSpecialCharacter("\\textyen", m_view, "textcomp"); 0085 case Qt::Key_copyright: 0086 return m_edit->insertSpecialCharacter("\\copyright", m_view); 0087 case Qt::Key_ordfeminine: 0088 return m_edit->insertSpecialCharacter("\\textordfeminine", m_view, "textcomp"); 0089 case Qt::Key_guillemotleft: 0090 return m_edit->insertSpecialCharacter("\\guillemotleft", m_view); 0091 case Qt::Key_notsign: 0092 return m_edit->insertSpecialCharacter("\\neg", m_view); 0093 case Qt::Key_registered: 0094 return m_edit->insertSpecialCharacter("\\textregistered", m_view, "textcomp"); 0095 case Qt::Key_degree: 0096 return m_edit->insertSpecialCharacter("^\\circ", m_view); 0097 case Qt::Key_plusminus: 0098 return m_edit->insertSpecialCharacter("\\pm", m_view); 0099 case Qt::Key_mu: 0100 return m_edit->insertSpecialCharacter("\\mu", m_view); 0101 case Qt::Key_paragraph: 0102 return m_edit->insertSpecialCharacter("\\P", m_view); 0103 case Qt::Key_guillemotright: 0104 return m_edit->insertSpecialCharacter("\\guillemotright", m_view); 0105 case Qt::Key_onequarter: 0106 return m_edit->insertSpecialCharacter("\\textonequarter", m_view, "textcomp"); 0107 case Qt::Key_onehalf: 0108 return m_edit->insertSpecialCharacter("\\textonehalf", m_view, "textcomp"); 0109 case Qt::Key_threequarters: 0110 return m_edit->insertSpecialCharacter("\\textthreequarter", m_view, "textcomp"); 0111 case Qt::Key_questiondown: 0112 return m_edit->insertSpecialCharacter("?`", m_view); 0113 case Qt::Key_multiply: 0114 return m_edit->insertSpecialCharacter("\\times", m_view); 0115 case Qt::Key_ssharp: 0116 return m_edit->insertSpecialCharacter("\\ss{}", m_view); 0117 case Qt::Key_Agrave: 0118 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0119 return m_edit->insertSpecialCharacter("\\`A", m_view); 0120 } 0121 else return m_edit->insertSpecialCharacter("\\`a", m_view); 0122 case Qt::Key_Aacute: 0123 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0124 return m_edit->insertSpecialCharacter("\\'A", m_view); 0125 } 0126 else return m_edit->insertSpecialCharacter("\\'a", m_view); 0127 case Qt::Key_Acircumflex: 0128 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0129 return m_edit->insertSpecialCharacter("\\^A", m_view); 0130 } 0131 else return m_edit->insertSpecialCharacter("\\^a", m_view); 0132 case Qt::Key_Atilde: 0133 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0134 return m_edit->insertSpecialCharacter("\\~A", m_view); 0135 } 0136 else return m_edit->insertSpecialCharacter("\\~a", m_view); 0137 case Qt::Key_Adiaeresis: 0138 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0139 return m_edit->insertSpecialCharacter("\\\"A", m_view); 0140 } 0141 else return m_edit->insertSpecialCharacter("\\\"a", m_view); 0142 case Qt::Key_Aring: 0143 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0144 return m_edit->insertSpecialCharacter("\\AA", m_view); 0145 } 0146 else return m_edit->insertSpecialCharacter("\\aa", m_view); 0147 case Qt::Key_AE: 0148 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0149 return m_edit->insertSpecialCharacter("\\AE", m_view); 0150 } 0151 else return m_edit->insertSpecialCharacter("\\ae", m_view); 0152 case Qt::Key_Ccedilla: 0153 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0154 return m_edit->insertSpecialCharacter("\\c{C}", m_view); 0155 } 0156 else return m_edit->insertSpecialCharacter("\\c{c}", m_view); 0157 case Qt::Key_Egrave: 0158 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0159 return m_edit->insertSpecialCharacter("\\`E", m_view); 0160 } 0161 else return m_edit->insertSpecialCharacter("\\`e", m_view); 0162 case Qt::Key_Eacute: 0163 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0164 return m_edit->insertSpecialCharacter("\\'E", m_view); 0165 } 0166 else return m_edit->insertSpecialCharacter("\\'e", m_view); 0167 case Qt::Key_Ecircumflex: 0168 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0169 return m_edit->insertSpecialCharacter("\\^E", m_view); 0170 } 0171 else return m_edit->insertSpecialCharacter("\\^e", m_view); 0172 case Qt::Key_Ediaeresis: 0173 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0174 return m_edit->insertSpecialCharacter("\\\"E", m_view); 0175 } 0176 else return m_edit->insertSpecialCharacter("\\\"e", m_view); 0177 case Qt::Key_Igrave: 0178 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0179 return m_edit->insertSpecialCharacter("\\`I", m_view); 0180 } 0181 else return m_edit->insertSpecialCharacter("\\`i", m_view); 0182 case Qt::Key_Iacute: 0183 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0184 return m_edit->insertSpecialCharacter("\\'I", m_view); 0185 } 0186 else return m_edit->insertSpecialCharacter("\\'i", m_view); 0187 case Qt::Key_Icircumflex: 0188 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0189 return m_edit->insertSpecialCharacter("\\^I", m_view); 0190 } 0191 else return m_edit->insertSpecialCharacter("\\^i", m_view); 0192 case Qt::Key_Idiaeresis: 0193 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0194 return m_edit->insertSpecialCharacter("\\\"I", m_view); 0195 } 0196 else return m_edit->insertSpecialCharacter("\\\"i", m_view); 0197 case Qt::Key_Ntilde: 0198 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0199 return m_edit->insertSpecialCharacter("\\~N", m_view); 0200 } 0201 else return m_edit->insertSpecialCharacter("\\~n", m_view); 0202 case Qt::Key_Ograve: 0203 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0204 return m_edit->insertSpecialCharacter("\\`O", m_view); 0205 } 0206 else return m_edit->insertSpecialCharacter("\\`o", m_view); 0207 case Qt::Key_Oacute: 0208 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0209 return m_edit->insertSpecialCharacter("\\'O", m_view); 0210 } 0211 else return m_edit->insertSpecialCharacter("\\'o", m_view); 0212 case Qt::Key_Ocircumflex: 0213 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0214 return m_edit->insertSpecialCharacter("\\^O", m_view); 0215 } 0216 else return m_edit->insertSpecialCharacter("\\^o", m_view); 0217 case Qt::Key_Otilde: 0218 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0219 return m_edit->insertSpecialCharacter("\\~O", m_view); 0220 } 0221 else return m_edit->insertSpecialCharacter("\\~o", m_view); 0222 case Qt::Key_Odiaeresis: 0223 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0224 return m_edit->insertSpecialCharacter("\\\"O", m_view); 0225 } 0226 else return m_edit->insertSpecialCharacter("\\\"o", m_view); 0227 case Qt::Key_Ugrave: 0228 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0229 return m_edit->insertSpecialCharacter("\\`U", m_view); 0230 } 0231 else return m_edit->insertSpecialCharacter("\\`u", m_view); 0232 case Qt::Key_Uacute: 0233 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0234 return m_edit->insertSpecialCharacter("\\'U", m_view); 0235 } 0236 else return m_edit->insertSpecialCharacter("\\'u", m_view); 0237 case Qt::Key_Ucircumflex: 0238 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0239 return m_edit->insertSpecialCharacter("\\^U", m_view); 0240 } 0241 else return m_edit->insertSpecialCharacter("\\^u", m_view); 0242 case Qt::Key_Udiaeresis: 0243 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0244 return m_edit->insertSpecialCharacter("\\\"U", m_view); 0245 } 0246 else return m_edit->insertSpecialCharacter("\\\"u", m_view); 0247 case Qt::Key_Yacute: 0248 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0249 return m_edit->insertSpecialCharacter("\\'Y", m_view); 0250 } 0251 else return m_edit->insertSpecialCharacter("\\'y", m_view); 0252 case Qt::Key_ydiaeresis: 0253 if (ke->modifiers() == Qt::ShiftModifier || isCapsLockEnabled()) { 0254 return m_edit->insertSpecialCharacter("\\\"Y", m_view); 0255 } 0256 else return m_edit->insertSpecialCharacter("\\\"y", m_view); 0257 default: 0258 break; 0259 } 0260 0261 if(m_bCompleteEnvironment && ke->key() == Qt::Key_Return && ke->modifiers() == 0) { 0262 return m_edit->eventInsertEnvironment(m_view); 0263 } 0264 } 0265 0266 else if(e->type() == QEvent::MouseButtonDblClick) { 0267 QMouseEvent *me = static_cast<QMouseEvent*>(e); 0268 if(me->button() == Qt::LeftButton && me->modifiers() & Qt::ControlModifier) { 0269 m_edit->selectWord(KileDocument::EditorExtension::smTex, m_view); 0270 return true; 0271 } 0272 } 0273 0274 //pass this event on 0275 return false; 0276 } 0277 0278