Warning, file /frameworks/ktexteditor/src/vimode/registers.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: KDE Developers
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "registers.h"
0008 #include "katepartdebug.h"
0009 
0010 #include <KConfigGroup>
0011 
0012 #include <QApplication>
0013 #include <QClipboard>
0014 
0015 using namespace KateVi;
0016 
0017 void Registers::readConfig(const KConfigGroup &config)
0018 {
0019     const QStringList names = config.readEntry("ViRegisterNames", QStringList());
0020     const QStringList contents = config.readEntry("ViRegisterContents", QStringList());
0021     const QList<int> flags = config.readEntry("ViRegisterFlags", QList<int>());
0022 
0023     if (names.size() != contents.size() || contents.size() != flags.size()) {
0024         return;
0025     }
0026 
0027     for (int i = 0; i < names.size(); i++) {
0028         if (!names.at(i).isEmpty()) {
0029             set(names.at(i).at(0), contents.at(i), (OperationMode)(flags.at(i)));
0030         }
0031     }
0032 }
0033 
0034 void Registers::writeConfig(KConfigGroup &config) const
0035 {
0036     if (m_registers.isEmpty()) {
0037         return;
0038     }
0039 
0040     QStringList names;
0041     QStringList contents;
0042     QList<int> flags;
0043     QMap<QChar, Register>::const_iterator i;
0044     for (i = m_registers.constBegin(); i != m_registers.constEnd(); ++i) {
0045         if (i.value().first.length() <= 1000) {
0046             names << i.key();
0047             contents << i.value().first;
0048             flags << int(i.value().second);
0049         } else {
0050             qCDebug(LOG_KTE) << "Did not save contents of register " << i.key() << ": contents too long (" << i.value().first.length() << " characters)";
0051         }
0052     }
0053 
0054     config.writeEntry("ViRegisterNames", names);
0055     config.writeEntry("ViRegisterContents", contents);
0056     config.writeEntry("ViRegisterFlags", flags);
0057 }
0058 
0059 void Registers::setInsertStopped(const QString &text)
0060 {
0061     set(InsertStoppedRegister, text);
0062 }
0063 
0064 void Registers::set(const QChar &reg, const QString &text, OperationMode flag)
0065 {
0066     if (reg == BlackHoleRegister) {
0067         return;
0068     }
0069 
0070     if (reg == PrependNumberedRegister || (reg >= FirstNumberedRegister && reg <= LastNumberedRegister)) { // "kill ring" registers
0071         setNumberedRegister(reg, text, flag);
0072     } else if (reg == SystemClipboardRegister) {
0073         QApplication::clipboard()->setText(text, QClipboard::Clipboard);
0074     } else if (reg == SystemSelectionRegister) {
0075         QApplication::clipboard()->setText(text, QClipboard::Selection);
0076     } else {
0077         const QChar lowercase_reg = reg.toLower();
0078         if (reg != lowercase_reg) {
0079             m_registers[lowercase_reg].first.append(text);
0080         } else {
0081             m_registers.insert(lowercase_reg, Register(text, flag));
0082         }
0083     }
0084 
0085     if (reg == ZeroRegister || reg == PrependNumberedRegister || reg == SmallDeleteRegister) {
0086         m_default = reg;
0087     }
0088 }
0089 
0090 QString Registers::getContent(const QChar &reg) const
0091 {
0092     return getRegister(reg).first;
0093 }
0094 
0095 OperationMode Registers::getFlag(const QChar &reg) const
0096 {
0097     return getRegister(reg).second;
0098 }
0099 
0100 Registers::Register Registers::getRegister(const QChar &reg) const
0101 {
0102     Register regPair;
0103     QChar _reg = (reg != UnnamedRegister ? reg : m_default);
0104 
0105     if (_reg >= FirstNumberedRegister && _reg <= LastNumberedRegister) {
0106         int index = _reg.digitValue() - 1;
0107         if (m_numbered.size() > index) {
0108             regPair = m_numbered.at(index);
0109         }
0110     } else if (_reg == PrependNumberedRegister) {
0111         if (!m_numbered.isEmpty()) {
0112             regPair = m_numbered.front();
0113         }
0114     } else if (_reg == SystemClipboardRegister) {
0115         QString regContent = QApplication::clipboard()->text(QClipboard::Clipboard);
0116         regPair = Register(regContent, CharWise);
0117     } else if (_reg == SystemSelectionRegister) {
0118         QString regContent = QApplication::clipboard()->text(QClipboard::Selection);
0119         regPair = Register(regContent, CharWise);
0120     } else {
0121         const QChar lowercase_reg = _reg.toLower();
0122         if (m_registers.contains(lowercase_reg)) {
0123             regPair = m_registers.value(lowercase_reg);
0124         }
0125     }
0126 
0127     return regPair;
0128 }
0129 
0130 void Registers::setNumberedRegister(const QChar &reg, const QString &text, OperationMode flag)
0131 {
0132     int index = reg.digitValue() - 1;
0133     if (reg == PrependNumberedRegister || index > m_numbered.size()) {
0134         if (m_numbered.size() == 9) {
0135             m_numbered.removeLast();
0136         }
0137 
0138         // register 0 is used for the last yank command, so insert at position 1
0139         m_numbered.prepend(Register(text, flag));
0140     } else {
0141         m_numbered[index].first = text;
0142         m_numbered[index].second = flag;
0143     }
0144 }