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 #ifndef GCU_OBJECT_H
00026 #define GCU_OBJECT_H
00027
00028 #include "matrix2d.h"
00029 #include <glib.h>
00030 #include <libxml/parser.h>
00031 #include <map>
00032 #include <set>
00033 #include <list>
00034 #include <string>
00035 #include <stdexcept>
00036 #include <gtk/gtk.h>
00037 #include <libgnomeprint/gnome-print.h>
00038
00039 #define square(x) ((x)*(x))
00040
00041 using namespace std;
00042
00043 namespace gcu
00044 {
00045
00070 enum GcuTypeId
00071 {
00072 NoType,
00073 AtomType,
00074 FragmentType,
00075 BondType,
00076 MoleculeType,
00077 ChainType,
00078 CycleType,
00079 ReactantType,
00080 ReactionArrowType,
00081 ReactionOperatorType,
00082 ReactionType,
00083 MesomeryType,
00084 MesomeryArrowType,
00085 DocumentType,
00086 TextType,
00087 OtherType
00088 };
00089
00094 typedef unsigned TypeId;
00095
00108 enum RuleId
00109 {
00110 RuleMayContain,
00111 RuleMustContain,
00112 RuleMayBeIn,
00113 RuleMustBeIn
00114 };
00115
00120 typedef unsigned SignalId;
00121
00122 class Document;
00123
00127 class Object
00128 {
00129 public:
00133 Object (TypeId Id = OtherType);
00137 virtual ~Object ();
00138
00143 TypeId GetType () {return m_Type;}
00149 void SetId (gchar* Id);
00153 const gchar* GetId () {return m_Id;}
00160 void AddChild (Object* object);
00167 Object* GetMolecule ();
00174 Object* GetReaction ();
00182 Object* GetGroup ();
00189 Document* GetDocument ();
00199 Object* GetParentOfType (TypeId Id);
00206 Object* GetChild (const gchar* Id);
00213 Object* GetFirstChild (map<string, Object*>::iterator& i);
00220 Object* GetNextChild (map<string, Object*>::iterator& i);
00227 Object* GetDescendant (const gchar* Id);
00231 Object* GetParent () {return m_Parent;}
00238 void SetParent (Object* Parent);
00247 virtual xmlNodePtr Save (xmlDocPtr xml);
00264 virtual bool Load (xmlNodePtr node);
00273 virtual void Move (double x, double y, double z = 0.);
00284 virtual void Transform2D (Matrix2D& m, double x, double y);
00293 bool SaveChildren (xmlDocPtr xml, xmlNodePtr node);
00299 void SaveId (xmlNodePtr node);
00310 xmlNodePtr GetNodeByProp (xmlNodePtr node, char* Property, char* Id);
00320 xmlNodePtr GetNextNodeByProp (xmlNodePtr node, char* Property, char* Id);
00330 xmlNodePtr GetNodeByName (xmlNodePtr node, char* Name);
00339 xmlNodePtr GetNextNodeByName (xmlNodePtr node, char* Name);
00346 virtual void Add (GtkWidget* w);
00352 virtual void Print (GnomePrintContext *pc);
00359 virtual void Update (GtkWidget* w);
00367 virtual void SetSelected (GtkWidget* w, int state);
00371 bool HasChildren () {return m_Children.size () != 0;}
00372
00376 unsigned GetChildrenNumber () {return m_Children.size ();}
00377
00386 virtual Object* GetAtomAt (double x, double y, double z = 0.);
00387
00394 virtual bool Build (list<Object*>& Children) throw (invalid_argument);
00395
00401 virtual double GetYAlign ();
00402
00415 virtual bool BuildContextualMenu (GtkUIManager *UIManager, Object *object, double x, double y);
00416
00423 void EmitSignal (SignalId Signal);
00424
00434 virtual bool OnSignal (SignalId Signal, Object *Child);
00435
00443 void Lock (bool state = true);
00444
00451 bool IsLocked () {return m_Locked > 0;}
00452
00460 Object* GetFirstLink (set<Object*>::iterator& i);
00461
00468 Object* GetNextLink (set<Object*>::iterator& i);
00469
00475 void Unlink (Object *object);
00476
00483 virtual void OnUnlink (Object *object);
00484
00490 void GetPossibleAncestorTypes (set<TypeId>& types);
00491
00501 static TypeId AddType (string TypeName, Object*(*CreateFunc)(), TypeId id = OtherType);
00502
00513 static Object* CreateObject (const string& TypeName, Object* parent = NULL);
00514
00520 static TypeId GetTypeId (const string& Name);
00521
00527 static string GetTypeName (TypeId Id);
00528
00536 static void AddRule (TypeId type1, RuleId rule, TypeId type2);
00537
00545 static void AddRule (const string& type1, RuleId rule, const string& type2);
00546
00553 static const set<TypeId>& GetRules (TypeId type, RuleId rule);
00554
00561 static const set<TypeId>& GetRules (const string& type, RuleId rule);
00562
00570 static void SetCreationLabel (TypeId Id, string Label);
00571
00577 static const string& GetCreationLabel (TypeId Id);
00578
00584 static const string& GetCreationLabel (const string& TypeName);
00585
00589 static SignalId CreateNewSignalId ();
00590
00591 private:
00592 Object* RealGetDescendant (const gchar* Id);
00593
00594 private:
00595 gchar* m_Id;
00596 TypeId m_Type;
00597 Object *m_Parent;
00598 map<string, Object*> m_Children;
00599 set<Object*> m_Links;
00600
00601 private:
00605 int m_Locked;
00606 };
00607
00608 }
00609 #endif //GCU_OBJECT_H