00001
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 #ifndef INC_MI32_GRLAYOUT_H
00167 #define INC_MI32_GRLAYOUT_H
00168
00169 #ifndef INC_MI32_SERIALIZABLE_H
00170 #include <mi32/serializable.h>
00171 #endif
00172
00173 #ifndef INC_MI32_SERIALIZERITEM_H
00174 #include <mi32/serializeritem.h>
00175 #endif
00176
00177 #ifndef INC_MI32_MGD2_H
00178 #include <mi32/mgd2.h>
00179 #endif
00180
00181 #ifndef INC_MI32_OBSERVER_H
00182 #include <mi32/observer.h>
00183 #endif
00184
00185 #ifndef INC_MI32_UCSTRING_H
00186 #include <mi32/ucstring.h>
00187 #endif
00188
00189 #if !defined(INC_MI32_XDEFNS_H) && defined(X_NATIVE)
00190 #include <mi32/xdefns.h>
00191 #endif
00192
00193 #ifndef _VECTOR_
00194 #include <vector>
00195 #endif
00196
00197 #ifndef GENERATING_DOXYGEN_OUTPUT
00198 struct MxPromptCallbackStruct;
00199 struct UNITCONV;
00200 class MIDIALOG;
00201 class TRANS2D_MAPGEN;
00202 #endif
00203
00204
00205 class GRAPHICLAYOUT : public SERIALIZABLE {
00206 public:
00207
00208 class ITEM;
00209 typedef MILIST<ITEM*> ITEMLIST;
00210 typedef ITEMLIST::ITERATOR ITERATOR;
00211 typedef ITEMLIST::CONST_ITERATOR CONST_ITERATOR;
00212
00215
00216 class OBSERVER : public OBSERVER_BASE {
00217 public:
00218 OBSERVER (
00219 GRAPHICLAYOUT& layout
00220 ) :
00221 OBSERVER_BASE(layout.m_Observers)
00222 {
00223 }
00224
00225 virtual ~OBSERVER (
00226 ) {
00227 }
00228
00230 virtual void OnRedraw (
00231 ) {
00232 return;
00233 }
00234 };
00235
00236 class OBSERVERMANAGER : public SUBJECT<OBSERVER> {
00237 public:
00239 void Redraw (
00240 );
00241
00242 };
00243
00244 class NAMEDTEXTSTYLE : public TEXTSTYLE {
00245 public:
00246 struct TABSTOP {
00247 enum TYPE {
00248 TYPE_Left = 0,
00249 TYPE_Right,
00250 TYPE_Center,
00251 TYPE_Decimal
00252 };
00253
00254 INT32 position;
00255 UINT8 type;
00256 char padChar;
00257 char spare1;
00258 char spare2;
00259 };
00260
00261 NAMEDTEXTSTYLE();
00262 NAMEDTEXTSTYLE(const NAMEDTEXTSTYLE&);
00263 ~NAMEDTEXTSTYLE();
00264
00265 NAMEDTEXTSTYLE& operator= (
00266 const NAMEDTEXTSTYLE& rhs
00267 );
00268
00269 bool operator== (
00270 const NAMEDTEXTSTYLE& rhs
00271 ) const {
00272 return (CompareIgnoringName(rhs) && ucstrcmp(m_name, rhs.m_name) == 0);
00273 }
00274
00275
00276 bool operator!= (
00277 const NAMEDTEXTSTYLE& rhs
00278 ) const {
00279 return (!(*this == rhs));
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00291 bool CompareIgnoringName (
00292 const NAMEDTEXTSTYLE& rhs
00293 ) const;
00294
00297
00298 void FreeData() {
00299 MmFree(m_TabStops);
00300 m_NumTabStops = 0;
00301 }
00302
00303 const MIUNICODE* GetName (
00304 ) const {
00305 return (m_name);
00306 }
00307
00308 INT32 GetNumTabStops (
00309 ) const {
00310 return (m_NumTabStops);
00311 }
00312
00313 const TABSTOP& GetTabStop (
00314 INT32 num
00315 ) const {
00316 return (m_TabStops[num]);
00317 }
00318
00319 void SetName (
00320 const MIUNICODE* name
00321 ) {
00322 ucstrcpy(m_name, name);
00323 }
00324
00325 void SetStyle (
00326 const TEXTSTYLE* style
00327 ) {
00328 if (style != 0) *(static_cast<TEXTSTYLE*>(this)) = *style;
00329 }
00330
00333 INT32 TabStopAdd (
00334 const TABSTOP& stop
00335 );
00336
00339 INT32 TabStopAdd (
00340 INT32 pos,
00341 TABSTOP::TYPE type = TABSTOP::TYPE_Left,
00342 char padChar = 0
00343 );
00344
00346 void TabStopRemove (
00347 INT32 TabStopNum
00348 );
00349
00350 void TabStopRemoveAll (
00351 ) {
00352 m_NumTabStops = 0;
00353 MmFree(m_TabStops);
00354 }
00355
00356 void TabStopMove (
00357 INT32 TabStopNum,
00358 INT32 NewPos,
00359 bool bSort = true
00360 );
00361
00362 void SortTabStops();
00363
00364 private:
00365 #ifndef GENERATING_DOXYGEN_OUTPUT
00366 MIUNICODE m_name[64];
00367 UINT32 m_NumTabStops;
00368 TABSTOP* m_TabStops;
00369
00370 void Copy (
00371 const NAMEDTEXTSTYLE& rhs
00372 );
00373
00374 friend class GRAPHICLAYOUT;
00375 #endif // GENERATING_DOXYGEN_OUTPUT
00376 };
00377
00378
00379 class TEXTBLOCK {
00380 public:
00381
00382 static const SERIALIZERITEM* GetSerialItemDef (
00383 );
00384
00385 TEXTBLOCK (
00386 );
00387
00388 TEXTBLOCK (
00389 const MIUNICODE* str
00390 );
00391
00392 TEXTBLOCK (
00393 const TEXTBLOCK& rhs
00394 );
00395
00396 ~TEXTBLOCK (
00397 ) {
00398 }
00399
00400 void ClearSizeKnown (
00401 ) {
00402 m_bSizeKnown = false;
00403 return;
00404 }
00405
00406 const DPOINT2D& ComputeSize (
00407 const NAMEDTEXTSTYLE* style,
00408 DOUBLE XStart = 0.0
00409 );
00410
00411 void Draw (
00412 MGD::CONTEXT*,
00413 const DPOINT2D& basepoint,
00414 TEXTBASEORIGIN baseorigin,
00415 const NAMEDTEXTSTYLE* style,
00416 double XOffset = 0.0
00417 );
00418
00421 const DPOINT2D& GetSize (
00422 ) const {
00423 return (m_size);
00424 };
00425
00426 const MISTRING& GetString (
00427 ) const {
00428 return (m_str);
00429 }
00430
00431 bool IsSizeKnown (
00432 ) const {
00433 return (m_bSizeKnown);
00434 }
00435
00436 void SetString (
00437 const MISTRING& str
00438 );
00439
00440 const DPOINT2D& WordWrap (
00441 DOUBLE width,
00442 const NAMEDTEXTSTYLE* style,
00443 DOUBLE xoffset = 0.0
00444 );
00445
00446 private:
00447 void FillInBlock (
00448 MGD::TEXTBLOCK& block,
00449 const NAMEDTEXTSTYLE* style = 0,
00450 double XOffset = 0.0
00451 );
00452
00455 void SetupTabStops (
00456 MISTRING& str,
00457 const NAMEDTEXTSTYLE& style,
00458 double XOffset = 0.0
00459 );
00460
00461 MISTRING m_str;
00462 MISTRING m_formatted;
00463 DPOINT2D m_size;
00464 double m_WrapWidth;
00465 bool m_bSizeKnown;
00466 bool m_bDoWordWrap;
00467 };
00468
00471 class ITEMPROPERTYSHEET {
00472 #ifndef WIN32_NATIVE
00473 public:
00474 ITEMPROPERTYSHEET (
00475 GRAPHICLAYOUT& grlayout,
00476 MIDIALOG* dialog
00477 ) :
00478 m_grlayout(grlayout),
00479 m_dialog(dialog)
00480 {
00481 }
00482
00483 virtual ~ITEMPROPERTYSHEET() {
00484 }
00485
00486 virtual const char* GetLabel () const = 0;
00487
00488 virtual Widget CreateForm (
00489 Widget parent,
00490 bool isMulti
00491 ) = 0;
00492
00493 virtual void OnApply () = 0;
00494
00495 virtual void OnOpen (
00496 ) {
00497 }
00498
00499 virtual ERRVALUE AddItem (
00500 ITEM* item
00501 ) = 0;
00502
00503 virtual void OnSetDistanceUnits (
00504 const UNITCONV*
00505 ) { }
00506
00507 virtual void OnChangeTextStyle (
00508 int
00509 ) { }
00510
00511 void SetApplySensitive (
00512 bool sensitive = true
00513 );
00514
00515 protected:
00516
00517
00520 void SetPromptModifyCallback (
00521 Widget prompt,
00522 bool& bModifiedFlag
00523 );
00524
00525 void SetXeTextModifyCallback (
00526 Widget Widget,
00527 bool& bModifiedFlag
00528 );
00529
00530 Widget CreateTextStyleOptionMenu (
00531 Widget parent,
00532 int DefaultStyleNum,
00533 Arg* args,
00534 int numargs
00535 );
00536
00537 private:
00542 static void PCB_PromptModify (
00543 MxPromptCallbackStruct*,
00544 void* cbdata
00545 );
00546
00547 static void CB_ChangeStyle (
00548 Widget widget,
00549 void* cbdata,
00550 void*
00551 );
00552
00553 static void CB_XeTextModify (
00554 Widget widget,
00555 void* cbdata,
00556 void*
00557 );
00558
00559 MIDIALOG* m_dialog;
00560 GRAPHICLAYOUT& m_grlayout;
00561 #endif
00562
00563 };
00564
00565 class ITEMPOSITION {
00566 public:
00567
00568 ITEMPOSITION (
00569 );
00570
00572 ITEMPOSITION (
00573 const ITEMPOSITION& rhs
00574 );
00575
00576 virtual ~ITEMPOSITION (
00577 ) {
00578 }
00579
00582 int Compare (
00583 const ITEMPOSITION& rhs
00584 ) const;
00585
00587 const INT32 GetGroup (
00588 ) const {
00589 return (m_Group);
00590 }
00591
00595 int GetLeftGuide (
00596 ) const {
00597 return m_LeftGuide;
00598 }
00599
00602 DOUBLE GetLeftOffset (
00603 ) const {
00604 return m_LeftOffset;
00605 }
00606
00610 int GetRightGuide (
00611 ) const {
00612 return m_RightGuide;
00613 }
00614
00617 DOUBLE GetRightOffset (
00618 ) const {
00619 return m_RightOffset;
00620 }
00621
00625 INT32 GetTopGuide (
00626 ) const {
00627 return m_TopGuide;
00628 }
00629
00631 DOUBLE GetTopOffset (
00632 ) const {
00633 return m_TopOffset;
00634 }
00635
00637 const DRECT2D& GetRect (
00638 ) const {
00639 return (m_rect);
00640 }
00641
00642 void GetRect (
00643 DRECT2D& rect
00644 ) {
00645 rect = GetRect();
00646 return;
00647 }
00648
00649 void SetGroup (
00650 INT32 group
00651 ) { m_Group = group; }
00652
00653 protected:
00654 INT32 m_LeftGuide;
00655 INT32 m_RightGuide;
00656 INT32 m_TopGuide;
00657 DOUBLE m_TopOffset;
00658 DOUBLE m_LeftOffset;
00659 DOUBLE m_RightOffset;
00660 DRECT2D m_rect;
00661 INT32 m_Group;
00662
00663 friend class GRAPHICLAYOUT;
00664 friend class ITEM;
00665 };
00666
00667 class ITEM : public ITEMPOSITION, SERIALIZABLE {
00668 public:
00669
00675 ITEM (
00676 GRAPHICLAYOUT& parent
00677 );
00678
00680 ITEM (
00681 const ITEM& rhs,
00682 GRAPHICLAYOUT& parent
00683 );
00684
00686 virtual ~ITEM();
00687
00692 virtual void ComputeRect (
00693 DRECT2D& rect
00694 ) = 0;
00695
00697 virtual ITEM* Copy (
00698 GRAPHICLAYOUT& parent
00699 ) const = 0;
00700
00701 virtual ITEMPROPERTYSHEET* CreatePropertySheet (
00702 GRAPHICLAYOUT& grlayout,
00703 MIDIALOG* dialog
00704 ) = 0;
00705
00708 void Draw (
00709 MGD::CONTEXT* gc,
00710 const DRECT2D& rect,
00711 const TRANS2D_MAPGEN* trans,
00712 double scale
00713 ) { v_Draw(gc,rect,trans,scale); }
00714
00716 void Draw (
00717 MGD::CONTEXT* gc,
00718 bool bSelected = false,
00719 const TRANS2D_MAPGEN* trans = 0,
00720 double scale = 1.0
00721 );
00722
00725 DOUBLE GetHeight (
00726 ) const {
00727 return (m_height);
00728 }
00729
00731 const NAMEDTEXTSTYLE* GetTextStyle (
00732 ) const {
00733 return (m_parent.GetTextStyle(m_TextStyleNum));
00734 }
00735
00737 int GetTextStyleNumber (
00738 ) const {
00739 return (m_TextStyleNum);
00740 }
00741
00743 DOUBLE GetWidth (
00744 ) const {
00745 return (m_width);
00746 }
00747
00748 bool IsSelected (
00749 ) const {
00750 return (m_bSelected);
00751 }
00752
00756 bool IsSorted (
00757 ) const;
00758
00760 bool IsInLayout (
00761 ) const;
00762
00764 void Move (
00765 DOUBLE dx,
00766 DOUBLE dy,
00767 bool bSnap
00768 ) {
00769 m_parent.MoveItem(this, dx, dy, bSnap);
00770 return;
00771 }
00772
00774 void Move (
00775 const DRECT2D& rect,
00776 bool bSnap
00777 ) {
00778 m_parent.MoveItem(this, rect, bSnap);
00779 return;
00780 }
00781
00783 void MoveBelow (
00784 const ITEMPOSITION& above
00785 ) {
00786 m_rect.yinit = above.m_rect.yinit + .0001;
00787 if (IsInLayout()) m_parent.SetLayoutNeeded();
00788 return;
00789 }
00790
00792 virtual const SERIALIZERITEM* SerialGetItemDef (
00793 SERIALIZER& serializer
00794 ) const = 0;
00795
00798 virtual const char* SerialGetTagName (
00799 ) const = 0;
00800
00803 virtual ERRVALUE SerialRead (
00804 SERIALIZER& serializer
00805 );
00806
00809 virtual ERRVALUE SerialWrite (
00810 SERIALIZER& serializer,
00811 const char* tagname = 0
00812 ) const;
00813
00815 void SetAttachments (
00816 const ITEMPOSITION& newpos
00817 ) {
00818 m_LeftGuide = newpos.m_LeftGuide;
00819 m_RightGuide = newpos.m_RightGuide;
00820 m_TopGuide = newpos.m_TopGuide;
00821 m_LeftOffset = newpos.m_LeftOffset;
00822 m_RightOffset = newpos.m_RightOffset;
00823 m_TopOffset = newpos.m_TopOffset;
00824 m_rect = newpos.m_rect;
00825 m_bPosKnown = true;
00826 if (IsInLayout()) m_parent.SetLayoutNeeded();
00827 return;
00828 }
00829
00832 void SetDefaultLocation (
00833 );
00834
00838 void SetHidden (
00839 bool bHidden
00840 ) {
00841 m_bHidden = bHidden;
00842 }
00843
00845 void SetLeftOffset (
00846 DOUBLE offset
00847 ) {
00848 m_LeftOffset = offset;
00849 if (IsInLayout()) m_parent.SetLayoutNeeded();
00850 return;
00851 }
00852
00853 void SetLeftPosition (
00854 INT32 GuideNum,
00855 DOUBLE offset
00856 ) {
00857 m_LeftGuide = GuideNum;
00858 m_LeftOffset = offset;
00859 if (IsInLayout()) m_parent.SetLayoutNeeded();
00860 return;
00861 }
00862
00863
00865 void SetRightPosition (
00866 INT32 GuideNum,
00867 DOUBLE offset
00868 ) {
00869 m_RightGuide = GuideNum;
00870 m_RightOffset = offset;
00871 if (IsInLayout()) m_parent.SetLayoutNeeded();
00872 return;
00873 }
00874
00875 void SetSelected (
00876 bool selected
00877 ) {
00878 m_bSelected = selected;
00879 return;
00880 }
00881
00882 void SetSize (
00883 DOUBLE height,
00884 DOUBLE width
00885 ) {
00886 if (height == m_height && width == m_width) return;
00887 m_height = height;
00888 m_width = width;
00889 if (IsInLayout()) m_parent.SetLayoutNeeded();
00890 return;
00891 }
00892
00895 void SetTextStyleNumber (
00896 int num
00897 ) {
00898 if (num != m_TextStyleNum) {
00899 m_TextStyleNum = num;
00900 m_bSizeKnown = false;
00901 if (IsInLayout()) m_parent.SetLayoutNeeded();
00902 }
00903 }
00904
00905 void SetTopOffset (
00906 DOUBLE offset
00907 ) {
00908 m_TopOffset = offset;
00909 if (IsInLayout()) m_parent.SetLayoutNeeded();
00910 return;
00911 }
00912
00914 void SetTopPosition (
00915 INT32 GuideNum,
00916 DOUBLE offset
00917 ) {
00918 m_TopGuide = GuideNum;
00919 m_TopOffset = offset;
00920 if (IsInLayout()) m_parent.SetLayoutNeeded();
00921 return;
00922 }
00923
00924 virtual bool UsesTransparency (
00925 const MGD::CONTEXT* gc = 0
00926 ) const;
00927
00930 static const SERIALIZERITEM* GetSerialItemDef (
00931 );
00932
00938 protected:
00939 bool m_bSizeKnown;
00940 GRAPHICLAYOUT& m_parent;
00941
00942 private:
00943 INT32 m_TextStyleNum;
00944 bool m_bHidden;
00945 bool m_bPosKnown;
00946 bool m_bSelected;
00947 DOUBLE m_height;
00948 DOUBLE m_width;
00949 ITEMLIST::ITERATOR m_self;
00950
00953 virtual void v_Draw (
00954 MGD::CONTEXT* gc,
00955 const DRECT2D& rect,
00956 const TRANS2D_MAPGEN* trans,
00957 double scale
00958 ) = 0;
00959
00960 friend class GRAPHICLAYOUT;
00961 };
00962
00969
00970 class SUSPEND_REDRAW {
00971 public:
00972 SUSPEND_REDRAW (
00973 GRAPHICLAYOUT& layout
00974 ) :
00975 m_layout(layout)
00976 {
00977 m_layout.RedrawSuspend();
00978 }
00979
00980 ~SUSPEND_REDRAW (
00981 ) {
00982 m_layout.RedrawResume();
00983 }
00984
00985 private:
00986 GRAPHICLAYOUT& m_layout;
00987 };
00988
00990 static const SERIALIZERITEM* GetSerialItemDef (
00991 );
00992
00994 GRAPHICLAYOUT (
00995 );
00996
00998 GRAPHICLAYOUT (
00999 const GRAPHICLAYOUT& rhs
01000 );
01001
01003 virtual ~GRAPHICLAYOUT();
01004
01006 static void InstallItemType (
01007 const char* name,
01008 int (*Construct)(GRAPHICLAYOUT&, ITEM**)
01009 );
01010
01012 ITERATOR Begin (
01013 ) {
01014 return (m_ItemList.Begin());
01015 }
01016
01018 CONST_ITERATOR Begin (
01019 ) const {
01020 return (m_ItemList.Begin());
01021 }
01022
01025 int AddHGuide (
01026 DOUBLE value
01027 );
01028
01032 void AddItem (
01033 ITEM* item
01034 );
01035
01037 int AddTextStyle (
01038 const NAMEDTEXTSTYLE& style
01039 );
01040
01043 int AddVGuide (
01044 DOUBLE value
01045 );
01046
01050 void ComputeItemAttachments (
01051 const ITEM* item,
01052 DRECT2D& rect,
01053 ITEMPOSITION& newpos,
01054 const ITEM *&ItemAbove,
01055 bool bSnap = true
01056 ) const;
01057
01058 ERRVALUE Copy (
01059 const GRAPHICLAYOUT& rhs
01060 );
01061
01064 int DoLayout (
01065 );
01066
01069 int Draw (
01070 MGD::CONTEXT* gc,
01071 const DRECT2D* rect = 0,
01072 const TRANS2D_MAPGEN* trans = 0,
01073 double scale = 1.0
01074 );
01075
01079 void DrawItemHandles (
01080 MGD::CONTEXT* gc,
01081 const ITEMPOSITION& position,
01082 const DRECT2D& rect,
01083 const GRAPHICLAYOUT::ITEM* ItemAbove,
01084 const DPOINT2D& SelectedDelta,
01085 double scale = 1.0
01086 ) const;
01087
01089 ITERATOR End (
01090 ) {
01091 return (m_ItemList.End());
01092 }
01093
01095 CONST_ITERATOR End (
01096 ) const {
01097 return (m_ItemList.End());
01098 }
01099
01100 const LINESTYLE& GetBorderStyle (
01101 ) const {
01102 return (m_BorderStyle);
01103 }
01104
01105 const COLOR& GetBackgroundColor (
01106 ) const {
01107 return (m_BGColor);
01108 }
01109
01111 bool GetDrawBackground (
01112 ) const {
01113 return (m_bDrawBackground);
01114 }
01115
01118 bool GetDrawBorder (
01119 ) const {
01120 return (m_bDrawBorder);
01121 }
01122
01124 bool GetDrawDropShadow (
01125 ) const {
01126 return (m_bDrawDropShadow);
01127 }
01128
01130 const COLOR& GetDropShadowColor (
01131 ) const {
01132 return (m_DropShadowColor);
01133 }
01134
01136 double GetDropShadowDirection (
01137 ) const {
01138 return (m_DropShadowDirection);
01139 }
01140
01142 double GetDropShadowDistance (
01143 ) const {
01144 return (m_DropShadowDistance);
01145 }
01146
01148 DOUBLE GetHGuide (
01149 int GuideNum
01150 ) const {
01151 if (GuideNum < 0 || (UINT32)GuideNum >= m_NumHGuides) return 0;
01152 return m_HGuides[GuideNum];
01153 }
01154
01156 DOUBLE GetHeight (
01157 ) const {
01158 return (m_Extents.GetHeight());
01159 }
01160
01163 INT32 GetHGuideFromLocation (
01164 const DPOINT2D& point,
01165 int tolerance = 2
01166 ) const;
01167
01168 INT32 GetVGuideFromLocation (
01169 const DPOINT2D& point,
01170 int tolerance = 2
01171 ) const;
01172
01173
01176 ITEM* GetItemFromLocation (
01177 const DPOINT2D& point
01178 );
01179
01181 const ITEM* GetItemFromLocation (
01182 const DPOINT2D& point
01183 ) const;
01184
01186 int GetNumHGuides (
01187 ) const {
01188 return m_NumHGuides;
01189 }
01190
01192 int GetNumTextStyles (
01193 ) const {
01194 return m_TextStyle.size();
01195 }
01196
01198 int GetNumVGuides (
01199 ) const {
01200 return m_NumVGuides;
01201 }
01202
01204 const NAMEDTEXTSTYLE* GetTextStyle (
01205 int num
01206 ) const {
01207 if (num < 0 || num >= GetNumTextStyles()) return NULL;
01208 return (&m_TextStyle[num]);
01209 }
01210
01212 void GetTextStyle (
01213 int num,
01214 TEXTSTYLE& style
01215 ) const {
01216 style = m_TextStyle[num];
01217 return;
01218 }
01219
01221 void GetTextStyle (
01222 int num,
01223 NAMEDTEXTSTYLE& style
01224 ) const {
01225 style = m_TextStyle[num];
01226 return;
01227 }
01228
01229
01231 const MIUNICODE* GetTextStyleName (
01232 int num
01233 ) const {
01234 if (num < 0 || num >= GetNumTextStyles()) return NULL;
01235 return (m_TextStyle[num].m_name);
01236 }
01237
01241 void GetTextStyles (
01242 std::vector<NAMEDTEXTSTYLE>& styles
01243 ) {
01244 styles.clear();
01245 for (int i = 0 ; i < GetNumTextStyles() ; ++i) styles.push_back(m_TextStyle[i]);
01246 }
01247
01249 DOUBLE GetVGuide (
01250 int GuideNum
01251 ) const {
01252 if (GuideNum < 0 || (UINT32)GuideNum >= m_NumVGuides) return 0;
01253 return m_VGuides[GuideNum];
01254 }
01255
01257 DOUBLE GetWidth (
01258 ) const {
01259 return (m_Extents.GetWidth());
01260 }
01261
01262 bool IsLayoutNeeded (
01263 ) const {
01264 return (m_bLayoutNeeded);
01265 }
01266
01268 void MoveItem (
01269 ITEM* item,
01270 DOUBLE dx,
01271 DOUBLE dy,
01272 bool bSnap
01273 );
01274
01275
01277 void MoveItem (
01278 ITEM* item,
01279 const DRECT2D& location,
01280 bool bSnap
01281 );
01282
01288 void RedrawSuspend (
01289 ) {
01290 ++m_RedrawSuspended;
01291 return;
01292 }
01293
01297 void RedrawResume (
01298 ) {
01299 if (m_RedrawSuspended) --m_RedrawSuspended;
01300 if (!m_RedrawSuspended && m_bRedrawNeeded) {
01301 Redraw();
01302 }
01303 return;
01304 }
01305
01310 bool RemoveHGuide (
01311 int GuideNum
01312 );
01313
01318 void RemoveItem (
01319 ITEM* item
01320 );
01321
01326 bool RemoveVGuide (
01327 int GuideNum
01328 );
01329
01331 virtual const SERIALIZERITEM* SerialGetItemDef (
01332 SERIALIZER& serializer
01333 ) const;
01334
01336 virtual const char* SerialGetTagName (
01337 ) const {
01338 return "GRAPHICLAYOUT";
01339 }
01340
01342 virtual ERRVALUE SerialRead (
01343 SERIALIZER& serializer
01344 );
01345
01347 virtual ERRVALUE SerialWrite (
01348 SERIALIZER& serializer,
01349 const char* itemname
01350 ) const;
01351
01352 void SetBackgroundColor (
01353 const COLOR& color
01354 ) {
01355 m_BGColor = color;
01356 return;
01357 }
01358
01361 void SetBorderStyle (
01362 const LINESTYLE& style
01363 ) {
01364 m_BorderStyle = style;
01365 return;
01366 }
01367
01369 void SetDrawBackground (
01370 bool DrawBackground
01371 ) {
01372 m_bDrawBackground = DrawBackground;
01373 return;
01374 }
01375
01378 void SetDrawBorder (
01379 bool DrawBorder
01380 ) {
01381 m_bDrawBorder = DrawBorder;
01382 return;
01383 }
01384
01387 void SetDrawDropShadow (
01388 bool DrawDropShadow
01389 ) {
01390 m_bDrawDropShadow = DrawDropShadow;
01391 return;
01392 }
01393
01395 void SetDropShadowColor (
01396 const COLOR& color
01397 ) {
01398 m_DropShadowColor= color;
01399 return;
01400 }
01401
01404 void SetDropShadowDirection (
01405 double angle
01406 ) {
01407 m_DropShadowDirection = angle;
01408 return;
01409 }
01410
01413 void SetDropShadowDistance (
01414 double distance
01415 ) {
01416 m_DropShadowDistance = distance;
01417 return;
01418 }
01419
01421 void SetHGuide (
01422 int GuideNum,
01423 DOUBLE value
01424 );
01425
01428 void SetLayoutNeeded (
01429 ) {
01430 m_bLayoutNeeded = m_bRedrawNeeded = true;
01431 Redraw();
01432 }
01433
01437 void SetRedrawNeeded (
01438 ) {
01439 m_bRedrawNeeded = true;
01440 Redraw();
01441 }
01442
01444
01445
01446
01447
01448
01449
01450
01452 void SetTextStyle (
01453 int num,
01454 const NAMEDTEXTSTYLE& style
01455 );
01456
01458 void SetTextStyleName (
01459 int num,
01460 const MIUNICODE* name
01461 ) {
01462 if (num < 0 || num >= GetNumTextStyles()) return;
01463 ucstrcpy(m_TextStyle[num].m_name, name);
01464 return;
01465 }
01466
01468 ERRVALUE SetTextStyles (
01469 const std::vector<NAMEDTEXTSTYLE>& styles
01470 );
01471
01477 ERRVALUE SetTextStyles (
01478 const std::vector<NAMEDTEXTSTYLE>& styles,
01479 const SIMPLE_ARRAY<INT32>& trans
01480 );
01481
01482
01484 void SetVGuide (
01485 int GuideNum,
01486 DOUBLE value
01487 );
01488
01489 bool UsesTransparency (
01490 const MGD::CONTEXT* gc = 0
01491 ) const;
01492
01493 protected:
01494
01495
01496 private:
01497
01498 friend class OBSERVER;
01499
01500 struct ITEMTYPE {
01501 const char* m_name;
01502 int (*m_Construct)(GRAPHICLAYOUT&, ITEM**);
01503 };
01504
01505 static ERRVALUE SerializerCB_Item (
01506 SERIALIZER& serializer,
01507 const SERIALIZERITEM *itemdef,
01508 void* cbdata,
01509 SERIALIZERITEM::ACTION action
01510 );
01511
01512 static ERRVALUE SerializerCB_NamedTextStyle (
01513 SERIALIZER& serializer,
01514 const SERIALIZERITEM* itemdef,
01515 void* cbdata,
01516 SERIALIZERITEM::ACTION action
01517 );
01518
01519 bool m_bLayoutNeeded;
01520 bool m_bRedrawNeeded;
01521 UINT32 m_NumHGuides;
01522 DOUBLE* m_HGuides;
01523 UINT32 m_NumVGuides;
01524 DOUBLE* m_VGuides;
01525 DRECT2D m_Extents;
01526 UINT32 m_RedrawSuspended;
01527 OBSERVERMANAGER m_Observers;
01528 ITEMLIST m_ItemList;
01529 LINESTYLE m_BorderStyle;
01530 bool m_bDrawBackground;
01531 bool m_bDrawBorder;
01532 bool m_bDrawDropShadow;
01533 COLOR m_DropShadowColor;
01534 COLOR m_BGColor;
01535 double m_DropShadowDirection;
01536 double m_DropShadowDistance;
01537 std::vector<NAMEDTEXTSTYLE> m_TextStyle;
01538 INT32 m_MaxGroup;
01539
01540 static SIMPLE_ARRAY<ITEMTYPE> s_ItemTypes;
01541
01544 GRAPHICLAYOUT& operator= (
01545 const GRAPHICLAYOUT& rhs
01546 );
01547
01548
01549 void DrawHandle (
01550 MGD::CONTEXT* gc,
01551 const DPOINT2D& GuideEnd,
01552 const DPOINT2D& ItemEnd
01553 ) const;
01554
01556 void Free (
01557 );
01558
01559 void SortHGuides (
01560 );
01561
01562 void SortVGuides (
01563 );
01564
01566 void Redraw (
01567 );
01568
01569 };
01570
01571
01572 #endif // INC_MI32_GRLAYOUT_H
01573