00001
00219 #ifndef INC_GRE_GROUP_H
00220 #define INC_GRE_GROUP_H
00221
00222 #ifndef INC_GRE_VIEWABLE_H
00223 #include <gre/viewable.h>
00224 #endif
00225
00226 #ifndef INC_GRE_LAYER_H
00227 #include <gre/layer.h>
00228 #endif
00229
00230 #ifndef INC_MI32_TRANS2DAFFINE_H
00231 #include <mi32/trans2daffine.h>
00232 #endif
00233
00234 #ifndef INC_MI32_MATTE_H
00235 #include <mi32/matte.h>
00236 #endif
00237
00238 namespace GRE {
00239
00240
00241 #define GROUPFLAG_None 0x00000000
00242 #define GROUPFLAG_Ignore 0x00000001
00243 #define GROUPFLAG_NoFixAspectLL 0x00000002
00244 #define GROUPFLAG_SingleLayer 0x00000004
00245 #define GROUPFLAG_Clip 0x00000008
00246 #define GROUPFLAG_OrientMatchRasterOnly 0x00000010
00247 #define GROUPFLAG_OrientMatchRasterOther 0x00000020
00248 #define GROUPFLAG_OrientMatchLayer 0x00000040
00249 #define GROUPFLAG_NoSave 0x00000080
00250 #define GROUPFLAG_NoUserSettings 0x00000100
00251 #define GROUPFLAG_3D 0x00000200
00252 #define GROUPFLAG_NoDeleteGroup 0x00000400
00253 #define GROUPFLAG_NoDeleteLayers 0x00000800
00254 #define GROUPFLAG_ShowLatLonCoords 0x00001000
00255 #define GROUPFLAG_NoAddLayers 0x00002000
00256 #define GROUPFLAG_NoLockZoom 0x00004000
00257 #define GROUPFLAG_ShowLayerList 0x00008000
00258 #define GROUPFLAG_NoClipToAttachedGroup 0x00010000
00259 #define GROUPFLAG_CombineLayersInLegend 0x00020000
00260 #define GROUPFLAG_TemplateSaveLayersAsIs 0x00040000
00261 #define GROUPFLAG_NoClipToRectOnly 0x00080000
00262 #define GROUPFLAG_NoLegacyRectExtents 0x00100000
00263 #define GROUPFLAG_CreatedBySML 0x00200000
00264
00265 #define GROUPFLAG_Mask_Orient (GROUPFLAG_OrientMatchRasterOnly | GROUPFLAG_OrientMatchRasterOther | GROUPFLAG_OrientMatchLayer)
00266 #define GROUPFLAG_Mask_NeedRedraw (GROUPFLAG_Ignore | GROUPFLAG_NoFixAspectLL | GROUPFLAG_Clip | GROUPFLAG_OrientMask | GROUPFLAG_3D | GROUPFLAG_NoClipToAttachedGroup | GROUPFLAG_NoClipToRectOnly)
00267 #define GROUPFLAG_Mask_NoNotify GROUPFLAG_TemplateSaveLayersAsIs
00268
00269 #define GROUPFLAG_OrientMask GROUPFLAG_Mask_Orient
00270
00271 #define ATTACHMENT_None 0
00272 #define ATTACHMENT_Left 1
00273 #define ATTACHMENT_Bottom 1
00274 #define ATTACHMENT_Center 2
00275 #define ATTACHMENT_Right 3
00276 #define ATTACHMENT_Top 3
00277 #define ATTACHMENT_Geographic 4
00278
00279 #define ATTACHREF_None 0
00280 #define ATTACHREF_Group 1
00281 #define ATTACHREF_Page 2
00282 #define ATTACHREF_Margin 3
00283
00284
00285 class GROUP : public GRE::VIEWABLE, public SERIALIZABLE {
00286
00287 public:
00288
00290 enum CREATEFLAGS {
00291 CREATEFLAG_None = 0x0000,
00292 CREATEFLAG_NoCallCreateCB = 0x0001,
00293 CREATEFLAG_Temporary = 0x0002,
00294 CREATEFLAG_3D = 0x0004,
00295 CREATEFLAG_NoAutoMatch = 0x0008,
00296 CREATEFLAG_NoSetActive = 0x0010,
00297 CREATEFLAG_DeferCreate = 0x0020,
00298 CREATEFLAG_SML = 0x0040
00299 };
00300
00301 enum ORIENTATION_BASE {
00302 ORIENTATION_BASE_Projection = 0,
00303 ORIENTATION_BASE_North = 1
00304 };
00305
00306 enum LABEL_MANAGEMENT_MODE {
00307 LABEL_MANAGEMENT_MODE_RenderWithLayer = 0,
00308 LABEL_MANAGEMENT_MODE_RenderLast
00309 };
00310
00312 enum EXTENTCOORD {
00313 EXTENTCOORD_Group,
00314 EXTENTCOORD_Layout,
00315 EXTENTCOORD_View
00316 };
00317
00319 struct POSN {
00320 GROUP *refgroup;
00321 UINT8 AttachRefType;
00322 UINT8 AttachmentThis;
00323 UINT8 AttachmentRef;
00324 UINT8 PosnSet;
00325 double offset;
00326 mutable MISTRING m_RefGroupName;
00327 POSN ();
00328 ~POSN ();
00329 void Clear ();
00330 };
00331
00332 #ifdef X_NATIVE
00334 static GROUP* GetFromWidget (
00335 Widget w
00336 );
00337 #endif
00338
00340 static void SMLClassInstall (
00341 SMLCONTEXT *context
00342 );
00343
00345 explicit GROUP (
00346 CREATEFLAGS createflags = CREATEFLAG_None
00347 );
00348
00350 GROUP (
00351 GRE::LAYOUT *layout,
00352 CREATEFLAGS createflags = CREATEFLAG_None,
00353 GRE::LISTPOS listpos = GRE::LISTPOS_Last,
00354 GROUP *refgroup = 0
00355 );
00356
00358 virtual ~GROUP ();
00359
00361 bool AdjLatLon (
00362 );
00363
00365 bool AdjLatLonCanSet (
00366 );
00367
00370 void AttachLayerCommonParm (
00371 LAYER::TYPE LayerType,
00372 GRE::LAYER::COMMONPARM *pParmInstance
00373 );
00374
00376 bool ChangeListPos (
00377 GROUP* refgroup,
00378 GRE::LISTPOS listpos
00379 );
00380
00382 ERRVALUE CheckAddLayer (
00383 GRE::LAYER::TYPE layertype = GRE::LAYER::TYPE_None
00384 ) const;
00385
00387 void CheckGeorefCompatible (
00388 ) const;
00389
00390 void ClearPosns (
00391 ) { m_xposn.Clear(); m_yposn.Clear(); }
00392
00394 void ComputeLayoutExtents (
00395 );
00396
00398 ERRVALUE ComputeMapExtents (
00399 );
00400
00401 ERRVALUE ComputeRegionFromLayers (
00402 REGION2D& region,
00403 bool IncludeMargins,
00404 GRE::LAYER::FILTER *filter = 0
00405 ) const;
00406
00407 #ifndef GENERATING_DOXYGEN_OUTPUT
00408
00409 GRE::GROUPVIEW* ConstructGroupView (
00410 GRE::VIEW *view
00411 );
00412 #endif
00413
00415 void Create (
00416 CREATEFLAGS createflags = CREATEFLAG_None
00417 );
00418
00420 void DestroyAllLayers (
00421 );
00422
00424 void DestroyLayer (
00425 GRE::LAYER* layer
00426 );
00427
00429 ERRVALUE DrawActiveOverlay (
00430 GRE::DRAWFLAGS DrawFlags = GRE::DRAWFLAG_UpdateScreen,
00431 GRE::VIEW *view = 0
00432 );
00433
00434 #if defined(X_NATIVE) || defined(WIN32_MFC)
00436 ERRVALUE DlgGetClipSettings (
00437 MDLGPARENT dlgparent
00438 );
00439 #endif
00440
00442 virtual GRE::LAYER *FindLayerByID (
00443 UINT32 LayerID
00444 ) const;
00445
00447 double GetAspectX (
00448 ) const { return (m_AspectX); }
00449
00451 double GetAspectY (
00452 ) const { return (m_AspectY); }
00453
00455 const REGION2D& GetClipRegion (
00456 ) const;
00457
00459 bool GetClipToMatchedLayer (
00460 ) const { return (m_ClipToMatchedLayer); }
00461
00463 ERRVALUE GetExtents (
00464 DRECT2D& extents,
00465 EXTENTCOORD coords
00466 );
00467
00469 GRE::LAYER* GetFirstLayer (
00470 ) const { return (m_firstlayer); }
00471
00473 UINT32 GetFlags (
00474 ) const { return (m_groupflags); }
00475
00477 virtual void GetFullName (
00478 MISTRING& name
00479 ) const;
00480
00481 const REGION2D& GetFullRegion (
00482 ) const { return (m_FullRegion); }
00483
00484 LABEL_MANAGEMENT_MODE GetLabelManagementMode (
00485 ) const { return (m_LabelManagementMode); }
00486
00488 GRE::LAYER* GetLastLayer (
00489 ) const { return (m_lastlayer); }
00490
00493 const GRE::LAYER::COMMONPARM* GetLayerCommonParm (
00494 LAYER::TYPE LayerType
00495 ) const;
00496
00499 GRE::LAYER::COMMONPARM* GetLayerCommonParm (
00500 LAYER::TYPE LayerType
00501 );
00502
00504 GRE::LAYER* GetLayerActive (
00505 ) const { return (m_activelayer); }
00506
00508 GRE::LAYER* GetLayerMatched (
00509 ) const { return (m_matchedlayer); }
00510
00512 GRE::LAYER* GetLayerZoom1X (
00513 bool PreferredOnly
00514 ) const;
00515
00518 GRE::LAYOUT * GetLayout (
00519 ) const { return (m_layout); }
00520
00521 const DRECT2D& GetLayoutExtents (
00522 ) const { return (m_LayoutExtents); }
00523
00526 int GetListPos (
00527 );
00528
00530 GROUP* GetMatchedGroup (
00531 bool firstonly = false
00532 ) const;
00533
00534 MATTE& GetMatte (
00535 ) { return (m_Matte); }
00536
00538 UINT32 GetMutualExclusiveGroupSet (
00539 ) const { return (m_MutualExclusiveGroupSet); }
00540
00542 const MISTRING& GetName (
00543 ) const { return (m_name); }
00544
00546 bool GetNeedUpdateExtents (
00547 ) const { return (m_NeedUpdateExtents); }
00548
00550 GROUP* GetNext (
00551 ) const { return (m_nextgroup); }
00552
00554 virtual UINT32 GetNextLayerID (
00555 ) const;
00556
00558 const POSN& GetPosnX (
00559 ) const { return (m_xposn); }
00560
00562 const POSN& GetPosnY (
00563 ) const { return (m_yposn); }
00564
00566 GROUP* GetPrevious (
00567 ) const { return (m_prevgroup); }
00568
00570 double GetRelativeScale (
00571 ) const { return (m_RelativeScale); }
00572
00574 double GetRotationAngle (
00575 ) const { return (m_RotAngle); }
00576
00578 UINT8 GetRotationBase (
00579 ) const { return (m_RotBase); }
00580
00582 const MISTRING& GetSavedLocations (
00583 ) const { return (m_SavedLocations); }
00584
00587 SERIALIZER* GetSerializer (
00588 ) const { return (m_pSerializer); }
00589
00591 virtual ERRVALUE GetSizeMeters (
00592 DPOINT2D& sizemeters
00593 );
00594
00596 const TRANS2D_AFFINE& GetTransViewToGroup (
00597 ) const { return (m_ViewToGroup); }
00598
00600 const SPATREF::COORDREFSYS& GetUsedCoordRefSys (
00601 ) const;
00602
00603 GRE::VIEWPOINT3D* GetViewPoint3D (
00604 ) const { return (m_ViewPoint3D); }
00605
00607 GRE::VISIBLEVIEW GetVisible (
00608 ) const { return (m_VisibleViewLayout); }
00609
00611 void GetVisibleScaleRange (
00612 double& MinScaleVisible,
00613 double& MaxScaleVisible
00614 ) const { MinScaleVisible = m_MinScaleVisible; MaxScaleVisible = m_MaxScaleVisible; return; }
00615
00617 bool HasAttachedGroups (
00618 ) const;
00619
00621 bool HasHighlightableLayer (
00622 GRE::VIEW *view = 0
00623 ) const;
00624
00626 virtual bool HasLayers (
00627 ) const;
00628
00630 bool HasLegend (
00631 ) const { return ((m_groupflags & GROUPFLAG_CombineLayersInLegend) != 0); }
00632
00634 bool HasMutuallyExclusiveLayers (
00635 ) const { return (m_HasMutuallyExclusiveLayers); }
00636
00638 bool HasTempLayers (
00639 ) const;
00640
00643 bool HighlightSetupDefault (
00644 GRE::VIEW *view = 0
00645 );
00646
00648 void InvalidateAllViews (
00649 GRE::RENDERTARGET Target = GRE::RENDERTARGET_GroupAll | GRE::RENDERTARGET_LayerAll
00650 );
00651
00653 bool Is3D (
00654 ) const { return (!m_layout || (m_groupflags & GROUPFLAG_3D)); }
00655
00656 bool IsBeingLoaded (
00657 ) const { return (m_pSerializer != 0); }
00658
00660 bool IsClipped (
00661 ) const;
00662
00664 bool IsClippedToMatchedLayer (
00665 ) const { return (m_ClipToMatchedLayer && GetMatchedLayer() != 0); }
00666
00669 bool IsCreated (
00670 ) const { return (m_IsCreated); }
00671
00673 bool IsIgnored (
00674 ) const;
00675
00677 bool IsSingleLayer (
00678 ) const { return ((m_groupflags & GROUPFLAG_SingleLayer) != 0); }
00679
00681 bool IsValid (
00682 ) const;
00683
00685 bool IsVisibleAtScale (
00686 double scale
00687 ) const { return (!m_layout || (scale >= m_MinScaleVisible && (m_MaxScaleVisible <= 0.0 || scale <= m_MaxScaleVisible))); }
00688
00690 bool IsVisibleInView (
00691 const GRE::VIEW *view
00692 ) const;
00693
00695 virtual ERRVALUE SerialRead (
00696 SERIALIZER& serializer
00697 );
00698
00700 virtual ERRVALUE SerialWrite (
00701 SERIALIZER& serializer,
00702 const char *tagname = 0
00703 ) const;
00704
00706 void Set2D (
00707 );
00708
00710 void SetActiveLayer (
00711 GRE::LAYER *layer
00712 );
00713
00715 void SetAllLayersVisible (
00716 VISIBLEVIEW views,
00717 bool visible
00718 );
00719
00721 void SetAllLayersVisible (
00722 VIEW *view,
00723 bool visible
00724 );
00725
00727 void SetClipRect (
00728 const DRECT2D& ClipRect,
00729 const SPATREF::COORDREFSYS& RectCRS,
00730 bool notify = true
00731 );
00732
00734
00735
00736
00737
00738
00740 void SetClipToMatchedLayer (
00741 bool ClipToMatchedLayer,
00742 bool notify = true
00743 );
00744
00746 void SetFlags (
00747 UINT32 flags,
00748 UINT32 mask
00749 );
00750
00752 void SetFlags (
00753 UINT32 flags,
00754 UINT32 mask,
00755 bool notify
00756 );
00757
00758 void SetLabelManagementMode (
00759 LABEL_MANAGEMENT_MODE mode
00760 ) { m_LabelManagementMode = mode; }
00761
00763 void SetListPos (
00764 GRE::LISTPOS listpos,
00765 GROUP *refgroup = 0
00766 );
00767
00769 void SetListPos (
00770 int newpos
00771 );
00772
00774 void SetMatte (
00775 const MATTE& matte,
00776 bool notify = true
00777 );
00778
00780 void SetModified (
00781 bool notify = true,
00782 bool ViewsNeedRedraw = true
00783 );
00784
00786 void SetMutualExclusiveGroupSet (
00787 UINT32 GroupSet
00788 );
00789
00791 void SetMutuallyExclusiveLayers (
00792 bool LayersMutuallyExclusive = true
00793 );
00794
00796 ERRVALUE SetName (
00797 const MISTRING& newname
00798 );
00799
00801 void SetNeedUpdateExtents (
00802 ) { m_NeedUpdateExtents = true; }
00803
00805 void SetOrientation (
00806 UINT8 NewRotBase,
00807 double NewRotAngle
00808 ) { m_RotBase = NewRotBase; m_RotAngle = NewRotAngle; }
00809
00811 void SetProjView (
00812 const GRE::LAYER *layer
00813 );
00814
00817 void SetPosnAttachGeographic (
00818 GRE::GROUP *RefGroup = 0
00819 );
00820
00823 void SetPosnAttachmentX (
00824 UINT8 AttachmentThis,
00825 UINT8 AttachmentRef
00826 );
00827
00830 void SetPosnAttachmentY (
00831 UINT8 AttachmentThis,
00832 UINT8 AttachmentRef
00833 );
00834
00837 void SetPosnAttachToX (
00838 UINT8 AttachRefType,
00839 GRE::GROUP *RefGroup
00840 );
00841
00844 void SetPosnAttachToY (
00845 UINT8 AttachRefType,
00846 GRE::GROUP *RefGroup
00847 );
00848
00851 void SetPosnOffsetX (
00852 double offset
00853 ) { m_xposn.offset = offset; }
00854
00857 void SetPosnOffsetY (
00858 double offset
00859 ) { m_yposn.offset = offset; }
00860
00862 void SetPosnStateX (
00863 UINT8 PosnState
00864 ) { m_xposn.PosnSet = PosnState; }
00865
00867 void SetPosnStateY (
00868 UINT8 PosnState
00869 ) { m_yposn.PosnSet = PosnState; }
00870
00872 void SetPosnValuesX (
00873 UINT8 AttachRefType,
00874 GRE::GROUP *RefGroup,
00875 UINT8 AttachmentThis,
00876 UINT8 AttachmentRef,
00877 double offset
00878 ) { m_xposn.AttachRefType = AttachRefType; m_xposn.refgroup = RefGroup; m_xposn.AttachmentThis = AttachmentThis; m_xposn.AttachmentRef = AttachmentRef; m_xposn.offset = offset; }
00879
00881 void SetPosnValuesY (
00882 UINT8 AttachRefType,
00883 GRE::GROUP *RefGroup,
00884 UINT8 AttachmentThis,
00885 UINT8 AttachmentRef,
00886 double offset
00887 ) { m_yposn.AttachRefType = AttachRefType; m_yposn.refgroup = RefGroup; m_yposn.AttachmentThis = AttachmentThis; m_yposn.AttachmentRef = AttachmentRef; m_yposn.offset = offset; }
00888
00890 void SetRelativeScale (
00891 double RelativeScale,
00892 bool notify = true
00893 );
00894
00896 ERRVALUE SetRenderCoordRefSys (
00897 const SPATREF::COORDREFSYS& RenderCRS
00898 );
00899
00900 void SetSavedLocations (
00901 const MISTRING& string
00902 ) { m_SavedLocations = string; }
00903
00904 void SetSingleLayer (
00905 bool SingleLayer
00906 ) { if (SingleLayer) m_groupflags |= GROUPFLAG_SingleLayer; else m_groupflags &= ~GROUPFLAG_SingleLayer; }
00907
00909 ERRVALUE SetupEquirectangular (
00910 SPATREF::COORDREFSYS& CoordRefSys,
00911 const DPOINT2D& center
00912 ) const;
00913
00915 void SetViewPoint3D (
00916 const GRE::VIEWPOINT3D& ViewPoint3D
00917 );
00918
00920 void SetVisible (
00921 UINT32 flags,
00922 bool set
00923 );
00924
00926 void SetVisibleScaleRange (
00927 double MinScaleVisible,
00928 double MaxScaleVisible
00929 ) { m_MinScaleVisible = MinScaleVisible; m_MaxScaleVisible = MaxScaleVisible; }
00930
00932 void SetVisibleView (
00933 GRE::VIEW *view,
00934 bool visible
00935 );
00936
00938 ERRVALUE TemplateWrite (
00939 SERIALIZER& serializer,
00940 const char *tagname = 0
00941 );
00942
00944 void ValidateAttachments ();
00945
00946 protected:
00947 #ifndef GENERATING_DOXYGEN_OUTPUT
00948 static const SML::CLASSMEMBER* GetSMLClassMembers();
00949 #endif
00950
00951 private:
00952
00953 #ifndef GENERATING_DOXYGEN_OUTPUT
00954
00955 class SML_GROUPXPOSN;
00956 class SML_GROUPYPOSN;
00957
00958 GRE::LAYER *m_firstlayer;
00959 GRE::LAYER *m_lastlayer;
00960 GRE::LAYER *m_activelayer;
00961 GRE::LAYER *m_matchedlayer;
00962 UINT8 m_RotBase;
00963 double m_AspectX;
00964 double m_AspectY;
00965 double m_RotAngle;
00966 GROUP *m_prevgroup;
00967 GROUP *m_nextgroup;
00968 GRE::LAYOUT *m_layout;
00969 UINT32 m_groupflags;
00970 POSN m_xposn;
00971 POSN m_yposn;
00972 GRE::VIEWPOINT3D *m_ViewPoint3D;
00973 GRE::VISIBLEVIEW m_VisibleViewLayout;
00974
00975 SERIALIZER *m_pSerializer;
00976 bool m_IsCreated;
00977 bool m_NeedUpdateExtents;
00978 double m_MinScaleVisible;
00979 double m_MaxScaleVisible;
00980 double m_DesignScale;
00981 double m_RelativeScale;
00982 mutable MISTRING m_ActiveLayerName;
00983 bool m_ClipToMatchedLayer;
00984 bool m_HasMutuallyExclusiveLayers;
00985 GRE::HIGHLIGHTMODE m_ElemHighlightMode;
00986 UINT32 m_MutualExclusiveGroupSet;
00987 MATTE m_Matte;
00988 MISTRING m_name;
00989 SPATREF::COORDREFSYS m_RenderCRS;
00990 REGION2D m_ClipRegion;
00991 REGION2D m_FullRegion;
00992 TRANS2D_AFFINE m_ViewToGroup;
00993 DRECT2D m_LayoutExtents;
00994 LABEL_MANAGEMENT_MODE m_LabelManagementMode;
00995 LAYER::COMMONPARM **m_PtrsLayerCommonParm;
00996 MISTRING m_SavedLocations;
00997
00998 static void GRECB_Group (
00999 const GRE::MSG *msg,
01000 void *vgroup
01001 );
01002
01003 static const SERIALIZERITEM* SerialGetItemDef (
01004 SERIALIZER& serializer
01005 );
01006
01007 static ERRVALUE SerializerCB_OldClipProj (SERIALIZER&, const SERIALIZERITEM*, void *vgroup, SERIALIZERITEM::ACTION);
01008 static ERRVALUE SerializerCB_OldClipRect (SERIALIZER&, const SERIALIZERITEM*, void *vgroup, SERIALIZERITEM::ACTION);
01009 static ERRVALUE SerializerCB_OldGroupFlags (SERIALIZER&, const SERIALIZERITEM*, void *vgroup, SERIALIZERITEM::ACTION);
01010 static ERRVALUE SerializerCB_ViewPoint3D (SERIALIZER&, const SERIALIZERITEM*, void *vgroup, SERIALIZERITEM::ACTION);
01011
01012 void Init ();
01013
01015 GRE::LAYER *GetMatchedLayer () const;
01016
01017
01018 virtual bool v_Destroy (bool NotifyParent);
01019 virtual MICONSTRUCT* v_GetIcon () const;
01020 virtual const char* v_GetTypeName () const;
01021
01022
01023 virtual void v_Clear ();
01024 virtual ERRVALUE v_DrawAllViews (GRE::DRAWCONDITION condition);
01025 virtual GRE::LAYER* v_GetActiveLayer () const;
01026 virtual double v_GetDesignScale () const;
01027 virtual const DRECT2D& v_GetExtents () const;
01028 virtual double v_GetMaxScaleVisibleAny () const;
01029 virtual double v_GetMinScaleVisibleAny () const;
01030 virtual void v_SetDesignScale (double DesignScale, bool notify);
01031 virtual void v_UnhighlightAllElements (bool redraw);
01032
01033 GROUP (const GROUP&);
01034 GROUP& operator= (const GROUP&);
01035
01036 friend class GRE::LAYOUT;
01037 friend class GRE::LAYER;
01038 friend class SML_GROUPXPOSN;
01039 friend class SML_GROUPYPOSN;
01040
01041 #endif
01042 };
01043
01044 DEFINE_ENUM_OP_BITWISE(GROUP::CREATEFLAGS)
01045
01046
01047
01048 }
01049
01050 #endif