You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
353 lines
14 KiB
353 lines
14 KiB
15 years ago
|
/***************************************************************************
|
||
|
document.h - description
|
||
|
-------------------
|
||
|
begin : Tue Jun 6 2000
|
||
|
copyright : (C) 2000 by Dmitry Poplavsky & Alexander Yakovlev & Eric Laffoon <pdima@users.sourceforge.net,yshurik@penguinpowered.com,sequitur@easystreet.com>
|
||
|
(C) 2001-2004 Andras Mantia <amantia@kde.org>
|
||
|
***************************************************************************/
|
||
|
|
||
|
/***************************************************************************
|
||
|
* *
|
||
|
* This program is free software; you can redistribute it and/or modify *
|
||
|
* it under the terms of the GNU General Public License as published by *
|
||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||
|
* (at your option) any later version. *
|
||
|
* *
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef DOCUMENT_H
|
||
|
#define DOCUMENT_H
|
||
|
|
||
|
//qt includes
|
||
|
#include <qdatetime.h>
|
||
|
#include <qdict.h>
|
||
|
#include <qmap.h>
|
||
|
#include <qwidget.h>
|
||
|
|
||
|
#include <kurl.h>
|
||
|
#include <ktexteditor/markinterfaceextension.h>
|
||
|
|
||
|
//own includes
|
||
|
#include "qtag.h"
|
||
|
|
||
|
/**
|
||
|
*@author Dmitry Poplavsky & Alexander Yakovlev & Eric Laffoon & Andras Mantia
|
||
|
*/
|
||
|
|
||
|
class QDomDocument;
|
||
|
class QEvent;
|
||
|
class QFocusEvent;
|
||
|
class QTextCodec;
|
||
|
class QStringList;
|
||
|
class KConfig;
|
||
|
class KTempFile;
|
||
|
class KURL;
|
||
|
class Tag;
|
||
|
class Node;
|
||
|
class Project;
|
||
|
class undoRedo;
|
||
|
struct AreaStruct;
|
||
|
struct DTDStruct;
|
||
|
|
||
|
namespace KTextEditor
|
||
|
{
|
||
|
class CodeCompletionInterface;
|
||
|
class CompletionEntry;
|
||
|
class ConfigInterface;
|
||
|
class Document;
|
||
|
class EditInterface;
|
||
|
class EditInterfaceExt;
|
||
|
class EncodingInterface;
|
||
|
class MarkInterface;
|
||
|
class SelectionInterface;
|
||
|
class SelectionInterfaceExt;
|
||
|
class View;
|
||
|
class ViewCursorInterface;
|
||
|
class Mark;
|
||
|
}
|
||
|
|
||
|
class Document : public QWidget{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
Document(KTextEditor::Document *doc,
|
||
|
QWidget *parent = 0, const char *name = 0, WFlags f=0);
|
||
|
~Document();
|
||
|
|
||
|
KURL url();
|
||
|
|
||
|
bool isUntitled();
|
||
|
void setUntitledUrl(const QString &url);
|
||
|
/** Returns tag name at specified position */
|
||
|
QString getTagNameAt(int line, int col );
|
||
|
|
||
|
void selectText(int x1, int y1, int x2, int y2 );
|
||
|
void replaceSelected(const QString &s);
|
||
|
|
||
|
/** insert tag in document */
|
||
|
void insertTag(const QString &s1, const QString &s2 = QString::null);
|
||
|
/** Change the current tag's attributes with those from dict */
|
||
|
void changeTag(Tag *tag, QDict<QString> *dict );
|
||
|
/**Change the attr value of the called attrName to attrValue*/
|
||
|
void changeTagAttribute(Tag *tag, const QString& attrName, const QString&attrValue);
|
||
|
/**Change the namespace in a tag. Add if it's not present, or remove if the
|
||
|
namespace argument is empty*/
|
||
|
void changeTagNamespace(Tag *tag, const QString& nameSpace);
|
||
|
/** Insert the content of the url into the document. */
|
||
|
void insertFile(const KURL& url);
|
||
|
/** Inserts text at the current cursor position */
|
||
|
void insertText(const QString &text, bool adjustCursor = true, bool reparse = true);
|
||
|
/** Recursively insert the mandatory childs of tag. Returns true if a child was
|
||
|
inserted.*/
|
||
|
bool insertChildTags(QTag *tag, QTag* lastTag = 0L);
|
||
|
|
||
|
QPoint getGlobalCursorPos();
|
||
|
QString find(const QRegExp& rx, int sLine, int sCol, int& fbLine, int&fbCol, int &feLine, int&feCol);
|
||
|
QString findRev(const QRegExp& rx, int sLine, int sCol, int& fbLine, int&fbCol, int &feLine, int&feCol);
|
||
|
/** Get the view of the document */
|
||
|
KTextEditor::View* view();
|
||
|
/** Get the KTextEditor::Document of the document */
|
||
|
KTextEditor::Document* doc();
|
||
|
/** Sets the modifiedFlag value. */
|
||
|
void setModified(bool flag);
|
||
|
/** Returns true if the document was modified. */
|
||
|
bool isModified();
|
||
|
|
||
|
/** Creates a temporary file where the editor content is saved.
|
||
|
*/
|
||
|
void createTempFile();
|
||
|
/** Closes and removes the temporary file. */
|
||
|
void closeTempFile();
|
||
|
/** Returns the name of the temporary file, QString::null if no temporary file exists. */
|
||
|
QString tempFileName();
|
||
|
|
||
|
/** Returns the DTD identifier for the document */
|
||
|
QString getDTDIdentifier();
|
||
|
/** Sets the DTD identifier */
|
||
|
void setDTDIdentifier(const QString &id);
|
||
|
/** Get a pointer to the current active DTD. If fallback is true, this always gives back a valid and known DTD pointer: the active, the document specified and in last case the application default document type. */
|
||
|
const DTDStruct* currentDTD(bool fallback = true);
|
||
|
/** Get a pointer to the default DTD (document, or app). */
|
||
|
const DTDStruct* defaultDTD() const;
|
||
|
/** Find the DTD name for a part of the document. */
|
||
|
QString findDTDName(Tag **tag);
|
||
|
/** Retrives the text from the specified rectangle. The KTextEditor::EditInterface::text seems to not
|
||
|
work correctly. */
|
||
|
QString text(int bLine, int bCol, int eLine, int eCol) const;
|
||
|
/** Same as the above, but using AreaStruct as an argument */
|
||
|
QString text(const AreaStruct &area) const;
|
||
|
/** Code completion was requested by the user. */
|
||
|
void codeCompletionRequested();
|
||
|
/** Bring up the code completion tooltip. */
|
||
|
void codeCompletionHintRequested();
|
||
|
/** Returns the dirty status. */
|
||
|
bool dirty() const {return m_dirty;};
|
||
|
void setDirtyStatus(bool status) {m_dirty = status;};
|
||
|
/** Ask for user confirmation if the file was changed outside. */
|
||
|
void checkDirtyStatus();
|
||
|
/** Save the document and reset the dirty status. */
|
||
|
void save();
|
||
|
/** Save the document under a new name and calculate the new md5sum. */
|
||
|
bool saveAs(const KURL& url);
|
||
|
/** Enable or disable the visibility of groups for a DTEP.*/
|
||
|
void enableGroupsForDTEP(const QString& dtepName, bool enable = true);
|
||
|
/** Clears the selected DTEP list */
|
||
|
void resetGroupsForDTEPList();
|
||
|
/** Find the word until the first word boundary backwards */
|
||
|
QString findWordRev(const QString& textToSearch, const DTDStruct *dtd = 0L);
|
||
|
/** Returns the changed status since the last query. Resets changed.*/
|
||
|
bool hasChanged();
|
||
|
/** Sets the changed status.*/
|
||
|
void setChanged(bool newStatus);
|
||
|
/** Paste the contents of clipboard into the document */
|
||
|
void paste();
|
||
|
|
||
|
/** disable/enable the parser*/
|
||
|
void activateParser(bool activation) {reparseEnabled = activation;}
|
||
|
bool parserActivated() {return reparseEnabled;}
|
||
|
|
||
|
/** returns all the areas that are between tag and it's closing pair */
|
||
|
QStringList tagAreas(const QString &tag, bool includeCoordinates, bool skipFoundContent);
|
||
|
|
||
|
/** disable/enable the repaint of the Kate view */
|
||
|
void activateRepaintView(bool activation);
|
||
|
bool RepaintViewActivated() {return repaintEnabled;}
|
||
|
|
||
|
void setErrorMark(int line);
|
||
|
void clearErrorMarks();
|
||
|
void convertCase();
|
||
|
|
||
|
/** returns the word under the cursor */
|
||
|
QString currentWord();
|
||
|
/** Opens the url. The url must be valid and the file pointed to it must exists. */
|
||
|
void open(const KURL &url, const QString &encoding);
|
||
|
/**
|
||
|
* Opens a file in the editor part.
|
||
|
* @param url
|
||
|
*/
|
||
|
bool openURL(const KURL& url);
|
||
|
/** Reads the DTD info from the file, tries to find the correct DTD and builds the tag/attribute list from the DTD file. */
|
||
|
void processDTD(const QString& documentType = QString::null);
|
||
|
|
||
|
/** Resets the list of DTEPs found in the document */
|
||
|
void resetDTEPs();
|
||
|
/** Adds a DTEP to the list of DTEPs present in the document */
|
||
|
void addDTEP(const QString &dtepName);
|
||
|
/** Returns the list of DTEPs that should appear in the structure tree. By default
|
||
|
this is the list of DTEPs present in the document, but the user can turn on/
|
||
|
off them with the help of RMB->Show Groups For in the structure tree */
|
||
|
QStringList groupsForDTEPs();
|
||
|
|
||
|
bool busy;
|
||
|
|
||
|
KTextEditor::ViewCursorInterface *viewCursorIf;
|
||
|
KTextEditor::SelectionInterface *selectionIf;
|
||
|
KTextEditor::SelectionInterfaceExt *selectionIfExt;
|
||
|
KTextEditor::EditInterface *editIf;
|
||
|
KTextEditor::EncodingInterface *encodingIf;
|
||
|
KTextEditor::EditInterfaceExt *editIfExt;
|
||
|
KTextEditor::CodeCompletionInterface *codeCompletionIf;
|
||
|
KTextEditor::ConfigInterface* configIf;
|
||
|
KTextEditor::MarkInterface* markIf;
|
||
|
|
||
|
/** Hold the list of user tags (real or not, like functions) that are in the document*/
|
||
|
QTagList userTagList;
|
||
|
/** The undo/redo stack */
|
||
|
undoRedo *docUndoRedo;
|
||
|
|
||
|
bool isBackedUp();
|
||
|
/** Creates an automatic backup copy for the crash recovering mechanism */
|
||
|
void createBackup(KConfig* config);
|
||
|
/** No descriptions */
|
||
|
QString backupPathEntryValue();
|
||
|
/** No descriptions */
|
||
|
void setBackupPathEntryValue(const QString& ev);
|
||
|
/** Removes automatic backup copies */
|
||
|
void removeBackup(KConfig *config);
|
||
|
/** create a string using document path string */
|
||
|
static QString hashFilePath(const QString& p);
|
||
|
QString annotationText(uint line);
|
||
|
void setAnnotationText(uint line, const QString& text);
|
||
|
QMap<uint, QPair<QString, QString> > annotations() {return m_annotations;}
|
||
|
void addAnnotation(uint line, const QPair<QString, QString>& annotation);
|
||
|
void clearAnnotations();
|
||
|
|
||
|
public slots:
|
||
|
|
||
|
/** Called after a completion is inserted */
|
||
|
void slotCompletionDone( KTextEditor::CompletionEntry completion );
|
||
|
/** Called when a user selects a completion, we then can modify it */
|
||
|
void slotFilterCompletion(KTextEditor::CompletionEntry*,QString *);
|
||
|
/** Called whenever a user inputs text */
|
||
|
void slotCharactersInserted(int ,int ,const QString&);
|
||
|
/** Called when the code completion is aborted.*/
|
||
|
void slotCompletionAborted();
|
||
|
/** Called whenever the text in the document is changed. */
|
||
|
void slotTextChanged();
|
||
|
/** Handle the text changed events. Usually called from slotTextChanged,
|
||
|
but it's possible to force the handling by calling manually and setting
|
||
|
forced to true. */
|
||
|
void slotDelayedTextChanged(bool forced = false);
|
||
|
void slotDelayedScriptAutoCompletion();
|
||
|
void slotDelayedShowCodeCompletion();
|
||
|
|
||
|
signals:
|
||
|
/** Emitted when the internal text editor got the focus */
|
||
|
void editorGotFocus();
|
||
|
void openingFailed(const KURL &url);
|
||
|
void openingCompleted(const KURL &url);
|
||
|
|
||
|
void breakpointMarked(Document*, int);
|
||
|
void breakpointUnmarked(Document*, int);
|
||
|
void showAnnotation(uint, const QString&, const QPair<QString, QString>&);
|
||
|
|
||
|
private slots:
|
||
|
void slotReplaceChar();
|
||
|
void slotOpeningCompleted();
|
||
|
void slotOpeningFailed(const QString &errorMessage);
|
||
|
/** Called when a file on the disk has changed. */
|
||
|
void slotFileDirty(const QString& fileName);
|
||
|
|
||
|
void slotMarkChanged(KTextEditor::Mark mark, KTextEditor::MarkInterfaceExtension::MarkChangeAction action);
|
||
|
private:
|
||
|
/**
|
||
|
* Finds the beginning of a tag in the document, starting from a position.
|
||
|
* @param position start to look from this position backwards
|
||
|
* @return the position of the starting character or an empty QPoint if not found
|
||
|
*/
|
||
|
QPoint findTagBeginning(const QPoint& position);
|
||
|
QPoint findTagEnd(const QPoint& position);
|
||
|
|
||
|
|
||
|
|
||
|
QMap<uint, QPair<QString, QString> > m_annotations;
|
||
|
QString untitledUrl;
|
||
|
int m_replaceLine;
|
||
|
int m_replaceCol;
|
||
|
QString m_replaceStr;
|
||
|
|
||
|
KTextEditor::Document *m_doc;
|
||
|
KTextEditor::View *m_view;
|
||
|
|
||
|
KTempFile *tempFile;
|
||
|
QString m_tempFileName;
|
||
|
QDateTime m_modifTime;
|
||
|
/* path of the backup copy file of the document */
|
||
|
QString m_backupPathValue;
|
||
|
QString dtdName;
|
||
|
QString m_encoding;
|
||
|
QTextCodec *m_codec;
|
||
|
/*The DTD valid in the place where the completion was invoked.*/
|
||
|
const DTDStruct *completionDTD;
|
||
|
|
||
|
bool changed;
|
||
|
bool completionInProgress;
|
||
|
bool completionRequested; ///< true if the code completion was explicitely requested by the user
|
||
|
bool argHintVisible;
|
||
|
bool hintRequested;
|
||
|
bool reparseEnabled;
|
||
|
bool repaintEnabled;
|
||
|
bool delayedTextChangedEnabled;
|
||
|
/** True if the document is dirty (has been modified outside). */
|
||
|
bool m_dirty;
|
||
|
QString m_md5sum;
|
||
|
Project *m_project;
|
||
|
/** Parse the document according to this DTD. */
|
||
|
QStringList m_groupsForDTEPs; ///< The list of the DTEPs for which the groups should appear in the structure tree
|
||
|
QStringList m_DTEPList; ///< The list of all DTEPs found in the document
|
||
|
//stores the data after an autocompletion. Used when bringing up the
|
||
|
//autocompletion box delayed with the singleshot timer (workaround for
|
||
|
//a bug: the box is not showing up if it is called from slotCompletionDone)
|
||
|
int m_lastLine, m_lastCol;
|
||
|
QValueList<KTextEditor::CompletionEntry>* m_lastCompletionList;
|
||
|
|
||
|
/** Get list of possibile variable name completions */
|
||
|
QValueList<KTextEditor::CompletionEntry>* getGroupCompletions(Node *node, const StructTreeGroup& groupName, int line, int col);
|
||
|
/** Get list of possibile tag name completions */
|
||
|
QValueList<KTextEditor::CompletionEntry>* getTagCompletions(int line, int col);
|
||
|
/** Get list of possibile tag attribute completions */
|
||
|
QValueList<KTextEditor::CompletionEntry>* getAttributeCompletions(const QString& tagName,const QString& startsWith=QString::null);
|
||
|
/** Get list of possibile tag attribute value completions */
|
||
|
QValueList<KTextEditor::CompletionEntry>* getAttributeValueCompletions(const QString& tagName, const QString& attribute, const QString& startsWith=QString::null);
|
||
|
/** Get list of possibile completions in normal text input (nt creating a tag) */
|
||
|
QValueList<KTextEditor::CompletionEntry>* getCharacterCompletions(const QString& starstWith=QString::null);
|
||
|
/** Invoke code completion dialog for XML like tags according to the position (line, col), using DTD dtd. */
|
||
|
bool xmlCodeCompletion(int line, int col);
|
||
|
/** Returns list of values for attribute. If deleteResult is true after the call,
|
||
|
the caller must delete the returned list. */
|
||
|
QStringList* tagAttributeValues(const QString& dtdName, const QString& tag, const QString& attribute, bool &deleteResult);
|
||
|
/** Brings up list of code completions */
|
||
|
void showCodeCompletions( QValueList<KTextEditor::CompletionEntry> *completions );
|
||
|
/** Called whenever a user inputs text in an XML type document. */
|
||
|
bool xmlAutoCompletion(int , int , const QString & );
|
||
|
/** Called whenever a user inputs text in a script type document. */
|
||
|
bool scriptAutoCompletion(int line, int col, const QString &insertedString);
|
||
|
/** Returns true if the number of " (excluding \") inside text is even. */
|
||
|
bool evenQuotes(const QString &text);
|
||
|
void handleCodeCompletion();
|
||
|
bool isDerivatedFrom(const QString& className, const QString &baseClass);
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|