summaryrefslogtreecommitdiffstats
path: root/karbon/core/vobject.h
diff options
context:
space:
mode:
Diffstat (limited to 'karbon/core/vobject.h')
-rw-r--r--karbon/core/vobject.h299
1 files changed, 299 insertions, 0 deletions
diff --git a/karbon/core/vobject.h b/karbon/core/vobject.h
new file mode 100644
index 000000000..9aa6885ac
--- /dev/null
+++ b/karbon/core/vobject.h
@@ -0,0 +1,299 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001, The Karbon Developers
+ Copyright (C) 2002, The Karbon Developers
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __VOBJECT_H__
+#define __VOBJECT_H__
+
+
+#include <KoRect.h>
+#include <dcopobject.h>
+#include <koffice_export.h>
+
+class QDomElement;
+class VDocument;
+class VFill;
+class VPainter;
+class VStroke;
+class VVisitor;
+class DCOPObject;
+class KoStore;
+class KoXmlWriter;
+class KoOasisLoadingContext;
+class KoGenStyles;
+class KoGenStyle;
+
+/**
+ * The base class for all karbon objects. Every object should
+ * have the ability to draw itself using a painter, perform
+ * hit detection, transform on demand, clone and load/save itself.
+ * Also each object manages its own bounding box and keeps track of its
+ * parent object.
+ */
+class KARBONBASE_EXPORT VObject
+{
+public:
+ enum VState
+ {
+ normal = 0, /**< visible, not active */
+ normal_locked = 1, /**< visible, but locked (r/o) */
+ hidden = 2, /**< hidden */
+ hidden_locked = 3, /**< hidden and locked (r/o) */
+ deleted = 4, /**< deleted, nearly dead */
+
+ // shape specific states:
+ selected = 5, /**< visible, active and can be manipulated by tools */
+ edit = 6 /**< visible, active and is currently manipulated by a tool */
+ };
+
+ /**
+ * Constructs a new object that is child of parent and has the given state.
+ *
+ * @param parent the new object's parent
+ * @param state the new object's state
+ */
+ VObject( VObject* parent, VState state = edit );
+
+ /**
+ * Copy constructor.
+ * Copies parent, state and name of given object.
+ *
+ * @param obj the object to copy properties from
+ */
+ VObject( const VObject& obj );
+
+ /**
+ * Destroys the object and deletes the stroke, fill and DCOP-object.
+ */
+ virtual ~VObject();
+
+ /**
+ * Returns pointer to internal DCOP object.
+ *
+ * If no internal DCOP object exist yet, it is created.
+ */
+ virtual DCOPObject* dcopObject();
+
+ /**
+ * Draw the object to a painting device.
+ *
+ * @param painter abstraction that is used to render to a painting device.
+ * @param rect represents the visible rectangular area. If this object doesn't
+ * intersect with this area it is not drawn.
+ */
+ virtual void draw( VPainter* painter, const KoRect* rect = 0L ) const
+ {
+ Q_UNUSED( painter );
+ Q_UNUSED( rect );
+ }
+
+ /**
+ * Calculates the tightest bounding box around the object.
+ *
+ * @return the bounding box.
+ */
+ virtual const KoRect& boundingBox() const
+ { return m_boundingBox; }
+
+ /**
+ * Checks if the bounding box is invalid and needs to be recalculated.
+ *
+ * @return true if bounding box is invalid.
+ */
+ bool boundingBoxIsInvalid() const
+ { return m_boundingBoxIsInvalid; }
+
+ /**
+ * Invalidates the bounding box, so it has to be recalculated.
+ * This function is public so visitors can access it themself at the right
+ * time when they manipulate many VSegments.
+ */
+ void invalidateBoundingBox()
+ {
+ m_boundingBoxIsInvalid = true;
+
+ if( m_parent )
+ m_parent->invalidateBoundingBox();
+ }
+
+ /**
+ * Sets a new parent object.
+ *
+ * @param parent the new parent object
+ */
+ void setParent( VObject* parent ) { m_parent = parent; }
+
+ /**
+ * Returns pointer to current parent object.
+ *
+ * @return pointer to current parent object or 0 if no parent object is set
+ */
+ VObject* parent() const { return m_parent; }
+
+ /**
+ * Get the state the object is in.
+ *
+ * @return the object state at time of calling.
+ */
+ VState state() const { return m_state; }
+
+ /**
+ * Sets the state to a specified new state.
+ * Note that this will not have any visual effect until draw() is
+ * called on this object.
+ *
+ * @param state the new state.
+ */
+ virtual void setState( const VState state ) { m_state = state; }
+
+ /**
+ * Gets the object's actual stroke.
+ *
+ * @return pointer to the object's stroke
+ */
+ virtual VStroke* stroke() const { return m_stroke; }
+
+ /**
+ * Gets the object's actual fill.
+ *
+ * @return pointer to the object's fill
+ */
+ virtual VFill* fill() const { return m_fill; }
+
+ /**
+ * Sets the stroke to a given new stroke.
+ *
+ * @param stroke the new stroke
+ */
+ virtual void setStroke( const VStroke& stroke );
+
+ /**
+ * Sets the fill to a given new fill.
+ *
+ * @param fill the new fill
+ */
+ virtual void setFill( const VFill& fill );
+
+ /**
+ * Save this object's state to xml.
+ *
+ * @param element the DOM element to which the attributes are saved
+ */
+ virtual void save( QDomElement& element ) const;
+
+ /**
+ * Save this object's state to OpenDocument.
+ *
+ * @param store FIXME
+ * @param docWriter FIXME
+ * @param mainStyles FIXME
+ */
+ virtual void saveOasis( KoStore *store, KoXmlWriter *docWriter, KoGenStyles &mainStyles, int &index ) const;
+
+ /**
+ * Load this object's state from xml and initialize
+ * this object accordingly.
+ *
+ * @param element the DOM element from which the attributes are read
+ */
+ virtual void load( const QDomElement& element );
+
+ /**
+ * Load this object's state from OpenDocument and initialize
+ * this object accordingly.
+ *
+ * @param element the DOM element to read attributes from
+ * @param context FIXME
+ */
+ virtual bool loadOasis( const QDomElement &element, KoOasisLoadingContext &context );
+
+ /**
+ * Create an exact copy of this object.
+ *
+ * @return the exact object copy
+ */
+ virtual VObject* clone() const = 0;
+
+ /**
+ * Accept a VVisitor.
+ */
+ virtual void accept( VVisitor& /*visitor*/ )
+ { }
+
+ /**
+ * This function is important for undo/redo. It inserts newObject in front
+ * of oldObject.
+ *
+ * @param newObject the new object to insert
+ * @param oldObject the old object the new object is inserted in front of
+ */
+ virtual void insertInfrontOf( VObject* newObject, VObject* oldObject )
+ {
+ Q_UNUSED( newObject );
+ Q_UNUSED( oldObject );
+ }
+
+ /**
+ * Returns the name of the object.
+ *
+ * @return the object's name
+ */
+ virtual QString name() const;
+
+ /**
+ * Sets the object's name to a given new name.
+ *
+ * @param s the new object name
+ */
+ void setName( const QString &s );
+
+ /**
+ * Return document the object belongs to.
+ *
+ * @return pointer to parent document or 0 if object does not belong to a document
+ */
+ VDocument *document() const;
+
+protected:
+ /**
+ * Adds a new given style to the specified OASIS context
+ *
+ * @param style FIXME
+ * @param context FIXME
+ */
+ void addStyles( const QDomElement* style, KoOasisLoadingContext & context );
+
+ virtual void saveOasisFill( KoGenStyles &mainStyles, KoGenStyle &stylesojectauto ) const;
+
+protected:
+ mutable KoRect m_boundingBox; /**< the object's bounding box */
+ mutable VState m_state : 8; /**< the object's state */
+ mutable bool m_boundingBoxIsInvalid : 1; /**< the flag stating if the bounding box is valid */
+
+ VStroke* m_stroke; /**< the object's stroke */
+ VFill* m_fill; /**< the object's fill */
+
+ DCOPObject *m_dcop; /**< the object's DCOP object */
+
+private:
+ VObject* m_parent;
+};
+
+#endif
+