File indexing completed on 2024-04-21 03:57:24

0001 /*
0002     SPDX-FileCopyrightText: 2002, 2003 Anders Lund <anders.lund@lund.tdcadsl.dk>
0003     SPDX-FileCopyrightText: 2003 Christoph Cullmann <cullmann@kde.org>
0004     SPDX-FileCopyrightText: 2001 Joseph Wenninger <jowenn@kde.org>
0005     SPDX-FileCopyrightText: 2006-2016 Dominik Haumann <dhaumann@kde.org>
0006     SPDX-FileCopyrightText: 2007 Mirko Stocker <me@misto.ch>
0007     SPDX-FileCopyrightText: 2009 Michel Ludwig <michel.ludwig@kdemail.net>
0008     SPDX-FileCopyrightText: 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.de>
0009 
0010     SPDX-License-Identifier: LGPL-2.0-or-later
0011 */
0012 
0013 #ifndef KATE_DIALOGS_H
0014 #define KATE_DIALOGS_H
0015 
0016 #include "kateconfigpage.h"
0017 #include "katehighlight.h"
0018 #include "kateviewhelpers.h"
0019 
0020 #include <ktexteditor/attribute.h>
0021 #include <ktexteditor/document.h>
0022 
0023 #include <sonnet/configwidget.h>
0024 #include <sonnet/dictionarycombobox.h>
0025 
0026 #include <QColor>
0027 #include <QDialog>
0028 #include <QTabWidget>
0029 #include <QTreeWidget>
0030 
0031 class ModeConfigPage;
0032 namespace KTextEditor
0033 {
0034 class DocumentPrivate;
0035 }
0036 namespace KTextEditor
0037 {
0038 class ViewPrivate;
0039 }
0040 namespace KTextEditor
0041 {
0042 class Message;
0043 }
0044 
0045 namespace KIO
0046 {
0047 class Job;
0048 class TransferJob;
0049 }
0050 
0051 class KShortcutsEditor;
0052 class QSpinBox;
0053 class KProcess;
0054 
0055 class QCheckBox;
0056 class QLabel;
0057 class QCheckBox;
0058 class QKeyEvent;
0059 class QTemporaryFile;
0060 class QTableWidget;
0061 
0062 namespace Ui
0063 {
0064 class TextareaAppearanceConfigWidget;
0065 class BordersAppearanceConfigWidget;
0066 class NavigationConfigWidget;
0067 class EditConfigWidget;
0068 class IndentationConfigWidget;
0069 class OpenSaveConfigWidget;
0070 class OpenSaveConfigAdvWidget;
0071 class CompletionConfigTab;
0072 class SpellCheckConfigWidget;
0073 class StatusbarConfigWidget;
0074 }
0075 
0076 class KateGotoBar : public KateViewBarWidget
0077 {
0078 public:
0079     explicit KateGotoBar(KTextEditor::View *view, QWidget *parent = nullptr);
0080 
0081     void closed() override;
0082 
0083 public:
0084     void updateData();
0085 
0086 protected:
0087     void gotoLine();
0088     void gotoClipboard();
0089 
0090 protected:
0091     void keyPressEvent(QKeyEvent *event) override;
0092     bool eventFilter(QObject *, QEvent *) override;
0093     void showEvent(QShowEvent *event) override;
0094 
0095 private:
0096     KTextEditor::View *const m_view;
0097     QSpinBox *m_gotoRange = nullptr;
0098     QToolButton *m_modifiedUp = nullptr;
0099     QToolButton *m_modifiedDown = nullptr;
0100     int m_wheelDelta = 0; // To accumulate "wheel-deltas" to become e.g. a touch-pad usable
0101 };
0102 
0103 class KateDictionaryBar : public KateViewBarWidget
0104 {
0105 public:
0106     explicit KateDictionaryBar(KTextEditor::ViewPrivate *view, QWidget *parent = nullptr);
0107     ~KateDictionaryBar() override;
0108 
0109 public:
0110     void updateData();
0111 
0112 protected:
0113     void dictionaryChanged(const QString &dictionary);
0114 
0115 private:
0116     KTextEditor::ViewPrivate *m_view;
0117     Sonnet::DictionaryComboBox *m_dictionaryComboBox;
0118 };
0119 
0120 class KateIndentConfigTab : public KateConfigPage
0121 {
0122 public:
0123     explicit KateIndentConfigTab(QWidget *parent);
0124     ~KateIndentConfigTab() override;
0125     QString name() const override;
0126 
0127 protected:
0128     Ui::IndentationConfigWidget *ui;
0129 
0130 public:
0131     void apply() override;
0132     void reload() override;
0133     void reset() override
0134     {
0135     }
0136     void defaults() override
0137     {
0138     }
0139 
0140 private:
0141     void slotChanged();
0142     void showWhatsThis(const QString &text);
0143 };
0144 
0145 class KateCompletionConfigTab : public KateConfigPage
0146 {
0147 public:
0148     explicit KateCompletionConfigTab(QWidget *parent);
0149     ~KateCompletionConfigTab() override;
0150     QString name() const override;
0151 
0152 protected:
0153     Ui::CompletionConfigTab *ui;
0154 
0155 public:
0156     void apply() override;
0157     void reload() override;
0158     void reset() override
0159     {
0160     }
0161     void defaults() override
0162     {
0163     }
0164 
0165 private:
0166     void showWhatsThis(const QString &text);
0167 };
0168 
0169 class KateEditGeneralConfigTab : public KateConfigPage
0170 {
0171 public:
0172     explicit KateEditGeneralConfigTab(QWidget *parent);
0173     ~KateEditGeneralConfigTab() override;
0174     QString name() const override;
0175 
0176 private:
0177     Ui::EditConfigWidget *ui;
0178 
0179     enum SetOfCharsToEncloseSelection {
0180         None,
0181         MarkDown,
0182         NonLetters,
0183         MirrorChar,
0184         UserData // Ensure to keep it at bottom of this list
0185     };
0186 
0187 public:
0188     void apply() override;
0189     void reload() override;
0190     void reset() override
0191     {
0192     }
0193     void defaults() override
0194     {
0195     }
0196 };
0197 
0198 class KateNavigationConfigTab : public KateConfigPage
0199 {
0200 public:
0201     explicit KateNavigationConfigTab(QWidget *parent);
0202     ~KateNavigationConfigTab() override;
0203     QString name() const override;
0204 
0205 private:
0206     Ui::NavigationConfigWidget *ui;
0207 
0208     void initMulticursorModifierComboBox();
0209 
0210 public:
0211     void apply() override;
0212     void reload() override;
0213     void reset() override
0214     {
0215     }
0216     void defaults() override
0217     {
0218     }
0219 };
0220 
0221 class KateSpellCheckConfigTab : public KateConfigPage
0222 {
0223 public:
0224     explicit KateSpellCheckConfigTab(QWidget *parent);
0225     ~KateSpellCheckConfigTab() override;
0226     QString name() const override;
0227 
0228 protected:
0229     Ui::SpellCheckConfigWidget *ui;
0230     Sonnet::ConfigWidget *m_sonnetConfigWidget;
0231 
0232 public:
0233     void apply() override;
0234     void reload() override;
0235     void reset() override
0236     {
0237     }
0238     void defaults() override
0239     {
0240     }
0241 
0242 private:
0243     void showWhatsThis(const QString &text);
0244 };
0245 
0246 class KateEditConfigTab : public KateConfigPage
0247 {
0248 public:
0249     explicit KateEditConfigTab(QWidget *parent);
0250     ~KateEditConfigTab() override;
0251     QString name() const override;
0252     QString fullName() const override;
0253     QIcon icon() const override;
0254 
0255 public:
0256     void apply() override;
0257     void reload() override;
0258     void reset() override;
0259     void defaults() override;
0260 
0261 private:
0262     KateEditGeneralConfigTab *editConfigTab;
0263     KateNavigationConfigTab *navigationConfigTab;
0264     KateIndentConfigTab *indentConfigTab;
0265     KateCompletionConfigTab *completionConfigTab;
0266     KateSpellCheckConfigTab *spellCheckConfigTab;
0267     std::vector<KateConfigPage *> m_inputModeConfigTabs;
0268 };
0269 
0270 class KateViewDefaultsConfig : public KateConfigPage
0271 {
0272 public:
0273     explicit KateViewDefaultsConfig(QWidget *parent);
0274     ~KateViewDefaultsConfig() override;
0275     QString name() const override;
0276     QString fullName() const override;
0277     QIcon icon() const override;
0278 
0279 public:
0280     void apply() override;
0281     void reload() override;
0282     void reset() override;
0283     void defaults() override;
0284 
0285 private:
0286     Ui::TextareaAppearanceConfigWidget *const textareaUi;
0287     Ui::BordersAppearanceConfigWidget *const bordersUi;
0288     Ui::StatusbarConfigWidget *const statusBarUi;
0289 };
0290 
0291 class KateSaveConfigTab : public KateConfigPage
0292 {
0293 public:
0294     explicit KateSaveConfigTab(QWidget *parent);
0295     ~KateSaveConfigTab() override;
0296     QString name() const override;
0297     QString fullName() const override;
0298     QIcon icon() const override;
0299 
0300 public:
0301     void apply() override;
0302     void reload() override;
0303     void reset() override;
0304     void defaults() override;
0305     void swapFileModeChanged(int);
0306 
0307 protected:
0308     // why?
0309     // KComboBox *m_encoding, *m_encodingDetection, *m_eol;
0310     QCheckBox *cbLocalFiles, *cbRemoteFiles;
0311     QCheckBox *replaceTabs, *removeSpaces, *allowEolDetection;
0312     class QSpinBox *blockCount;
0313     class QLabel *blockCountLabel;
0314 
0315 private:
0316     Ui::OpenSaveConfigWidget *ui;
0317     Ui::OpenSaveConfigAdvWidget *uiadv;
0318     ModeConfigPage *modeConfigPage;
0319 };
0320 
0321 /**
0322  * This dialog will prompt the user for what do with a file that is
0323  * modified on disk.
0324  * If the file wasn't deleted, it has a 'diff' button, which will create
0325  * a diff file (using diff(1)) and launch that using OpenUrlJob.
0326  */
0327 class KateModOnHdPrompt : public QObject
0328 {
0329     Q_OBJECT
0330 public:
0331     enum Status {
0332         Reload = 1, // 0 is QDialog::Rejected
0333         Save,
0334         Overwrite,
0335         Ignore,
0336         Close
0337     };
0338     KateModOnHdPrompt(KTextEditor::DocumentPrivate *doc, KTextEditor::Document::ModifiedOnDiskReason modtype, const QString &reason);
0339     ~KateModOnHdPrompt() override;
0340 
0341 Q_SIGNALS:
0342     void saveAsTriggered();
0343     void ignoreTriggered();
0344     void reloadTriggered();
0345     void autoReloadTriggered();
0346     void closeTriggered();
0347 
0348 private Q_SLOTS:
0349     /**
0350      * Show a diff between the document text and the disk file.
0351      */
0352     void slotDiff();
0353 
0354 private Q_SLOTS:
0355     void slotDataAvailable(); ///< read data from the process
0356     void slotPDone(); ///< Runs the diff file when done
0357 
0358 private:
0359     KTextEditor::DocumentPrivate *m_doc;
0360     QPointer<KTextEditor::Message> m_message;
0361     QString m_fullDiffPath;
0362     KProcess *m_proc;
0363     QTemporaryFile *m_diffFile;
0364     QAction *m_diffAction;
0365 };
0366 
0367 #endif