00001
00036 #ifndef INC_GRE_LEGEND_H
00037 #define INC_GRE_LEGEND_H
00038
00039 #ifndef INC_GRE_ELEMSAMPLEDC_H
00040 #include <gre/elemsampledc.h>
00041 #endif
00042
00043 #ifndef INC_RVC_ELEMENT_H
00044 #include <rvc/element.h>
00045 #endif
00046
00047 #ifndef INC_MI32_ELEMSTYL_H
00048 #include <mi32/elemstyl.h>
00049 #endif
00050
00051 #ifndef INC_MI32_COLORARRAY_H
00052 #include <mi32/colorarray.h>
00053 #endif
00054
00055 #if !defined(INC_MGUI_TREE_H) && defined(USE_MGUI)
00056 #include <mgui/tree.h>
00057 #endif
00058
00059 #ifndef GENERATING_DOXYGEN_OUTPUT
00060
00061 struct CBPARMS;
00062
00063 namespace MGUI {
00064 class CUSTOMDRAW_TREE;
00065 };
00066
00067 namespace RVC {
00068 class DBASE_ELEMENT;
00069 class DBTABLE;
00070 class DBTABLE_STYLE;
00071 class STYLE;
00072 };
00073
00074 #endif // GENERATING_DOXYGEN_OUTPUT
00075
00076
00077 namespace GRE {
00078
00079
00080 #define GRE_LEGENDVIEW_LabelSpace 4
00081 #define GRE_LEGENDVIEW_ItemSpace 2
00082
00084 class LEGEND {
00085 public:
00086
00087 class DRAWCONTEXT;
00088 class ITEMBASE;
00089 typedef MILIST<ITEMBASE*> ITEMLIST;
00090
00092 static void SetDftBackgroundColor (
00093 const COLOR& color
00094 ) { s_DftBackgroundColor = color; }
00095
00097 explicit LEGEND (
00098 GRE::LAYER *layer,
00099 ELEMTYPE ElemType
00100 );
00101
00103 virtual ~LEGEND ();
00104
00105 #ifdef USE_MGUI
00107 ERRVALUE AddElemPrompted (
00108 MDLGPARENT dlgparent,
00109 const RVC::ELEMENT& element
00110 ) { return (v_AddElemPrompted(dlgparent,element)); }
00111 #endif
00112
00114 bool ContainsElem (
00115 const RVC::ELEMENT& element
00116 ) const;
00117
00119 ERRVALUE CreateElemTable (
00120 const RVC::DESCRIPTOR& descriptor
00121 );
00122
00124 void DeleteAllItems (
00125 );
00126
00128 ERRVALUE DeleteElem (
00129 const RVC::ELEMENT& element
00130 );
00131
00133 void Draw (
00134 const DRAWCONTEXT& dc,
00135 LPOINT2D& origin
00136 ) const;
00137
00138 const COLOR& GetBackgroundColor (
00139 ) const { return (m_ColorBG); }
00140
00142 ELEMTYPE GetElemType (
00143 ) const { return (m_ElemType); }
00144
00146 const ITEMLIST& GetItemList (
00147 ) const { return (m_ItemList); }
00148
00151 void GetItemSizePixels (
00152 LPOINT2D& size
00153 ) const { v_GetItemSizePixels(size); }
00154
00156 GRE::LAYER* GetLayer (
00157 ) const { return (m_layer); }
00158
00160 bool GetNeedStyleObject (
00161 ) const { return (m_NeedStyleObj); }
00162
00165 MGD::STYLESAMPLEFLAGS GetSampleFlags (
00166 ) const { return (m_SampleFlags); }
00167
00170 LPOINT2D GetSize (
00171 const DRAWCONTEXT& dc
00172 ) const;
00173
00175 const RVC::OBJITEM& GetStyleObjItem (
00176 ) { return (m_StyleObjItem); }
00177
00179 bool HasElemTable (
00180 ) const;
00181
00183 bool HasItems (
00184 ) const { return (!m_ItemList.IsEmpty()); }
00185
00187 bool IsMergingDuplicateStyles (
00188 ) const { return (m_MergeDupStyles); }
00189
00191 bool IsSorted (
00192 ) const { return (m_Sorted); }
00193
00195 void SetBackgroundColor (
00196 const COLOR& color
00197 ) { m_ColorBG = color; }
00198
00200 void SetMergeDuplicateStyles (
00201 bool MergeDupStyles = true
00202 ) { m_MergeDupStyles = MergeDupStyles; }
00203
00205 void SetNeedStyleObject (
00206 bool NeedStyleObj = true
00207 ) { m_NeedStyleObj = NeedStyleObj; }
00208
00210 void SetSampleFlags (
00211 MGD::STYLESAMPLEFLAGS newflags
00212 ) { m_SampleFlags = newflags | MGD::STYLESAMPLE_ShrinkToFit; }
00213
00216 void SetSorted (
00217 bool sorted = true
00218 ) { m_Sorted = sorted; }
00219
00221 void SetStyleObject (
00222 const RVC::OBJITEM& StyleObj
00223 );
00224
00225 #ifdef USE_MGUI
00228 MGUI::CTRL_TREE::ITEMHND TreeViewInsertItems (
00229 GRE::CTRL_TREEVIEW& TreeView,
00230 MGUI::CTRL_TREE::ITEMHND hParent,
00231 MGUI::CTRL_TREE::ITEMHND hInsertAfter
00232 );
00233 #endif
00234
00235 protected:
00236
00237 ITEMLIST m_ItemList;
00238 RVC::OBJITEM m_GeoObjItem;
00239 RVC::DBASE_ELEMENT *m_pDbObject;
00240 RVC::DBTABLE *m_pElemTable;
00241
00242 ERRVALUE AddElemRecord (
00243 const RVC::ELEMENT& element,
00244 const MISTRING& prilabel,
00245 const MISTRING& seclabel
00246 );
00247
00248 void InsertItem (
00249 ITEMBASE *item
00250 );
00251
00252 ERRVALUE OpenElemTable (
00253 const RVC::OBJECTNAME& ElemTableName
00254 );
00255
00256 ERRVALUE OpenStyle (
00257 RVC::DBTABLE_STYLE& StyleTable,
00258 const RVC::OBJITEM& StyleObjItem,
00259 const RVC::OBJITEM& GeoObjItem,
00260 RVC::STYLE& StyleObj
00261 );
00262
00263 void SetHasMergedStyles (
00264 ) { m_HasMergedStyles = true; }
00265
00266 private:
00267 #ifndef GENERATING_DOXYGEN_OUTPUT
00268 static COLOR s_DftBackgroundColor;
00269 GRE::LAYER *m_layer;
00270 ELEMTYPE m_ElemType;
00271 bool m_Sorted;
00272 bool m_NeedStyleObj;
00273 bool m_MergeDupStyles;
00274 bool m_HasMergedStyles;
00275 MGD::STYLESAMPLEFLAGS m_SampleFlags;
00276 RVC::OBJITEM m_StyleObjItem;
00277 COLOR m_ColorBG;
00278
00279 LEGEND (const LEGEND&);
00280 LEGEND& operator= (const LEGEND&);
00281
00282 friend class DRAWCONTEXT;
00283 #endif // GENERATING_DOXYGEN_OUTPUT
00284
00285
00286
00287 #ifdef USE_MGUI
00290 virtual ERRVALUE v_AddElemPrompted (
00291 MDLGPARENT dlgparent,
00292 const RVC::ELEMENT& element
00293 );
00294 #endif
00295
00298 virtual void v_GetItemSizePixels (
00299 LPOINT2D& size
00300 ) const;
00301
00302 };
00303
00304
00306 class LEGEND::DRAWCONTEXT : public ELEMSAMPLE_DC {
00307 public:
00308
00311 enum ORIENTATION {
00312 ORIENTATION_Vertical = 0,
00313 ORIENTATION_Horizonatal = 1
00314 };
00315
00316 GRE::LAYER *m_layer;
00317 ELEMTYPE m_ElemType;
00318 INT32 m_itemheight;
00319 INT32 m_samplewidth;
00320 INT32 m_labelspace;
00321 INT32 m_itemspace;
00322 LRECT2D m_cliprect;
00323 bool m_DrawLabels;
00324 bool m_DrawLabelsOnColorScales;
00325 bool m_HasTextStyle;
00326 TEXTSTYLE m_TextStyle;
00327 ORIENTATION m_Orientation;
00328
00330 DRAWCONTEXT (
00331 const LEGEND& legend,
00332 MGD::CONTEXT *gc,
00333 INT32 labelspace,
00334 INT32 itemspace,
00335 const LRECT2D& cliprect
00336 );
00337
00338 virtual ~DRAWCONTEXT ();
00339
00341 bool IsVertical (
00342 ) const { return (m_Orientation == ORIENTATION_Vertical); }
00343
00345 void SetDrawLabels (
00346 bool DrawLabels
00347 ) { m_DrawLabels = DrawLabels; }
00348
00349 };
00350
00351
00353 class LEGEND::ITEMBASE {
00354 public:
00355
00357 ITEMBASE (
00358 LEGEND& legend
00359 );
00360
00362 ITEMBASE (
00363 LEGEND& legend,
00364 const MISTRING& label
00365 );
00366
00368 ITEMBASE (
00369 LEGEND& legend,
00370 const RVC::ELEMENT& element,
00371 const MISTRING& label
00372 );
00373
00375 virtual ~ITEMBASE ();
00376
00378 void Draw (
00379 const DRAWCONTEXT& dc,
00380 const LRECT2D& samplerect
00381 ) const { v_Draw(dc,samplerect); }
00382
00384 void DrawLabel (
00385 const DRAWCONTEXT& dc,
00386 const LRECT2D& samplerect
00387 ) const;
00388
00390 const RVC::ELEMENT& GetElement (
00391 ) const { return (m_element); }
00392
00394 ELEMNUM GetElemNum (
00395 ) const { return (m_element.GetNumber()); }
00396
00398 const MISTRING& GetLabel (
00399 ) const { return (m_label); }
00400
00402 void GetLabelSize (
00403 const DRAWCONTEXT& dc,
00404 LPOINT2D& size
00405 ) const;
00406
00408 LEGEND& GetLegend (
00409 ) { return (m_legend); }
00410
00412 const LEGEND& GetLegend (
00413 ) const { return (m_legend); }
00414
00416 bool HasTransparency (
00417 ) const { return (v_HasTransparency()); };
00418
00420 void MergeLabel (
00421 const MISTRING& label
00422 );
00423
00425 void SetLabel (
00426 const MISTRING& label
00427 ) { m_label = label; }
00428
00429 #ifdef USE_MGUI
00431 MGUI::CTRL_TREE::ITEMHND TreeViewInsertItem (
00432 GRE::CTRL_TREEVIEW& TreeView,
00433 MGUI::CTRL_TREE::ITEMHND hndParent,
00434 MGUI::CTRL_TREE::ITEMHND hndInsertAfter
00435 );
00436 #endif
00437
00438 private:
00439 #ifndef GENERATING_DOXYGEN_OUTPUT
00440 LEGEND& m_legend;
00441 RVC::ELEMENT m_element;
00442 MISTRING m_label;
00443
00444 #ifdef USE_MGUI
00446 MGUI::CUSTOMDRAW::RETVALUE TreeViewOnCustomDraw (
00447 GRE::CTRL_TREEVIEW& TreeView,
00448 MGUI::CUSTOMDRAW_TREE& CustomDraw
00449 );
00450 #endif
00451
00452 ITEMBASE (const ITEMBASE&);
00453 ITEMBASE& operator= (const ITEMBASE&);
00454 #endif // GENERATING_DOXYGEN_OUTPUT
00455
00456
00457
00459 virtual void v_Draw (
00460 const DRAWCONTEXT& dc,
00461 const LRECT2D& samplerect
00462 ) const = 0;
00463
00465 virtual bool v_HasTransparency (
00466 ) const;
00467
00468 #ifdef USE_MGUI
00470 virtual void v_TreeViewCustomDraw (
00471 GRE::CTRL_TREEVIEW& TreeView,
00472 MGUI::CUSTOMDRAW_TREE& CustomDraw
00473 ) = 0;
00474 #endif
00475
00476 };
00477
00478
00479
00480
00482 class LEGEND_POINT : public LEGEND {
00483 public:
00484
00485 class ITEM;
00486
00488 LEGEND_POINT (
00489 GRE::LAYER *layer,
00490 ELEMTYPE ElemType
00491 );
00492
00494 void AddItem (
00495 const POINTSTYLE& style,
00496 const MISTRING& label
00497 );
00498
00500 void AddItem (
00501 const RVC::ELEMENT& element,
00502 const MISTRING& label
00503 );
00504
00505 ERRVALUE Setup (
00506 const POINTPARMS& parms,
00507 const RVC::OBJITEM& GeoObjItem,
00508 const RVC::OBJITEM& StyleObjItem
00509 );
00510
00511 private:
00512 #ifndef GENERATING_DOXYGEN_OUTPUT
00513
00514
00515 #ifdef USE_MGUI
00516 virtual ERRVALUE v_AddElemPrompted (MDLGPARENT dlgparent, const RVC::ELEMENT& element);
00517 #endif
00518
00519 LEGEND_POINT (const LEGEND_POINT&);
00520 LEGEND_POINT& operator= (const LEGEND_POINT&);
00521 #endif // GENERATING_DOXYGEN_OUTPUT
00522 };
00523
00524
00526 class LEGEND_POINT::ITEM : public LEGEND::ITEMBASE {
00527 public:
00528
00530 ITEM (
00531 LEGEND_POINT& legend,
00532 const POINTSTYLE& style,
00533 const MISTRING& label
00534 );
00535
00537 ITEM (
00538 LEGEND_POINT& legend,
00539 const RVC::ELEMENT& element,
00540 const MISTRING& label
00541 );
00542
00544 virtual ~ITEM ();
00545
00547 const POINTSTYLE& GetStyle (
00548 ) const { return (m_style); }
00549
00551 bool HasSameStyle (
00552 const POINTSTYLE& style
00553 ) const;
00554
00555 private:
00556 #ifndef GENERATING_DOXYGEN_OUTPUT
00557
00558
00559 virtual void v_Draw (const DRAWCONTEXT& dc, const LRECT2D& samplerect) const;
00560 virtual bool v_HasTransparency () const;
00561 #ifdef USE_MGUI
00562 virtual void v_TreeViewCustomDraw (CTRL_TREEVIEW& TreeView, MGUI::CUSTOMDRAW_TREE& CustomDraw);
00563 #endif
00564
00565 POINTSTYLE m_style;
00566 ITEM (const ITEM&);
00567 ITEM& operator= (const ITEM&);
00568 #endif // GENERATING_DOXYGEN_OUTPUT
00569 };
00570
00571
00572
00573
00575 class LEGEND_LINE : public LEGEND {
00576 public:
00577
00578 class ITEM;
00579
00581 LEGEND_LINE (
00582 GRE::LAYER *layer,
00583 ELEMTYPE ElemType
00584 );
00585
00587 void AddItem (
00588 const LINESTYLE& style,
00589 const MISTRING& label
00590 );
00591
00593 void AddItem (
00594 const RVC::ELEMENT& element,
00595 const MISTRING& label
00596 );
00597
00598 ERRVALUE Setup (
00599 const LINEPARMS& parm,
00600 const RVC::OBJITEM& GeoObjItem,
00601 const RVC::OBJITEM& StyleObjItem
00602 );
00603
00604 private:
00605 #ifndef GENERATING_DOXYGEN_OUTPUT
00606
00607
00608 #ifdef USE_MGUI
00609 virtual ERRVALUE v_AddElemPrompted (MDLGPARENT dlgparent, const RVC::ELEMENT& element);
00610 #endif
00611
00612 LEGEND_LINE (const LEGEND_LINE&);
00613 LEGEND_LINE& operator= (const LEGEND_LINE&);
00614 #endif // GENERATING_DOXYGEN_OUTPUT
00615 };
00616
00618 class LEGEND_LINE::ITEM : public LEGEND::ITEMBASE {
00619 public:
00620
00622 ITEM (
00623 LEGEND_LINE& legend,
00624 const LINESTYLE& style,
00625 const MISTRING& label
00626 );
00627
00629 ITEM (
00630 LEGEND_LINE& legend,
00631 const RVC::ELEMENT& element,
00632 const MISTRING& label
00633 );
00634
00636 virtual ~ITEM ();
00637
00639 const LINESTYLE& GetStyle (
00640 ) const { return (m_style); };
00641
00643 bool HasSameStyle (
00644 const LINESTYLE& style
00645 ) const;
00646
00647 private:
00648 #ifndef GENERATING_DOXYGEN_OUTPUT
00649
00650
00651 virtual void v_Draw (const DRAWCONTEXT& dc, const LRECT2D& samplerect) const;
00652 virtual bool v_HasTransparency () const;
00653 #ifdef USE_MGUI
00654 virtual void v_TreeViewCustomDraw (CTRL_TREEVIEW& TreeView, MGUI::CUSTOMDRAW_TREE& CustomDraw);
00655 #endif
00656
00657 LINESTYLE m_style;
00658 ITEM (const ITEM&);
00659 ITEM& operator= (const ITEM&);
00660 #endif // GENERATING_DOXYGEN_OUTPUT
00661 };
00662
00663
00664
00666 class LEGEND_POLYGON : public LEGEND {
00667 public:
00668
00669 class ITEM;
00670
00672 LEGEND_POLYGON (
00673 GRE::LAYER *layer,
00674 ELEMTYPE ElemType
00675 );
00676
00678 void AddItem (
00679 const POLYSTYLE& style,
00680 const MISTRING& label,
00681 const MISTRING& intlabel
00682 );
00683
00685 void AddItem (
00686 const RVC::ELEMENT& element,
00687 const MISTRING& label,
00688 const MISTRING& intlabel
00689 );
00690
00691 ERRVALUE Setup (
00692 const POLYPARMS& parm,
00693 const RVC::OBJITEM& GeoObjItem,
00694 const RVC::OBJITEM& StyleObjItem
00695 );
00696
00697 private:
00698 #ifndef GENERATING_DOXYGEN_OUTPUT
00699
00700
00701 #ifdef USE_MGUI
00702 virtual ERRVALUE v_AddElemPrompted (MDLGPARENT dlgparent, const RVC::ELEMENT& element);
00703 #endif
00704
00705 LEGEND_POLYGON (const LEGEND_POLYGON&);
00706 LEGEND_POLYGON& operator= (const LEGEND_POLYGON&);
00707 #endif // GENERATING_DOXYGEN_OUTPUT
00708 };
00709
00711 class LEGEND_POLYGON::ITEM : public LEGEND::ITEMBASE {
00712 public:
00713
00715 ITEM (
00716 LEGEND_POLYGON& legend,
00717 const POLYSTYLE& style,
00718 const MISTRING& label,
00719 const MISTRING& intlabel
00720 );
00721
00723 ITEM (
00724 LEGEND_POLYGON& legend,
00725 const RVC::ELEMENT& element,
00726 const MISTRING& label,
00727 const MISTRING& intlabel
00728 );
00729
00731 virtual ~ITEM ();
00732
00734 const POLYSTYLE& GetStyle (
00735 ) const { return (m_style); }
00736
00738 bool HasSameStyle (
00739 const POLYSTYLE& style
00740 ) const;
00741
00742 private:
00743 #ifndef GENERATING_DOXYGEN_OUTPUT
00744 POLYSTYLE m_style;
00745 MISTRING m_intlabel;
00746
00747
00748 void DrawInteriorLabel (
00749 const DRAWCONTEXT& cd,
00750 const LRECT2D& samplerect
00751 ) const;
00752
00753
00754 virtual void v_Draw (const DRAWCONTEXT& dc, const LRECT2D& samplerect) const;
00755 virtual bool v_HasTransparency () const;
00756 #ifdef USE_MGUI
00757 virtual void v_TreeViewCustomDraw (CTRL_TREEVIEW& TreeView, MGUI::CUSTOMDRAW_TREE& CustomDraw);
00758 #endif
00759
00760 ITEM (const ITEM&);
00761 ITEM& operator= (const ITEM&);
00762 #endif // GENERATING_DOXYGEN_OUTPUT
00763 };
00764
00765
00766
00768 class LEGEND_COLORSAMPLE : public LEGEND {
00769 public:
00770
00771 class ITEM;
00772
00774 LEGEND_COLORSAMPLE (
00775 GRE::LAYER *layer
00776 );
00777
00779 void AddItem (
00780 const COLOR& color,
00781 const MISTRING& label
00782 );
00783
00784 private:
00785 #ifndef GENERATING_DOXYGEN_OUTPUT
00786 LEGEND_COLORSAMPLE (const LEGEND_COLORSAMPLE&);
00787 LEGEND_COLORSAMPLE& operator= (const LEGEND_COLORSAMPLE&);
00788 #endif // GENERATING_DOXYGEN_OUTPUT
00789 };
00790
00791 class LEGEND_COLORSAMPLE::ITEM : public LEGEND::ITEMBASE {
00792 public:
00793
00795 ITEM (
00796 LEGEND_COLORSAMPLE& legend,
00797 const COLOR& color,
00798 const MISTRING& label
00799 );
00800
00802 virtual ~ITEM ();
00803
00805 const COLOR& GetColor (
00806 ) const { return (m_color); }
00807
00809 bool HasSameStyle (
00810 const COLOR& color
00811 ) const;
00812
00813 private:
00814 #ifndef GENERATING_DOXYGEN_OUTPUT
00815 COLOR m_color;
00816
00817
00818 virtual void v_Draw (const DRAWCONTEXT& dc, const LRECT2D& samplerect) const;
00819 #ifdef USE_MGUI
00820 virtual void v_TreeViewCustomDraw (CTRL_TREEVIEW& TreeView, MGUI::CUSTOMDRAW_TREE& CustomDraw);
00821 #endif
00822
00823 ITEM (const ITEM&);
00824 ITEM& operator= (const ITEM&);
00825 #endif // GENERATING_DOXYGEN_OUTPUT
00826 };
00827
00828
00829
00831 class LEGEND_COLORSCALE : public LEGEND {
00832 public:
00833
00834 class ITEM;
00835
00837 LEGEND_COLORSCALE (
00838 GRE::LAYER *layer
00839 );
00840
00842 void SetLabel (
00843 const MISTRING& label
00844 );
00845
00847 void SetLength (
00848 int length
00849 );
00850
00853 void SetValues (
00854 const COLOR_ARRAY& palette,
00855 double MinValue,
00856 double MaxValue,
00857 bool VerticalMinAtTop
00858 );
00859
00862 void SetValues (
00863 const COLOR_ARRAY& palette,
00864 const CBPARMS& ColorBalance,
00865 double MinValue,
00866 double MaxValue,
00867 bool VerticalMinAtTop
00868 );
00869
00870 private:
00871 #ifndef GENERATING_DOXYGEN_OUTPUT
00872
00873
00874 virtual void v_GetItemSizePixels (LPOINT2D& size) const;
00875
00876 LEGEND_COLORSCALE (const LEGEND_COLORSCALE&);
00877 LEGEND_COLORSCALE& operator= (const LEGEND_COLORSCALE&);
00878 #endif // GENERATING_DOXYGEN_OUTPUT
00879 };
00880
00881
00882 }
00883
00884 #endif // INC_LEGEND_H