/*!
 * \mainpage Dia Developer Documentation

This documentation describes some of the internal structure of the
Dia application for software developers interested in extending it.

Dia is a highly extensible application. There are plug-in mechanisms to add
diagram objects by 
 - C plug-ins (\ref Objects)
 - and by XML files (\ref Shapes).

Import and export facilities of Dia can be extended by plug-ins by
implementing \ref Renderers "Renderers"
 - written in C/C++ (\ref Plugins) 
 - and Python (\ref PyDia).

Additionally there is the possibility to extend Dia with arbitrary
functionality by registering actions in the menu. Again by
 - writing plug-ins in C/C++ (e.g. \ref LayoutPlugin)
 - or with Python (e.g. \ref arrange.py)

 */

/*!
\defgroup Objects Objects and their Building Blocks
\brief An \ref _DiaObject "Object" describes the appearance and behavior of diagram parts

There are a bunch of services to help implementing Dia objects.

 - arrows: \ref ObjectArrows
 - connectionpoint and handle: \ref ObjectConnects
 - bounding box calculation: \ref ObjectBBox
 - autorouting: \ref Autorouting
 - text editing: to render in canvas text and allow it's editing
 - font: \ref ObjectFonts
 - object change: \ref _ObjectChange
 - StdProps: \ref StdProps
 - load/save:

 */
 
/*!
\defgroup StdProps Standard Property System
\ingroup ObjectParts
\brief Automatic User Interface creation and serialization of object properties

The Property System for Dia Object allows to:
 - describe type, range and user interface representation, see PropDescription.
 - build dynamic user interfaces for all object properties
 - transform data fields of DiaObject implementation into list of generic Property
   to allow editing including undo/redo support without writing object specific code

 */
 
/*!
\defgroup ObjectParts Building Blocks
\ingroup Objects Building blocks to help implementing _DiaObject and interfacing _DiaRenderer
\brief Typical \ref _DiaObject "Objects" are assembled from existing building blocks like _DiaImage
*/

/*!
\defgroup ObjectConnects Object Connections
\ingroup Objects
\brief Connections between objects are realized with \ref _Handle "Handle" and \ref _ConnectionPoint "Connection Point"

There are two specialized objects involved in building a connection. One is a Handle, the other one 
is a ConnectionPoint. In an existing connection between two DiaObject the Handle belongs to the 
first ("connected to") and the ConnectionPoint belongs to second ("connected by").

The "Standard - Line" DiaObject is special because it is one of only few objects which can be 
"connected to" (has Handles) and also "connected by" (has a ConnectionPoint). 
Note: there is an important difference between the active and the passive form.

It is important to understand the difference Dia's source is making between handle->connected_to 
and "connected by" (connectionpoint->connected). The former is a 0 or 1 relation, the latter is 0..n.
*/

/*!
\defgroup Shapes Custom Shape Definition
\ingroup Objects
\brief Custom objects can not only be defined by writing C code, but also with a SVG dialect

\verbinclude custom-shapes

*/

/*!
\defgroup DiagramStructure Diagrams keeping it all together
\brief A \ref _DiagramData "Diagram" consists of at least one \ref _Layer "Layer" containing zero or more \ref _DiaObject "Object"

 */

/*!
\defgroup DiagramXmlIo Operations on the XML DOM
\brief Low level access to the document object model
\ingroup DiagramStructure
\details
\verbinclude diagram.dtd
 */

/*!
\defgroup Renderers Rendering Objects
\brief The visual representation of \ref _DiaObject "objects" is done by \ref _DiaRenderer "renderers"

\ingroup Plugins

Dia Objects are drawing themselves to a renderer, be it for display, print or
file export to various formats.  The Dia library includes some base classes 
to help implementing rendering.

 - _DiaRenderer : implementing the interface to all renderers and some emulations
   of high level functions 
 - _DiaSvgRenderer : to create SVG format for SVG export and Shape creation
 - _DiaGdkRenderer : the _DiaGdkRenderer is the first display renderer
 - _DiaCairoRenderer : multi-format renderer based on http://cairographics.org
 - _DiaPathRenderer : allows to convert objects into their path representation
 - _DiaTransformRenderer : for affine transformation on the renderer API level
 - _DiaImportRenderer : helps to write file importer for formats which are "rendering",
   the result is a list of \ref StandardObjects

 */

/*!
\defgroup Plugins Import, Export and other extensions
\brief Extending Dia with optional dependencies 
 */

/*!
\defgroup ExportFilters Export Filters
\ingroup Plugins
\brief Export filters are usually implementing the \ref _DiaRenderer "renderer" interface

 */
 
/*!
\defgroup ImportFilters Import Filters
\ingroup Plugins
\brief Import filters translate an external representation to Dia \ref _DiaObject "objects"

 */
 
/*!
\defgroup PyDia Scripting Dia
\brief Extending Dia with Python (http://www.python.org)

\ingroup Plugins

The documentation of PyDia is self-contained with PyDia. You can use some
example PyDia plug-ins to generate it from your local Dia installation
(if build with Python support)

\image html PyDiaObjects.svg "PyDia Object Model" width=10cm

 */
