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 ¬e, 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 ¬e, const QPoint &globalPos) 0319 { 0320 Q_UNUSED(note); 0321 Q_UNUSED(globalPos); 0322 } 0323 0324 void KTextEditor::InlineNoteProvider::inlineNoteFocusOutEvent(const KTextEditor::InlineNote ¬e) 0325 { 0326 Q_UNUSED(note); 0327 } 0328 0329 void KTextEditor::InlineNoteProvider::inlineNoteMouseMoveEvent(const KTextEditor::InlineNote ¬e, 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"