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 }