USGS

Isis 3.0 Object Programmers' Reference

Home

Isis::WorkOrder Class Referenceabstract

Parent class for anything that performs an action in Project. More...

#include <WorkOrder.h>

Inheritance diagram for Isis::WorkOrder:
Inheritance graph
Collaboration diagram for Isis::WorkOrder:
Collaboration graph

Classes

class  XmlHandler
 

Public Types

enum  WorkOrderStatus {
  WorkOrderUnknownStatus = 0, WorkOrderNotStarted, WorkOrderRedoing, WorkOrderRedone,
  WorkOrderUndoing, WorkOrderUndone, WorkOrderFinished, WorkOrderLastStatus = WorkOrderFinished
}
 
enum  Context { NoContext, ProjectContext }
 

Public Slots

virtual bool execute ()
 The (child) implementation of this method should prompt the user/gather state by any means necessary.
 
virtual void redo ()
 Starts (or enqueues) a redo.
 
virtual void undo ()
 Starts (or enqueues) an undo.
 

Signals

void creatingProgress (WorkOrder *)
 
void deletingProgress (WorkOrder *)
 
void finished (WorkOrder *)
 
void statusChanged (WorkOrder *)
 

Public Member Functions

 WorkOrder (Project *project)
 Create a work order that will work with the given project.
 
virtual WorkOrderclone () const =0
 
virtual bool isExecutable (Context)
 Re-implement this method if your work order utilizes controls for data in order to operate.
 
virtual bool isExecutable (QList< Control * > controls)
 Re-implement this method if your work order utilizes controls for data in order to operate.
 
virtual bool isExecutable (ImageList *images)
 Re-implement this method if your work order utilizes images for data in order to operate.
 
void read (XmlStackedHandlerReader *xmlReader)
 Read this work order's data from disk.
 
void save (QXmlStreamWriter &stream) const
 Output XML format:
 
virtual void setData (Context)
 
virtual void setData (ImageList *images)
 
virtual void setData (QList< Control * > controls)
 
void setNext (WorkOrder *nextWorkOrder)
 
void setPrevious (WorkOrder *previousWorkOrder)
 
QString bestText () const
 
bool createsCleanState () const
 
QDateTime executionTime () const
 
bool isFinished () const
 
bool isRedoing () const
 
bool isRedone () const
 
bool isUndoing () const
 
bool isUndone () const
 
bool modifiesDiskState () const
 
WorkOrdernext () const
 
WorkOrderprevious () const
 
QString statusText () const
 
ProgressBarprogressBar ()
 

Static Public Member Functions

static WorkOrderStatus fromStatusString (QString)
 
static QString toString (WorkOrderStatus)
 

Protected Slots

void addCloneToProject ()
 

Protected Member Functions

 WorkOrder (const WorkOrder &other)
 Copy the work order 'other' into this (new) instance.
 
ImageListimageList ()
 
const ImageListimageList () const
 
QList< Control * > controlList ()
 
virtual bool dependsOn (WorkOrder *other) const
 
Directorydirectory () const
 
Projectproject () const
 
void setCreatesCleanState (bool createsCleanState)
 Declare that this work order is saving the project.
 
void setModifiesDiskState (bool changesProjectOnDisk)
 
void setInternalData (QStringList data)
 
int progressMin () const
 
int progressMax () const
 
int progressValue () const
 
void setProgressRange (int, int)
 
void setProgressValue (int)
 
QStringList internalData () const
 
virtual void syncRedo ()
 This method is designed to be implemented by children work orders.
 
virtual void asyncRedo ()
 This method is designed to be implemented by children work orders.
 
virtual void postSyncRedo ()
 This method is designed to be implemented by children work orders.
 
virtual void syncUndo ()
 This method is designed to be implemented by children work orders.
 
virtual void asyncUndo ()
 This method is designed to be implemented by children work orders.
 
virtual void postSyncUndo ()
 This method is designed to be implemented by children work orders.
 

Private Types

enum  QueuedWorkOrderAction { NoQueuedAction, RedoQueuedAction, UndoQueuedAction }
 

Private Slots

void attemptQueuedAction ()
 
void asyncFinished ()
 
void clearImageList ()
 
void deleteProgress ()
 
void updateProgress ()
 
void startRedo ()
 

Private Member Functions

bool isInStableState () const
 
void listenForImageDestruction ()
 
void resetProgressBar ()
 
void setProgressToFinalText ()
 
WorkOrderoperator= (const WorkOrder &rhs)
 

Private Attributes

bool m_createsCleanState
 This is defaulted to false.
 
bool m_modifiesDiskState
 This is defaulted to false.
 
WorkOrderStatus m_status
 
QueuedWorkOrderAction m_queuedAction
 
int m_progressRangeMinValue
 
int m_progressRangeMaxValue
 
int m_progressValue
 
Context m_context
 
QStringList m_imageIds
 
QPointer< ImageListm_images
 
QList< Control * > m_controls
 
QStringList m_internalData
 
QPointer< WorkOrderm_nextWorkOrder
 
QPointer< WorkOrderm_previousWorkOrder
 
QPointer< Projectm_project
 
QMutex * m_transparentConstMutex
 
QDateTime m_executionTime
 This is the date/time that execute() was called.
 
QPointer< QFutureWatcher< void > > m_futureWatcher
 
QPointer< ProgressBarm_progressBar
 
QPointer< QTimer > m_progressBarUpdateTimer
 
QPointer< QTimer > m_progressBarDeletionTimer
 
QTime * m_elapsedTimer
 
double m_secondsElapsed
 

Detailed Description

Parent class for anything that performs an action in Project.

This class should be used for any operation that affects a Project. This provides history, undo/redo capabilities (which need implemented correctly), and the ability for the project to guarantee a good state on disk.

State between the end of execute() and the beginning of the redo methods must be saved via the parent (WorkOrder) class. This is to ensure serializability. State between the redo methods and undo methods should work the same way. Child implementations may only save state (have member variables) that store state between syncRedo(), asyncRedo() and postSyncRedo() OR between syncUndo(), asyncUndo() and postSyncUndo(). Other forms of state will cause the work order to not function properly when saved/restored from disk.

Author
2012-??-?? ???
History:

2012-08-23 Steven Lambright and Stuart Sides - Updated the class to be much more flushed out. We now have WorkOrderStatus, syncRedo(), asyncRedo(), postSyndRedo() (also undo versions), dependsOn(), full dependency analysis, full progress/status strings, no more race conditions in undo/redo, the work order list is now doubly-linked, and added the statusChanged() signal. redo() and undo() should no longer cause any bad or undesired behavior.

2012-09-19 Steven Lambright - Added QList<Control *> data support for in-memory controls. I did not yet do the serialization because we're working on a "ControlList" class that may encapsulate some of the implementation (maybe, we'll see).

2012-10-19 Steven Lambright - Removed parent argument from constructor - deleting work orders when the creator goes away doesn't make sense. Also work orders will work correctly when the associated images are freed from memory and later re-allocated (the import of the images was undone, for example). Added elapsed time value to the status text and fixed warning for work orders without undo text. Added listenForImageDestruction() and clearImageList().

2013-04-25 Jeannie Backer - Modified call to qWarning() to prevent compile warnings on MAC OS 10.8.2

Definition at line 88 of file WorkOrder.h.

Member Enumeration Documentation

Enumerator
WorkOrderFinished 

This is used for work orders that will not undo or redo (See createsCleanState())

Definition at line 91 of file WorkOrder.h.

Constructor & Destructor Documentation

Isis::WorkOrder::WorkOrder ( Project project)

Create a work order that will work with the given project.

Parameters
projectThe Project that this work order should be interacting with
parentThe Qt-relationship parent

Definition at line 47 of file WorkOrder.cpp.

References _FILEINFO_, m_createsCleanState, m_modifiesDiskState, and Isis::IException::Programmer.

Isis::WorkOrder::WorkOrder ( const WorkOrder other)
protected

Copy the work order 'other' into this (new) instance.

Parameters
otherThe work order being copied

Definition at line 100 of file WorkOrder.cpp.

References _FILEINFO_, m_createsCleanState, m_executionTime, m_modifiesDiskState, and Isis::IException::Unknown.

Member Function Documentation

void Isis::WorkOrder::asyncRedo ( )
protectedvirtual

This method is designed to be implemented by children work orders.

The order of execution for redo is: syncRedo() - GUI thread asyncRedo() - Pooled thread* postSyncRedo() - GUI thread

State can be read from the parent WorkOrder class and from state set in syncRedo() while in this method. You can set state to be used in postSyncRedo() safely. Please be wary of creating QObjects inside of this method because they will associated with the pooled thread and must be moved back to the GUI thread with QObject::moveToThread(). This method is never executed in the GUI thread. You can update progress by calling setProgressRange() and setProgressValue(). Please do not manipulate any GUI objects here.

Reimplemented in Isis::ImportImagesWorkOrder, Isis::ImportControlNetWorkOrder, Isis::ExportImagesWorkOrder, and Isis::ExportControlNetWorkOrder.

Definition at line 745 of file WorkOrder.cpp.

Referenced by redo().

void Isis::WorkOrder::asyncUndo ( )
protectedvirtual

This method is designed to be implemented by children work orders.

The order of execution for undo is: syncUndo() - GUI thread asyncUndo() - Pooled thread* postSyncUndo() - GUI thread

State can be read from the parent WorkOrder class and from state set in syncUndo() while in this method. You can set state to be used in postSyncUndo() safely. Please be wary of deleting QObjects inside of this method because they will cause unpredictable crashes. This method is never executed in the GUI thread. You can update progress by calling setProgressRange() and setProgressValue(). Please do not manipulate any GUI objects here.

Reimplemented in Isis::ImportImagesWorkOrder.

Definition at line 792 of file WorkOrder.cpp.

Referenced by undo().

bool Isis::WorkOrder::execute ( )
virtualslot

The (child) implementation of this method should prompt the user/gather state by any means necessary.

This method is designed to be implemented by children work orders, but they need to call this version inside of their execute (at the beginning).

Prompts for file names, questions, warnings, etc.. should be done here.

Once the work order has enough data to execute, this method needs to set the state in the parent (this) WorkOrder class. Call setData(ImageList), setInternalData(QStringList), etc... with all of the data/state necessary to perform the work order. This could be a list of file names, an ImageList of images you're viewing, or really anything else.

Finally, the actual work needs done in *Redo(), using only state (data) stored by the parent (this) WorkOrder class. You do not have to call *Redo() - this is done for you by WorkOrder::redo(). WorkOrder::redo() is called from Project::addToProject() when the workOrder is pushed onto the undo stack.

We do it this way to ensure saving/restoring from history can be done automatically/simply and implemented only once per data type. This also gives us full undo/redo functionality.

Returns
False if this operation should be cancelled (the user clicked cancel, the operation turns out to be impossible, etc). This prevents the work order from making it into the history and redo will never be called.

The order of execution for work orders is: execute() - GUI thread, can ask user for input* syncRedo() - GUI thread, should not prompt the user for input asyncRedo() - Pooled thread postSyncRedo() - GUI thread

syncUndo() - GUI thread, always called after redo finishes asyncUndo() - Pooled thread postSyncUndo() - GUI thread

syncRedo() - GUI thread asyncRedo() - Pooled thread postSyncRedo() - GUI thread

and so on...

State should only be set in the parent WorkOrder class in this method. You can set arbitrary state using setInternalData(). This method is always executed in the GUI thread and is the only place to ask the user questions.

Reimplemented in Isis::ImageListActionWorkOrder, Isis::ImportImagesWorkOrder, Isis::ImportControlNetWorkOrder, Isis::SaveProjectAsWorkOrder, Isis::SaveProjectWorkOrder, Isis::ImageFileListViewWorkOrder, Isis::RenameProjectWorkOrder, Isis::OpenProjectWorkOrder, Isis::CubeViewportViewWorkOrder, Isis::Footprint2DViewWorkOrder, Isis::CnetEditorViewWorkOrder, Isis::ExportImagesWorkOrder, and Isis::ExportControlNetWorkOrder.

Definition at line 641 of file WorkOrder.cpp.

References m_executionTime, and WorkOrderFinished.

Referenced by Isis::Project::addToProject(), Isis::ExportControlNetWorkOrder::execute(), Isis::ExportImagesWorkOrder::execute(), Isis::CnetEditorViewWorkOrder::execute(), Isis::CubeViewportViewWorkOrder::execute(), Isis::Footprint2DViewWorkOrder::execute(), Isis::OpenProjectWorkOrder::execute(), Isis::RenameProjectWorkOrder::execute(), Isis::ImageFileListViewWorkOrder::execute(), Isis::SaveProjectAsWorkOrder::execute(), Isis::SaveProjectWorkOrder::execute(), Isis::ImportControlNetWorkOrder::execute(), Isis::ImportImagesWorkOrder::execute(), and Isis::ImageListActionWorkOrder::execute().

bool Isis::WorkOrder::isExecutable ( Context  context)
virtual

Re-implement this method if your work order utilizes controls for data in order to operate.

For example, "CnetEditorViewWorkOrder" works sometimes on controls - the logic in side of CnetEditorViewWorkOrder::isExecutable() determines whethere or not a user is prompted with this work order as a possibility.

Reimplemented in Isis::RenameProjectWorkOrder.

Definition at line 153 of file WorkOrder.cpp.

bool Isis::WorkOrder::isExecutable ( QList< Control * >  controls)
virtual

Re-implement this method if your work order utilizes controls for data in order to operate.

For example, "CnetEditorViewWorkOrder" works sometimes on controls - the logic in side of CnetEditorViewWorkOrder::isExecutable() determines whethere or not a user is prompted with this work order as a possibility.

Reimplemented in Isis::CnetEditorViewWorkOrder, and Isis::ExportControlNetWorkOrder.

Definition at line 165 of file WorkOrder.cpp.

bool Isis::WorkOrder::isExecutable ( ImageList images)
virtual

Re-implement this method if your work order utilizes images for data in order to operate.

For example, "Footprint2DViewWorkOrder" works sometimes on images - the logic in side of Footprint2DViewWorkOrder::isExecutable(ImageList) determines whethere or not a user is prompted with this work order as a possibility.

Parameters
imagesAn image list that this work order should execute on

Reimplemented in Isis::ImageListActionWorkOrder, Isis::ImageFileListViewWorkOrder, Isis::CubeViewportViewWorkOrder, Isis::Footprint2DViewWorkOrder, and Isis::ExportImagesWorkOrder.

Definition at line 178 of file WorkOrder.cpp.

void Isis::WorkOrder::postSyncRedo ( )
protectedvirtual

This method is designed to be implemented by children work orders.

The order of execution for redo is: syncRedo() - GUI thread asyncRedo() - Pooled thread postSyncRedo() - GUI thread*

State can be read from the parent WorkOrder class and from state set in either syncRedo() or asyncRedo() while in this method. You can not set state to be used in any of the undo code safely. This method is always executed in the GUI thread and has no progress.

Reimplemented in Isis::ImportImagesWorkOrder, Isis::ImportControlNetWorkOrder, Isis::ExportImagesWorkOrder, and Isis::ExportControlNetWorkOrder.

Definition at line 760 of file WorkOrder.cpp.

void Isis::WorkOrder::postSyncUndo ( )
protectedvirtual

This method is designed to be implemented by children work orders.

The order of execution for undo is: syncUndo() - GUI thread asyncUndo() - Pooled thread postSyncUndo() - GUI thread*

State can be read from the parent WorkOrder class and from state set in either syncUndo() or asyncUndo() while in this method. You can not set state to be used in any of the redo code safely. This method is always executed in the GUI thread and has no progress.

Reimplemented in Isis::ImportImagesWorkOrder.

Definition at line 807 of file WorkOrder.cpp.

void Isis::WorkOrder::read ( XmlStackedHandlerReader xmlReader)

Read this work order's data from disk.

Definition at line 186 of file WorkOrder.cpp.

void Isis::WorkOrder::redo ( )
virtualslot

Starts (or enqueues) a redo.

This should not be re-implemented by children.

Definition at line 475 of file WorkOrder.cpp.

References asyncRedo(), and syncRedo().

void Isis::WorkOrder::save ( QXmlStreamWriter &  stream) const

Output XML format:

  <workOrder actiontext="..." undotext="..." type="..." status="...">
    <images>
      <image id="...">
    </images>
    <internalDataValues>
      <dataValue value="...">
    </internalDataValues>
  </workOrder>

Definition at line 206 of file WorkOrder.cpp.

References _FILEINFO_, m_executionTime, and Isis::IException::Unknown.

Referenced by Isis::Project::saveHistory().

void Isis::WorkOrder::setCreatesCleanState ( bool  createsCleanState)
protected

Declare that this work order is saving the project.

This makes the work order not appear in the undo stack (cannot undo/redo), and instead is marked as a 'clean' state of the project. The QUndoCommand undo/redo will never be called. The default for createsCleanState is false.

Parameters
createsCleanStateTrue if this work order is going to save the project to disk

Definition at line 971 of file WorkOrder.cpp.

References m_createsCleanState.

void Isis::WorkOrder::syncRedo ( )
protectedvirtual

This method is designed to be implemented by children work orders.

The order of execution for redo is: syncRedo() - GUI thread* asyncRedo() - Pooled thread postSyncRedo() - GUI thread

State should only be read from the parent WorkOrder class in this method. You can set state to be used in asyncRedo() and postSyncRedo() safely. This method is always executed in the GUI thread and has no progress.

Reimplemented in Isis::ImageListActionWorkOrder, Isis::ImportControlNetWorkOrder, Isis::RenameProjectWorkOrder, Isis::ImageFileListViewWorkOrder, Isis::CubeViewportViewWorkOrder, Isis::Footprint2DViewWorkOrder, Isis::CnetEditorViewWorkOrder, Isis::MoveDownOneSceneWorkOrder, Isis::MoveToBottomSceneWorkOrder, Isis::MoveToTopSceneWorkOrder, and Isis::MoveUpOneSceneWorkOrder.

Definition at line 727 of file WorkOrder.cpp.

Referenced by redo().

void Isis::WorkOrder::syncUndo ( )
protectedvirtual

This method is designed to be implemented by children work orders.

The order of execution for undo is: syncUndo() - GUI thread* asyncUndo() - Pooled thread postSyncUndo() - GUI thread

State should only be read from the parent WorkOrder class in this method. You can set state to be used in asyncUndo() and postSyncUndo() safely. This method is always executed in the GUI thread and has no progress.

Reimplemented in Isis::ImageListActionWorkOrder, Isis::ImportControlNetWorkOrder, Isis::RenameProjectWorkOrder, Isis::ImageFileListViewWorkOrder, Isis::CubeViewportViewWorkOrder, Isis::Footprint2DViewWorkOrder, Isis::CnetEditorViewWorkOrder, Isis::MoveDownOneSceneWorkOrder, Isis::MoveToBottomSceneWorkOrder, Isis::MoveToTopSceneWorkOrder, and Isis::MoveUpOneSceneWorkOrder.

Definition at line 775 of file WorkOrder.cpp.

Referenced by undo().

void Isis::WorkOrder::undo ( )
virtualslot

Starts (or enqueues) an undo.

This should not be re-implemented by children.

Definition at line 559 of file WorkOrder.cpp.

References asyncUndo(), and syncUndo().

Member Data Documentation

bool Isis::WorkOrder::m_createsCleanState
private

This is defaulted to false.

If a work order saves the project to disk, this causes a 'clean' (non-dirty) state. These work orders should call setCreatesCleanState(true) in their constructor.

Definition at line 263 of file WorkOrder.h.

Referenced by setCreatesCleanState(), and WorkOrder().

QDateTime Isis::WorkOrder::m_executionTime
private

This is the date/time that execute() was called.

Definition at line 293 of file WorkOrder.h.

Referenced by execute(), save(), and WorkOrder().

bool Isis::WorkOrder::m_modifiesDiskState
private

This is defaulted to false.

If a work order modifies the project on disk to perform its actions (for example, an import work order), the work order should call setModifiesDiskState(true) in its constructor.

Definition at line 270 of file WorkOrder.h.

Referenced by WorkOrder().


The documentation for this class was generated from the following files: