00001 #include "geom/world.H" 00002 #include "geom/command.H" 00003 00004 /***************************************************************** 00005 * COMMAND: 00006 *****************************************************************/ 00007 bool 00008 COMMAND::doit() 00009 { 00010 _is_done = true; 00011 _is_undone = false; 00012 return true; 00013 } 00014 00015 bool 00016 COMMAND::undoit() 00017 { 00018 _is_done = false; 00019 _is_undone = true; 00020 return true; 00021 } 00022 00023 bool 00024 COMMAND::clear() 00025 { 00026 if (is_done()) 00027 return false; 00028 00029 _is_done = _is_undone = false; 00030 return true; 00031 } 00032 00033 /***************************************************************** 00034 * UNDO_CMD: 00035 *****************************************************************/ 00036 bool 00037 UNDO_CMD::doit() 00038 { 00039 if (_cmd && _cmd->undoit()) 00040 return COMMAND::doit(); // update state in COMMAND 00041 return false; 00042 } 00043 00044 bool 00045 UNDO_CMD::undoit() 00046 { 00047 if (_cmd && _cmd->doit()) 00048 return COMMAND::undoit(); // update state in COMMAND 00049 return false; 00050 } 00051 00052 bool 00053 UNDO_CMD::clear() 00054 { 00055 if (!COMMAND::clear()) // update state in COMMAND 00056 return false; 00057 00058 if (_cmd) 00059 _cmd->clear(); 00060 return true; 00061 } 00062 00063 /***************************************************************** 00064 * DISPLAY_CMD: 00065 *****************************************************************/ 00066 bool 00067 DISPLAY_CMD::doit() 00068 { 00069 for (int i = 0; i < _gels.num(); i++) 00070 WORLD::display (_gels[i], false); 00071 00072 return COMMAND::doit(); // update state in COMMAND 00073 } 00074 00075 bool 00076 DISPLAY_CMD::undoit() 00077 { 00078 // Go in reverse order, in case it matters: 00079 for (int i = _gels.num()-1; i >= 0 ; i--) 00080 WORLD::undisplay(_gels[i], false); 00081 00082 return COMMAND::undoit(); // update state in COMMAND 00083 } 00084 00085 /***************************************************************** 00086 * MULTI_CMD: 00087 *****************************************************************/ 00088 bool 00089 MULTI_CMD::doit() 00090 { 00091 for (int i=0; i <_commands.num(); i++) 00092 _commands[i]->doit(); 00093 00094 return COMMAND::doit(); // update state in COMMAND 00095 } 00096 00097 bool 00098 MULTI_CMD::undoit() 00099 { 00100 // undo in reverse order 00101 for (int i=_commands.num()-1; i >= 0; i--) 00102 _commands[i]->undoit(); 00103 00104 return COMMAND::undoit(); // update state in COMMAND 00105 } 00106 00107 bool 00108 MULTI_CMD::clear() 00109 { 00110 if (!COMMAND::clear()) // update state in COMMAND 00111 return false; 00112 00113 // Clear in reverse order 00114 for (int i=_commands.num()-1; i >= 0; i--) 00115 _commands[i]->clear(); 00116 return true; 00117 } 00118 00119 /* end of file command.C */