gcp/atom.h

00001 // -*- C++ -*-
00002 
00003 /* 
00004  * GChemPaint library
00005  * atom.h 
00006  *
00007  * Copyright (C) 2001-2007 Jean Bréfort <jean.brefort@normalesup.org>
00008  *
00009  * This program is free software; you can redistribute it and/or 
00010  * modify it under the terms of the GNU General Public License as 
00011  * published by the Free Software Foundation; either version 2 of the
00012  * License, or (at your option) any later version.
00013  *
00014  * This program 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 this program; if not, write to the Free Software
00021  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
00022  * USA
00023  */
00024 
00025 #ifndef GCHEMPAINT_ATOM_H
00026 #define GCHEMPAINT_ATOM_H
00027 
00028 #include <map>
00029 #include <glib.h>
00030 #include <gcu/atom.h>
00031 #include <gcu/dialog-owner.h>
00032 #include <gcu/element.h>
00033 #include <gcu/macros.h>
00034 #include <libgnomecanvas/gnome-canvas.h>
00035 #include "widgetdata.h"
00036 
00037 namespace OpenBabel
00038 {
00039         class OBAtom;
00040 }
00041 
00042 namespace gcp {
00043 
00044 class Bond;
00045 class Cycle;
00046 class Molecule;
00047 
00048 #define CHARGE_NE 1
00049 #define CHARGE_NW 2
00050 #define CHARGE_N 4
00051 #define CHARGE_SE 8
00052 #define CHARGE_SW 16
00053 #define CHARGE_S 32
00054 #define CHARGE_E 64
00055 #define CHARGE_W 128
00056 
00057 #define POSITION_NE 1
00058 #define POSITION_NW 2
00059 #define POSITION_N 4
00060 #define POSITION_SE 8
00061 #define POSITION_SW 16
00062 #define POSITION_S 32
00063 #define POSITION_E 64
00064 #define POSITION_W 128
00065 
00066 enum {
00067         LEFT_HPOS,
00068         RIGHT_HPOS,
00069         AUTO_HPOS,
00070 };
00071 
00072 class Electron;
00073 
00074 class Atom: public gcu::Atom, public gcu::DialogOwner
00075 {
00076 public:
00077         Atom ();
00078         Atom (int Z, double x, double y, double z);
00079         Atom (OpenBabel::OBAtom* atom);
00080         virtual ~Atom ();
00081 
00082 public :
00083         virtual void SetZ (int Z);
00084         void AddBond (gcu::Bond* pBond);
00085         void RemoveBond (gcu::Bond* pBond);
00086         virtual void Update ();
00087         virtual void Add (GtkWidget* w);
00088         virtual void Update (GtkWidget* w);
00089         int GetTotalBondsNumber (); //take bond order into account
00090         int GetAttachedHydrogens () {return m_nH;}
00091         bool GetBestSide ();
00092         bool IsInCycle (Cycle* pCycle);
00093         virtual int GetChargePosition (unsigned char& Pos, double Angle, double& x, double& y);
00094         virtual int GetAvailablePosition (double& x, double& y);
00095         virtual bool GetPosition (double angle, double& x, double& y);
00096         virtual xmlNodePtr Save (xmlDocPtr xml);
00097         virtual bool Load (xmlNodePtr);
00098         virtual bool LoadNode (xmlNodePtr);
00099         virtual void SetSelected (GtkWidget* w, int state);
00100         virtual bool AcceptNewBonds (int nb = 1);
00101         virtual bool AcceptCharge (int charge);
00102         virtual double GetYAlign ();
00103         virtual void Transform2D (gcu::Matrix2D& m, double x, double y);
00104         bool BuildContextualMenu (GtkUIManager *UIManager, Object *object, double x, double y);
00110         virtual void AddToMolecule (Molecule* Mol);
00111         bool HasImplicitElectronPairs ();
00112         bool MayHaveImplicitUnpairedElectrons ();
00118         void AddElectron (Electron* electron);
00124         void RemoveElectron (Electron* electron);
00125         void NotifyPositionOccupation (unsigned char pos, bool occupied);
00126         void SetChargePosition (unsigned char Pos, bool def, double angle = 0., double distance = 0.);
00127         char GetChargePosition (double *Angle, double *Dist);
00128         void SetCharge (int charge);
00129         int GetCharge () {return m_Charge;}
00130         void ForceChanged () {m_Changed = true;}
00131         cairo_rectangle_t &GetInkRect () {return m_InkRect;}
00132         cairo_rectangle_t &GetHInkRect () {return m_HInkRect;}
00133 
00134 private:
00135         void BuildItems (WidgetData* pData);
00136         void UpdateAvailablePositions ();
00137 
00138 private:
00139         gcu::Element *m_Element;
00140         int m_nH;
00141         int m_Valence; //valence
00142         int m_ValenceOrbitals;
00143         int m_nlp; //lone electron pairs number
00144         int m_nlu; //single electrons number
00145         double m_width, m_height; //size of the atomic symbol in the canvas
00146         double m_length, m_text_height; // size of the text buffer
00147         int m_HPos; //0 = left, 1 = right, 2 = top, 3 = bottom
00148         bool m_ChargeAuto;
00149         int m_Changed; //update needs regenerate the buffer
00150         int m_ascent;
00151         double m_lbearing;
00152         double m_CHeight;
00153         unsigned char m_AvailPos; //available standard positions for charge and electrons representations
00154         unsigned char m_OccupiedPos;
00155         bool m_AvailPosCached;
00156         unsigned char m_ChargePos;
00157         bool m_ChargeAutoPos;
00158         double m_ChargeAngle;
00159         double m_ChargeDist;
00160         double m_ChargeWidth, m_ChargeTWidth, m_ChargeXOffset, m_ChargeYOffset;
00161         std::list<double> m_AngleList;
00162         std::map<double, double> m_InterBonds; /* positions betwen bonds. First  value is the
00163         angle between the two bonds and second value is the direction */
00164         PangoLayout *m_Layout, *m_ChargeLayout;
00165         bool m_DrawCircle;
00166         std::string m_FontName;
00167         cairo_rectangle_t m_InkRect, m_HInkRect;
00168 
00169 GCU_PROP (bool, ShowSymbol)
00170 GCU_PROP (unsigned char, HPosStyle) //0=force left, 1=force right, 2=auto.
00171 };
00172 
00173 }       //      namespace gcp
00174 
00175 #endif // GCHEMPAINT_ATOM_H

Generated on Thu Dec 20 11:20:45 2007 for The Gnome Chemistry Utils by  doxygen 1.5.4