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
00070
00071
00072
00073
00074
00075 #ifndef INC_GRE_LABELPLACEMENT_H
00076 #define INC_GRE_LABELPLACEMENT_H
00077
00078
00079 #ifndef INC_RVC_ELEMENT_H
00080 #include <rvc/element.h>
00081 #endif
00082
00083 #ifndef INC_MI32_REGION2D_H
00084 #include <mi32/region2d.h>
00085 #endif
00086
00087 #ifndef INC_MI32_ELEMSTYL_H
00088 #include <mi32/elemstyl.h>
00089 #endif
00090
00091 #ifndef INC_MI32_TEXTBASE_H
00092 #include <mi32/textbase.h>
00093 #endif
00094
00095 #ifndef INC_MI32_QTREE_H
00096 #include <mi32/qtree.h>
00097 #endif
00098
00099 #ifndef INC_RVC_STYLE_H
00100 #include <rvc/style.h>
00101 #endif
00102
00103
00104 class LABELSTYLE;
00105 class GRE_LAYER;
00106 class GRE_LAYERDC;
00107 class GRE_VIEW;
00108 class QUADTREE;
00109 struct LINESTYLE;
00110
00111 namespace MGD {
00112 class CONTEXT;
00113 }
00114
00115 namespace GRE {
00116 class LABELPLACEMENT;
00117
00118 class LABELATTACHMENT {
00119 public:
00120
00121 LABELATTACHMENT (
00122 ) { }
00123
00124
00125 LABELATTACHMENT (
00126 const RVC::ELEMENT& elem
00127 ) :
00128 m_elem(elem)
00129 {
00130 }
00131
00132
00133 LABELATTACHMENT (
00134 const LABELATTACHMENT& rhs
00135 ) :
00136 m_elem(rhs.m_elem),
00137 m_leader(rhs.m_leader)
00138 {
00139 }
00140
00141
00142 LABELATTACHMENT (
00143 const RVC::ELEMENT& elem,
00144 const POLYLINE& leader
00145 ) :
00146 m_elem(elem),
00147 m_leader(leader)
00148 {
00149 }
00150
00151 ~LABELATTACHMENT() {}
00152
00153 const RVC::ELEMENT& GetElement (
00154 ) const {
00155 return (m_elem);
00156 }
00157
00158 const POLYLINE& GetLeader (
00159 ) const {
00160 return (m_leader);
00161 }
00162
00163 void SetElement (
00164 const RVC::ELEMENT& elem
00165 ) {
00166 m_elem = elem;
00167 }
00168
00169 void SetLeader (
00170 const POLYLINE& leader
00171 ) {
00172 m_leader = leader;
00173 }
00174
00175 private:
00176 RVC::ELEMENT m_elem;
00177 POLYLINE m_leader;
00178
00179 };
00180
00181
00182
00183
00184
00185
00186
00187 class LABELPLACE {
00188 public:
00189
00190 LABELPLACE();
00191
00192
00193 LABELPLACE (
00194 const LABELPLACE& rhs
00195 );
00196
00197
00198 ~LABELPLACE();
00199
00200
00201 LABELPLACE& operator=(
00202 const LABELPLACE& rhs
00203 );
00204
00205
00206
00207
00208 void ComputeLabelExtents (
00209 MGD::CONTEXT* gc,
00210 REGION2D& region,
00211 bool bIgnoreLeaders = false
00212 ) const;
00213
00214
00215 void DeleteAttachment (
00216 const RVC::ELEMENT& element
00217 );
00218
00219
00220
00221
00222
00223 void Detach (
00224 );
00225
00226
00227 ERRVALUE Draw (
00228 GRE_LAYERDC* pDC,
00229 const COLOR* ForegroundColor = 0
00230 ) const;
00231
00232
00233 ERRVALUE DrawSample (
00234 MGD::CONTEXT& gc,
00235 const COLOR* ForegroundColor = 0,
00236 bool bDrawLeaders = true
00237 ) const;
00238
00239
00240 const MILIST<LABELATTACHMENT>& GetAttachments (
00241 ) const;
00242
00243 double GetBaseAngle (
00244 ) const;
00245
00246 const POLYLINE& GetBaseLine (
00247 ) const;
00248
00249 TEXTBASEORIGIN GetBaseOrigin (
00250 ) const;
00251
00252 const DPOINT2D& GetBasePoint (
00253 ) const;
00254
00255 bool GetDrawBaseLine (
00256 ) const;
00257
00258
00259
00260 bool GetBaseLineStyle (
00261 LINESTYLE&
00262 ) const;
00263
00264
00265
00266
00267 GRE_LAYER* GetLayer (
00268 ) const;
00269
00270
00271
00272 const DPOINT2D& GetOffset (
00273 ) const;
00274
00275
00276
00277 const DPOINT2D& GetSymbolPoint (
00278 ) const;
00279
00280
00281 const POINTSTYLE& GetPointStyle (
00282 ) const;
00283
00284
00285 const SIMPLE_ARRAY<UINT8>& GetPointSymbol (
00286 ) const;
00287
00288
00289
00290 double GetPriority (
00291 ) const;
00292
00293
00294 const REGION2D& GetRegion (
00295 ) const;
00296
00297 const LABELSTYLE& GetStyle (
00298 ) const;
00299
00300 const MISTRING& GetText (
00301 ) const;
00302
00303
00304 bool HasPoint (
00305 ) const;
00306
00307
00308 bool HasText (
00309 ) const;
00310
00311
00312 bool IsAttached (
00313 ELEMTYPE ElemType,
00314 INT32 ElemNum
00315 ) const;
00316
00317
00318 bool IsAttached (
00319 const RVC::ELEMENT& elem
00320 ) const;
00321
00322
00323
00324 bool IsLocked (
00325 ) const;
00326
00327
00328
00329 void LockPosition (
00330 bool locked = true
00331 );
00332
00333
00334 void Move (
00335 const DPOINT2D& delta
00336 );
00337
00338
00339 void AddAttachment (
00340 const LABELATTACHMENT& attachment
00341 );
00342
00343
00344 void AddAttachment (
00345 const RVC::ELEMENT& element
00346 );
00347
00348 void SetBaseLine (
00349 const POLYLINE& baseline
00350 );
00351
00352 void SetBaseLine (
00353 const DPOINT2D& pt,
00354 double angle,
00355 TEXTBASEORIGIN origin
00356 );
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366 void SetCopyOnWrite (
00367 bool bCopyOnWrite = true
00368 ) {
00369 m_bCopyOnWrite = bCopyOnWrite;
00370 }
00371
00372 void SetDrawBaseLine (
00373 bool draw = true
00374 );
00375
00376
00377 void SetBaseLineStyle (
00378 const LINESTYLE& style
00379 );
00380
00381
00382
00383 void SetPoint (
00384 const DPOINT2D& location
00385 );
00386
00387
00388 void SetPointStyle (
00389 const POINTSTYLE& style
00390 );
00391
00392
00393 void SetPointSymbol (
00394 const SIMPLE_ARRAY<UINT8>& symbol
00395 );
00396
00397
00398 void SetPointSymbol (
00399 const RVC::STYLE::SYMBOLPATTERN& symbol
00400 );
00401
00402
00403
00404 void SetPriority (
00405 double priority
00406 );
00407
00408
00409 void SetRegion (
00410 const REGION2D& region
00411 );
00412
00413 void SetStyle (
00414 const LABELSTYLE& style
00415 );
00416
00417 void SetText (
00418 const MISTRING& str
00419 );
00420
00421 #if !defined(GENERATING_DOXYGEN_OUTPUT)
00422
00423 void SetParent (
00424 GRE::LABELPLACEMENT* parent
00425 );
00426
00427 GRE::LABELPLACEMENT* GetParent (
00428 ) const;
00429
00430
00431
00432
00433
00434
00435 const UNICODE* GetUserString (
00436 ) const;
00437
00438
00439
00440
00441
00442 void SetUserString (
00443 const MISTRING& str
00444 );
00445
00446 void Zoom (
00447 double scale
00448 );
00449
00450
00451
00452 void SetID (
00453 INT32 id
00454 );
00455 #endif
00456
00457 private:
00458
00459 class PRIV;
00460 PRIV *m_priv;
00461 bool m_bCopyOnWrite;
00462 };
00463
00464
00465
00466
00467 class LABELPLACEMENT {
00468 public:
00469 class ITERATOR;
00470 class CONST_ITERATOR;
00471 friend class CONST_ITERATOR;
00472
00473 class CONST_ITERATOR {
00474 public:
00475
00476
00477 CONST_ITERATOR (
00478 ) :
00479 m_placement(0),
00480 m_num(-1)
00481 { }
00482
00483
00484 virtual ~CONST_ITERATOR() {};
00485
00486
00487 CONST_ITERATOR (
00488 const CONST_ITERATOR& rhs
00489 ) :
00490 m_placement(rhs.m_placement),
00491 m_place(rhs.m_place),
00492 m_num(rhs.m_num)
00493 {}
00494
00495
00496
00497 CONST_ITERATOR (
00498 LABELPLACEMENT* placement
00499 ) :
00500 m_placement(placement),
00501 m_num(-1)
00502 {
00503 ReadNext(true);
00504 }
00505
00506
00507 const LABELPLACE& operator* (
00508 ) const { return (m_place); }
00509
00510
00511 const LABELPLACE* operator-> (
00512 ) const { return (&**this); }
00513
00514
00515 CONST_ITERATOR& operator++(
00516 ) {
00517 ReadNext(true);
00518 return *this;
00519 }
00520
00521
00522 CONST_ITERATOR operator++(int
00523 ) {
00524 CONST_ITERATOR temp = *this;
00525 ++*this;
00526 return(temp);
00527 }
00528
00529
00530 CONST_ITERATOR& operator--(
00531 ) {
00532 ReadPrev(true);
00533 return *this;
00534 }
00535
00536
00537 CONST_ITERATOR operator--(int
00538 ) {
00539 CONST_ITERATOR temp = *this;
00540 --*this;
00541 return(temp);
00542 }
00543
00544
00545 bool operator== (
00546 const CONST_ITERATOR& rhs
00547 ) const {
00548 if (m_num == -1 && rhs.m_num == -1) return (true);
00549 return (m_num == rhs.m_num && m_placement == rhs.m_placement);
00550 }
00551
00552
00553 bool operator!= (
00554 const CONST_ITERATOR& rhs
00555 ) const { return (!(*this == rhs)); }
00556
00557 #if !defined(GENERATING_DOXYGEN_OUTPUT)
00558 protected:
00559 LABELPLACEMENT* m_placement;
00560 LABELPLACE m_place;
00561 int m_num;
00562 void ReadPrev (bool bIsConst);
00563 void ReadNext (bool bIsConst);
00564 #endif
00565 };
00566
00567 friend class ITERATOR;
00568 class ITERATOR : public CONST_ITERATOR {
00569 public:
00570 ITERATOR();
00571
00572
00573 ITERATOR(LABELPLACEMENT* placement) :
00574 CONST_ITERATOR(placement)
00575 { }
00576
00577
00578 LABELPLACE& operator* (
00579 ) { return (m_place); }
00580
00581
00582 LABELPLACE* operator-> (
00583 ) { return (&**this); }
00584
00585
00586 ITERATOR& operator++() {
00587 ReadNext(false);
00588 return (*this);
00589 }
00590
00591
00592 ITERATOR operator++(int
00593 ) {
00594 ITERATOR temp = *this;
00595 ++*this;
00596 return(temp);
00597 }
00598
00599
00600 ITERATOR& operator--() {
00601 ReadPrev(false);
00602 return (*this);
00603 };
00604
00605
00606 ITERATOR operator--(int
00607 ) {
00608 ITERATOR temp = *this;
00609 --*this;
00610 return(temp);
00611 }
00612
00613
00614 bool operator== (
00615 const ITERATOR& rhs
00616 ) const;
00617
00618
00619 bool operator!= (
00620 const ITERATOR& rhs
00621 ) const { return (!(*this == rhs)); }
00622 };
00623
00624
00625
00626 static ERRVALUE Deconflict (
00627 SIMPLE_ARRAY<LABELPLACEMENT*>& LabelSets
00628 );
00629
00630
00631 LABELPLACEMENT (
00632 GRE_LAYER* layer,
00633 GRE_VIEW* view
00634 );
00635
00636
00637 virtual ~LABELPLACEMENT (
00638 );
00639
00640
00641 ERRVALUE Add (
00642 const LABELPLACE& place
00643 );
00644
00645
00646 CONST_ITERATOR Begin (
00647 ) const { return (CONST_ITERATOR(const_cast<LABELPLACEMENT*>(this))); }
00648
00649
00650 void Clear (
00651 );
00652
00653
00654
00655
00656 void DeleteLabels (
00657 const RVC::ELEMENT& element
00658 );
00659
00660
00661 CONST_ITERATOR End (
00662 ) const { return (CONST_ITERATOR(0)); }
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672 INT32 Find (
00673 const DPOINT2D& pt,
00674 GRE::LABELPLACE& place,
00675 int maxdist = 0
00676 ) const;
00677
00678
00679
00680
00681
00682 INT32 Find (
00683 const DPOINT2D& pt,
00684 MILIST<GRE::LABELPLACE*>& list,
00685 int maxdist = 0
00686 ) const;
00687
00688
00689
00690
00691
00692 INT32 Find (
00693 const DRECT2D& rect,
00694 MILIST<GRE::LABELPLACE*>& list
00695 ) const;
00696
00697
00698
00699
00700
00701
00702 INT32 Find (
00703 const REGION2D& region,
00704 MILIST<GRE::LABELPLACE*>& list
00705 ) const;
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715 ERRVALUE GetCombinedRegion (
00716 REGION2D& region,
00717 bool bClear = true
00718 ) const;
00719
00720
00721
00722 bool GetLabelPlace (
00723 const RVC::ELEMENT& elem,
00724 GRE::LABELPLACE& place
00725 ) const;
00726
00727
00728
00729 bool GetLabelPlaces (
00730 const RVC::ELEMENT& elem,
00731 MILIST<GRE::LABELPLACE>& places
00732 ) const;
00733
00734 GRE_LAYER* GetLayer (
00735 ) const;
00736
00737 int GetNumItems (
00738 ) const;
00739
00740 GRE_VIEW* GetView (
00741 ) const;
00742
00743 private:
00744
00745
00746
00747
00748
00749
00750
00751 virtual bool v_CompareLabels (
00752 const RVC::ELEMENT& elem1,
00753 const RVC::ELEMENT& elem2
00754 ) const;
00755
00756 #if !defined(GENERATING_DOXYGEN_OUTPUT)
00757 class PRIV;
00758 PRIV* m_priv;
00759
00760 protected:
00761
00762 GRE::LABELPLACE* GetItem (
00763 int num
00764 );
00765 public:
00766
00767 QUADTREE& GetQuadTree();
00768
00769 #endif
00770 };
00771
00772
00773 }
00774
00775
00776 #endif
00777