		      Marble Programmer's Manual
		      ==========================


This file describes how you can use parts of Marble in your own
program, and how you can enhance Marble in various ways.  We will only
give an overview; the full API must be discovered through the API
documentation.


I. The Marble Architecture
--------------------------

Marble is both an application and a set of classes that will easily
let you visualize geodata in your own application.  In addition to
that, Marble supports plugins that will let you add data to the map. 

TODO: classes and their relationships

TODO: Data (files, network)


II. Using Marble in your own program
------------------------------------


As described above, the Marble package contains classes that let you
use show geodata in your own application.


II.1 Embedding the MarbleWidget in Your Application

Embedding the MarbleWidget is by far the easiest way to use Marble in
your own application.  You can use the MarbleWidget just like any
other QWidget.  If you have installed the Qt Designer plugins, you can
even use the Designer to insert the MarbleWidget into any .ui file.

To let the user control the MarbleWidget, you need one of either
MarbleControlBox or MarbleNavigator, both QWidgets.  The
MarbleControlBox is a full-blown control widget that will let the user
control all aspects of the MarbleWidget: map theme, projection,
position, zoom. It also provides a search function for placemarks.

The MarbleNavigator is a simpler control widget that only lets the
user navigate (pan, zoom and home position). The other aspects of the
widget will have to be controlled in some other way through the API.

In addition to the control widgets, the user can also control the
MarbleWidgets through keyboard or mouse events.  This is done through
a class called MarbleWidgetInputHandler.  There is a default
implementation of the base class called
MarbleWidgetDefaultInputHandler, which provides the default
behaviour.  However, the application programmer can define any
MarbleWidgetInputHandler and register that in the widget through the
setInputHandler() function.


II.2 Using the MarbleMap class

Programmers who cannot use a MarbleWidget can still use Marble. The
way to do it is to use the more abstract class MarbleMap.  It
represents the contents of the MarbleWidget, but without the widget
part.  A MarbleMap can be manipulated in almost the same way as the
MarbleWidget. In fact, a MarbleWidget can almost be seen as just a
container around the MarbleMap.

The most important function of the MarbleMap is paint() function.  It
uses the GeoPainter to paint the map on any QPaintDevice, and a QRect
which indicates the part of the image to paint.  This can be useful in
situations where only part of the image has to be redrawn.

The GeoPainter is a class derived from QPainter with some additional
features: 

 - It can be used to paint on the map using geo coordinates (lat,
   lon).  The features that are drawn on the map will be painted in
   any supported projection can map painted either geo projected or
   not geo projected.  The former means that e.g. a rectangle that is
   geo projected may be drawn with non-straight edges according to the
   chosen projection.

 - It can paint with different qualities (see class MapQuality), which
   is used to speed things up e.g. during panning or zooming.

 - It has some optimizations that are relevant when very large objects
   are painted, which is not uncommon at high zoom levels.  These
   optimizations are especially important when the objects in question
   are outside the visible area or only partly visible. 

For more uses of the GeoPainter class, see the chapter below on
writing Marble plugins.


III. Enhancing Marble's Functionality
-------------------------------------


III.1 Adding New Maps 

III.1.1 Marble Path

III.1.2 DGML



III.2 Writing Marble Plugins

TODO: Layers

TODO: GeoPainter

TODO: 
