QCodeEdit 2.2
|
00001 /**************************************************************************** 00002 ** 00003 ** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> 00004 ** 00005 ** This file is part of the Edyuk project <http://edyuk.org> 00006 ** 00007 ** This file may be used under the terms of the GNU General Public License 00008 ** version 3 as published by the Free Software Foundation and appearing in the 00009 ** file GPL.txt included in the packaging of this file. 00010 ** 00011 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00012 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00013 ** 00014 ****************************************************************************/ 00015 00016 #ifndef _QDOCUMENT_P_H_ 00017 #define _QDOCUMENT_P_H_ 00018 00019 #include "qce-config.h" 00020 00026 #include "qdocument.h" 00027 #include "qdocumentline.h" 00028 #include "qdocumentcursor.h" 00029 00030 #include <QHash> 00031 #include <QFont> 00032 #include <QStack> 00033 #include <QQueue> 00034 #include <QDateTime> 00035 #include <QUndoStack> 00036 #include <QStringList> 00037 #include <QFontMetrics> 00038 #include <QUndoCommand> 00039 00040 class QDocument; 00041 class QDocumentBuffer; 00042 class QDocumentPrivate; 00043 class QDocumentCommand; 00044 class QDocumentCommandBlock; 00045 00046 class QLanguageDefinition; 00047 00048 Q_DECLARE_TYPEINFO(QDocumentSelection, Q_PRIMITIVE_TYPE); 00049 00050 #include "qdocumentline_p.h" 00051 00052 #include "qdocumentcursor_p.h" 00053 00054 class QCE_EXPORT QDocumentPrivate 00055 { 00056 friend class QEditConfig; 00057 00058 friend class QDocument; 00059 friend class QDocumentCommand; 00060 friend class QDocumentLineHandle; 00061 friend class QDocumentCursorHandle; 00062 00063 public: 00064 QDocumentPrivate(QDocument *d); 00065 ~QDocumentPrivate(); 00066 00067 void execute(QDocumentCommand *cmd); 00068 00069 void draw(QPainter *p, QDocument::PaintContext& cxt); 00070 00071 QDocumentLineHandle* lineForPosition(int& position) const; 00072 int position(const QDocumentLineHandle *l) const; 00073 00074 QDocumentLineHandle* at(int line) const; 00075 int indexOf(const QDocumentLineHandle *l) const; 00076 00077 QDocumentIterator index(const QDocumentLineHandle *l); 00078 QDocumentConstIterator index(const QDocumentLineHandle *l) const; 00079 00080 QDocumentLineHandle* next(const QDocumentLineHandle *l) const; 00081 QDocumentLineHandle* previous(const QDocumentLineHandle *l) const; 00082 00083 void adjustWidth(int l); 00084 //int checkWidth(QDocumentLineHandle *l, int w); 00085 //int checkWidth(QDocumentLineHandle *l, const QString& s); 00086 00087 void setWidth(); 00088 void setHeight(); 00089 00090 static void setFont(const QFont& f); 00091 00092 void beginChangeBlock(); 00093 void endChangeBlock(); 00094 00095 inline int maxMarksPerLine() const 00096 { return m_maxMarksPerLine; } 00097 00098 inline bool hasMarks() const 00099 { return m_marks.count(); } 00100 00101 QList<int> marks(QDocumentLineHandle *h) const; 00102 00103 void addMark(QDocumentLineHandle *h, int mid); 00104 void toggleMark(QDocumentLineHandle *h, int mid); 00105 void removeMark(QDocumentLineHandle *h, int mid); 00106 00107 int findNextMark(int id, int from = 0, int until = -1); 00108 int findPreviousMark(int id, int from = -1, int until = 0); 00109 00110 int getNextGroupId(); 00111 void releaseGroupId(int groupId); 00112 void clearMatches(int gid); 00113 void flushMatches(int gid); 00114 void addMatch(int gid, int line, int pos, int len, int format); 00115 00116 void emitFormatsChange (int line, int lines); 00117 void emitContentsChange(int line, int lines); 00118 00119 int visualLine(int textLine) const; 00120 int textLine(int visualLine, int *wrap = 0) const; 00121 void hideEvent(int line, int count); 00122 void showEvent(int line, int count); 00123 00124 void setWidth(int width); 00125 00126 void emitFormatsChanged(); 00127 void emitContentsChanged(); 00128 00129 void emitLineDeleted(QDocumentLineHandle *h); 00130 void emitMarkChanged(QDocumentLineHandle *l, int m, bool on); 00131 00132 inline QDocumentIterator begin() { return m_lines.begin(); } 00133 inline QDocumentIterator end() { return m_lines.end(); } 00134 00135 inline QDocumentConstIterator constBegin() const { return m_lines.constBegin(); } 00136 inline QDocumentConstIterator constEnd() const { return m_lines.constEnd(); } 00137 00138 protected: 00139 void updateHidden(int line, int count); 00140 void updateWrapped(int line, int count); 00141 00142 void insertLines(int after, const QList<QDocumentLineHandle*>& l); 00143 void removeLines(int after, int n); 00144 00145 void emitWidthChanged(); 00146 void emitHeightChanged(); 00147 00148 void updateFormatCache(); 00149 void setFormatScheme(QFormatScheme *f); 00150 void tunePainter(QPainter *p, int fid); 00151 00152 private: 00153 QDocument *m_doc; 00154 QUndoStack m_commands; 00155 QDocumentCursor *m_editCursor; 00156 00157 bool m_suspend, m_deleting; 00158 QQueue<QPair<int, int> > m_notifications; 00159 00160 QMap<int, int> m_hidden; 00161 QMap<int, int> m_wrapped; 00162 QVector< QPair<QDocumentLineHandle*, int> > m_largest; 00163 00164 struct Match 00165 { 00166 int line; 00167 QFormatRange range; 00168 QDocumentLineHandle *h; 00169 }; 00170 00171 struct MatchList : QList<Match> 00172 { 00173 MatchList() : index(0) {} 00174 00175 int index; 00176 }; 00177 00178 int m_lastGroupId; 00179 QList<int> m_freeGroupIds; 00180 QHash<int, MatchList> m_matches; 00181 00182 bool m_constrained; 00183 int m_width, m_height; 00184 00185 int m_tabStop; 00186 static int m_defaultTabStop; 00187 00188 static QFont *m_font; 00189 static bool m_fixedPitch; 00190 static QFontMetrics *m_fontMetrics; 00191 static int m_leftMargin; 00192 static QDocument::WhiteSpaceMode m_showSpaces; 00193 static QDocument::LineEnding m_defaultLineEnding; 00194 static int m_lineHeight; 00195 static int m_lineSpacing; 00196 static int m_spaceWidth; 00197 static int m_ascent; 00198 static int m_descent; 00199 static int m_leading; 00200 static int m_wrapMargin; 00201 00202 QFormatScheme *m_formatScheme; 00203 QLanguageDefinition *m_language; 00204 static QFormatScheme *m_defaultFormatScheme; 00205 00206 QVector<QFont> m_fonts; 00207 00208 static QList<QDocumentPrivate*> m_documents; 00209 00210 int m_maxMarksPerLine; 00211 QHash<QDocumentLineHandle*, QList<int> > m_marks; 00212 QHash<QDocumentLineHandle*, QPair<int, int> > m_status; 00213 00214 int _nix, _dos, _mac; 00215 QString m_lineEndingString; 00216 QDocument::LineEnding m_lineEnding; 00217 00218 QDateTime m_lastModified; 00219 00220 QDocumentBuffer *m_buffer; 00221 QVector<QDocumentLineHandle*> m_lines; 00222 }; 00223 00224 #endif