kde-workspace/kate/part/document/katedocument.h
Ivailo Monev 0dc8347c49 generic: adjust to kparts changes
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2023-08-31 04:10:49 +03:00

1243 lines
38 KiB
C++

/* This file is part of the KDE libraries
Copyright (C) 2001-2004 Christoph Cullmann <cullmann@kde.org>
Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
Copyright (C) 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.de>
Copyright (C) 2006 Hamish Rodda <rodda@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef _KATE_DOCUMENT_H_
#define _KATE_DOCUMENT_H_
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QDateTime>
#include <QtGui/QClipboard>
#include <QtCore/QStack>
#include <kmimetype.h>
#include <ktexteditor/document.h>
#include <ktexteditor/sessionconfiginterface.h>
#include <ktexteditor/searchinterface.h>
#include <ktexteditor/markinterface.h>
#include <ktexteditor/variableinterface.h>
#include <ktexteditor/modificationinterface.h>
#include <ktexteditor/configinterface.h>
#include <ktexteditor/annotationinterface.h>
#include <ktexteditor/highlightinterface.h>
#include <ktexteditor/movinginterface.h>
#include <ktexteditor/recoveryinterface.h>
#include <ktexteditor/messageinterface.h>
#include "katepartinterfaces_export.h"
#include "katetextline.h"
#include "katetextcursor.h"
#include "katetextrange.h"
namespace KTextEditor {
class Plugin;
class Attribute;
}
namespace KIO { class TransferJob; }
namespace Kate { class SwapFile; }
class KateBuffer;
class KateView;
class KateDocumentConfig;
class KateHighlighting;
class KateUndoManager;
class KateOnTheFlyChecker;
class KateAutoIndent;
//
// Kate KTextEditor::Document class (and even KTextEditor::Editor ;)
//
class KATEPARTINTERFACES_EXPORT KateDocument : public KTextEditor::Document,
public KTextEditor::SessionConfigInterface,
public KTextEditor::ParameterizedSessionConfigInterface,
public KTextEditor::SearchInterface,
public KTextEditor::MarkInterface,
public KTextEditor::VariableInterface,
public KTextEditor::ModificationInterface,
public KTextEditor::ConfigInterface,
public KTextEditor::AnnotationInterface,
public KTextEditor::HighlightInterface,
public KTextEditor::MovingInterface,
public KTextEditor::RecoveryInterface,
public KTextEditor::MessageInterface,
private KTextEditor::MovingRangeFeedback
{
Q_OBJECT
Q_INTERFACES(KTextEditor::SessionConfigInterface)
Q_INTERFACES(KTextEditor::ParameterizedSessionConfigInterface)
Q_INTERFACES(KTextEditor::SearchInterface)
Q_INTERFACES(KTextEditor::MarkInterface)
Q_INTERFACES(KTextEditor::VariableInterface)
Q_INTERFACES(KTextEditor::ModificationInterface)
Q_INTERFACES(KTextEditor::AnnotationInterface)
Q_INTERFACES(KTextEditor::ConfigInterface)
Q_INTERFACES(KTextEditor::HighlightInterface)
Q_INTERFACES(KTextEditor::MovingInterface)
Q_INTERFACES(KTextEditor::RecoveryInterface)
Q_INTERFACES(KTextEditor::MessageInterface)
friend class KateDocumentTest;
friend class KateBuffer;
public:
explicit KateDocument (QWidget *parentWidget, QObject *, const QVariantList &args);
explicit KateDocument (bool bSingleViewMode=false, bool bReadOnly=false,
QWidget *parentWidget = 0, QObject * = 0);
~KateDocument ();
using ReadWritePart::closeUrl;
virtual bool closeUrl();
virtual bool openUrl( const KUrl &url );
virtual KTextEditor::Editor *editor ();
KTextEditor::Range rangeOnLine(KTextEditor::Range range, int line) const;
private:
void showAndSetOpeningErrorAccess();
/*
* Overload this to have on-demand view creation
*/
public:
/**
* @return The widget defined by this part, set by setWidget().
*/
virtual QWidget *widget();
Q_SIGNALS:
// TODO for KDE5: move to KTE::Document
void readWriteChanged (KTextEditor::Document *document);
public:
bool readOnly () const { return m_bReadOnly; }
bool singleViewMode () const { return m_bSingleViewMode; }
static bool simpleMode ();
private:
// only to make part work, don't change it !
const bool m_bSingleViewMode;
const bool m_bReadOnly;
//
// KTextEditor::Document stuff
//
public:
virtual KTextEditor::View *createView( QWidget *parent );
virtual const QList<KTextEditor::View*> &views () const;
virtual KTextEditor::View* activeView() const { return m_activeView; }
// Invalid covariant returns my a$$... for some reason gcc won't let me return a KateView above!
KateView* activeKateView() const;
private:
QList<KateView*> m_views;
QList<KTextEditor::View*> m_textEditViews;
KTextEditor::View *m_activeView;
//
// KTextEditor::EditInterface stuff
//
public Q_SLOTS:
virtual bool setText(const QString &);
virtual bool setText(const QStringList& text);
virtual bool clear ();
virtual bool insertText ( const KTextEditor::Cursor &position, const QString &s, bool block = false );
virtual bool insertText ( const KTextEditor::Cursor &position, const QStringList &text, bool block = false );
virtual bool insertLine ( int line, const QString &s );
virtual bool insertLines ( int line, const QStringList &s );
virtual bool removeText ( const KTextEditor::Range &range, bool block = false );
virtual bool removeLine ( int line );
virtual bool replaceText ( const KTextEditor::Range &range, const QString &s, bool block = false );
// unhide method...
virtual bool replaceText (const KTextEditor::Range &r, const QStringList &l, bool b)
{ return KTextEditor::Document::replaceText (r, l, b); }
public:
virtual QString text ( const KTextEditor::Range &range, bool blockwise = false ) const;
virtual QStringList textLines ( const KTextEditor::Range& range, bool block = false ) const;
virtual QString text() const;
virtual QString line(int line) const;
virtual QChar character(const KTextEditor::Cursor& position) const;
virtual int lines() const;
virtual KTextEditor::Cursor documentEnd() const;
virtual int totalCharacters() const;
virtual int lineLength(int line) const;
Q_SIGNALS:
void charactersSemiInteractivelyInserted(const KTextEditor::Cursor& position, const QString& text);
public:
//BEGIN editStart/editEnd (start, end, undo, cursor update, view update)
/**
* Enclose editor actions with @p editStart() and @p editEnd() to group
* them.
*/
void editStart ();
/**
* Alias for @p editStart()
*/
void editBegin () { editStart(); }
/**
* End a editor operation.
* @see editStart()
*/
void editEnd ();
void pushEditState();
void popEditState();
virtual bool startEditing () { editStart (); return true; }
virtual bool endEditing () { editEnd (); return true; }
//END editStart/editEnd
void inputMethodStart();
void inputMethodEnd();
//BEGIN LINE BASED INSERT/REMOVE STUFF (editStart() and editEnd() included)
/**
* Add a string in the given line/column
* @param line line number
* @param col column
* @param s string to be inserted
* @return true on success
*/
bool editInsertText ( int line, int col, const QString &s );
/**
* Remove a string in the given line/column
* @param line line number
* @param col column
* @param len length of text to be removed
* @return true on success
*/
bool editRemoveText ( int line, int col, int len );
/**
* Mark @p line as @p autowrapped. This is necessary if static word warp is
* enabled, because we have to know whether to insert a new line or add the
* wrapped words to the followin line.
* @param line line number
* @param autowrapped autowrapped?
* @return true on success
*/
bool editMarkLineAutoWrapped ( int line, bool autowrapped );
/**
* Wrap @p line. If @p newLine is true, ignore the textline's flag
* KateTextLine::flagAutoWrapped and force a new line. Whether a new line
* was needed/added you can grab with @p newLineAdded.
* @param line line number
* @param col column
* @param newLine if true, force a new line
* @param newLineAdded return value is true, if new line was added (may be 0)
* @return true on success
*/
bool editWrapLine ( int line, int col, bool newLine = true, bool *newLineAdded = 0 );
/**
* Unwrap @p line. If @p removeLine is true, we force to join the lines. If
* @p removeLine is true, @p length is ignored (eg not needed).
* @param line line number
* @param removeLine if true, force to remove the next line
* @return true on success
*/
bool editUnWrapLine ( int line, bool removeLine = true, int length = 0 );
/**
* Insert a string at the given line.
* @param line line number
* @param s string to insert
* @return true on success
*/
bool editInsertLine ( int line, const QString &s );
/**
* Remove a line
* @param line line number
* @return true on success
*/
bool editRemoveLine ( int line );
bool editRemoveLines ( int from, int to );
/**
* Remove a line
* @param startLine line to begin wrapping
* @param endLine line to stop wrapping
* @return true on success
*/
bool wrapText (int startLine, int endLine);
//END LINE BASED INSERT/REMOVE STUFF
Q_SIGNALS:
/**
* Emmitted when text from @p line was wrapped at position pos onto line @p nextLine.
*/
void editLineWrapped ( int line, int col, int len );
/**
* Emitted each time text from @p nextLine was upwrapped onto @p line.
*/
void editLineUnWrapped ( int line, int col );
public:
bool isEditRunning() const;
void setUndoMergeAllEdits(bool merge);
private:
int editSessionNumber;
QStack<int> editStateStack;
bool editIsRunning;
bool m_undoMergeAllEdits;
//
// KTextEditor::UndoInterface stuff
//
public Q_SLOTS:
void undo ();
void redo ();
public:
uint undoCount () const;
uint redoCount () const;
KateUndoManager* undoManager()
{
return m_undoManager;
}
protected:
KateUndoManager* const m_undoManager;
Q_SIGNALS:
void undoChanged ();
//
// KTextEditor::SearchInterface stuff
//
public:
virtual QVector<KTextEditor::Range> searchText(
const KTextEditor::Range & range,
const QString & pattern,
const KTextEditor::Search::SearchOptions options);
virtual KTextEditor::Search::SearchOptions supportedSearchOptions() const;
private:
/**
* Return a widget suitable to be used as a dialog parent.
*/
QWidget * dialogParent();
/*
* Access to the mode/highlighting subsystem
*/
public:
/**
* Return the name of the currently used mode
* \return name of the used mode
*
*/
virtual QString mode() const;
/**
* Return the name of the currently used mode
* \return name of the used mode
*
*/
virtual QString highlightingMode() const;
/**
* Return a list of the names of all possible modes
* \return list of mode names
*/
virtual QStringList modes() const;
/**
* Return a list of the names of all possible modes
* \return list of mode names
*/
virtual QStringList highlightingModes() const;
/**
* Set the current mode of the document by giving its name
* \param name name of the mode to use for this document
* \return \e true on success, otherwise \e false
*/
virtual bool setMode(const QString &name);
/**
* Set the current mode of the document by giving its name
* \param name name of the mode to use for this document
* \return \e true on success, otherwise \e false
*/
virtual bool setHighlightingMode(const QString &name);
/**
* Returns the name of the section for a highlight given its index in the highlight
* list (as returned by highlightModes()).
* You can use this function to build a tree of the highlight names, organized in sections.
* \param name the name of the highlight for which to find the section name.
*/
virtual QString highlightingModeSection( int index ) const;
/**
* Returns the name of the section for a mode given its index in the highlight
* list (as returned by modes()).
* You can use this function to build a tree of the mode names, organized in sections.
* \param name the name of the highlight for which to find the section name.
*/
virtual QString modeSection( int index ) const;
/*
* Helpers....
*/
public:
void bufferHlChanged();
/**
* allow to mark, that we changed hl on user wish and should not reset it
* atm used for the user visible menu to select highlightings
*/
void setDontChangeHlOnSave();
/**
* Set that the BOM marker is forced via the tool menu
*/
void bomSetByUser();
//
// KTextEditor::SessionConfigInterface and KTextEditor::ParameterizedSessionConfigInterface stuff
//
public:
virtual void readSessionConfig (const KConfigGroup&);
virtual void writeSessionConfig (KConfigGroup&);
virtual void readParameterizedSessionConfig (const KConfigGroup&, unsigned long configParameters);
virtual void writeParameterizedSessionConfig (KConfigGroup&, unsigned long configParameters);
Q_SIGNALS:
void configChanged();
//
// KTextEditor::MarkInterface
//
public Q_SLOTS:
virtual void setMark( int line, uint markType );
virtual void clearMark( int line );
virtual void addMark( int line, uint markType );
virtual void removeMark( int line, uint markType );
virtual void clearMarks();
void requestMarkTooltip( int line, QPoint position );
///Returns true if the click on the mark should not be further processed
bool handleMarkClick( int line );
///Returns true if the context-menu event should not further be processed
bool handleMarkContextMenu( int line, QPoint position );
virtual void setMarkPixmap( MarkInterface::MarkTypes, const QPixmap& );
virtual void setMarkDescription( MarkInterface::MarkTypes, const QString& );
virtual void setEditableMarks( uint markMask );
public:
virtual uint mark( int line );
virtual const QHash<int, KTextEditor::Mark*> &marks ();
virtual QPixmap markPixmap( MarkInterface::MarkTypes ) const;
virtual QString markDescription( MarkInterface::MarkTypes ) const;
virtual QColor markColor( MarkInterface::MarkTypes ) const;
virtual uint editableMarks() const;
Q_SIGNALS:
void markToolTipRequested( KTextEditor::Document* document, KTextEditor::Mark mark, QPoint position, bool& handled );
void markContextMenuRequested( KTextEditor::Document* document, KTextEditor::Mark mark, QPoint pos, bool& handled );
void markClicked( KTextEditor::Document* document, KTextEditor::Mark mark, bool& handled );
void marksChanged( KTextEditor::Document* );
void markChanged( KTextEditor::Document*, KTextEditor::Mark, KTextEditor::MarkInterface::MarkChangeAction );
private:
QHash<int, KTextEditor::Mark*> m_marks;
QHash<int,QPixmap> m_markPixmaps;
QHash<int,QString> m_markDescriptions;
uint m_editableMarks;
//
// KTextEditor::PrintInterface
//
public Q_SLOTS:
bool printDialog ();
Q_SCRIPTABLE bool print ();
//
// KTextEditor::DocumentInfoInterface ( ### unfinished )
//
public:
/**
* @return the name of the mimetype for the document.
*
* This method is using KMimeType::findByUrl, and if the pointer
* is then still the default MimeType for a nonlocal or unsaved file,
* uses mimeTypeForContent().
*/
virtual QString mimeType();
/**
* @return a pointer to the KMimeType for this document, found by analyzing the
* actual content.
*
* Note that this method is *not* part of the DocumentInfoInterface.
*/
KMimeType::Ptr mimeTypeForContent();
//
// KTextEditor::VariableInterface
//
public:
virtual QString variable( const QString &name ) const;
// ### TODO KDE5: add to KTextEditor::VaribaleInterface
virtual QString setVariable( const QString &name, const QString &value);
Q_SIGNALS:
void variableChanged( KTextEditor::Document*, const QString &, const QString & );
private:
QMap<QString, QString> m_storedVariables;
//
// MovingInterface API
//
public:
/**
* Create a new moving cursor for this document.
* @param position position of the moving cursor to create
* @param insertBehavior insertion behavior
* @return new moving cursor for the document
*/
virtual KTextEditor::MovingCursor *newMovingCursor (const KTextEditor::Cursor &position, KTextEditor::MovingCursor::InsertBehavior insertBehavior = KTextEditor::MovingCursor::MoveOnInsert);
/**
* Create a new moving range for this document.
* @param range range of the moving range to create
* @param insertBehaviors insertion behaviors
* @param emptyBehavior behavior on becoming empty
* @return new moving range for the document
*/
virtual KTextEditor::MovingRange *newMovingRange (const KTextEditor::Range &range, KTextEditor::MovingRange::InsertBehaviors insertBehaviors = KTextEditor::MovingRange::DoNotExpand
, KTextEditor::MovingRange::EmptyBehavior emptyBehavior = KTextEditor::MovingRange::AllowEmpty);
/**
* Current revision
* @return current revision
*/
virtual qint64 revision () const;
/**
* Last revision the buffer got successful saved
* @return last revision buffer got saved, -1 if none
*/
virtual qint64 lastSavedRevision () const;
/**
* Lock a revision, this will keep it around until released again.
* But all revisions will always be cleared on buffer clear() (and therefor load())
* @param revision revision to lock
*/
virtual void lockRevision (qint64 revision);
/**
* Release a revision.
* @param revision revision to release
*/
virtual void unlockRevision (qint64 revision);
/**
* Transform a cursor from one revision to an other.
* @param cursor cursor to transform
* @param insertBehavior behavior of this cursor on insert of text at its position
* @param fromRevision from this revision we want to transform
* @param toRevision to this revision we want to transform, default of -1 is current revision
*/
virtual void transformCursor (KTextEditor::Cursor &cursor, KTextEditor::MovingCursor::InsertBehavior insertBehavior, qint64 fromRevision, qint64 toRevision = -1);
/**
* Transform a cursor from one revision to an other.
* @param line line number of the cursor to transform
* @param column column number of the cursor to transform
* @param insertBehavior behavior of this cursor on insert of text at its position
* @param fromRevision from this revision we want to transform
* @param toRevision to this revision we want to transform, default of -1 is current revision
*/
virtual void transformCursor (int& line, int& column, KTextEditor::MovingCursor::InsertBehavior insertBehavior, qint64 fromRevision, qint64 toRevision = -1);
/**
* Transform a range from one revision to an other.
* @param range range to transform
* @param insertBehaviors behavior of this range on insert of text at its position
* @param emptyBehavior behavior on becoming empty
* @param fromRevision from this revision we want to transform
* @param toRevision to this revision we want to transform, default of -1 is current revision
*/
virtual void transformRange (KTextEditor::Range &range, KTextEditor::MovingRange::InsertBehaviors insertBehaviors, KTextEditor::MovingRange::EmptyBehavior emptyBehavior, qint64 fromRevision, qint64 toRevision = -1);
//
// MovingInterface Signals
//
Q_SIGNALS:
/**
* This signal is emitted before the cursors/ranges/revisions of a document are destroyed as the document is deleted.
* @param document the document which the interface belongs too which is in the process of being deleted
*/
void aboutToDeleteMovingInterfaceContent (KTextEditor::Document *document);
/**
* This signal is emitted before the ranges of a document are invalidated and the revisions are deleted as the document is cleared (for example on load/reload).
* While this signal is emitted, still the old document content is around before the clear.
* @param document the document which the interface belongs too which will invalidate its data
*/
void aboutToInvalidateMovingInterfaceContent (KTextEditor::Document *document);
//
// Annotation Interface
//
public:
virtual void setAnnotationModel( KTextEditor::AnnotationModel* model );
virtual KTextEditor::AnnotationModel* annotationModel() const;
Q_SIGNALS:
void annotationModelChanged( KTextEditor::AnnotationModel*, KTextEditor::AnnotationModel* );
private:
KTextEditor::AnnotationModel* m_annotationModel;
//
// KParts::ReadWrite stuff
//
public:
/**
* open the file obtained by the kparts framework
* the framework abstracts the loading of remote files
* @return success
*/
virtual bool openFile ();
/**
* save the file obtained by the kparts framework
* the framework abstracts the uploading of remote files
* @return success
*/
virtual bool saveFile ();
virtual void setReadWrite ( bool rw = true );
virtual void setModified( bool m );
private:
void activateDirWatch (const QString &useFileName = QString());
void deactivateDirWatch ();
QString m_dirWatchFile;
public:
/**
* Type chars in a view.
* Will filter out non-printable chars from the realChars array before inserting.
*/
bool typeChars ( KateView *type, const QString &realChars );
/**
* gets the last line number (lines() - 1)
*/
inline int lastLine() const { return lines()-1; }
// Repaint all of all of the views
void repaintViews(bool paintOnlyDirty = true);
KateHighlighting *highlight () const;
public Q_SLOTS:
void tagLines(int start, int end);
private Q_SLOTS:
void internalHlChanged();
public:
void addView(KTextEditor::View *);
/** removes the view from the list of views. The view is *not* deleted.
* That's your job. Or, easier, just delete the view in the first place.
* It will remove itself. TODO: this could be converted to a private slot
* connected to the view's destroyed() signal. It is not currently called
* anywhere except from the KateView destructor.
*/
void removeView(KTextEditor::View *);
void setActiveView(KTextEditor::View*);
bool ownedView(KateView *);
int toVirtualColumn( int line, int column ) const;
int toVirtualColumn( const KTextEditor::Cursor& ) const;
int fromVirtualColumn( int line, int column ) const;
int fromVirtualColumn( const KTextEditor::Cursor& ) const;
void newLine( KateView*view ); // Changes input
void backspace( KateView *view, const KTextEditor::Cursor& );
void del( KateView *view, const KTextEditor::Cursor& );
void transpose( const KTextEditor::Cursor& );
void paste ( KateView* view, const QString &text );
public:
void indent ( KTextEditor::Range range, int change );
void comment ( KateView *view, uint line, uint column, int change );
void align ( KateView *view, const KTextEditor::Range &range );
void insertTab( KateView *view, const KTextEditor::Cursor& );
enum TextTransform { Uppercase, Lowercase, Capitalize };
/**
Handling uppercase, lowercase and capitalize for the view.
If there is a selection, that is transformed, otherwise for uppercase or
lowercase the character right of the cursor is transformed, for capitalize
the word under the cursor is transformed.
*/
void transform ( KateView *view, const KTextEditor::Cursor &, TextTransform );
/**
Unwrap a range of lines.
*/
void joinLines( uint first, uint last );
private:
bool removeStringFromBeginning(int line, const QString &str);
bool removeStringFromEnd(int line, const QString &str);
/**
Find the position (line and col) of the next char
that is not a space. If found line and col point to the found character.
Otherwise they have both the value -1.
@param line Line of the character which is examined first.
@param col Column of the character which is examined first.
@return True if the specified or a following character is not a space
Otherwise false.
*/
bool nextNonSpaceCharPos(int &line, int &col);
/**
Find the position (line and col) of the previous char
that is not a space. If found line and col point to the found character.
Otherwise they have both the value -1.
@return True if the specified or a preceding character is not a space.
Otherwise false.
*/
bool previousNonSpaceCharPos(int &line, int &col);
/**
* Sets a comment marker as defined by the language providing the attribute
* @p attrib on the line @p line
*/
void addStartLineCommentToSingleLine(int line, int attrib=0);
/**
* Removes a comment marker as defined by the language providing the attribute
* @p attrib on the line @p line
*/
bool removeStartLineCommentFromSingleLine(int line, int attrib=0);
/**
* @see addStartLineCommentToSingleLine.
*/
void addStartStopCommentToSingleLine(int line, int attrib=0);
/**
*@see removeStartLineCommentFromSingleLine.
*/
bool removeStartStopCommentFromSingleLine(int line, int attrib=0);
/**
*@see removeStartLineCommentFromSingleLine.
*/
bool removeStartStopCommentFromRegion(const KTextEditor::Cursor &start, const KTextEditor::Cursor &end, int attrib=0);
/**
* Add a comment marker as defined by the language providing the attribute
* @p attrib to each line in the selection.
*/
void addStartStopCommentToSelection( KateView *view, int attrib=0 );
/**
* @see addStartStopCommentToSelection.
*/
void addStartLineCommentToSelection( KateView *view, int attrib=0 );
/**
* Removes comment markers relevant to the language providing
* the attribuge @p attrib from each line in the selection.
*
* @return whether the operation succeeded.
*/
bool removeStartStopCommentFromSelection( KateView *view, int attrib=0 );
/**
* @see removeStartStopCommentFromSelection.
*/
bool removeStartLineCommentFromSelection( KateView *view, int attrib=0 );
public:
// KDE5: rename to wordAt(), add wordRangeAt(), see ktexteditor/document.h
QString getWord( const KTextEditor::Cursor& cursor );
public:
void newBracketMark( const KTextEditor::Cursor& start, KTextEditor::Range& bm, int maxLines = -1 );
bool findMatchingBracket( KTextEditor::Range& range, int maxLines = -1 );
public:
virtual const QString &documentName () const { return m_docName; }
private:
void updateDocName ();
public:
/**
* @return whether the document is modified on disk since last saved
*/
bool isModifiedOnDisc() { return m_modOnHd; }
virtual void setModifiedOnDisk( ModifiedOnDiskReason reason );
virtual void setModifiedOnDiskWarning ( bool on );
public Q_SLOTS:
/**
* Ask the user what to do, if the file has been modified on disk.
* Reimplemented from KTextEditor::Document.
*/
virtual void slotModifiedOnDisk( KTextEditor::View *v = 0 );
/**
* Reloads the current document from disk if possible
*/
virtual bool documentReload ();
virtual bool documentSave ();
virtual bool documentSaveAs ();
virtual bool save();
public:
virtual bool saveAs( const KUrl &url );
Q_SIGNALS:
/**
* Indicate this file is modified on disk
* @param doc the KTextEditor::Document object that represents the file on disk
* @param isModified indicates the file was modified rather than created or deleted
* @param reason the reason we are emitting the signal.
*/
void modifiedOnDisk (KTextEditor::Document *doc, bool isModified, KTextEditor::ModificationInterface::ModifiedOnDiskReason reason);
public:
void ignoreModifiedOnDiskOnce();
private:
int m_isasking; // don't reenter slotModifiedOnDisk when this is true
// -1: ignore once, 0: false, 1: true
public:
virtual bool setEncoding (const QString &e);
virtual const QString &encoding() const;
public Q_SLOTS:
void setWordWrap (bool on);
void setWordWrapAt (uint col);
public:
bool wordWrap() const;
uint wordWrapAt() const;
public Q_SLOTS:
void setPageUpDownMovesCursor(bool on);
public:
bool pageUpDownMovesCursor() const;
// code folding
public:
Kate::TextLine kateTextLine(uint i);
Kate::TextLine plainKateTextLine(uint i);
Q_SIGNALS:
void aboutToRemoveText(const KTextEditor::Range&);
private Q_SLOTS:
void slotModOnHdDirty (const QString &path);
private:
/**
* create a Sha1 digest of the file, if it is a local file.
* The result can be accessed through KateBuffer::digest().
*
* @return wheather the operation was attempted and succeeded.
*/
bool createDigest ();
/**
* create a string for the modonhd warnings, giving the reason.
*/
QString reasonedMOHString() const;
/**
* Removes all trailing whitespace in the document.
*/
void removeTrailingSpaces();
public:
/**
* sha1 digest of this document
* @return sha1 digest for this document
*/
const QByteArray &digest () const;
void updateFileType (const QString &newType, bool user = false);
QString fileType () const { return m_fileType; }
/**
* Get access to buffer of this document.
* Is needed to create cursors and ranges for example.
* @return document buffer
*/
KateBuffer &buffer () { return *m_buffer; }
/**
* set indentation mode by user
* this will remember that a user did set it and will avoid reset on save
*/
void rememberUserDidSetIndentationMode ()
{
m_indenterSetByUser = true;
}
/**
* User did set encoding for next reload => enforce it!
*/
void userSetEncodingForNextReload ()
{
m_userSetEncodingForNextReload = true;
}
//
// REALLY internal data ;)
//
private:
// text buffer
KateBuffer *const m_buffer;
// indenter
KateAutoIndent *const m_indenter;
bool m_hlSetByUser;
bool m_bomSetByUser;
bool m_indenterSetByUser;
bool m_userSetEncodingForNextReload;
bool m_modOnHd;
ModifiedOnDiskReason m_modOnHdReason;
QString m_docName;
int m_docNameNumber;
// file type !!!
QString m_fileType;
bool m_fileTypeSetByUser;
/**
* document is still reloading a file
*/
bool m_reloading;
public Q_SLOTS:
void slotQueryClose_save(bool *handled, bool* abortClosing);
public:
virtual bool queryClose();
void makeAttribs (bool needInvalidate = true);
static bool checkOverwrite( KUrl u, QWidget *parent );
/**
* Configuration
*/
public:
KateDocumentConfig *config() { return m_config; }
KateDocumentConfig *config() const { return m_config; }
void updateConfig ();
private:
KateDocumentConfig *const m_config;
/**
* Variable Reader
* TODO add register functionality/ktexteditor interface
*/
private:
/**
* read dir config file
*/
void readDirConfig ();
/**
Reads all the variables in the document.
Called when opening/saving a document
*/
void readVariables(bool onlyViewAndRenderer = false);
/**
Reads and applies the variables in a single line
TODO registered variables gets saved in a [map]
*/
void readVariableLine( QString t, bool onlyViewAndRenderer = false );
/**
Sets a view variable in all the views.
*/
void setViewVariable( QString var, QString val );
/**
@return weather a string value could be converted
to a bool value as supported.
The value is put in *result.
*/
static bool checkBoolValue( QString value, bool *result );
/**
@return weather a string value could be converted
to a integer value.
The value is put in *result.
*/
static bool checkIntValue( QString value, int *result );
/**
Feeds value into @p col using QColor::setNamedColor() and returns
wheather the color is valid
*/
static bool checkColorValue( QString value, QColor &col );
/**
* helper regex to capture the document variables
*/
static QRegExp kvLine;
static QRegExp kvLineWildcard;
static QRegExp kvLineMime;
static QRegExp kvVar;
bool m_fileChangedDialogsActivated;
//
// KTextEditor::ConfigInterface
//
public:
virtual QStringList configKeys() const;
virtual QVariant configValue(const QString &key);
virtual void setConfigValue(const QString &key, const QVariant &value);
//
// KTextEditor::RecoveryInterface
//
public:
virtual bool isDataRecoveryAvailable() const;
virtual void recoverData();
virtual void discardDataRecovery();
//
// KTextEditor::HighlightInterface
//
public:
virtual KTextEditor::Attribute::Ptr defaultStyle(const KTextEditor::HighlightInterface::DefaultStyle ds) const;
virtual QList< KTextEditor::HighlightInterface::AttributeBlock > lineAttributes(const unsigned int line);
virtual QStringList embeddedHighlightingModes() const;
virtual QString highlightingModeAt(const KTextEditor::Cursor& position);
// TODO KDE5: maybe make available in HighlightInterface for convenience
virtual KTextEditor::Attribute::Ptr attributeAt(const KTextEditor::Cursor & position);
//
//BEGIN: KTextEditor::MessageInterface
//
public:
virtual bool postMessage(KTextEditor::Message* message);
public Q_SLOTS:
void messageDestroyed(KTextEditor::Message* message);
private:
QHash<KTextEditor::Message *, QList<QSharedPointer<QAction> > > m_messageHash;
//END KTextEditor::MessageInterface
public:
QString defaultDictionary() const;
QList<QPair<KTextEditor::MovingRange*, QString> > dictionaryRanges() const;
bool isOnTheFlySpellCheckingEnabled() const;
QString dictionaryForMisspelledRange(const KTextEditor::Range& range) const;
void clearMisspellingForWord(const QString& word);
public Q_SLOTS:
void clearDictionaryRanges();
void setDictionary(const QString& dict, const KTextEditor::Range &range);
void revertToDefaultDictionary(const KTextEditor::Range &range);
void setDefaultDictionary(const QString& dict);
void onTheFlySpellCheckingEnabled(bool enable);
void refreshOnTheFlyCheck(const KTextEditor::Range &range = KTextEditor::Range::invalid());
Q_SIGNALS:
void dictionaryRangesPresent(bool yesNo);
void defaultDictionaryChanged(KateDocument *document);
public:
bool containsCharacterEncoding(const KTextEditor::Range& range);
typedef QList<QPair<int, int> > OffsetList;
int computePositionWrtOffsets(const OffsetList& offsetList, int pos);
/**
* The first OffsetList is from decoded to encoded, and the second OffsetList from
* encoded to decoded.
**/
QString decodeCharacters(const KTextEditor::Range& range,
KateDocument::OffsetList& decToEncOffsetList,
KateDocument::OffsetList& encToDecOffsetList);
void replaceCharactersByEncoding(const KTextEditor::Range& range);
enum EncodedCharaterInsertionPolicy {EncodeAlways, EncodeWhenPresent, EncodeNever};
protected:
KateOnTheFlyChecker *m_onTheFlyChecker;
QString m_defaultDictionary;
QList<QPair<KTextEditor::MovingRange*, QString> > m_dictionaryRanges;
// from KTextEditor::MovingRangeFeedback
void rangeInvalid(KTextEditor::MovingRange *movingRange);
void rangeEmpty(KTextEditor::MovingRange *movingRange);
void deleteDictionaryRange(KTextEditor::MovingRange *movingRange);
private:
Kate::SwapFile *m_swapfile;
public:
Kate::SwapFile* swapFile();
//helpers for scripting and codefolding
int defStyleNum(int line, int column);
bool isComment(int line, int column);
public:
int findModifiedLine(int startLine, bool down);
private Q_SLOTS:
/**
* watch for all started io jobs to remember if file is perhaps loading atm
* @param job started job
*/
void slotStarted(KIO::Job *job);
void slotCompleted();
void slotCanceled();
/**
* trigger display of loading message, after 1000 ms
*/
void slotTriggerLoadingMessage ();
/**
* Abort loading
*/
void slotAbortLoading ();
private:
/**
* different possible states
*/
enum DocumentStates {
/**
* Idle
*/
DocumentIdle,
/**
* Loading
*/
DocumentLoading,
/**
* Saving
*/
DocumentSaving,
/**
* Pre Saving As, this is between ::saveAs is called and ::save
*/
DocumentPreSavingAs,
/**
* Saving As
*/
DocumentSavingAs
};
/**
* current state
*/
DocumentStates m_documentState;
/**
* read-write state before loading started
*/
bool m_readWriteStateBeforeLoading;
/**
* if the document is untitled
*/
bool m_isUntitled;
/**
* loading job, we want to cancel with cancel in the loading message
*/
QPointer<KJob> m_loadingJob;
/**
* message to show during loading
*/
QPointer<KTextEditor::Message> m_loadingMessage;
};
#endif
// kate: space-indent on; indent-width 2; replace-tabs on;