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 #ifndef INC_MGUI_TOOLBASE_H
00030 #define INC_MGUI_TOOLBASE_H
00031
00032 #ifndef INC_MGUI_CTRL_H
00033 #include <mgui/ctrl.h>
00034 #endif
00035
00036 #ifndef INC_MGUI_TOOLCANV_H
00037 #include <mgui/toolcanv.h>
00038 #endif
00039
00040 #ifndef INC_MGUI_DLGSHELL_H
00041 #include <mgui/dlgshell.h>
00042 #endif
00043
00044 #ifndef INC_MI32_TRANS2DC_H
00045 #include <mi32/trans2dc.h>
00046 #endif
00047
00048 #ifndef GENERATING_DOXYGEN_OUTPUT
00049 class REGION2D;
00050 namespace MGD {
00051 class CONTEXT;
00052 }
00053 #endif // GENERATING_DOXYGEN_OUTPUT
00054
00055 namespace MGUI {
00056
00057
00058
00059
00060
00061
00062 class TOOL_BASE {
00063 public:
00064
00065
00066 enum ADJUSTFLAGS {
00067 ADJUST_Default = 0x00,
00068 ADJUST_Absolute = 0x01,
00069 ADJUST_ScreenCoords = 0x02,
00070 ADJUST_Notify = 0x80
00071 };
00072
00073
00074 enum CTRLOPT {
00075 CTRLOPT_Default = 0x00,
00076 CTRLOPT_Manual = 0x01,
00077 CTRLOPT_GPS = 0x02,
00078 CTRLOPT_SnapGrid = 0x04,
00079 CTRLOPT_NoManualProj = 0x08
00080 };
00081
00082
00083 enum CHANGESEQ {
00084 CHANGESEQ_None = 0,
00085 CHANGESEQ_Begin = 1,
00086 CHANGESEQ_Continue = 2,
00087 CHANGESEQ_End = 3,
00088 CHANGESEQ_Cancel = 4
00089 };
00090
00091 enum CHANGETYPE {
00092 CHANGETYPE_None = 0,
00093 CHANGETYPE_Shift = 1,
00094 CHANGETYPE_Resize = 2,
00095 CHANGETYPE_Rotate = 3,
00096 CHANGETYPE_Shear = 4,
00097 CHANGETYPE_Edit = 5,
00098 CHANGETYPE_Create = 6,
00099 CHANGETYPE_Clear = 7
00100 };
00101
00102
00103 enum MARKER {
00104 MARKER_X = 0,
00105 MARKER_Plus = 1,
00106 MARKER_ArrowIn = 2,
00107 MARKER_ArrowOut = 3,
00108 MARKER_None = 4,
00109 MARKER_Circle = 5,
00110 MARKER_Flat = 6,
00111 MARKER_Square = 7,
00112 };
00113
00114 enum PENCOLOR {
00115 PENCOLOR_Primary,
00116 PENCOLOR_Inactive,
00117 PENCOLOR_Highlight,
00118 PENCOLOR_COUNT
00119 };
00120
00121
00122 class SNAPGRID {
00123 public:
00124
00125
00126 SNAPGRID (
00127 );
00128
00129
00130 explicit SNAPGRID (
00131 const DPOINT2D& interval
00132 );
00133
00134
00135 SNAPGRID (
00136 const DPOINT2D& interval,
00137 const TRANS2D_AFFINE& trans
00138 );
00139
00140
00141 void Adjust (
00142 DPOINT2D& pt
00143 ) const;
00144
00145
00146 const DPOINT2D& GetInterval (
00147 ) const { return (m_interval); }
00148
00149
00150 const TRANS2D_AFFINE& GetTrans (
00151 ) const { return (m_trans); }
00152
00153
00154 bool IsValid (
00155 ) const { return (m_interval.x > 0 && m_interval.y > 0); }
00156
00157
00158 void SetInterval (
00159 const DPOINT2D& interval
00160 ) { m_interval = interval; }
00161
00162
00163 void SetTrans (
00164 const TRANS2D_AFFINE& trans
00165 ) { m_trans = trans; }
00166
00167 private:
00168 #ifndef GENERATING_DOXYGEN_OUTPUT
00169 DPOINT2D m_interval;
00170 TRANS2D_AFFINE m_trans;
00171 #endif // GENERATING_DOXYGEN_OUTPUT
00172 };
00173
00174
00175
00176 static UINT32 GetPenColorRef (
00177 PENCOLOR pencolor = PENCOLOR_Primary
00178 );
00179
00180
00181 static void SetPenColorRef (
00182 PENCOLOR pencolor,
00183 UINT32 ColorRef
00184 );
00185
00186
00187 virtual ~TOOL_BASE () = 0;
00188
00189
00190
00191 void Activate (
00192 );
00193
00194
00195 void ClearPosition (
00196 );
00197
00198
00199
00200 MGUI::FORM* CreateControlForm (
00201 MGUI::LAYOUT_PANE_BASE& ParentPane,
00202 CTRLOPT ctrlopt
00203 ) { return (v_CreateControlForm(ParentPane,ctrlopt)); }
00204
00205
00206
00207 MGUI::FORM* CreateManualForm (
00208 MGUI::LAYOUT_PANE_BASE& ParentPane,
00209 CTRLOPT ctrlopt
00210 ) { return (v_CreateManualForm(ParentPane,ctrlopt)); }
00211
00212
00213 void Deactivate (
00214 );
00215
00216
00217 ERRVALUE GenerateRegion (
00218 REGION2D& region
00219 ) const { return (v_GenerateRegion(region)); }
00220
00221
00222
00223 const DPOINT2D& GetArrowKeyDeltas (
00224 ) const { return (m_ArrowDelta); }
00225
00226
00227 CTRLOPT GetControlOptions (
00228 ) const { return (m_ctrlopt); }
00229
00230
00231 const TRANS2D_AFFINE& GetTransToWindow (
00232 ) const { return (m_ToolToWindow); }
00233
00234
00235 TOOLCANVAS* GetCanvas (
00236 ) const { return (m_canvas); }
00237
00238
00239 void GetCanvasExtents (
00240 DRECT2D& extents
00241 ) const;
00242
00243
00244 bool HasControls (
00245 ) const { return (m_ControlNeed != CONTROLNEED_None); }
00246
00247
00248 bool HasManualControls (
00249 ) const { return (m_HasManualControls); };
00250
00251
00252 bool IsActive (
00253 ) const { return (m_IsActive); }
00254
00255
00256 bool IsResizable (
00257 ) const { return (m_Resizable); }
00258
00259
00260 bool IsRotatable (
00261 ) const { return (m_Rotatable); }
00262
00263
00264 bool IsSuspended (
00265 ) const { return (m_SuspendCount > 0); }
00266
00267
00268 bool HasPosition (
00269 ) const { return (m_PosnSet); }
00270
00271
00272 void Move (
00273 double dx,
00274 double dy,
00275 ADJUSTFLAGS flags
00276 );
00277
00278
00279 void Resize (
00280 double dx,
00281 double dy,
00282 ADJUSTFLAGS flags
00283 );
00284
00285
00286 void Resume (
00287 );
00288
00289
00290 void SetArrowKeyDeltas (
00291 double dx,
00292 double dy
00293 );
00294
00295
00296 void SetCanStartNew (
00297 bool canstartnew
00298 ) { m_CanStartNew = canstartnew; }
00299
00300
00301
00302 void SetControlOptions (
00303 CTRLOPT ctrlopt
00304 ) { m_ctrlopt = ctrlopt; }
00305
00306
00307 void SetResizable (
00308 bool resizable
00309 ) { m_Resizable = resizable; }
00310
00311
00312 void SetRotatable (
00313 bool rotatable
00314 ) { m_Rotatable = rotatable; }
00315
00316
00317 void SetTransToWindow (
00318 const TRANS2D_AFFINE& trans
00319 );
00320
00321
00322 bool SnapGridIsActive (
00323 ) const { return (m_UseSnapGrid); }
00324
00325
00326 const SNAPGRID& SnapGridGet (
00327 ) const { return (m_snapgrid); }
00328
00329
00330 void SnapGridSet (
00331 SNAPGRID& parms
00332 );
00333
00334
00335 void SnapGridSetActive (
00336 bool active
00337 ) { m_UseSnapGrid = active; }
00338
00339
00340 void Suspend (
00341 );
00342
00343 protected:
00344
00345 enum CONTROLNEED {
00346 CONTROLNEED_None,
00347 CONTROLNEED_Optional,
00348 CONTROLNEED_Required
00349 };
00350
00351
00352 explicit TOOL_BASE (
00353 TOOLCANVAS *canvas,
00354 CONTROLNEED ControlNeed,
00355 bool HasManualControls
00356 );
00357
00358
00359
00360 void AdjustBegin (CHANGETYPE changetype, bool redraw = true);
00361
00362 void AdjustEnd (bool releasecapture = true, bool cancel = false);
00363
00364 void ApplyMoveDeltas (
00365 DPOINT2D& point,
00366 double dx,
00367 double dy,
00368 ADJUSTFLAGS flags
00369 ) const;
00370
00371
00372 void ApplySnap (
00373 DPOINT2D& point
00374 ) const;
00375
00376 bool CanStartNew (
00377 ) const { return (m_CanStartNew); }
00378
00379
00380 int CheckBounds (const DRECT2D&, DRECT2D*) const;
00381
00382
00383 void DrawMarker (MGD::CONTEXT *dc, const LPOINT2D& centerpoint, const LPOINT2D& dirpoint, MARKER marker, UINT16 size) const;
00384
00385 bool GetArrowDeltas (KEYCODE, double*, double*);
00386
00387
00388
00389 MGD::CONTEXT* GetDrawingContext (
00390 );
00391
00392 CHANGETYPE GetChangeType (
00393 ) const { return (m_ChangeType); }
00394
00395
00396 bool IsMouseCaptured (
00397 ) const;
00398
00399
00400 void NotifyChange (
00401 CHANGESEQ changeseq,
00402 CHANGETYPE changetype
00403 ) { v_OnNotifyChange(changeseq,changetype); }
00404
00405
00406 void RestoreBackground (
00407 ) const;
00408
00409
00410 void RestoreBackground (
00411 const LRECT2D& rect,
00412 bool AddLineWidth = true
00413 ) const;
00414
00415 void RestoreDrawingContext (
00416 );
00417
00418
00419 void SetCursor (
00420 CURSORID cursorid
00421 ) const { m_canvas->SetCursor(cursorid); }
00422
00423 void SetHasPosition (
00424 bool HasPosition = true
00425 ) { m_PosnSet = HasPosition; }
00426
00427
00428 LPOINT2D TransToolToWindow (
00429 const DPOINT2D& point
00430 ) const;
00431
00432
00433 DPOINT2D TransWindowToTool (
00434 MGUI::POINT point
00435 ) const { return (m_ToolToWindow.ConvertInverse(point.m_x,point.m_y)); }
00436
00437
00438 DPOINT2D TransWindowToTool (
00439 const LPOINT2D& point
00440 ) const { return (m_ToolToWindow.ConvertInverse(point.x,point.y)); }
00441
00442 private:
00443
00444 #ifndef GENERATING_DOXYGEN_OUTPUT
00445
00446 class TOOLDLG : public MGUI::DLGSHELL {
00447 public:
00448 TOOLDLG (TOOL_BASE& tool);
00449 private:
00450 class PAGECONTROLS : public MGUI::LAYOUT_PAGE {
00451 public:
00452 PAGECONTROLS (TOOLDLG& dlg): m_dlg(dlg) { }
00453 virtual ~PAGECONTROLS () { }
00454 private:
00455 TOOLDLG& m_dlg;
00456 virtual void OnInitPage ();
00457 };
00458 class PAGEMANUAL : public MGUI::LAYOUT_PAGE {
00459 public:
00460 PAGEMANUAL (TOOLDLG& dlg): m_dlg(dlg) { }
00461 virtual ~PAGEMANUAL () { }
00462 private:
00463 TOOLDLG& m_dlg;
00464 virtual void OnInitPage ();
00465 };
00466 TOOL_BASE& m_tool;
00467 MGUI::LAYOUT_BOOK m_TabBook;
00468 PAGECONTROLS m_PageControls;
00469 PAGECONTROLS m_PageManual;
00470 virtual ERRVALUE v_CreateContent ();
00471 friend class PAGECONTROLS;
00472 friend class PAGEMANUAL;
00473 };
00474
00475
00476
00477 static UINT32 s_PenColor[PENCOLOR_COUNT];
00478
00479
00480 TOOLCANVAS *m_canvas;
00481 CONTROLNEED m_ControlNeed;
00482 bool m_HasManualControls;
00483 INT8 m_LineWidth;
00484 DPOINT2D m_ArrowDelta;
00485 INT32 m_SuspendCount;
00486 CHANGETYPE m_ChangeType;
00487 bool m_IsActive;
00488 bool m_PosnSet;
00489 bool m_UseSnapGrid;
00490 bool m_HasArrowDeltas;
00491 bool m_IsUserModifying;
00492 mutable bool m_InRestoreBG;
00493 bool m_InDeactivateFunc;
00494 bool m_CanStartNew;
00495 bool m_Resizable;
00496 bool m_Rotatable;
00497 CTRLOPT m_ctrlopt;
00498 TOOLDLG m_ToolDlg;
00499
00500
00501 TRANS2D_AFFINE m_ToolToWindow;
00502 SNAPGRID m_snapgrid;
00503
00504 void CreateToolDlg ();
00505 void DrawTool (MGD::CONTEXT*);
00506 void DrawTool (MGD::CONTEXT*, UINT32);
00507 void DrawTool (UINT32);
00508 bool OnKey (MGUI::POINT point, MGUI::KEYCODE, KEYSTATE);
00509 void SetCanvas (TOOLCANVAS *canvas) { m_canvas = canvas; }
00510
00511 #endif // GENERATING_DOXYGEN_OUTPUT
00512
00513
00514
00515
00516
00517 virtual MGUI::FORM* v_CreateControlForm (
00518 MGUI::LAYOUT_PANE_BASE& ParentPane,
00519 CTRLOPT ctrlopt
00520 );
00521
00522
00523
00524 virtual MGUI::FORM* v_CreateManualForm (
00525 MGUI::LAYOUT_PANE_BASE& ParentPane,
00526 CTRLOPT ctrlopt
00527 );
00528
00529
00530 virtual void v_DoDraw (MGD::CONTEXT*) = 0;
00531
00532
00533 virtual void v_DoMove (double x, double y, ADJUSTFLAGS);
00534
00535
00536 virtual void v_DoSize (double x, double y, ADJUSTFLAGS);
00537
00538
00539
00540 virtual int v_GenerateRegion (
00541 REGION2D& region
00542 ) const;
00543
00544
00545 virtual MISTRING v_GetDialogTitle (
00546 ) const;
00547
00548
00549 virtual void v_OnActivate ();
00550
00551
00552 virtual void v_OnClear ();
00553
00554
00555 virtual void v_OnDeactivate ();
00556
00557
00558
00559
00560 virtual bool v_OnKey (MGUI::POINT point, MGUI::KEYCODE, KEYSTATE);
00561
00562
00563 virtual void v_OnLButtonDown (MGUI::POINT point, KEYSTATE keystate) = 0;
00564
00565
00566 virtual void v_OnLButtonUp (MGUI::POINT point, KEYSTATE keystate);
00567
00568
00569 virtual void v_OnMouseMove (MGUI::POINT point, KEYSTATE keystate) = 0;
00570
00571
00572 virtual void v_OnNotifyChange (
00573 CHANGESEQ changeseq,
00574 CHANGETYPE changetype
00575 );
00576
00577
00578
00579 virtual void v_OnRButtonDown (MGUI::POINT point, KEYSTATE keystate);
00580
00581
00582
00583 virtual void v_OnRButtonUp (MGUI::POINT point, KEYSTATE keystate);
00584
00585
00586 virtual void v_OnResume ();
00587
00588
00589 virtual void v_OnSetTransToWindow ();
00590
00591
00592 virtual void v_OnSizeCanvas ();
00593
00594 friend class TOOL_BASE::TOOLDLG;
00595 friend class TOOLCANVAS;
00596 };
00597 DEFINE_ENUM_OPERATORS(TOOL_BASE::ADJUSTFLAGS);
00598 DEFINE_ENUM_OPERATORS(TOOL_BASE::CTRLOPT);
00599
00600
00601
00602
00603 class TOOL_LIMITED : public TOOL_BASE {
00604 public:
00605
00606
00607 virtual ~TOOL_LIMITED ();
00608
00609
00610 void SetLimits (
00611 const DRECT2D& rect
00612 );
00613
00614
00615
00616 void SetLimitsEnforced (
00617 bool enforced = true
00618 );
00619
00620 protected:
00621
00622
00623 explicit TOOL_LIMITED (
00624 TOOLCANVAS *canvas,
00625 CONTROLNEED ControlNeed,
00626 bool HasManualControls
00627 );
00628
00629
00630 const DRECT2D& GetLimits (
00631 ) const { return (m_Limits); }
00632
00633
00634 bool IsLimitsEnforced (
00635 ) const { return (m_LimitsEnforced); }
00636
00637
00638
00639 virtual void v_OnActivate ();
00640
00641
00642
00643 virtual void v_OnSetTransToWindow ();
00644
00645 private:
00646 #ifndef GENERATING_DOXYGEN_OUTPUT
00647 bool m_LimitsEnforced;
00648 bool m_LimitsSet;
00649 DRECT2D m_Limits;
00650
00651 virtual void v_OnSizeCanvas ();
00652
00653
00654
00655 virtual void v_OnChangeLimits ();
00656
00657 void UpdateLimits ();
00658 #endif // GENERATING_DOXYGEN_OUTPUT
00659 };
00660
00661
00662
00663 }
00664
00665 #endif // INC_MGUI_TOOLBASE_H
00666