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
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #ifndef INC_GRE_LABELPLACEMENT_H
00070 #define INC_GRE_LABELPLACEMENT_H
00071
00072 #ifndef INC_RVC_ELEMENT_H
00073 #include <rvc/element.h>
00074 #endif
00075
00076 #ifndef INC_MI32_TEXTBASE_H
00077 #include <mi32/textbase.h>
00078 #endif
00079
00080 #ifndef INC_MI32_POLYLINE_H
00081 #include <mi32/polyline.h>
00082 #endif
00083
00084
00085 #ifndef GENERATING_DOXYGEN_OUTPUT
00086
00087 class LABELSTYLE;
00088 class QUADTREE;
00089 class REGION2D;
00090 struct COLOR;
00091 struct LINESTYLE;
00092 struct POINTSTYLE;
00093 namespace MGD {
00094 class CONTEXT;
00095 }
00096 namespace RVC {
00097 class STYLEPATTERN_BASE;
00098 }
00099 namespace GRE {
00100 class LAYER;
00101 class LAYERDC;
00102 class VIEW;
00103 class LABELPLACEMENT;
00104 }
00105 #endif
00106
00107
00108 namespace GRE {
00109
00110 class LABELATTACHMENT {
00111 public:
00113 LABELATTACHMENT (
00114 ) { }
00115
00117 LABELATTACHMENT (
00118 const RVC::ELEMENT& elem
00119 ) :
00120 m_elem(elem)
00121 { }
00122
00124 LABELATTACHMENT (
00125 const LABELATTACHMENT& rhs
00126 ) :
00127 m_elem(rhs.m_elem),
00128 m_leader(rhs.m_leader)
00129 { }
00130
00132 LABELATTACHMENT (
00133 const RVC::ELEMENT& elem,
00134 const POLYLINE& leader
00135 ) :
00136 m_elem(elem),
00137 m_leader(leader)
00138 { }
00139
00140 ~LABELATTACHMENT()
00141 { }
00142
00143 const RVC::ELEMENT& GetElement (
00144 ) const { return (m_elem); }
00145
00146 const POLYLINE& GetLeader (
00147 ) const { return (m_leader); }
00148
00149 void SetElement (
00150 const RVC::ELEMENT& elem
00151 ) { m_elem = elem; }
00152
00153 void SetLeader (
00154 const POLYLINE& leader
00155 ) { m_leader = leader; }
00156
00157 private:
00158 #ifndef GENERATING_DOXYGEN_OUTPUT
00159 RVC::ELEMENT m_elem;
00160 POLYLINE m_leader;
00161 #endif
00162 };
00163
00165 class LABELPLACE {
00166 public:
00168 LABELPLACE();
00169
00171 LABELPLACE (
00172 const LABELPLACE& rhs
00173 );
00174
00175
00176 ~LABELPLACE();
00177
00179 LABELPLACE& operator=(
00180 const LABELPLACE& rhs
00181 );
00182
00183
00184
00185
00186 void ComputeLabelExtents (
00187 MGD::CONTEXT* gc,
00188 REGION2D& region,
00189 bool bIgnoreLeaders = false
00190 ) const;
00191
00193 void DeleteAttachment (
00194 const RVC::ELEMENT& element
00195 );
00196
00197
00198
00199
00200
00201 void Detach (
00202 );
00203
00205 ERRVALUE Draw (
00206 LAYERDC* pDC,
00207 const COLOR* ForegroundColor = 0
00208 ) const;
00209
00211 ERRVALUE DrawSample (
00212 MGD::CONTEXT& gc,
00213 const COLOR* ForegroundColor = 0,
00214 bool bDrawLeaders = true
00215 ) const;
00216
00218 const MILIST<LABELATTACHMENT>& GetAttachments (
00219 ) const;
00220
00221 double GetBaseAngle () const;
00222
00223 const POLYLINE& GetBaseLine () const;
00224
00225 TEXTBASEORIGIN GetBaseOrigin () const;
00226
00227 const DPOINT2D& GetBasePoint () const;
00228
00229 bool GetDrawBaseLine () const;
00230
00233 bool GetBaseLineStyle (
00234 LINESTYLE&
00235 ) const;
00236
00240 LAYER* GetLayer (
00241 ) const;
00242
00245 const DPOINT2D& GetOffset (
00246 ) const;
00247
00250 const DPOINT2D& GetSymbolPoint (
00251 ) const;
00252
00254 const POINTSTYLE& GetPointStyle (
00255 ) const;
00256
00258 const SIMPLE_ARRAY<UINT8>& GetPointSymbol (
00259 ) const;
00260
00263 double GetPriority (
00264 ) const;
00265
00267 const REGION2D& GetRegion (
00268 ) const;
00269
00270 const LABELSTYLE& GetStyle (
00271 ) const;
00272
00273 const MISTRING& GetText (
00274 ) const;
00275
00277 bool HasPoint (
00278 ) const;
00279
00281 bool HasText (
00282 ) const;
00283
00285 bool IsAttached (
00286 ELEMTYPE ElemType,
00287 INT32 ElemNum
00288 ) const;
00289
00291 bool IsAttached (
00292 const RVC::ELEMENT& elem
00293 ) const;
00294
00297 bool IsLocked (
00298 ) const;
00299
00302 void LockPosition (
00303 bool locked = true
00304 );
00305
00307 void Move (
00308 const DPOINT2D& delta
00309 );
00310
00312 void AddAttachment (
00313 const LABELATTACHMENT& attachment
00314 );
00315
00317 void AddAttachment (
00318 const RVC::ELEMENT& element
00319 );
00320
00321 void SetBaseLine (
00322 const POLYLINE& baseline
00323 );
00324
00325 void SetBaseLine (
00326 const DPOINT2D& pt,
00327 double angle,
00328 TEXTBASEORIGIN origin
00329 );
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 void SetCopyOnWrite (
00340 bool bCopyOnWrite = true
00341 ) {
00342 m_bCopyOnWrite = bCopyOnWrite;
00343 }
00344
00345 void SetDrawBaseLine (
00346 bool draw = true
00347 );
00348
00350 void SetBaseLineStyle (
00351 const LINESTYLE& style
00352 );
00353
00356 void SetPoint (
00357 const DPOINT2D& location
00358 );
00359
00361 void SetPointStyle (
00362 const POINTSTYLE& style
00363 );
00364
00366 void SetPointSymbol (
00367 const SIMPLE_ARRAY<UINT8>& symbol
00368 );
00369
00371 void SetPointSymbol (
00372 const RVC::STYLEPATTERN_BASE& symbol
00373 );
00374
00377 void SetPriority (
00378 double priority
00379 );
00380
00382 void SetRegion (
00383 const REGION2D& region
00384 );
00385
00386 void SetStyle (
00387 const LABELSTYLE& style
00388 );
00389
00390 void SetText (
00391 const MISTRING& str
00392 );
00393
00394
00395 void SetParent (
00396 GRE::LABELPLACEMENT* parent
00397 );
00398
00399 GRE::LABELPLACEMENT* GetParent (
00400 ) const;
00401
00402
00403
00404
00405
00406
00407 const MIUNICODE* GetUserString (
00408 ) const;
00409
00414 void SetUserString (
00415 const MISTRING& str
00416 );
00417
00418 void Zoom (
00419 double scale
00420 );
00421
00424 void SetID (
00425 INT32 id
00426 );
00427
00428 private:
00429 #ifndef GENERATING_DOXYGEN_OUTPUT
00430 class PRIV;
00431 PRIV *m_priv;
00432 bool m_bCopyOnWrite;
00433 #endif
00434 };
00435
00436 typedef MILIST<LABELPLACE> LABELPLACELIST;
00437
00438
00439 class LABELPLACEMENT {
00440 public:
00441 class ITERATOR;
00442 class CONST_ITERATOR;
00443 friend class CONST_ITERATOR;
00444
00445 class CONST_ITERATOR {
00446 public:
00447
00449 CONST_ITERATOR (
00450 ) :
00451 m_placement(0),
00452 m_num(-1)
00453 { }
00454
00456 virtual ~CONST_ITERATOR() {};
00457
00459 CONST_ITERATOR (
00460 const CONST_ITERATOR& rhs
00461 ) :
00462 m_placement(rhs.m_placement),
00463 m_place(rhs.m_place),
00464 m_num(rhs.m_num)
00465 { }
00466
00468 CONST_ITERATOR (
00469 LABELPLACEMENT* placement
00470 ) :
00471 m_placement(placement),
00472 m_num(-1)
00473 { ReadNext(true); }
00474
00476 const LABELPLACE& operator* (
00477 ) const { return (m_place); }
00478
00480 const LABELPLACE* operator-> (
00481 ) const { return (&**this); }
00482
00484 CONST_ITERATOR& operator++ (
00485 ) { ReadNext(true); return *this; }
00486
00488 CONST_ITERATOR operator++ (int
00489 ) {
00490 CONST_ITERATOR temp = *this;
00491 ++*this;
00492 return(temp);
00493 }
00494
00496 CONST_ITERATOR& operator-- (
00497 ) {
00498 ReadPrev(true);
00499 return *this;
00500 }
00501
00503 CONST_ITERATOR operator--(int
00504 ) {
00505 CONST_ITERATOR temp = *this;
00506 --*this;
00507 return(temp);
00508 }
00509
00511 bool operator== (
00512 const CONST_ITERATOR& rhs
00513 ) const {
00514 if (m_num == -1 && rhs.m_num == -1) return (true);
00515 return (m_num == rhs.m_num && m_placement == rhs.m_placement);
00516 }
00517
00519 bool operator!= (
00520 const CONST_ITERATOR& rhs
00521 ) const { return (!(*this == rhs)); }
00522
00523 protected:
00524 #ifndef GENERATING_DOXYGEN_OUTPUT
00525 LABELPLACEMENT* m_placement;
00526 LABELPLACE m_place;
00527 int m_num;
00528 void ReadPrev (bool bIsConst);
00529 void ReadNext (bool bIsConst);
00530 #endif
00531 };
00532
00533 friend class ITERATOR;
00534 class ITERATOR : public CONST_ITERATOR {
00535 public:
00536 ITERATOR();
00537
00539 ITERATOR(LABELPLACEMENT* placement) :
00540 CONST_ITERATOR(placement)
00541 { }
00542
00544 LABELPLACE& operator* (
00545 ) { return (m_place); }
00546
00548 LABELPLACE* operator-> (
00549 ) { return (&**this); }
00550
00552 ITERATOR& operator++() {
00553 ReadNext(false);
00554 return (*this);
00555 }
00556
00558 ITERATOR operator++(int
00559 ) {
00560 ITERATOR temp = *this;
00561 ++*this;
00562 return(temp);
00563 }
00564
00566 ITERATOR& operator--() {
00567 ReadPrev(false);
00568 return (*this);
00569 };
00570
00572 ITERATOR operator--(int
00573 ) {
00574 ITERATOR temp = *this;
00575 --*this;
00576 return(temp);
00577 }
00578
00580 bool operator== (
00581 const ITERATOR& rhs
00582 ) const;
00583
00585 bool operator!= (
00586 const ITERATOR& rhs
00587 ) const { return (!(*this == rhs)); }
00588 };
00589
00592 static ERRVALUE Deconflict (
00593 SIMPLE_ARRAY<LABELPLACEMENT*>& LabelSets
00594 );
00595
00597 LABELPLACEMENT (
00598 LAYER* layer,
00599 VIEW* view
00600 );
00601
00603 virtual ~LABELPLACEMENT ();
00604
00606 ERRVALUE Add (
00607 const LABELPLACE& place
00608 );
00609
00611 CONST_ITERATOR Begin (
00612 ) const { return (CONST_ITERATOR(const_cast<LABELPLACEMENT*>(this))); }
00613
00615 void Clear ();
00616
00620 void DeleteLabels (
00621 const RVC::ELEMENT& element
00622 );
00623
00625 CONST_ITERATOR End (
00626 ) const { return (CONST_ITERATOR(0)); }
00627
00636 INT32 Find (
00637 const DPOINT2D& pt,
00638 GRE::LABELPLACE& place,
00639 int maxdist = 0
00640 ) const;
00641
00646 INT32 Find (
00647 const DPOINT2D& pt,
00648 MILIST<GRE::LABELPLACE*>& list,
00649 int maxdist = 0
00650 ) const;
00651
00656 INT32 Find (
00657 const DRECT2D& rect,
00658 MILIST<GRE::LABELPLACE*>& list
00659 ) const;
00660
00665 INT32 Find (
00666 const REGION2D& region,
00667 MILIST<GRE::LABELPLACE*>& list
00668 ) const;
00669
00677 ERRVALUE GetCombinedRegion (
00678 REGION2D& region,
00679 bool bClear = true
00680 ) const;
00681
00684 bool GetLabelPlace (
00685 const RVC::ELEMENT& elem,
00686 GRE::LABELPLACE& place
00687 ) const;
00688
00691 bool GetLabelPlaces (
00692 const RVC::ELEMENT& elem,
00693 LABELPLACELIST& places
00694 ) const;
00695
00696 LAYER* GetLayer () const;
00697
00698 int GetNumItems () const;
00699
00700 VIEW* GetView () const;
00701
00702 private:
00703
00710 virtual bool v_CompareLabels (
00711 const RVC::ELEMENT& elem1,
00712 const RVC::ELEMENT& elem2
00713 ) const;
00714
00715 #ifndef GENERATING_DOXYGEN_OUTPUT
00716 class PRIV;
00717 PRIV *m_priv;
00718
00719 protected:
00720
00721 GRE::LABELPLACE* GetItem (
00722 int num
00723 );
00724 public:
00725
00726 QUADTREE& GetQuadTree();
00727
00728 #endif // GENERATING_DOXYGEN_OUTPUT
00729 };
00730
00731
00732 }
00733
00734
00735 #endif // INC_GRE_LABELPLACEMENT_H
00736