// -*- C++ -*-
/*
* GChemPaint library
* document.h
*
* Copyright (C) 2001-2007 Jean Bréfort <jean.brefort@normalesup.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef GCHEMPAINT_DOCUMENT_H
#define GCHEMPAINT_DOCUMENT_H
#include <list>
#include <map>
#include <set>
#include <string>
#include <libxml/tree.h>
#include <gtk/gtk.h>
#include <libgnomeprint/gnome-print.h>
#include <gcu/document.h>
#include <gcu/macros.h>
#include "atom.h"
#include "fragment.h"
#include "bond.h"
#include "molecule.h"
#include "operation.h"
namespace OpenBabel
{
class OBMol;
}
using namespace OpenBabel;
using namespace std;
extern SignalId OnChangedSignal;
extern SignalId OnDeleteSignal;
extern SignalId OnThemeChangedSignal;
class gcpView;
class gcpApplication;
class gcpWindow;
class gcpTheme;
class gcpDocument: public Document
{
//Constructor and destructor
public:
gcpDocument(gcpApplication *App, bool StandAlone, gcpWindow *window = NULL);
virtual ~gcpDocument();
//Interface
public:
GtkWidget* GetWidget();
gcpView* GetView() {return m_pView;}
void BuildBondList(list<gcpBond*>& BondList, Object* obj);
bool ImportOB(OBMol& Mol);
void ExportOB();
void BuildAtomTable(map<string, unsigned>& AtomTable, Object* obj, unsigned& index);
void Save();
virtual bool Load(xmlNodePtr);
const gchar* GetTitle();
void SetTitle(const gchar* title);
void SetLabel(const gchar* label);
const gchar* GetLabel();
void SetFileName (string const &, const gchar *mime_type);
const gchar* GetFileName() {return m_filename;}
void Print(GnomePrintContext *pc, gdouble width, gdouble height);
void AddObject(Object* pObject);
void AddAtom(gcpAtom* pAtom);
void AddFragment(gcpFragment* pFragment);
void AddBond(gcpBond* pBond);
void ParseXMLTree(xmlDocPtr xml);
void LoadObjects(xmlNodePtr node);
xmlDocPtr BuildXMLTree();
void NotifyDirty (gcpBond* pBond) {m_DirtyObjects.insert (pBond);}
void Update();
void Remove(Object*);
void Remove(const char* Id);
void OnProperties();
void OnUndo();
void OnRedo();
const GDate* GetCreationDate() {return &CreationDate;}
const GDate* GetRevisionDate() {return &RevisionDate;}
const gchar* GetAuthor() {return m_author;}
const gchar* GetMail() {return m_mail;}
const gchar* GetComment() {return m_comment;}
void SetAuthor(const gchar* author);
void SetMail(const gchar* mail);
void SetComment(const gchar* comment);
void FinishOperation();
void AbortOperation();
void PopOperation();
void PushOperation(gcpOperation* operation, bool undo = true);
void SetActive();
gcpOperation* GetNewOperation(gcpOperationType type);
gcpOperation* GetCurrentOperation () {return m_pCurOp;}
void AddData(xmlNodePtr node);
bool CanUndo() {return m_UndoList.size() > 0;}
void SetEditable(bool editable) {m_bWriteable = editable; m_bUndoRedo = true;}
bool GetEditable() {return m_bWriteable;}
gcpApplication* GetApplication() {return m_pApp;}
void ExportImage (string const &filename, const char* type, int resolution = -1);
void SetReadOnly (bool ro);
bool GetReadOnly () {return m_bReadOnly;}
virtual double GetYAlign ();
gcpWindow *GetWindow () {return m_Window;}
void SetTheme (gcpTheme *theme);
bool OnSignal (SignalId Signal, Object *Child);
void SetDirty (bool isDirty = true);
void OnThemeNamesChanged ();
double GetMedianBondLength ();
private:
void RemoveAtom(gcpAtom* pAtom);
void RemoveBond(gcpBond* pBond);
void RemoveFragment(gcpFragment* pFragment);
//Implementation
private:
gcpView * m_pView;
gchar* m_filename;
gchar *m_title;
gchar *m_label;
gchar *m_comment, *m_author, *m_mail;
set<Object*>m_DirtyObjects;
bool m_bIsLoading, m_bUndoRedo, m_bReadOnly;
string m_FileType;
bool m_bWriteable;
GDate CreationDate, RevisionDate;
list<gcpOperation*> m_UndoList, m_RedoList;
gcpOperation* m_pCurOp;
gcpApplication* m_pApp;
gcpWindow *m_Window;
unsigned long m_OpID; // last operation ID
unsigned m_LastStackSize; // undo list size when last saved
/* Theme is not really a read only property, but we provide a special Set
method */
GCU_RO_PROP (gcpTheme*, Theme)
GCU_PROP (double, BondLength)
GCU_PROP (double, BondAngle)
GCU_PROP (double, ArrowLength)
GCU_PROP (gchar*, TextFontFamily)
GCU_PROP (PangoStyle, TextFontStyle)
GCU_PROP (PangoWeight, TextFontWeight)
GCU_PROP (PangoVariant, TextFontVariant)
GCU_PROP (PangoStretch, TextFontStretch)
GCU_PROP (gint, TextFontSize)
GCU_RO_PROP (PangoAttrList*, PangoAttrList)
};
extern list<gcpDocument*> Docs;
extern bool bCloseAll;
#endif // GCHEMPAINT_DOCUMENT_H
syntax highlighted by Code2HTML, v. 0.9.1