00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _QDOCUMENT_H_
00017 #define _QDOCUMENT_H_
00018
00019 #include "qce-config.h"
00020
00028 #include <QList>
00029 #include <QVector>
00030 #include <QLinkedList>
00031
00032 #include <QObject>
00033 #include <QPalette>
00034 #include <QMetaType>
00035
00036 class QFont;
00037 class QRect;
00038 class QPrinter;
00039 class QFormatScheme;
00040 class QLanguageDefinition;
00041
00042 struct QCE_EXPORT QDocumentSelection
00043 {
00044 int start, end;
00045 int startLine, endLine;
00046 };
00047
00048 class QDocumentLine;
00049 class QDocumentCursor;
00050 class QDocumentPrivate;
00051 class QDocumentCommand;
00052 class QDocumentLineHandle;
00053 class QDocumentCursorHandle;
00054
00055 typedef QVector<QDocumentLineHandle*>::iterator QDocumentIterator;
00056 typedef QVector<QDocumentLineHandle*>::const_iterator QDocumentConstIterator;
00057
00058 Q_DECLARE_METATYPE(QDocumentIterator)
00059 Q_DECLARE_METATYPE(QDocumentConstIterator)
00060
00061 class QCE_EXPORT QDocument : public QObject
00062 {
00063 friend class QMatcher;
00064 friend class QDocumentPrivate;
00065 friend class QDocumentCommand;
00066
00067 Q_OBJECT
00068
00069 public:
00070 struct PaintContext
00071 {
00072 int width;
00073 int height;
00074 int xoffset;
00075 int yoffset;
00076 QPalette palette;
00077 bool blinkingCursor;
00078 bool fillCursorRect;
00079 QList<QDocumentCursorHandle*> extra;
00080 QList<QDocumentCursorHandle*> cursors;
00081 QList<QDocumentSelection> selections;
00082 };
00083
00084 enum LineEnding
00085 {
00086 Conservative,
00087 Local,
00088 Unix,
00089 Windows,
00090 Mac
00091 };
00092
00093 enum TextProcessing
00094 {
00095 RemoveTrailingWS = 1,
00096 PreserveIndent = 2,
00097 RestoreTrailingIndent = 4
00098 };
00099
00100 enum WhiteSpaceFlag
00101 {
00102 ShowNone = 0x00,
00103 ShowTrailing = 0x01,
00104 ShowLeading = 0x02,
00105 ShowTabs = 0x04
00106 };
00107
00108 Q_DECLARE_FLAGS(WhiteSpaceMode, WhiteSpaceFlag)
00109
00110 explicit QDocument(QObject *p = 0);
00111 virtual ~QDocument();
00112
00113 QString text(int mode) const;
00114 QString text(bool removeTrailing = false, bool preserveIndent = true) const;
00115 void setText(const QString& s);
00116
00117 void startChunkLoading();
00118 void stopChunkLoading();
00119 void addChunk(const QString& txt);
00120
00121 LineEnding lineEnding() const;
00122 LineEnding originalLineEnding() const;
00123 void setLineEnding(LineEnding le);
00124
00125 bool canUndo() const;
00126 bool canRedo() const;
00127
00128 int width() const;
00129 int height() const;
00130 int widthConstraint() const;
00131
00132 int lines() const;
00133 int visualLines() const;
00134
00135 int visualLineNumber(int textLineNumber) const;
00136 int textLineNumber(int visualLineNumber) const;
00137
00138 int y(int line) const;
00139 int lineNumber(int ypos, int *wrap = 0) const;
00140 int y(const QDocumentLine& l) const;
00141
00142 QRect lineRect(int line) const;
00143 QRect lineRect(const QDocumentLine& l) const;
00144
00145 QDocumentCursor* editCursor() const;
00146 void setEditCursor(QDocumentCursor *c);
00147
00148 QLanguageDefinition* languageDefinition() const;
00149 void setLanguageDefinition(QLanguageDefinition *l);
00150
00151 int maxMarksPerLine() const;
00152 int findNextMark(int id, int from = 0, int until = -1) const;
00153 int findPreviousMark(int id, int from = -1, int until = 0) const;
00154
00155 QDocumentLine lineAt(const QPoint& p) const;
00156 void cursorForDocumentPosition(const QPoint& p, int& line, int& column) const;
00157 QDocumentCursor cursorAt(const QPoint& p) const;
00158
00159 QDocumentLine line(int line) const;
00160 QDocumentLine line(QDocumentConstIterator iterator) const;
00161
00162 QDocumentCursor cursor(int line, int column = 0) const;
00163
00164 QDocumentLine findLine(int& position) const;
00165
00166 bool isLineModified(const QDocumentLine& l) const;
00167 bool hasLineEverBeenModified(const QDocumentLine& l) const;
00168
00169 virtual void draw(QPainter *p, PaintContext& cxt);
00170
00171 void execute(QDocumentCommand *cmd);
00172
00173 inline QDocumentPrivate* impl() { return m_impl; }
00174
00175 QDocumentConstIterator begin() const;
00176 QDocumentConstIterator end() const;
00177
00178 QDocumentConstIterator iterator(int ln) const;
00179 QDocumentConstIterator iterator(const QDocumentLine& l) const;
00180
00181 void beginMacro();
00182 void endMacro();
00183
00184 QFormatScheme* formatScheme() const;
00185 void setFormatScheme(QFormatScheme *f);
00186
00187 int getNextGroupId();
00188 void releaseGroupId(int groupId);
00189 void clearMatches(int groupId);
00190 void flushMatches(int groupId);
00191 void addMatch(int groupId, int line, int pos, int len, int format);
00192
00193 static QFont font();
00194 static void setFont(const QFont& f);
00195 static const QFontMetrics& fontMetrics();
00196
00197 static LineEnding defaultLineEnding();
00198 static void setDefaultLineEnding(LineEnding le);
00199
00200 static int tabStop();
00201 static void setTabStop(int n);
00202
00203 static WhiteSpaceMode showSpaces();
00204 static void setShowSpaces(WhiteSpaceMode y);
00205
00206 static QFormatScheme* defaultFormatScheme();
00207 static void setDefaultFormatScheme(QFormatScheme *f);
00208
00209 static QFormatScheme* formatFactory();
00210 static void setFormatFactory(QFormatScheme *f);
00211
00212 static int screenLength(const QChar *d, int l, int tabStop);
00213 static QString screenable(const QChar *d, int l, int tabStop);
00214
00215 inline void markViewDirty() { formatsChanged(); }
00216
00217 bool isClean() const;
00218
00219 public slots:
00220 void clear();
00221
00222 void undo();
00223 void redo();
00224
00225 void setClean();
00226
00227 void highlight();
00228
00229 void print(QPrinter *p);
00230
00231 void clearWidthConstraint();
00232 void setWidthConstraint(int width);
00233
00234 signals:
00235 void cleanChanged(bool m);
00236
00237 void undoAvailable(bool y);
00238 void redoAvailable(bool y);
00239
00240 void formatsChanged();
00241 void contentsChanged();
00242
00243 void formatsChange (int line, int lines);
00244 void contentsChange(int line, int lines);
00245
00246 void widthChanged(int width);
00247 void heightChanged(int height);
00248 void sizeChanged(const QSize& s);
00249
00250 void lineDeleted(QDocumentLineHandle *h);
00251 void markChanged(QDocumentLineHandle *l, int m, bool on);
00252
00253 void lineEndingChanged(int lineEnding);
00254
00255 private:
00256 QString m_leftOver;
00257 QDocumentPrivate *m_impl;
00258 };
00259
00260 Q_DECLARE_OPERATORS_FOR_FLAGS(QDocument::WhiteSpaceMode)
00261
00262 #endif
00263