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