00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef DOCCONTROLLER_H
00042 #define DOCCONTROLLER_H
00043
00044
00045 #include <QObject>
00046 #include "abstractcontroller.h"
00047
00048 #include <QCoreApplication>
00049 #include <QList>
00050 #include <QPointer>
00051 #include <QStack>
00052 #include <QString>
00053
00054 #include "doc.h"
00055 #include "doccontrollerevents.h"
00056
00057
00058 class DocViewBase;
00059
00060
00074 class DocController : public QObject,
00075 public AbstractController {
00076
00077 Q_OBJECT
00078
00079 public:
00080 DocController( QObject* parent = 0 );
00081 DocController( AbstractModel* doc, QObject* parent = 0 );
00082
00083 Doc* doc() const;
00084
00085
00086 public slots:
00087 void undo()
00088 {
00089 if ( m_undoStack.isEmpty() ) return;
00090
00091 UndoRedoItem* item = m_undoStack.pop();
00092 Q_ASSERT( item != 0 );
00093
00094
00095 Q_ASSERT( item->event() != 0 );
00096 QCoreApplication::sendEvent( this, item->event() );
00097 delete item->event();
00098 delete item;
00099 }
00100 void redo()
00101 {
00102 if ( m_redoStack.isEmpty() ) return;
00103
00104 UndoRedoItem* item = m_redoStack.pop();
00105 Q_ASSERT( item != 0 );
00106
00107
00108 Q_ASSERT( item->event() != 0 );
00109 QCoreApplication::sendEvent( this, item->event() );
00110 delete item->event();
00111 delete item;
00112 }
00113
00114
00115 protected:
00116 inline virtual void customEvent( QEvent* e ) {
00117 CEvent* ce = dynamic_cast<CEvent*>(e);
00118 if ( ce != 0 ) dispatchEvent(ce);
00119 }
00120 virtual void dispatchEvent( CEvent* );
00121
00122 virtual void changeModelEvent( CChangeModelEvent* );
00123
00124 virtual void renameEvent( CRenameEvent* );
00125 virtual void fileSaveToEvent( CFileEvent* );
00126 virtual void fileInitFromEvent( CFileEvent* );
00127
00128 virtual bool saveDocToFile( const QString& filename ) const;
00129 virtual bool initDocFromFile( const QString& filename, bool resetViews = true );
00130
00131
00132
00133 QStack<UndoRedoItem*> undoStack() const
00134 {
00135
00136 return m_undoStack;
00137 }
00138 QStack<UndoRedoItem*> redoStack() const
00139 {
00140
00141 return m_redoStack;
00142 }
00143 bool undoAvaliable() const
00144 {
00145 return !m_undoStack.isEmpty();
00146 }
00147 bool redoAvaliable() const
00148 {
00149 return !m_redoStack.isEmpty();
00150 }
00151
00152
00153
00154
00155
00156 virtual void pushUndoRedoItem( UndoRedoItem* item )
00157 {
00158
00159 Q_ASSERT( item->event() != 0 );
00160 CEvent::Flags flags = item->event()->flags();
00161 if ( flags & CEvent::IsUndoEvent )
00162 m_undoStack.push( item );
00163 else if ( flags & CEvent::IsRedoEvent )
00164 m_redoStack.push( item );
00165 }
00166
00167
00168 private:
00169
00170 QStack<UndoRedoItem*> m_undoStack;
00171 QStack<UndoRedoItem*> m_redoStack;
00172
00173
00174 QPointer<Doc> c_doc;
00175 };
00176
00177
00178 #endif // ! DOCCONTROLLER_H