00001
00002
00003
00004
00005
00006
00007 #include "CmdMediator.h"
00008 #include "DigitizeStateAxis.h"
00009 #include "DigitizeStateColorPicker.h"
00010 #include "DigitizeStateContext.h"
00011 #include "DigitizeStateCurve.h"
00012 #include "DigitizeStateEmpty.h"
00013 #include "DigitizeStatePointMatch.h"
00014 #include "DigitizeStateScale.h"
00015 #include "DigitizeStateSegment.h"
00016 #include "DigitizeStateSelect.h"
00017 #include "DocumentModelSegments.h"
00018 #include "EngaugeAssert.h"
00019 #include "GraphicsScene.h"
00020 #include "GraphicsView.h"
00021 #include "Logger.h"
00022 #include "MainWindow.h"
00023 #include <QCursor>
00024 #include <QGraphicsScene>
00025 #include <QGraphicsView>
00026 #include <QSize>
00027 #include "QtToString.h"
00028 #include "Transformation.h"
00029
00030 DigitizeStateContext::DigitizeStateContext(MainWindow &mainWindow,
00031 QGraphicsView &view,
00032 bool isGnuplot) :
00033 m_mainWindow (mainWindow),
00034 m_view (view),
00035 m_imageIsLoaded (false),
00036 m_isGnuplot (isGnuplot)
00037 {
00038
00039 m_states.insert (DIGITIZE_STATE_AXIS , new DigitizeStateAxis (*this));
00040 m_states.insert (DIGITIZE_STATE_COLOR_PICKER, new DigitizeStateColorPicker (*this));
00041 m_states.insert (DIGITIZE_STATE_CURVE , new DigitizeStateCurve (*this));
00042 m_states.insert (DIGITIZE_STATE_EMPTY , new DigitizeStateEmpty (*this));
00043 m_states.insert (DIGITIZE_STATE_POINT_MATCH , new DigitizeStatePointMatch (*this));
00044 m_states.insert (DIGITIZE_STATE_SEGMENT , new DigitizeStateSegment (*this));
00045 m_states.insert (DIGITIZE_STATE_SELECT , new DigitizeStateSelect (*this));
00046 m_states.insert (DIGITIZE_STATE_SCALE , new DigitizeStateScale (*this));
00047 ENGAUGE_ASSERT (m_states.size () == NUM_DIGITIZE_STATES);
00048
00049 m_currentState = NUM_DIGITIZE_STATES;
00050 requestImmediateStateTransition (mainWindow.cmdMediator(),
00051 DIGITIZE_STATE_EMPTY);
00052 }
00053
00054 DigitizeStateContext::~DigitizeStateContext()
00055 {
00056 }
00057
00058 QString DigitizeStateContext::activeCurve () const
00059 {
00060 return m_states [m_currentState]->activeCurve ();
00061 }
00062
00063 void DigitizeStateContext::appendNewCmd(CmdMediator *cmdMediator,
00064 QUndoCommand *cmd)
00065 {
00066 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::appendNewCmd";
00067
00068 cmdMediator->push (cmd);
00069 }
00070
00071 bool DigitizeStateContext::canPaste (const Transformation &transformation,
00072 const QSize &size) const
00073 {
00074 return m_states [m_currentState]->canPaste (transformation,
00075 size);
00076 }
00077
00078 void DigitizeStateContext::completeRequestedStateTransitionIfExists (CmdMediator *cmdMediator)
00079 {
00080 if (m_currentState != m_requestedState) {
00081
00082
00083
00084 if (m_currentState != NUM_DIGITIZE_STATES) {
00085
00086
00087 m_states [m_currentState]->end ();
00088 }
00089
00090
00091 DigitizeState previousState = m_currentState;
00092 m_currentState = m_requestedState;
00093 m_states [m_requestedState]->begin (cmdMediator,
00094 previousState);
00095
00096
00097
00098 mainWindow().updateDigitizeStateIfSoftwareTriggered (m_requestedState);
00099 }
00100 }
00101
00102 void DigitizeStateContext::handleContextMenuEventAxis (CmdMediator *cmdMediator,
00103 const QString &pointIdentifier)
00104 {
00105 m_states [m_currentState]->handleContextMenuEventAxis (cmdMediator,
00106 pointIdentifier);
00107 }
00108
00109 void DigitizeStateContext::handleContextMenuEventGraph (CmdMediator *cmdMediator,
00110 const QStringList &pointIdentifiers)
00111 {
00112 m_states [m_currentState]->handleContextMenuEventGraph (cmdMediator,
00113 pointIdentifiers);
00114 }
00115
00116 void DigitizeStateContext::handleCurveChange (CmdMediator *cmdMediator)
00117 {
00118 m_states [m_currentState]->handleCurveChange(cmdMediator);
00119 }
00120
00121 void DigitizeStateContext::handleKeyPress (CmdMediator *cmdMediator,
00122 Qt::Key key,
00123 bool atLeastOneSelectedItem)
00124 {
00125 m_states [m_currentState]->handleKeyPress (cmdMediator,
00126 key,
00127 atLeastOneSelectedItem);
00128
00129 completeRequestedStateTransitionIfExists(cmdMediator);
00130
00131 }
00132
00133 void DigitizeStateContext::handleMouseMove (CmdMediator *cmdMediator,
00134 QPointF pos)
00135 {
00136 m_states [m_currentState]->handleMouseMove (cmdMediator,
00137 pos);
00138
00139 completeRequestedStateTransitionIfExists(cmdMediator);
00140
00141 }
00142
00143 void DigitizeStateContext::handleMousePress (CmdMediator *cmdMediator,
00144 QPointF pos)
00145 {
00146 m_states [m_currentState]->handleMousePress (cmdMediator,
00147 pos);
00148
00149 completeRequestedStateTransitionIfExists(cmdMediator);
00150
00151 }
00152
00153 void DigitizeStateContext::handleMouseRelease (CmdMediator *cmdMediator,
00154 QPointF pos)
00155 {
00156 m_states [m_currentState]->handleMouseRelease (cmdMediator,
00157 pos);
00158
00159 completeRequestedStateTransitionIfExists(cmdMediator);
00160 }
00161
00162 bool DigitizeStateContext::isGnuplot () const
00163 {
00164 return m_isGnuplot;
00165 }
00166
00167 MainWindow &DigitizeStateContext::mainWindow ()
00168 {
00169 return m_mainWindow;
00170 }
00171
00172 const MainWindow &DigitizeStateContext::mainWindow () const
00173 {
00174 return m_mainWindow;
00175 }
00176
00177 void DigitizeStateContext::requestDelayedStateTransition (DigitizeState digitizeState)
00178 {
00179 m_requestedState = digitizeState;
00180 }
00181
00182 void DigitizeStateContext::requestImmediateStateTransition (CmdMediator *cmdMediator,
00183 DigitizeState digitizeState)
00184 {
00185 m_requestedState = digitizeState;
00186 completeRequestedStateTransitionIfExists(cmdMediator);
00187 }
00188
00189 void DigitizeStateContext::resetOnLoad (CmdMediator *cmdMediator)
00190 {
00191 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::resetOnLoad";
00192
00193
00194
00195 if (m_currentState != DIGITIZE_STATE_EMPTY) {
00196 m_requestedState = DIGITIZE_STATE_EMPTY;
00197 completeRequestedStateTransitionIfExists(cmdMediator);
00198 }
00199 }
00200
00201 void DigitizeStateContext::setCursor (CmdMediator *cmdMediator)
00202 {
00203 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::setCursor";
00204
00205 ENGAUGE_ASSERT(m_currentState < m_states.count());
00206
00207 m_states [m_currentState]->setCursor (cmdMediator);
00208 }
00209
00210 void DigitizeStateContext::setDragMode (QGraphicsView::DragMode dragMode)
00211 {
00212 LOG4CPP_DEBUG_S ((*mainCat)) << "DigitizeStateContext::setDragMode";
00213
00214 if (m_imageIsLoaded) {
00215 m_view.setDragMode (dragMode);
00216 }
00217 }
00218
00219 void DigitizeStateContext::setImageIsLoaded(CmdMediator *cmdMediator,
00220 bool imageIsLoaded)
00221 {
00222 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::setImageIsLoaded";
00223
00224 m_imageIsLoaded = imageIsLoaded;
00225 setCursor (cmdMediator);
00226 }
00227
00228 QString DigitizeStateContext::state() const
00229 {
00230 ENGAUGE_ASSERT (m_currentState != NUM_DIGITIZE_STATES);
00231
00232 return m_states [m_currentState]->state();
00233 }
00234
00235 void DigitizeStateContext::updateAfterPointAddition ()
00236 {
00237 ENGAUGE_ASSERT (m_currentState != NUM_DIGITIZE_STATES);
00238
00239 m_states [m_currentState]->updateAfterPointAddition ();
00240 }
00241
00242 void DigitizeStateContext::updateModelDigitizeCurve (CmdMediator *cmdMediator,
00243 const DocumentModelDigitizeCurve &modelDigitizeCurve)
00244 {
00245 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::updateModelDigitizeCurve";
00246
00247 ENGAUGE_ASSERT(m_currentState < m_states.count());
00248
00249 m_states [m_currentState]->updateModelDigitizeCurve (cmdMediator,
00250 modelDigitizeCurve);
00251 }
00252
00253 void DigitizeStateContext::updateModelSegments(const DocumentModelSegments &modelSegments)
00254 {
00255 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateContext::updateModelSegments";
00256
00257 ENGAUGE_ASSERT(m_currentState < m_states.count());
00258
00259 m_states [m_currentState]->updateModelSegments (modelSegments);
00260 }
00261
00262 QGraphicsView &DigitizeStateContext::view()
00263 {
00264 return m_view;
00265 }