00001 #ifndef SelectionH
00002 #define SelectionH
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
00042
00043
00044 #include "CoreMainHeader.h"
00045 #include "SimpleList.h"
00046 #include "EventSystem.h"
00047 #include "ExtObject.h"
00048
00049
00050
00051 class CExtObject;
00052
00053
00054 DECLARE_EVENT(ET_SELECTED_OBJECTS_CHANGE);
00055 DECLARE_EVENT(ET_DBL_CLICK_OBJECT_CHANGE);
00056 DECLARE_EVENT(ET_SELECTED_OBJECTS_END);
00057
00058
00059 DECLARE_EVENT(ET_SELRES_SELECTED_OBJECTS_CHANGE);
00060 DECLARE_EVENT(ET_SELRES_SELECTED_OBJECTS_END);
00061
00062
00063
00065
00068 enum EObject{
00069 SEL_NONE,
00070 SEL_CONNECT_ATOM,
00071 SEL_OBJECTS_FOR_DISTANCE,
00072 SEL_OBJECTS_FOR_ANGLE,
00073 SEL_OBJECTS_FOR_DIHEDRAL,
00074 SEL_ATOM,SEL_TWO_ATOMS,SEL_THREE_ATOMS,SEL_FOUR_ATOMS,
00075 SEL_ATOMS_LIST,
00076 SEL_CUMULATIVE_ATOMS_LIST,
00077 SEL_BOND,
00078 SEL_DIRECTION,
00079 SEL_DIRECTIONS_LIST,
00080 SEL_MOLECULE,
00081 SEL_FRAGMENT,
00082 SEL_MANIPULATE_FRAGMENT,
00083 SEL_EXT_OBJECT,
00084 };
00085
00086
00087
00088
00089
00090
00091
00092 enum ESelResult{
00093 SELRES_CHANGE_CLAIM,
00094 SELRES_SELECTED_OBJECTS_CHANGE,
00095 SELRES_SELECTED_OBJECTS_END,
00096 SELRES_NONE_SELECTED,
00097 };
00098
00099
00100
00101 typedef void __fastcall (__closure *TSelectionEvent)(class CSelection* Selection,ESelResult result);
00102
00103
00104
00106
00114 class NEMESIS_CORE_PACKAGE CSelection : public CExtObject{
00115 public:
00116 enum ELevel{
00117 STANDARD_LEVEL,
00118 DBL_CLICK_LEVEL,
00119 MASTER_LEVEL,
00120 };
00121
00122 enum EAddMode{
00123 NORMAL,
00124 ADD,
00125 REMOVE,
00126 };
00127
00128
00129 __fastcall CSelection(void);
00130
00131
00132 void __fastcall SetClaim(EObject claim);
00133
00134 void __fastcall SetDblClickClaim(EObject claim);
00135 void __fastcall EndDblClickClaim(void);
00136
00137 void __fastcall SetMasterClaim(EObject claim);
00138 void __fastcall EndMasterClaim(void);
00139
00140 inline void __fastcall SetEnabled(bool enabled);
00141
00142 void __fastcall Reset(void);
00143 void __fastcall FlushBuffer(void);
00144
00145
00146 inline EObject __fastcall GetActualClaim(void);
00147 inline EObject __fastcall GetClaim(void);
00148 inline EObject __fastcall GetDblClickClaim(void);
00149 inline EObject __fastcall GetMasterClaim(void);
00150 inline ELevel __fastcall GetActualLevel(void);
00151 inline ESelResult __fastcall GetResultStatus(void);
00152
00153 inline bool __fastcall IsDblClickMode(void);
00154 inline bool __fastcall IsMasterMode(void);
00155
00156
00157 void __fastcall RegisterObject(CExtObject *object,int x,int y);
00158 void __fastcall RegisterMultiObject(CExtObject *object,bool add);
00159 void __fastcall EndRegisterMultiObject(void);
00160
00161 void __fastcall DblClick(void);
00162
00163 inline void __fastcall GetPositionOfSelection(int& x,int& y);
00164
00165
00166
00167 inline int __fastcall NumOfSelectedObjects(void);
00168 CExtObject* __fastcall FirstObject(bool remove);
00169 CExtObject* __fastcall NextObject(bool remove);
00170 void __fastcall AddObjectToList(CExtObject* object);
00171 void __fastcall EndAddObjectToList(void);
00172
00173
00174 private:
00175 int SelX,SelY;
00176 CSimpleIterator<CExtObject> Pos;
00177 CSimpleList<CExtObject> ListOfObjects;
00178 CSimpleList<CExtObject> TemporaryObjects;
00179
00180 EObject Claim;
00181 EObject StandardClaim;
00182 EObject MasterClaim;
00183 EObject DblClickClaim;
00184
00185 bool DblClickMode;
00186 bool MasterMode;
00187 ELevel Level;
00188 bool Enabled;
00189 ESelResult Result;
00190 CExtObject* LastSelectedObject;
00191 bool MakeReset;
00192
00193 TSelectionEvent SelectionChange;
00194
00195 void __fastcall _Reset(void);
00196 void __fastcall SetupClaim(ELevel from,bool set);
00197 void __fastcall RegisterForClaim(EAddMode addmode);
00198
00199 virtual void __fastcall ProcessEvent(const CEventIdentifier& event,CExtObject* Sender,void* p_data);
00200
00201 static ESelResult __fastcall RegisterObjectForAtoms(CSelection* p_sel,CExtObject *object,CSimpleList<CExtObject> &list,int num);
00202 static ESelResult __fastcall RegisterObjectForDistance(CSelection* p_sel,CExtObject *object,CSimpleList<CExtObject> &list);
00203 static ESelResult __fastcall RegisterObjectForAngle(CSelection* p_sel,CExtObject *object,CSimpleList<CExtObject> &list);
00204 static ESelResult __fastcall RegisterObjectForDihedral(CSelection* p_sel,CExtObject *object,CSimpleList<CExtObject> &list);
00205 static ESelResult __fastcall RegisterObjectForBond(CSelection* p_sel,CExtObject *object,CSimpleList<CExtObject> &list);
00206 static ESelResult __fastcall RegisterObjectForConectAtom(CSelection* p_sel,CExtObject *object,CSimpleList<CExtObject>& list);
00207 static ESelResult __fastcall RegisterObjectForDirection(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list,CSimpleList<CExtObject>& temp);
00208 static ESelResult __fastcall RegisterObjectForMolecule(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list);
00209 static ESelResult __fastcall RegisterObjectForManipulateFragment(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list);
00210 static ESelResult __fastcall RegisterObjectForFragment(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list);
00211 static ESelResult __fastcall RegisterObjectForAtomsList(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list);
00212 static ESelResult __fastcall RegisterObjectForCumAtomsList(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list,EAddMode addmode);
00213 static ESelResult __fastcall RegisterObjectForDirectionsList(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list);
00214 static ESelResult __fastcall RegisterObjectForExtObject(CSelection* p_sel,CExtObject* object,CSimpleList<CExtObject>& list);
00215
00216
00217 public:
00218 __property TSelectionEvent OnSelectionChange={write=SelectionChange};
00219 };
00220
00221
00222
00223 inline void __fastcall CSelection::GetPositionOfSelection(int& x,int& y)
00224 {
00225 x = SelX;
00226 y = SelY;
00227 }
00228
00229
00230
00231 inline void __fastcall CSelection::SetEnabled(bool enabled)
00232 {
00233 Enabled = enabled;
00234 if( SelectionChange != NULL ) SelectionChange(this,SELRES_CHANGE_CLAIM);
00235 }
00236
00237
00238
00239 inline EObject __fastcall CSelection::GetActualClaim(void)
00240 {
00241 if( Enabled == false ) return(SEL_NONE);
00242 return(Claim);
00243 }
00244
00245
00246
00247 inline EObject __fastcall CSelection::GetClaim(void)
00248 {
00249 return(StandardClaim);
00250 }
00251
00252
00253
00254 inline EObject __fastcall CSelection::GetDblClickClaim(void)
00255 {
00256 return(DblClickClaim);
00257 }
00258
00259
00260
00261 inline EObject __fastcall CSelection::GetMasterClaim(void)
00262 {
00263 return(MasterClaim);
00264 }
00265
00266
00267
00268 inline CSelection::ELevel __fastcall CSelection::GetActualLevel(void)
00269 {
00270 return(Level);
00271 }
00272
00273
00274
00275 inline bool __fastcall CSelection::IsDblClickMode(void)
00276 {
00277 return(DblClickMode);
00278 }
00279
00280
00281
00282 inline bool __fastcall CSelection::IsMasterMode(void)
00283 {
00284 return(MasterMode);
00285 }
00286
00287
00288
00289
00290
00291
00292
00293
00294 inline int __fastcall CSelection::NumOfSelectedObjects(void)
00295 {
00296 return(ListOfObjects.NumOfMembers());
00297 }
00298
00299
00300
00301 inline ESelResult __fastcall CSelection::GetResultStatus(void)
00302 {
00303 return(Result);
00304 }
00305
00306
00307
00308 #endif
00309
00310