File indexing completed on 2024-04-28 03:53:08
0001 /* 0002 This file is part of the KDE libraries 0003 0004 SPDX-FileCopyrightText: 2000 Dawit Alemayehu <adawit@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include <kcompletionbase.h> 0010 0011 #include <QKeySequence> 0012 #include <QPointer> 0013 0014 class KCompletionBasePrivate 0015 { 0016 public: 0017 KCompletionBasePrivate(KCompletionBase *parent) 0018 : q_ptr(parent) 0019 { 0020 } 0021 0022 ~KCompletionBasePrivate(); 0023 0024 void init(); 0025 0026 bool autoDeleteCompletionObject; 0027 bool handleSignals; 0028 bool emitSignals; 0029 KCompletion::CompletionMode completionMode; 0030 QPointer<KCompletion> completionObject; 0031 KCompletionBase::KeyBindingMap keyBindingMap; 0032 // we may act as a proxy to another KCompletionBase object 0033 KCompletionBase *delegate = nullptr; 0034 KCompletionBase *const q_ptr; 0035 Q_DECLARE_PUBLIC(KCompletionBase) 0036 }; 0037 0038 KCompletionBasePrivate::~KCompletionBasePrivate() 0039 { 0040 if (autoDeleteCompletionObject && completionObject) { 0041 delete completionObject; 0042 } 0043 } 0044 0045 void KCompletionBasePrivate::init() 0046 { 0047 Q_Q(KCompletionBase); 0048 completionMode = KCompletion::CompletionPopup; 0049 delegate = nullptr; 0050 // Initialize all key-bindings to 0 by default so that 0051 // the event filter will use the global settings. 0052 q->useGlobalKeyBindings(); 0053 0054 q->setAutoDeleteCompletionObject(false); 0055 q->setHandleSignals(true); 0056 q->setEmitSignals(false); 0057 } 0058 0059 KCompletionBase::KCompletionBase() 0060 : d_ptr(new KCompletionBasePrivate(this)) 0061 { 0062 Q_D(KCompletionBase); 0063 d->init(); 0064 } 0065 0066 KCompletionBase::~KCompletionBase() 0067 { 0068 } 0069 0070 void KCompletionBase::setDelegate(KCompletionBase *delegate) 0071 { 0072 Q_D(KCompletionBase); 0073 d->delegate = delegate; 0074 0075 if (delegate) { 0076 delegate->setAutoDeleteCompletionObject(d->autoDeleteCompletionObject); 0077 delegate->setHandleSignals(d->handleSignals); 0078 delegate->setEmitSignals(d->emitSignals); 0079 delegate->setCompletionMode(d->completionMode); 0080 delegate->setKeyBindingMap(d->keyBindingMap); 0081 } 0082 } 0083 0084 KCompletionBase *KCompletionBase::delegate() const 0085 { 0086 Q_D(const KCompletionBase); 0087 return d->delegate; 0088 } 0089 0090 KCompletion *KCompletionBase::completionObject(bool handleSignals) 0091 { 0092 Q_D(KCompletionBase); 0093 if (d->delegate) { 0094 return d->delegate->completionObject(handleSignals); 0095 } 0096 0097 if (!d->completionObject) { 0098 setCompletionObject(new KCompletion(), handleSignals); 0099 d->autoDeleteCompletionObject = true; 0100 } 0101 return d->completionObject; 0102 } 0103 0104 void KCompletionBase::setCompletionObject(KCompletion *completionObject, bool handleSignals) 0105 { 0106 Q_D(KCompletionBase); 0107 if (d->delegate) { 0108 d->delegate->setCompletionObject(completionObject, handleSignals); 0109 return; 0110 } 0111 0112 if (d->autoDeleteCompletionObject && completionObject != d->completionObject) { 0113 delete d->completionObject; 0114 } 0115 0116 d->completionObject = completionObject; 0117 0118 setAutoDeleteCompletionObject(false); 0119 setHandleSignals(handleSignals); 0120 0121 // We emit rotation and completion signals 0122 // if completion object is not NULL. 0123 setEmitSignals(!d->completionObject.isNull()); 0124 } 0125 0126 // BC: Inline this function and possibly rename it to setHandleEvents??? (DA) 0127 void KCompletionBase::setHandleSignals(bool handle) 0128 { 0129 Q_D(KCompletionBase); 0130 if (d->delegate) { 0131 d->delegate->setHandleSignals(handle); 0132 } else { 0133 d->handleSignals = handle; 0134 } 0135 } 0136 0137 bool KCompletionBase::isCompletionObjectAutoDeleted() const 0138 { 0139 Q_D(const KCompletionBase); 0140 return d->delegate ? d->delegate->isCompletionObjectAutoDeleted() : d->autoDeleteCompletionObject; 0141 } 0142 0143 void KCompletionBase::setAutoDeleteCompletionObject(bool autoDelete) 0144 { 0145 Q_D(KCompletionBase); 0146 if (d->delegate) { 0147 d->delegate->setAutoDeleteCompletionObject(autoDelete); 0148 } else { 0149 d->autoDeleteCompletionObject = autoDelete; 0150 } 0151 } 0152 0153 void KCompletionBase::setEnableSignals(bool enable) 0154 { 0155 Q_D(KCompletionBase); 0156 if (d->delegate) { 0157 d->delegate->setEnableSignals(enable); 0158 } else { 0159 d->emitSignals = enable; 0160 } 0161 } 0162 0163 bool KCompletionBase::handleSignals() const 0164 { 0165 Q_D(const KCompletionBase); 0166 return d->delegate ? d->delegate->handleSignals() : d->handleSignals; 0167 } 0168 0169 bool KCompletionBase::emitSignals() const 0170 { 0171 Q_D(const KCompletionBase); 0172 return d->delegate ? d->delegate->emitSignals() : d->emitSignals; 0173 } 0174 0175 void KCompletionBase::setEmitSignals(bool emitRotationSignals) 0176 { 0177 Q_D(KCompletionBase); 0178 if (d->delegate) { 0179 d->delegate->setEmitSignals(emitRotationSignals); 0180 } else { 0181 d->emitSignals = emitRotationSignals; 0182 } 0183 } 0184 0185 void KCompletionBase::setCompletionMode(KCompletion::CompletionMode mode) 0186 { 0187 Q_D(KCompletionBase); 0188 if (d->delegate) { 0189 d->delegate->setCompletionMode(mode); 0190 return; 0191 } 0192 0193 d->completionMode = mode; 0194 // Always sync up KCompletion mode with ours as long as we 0195 // are performing completions. 0196 if (d->completionObject && d->completionMode != KCompletion::CompletionNone) { 0197 d->completionObject->setCompletionMode(d->completionMode); 0198 } 0199 } 0200 0201 KCompletion::CompletionMode KCompletionBase::completionMode() const 0202 { 0203 Q_D(const KCompletionBase); 0204 return d->delegate ? d->delegate->completionMode() : d->completionMode; 0205 } 0206 0207 bool KCompletionBase::setKeyBinding(KeyBindingType item, const QList<QKeySequence> &cut) 0208 { 0209 Q_D(KCompletionBase); 0210 if (d->delegate) { 0211 return d->delegate->setKeyBinding(item, cut); 0212 } 0213 0214 if (!cut.isEmpty()) { 0215 for (KeyBindingMap::Iterator it = d->keyBindingMap.begin(); it != d->keyBindingMap.end(); ++it) { 0216 if (it.value() == cut) { 0217 return false; 0218 } 0219 } 0220 } 0221 d->keyBindingMap.insert(item, cut); 0222 return true; 0223 } 0224 0225 QList<QKeySequence> KCompletionBase::keyBinding(KeyBindingType item) const 0226 { 0227 Q_D(const KCompletionBase); 0228 return d->delegate ? d->delegate->keyBinding(item) : d->keyBindingMap[item]; 0229 } 0230 0231 void KCompletionBase::useGlobalKeyBindings() 0232 { 0233 Q_D(KCompletionBase); 0234 if (d->delegate) { 0235 d->delegate->useGlobalKeyBindings(); 0236 return; 0237 } 0238 0239 d->keyBindingMap.clear(); 0240 d->keyBindingMap.insert(TextCompletion, QList<QKeySequence>()); 0241 d->keyBindingMap.insert(PrevCompletionMatch, QList<QKeySequence>()); 0242 d->keyBindingMap.insert(NextCompletionMatch, QList<QKeySequence>()); 0243 d->keyBindingMap.insert(SubstringCompletion, QList<QKeySequence>()); 0244 } 0245 0246 KCompletion *KCompletionBase::compObj() const 0247 { 0248 Q_D(const KCompletionBase); 0249 return d->delegate ? d->delegate->compObj() : static_cast<KCompletion *>(d->completionObject); 0250 } 0251 0252 KCompletionBase::KeyBindingMap KCompletionBase::keyBindingMap() const 0253 { 0254 Q_D(const KCompletionBase); 0255 return d->delegate ? d->delegate->keyBindingMap() : d->keyBindingMap; 0256 } 0257 0258 void KCompletionBase::setKeyBindingMap(KCompletionBase::KeyBindingMap keyBindingMap) 0259 { 0260 Q_D(KCompletionBase); 0261 if (d->delegate) { 0262 d->delegate->setKeyBindingMap(keyBindingMap); 0263 return; 0264 } 0265 0266 d->keyBindingMap = keyBindingMap; 0267 } 0268 0269 void KCompletionBase::virtual_hook(int, void *) 0270 { 0271 /*BASE::virtual_hook( id, data );*/ 0272 }