File indexing completed on 2024-04-28 11:45:36

0001 /*
0002     SPDX-FileCopyrightText: 2001 Christoph Cullmann <cullmann@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "kateview.h"
0008 
0009 #include "cursor.h"
0010 
0011 #include "configpage.h"
0012 
0013 #include "editor.h"
0014 
0015 #include "document.h"
0016 
0017 #include "view.h"
0018 
0019 #include "plugin.h"
0020 
0021 #include "command.h"
0022 #include "inlinenote.h"
0023 #include "inlinenotedata.h"
0024 #include "inlinenoteinterface.h"
0025 #include "inlinenoteprovider.h"
0026 #include "katerenderer.h"
0027 #include "katevariableexpansionmanager.h"
0028 #include "markinterface.h"
0029 #include "modificationinterface.h"
0030 #include "sessionconfiginterface.h"
0031 #include "texthintinterface.h"
0032 #include "variable.h"
0033 
0034 #include "abstractannotationitemdelegate.h"
0035 #include "annotationinterface.h"
0036 
0037 #include "katecmd.h"
0038 #include "kateconfig.h"
0039 #include "kateglobal.h"
0040 #include "katesyntaxmanager.h"
0041 
0042 using namespace KTextEditor;
0043 
0044 Cursor Cursor::fromString(const QStringRef &str) Q_DECL_NOEXCEPT
0045 {
0046     return fromString(QStringView(str));
0047 }
0048 
0049 Cursor Cursor::fromString(QStringView str) Q_DECL_NOEXCEPT
0050 {
0051     // parse format "(line, column)"
0052     const int startIndex = str.indexOf(QLatin1Char('('));
0053     const int endIndex = str.indexOf(QLatin1Char(')'));
0054     const int commaIndex = str.indexOf(QLatin1Char(','));
0055 
0056     if (startIndex < 0 || endIndex < 0 || commaIndex < 0 || commaIndex < startIndex || endIndex < commaIndex || endIndex < startIndex) {
0057         return invalid();
0058     }
0059 
0060     bool ok1 = false;
0061     bool ok2 = false;
0062 
0063     const int line = str.mid(startIndex + 1, commaIndex - startIndex - 1).toString().toInt(&ok1); // FIXME KF6, Qt 5.15.2 and higher
0064     const int column = str.mid(commaIndex + 1, endIndex - commaIndex - 1).toString().toInt(&ok2); // FIXME KF6, Qt 5.15.2 and higher
0065 
0066     if (!ok1 || !ok2) {
0067         return invalid();
0068     }
0069 
0070     return {line, column};
0071 }
0072 
0073 Editor::Editor(EditorPrivate *impl)
0074     : QObject()
0075     , d(impl)
0076 {
0077 }
0078 
0079 Editor::~Editor() = default;
0080 
0081 Editor *KTextEditor::Editor::instance()
0082 {
0083     // Just use internal KTextEditor::EditorPrivate::self()
0084     return KTextEditor::EditorPrivate::self();
0085 }
0086 
0087 QString Editor::defaultEncoding() const
0088 {
0089     // return default encoding in global config object
0090     return d->documentConfig()->encoding();
0091 }
0092 
0093 bool Editor::registerVariableMatch(const QString &name, const QString &description, ExpandFunction expansionFunc)
0094 {
0095     const auto var = Variable(name, description, expansionFunc, false);
0096     return d->variableExpansionManager()->addVariable(var);
0097 }
0098 
0099 bool Editor::registerVariablePrefix(const QString &prefix, const QString &description, ExpandFunction expansionFunc)
0100 {
0101     const auto var = Variable(prefix, description, expansionFunc, true);
0102     return d->variableExpansionManager()->addVariable(var);
0103 }
0104 
0105 bool Editor::unregisterVariableMatch(const QString &variable)
0106 {
0107     return d->variableExpansionManager()->removeVariable(variable);
0108 }
0109 
0110 bool Editor::unregisterVariablePrefix(const QString &variable)
0111 {
0112     return d->variableExpansionManager()->removeVariable(variable);
0113 }
0114 
0115 bool Editor::expandVariable(const QString &variable, KTextEditor::View *view, QString &output) const
0116 {
0117     return d->variableExpansionManager()->expandVariable(variable, view, output);
0118 }
0119 
0120 void Editor::expandText(const QString &text, KTextEditor::View *view, QString &output) const
0121 {
0122     output = d->variableExpansionManager()->expandText(text, view);
0123 }
0124 
0125 void Editor::addVariableExpansion(const QVector<QWidget *> &widgets, const QStringList &variables) const
0126 {
0127     d->variableExpansionManager()->showDialog(widgets, variables);
0128 }
0129 
0130 QFont Editor::font() const
0131 {
0132     return d->rendererConfig()->baseFont();
0133 }
0134 
0135 KSyntaxHighlighting::Theme Editor::theme() const
0136 {
0137     return KateHlManager::self()->repository().theme(d->rendererConfig()->schema());
0138 }
0139 
0140 const KSyntaxHighlighting::Repository &Editor::repository() const
0141 {
0142     return KateHlManager::self()->repository();
0143 }
0144 
0145 bool View::insertText(const QString &text)
0146 {
0147     KTextEditor::Document *doc = document();
0148     if (!doc) {
0149         return false;
0150     }
0151     return doc->insertText(cursorPosition(), text, blockSelection());
0152 }
0153 
0154 bool View::isStatusBarEnabled() const
0155 {
0156     // is the status bar around?
0157     return !!d->statusBar();
0158 }
0159 
0160 void View::setStatusBarEnabled(bool enable)
0161 {
0162     // no state change, do nothing
0163     if (enable == !!d->statusBar()) {
0164         return;
0165     }
0166 
0167     // else toggle it
0168     d->toggleStatusBar();
0169 }
0170 
0171 bool View::insertTemplate(const KTextEditor::Cursor &insertPosition, const QString &templateString, const QString &script)
0172 {
0173     return d->insertTemplateInternal(insertPosition, templateString, script);
0174 }
0175 
0176 void View::setViewInputMode(InputMode inputMode)
0177 {
0178     d->setInputMode(inputMode);
0179 }
0180 
0181 KSyntaxHighlighting::Theme View::theme() const
0182 {
0183     return KateHlManager::self()->repository().theme(d->renderer()->config()->schema());
0184 }
0185 
0186 void View::setCursorPositions(const QVector<KTextEditor::Cursor> &positions)
0187 {
0188     d->setCursors(positions);
0189 }
0190 
0191 QVector<KTextEditor::Cursor> View::cursorPositions() const
0192 {
0193     return d->cursors();
0194 }
0195 
0196 void View::setSelections(const QVector<KTextEditor::Range> &ranges)
0197 {
0198     d->setSelections(ranges);
0199 }
0200 
0201 QVector<KTextEditor::Range> View::selectionRanges() const
0202 {
0203     return d->selectionRanges();
0204 }
0205 
0206 ConfigPage::ConfigPage(QWidget *parent)
0207     : QWidget(parent)
0208     , d(nullptr)
0209 {
0210 }
0211 
0212 ConfigPage::~ConfigPage() = default;
0213 
0214 QString ConfigPage::fullName() const
0215 {
0216     return name();
0217 }
0218 
0219 QIcon ConfigPage::icon() const
0220 {
0221     return QIcon::fromTheme(QStringLiteral("document-properties"));
0222 }
0223 
0224 View::View(ViewPrivate *impl, QWidget *parent)
0225     : QWidget(parent)
0226     , KXMLGUIClient()
0227     , d(impl)
0228 {
0229 }
0230 
0231 View::~View() = default;
0232 
0233 Plugin::Plugin(QObject *parent)
0234     : QObject(parent)
0235     , d(nullptr)
0236 {
0237 }
0238 
0239 Plugin::~Plugin() = default;
0240 
0241 int Plugin::configPages() const
0242 {
0243     return 0;
0244 }
0245 
0246 ConfigPage *Plugin::configPage(int, QWidget *)
0247 {
0248     return nullptr;
0249 }
0250 
0251 MarkInterface::MarkInterface() = default;
0252 
0253 MarkInterface::~MarkInterface() = default;
0254 
0255 ModificationInterface::ModificationInterface() = default;
0256 
0257 ModificationInterface::~ModificationInterface() = default;
0258 
0259 SessionConfigInterface::SessionConfigInterface() = default;
0260 
0261 SessionConfigInterface::~SessionConfigInterface() = default;
0262 
0263 TextHintInterface::TextHintInterface() = default;
0264 
0265 TextHintInterface::~TextHintInterface() = default;
0266 
0267 TextHintProvider::TextHintProvider() = default;
0268 
0269 TextHintProvider::~TextHintProvider() = default;
0270 
0271 InlineNoteInterface::InlineNoteInterface() = default;
0272 
0273 InlineNoteInterface::~InlineNoteInterface() = default;
0274 
0275 InlineNoteProvider::InlineNoteProvider() = default;
0276 
0277 InlineNoteProvider::~InlineNoteProvider() = default;
0278 
0279 KateInlineNoteData::KateInlineNoteData(KTextEditor::InlineNoteProvider *provider,
0280                                        const KTextEditor::View *view,
0281                                        const KTextEditor::Cursor position,
0282                                        int index,
0283                                        bool underMouse,
0284                                        const QFont &font,
0285                                        int lineHeight)
0286     : m_provider(provider)
0287     , m_view(view)
0288     , m_position(position)
0289     , m_index(index)
0290     , m_underMouse(underMouse)
0291     , m_font(font)
0292     , m_lineHeight(lineHeight)
0293 {
0294 }
0295 
0296 InlineNote::InlineNote(const KateInlineNoteData &data)
0297     : d(data)
0298 {
0299 }
0300 
0301 qreal InlineNote::width() const
0302 {
0303     return d.m_provider->inlineNoteSize(*this).width();
0304 }
0305 
0306 bool KTextEditor::InlineNote::underMouse() const
0307 {
0308     return d.m_underMouse;
0309 }
0310 
0311 void KTextEditor::InlineNoteProvider::inlineNoteActivated(const InlineNote &note, Qt::MouseButtons buttons, const QPoint &globalPos)
0312 {
0313     Q_UNUSED(note);
0314     Q_UNUSED(buttons);
0315     Q_UNUSED(globalPos);
0316 }
0317 
0318 void KTextEditor::InlineNoteProvider::inlineNoteFocusInEvent(const KTextEditor::InlineNote &note, const QPoint &globalPos)
0319 {
0320     Q_UNUSED(note);
0321     Q_UNUSED(globalPos);
0322 }
0323 
0324 void KTextEditor::InlineNoteProvider::inlineNoteFocusOutEvent(const KTextEditor::InlineNote &note)
0325 {
0326     Q_UNUSED(note);
0327 }
0328 
0329 void KTextEditor::InlineNoteProvider::inlineNoteMouseMoveEvent(const KTextEditor::InlineNote &note, const QPoint &globalPos)
0330 {
0331     Q_UNUSED(note);
0332     Q_UNUSED(globalPos);
0333 }
0334 
0335 KTextEditor::InlineNoteProvider *InlineNote::provider() const
0336 {
0337     return d.m_provider;
0338 }
0339 
0340 const KTextEditor::View *InlineNote::view() const
0341 {
0342     return d.m_view;
0343 }
0344 
0345 QFont InlineNote::font() const
0346 {
0347     return d.m_font;
0348 }
0349 
0350 int InlineNote::index() const
0351 {
0352     return d.m_index;
0353 }
0354 
0355 int InlineNote::lineHeight() const
0356 {
0357     return d.m_lineHeight;
0358 }
0359 
0360 KTextEditor::Cursor InlineNote::position() const
0361 {
0362     return d.m_position;
0363 }
0364 
0365 Command::Command(const QStringList &cmds, QObject *parent)
0366     : QObject(parent)
0367     , m_cmds(cmds)
0368     , d(nullptr)
0369 {
0370     // register this command
0371     static_cast<KTextEditor::EditorPrivate *>(KTextEditor::Editor::instance())->cmdManager()->registerCommand(this);
0372 }
0373 
0374 Command::~Command()
0375 {
0376     // unregister this command, if instance is still there!
0377     if (KTextEditor::Editor::instance()) {
0378         static_cast<KTextEditor::EditorPrivate *>(KTextEditor::Editor::instance())->cmdManager()->unregisterCommand(this);
0379     }
0380 }
0381 
0382 bool Command::supportsRange(const QString &)
0383 {
0384     return false;
0385 }
0386 
0387 KCompletion *Command::completionObject(KTextEditor::View *, const QString &)
0388 {
0389     return nullptr;
0390 }
0391 
0392 bool Command::wantsToProcessText(const QString &)
0393 {
0394     return false;
0395 }
0396 
0397 void Command::processText(KTextEditor::View *, const QString &)
0398 {
0399 }
0400 
0401 void View::setScrollPosition(KTextEditor::Cursor &cursor)
0402 {
0403     d->setScrollPositionInternal(cursor);
0404 }
0405 
0406 void View::setHorizontalScrollPosition(int x)
0407 {
0408     d->setHorizontalScrollPositionInternal(x);
0409 }
0410 
0411 KTextEditor::Cursor View::maxScrollPosition() const
0412 {
0413     return d->maxScrollPositionInternal();
0414 }
0415 
0416 int View::firstDisplayedLine(LineType lineType) const
0417 {
0418     return d->firstDisplayedLineInternal(lineType);
0419 }
0420 
0421 int View::lastDisplayedLine(LineType lineType) const
0422 {
0423     return d->lastDisplayedLineInternal(lineType);
0424 }
0425 
0426 QRect View::textAreaRect() const
0427 {
0428     return d->textAreaRectInternal();
0429 }
0430 
0431 StyleOptionAnnotationItem::StyleOptionAnnotationItem()
0432     : contentFontMetrics(QFont())
0433 {
0434 }
0435 
0436 StyleOptionAnnotationItem::StyleOptionAnnotationItem(const StyleOptionAnnotationItem &other)
0437     : QStyleOption(Version, Type)
0438     , contentFontMetrics(QFont())
0439 {
0440     *this = other;
0441 }
0442 
0443 StyleOptionAnnotationItem::StyleOptionAnnotationItem(int version)
0444     : QStyleOption(version, Type)
0445     , contentFontMetrics(QFont())
0446 {
0447 }
0448 
0449 AbstractAnnotationItemDelegate::AbstractAnnotationItemDelegate(QObject *parent)
0450     : QObject(parent)
0451 {
0452 }
0453 
0454 AbstractAnnotationItemDelegate::~AbstractAnnotationItemDelegate() = default;
0455 
0456 #include "moc_abstractannotationitemdelegate.cpp"
0457 #include "moc_annotationinterface.cpp"
0458 #include "moc_application.cpp"
0459 #include "moc_codecompletionmodel.cpp"
0460 #include "moc_command.cpp"
0461 #include "moc_configpage.cpp"
0462 #include "moc_document.cpp"
0463 #include "moc_editor.cpp"
0464 #include "moc_inlinenoteprovider.cpp"
0465 #include "moc_mainwindow.cpp"
0466 #include "moc_message.cpp"
0467 #include "moc_plugin.cpp"
0468 #include "moc_view.cpp"