Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

ExtObject.h

Go to the documentation of this file.
00001 #ifndef ExtObjectH
00002 #define ExtObjectH
00003 
00004 /*******************************************************************************
00005 Copyright 2000,2001,2002 Petr Kulhanek
00006 
00007     This file is part of Core plugin.
00008 
00009     Core plugin is free software; you can redistribute it and/or modify
00010     it under the terms of the GNU General Public License as published by
00011     the Free Software Foundation; either version 2 of the License, or
00012     (at your option) any later version.
00013 
00014     Core plugin is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017     GNU General Public License for more details.
00018 
00019     You should have received a copy of the GNU General Public License
00020     along with Core plugin; if not, write to the Free Software
00021     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 *******************************************************************************/
00023 /*******************************************************************************
00024 ** PROJEKT:             Projekt NEMESIS
00025 ** SOUBOR:              ExtObject
00026 ** ÚČEL:                třída popisující základní vlastnosti objektu
00027 ** VERZE:               1.0
00028 ** JAZYK:               CBuilder C++
00029 ** CÍLOVÝ POČÍTAČ:      IBM PC
00030 ** PROGRAMÁTOR:         Petr Kulhánek
00031 ** HISTORIE ÚPRAV:
00032 VERZE   DATUM       POZNÁMKA
00033 1.0     02.09.2000  třída vznikla pro zvýšení modularizace celého kódu
00034                 2000-11-01      vytvoření univerzální třídy pro libovolný objekt pluginu,
00035                                 původní funkce, které mají využití pouze v projektu NEMESIS
00036                     byly přeneseny do třídy CExtObject
00037         2000-11-16  zrušena třída CRegisteredObject, její úlohu přebírá
00038                                 tato třída
00039         2001-12-15  zavedení automatizace manageru objektu přes správce pluginů
00040 *******************************************************************************/
00041 
00045 /* HLAVIČKOVÉ SOUBORY *********************************************************/
00046 
00047 #include "CoreMainHeader.h"
00048 #include "SimpleList.h"
00049 #include "ComObject.h"
00050 #include "GeoDescriptor.h"
00051 #include "CoreHistoryList.h"
00052 #include "EventSystem.h"
00053 
00054 /* KONEC HLAVIČKOVÝCH SOUBORů *************************************************/
00055 
00056 /*
00057 ZÁKLADNÍ FILOZOFIE NON-VCL OBJEKTU
00058 
00059 Každý objekt, který není přímo nebo nepřímo odvozen od knihovny VCL, musí dědit
00060 jako bázovou třídu třídu CExtObject (zkrácenina z ExtendedObject). Tato třída
00061 zajištuje jméno objektu, jeho popis a status. Tyto vlastnosti lze nastavovat
00062 přímo nebo se záznamem do HistoryListu. Zatím kromě stutusu, protože u něj může
00063 v důsledku ruzné implementace docházet k možné nereverzibilitě změn.
00064 Kromě toho tato třída zajištuje obecné vlastnosti objektu jako jsou geometrický
00065 deskriptor, který zajištuje jednotné měření geometrie mezi objekty a jednoznačný
00066 identifikátor objektu.
00067 Poslední velmi důležitou částí objektu je registrace nebo odregistrování událostí
00068 nad objektem.
00069 Události vyvolává objekt a zpracovává je objekt, který událost zaregistroval.
00070 Tento model slouží ke komunikaci mezi objektem a ruznými manažery, kteří mohou
00071 měnit data objektu. Systém událostí zajištuje konzistenci mezi daty objektu a daty
00072 zobrazenými v různých manažerech.
00073 */
00074 
00075 //------------------------------------------------------------------------------
00076 
00077 class CProject;
00078 class CPluginObjectDescription;
00079 class CExtObject;
00080 class CObjectDesigner;
00081 class CExtVisObject;
00082 
00083 
00084 //------------------------------------------------------------------------------
00085 
00087 
00092 class NEMESIS_CORE_PACKAGE CExtObject : public CComObject{
00093     public:
00094         __fastcall CExtObject(CComObject* owner,CPluginObjectInfo* objectinfo,CProject* project);
00095         __fastcall CExtObject(CVisObject* owner,CPluginObjectInfo* objectinfo,CProject* project);
00096     __fastcall ~CExtObject(void);
00097 
00098   // veřejné datové struktury --------------------------------------------------
00099 
00100     class NEMESIS_CORE_PACKAGE CStatus{
00101         public:
00102                         __fastcall CStatus(void);
00103         friend istream& __fastcall operator >> (istream& str,CStatus& status);
00104         friend ostream& __fastcall operator << (ostream& str,const CStatus& status);
00105 
00106         CSmallString __fastcall GetStringForm(void) const;
00107         void __fastcall SetFromStringForm(const CSmallString& set);
00108 
00109         public:
00110         bool Locked : 1;        // objekt je uzamčen
00111         bool Visible : 1;       // viditelnost objektu
00112         bool Highlighted : 1;   // zvýraznění objektu
00113         bool FragmentWork : 1;  // slouží pro mapování fragmentů
00114         bool Active: 1;         // určuje zda je objekt aktivní
00115         bool Temporary: 1;      // dočasný objekt
00116         bool ShowName: 1;
00117         bool ShowDescription: 1;
00118         };
00119 
00120   // metody - zjištění projektu ------------------------------------------------
00121     inline CProject* __fastcall GetProject(void) const;
00122     __property CProject* Project = {read=FProject};
00123 
00124   // změnové metody - záznam do history listu ----------------------------------
00125                 // událost ComObject_SetName
00126     bool         __fastcall ChangeName(const CSmallString& name);
00127                 // událost ComObject_SetDescription
00128     bool         __fastcall ChangeDescription(const CSmallString& name);
00129     bool         __fastcall ChangeStatus(const CStatus& status);
00130 // zatím není rozhodnuto zda bude podporováno z možných důvodu nereverzibility změn
00131 
00132   // základní nastavení objektu ------------------------------------------------
00133         // událost ExtObject_SetName
00134     void  __fastcall SetName(const CSmallString& name);
00135         // událost ExtObject_SetDescription
00136     void  __fastcall SetDescription(const CSmallString& name);
00137 
00138   // metody - uzamčení objektu
00139         // událost ComObject_SetStatus
00140     void __fastcall Lock(bool status,bool propagate=false);
00141     inline bool __fastcall IsLocked(void) const;
00142 
00143   // metody - viditelnost objektu
00144         // událost ComObject_SetStatus
00145     void __fastcall SetVisible(bool status,bool propagate=false);
00146     inline bool __fastcall IsVisible(void) const;
00147 
00148   // metody - zvýraznění objektu
00149         // událost ComObject_SetStatus
00150     void __fastcall Highlight(bool status,bool propagate=false);
00151     inline __fastcall IsHighlighted(void) const;
00152 
00153   // obecné nastavení objektu --------------------------------------------------
00154 
00155   // metody - status objektu (viditelnost a uzamčení objektu zahrnuto)
00156         // událost ComObject_SetStatus
00157     void             __fastcall SetStatus(const CStatus& status,const CStatus& mask,bool propagate=false);
00158     inline const CStatus&   __fastcall GetStatus(void) const;
00159 
00160     virtual CGeoDescriptor  __fastcall GetGeoDescriptor(void);  // geometrický deskriptor
00161 
00162  // práce s managerem objektu
00163     CObjectDesigner* __fastcall OpenObjectDesigner(bool unregistered=false);
00164 
00165   // metody - registruje a odregistrovává obsluhu událostí
00166 
00167   // metody pro práci s registrovanými objekty ---------------------------------
00168     inline void  __fastcall RegisterObject(CExtObject* p_ro);
00169     inline void  __fastcall UnregisterObject(CExtObject* p_ro);
00170     void                 __fastcall UnregisterAllRegisteredObjects(CElementsRecord* history=NULL);
00171     virtual void __fastcall RemoveFromRegistered(CExtObject* object,CElementsRecord* history=NULL){};
00172     inline CExtObject* __fastcall  RemoveFirstFromROList(void); // odstraní ze seznamu první registrovaný objekt
00173     inline CSimpleList<CExtObject>& __fastcall GetROList(void);
00174 
00175   // registrace handlerů obsluhující události ----------------------------------
00176     bool __fastcall RegisterEventForServer(const CEventIdentifier& event,CExtObject* server);
00177     bool __fastcall UnregisterEventForServer(const CEventIdentifier& event,CExtObject* server);
00178     bool __fastcall UnregisterAllEvents(void);
00179 
00180     bool __fastcall UnregisterAllEventsForClient(CExtObject* client);
00181     bool __fastcall UnregisterAllEventsForClient(CExtVisObject* client);
00182 
00183   // metody - vyvolá událost
00184     void __fastcall ThrowEvent(const CEventIdentifier& event);
00185     void __fastcall ThrowEvent(const CEventIdentifier& event,void* p_data);
00186 
00187   // metody - zpracuje událost
00188     virtual void __fastcall ProcessEvent(const CEventIdentifier& event,CExtObject* Sender,void* p_data);
00189 
00190   // metody - povoluje šíření událostí
00191     inline void __fastcall EnableEvents(bool status);
00192 
00193   // sekce soukromých dat ------------------------------------------------------
00194     private:
00195     class CEventRecievers;         // zpracovatelé události - viz dále
00196     CProject*                       FProject;            // projekt, pod který patří
00197     CStatus                         Status;             // status objektu
00198     CSimpleList<CEventRecievers>    RegisteredEvents;   // registrované události a zpracovatelé
00199     CSimpleList<CExtObject>         Servers;            // používané servery
00200     CEventRecievers*                RunningEventReceiver;
00201     bool                            EnabledEvents;      // povolení vyvolání události
00202     CSimpleList<CExtObject>             RegisteredObjects;  // registrované objekty
00203     CObjectDesigner*                ObjectDesigner;
00204 
00205     virtual bool __fastcall PropagateStatus(const CStatus& status,const CStatus& mask);
00206     friend class CObjectDesigner;
00207     friend class CExtVisObject;
00208     friend class CEventRecievers;
00209     };
00210 
00211 //------------------------------------------------------------------------------
00212 
00213 /*  TŘÍDA: class CComObject::CEventRecievers
00214     ÚČEL:  sdružuje zpracovatelé události Event
00215 */
00216 
00217 class CExtObject::CEventRecievers{ // popis příjemců zprávy
00218     public:
00219                 __fastcall CEventRecievers(const CEventIdentifier& event);
00220     // registruje funkci pro zpracování události
00221     bool    __fastcall RegisterClient(CExtObject* client);
00222     bool    __fastcall RegisterClient(CExtVisObject* client);
00223     // odregistruje funkci pro zpracování události
00224     bool    __fastcall UnregisterClient(CExtObject* client);
00225     bool    __fastcall UnregisterClient(CExtVisObject* client);
00226     //
00227     bool    __fastcall UnregisterClientOnServerSide(CExtObject* server);
00228     // vyvolá událost nad všemi registrovanými zpracovateli událostí
00229     void    __fastcall ThrowEvent(CExtObject* object,void* p_data);
00230     // událost nemá žádného zpracovatele (vrátí FALSE)
00231     inline bool                     __fastcall IsEmpty(void) const;
00232     // vrátí přidruženou událost
00233     inline const CEventIdentifier&  __fastcall GetEvent(void);
00234     inline void __fastcall SetRemoveAfterThrowEvent(void);
00235 
00236   // sekce dat ------------------------------------------------------
00237     public:
00238     bool    RemoveAfterThrowEvent;
00239 
00240     private:
00241     const CEventIdentifier& Event;          // událost
00242     class CClientDescription{
00243         public:
00244         CExtObject*     ExtClient;
00245         CExtVisObject*  ExtVisClient;
00246         };
00247     CSimpleList<CClientDescription> Clients;      // zpracovatelé události
00248     CSimpleIterator<CClientDescription> TPH;
00249     bool   MoveTPH;
00250     };
00251 
00252 //------------------------------------------------------------------------------
00253 
00254 // definice událostí pro objekt CComObject
00255 
00256 DECLARE_EVENT(ExtObject_SetName);
00257 DECLARE_EVENT(ExtObject_SetDescription);
00258 DECLARE_EVENT(ExtObject_SetStatus);
00259 DECLARE_EVENT(ExtObject_Delete);
00260 DECLARE_EVENT(ExtObject_SetGeoDescriptor);
00261 
00262 //------------------------------------------------------------------------------
00263 
00264 /*  TŘÍDA: CExtObjectNameHistory
00265     ÚČEL:  záznam změny jména
00266 */
00267 
00268 class CExtObjectNameHistory:public CCoreElementsRecord{
00269     public:
00270  // konstruktor a destruktor ---------------------------------------------------
00271         __fastcall CExtObjectNameHistory(CExtObject* p_object,const CSmallString& newname);
00272 
00273                 // zjištění celého řetězce popisujícího změnu
00274     virtual CSmallString __fastcall GetDescription(const CSmallString& format);
00275 
00276  // sekce soukromých dat -------------------------------------------------------
00277     private:
00278     CProject*           Project;     // vlastník
00279     CSmallString            NewName;      // nová hodnota
00280     CSmallString            OldName;      // původní hodnota Z
00281     CPluginObjectInfo*  ObjectInfo;
00282     int                         ObjectIndex; // index objektu
00283 
00284     virtual void __fastcall Forward(void);
00285     virtual void __fastcall Backward(void);
00286     };
00287 
00288 //------------------------------------------------------------------------------
00289 
00290 /*  TŘÍDA: CExtObjectDescriptionHistory
00291     ÚČEL:  záznam změny popisu objektu
00292 */
00293 class CExtObjectDescriptionHistory:public CCoreElementsRecord{
00294     public:
00295  // konstruktor a destruktor ---------------------------------------------------
00296         __fastcall CExtObjectDescriptionHistory(CExtObject* p_object,const CSmallString& newdescription);
00297 
00298                 // zjištění celého řetězce popisujícího změnu
00299     virtual CSmallString __fastcall GetDescription(const CSmallString& format);
00300 
00301  // sekce soukromých dat -------------------------------------------------------
00302     private:
00303     CProject*           Project;     // vlastník
00304     CSmallString            NewDescription;      // nová hodnota
00305     CSmallString            OldDescription;      // původní hodnota Z
00306     int                         ObjectIndex; // index objektu
00307     CPluginObjectInfo*  ObjectInfo;
00308 
00309     virtual void __fastcall Forward(void);
00310     virtual void __fastcall Backward(void);
00311     };
00312 
00313 //------------------------------------------------------------------------------
00314 
00315 /*  TŘÍDA: CHL_ChangeDescription
00316     ÚČEL:  záznam změny popisu objektu
00317 */
00318 class CExtObjectStatusHistory:public CCoreElementsRecord{
00319     public:
00320  // konstruktor a destruktor ---------------------------------------------------
00321         __fastcall CExtObjectStatusHistory(CExtObject* p_object,const CExtObject::CStatus& newstatus);
00322 
00323                 // zjištění celého řetězce popisujícího změnu
00324     virtual CSmallString __fastcall GetDescription(const CSmallString& format);
00325 
00326  // sekce soukromých dat -------------------------------------------------------
00327     private:
00328     CProject*       Project;     // vlastník
00329     CExtObject::CStatus         NewStatus;      // nová hodnota
00330     CExtObject::CStatus         OldStatus;      // původní hodnota Z
00331     int                     ObjectIndex; // index objektu
00332 
00333     virtual void __fastcall Forward(void);
00334     virtual void __fastcall Backward(void);
00335     };
00336 
00337 //------------------------------------------------------------------------------
00338 
00339 inline CProject* __fastcall CExtObject::GetProject(void) const
00340 {
00341  return(Project);
00342 }
00343 
00344 //------------------------------------------------------------------------------
00345 
00346 inline bool __fastcall CExtObject::IsLocked(void) const
00347 {
00348  return(Status.Locked);
00349 }
00350 
00351 //------------------------------------------------------------------------------
00352 
00353 inline bool __fastcall CExtObject::IsVisible(void) const
00354 {
00355  return(Status.Visible);
00356 }
00357 
00358 //------------------------------------------------------------------------------
00359 
00360 inline __fastcall CExtObject::IsHighlighted(void) const
00361 {
00362  return(Status.Highlighted);
00363 }
00364 
00365 //------------------------------------------------------------------------------
00366 
00367 inline const CExtObject::CStatus& __fastcall CExtObject::GetStatus(void) const
00368 {
00369  return(Status);
00370 }
00371 //------------------------------------------------------------------------------
00372 
00373 inline void __fastcall CExtObject::EnableEvents(bool status)
00374 {
00375  EnabledEvents = status;
00376 }
00377 
00378 //------------------------------------------------------------------------------
00379 //###########################################################################
00380 //---------------------------------------------------------------------------
00381 
00382 inline bool __fastcall CExtObject::CEventRecievers::IsEmpty(void) const
00383 {
00384  return(Clients.IsEmpty());
00385 }
00386 
00387 //---------------------------------------------------------------------------
00388 
00389 inline const CEventIdentifier& __fastcall CExtObject::CEventRecievers::GetEvent(void)
00390 {
00391  return(Event);
00392 }
00393 
00394 //------------------------------------------------------------------------------
00395 
00396 inline CExtObject* __fastcall CExtObject::RemoveFirstFromROList(void)
00397 {
00398  return(RegisteredObjects.RemoveFromBegin());
00399 }
00400 
00401 //------------------------------------------------------------------------------
00402 
00403 inline void  __fastcall CExtObject::RegisterObject(CExtObject* p_ro)
00404 {
00405  RegisteredObjects.InsertToEnd(p_ro);
00406 }
00407 
00408 //------------------------------------------------------------------------------
00409 
00410 inline void  __fastcall CExtObject::UnregisterObject(CExtObject* p_ro)
00411 {
00412  RegisteredObjects.Remove(p_ro);
00413 }
00414 
00415 //------------------------------------------------------------------------------
00416 
00417 inline CSimpleList<CExtObject>& __fastcall CExtObject::GetROList(void)
00418 {
00419  return(RegisteredObjects);
00420 }
00421 
00422 //------------------------------------------------------------------------------
00423 
00424 
00425 #endif

Generated on Sun Feb 9 12:53:50 2003 for NemesisCore by doxygen1.3-rc2