QCodeEdit 2.2
lib/document/qdocument_p.h
Go to the documentation of this file.
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