[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[vidalia-svn] r3589: Bring our patched Marble up to date with Marble trunk. (in marble/trunk: . examples examples/python src src/bindings/python/sip src/lib src/lib/Projections src/lib/geodata/handlers/osm-namefinder src/lib/runners src/plasmoid src/plugins/designer/latloneditwidget src/plugins/render/fileview src/plugins/render/navigation src/plugins/render/panoramio src/plugins/render/twitter tools/iau2kml)



Author: edmanm
Date: 2009-02-24 15:37:32 -0500 (Tue, 24 Feb 2009)
New Revision: 3589

Added:
   marble/trunk/src/plugins/render/panoramio/Panoramio.py
Removed:
   marble/trunk/src/lib/jsonparser.cpp
   marble/trunk/src/lib/jsonparser.h
Modified:
   marble/trunk/CMakeLists.txt
   marble/trunk/MarbleMacros.cmake
   marble/trunk/examples/example1.ui
   marble/trunk/examples/example2.ui
   marble/trunk/examples/python/simple_marble.py
   marble/trunk/src/CMakeLists.txt
   marble/trunk/src/KdeMainWindow.cpp
   marble/trunk/src/KdeMainWindow.h
   marble/trunk/src/QtMainWindow.cpp
   marble/trunk/src/bindings/python/sip/GeoDocument.sip
   marble/trunk/src/bindings/python/sip/MarbleRenderPluginInterface.sip
   marble/trunk/src/lib/CMakeLists.txt
   marble/trunk/src/lib/CacheStoragePolicy.cpp
   marble/trunk/src/lib/ExtDateTime.h
   marble/trunk/src/lib/FileStoragePolicy.cpp
   marble/trunk/src/lib/GeoPainter.cpp
   marble/trunk/src/lib/GeoPolygon.cpp
   marble/trunk/src/lib/HttpDownloadManager.cpp
   marble/trunk/src/lib/HttpDownloadManager.h
   marble/trunk/src/lib/HttpJob.cpp
   marble/trunk/src/lib/HttpJob.h
   marble/trunk/src/lib/MapThemeSortFilterProxyModel.cpp
   marble/trunk/src/lib/MapThemeSortFilterProxyModel.h
   marble/trunk/src/lib/MarbleMap.cpp
   marble/trunk/src/lib/MarbleMap.h
   marble/trunk/src/lib/MarbleModel.cpp
   marble/trunk/src/lib/MarblePhysics.cpp
   marble/trunk/src/lib/MarblePhysics.h
   marble/trunk/src/lib/MarbleRenderPlugin.h
   marble/trunk/src/lib/MarbleRenderPluginInterface.h
   marble/trunk/src/lib/MarbleRunnerManager.cpp
   marble/trunk/src/lib/MarbleRunnerManager.h
   marble/trunk/src/lib/MarbleWidget.cpp
   marble/trunk/src/lib/MarbleWidget.h
   marble/trunk/src/lib/MarbleWidgetInputHandler.cpp
   marble/trunk/src/lib/MarbleWidgetInputHandler.h
   marble/trunk/src/lib/PlaceMarkInfoDialog.ui
   marble/trunk/src/lib/PlaceMarkManager.cpp
   marble/trunk/src/lib/PlanetaryConstants.h
   marble/trunk/src/lib/PluginManager.cpp
   marble/trunk/src/lib/Projections/SphericalProjection.cpp
   marble/trunk/src/lib/Projections/SphericalProjection.h
   marble/trunk/src/lib/SunControlWidget.cpp
   marble/trunk/src/lib/SunControlWidget.h
   marble/trunk/src/lib/SunLocator.cpp
   marble/trunk/src/lib/SunLocator.h
   marble/trunk/src/lib/TextureColorizer.h
   marble/trunk/src/lib/TileLoader.cpp
   marble/trunk/src/lib/TinyWebBrowser.cpp
   marble/trunk/src/lib/TinyWebBrowser.h
   marble/trunk/src/lib/geodata/handlers/osm-namefinder/NamedTagHandler.cpp
   marble/trunk/src/lib/global.h
   marble/trunk/src/lib/runners/LatLonRunner.cpp
   marble/trunk/src/lib/runners/LatLonRunner.h
   marble/trunk/src/lib/runners/MarbleAbstractRunner.cpp
   marble/trunk/src/lib/runners/MarbleAbstractRunner.h
   marble/trunk/src/lib/runners/OnfRunner.cpp
   marble/trunk/src/lib/runners/OnfRunner.h
   marble/trunk/src/marble.kcfg
   marble/trunk/src/marble_part.cpp
   marble/trunk/src/plasmoid/worldclock.cpp
   marble/trunk/src/plugins/designer/latloneditwidget/LatLonEditPlugin.cpp
   marble/trunk/src/plugins/render/fileview/FileViewFloatItem.cpp
   marble/trunk/src/plugins/render/navigation/NavigationFloatItem.cpp
   marble/trunk/src/plugins/render/panoramio/PanoramioPlugin.cpp
   marble/trunk/src/plugins/render/panoramio/jsonparser.cpp
   marble/trunk/src/plugins/render/panoramio/jsonparser.h
   marble/trunk/src/plugins/render/twitter/jsonparser.cpp
   marble/trunk/src/plugins/render/twitter/jsonparser.h
   marble/trunk/src/plugins/render/twitter/twitterPlugin.cpp
   marble/trunk/src/plugins/render/twitter/twitterPlugin.h
   marble/trunk/src/qtmain.cpp
   marble/trunk/tools/iau2kml/iau2kml.cpp
Log:

Bring our patched Marble up to date with Marble trunk.


Modified: marble/trunk/CMakeLists.txt
===================================================================
--- marble/trunk/CMakeLists.txt	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/CMakeLists.txt	2009-02-24 20:37:32 UTC (rev 3589)
@@ -9,6 +9,15 @@
 # if this option is set, srtm.jpg will not be installed but the generated tiles instead
 option(TILES_AT_COMPILETIME "generate the srtm tiles at compiletime" ON)
 
+####################################################
+# Build a D-Bus interface for marble
+# This is disabled by default for all win32, apple and Qt-Only builds  
+if( QTONLY OR WIN32 OR APPLE)
+    option(BUILD_WITH_DBUS "Build the D-Bus interface for the Marble widget" OFF)
+else( QTONLY OR WIN32 OR APPLE )
+    option(BUILD_WITH_DBUS "Build the D-Bus interface for the Marble widget" ON)
+endif( QTONLY OR WIN32 OR APPLE )
+
 ###################################################
 # Check if KDE4 is available
 if( NOT QTONLY AND NOT KDE4_FOUND )
@@ -88,8 +97,8 @@
       SET( MACOSX_BUNDLE_SHORT_VERSION_STRING 0.3.0 )
       SET( MACOSX_BUNDLE_VERSION 0.3.0 )
       SET( MACOSX_BUNDLE_LONG_VERSION_STRING Version 0.3.0 )
-      #SET( CMAKE_OSX_ARCHITECTURES ppc;i386 ) #Comment out if not universal binary
-      SET( CMAKE_OSX_ARCHITECTURES i386 ) #Comment out if universal binary
+      SET( CMAKE_OSX_ARCHITECTURES ppc;i386 ) #Comment out if not universal binary
+      #SET( CMAKE_OSX_ARCHITECTURES i386 ) #Comment out if universal binary
       #SET (lib_dir ${CMAKE_INSTALL_PREFIX}/Marble.app/Contents/MacOS/lib)
       SET (data_dir   ${CMAKE_INSTALL_PREFIX}/Marble.app/Contents/MacOS/resources/data)
       SET (plugin_dir   ${CMAKE_INSTALL_PREFIX}/Marble.app/Contents/MacOS/resources/plugins)
@@ -233,7 +242,7 @@
   # distinguish between debug and release plugin
   SET(CMAKE_DEBUG_POSTFIX "d")
 endif(WIN32)
-
+add_definitions("-DDEBUG_TAGS")
 ####################################################
 # add cmake macros
 include( MarbleMacros )

Modified: marble/trunk/MarbleMacros.cmake
===================================================================
--- marble/trunk/MarbleMacros.cmake	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/MarbleMacros.cmake	2009-02-24 20:37:32 UTC (rev 3589)
@@ -95,7 +95,7 @@
 
 macro( marble_add_test TEST_NAME )
     if( BUILD_MARBLE_TESTS )
-        set( ${TEST_NAME}_SRCS ${TEST_NAME}.cpp )
+        set( ${TEST_NAME}_SRCS ${TEST_NAME}.cpp ${ARGN} )
         if( QTONLY )
             qt4_generate_moc( ${TEST_NAME}.cpp ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME}.moc )
             include_directories( ${CMAKE_CURRENT_BINARY_DIR} )

Modified: marble/trunk/examples/example1.ui
===================================================================
--- marble/trunk/examples/example1.ui	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/examples/example1.ui	2009-02-24 20:37:32 UTC (rev 3589)
@@ -48,7 +48,7 @@
       </widget>
      </item>
      <item rowspan="2" row="0" column="1" >
-      <widget class="MarbleWidget" name="MarbleWidget" >
+      <widget class="Marble::MarbleWidget" name="MarbleWidget" >
        <property name="toolTip" >
         <string>The Earth</string>
        </property>
@@ -69,7 +69,7 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>MarbleWidget</class>
+   <class>Marble::MarbleWidget</class>
    <extends>QWidget</extends>
    <header>MarbleWidget.h</header>
   </customwidget>

Modified: marble/trunk/examples/example2.ui
===================================================================
--- marble/trunk/examples/example2.ui	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/examples/example2.ui	2009-02-24 20:37:32 UTC (rev 3589)
@@ -28,7 +28,7 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="MarbleNavigator" name="MarbleNavigator" >
+      <widget class="Marble::MarbleNavigator" name="MarbleNavigator" >
        <property name="toolTip" >
         <string>Navigation Control</string>
        </property>
@@ -38,7 +38,7 @@
       </widget>
      </item>
      <item>
-      <widget class="MarbleWidget" name="MarbleWidget" >
+      <widget class="Marble::MarbleWidget" name="MarbleWidget" >
        <property name="toolTip" >
         <string>The Earth</string>
        </property>
@@ -193,12 +193,12 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>MarbleNavigator</class>
+   <class>Marble::MarbleNavigator</class>
    <extends>QWidget</extends>
    <header>MarbleNavigator.h</header>
   </customwidget>
   <customwidget>
-   <class>MarbleWidget</class>
+   <class>Marble::MarbleWidget</class>
    <extends>QWidget</extends>
    <header>MarbleWidget.h</header>
   </customwidget>

Modified: marble/trunk/examples/python/simple_marble.py
===================================================================
--- marble/trunk/examples/python/simple_marble.py	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/examples/python/simple_marble.py	2009-02-24 20:37:32 UTC (rev 3589)
@@ -1,20 +1,24 @@
 #!env python
 #
-# Copyright 2008 Simon Edwards <simon@xxxxxxxxxxxxx>
+#    Copyright 2008 Simon Edwards <simon@xxxxxxxxxxxxx>
 #
-# 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 file is part of the Marble Desktop Globe.
 #
-# 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.
+#    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.
 #
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#    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
+#    aint 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.
+#
 # A very simple example of how to use the marble widget.
 
 from PyQt4.QtCore import *

Modified: marble/trunk/src/CMakeLists.txt
===================================================================
--- marble/trunk/src/CMakeLists.txt	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/CMakeLists.txt	2009-02-24 20:37:32 UTC (rev 3589)
@@ -4,6 +4,10 @@
   add_definitions(-D_USE_MATH_DEFINES=1)
 endif(MSVC)
 
+if(BUILD_WITH_DBUS)
+add_definitions(-DMARBLE_DBUS)
+endif(BUILD_WITH_DBUS)
+
 include_directories(
   ${CMAKE_CURRENT_SOURCE_DIR}
   ${CMAKE_CURRENT_SOURCE_DIR}/lib

Modified: marble/trunk/src/KdeMainWindow.cpp
===================================================================
--- marble/trunk/src/KdeMainWindow.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/KdeMainWindow.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -12,9 +12,13 @@
 // Own
 #include "KdeMainWindow.h"
 
+// Qt
+#include <QtGui/QProgressBar>
+
 // KDE
 #include <kaction.h>
 #include <kactioncollection.h>
+#include <kstatusbar.h>
 #include <kparts/part.h>
 #include <kparts/componentfactory.h>
 
@@ -26,6 +30,9 @@
 
 // Local dir
 #include "ControlView.h"
+#include "HttpDownloadManager.h"
+#include "MarbleMap.h"
+#include "MarbleModel.h"
 #include "marble_part.h"
 
 namespace Marble
@@ -52,6 +59,7 @@
 
     connect( marbleWidget(), SIGNAL( themeChanged( QString ) ), 
 	     this, SLOT( setMapTitle() ) );
+    initStatusBar();
 }
 
 MainWindow::~MainWindow()
@@ -59,6 +67,63 @@
     delete m_part;
 }
 
+void MainWindow::initStatusBar()
+{
+    initDownloadProgressBar();
+}
+
+void MainWindow::initDownloadProgressBar()
+{
+    // get status bar and add progress widget
+    KStatusBar * const status_bar = statusBar();
+    qDebug() << "got status bar:" << status_bar;
+    m_downloadProgressBar = new QProgressBar;
+    status_bar->addPermanentWidget( m_downloadProgressBar );
+
+    HttpDownloadManager * const downloadManager =
+        m_part->controlView()->marbleWidget()->map()->model()->downloadManager();
+    qDebug() << "got download manager:" << downloadManager;
+
+    connect( downloadManager, SIGNAL( jobAdded( int )),
+             this, SLOT( downloadProgressJobAdded( int )));
+    connect( downloadManager, SIGNAL( downloadComplete( QString, QString )),
+             this, SLOT( downloadProgressJobCompleted( QString, QString )));
+}
+
+QProgressBar* MainWindow::downloadProgressBar() const
+{
+    return m_downloadProgressBar;
+}
+
+void MainWindow::downloadProgressJobAdded( int totalJobs )
+{
+    m_downloadProgressBar->setUpdatesEnabled( false );
+    if ( m_downloadProgressBar->value() < 0 ) {
+        m_downloadProgressBar->setMaximum( 1 );
+        m_downloadProgressBar->setValue( 0 );
+    } else {
+        m_downloadProgressBar->setMaximum( m_downloadProgressBar->maximum() + 1 );
+    }
+
+    qDebug() << "downloadProgressJobAdded: value/maximum: "
+             << m_downloadProgressBar->value() << '/' << m_downloadProgressBar->maximum();
+
+    m_downloadProgressBar->setUpdatesEnabled( true );
+}
+
+void MainWindow::downloadProgressJobCompleted( QString, QString )
+{
+    m_downloadProgressBar->setUpdatesEnabled( false );
+    m_downloadProgressBar->setValue( m_downloadProgressBar->value() + 1 );
+    if ( m_downloadProgressBar->value() == m_downloadProgressBar->maximum() )
+        m_downloadProgressBar->reset();
+
+    qDebug() << "downloadProgressJobCompleted: value/maximum: "
+             << m_downloadProgressBar->value() << '/' << m_downloadProgressBar->maximum();
+
+    m_downloadProgressBar->setUpdatesEnabled( true );
+}
+
 ControlView* MainWindow::marbleControl() const
 {
     return m_part->controlView();

Modified: marble/trunk/src/KdeMainWindow.h
===================================================================
--- marble/trunk/src/KdeMainWindow.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/KdeMainWindow.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -16,6 +16,8 @@
 
 #include <KXmlGuiWindow>
 
+class QProgressBar;
+
 namespace Marble
 {
 
@@ -32,14 +34,20 @@
                          QWidget *parent = 0 );
     ~MainWindow();
 
+    QProgressBar* downloadProgressBar() const;
     ControlView* marbleControl() const;
     MarbleWidget* marbleWidget() const;
 
  public slots:
+    void downloadProgressJobAdded( int );
+    void downloadProgressJobCompleted( QString, QString );
     void setMapTitle();
 
  private:
+    void initStatusBar();
+    void initDownloadProgressBar();
     MarblePart *m_part;
+    QProgressBar *m_downloadProgressBar;
 };
 
 }

Modified: marble/trunk/src/QtMainWindow.cpp
===================================================================
--- marble/trunk/src/QtMainWindow.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/QtMainWindow.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -482,32 +482,42 @@
 #else
      QSettings settings("KDE", "Marble Desktop Globe");
 #endif
-
      settings.beginGroup("MainWindow");
          resize(settings.value("size", QSize(640, 480)).toSize());
          move(settings.value("pos", QPoint(200, 200)).toPoint());
          showFullScreen(settings.value("fullScreen", false ).toBool());
          showSideBar(settings.value("sideBar", true ).toBool());
          showStatusBar(settings.value("statusBar", false ).toBool());
+         show();
          showClouds(settings.value("showClouds", true ).toBool());
          workOffline(settings.value("workOffline", false ).toBool());
          showAtmosphere(settings.value("showAtmosphere", true ).toBool());
      settings.endGroup();
 
+     setUpdatesEnabled(false);
+
      settings.beginGroup("MarbleWidget");
+         QString mapThemeId = settings.value("mapTheme", "" ).toString();
+         qDebug() << "ReadSettings: mapThemeId: " << mapThemeId;
+         m_controlView->marbleWidget()->setMapThemeId( mapThemeId );
+         m_controlView->marbleWidget()->setProjection(
+            (Projection)(settings.value("projection", 0 ).toInt())
+         );
          m_controlView->marbleWidget()->setHome( 
             settings.value("homeLongitude", 9.4).toDouble(), 
             settings.value("homeLatitude", 54.8).toDouble(),
             settings.value("homeZoom", 1050 ).toInt()
          );
          m_controlView->marbleWidget()->goHome();
-         QString mapThemeId = settings.value("mapTheme", "" ).toString();
-         qDebug() << "ReadSettings: mapThemeId: " << mapThemeId;
-         m_controlView->marbleWidget()->setMapThemeId( mapThemeId );
-         m_controlView->marbleWidget()->setProjection(
-            (Projection)(settings.value("projection", 0 ).toInt())
-         );
      settings.endGroup();
+     
+     settings.beginGroup( "Sun" );
+         m_controlView->sunLocator()->setShow( settings.value( "showSun", false ).toBool() );
+         m_controlView->sunLocator()->setCitylights( settings.value( "showCitylights", false ).toBool() );
+         m_controlView->sunLocator()->setCentered( settings.value( "centerOnSun", false ).toBool() );
+     settings.endGroup();
+
+     setUpdatesEnabled(true);
 }
 
 void MainWindow::writeSettings()
@@ -544,6 +554,12 @@
          settings.setValue( "mapTheme",   mapTheme ); 
          settings.setValue( "projection", projection ); 
      settings.endGroup();
+     
+     settings.beginGroup( "Sun" );
+         settings.setValue( "showSun",        m_controlView->sunLocator()->getShow() );
+         settings.setValue( "showCitylights", m_controlView->sunLocator()->getCitylights() );
+         settings.setValue( "centerOnSun",    m_controlView->sunLocator()->getCentered() );
+     settings.endGroup();
 }
 
 #include "QtMainWindow.moc"

Modified: marble/trunk/src/bindings/python/sip/GeoDocument.sip
===================================================================
--- marble/trunk/src/bindings/python/sip/GeoDocument.sip	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/bindings/python/sip/GeoDocument.sip	2009-02-24 20:37:32 UTC (rev 3589)
@@ -28,7 +28,6 @@
                             GeoDocument ();
 
 public:
-    unsigned long s_leakProtector;
     virtual bool            isGeoDataDocument () const;
     virtual bool            isGeoSceneDocument () const;
 };   // GeoDocument

Modified: marble/trunk/src/bindings/python/sip/MarbleRenderPluginInterface.sip
===================================================================
--- marble/trunk/src/bindings/python/sip/MarbleRenderPluginInterface.sip	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/bindings/python/sip/MarbleRenderPluginInterface.sip	2009-02-24 20:37:32 UTC (rev 3589)
@@ -25,6 +25,7 @@
 %End
 
 public:
+    virtual Marble::MarbleRenderPlugin* instance() = 0;
     virtual QStringList     backendTypes () const = 0;
     virtual QString         renderPolicy () const = 0;
     virtual QStringList     renderPosition () const = 0;

Modified: marble/trunk/src/lib/CMakeLists.txt
===================================================================
--- marble/trunk/src/lib/CMakeLists.txt	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/CMakeLists.txt	2009-02-24 20:37:32 UTC (rev 3589)
@@ -199,10 +199,10 @@
 # link with release version of Qt libs
 if (QTONLY)
     ADD_LIBRARY(marblewidget SHARED ${marblewidget_SRCS} ${SOURCES_UI_HDRS})
-    TARGET_LINK_LIBRARIES (marblewidget ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTSVG_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${QT_QTSCRIPT_LIBRARY} ${QT_QTMAIN_LIBRARY} )
+    TARGET_LINK_LIBRARIES (marblewidget ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTSVG_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${QT_QTSCRIPT_LIBRARY} ${QT_QTMAIN_LIBRARY} ${QT_QTWEBKIT_LIBRARY} )
 else (QTONLY)
     KDE4_ADD_LIBRARY(marblewidget SHARED ${marblewidget_SRCS} ${SOURCES_UI_HDRS})
-    TARGET_LINK_LIBRARIES (marblewidget ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTSVG_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${KDE4_KDECORE_LIBRARY} ${KDE4_KDEUI_LIBRARY} ${KDE4_KIO_LIBRARY} ${QT_QTMAIN_LIBRARY} ${QT_QTSCRIPT_LIBRARY} )
+    TARGET_LINK_LIBRARIES (marblewidget ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTSVG_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${KDE4_KDECORE_LIBRARY} ${KDE4_KDEUI_LIBRARY} ${KDE4_KIO_LIBRARY} ${QT_QTMAIN_LIBRARY} ${QT_QTSCRIPT_LIBRARY}  ${QT_QTWEBKIT_LIBRARY} )
 endif (QTONLY)
 
 if (APPLE)

Modified: marble/trunk/src/lib/CacheStoragePolicy.cpp
===================================================================
--- marble/trunk/src/lib/CacheStoragePolicy.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/CacheStoragePolicy.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -36,7 +36,7 @@
 bool CacheStoragePolicy::updateFile( const QString &fileName, const QByteArray &data )
 {
     if ( !m_cache.insert( fileName, data ) ) {
-        m_errorMsg = "Unable to insert data into cache";
+        m_errorMsg = QObject::tr("Unable to insert data into cache");
         return false;
     }
 

Modified: marble/trunk/src/lib/ExtDateTime.h
===================================================================
--- marble/trunk/src/lib/ExtDateTime.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/ExtDateTime.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -61,6 +61,11 @@
     void setDateTime(QDateTime datetime);
 
     /**
+     * @brief Returns the speed of the timer
+     **/
+    int getSpeed() {return m_speed;};
+    
+    /**
      * @brief Sets the speed of the timer
      * @param speed The new speed (integer)
      **/

Modified: marble/trunk/src/lib/FileStoragePolicy.cpp
===================================================================
--- marble/trunk/src/lib/FileStoragePolicy.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/FileStoragePolicy.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -100,6 +100,11 @@
             while (itTheme.hasNext()) {
                 itTheme.next();
                 QString tileDirectory = itTheme.filePath();
+
+                if ( itTheme.fileName().toInt() < 5 ) {
+                    continue;
+                }
+
                 QDirIterator itTile( tileDirectory, QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories );
                 while (itTile.hasNext()) {
                     itTile.next();

Modified: marble/trunk/src/lib/GeoPainter.cpp
===================================================================
--- marble/trunk/src/lib/GeoPainter.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/GeoPainter.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -24,7 +24,6 @@
 #include "ViewportParams.h"
 
 // #define MARBLE_DEBUG
-// #define GEOPAINTER_DEBUG
 
 
 namespace Marble
@@ -386,13 +385,10 @@
     QVector<QPolygonF*> polygons;
     d->createPolygonsFromLineString( lineString, polygons );
 
+    qDebug() << "Number of polygons:" << polygons.count();
+
     foreach( QPolygonF* itPolygon, polygons ) {
-        // Using QPainter instead of ClipPainter until some bugs are fixed.
-#ifdef GEOPAINTER_DEBUG
-        QPainter::drawPolyline( *itPolygon );
-#else
         ClipPainter::drawPolyline( *itPolygon );
-#endif
     }
 
     qDeleteAll( polygons );
@@ -412,12 +408,7 @@
     d->createPolygonsFromLinearRing( linearRing, polygons );
 
     foreach( QPolygonF* itPolygon, polygons ) {
-        // Using QPainter instead of ClipPainter until some bugs are fixed.
-#ifdef GEOPAINTER_DEBUG
-        QPainter::drawPolygon( *itPolygon );
-#else
         ClipPainter::drawPolygon( *itPolygon );
-#endif
     }
 
     qDeleteAll( polygons );
@@ -456,12 +447,7 @@
     }
 
     foreach( QPolygonF* itOuterPolygon, outerPolygons ) {
-        // Using QPainter instead of ClipPainter until some bugs are fixed.
-#ifdef GEOPAINTER_DEBUG
-        QPainter::drawPolygon( *itOuterPolygon );
-#else
         ClipPainter::drawPolygon( *itOuterPolygon );
-#endif
     }
 
     qDeleteAll( outerPolygons );    

Modified: marble/trunk/src/lib/GeoPolygon.cpp
===================================================================
--- marble/trunk/src/lib/GeoPolygon.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/GeoPolygon.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -112,7 +112,10 @@
 }
 
 PntMap::~PntMap()
-{
+{   
+    if ( m_loader ) {
+        m_loader->wait();
+    }
     qDeleteAll( begin(), end() );
 }
 
@@ -126,8 +129,10 @@
 
 void PntMap::setInitialized( bool isInitialized )
 {
-    if ( m_loader->isFinished() )
+    if ( m_loader->isFinished() ) {
         delete m_loader;
+        m_loader = 0;
+    }
 
     m_isInitialized = isInitialized;
     emit initialized();

Modified: marble/trunk/src/lib/HttpDownloadManager.cpp
===================================================================
--- marble/trunk/src/lib/HttpDownloadManager.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/HttpDownloadManager.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -13,6 +13,7 @@
 #include "HttpDownloadManager.h"
 
 #include <QtCore/QDebug>
+#include <QtCore/QTimer>
 
 #include "HttpJob.h"
 #include "MarbleDirs.h"
@@ -124,9 +125,19 @@
             return false;
         }
     }
+    
+    QList<HttpJob*>::iterator i = m_waitingQueue.begin();
+    QList<HttpJob*>::iterator iEnd = m_waitingQueue.end();
+    for (; i != iEnd; ++i) {
+	if ( job->originalDestinationFileName() == (*i)->originalDestinationFileName() ) {
+	    qDebug() << "Download rejected: Will try to download again in some time.";
+	    (*i)->setInitiatorId( job->initiatorId() );
+	    return false;
+	}
+    }
 
-    QList<HttpJob*>::iterator i = m_activatedJobList.begin();
-    QList<HttpJob*>::iterator iEnd = m_activatedJobList.end();
+    i = m_activatedJobList.begin();
+    iEnd = m_activatedJobList.end();
     for (; i != iEnd; ++i ) {
         if ( job->originalDestinationFileName() == (*i)->originalDestinationFileName() ) {
             qDebug() << "Download rejected: It's being downloaded already.";
@@ -145,6 +156,7 @@
         }
     }
 
+    emit jobAdded( m_jobQueue.size() + m_activatedJobList.size() );
     return true;
 }
 
@@ -176,6 +188,11 @@
         job->setStoragePolicy( storagePolicy() );
         job->setStatus( Activated );
 
+	// No duplicate connections please
+        disconnect( job, SIGNAL( jobDone( Marble::HttpJob*, int ) ),
+                 this, SLOT( reportResult( Marble::HttpJob*, int ) ) );
+        disconnect( job, SIGNAL( statusMessage( QString ) ),
+                 this, SIGNAL( statusMessage( QString ) ) );
         connect( job, SIGNAL( jobDone( Marble::HttpJob*, int ) ),
                  this, SLOT( reportResult( Marble::HttpJob*, int ) ) );
         connect( job, SIGNAL( statusMessage( QString ) ),
@@ -192,11 +209,26 @@
 
         if ( pos >= 0 ) {
             m_activatedJobList.removeAt( pos );
-            m_jobBlackList.push_back( job );
-
-            qDebug() << QString( "Download of %1 Blacklisted. Number of blacklist items: %2" )
-                .arg( job->destinationFileName() ).arg( m_jobBlackList.size() );
-        }
+	    
+	    // This should always return true
+	    if( !m_waitingQueue.contains( job ) ) {
+		if( job->tryAgain() )
+		{
+		    m_waitingQueue.enqueue( job );
+		    qDebug() << QString( "Download of %1 failed, but trying again in one minute" )
+			.arg( job->destinationFileName() );
+		    job->setStatus( NoStatus );
+		    QTimer::singleShot( 60000, this, SLOT( requeue() ) ); // 60000 ms = 1 min
+		}
+		else
+		{
+		    m_jobBlackList.push_back( job );
+		    
+		    qDebug() << QString( "Download of %1 Blacklisted. Number of blacklist items: %2" )
+			.arg( job->destinationFileName() ).arg( m_jobBlackList.size() );
+		}
+	    }
+	}
     }
     else {
 //         qDebug() << "HttpDownloadManager: Download Complete:"
@@ -204,7 +236,20 @@
         emit downloadComplete( job->originalDestinationFileName(), job->initiatorId() );
         removeJob( job );
     }
+    
+    activateJobs();
+}
 
+void HttpDownloadManager::requeue()
+{
+    if( !m_waitingQueue.isEmpty() ) {
+	HttpJob* job = m_waitingQueue.dequeue();
+	qDebug() << QString( "Requeuing %1." ).arg( job->destinationFileName() );
+	addJob( job );
+    }
+    else {
+	qDebug() << QString( "Warning: For some reason we requeued more jobs as needed" );
+    }
 }
 
 HttpJob *HttpDownloadManager::createJob( const QUrl& sourceUrl, const QString& destFileName,

Modified: marble/trunk/src/lib/HttpDownloadManager.h
===================================================================
--- marble/trunk/src/lib/HttpDownloadManager.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/HttpDownloadManager.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -22,6 +22,7 @@
 #include <QtCore/QUrl>
 #include <QtCore/QList>
 #include <QtCore/QStack>
+#include <QtCore/QQueue>
 
 #include "marble_export.h"
 
@@ -98,10 +99,16 @@
  Q_SIGNALS:
     void downloadComplete( QString, QString );
     void statusMessage( QString );
+    /**
+     * Signal is emitted when a new job is added to the queue and the parameter
+     * contains the number of total jobs which are currently in the queue.
+     */
+    void jobAdded( int );
 
  private Q_SLOTS:
     void activateJobs();
     void reportResult( Marble::HttpJob *job, int id );
+    void requeue();
 
  private:
     Q_DISABLE_COPY( HttpDownloadManager )
@@ -118,6 +125,7 @@
     bool              m_downloadEnabled;
 
     QStack<HttpJob*>  m_jobQueue;
+    QQueue<HttpJob*>  m_waitingQueue;
     QList<HttpJob*>   m_activatedJobList;
     QList<HttpJob*>   m_jobBlackList;
 

Modified: marble/trunk/src/lib/HttpJob.cpp
===================================================================
--- marble/trunk/src/lib/HttpJob.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/HttpJob.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -29,6 +29,7 @@
     Status         m_status;
     Priority       m_priority;
     StoragePolicy *m_storagePolicy;
+    int            m_trialsLeft;
 };
 
 HttpJobPrivate::HttpJobPrivate()
@@ -46,6 +47,7 @@
     d->m_destinationFileName = destFileName;
     d->m_originalDestinationFileName = destFileName;
     d->m_initiatorId = id;
+    d->m_trialsLeft = 3;
 }
 
 HttpJob::~HttpJob()
@@ -107,4 +109,15 @@
     return d->m_storagePolicy;
 }
 
+bool HttpJob::tryAgain()
+{
+    if( d->m_trialsLeft > 0 ) {
+	d->m_trialsLeft--;
+	return true;
+    }
+    else {
+	return false;
+    }
+}
+
 #include "HttpJob.moc"

Modified: marble/trunk/src/lib/HttpJob.h
===================================================================
--- marble/trunk/src/lib/HttpJob.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/HttpJob.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -54,6 +54,8 @@
     void setStatus( const Status );
 
     void setStoragePolicy( StoragePolicy * );
+    
+    bool tryAgain();
 
  Q_SIGNALS:
     void jobDone( Marble::HttpJob *, int );

Modified: marble/trunk/src/lib/MapThemeSortFilterProxyModel.cpp
===================================================================
--- marble/trunk/src/lib/MapThemeSortFilterProxyModel.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MapThemeSortFilterProxyModel.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -1,3 +1,14 @@
+//
+// This file is part of the Marble Desktop Globe.
+//
+// This program is free software licensed under the GNU LGPL. You can
+// find a copy of this license in LICENSE.txt in the top directory of
+// the source code.
+//
+// Copyright 2008      Claudiu Covaci <claudiu.covaci@xxxxxxxxx>"
+// Copyright 2009      Torsten Rahn <tackat@xxxxxxx>"
+//
+
 #include "MapThemeSortFilterProxyModel.h"
 #include <QtCore/QString>
 

Modified: marble/trunk/src/lib/MapThemeSortFilterProxyModel.h
===================================================================
--- marble/trunk/src/lib/MapThemeSortFilterProxyModel.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MapThemeSortFilterProxyModel.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -6,6 +6,7 @@
 // the source code.
 //
 // Copyright 2008      Claudiu Covaci <claudiu.covaci@xxxxxxxxx>"
+// Copyright 2009      Torsten Rahn <tackat@xxxxxxx>"
 //
 
 #ifndef MAPTHEMESORTFILTERPROXYMODEL_H

Modified: marble/trunk/src/lib/MarbleMap.cpp
===================================================================
--- marble/trunk/src/lib/MarbleMap.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleMap.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -27,7 +27,9 @@
 #include <QtGui/QSizePolicy>
 #include <QtGui/QRegion>
 
-//#include <QtDBus/QDBusConnection>
+#ifdef MARBLE_DBUS
+#include <QtDBus/QDBusConnection>
+#endif
 
 // Marble
 #include "AbstractProjection.h"
@@ -73,7 +75,6 @@
           m_persistentTileCacheLimit( 1024*1024*300 ), // 300 MB
           m_volatileTileCacheLimit( 1024*1024*30 ) // 30 MB
 {
-    /* NOOP */
 }
 
 void MarbleMapPrivate::construct()
@@ -107,9 +108,9 @@
 
 
     m_parent->connect( m_model->sunLocator(), SIGNAL( updateSun() ),
-                        m_parent,              SLOT( updateSun() ) );
+                       m_parent,              SLOT( updateSun() ) );
     m_parent->connect( m_model->sunLocator(), SIGNAL( centerSun() ),
-                        m_parent,              SLOT( centerSun() ) );
+                       m_parent,              SLOT( centerSun() ) );
 }
 
 // Used to be resizeEvent()
@@ -138,13 +139,15 @@
 
     QPixmap logoPixmap( MarbleDirs::path( "svg/marble-logo-inverted-72dpi.png" ) );
 
-    if ( logoPixmap.width() > m_parent->width() * 0.7 || logoPixmap.height() > m_parent->height() * 0.7 )
+    if ( logoPixmap.width() > m_parent->width() * 0.7
+         || logoPixmap.height() > m_parent->height() * 0.7 )
     {
-        logoPixmap = logoPixmap.scaled( QSize( m_parent->width(), m_parent->height() ) * 0.7, Qt::KeepAspectRatio, Qt::SmoothTransformation );
+        logoPixmap = logoPixmap.scaled( QSize( m_parent->width(), m_parent->height() ) * 0.7,
+                                        Qt::KeepAspectRatio, Qt::SmoothTransformation );
     }
 
-    QPoint logoPosition( ( m_parent->width()  - logoPixmap.width() ) / 2 , 
-                            ( m_parent->height() - logoPixmap.height() ) / 2 ); 
+    QPoint logoPosition( ( m_parent->width()  - logoPixmap.width() ) / 2,
+                            ( m_parent->height() - logoPixmap.height() ) / 2 );
     painter.drawPixmap( logoPosition, logoPixmap );
 
     QString message; // "Please assign a map theme!";
@@ -271,8 +274,7 @@
 
 void MarbleMapPrivate::paintGround( GeoPainter &painter, QRect &dirtyRect )
 {
-    if ( !m_viewParams.mapTheme() ) 
-    {
+    if ( !m_viewParams.mapTheme() ) {
         qDebug() << "No theme yet!";
         paintMarbleSplash( painter, dirtyRect );
         return;
@@ -284,28 +286,26 @@
                    || m_viewParams.radius() > m_viewParams.canvasImage()->height() / 2 );
 
     m_model->paintGlobe( &painter,
-                            m_parent->width(), m_parent->height(), &m_viewParams,
-                            m_parent->needsUpdate()
-                            || m_viewParams.canvasImage()->isNull(),
-                            dirtyRect );
+                         m_parent->width(), m_parent->height(), &m_viewParams,
+                         m_parent->needsUpdate() || m_viewParams.canvasImage()->isNull(),
+                         dirtyRect );
     // FIXME: this is ugly, add method updatePlanetAxis() to ViewParams
     m_viewParams.setPlanetAxisUpdated( m_viewParams.planetAxis() );
     // FIXME: this is ugly, add method updateRadius() to ViewParams
     m_viewParams.setRadiusUpdated( m_viewParams.radius() );
-    m_justModified                   = false;
+    m_justModified = false;
 
     // FIXME: This is really slow. That's why we defer this to
     //        PrintQuality. Either cache on a pixmap - or maybe
     //        better: Add to GlobeScanlineTextureMapper.
 
     if ( m_viewParams.mapQuality() == Marble::Print )
-        drawFog(painter);
+        drawFog( painter );
 }
 
 void MarbleMapPrivate::paintOverlay( GeoPainter &painter, QRect &dirtyRect)
 {
-    if ( !m_viewParams.mapTheme() ) 
-    {
+    if ( !m_viewParams.mapTheme() ) {
         return;
     }
 
@@ -354,7 +354,10 @@
 MarbleMap::MarbleMap()
     : d( new MarbleMapPrivate( this ) )
 {
-//    QDBusConnection::sessionBus().registerObject("/marble", this, QDBusConnection::QDBusConnection::ExportAllSlots);
+#ifdef MARBLE_DBUS
+    QDBusConnection::sessionBus().registerObject("/MarbleMap", this, 
+                    QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals );
+#endif
     QTime t;
     t.start();
     
@@ -363,6 +366,9 @@
 
     d->construct();
     qDebug("Model: Time elapsed: %d ms", t.elapsed());
+
+    // FIXME: add method initDownloadManager
+    setDownloadUrl("");
 }
 
 
@@ -375,6 +381,9 @@
     d->m_modelIsOwned = false;
 
     d->construct();
+
+    // FIXME: add method initDownloadManager
+    setDownloadUrl("");
 }
 
 MarbleMap::~MarbleMap()
@@ -788,7 +797,8 @@
     selectionModel->clear();
 
     if ( index.isValid() ) {
-        const GeoDataCoordinates point = index.data( MarblePlacemarkModel::CoordinateRole ).value<GeoDataCoordinates>();
+        const GeoDataCoordinates point =
+            index.data( MarblePlacemarkModel::CoordinateRole ).value<GeoDataCoordinates>();
   
         qreal  lon;
         qreal  lat;
@@ -937,17 +947,17 @@
 }
 
 // Used to be paintEvent()
-void MarbleMap::paint(GeoPainter &painter, QRect &dirtyRect) 
+void MarbleMap::paint(GeoPainter &painter, QRect &dirtyRect)
 {
     QTime t;
     t.start();
 
-    d->paintGround(painter, dirtyRect);
+    d->paintGround( painter, dirtyRect );
     customPaint( &painter );
-    d->paintOverlay(painter, dirtyRect);
+    d->paintOverlay( painter, dirtyRect );
 
     qreal fps = 1000.0 / (qreal)( t.elapsed() );
-    d->paintFps(painter, dirtyRect, fps);
+    d->paintFps( painter, dirtyRect, fps );
     emit framesPerSecond( fps );
 }
 
@@ -955,8 +965,7 @@
 {
     Q_UNUSED( painter );
 
-    if ( !viewParams()->mapTheme() ) 
-    {
+    if ( !viewParams()->mapTheme() ) {
         return;
     }
 }
@@ -1122,11 +1131,10 @@
 
 void MarbleMap::notifyMouseClick( int x, int y)
 {
-    bool    valid = false;
     qreal  lon   = 0;
     qreal  lat   = 0;
 
-    valid = geoCoordinates( x, y, lon, lat, GeoDataCoordinates::Radian );
+    const bool valid = geoCoordinates( x, y, lon, lat, GeoDataCoordinates::Radian );
 
     if ( valid ) {
         emit mouseClickGeoPosition( lon, lat, GeoDataCoordinates::Radian);
@@ -1136,8 +1144,7 @@
 void MarbleMap::updateGps()
 {
     QRegion temp;
-    bool    draw;
-    draw = d->m_model->gpsLayer()->updateGps( size(),&d->m_viewParams, temp );
+    const bool draw = d->m_model->gpsLayer()->updateGps( size(),&d->m_viewParams, temp );
 #if 0  // FIXME: move to MarbleWidget?
     if ( draw ) {
         update(temp);
@@ -1202,7 +1209,7 @@
 void MarbleMap::updateRegion( BoundingBox &box )
 {
     Q_UNUSED(box);
-    //really not sure if this is nessary as its designed for
+    //really not sure if this is nessary as it is designed for
     //placemark based layers
     setNeedsUpdate();
 
@@ -1221,8 +1228,8 @@
     if ( downloadManager != 0 )
         downloadManager->setServerUrl( url );
     else {
-        downloadManager = new HttpDownloadManager( url,
-                                                   new FileStoragePolicy( MarbleDirs::localPath() ) );
+        downloadManager =
+            new HttpDownloadManager( url, new FileStoragePolicy( MarbleDirs::localPath() ) );
         d->m_model->setDownloadManager( downloadManager );
     }
 }
@@ -1247,9 +1254,9 @@
 
     QString distanceUnitString;
 
-    Marble::DistanceUnit distanceUnit;
-    distanceUnit = MarbleGlobal::getInstance()->locale()->distanceUnit();
+    const Marble::DistanceUnit distanceUnit = MarbleGlobal::getInstance()->locale()->distanceUnit();
 
+    // FIXME: why is "km" translated and "mi" not?
     if ( distanceUnit == Marble::Metric ) {
         distanceUnitString = tr("km");
     }
@@ -1269,8 +1276,7 @@
 
 Marble::AngleUnit MarbleMap::defaultAngleUnit() const
 {
-    if ( GeoDataCoordinates::defaultNotation() == GeoDataCoordinates::Decimal )
-    {
+    if ( GeoDataCoordinates::defaultNotation() == GeoDataCoordinates::Decimal ) {
         return Marble::DecimalDegree;
     }
 
@@ -1279,8 +1285,7 @@
 
 void MarbleMap::setDefaultAngleUnit( Marble::AngleUnit angleUnit )
 {
-    if ( angleUnit == Marble::DecimalDegree )
-    {
+    if ( angleUnit == Marble::DecimalDegree ) {
         GeoDataCoordinates::setDefaultNotation( GeoDataCoordinates::Decimal );
         return;
     }

Modified: marble/trunk/src/lib/MarbleMap.h
===================================================================
--- marble/trunk/src/lib/MarbleMap.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleMap.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -28,8 +28,6 @@
 #include <QtGui/QFont>
 #include <QtGui/QPixmap>
 
-//#include <QtDBus/QtDBus>
-
 #include "marble_export.h"
 #include "GeoDataCoordinates.h"       // In geodata/data/
 #include "global.h"             // types needed in all of marble.
@@ -96,7 +94,7 @@
 class MARBLE_EXPORT MarbleMap : public QObject
 {
     Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "org.kde.marble")
+    Q_CLASSINFO("D-Bus Interface", "org.kde.MarbleMap")
 
  public:
 

Modified: marble/trunk/src/lib/MarbleModel.cpp
===================================================================
--- marble/trunk/src/lib/MarbleModel.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleModel.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -167,6 +167,7 @@
     
     if( MarbleModelPrivate::refCounter == 1 ) {
         d->m_veccomposer = new VectorComposer();
+        d->m_texcolorizer = 0;
         /* d->m_texcolorizer is not initialized here since it takes a long time
            to create the palette and it might not even be used. Instead it's created
            in setMapTheme if the theme being loaded does need it. If the theme
@@ -230,7 +231,6 @@
     if( MarbleModelPrivate::refCounter == 1 ) {
         delete d->m_veccomposer;
         delete d->m_texcolorizer;
-        MarbleModelPrivate::refCounter.deref();
     }
     delete d->m_gridmap;
     delete d->m_geometrymodel;
@@ -245,6 +245,7 @@
     delete d->m_sunLocator;
     delete d->m_dateTime;
     delete d;
+    MarbleModelPrivate::refCounter.deref();
     qDebug() << "Model deleted:" << this;
 }
 
@@ -408,8 +409,17 @@
             for (; itds != endds; ++itds) {
                 GeoSceneAbstractDataset* dataset = *itds;
                 if( dataset->fileFormat() == "KML" ) {
-                    loadedContainers.removeOne( reinterpret_cast<GeoSceneXmlDataSource*>(dataset)->filename() );
-                    loadList << reinterpret_cast<GeoSceneXmlDataSource*>(dataset)->filename();
+#if QT_VERSION >= 0x040400
+                    loadedContainers.removeOne(
+reinterpret_cast<GeoSceneXmlDataSource*>(dataset)->filename() );
+#else
+                    int index = loadedContainers.indexOf(
+reinterpret_cast<GeoSceneXmlDataSource*>(dataset)->filename() );
+                    if (index != -1) {
+                        loadedContainers.removeAt(index);
+                    }
+#endif
+                    loadList << reinterpret_cast<GeoSceneXmlDataSource*>(dataset)->filename();          
                 }
             }
         }

Modified: marble/trunk/src/lib/MarblePhysics.cpp
===================================================================
--- marble/trunk/src/lib/MarblePhysics.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarblePhysics.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -16,8 +16,9 @@
 
 using namespace Marble;
 
-MarblePhysics::MarblePhysics()
-    : m_jumpDuration( 2000 )
+MarblePhysics::MarblePhysics( QObject * parent )
+    : QObject( parent ), 
+      m_jumpDuration( 2000 )
 {
     m_timeLine = new QTimeLine( m_jumpDuration );
     m_timeLine->setFrameRange( 0, 500 );
@@ -55,7 +56,7 @@
 
     qreal x = (qreal)(m_jumpDuration ) * t;
 
-    qreal y = a * x * x + b * x + g;       // Parabolic function
+    qreal y = ( a * x + b ) * x + g;       // Parabolic function
 
     return GeoDataCoordinates( lon, lat, y );
 }

Modified: marble/trunk/src/lib/MarblePhysics.h
===================================================================
--- marble/trunk/src/lib/MarblePhysics.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarblePhysics.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -24,7 +24,7 @@
  Q_OBJECT
 
  public:
-    MarblePhysics();
+    MarblePhysics( QObject * parent );
     ~MarblePhysics();
 
     void jumpTo( const GeoDataCoordinates &targetPoint );

Modified: marble/trunk/src/lib/MarbleRenderPlugin.h
===================================================================
--- marble/trunk/src/lib/MarbleRenderPlugin.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleRenderPlugin.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -69,7 +69,7 @@
 };
 
 #define MARBLE_PLUGIN(T) public:\
-    virtual MarbleRenderPlugin* instance() { return new T(); };
+    virtual MarbleRenderPlugin* pluginInstance() { return new T(); };
 }
 
 #endif // MARBLE_RENDER_PLUGIN_H

Modified: marble/trunk/src/lib/MarbleRenderPluginInterface.h
===================================================================
--- marble/trunk/src/lib/MarbleRenderPluginInterface.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleRenderPluginInterface.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -40,7 +40,7 @@
     /**
     * @brief Returns a new object of the plugin
     */
-    virtual MarbleRenderPlugin* instance() = 0;
+    virtual MarbleRenderPlugin* pluginInstance() = 0;
 
     /**
      * @brief Returns the name(s) of the backend that the plugin can render

Modified: marble/trunk/src/lib/MarbleRunnerManager.cpp
===================================================================
--- marble/trunk/src/lib/MarbleRunnerManager.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleRunnerManager.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -46,37 +46,24 @@
     m_activeRunners = 0;
     m_lastString = "";
     
-    //Runners
-    m_latlonRunner = new LatLonRunner(0);
-    m_latlonRunner->start();
-    m_latlonRunner->moveToThread(m_latlonRunner);
-    connect( m_latlonRunner, SIGNAL( runnerStarted() ),
-             this,           SLOT( slotRunnerStarted() ));
-    connect( m_latlonRunner, SIGNAL( runnerFinished( QVector<GeoDataPlacemark*> ) ),
-             this,           SLOT( slotRunnerFinished( QVector<GeoDataPlacemark*> ) ));
-    connect( this,           SIGNAL( engage(QString) ),
-             m_latlonRunner, SLOT( parse(QString) ));
-
-    m_onfRunner = new OnfRunner(0);
-    m_onfRunner->start();
-    m_onfRunner->moveToThread(m_onfRunner);
-    connect( m_onfRunner, SIGNAL( runnerStarted() ),
-             this,        SLOT( slotRunnerStarted() ));
-    connect( m_onfRunner, SIGNAL( runnerFinished( QVector<GeoDataPlacemark*> ) ),
-             this,        SLOT( slotRunnerFinished( QVector<GeoDataPlacemark*> ) ));
-    connect( this,        SIGNAL( engage(QString) ),
-             m_onfRunner, SLOT( parse(QString) ));
 }
 
 MarbleRunnerManager::~MarbleRunnerManager()
 {
-    m_latlonRunner->quit();
-    m_latlonRunner->wait();
-    delete m_latlonRunner;
-    
-    m_onfRunner->quit();
-    m_onfRunner->wait();
-    delete m_onfRunner;
+    foreach(MarbleAbstractRunner* runner, m_runners)
+    {
+        runner->quit();
+        runner->wait();
+#if QT_VERSION >= 0x040400
+        m_runners.removeOne(runner);
+#else
+        int index = m_runners.indexOf(runner);
+        if (index != -1) {
+          m_runners.removeAt(index);
+        }
+#endif
+        delete runner;
+    }
 }
 
 void MarbleRunnerManager::newText(QString text)
@@ -89,30 +76,44 @@
         delete m_model;
         m_model = model;
     }
-//     qDebug() << "Engage: " << text;
-    emit engage(text);
+
+    LatLonRunner* llrunner = new LatLonRunner;
+    m_runners << dynamic_cast<MarbleAbstractRunner*>(llrunner);
+    connect( llrunner, SIGNAL( runnerFinished( MarbleAbstractRunner*, QVector<GeoDataPlacemark*> ) ),
+             this,     SLOT( slotRunnerFinished( MarbleAbstractRunner*, QVector<GeoDataPlacemark*> ) ));
+    llrunner->parse(text);
+    
+    OnfRunner* onfrunner = new OnfRunner;
+    m_runners << dynamic_cast<MarbleAbstractRunner*>(onfrunner);
+    connect( onfrunner, SIGNAL( runnerFinished( MarbleAbstractRunner*, QVector<GeoDataPlacemark*> ) ),
+             this,      SLOT( slotRunnerFinished( MarbleAbstractRunner*, QVector<GeoDataPlacemark*> ) ));
+    onfrunner->parse(text);
+
+    llrunner->start();
+    onfrunner->start();
 }
 
-void MarbleRunnerManager::slotRunnerFinished( QVector<GeoDataPlacemark*> result )
+void MarbleRunnerManager::slotRunnerFinished( MarbleAbstractRunner* runner, QVector<GeoDataPlacemark*> result )
 {
-    m_activeRunners--;
-    qDebug() << "Runner finished, active runners: " << m_activeRunners;
+#if QT_VERSION >= 0x040400
+    m_runners.removeOne(runner);
+#else
+    int index = m_runners.indexOf(runner);
+    if (index != -1) {
+      m_runners.removeAt(index);
+    }
+#endif
+    qDebug() << "Runner finished, active runners: " << m_runners.size();
     qDebug() << "Runner reports" << result.size() << "results";
     if( result.isEmpty() )
         return;
 
     PlaceMarkContainer cont( result, "Runner Results" );
     m_model->addPlaceMarks( cont, false );
-//     qDebug() << "emit modelchanged";
+
     emit modelChanged( m_model );
 }
 
-void MarbleRunnerManager::slotRunnerStarted()
-{
-    m_activeRunners++;
-    qDebug() << "Runner starting, active runners: " << m_activeRunners;
-}
-
 MarblePlacemarkModel* MarbleRunnerManager::model()
 {
     return m_model;

Modified: marble/trunk/src/lib/MarbleRunnerManager.h
===================================================================
--- marble/trunk/src/lib/MarbleRunnerManager.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleRunnerManager.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -31,8 +31,7 @@
 class MarblePlacemarkModel;
 class GeoDataPlacemark;
 
-class LatLonRunner;
-class OnfRunner;
+class MarbleAbstractRunner;
 
 class MarbleRunnerManager : public QObject
 {
@@ -48,18 +47,16 @@
 signals:
     void allDone();
     void modelChanged( MarblePlacemarkModel *model );
-    //tells runners to make it so
-    void engage(QString text);
+
 private slots:
-    void slotRunnerFinished(QVector<GeoDataPlacemark*> result);
-    void slotRunnerStarted();
+    void slotRunnerFinished( MarbleAbstractRunner* runner, QVector<GeoDataPlacemark*> result);
+
 private:
     int m_activeRunners;
     QString m_lastString;
     MarblePlacemarkModel *m_model;
+    QList<MarbleAbstractRunner*> m_runners;
     
-    LatLonRunner *m_latlonRunner;
-    OnfRunner *m_onfRunner;
 };
 
 }

Modified: marble/trunk/src/lib/MarbleWidget.cpp
===================================================================
--- marble/trunk/src/lib/MarbleWidget.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleWidget.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -5,8 +5,8 @@
 // find a copy of this license in LICENSE.txt in the top directory of
 // the source code.
 //
-// Copyright 2006-2007 Torsten Rahn <tackat@xxxxxxx>"
-// Copyright 2007      Inge Wallin  <ingwa@xxxxxxx>"
+// Copyright 2006-2007 Torsten Rahn <tackat@xxxxxxx>
+// Copyright 2007      Inge Wallin  <ingwa@xxxxxxx>
 //
 
 #include "MarbleWidget.h"
@@ -24,7 +24,9 @@
 #include <QtGui/QStyleOptionGraphicsItem>
 #include <QtNetwork/QNetworkProxy>
 
-//#include <QtDBus/QDBusConnection>
+#ifdef MARBLE_DBUS
+#include <QtDBus/QDBusConnection>
+#endif
 
 #include "AbstractProjection.h"
 #include "MarbleDirs.h"
@@ -39,7 +41,6 @@
 #include "MarblePhysics.h"
 #include "MarblePlacemarkModel.h"
 #include "MarbleWidgetInputHandler.h"
-#include "MarbleWidgetPopupMenu.h"
 #include "TileCreatorDialog.h"
 #include "HttpDownloadManager.h"
 #include "gps/GpsLayer.h"
@@ -49,8 +50,6 @@
 #include "AbstractProjectionHelper.h"
 #include "ViewportParams.h"
 
-#include "MeasureTool.h"
-
 #include "MarbleMap_p.h"
 
 namespace Marble
@@ -68,12 +67,12 @@
  public:
     MarbleWidgetPrivate( MarbleMap *map, MarbleWidget *parent )
         : m_widget( parent ),
-          m_map( map ), 
+          m_map( map ),
           m_viewContext( Marble::Still ),
           m_stillQuality( Marble::High ), m_animationQuality( Marble::Low ),
           m_animationsEnabled( false ),
           m_inputhandler( 0 ),
-          m_physics( new MarblePhysics() ),
+          m_physics( new MarblePhysics( parent ) ),
           m_proxyHost(),
           m_proxyPort( 0 )
     {
@@ -82,7 +81,6 @@
 
     ~MarbleWidgetPrivate()
     {
-        delete m_physics;
         delete m_map;
     }
 
@@ -105,14 +103,11 @@
     int              m_logZoom;
 
     MarbleWidgetInputHandler  *m_inputhandler;
-    MarbleWidgetPopupMenu     *m_popupmenu;
 
     MarblePhysics    *m_physics;
 
     QString          m_proxyHost;
     qint16           m_proxyPort;
-
-    void _q_initGui();
 };
 
 
@@ -121,12 +116,15 @@
     : QWidget( parent ),
       d( new MarbleWidgetPrivate( new MarbleMap(), this ) )
 {
-//    QDBusConnection::sessionBus().registerObject("/marble", this, QDBusConnection::QDBusConnection::ExportAllSlots);
+#ifdef MARBLE_DBUS
+    QDBusConnection::sessionBus().registerObject("/MarbleWidget", this, 
+                    QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals );
+#endif
 
     d->construct();
 
-    // Delayed model initialization
-    QTimer::singleShot( 0, this, SLOT( _q_initGui() ) );
+    setInputHandler( new MarbleWidgetDefaultInputHandler );
+    setMouseTracking( true );
 }
 
 
@@ -138,8 +136,8 @@
 
     d->construct();
 
-    // Delayed model initialization
-    QTimer::singleShot( 0, this, SLOT( _q_initGui() ) );
+    setInputHandler( new MarbleWidgetDefaultInputHandler );
+    setMouseTracking( true );
 }
 
 MarbleWidget::~MarbleWidget()
@@ -160,7 +158,7 @@
 
     // Initialize the map and forward some signals.
     m_map->setSize( m_widget->width(), m_widget->height() );
-    m_map->viewParams()->setMapQuality( m_stillQuality ); 
+    m_map->viewParams()->setMapQuality( m_stillQuality );
 
     m_widget->connect( m_map,    SIGNAL( projectionChanged( Projection ) ),
                        m_widget, SIGNAL( projectionChanged( Projection ) ) );
@@ -179,10 +177,9 @@
 
 
     // Some part of the screen contents changed.
-    m_widget->connect( m_model, SIGNAL( regionChanged( BoundingBox& ) ) ,
+    m_widget->connect( m_model, SIGNAL( regionChanged( BoundingBox& ) ),
                        m_widget, SLOT( updateRegion( BoundingBox& ) ) );
 
-
     // Set background: black.
     m_widget->setPalette( QPalette ( Qt::black ) );
 
@@ -195,8 +192,10 @@
                        m_widget, SLOT( updateGps() ) );
 
     // Show a progress dialog when the model calculates new map tiles.
-    m_widget->connect( m_model, SIGNAL( creatingTilesStart( TileCreator*, const QString&, const QString& ) ),
-                       m_widget, SLOT( creatingTilesStart( TileCreator*, const QString&, const QString& ) ) );
+    m_widget->connect( m_model, SIGNAL( creatingTilesStart( TileCreator*, const QString&,
+                                                            const QString& ) ),
+                       m_widget, SLOT( creatingTilesStart( TileCreator*, const QString&,
+                                                           const QString& ) ) );
 
     m_logZoom  = 0;
 
@@ -204,27 +203,13 @@
                        m_widget, SLOT( enableInput() ) );
 
     m_widget->connect( m_model->sunLocator(), SIGNAL( updateStars() ),
-                        m_widget,          SLOT( update() ) );
+                       m_widget, SLOT( update() ) );
 
     m_widget->connect( m_physics, SIGNAL( valueChanged( qreal ) ),
-                        m_widget, SLOT( updateAnimation( qreal ) ) );
-}
+                       m_widget, SLOT( updateAnimation( qreal ) ) );
 
-void MarbleWidgetPrivate::_q_initGui() {
-    m_popupmenu    = new MarbleWidgetPopupMenu( m_widget, m_model );
-
-    // Handle mouse and keyboard input.
-    m_inputhandler = 0;
-    m_widget->setInputHandler( new MarbleWidgetDefaultInputHandler );
-    m_widget->setMouseTracking( true );
-
-    // The interface to the measure tool consists of a RMB popup menu
-    // and some signals.
-    MeasureTool  *measureTool = m_map->measureTool();
-    m_widget->connect( m_popupmenu, SIGNAL( addMeasurePoint( qreal, qreal ) ),
-                       measureTool, SLOT( addMeasurePoint( qreal, qreal ) ) );
-    m_widget->connect( m_popupmenu, SIGNAL( removeMeasurePoints() ),
-                       measureTool, SLOT( removeMeasurePoints( ) ) );
+    m_widget->connect( m_model->sunLocator(), SIGNAL( centerSun() ),
+                       m_widget, SLOT( centerSun() ) );
 }
 
 // ----------------------------------------------------------------
@@ -243,18 +228,13 @@
 
 void MarbleWidget::setInputHandler(MarbleWidgetInputHandler *handler)
 {
-    if ( d->m_inputhandler )
-        delete d->m_inputhandler;
-
+    delete d->m_inputhandler;
     d->m_inputhandler = handler;
 
     if ( d->m_inputhandler ) {
         d->m_inputhandler->init( this );
         installEventFilter( d->m_inputhandler );
-        connect( d->m_inputhandler, SIGNAL( lmbRequest( int, int ) ),
-                 d->m_popupmenu,    SLOT( showLmbMenu( int, int ) ) );
-        connect( d->m_inputhandler, SIGNAL( rmbRequest( int, int ) ),
-                 d->m_popupmenu,    SLOT( showRmbMenu( int, int ) ) );
+
         connect( d->m_inputhandler, SIGNAL( mouseClickScreenPosition( int, int) ),
                  this,              SLOT( notifyMouseClick( int, int ) ) );
 
@@ -287,7 +267,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     emit distanceChanged( distanceString() );
 
@@ -481,7 +462,8 @@
 
     // We only have to repaint the background every time if the globe
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     emit distanceChanged( distanceString() );
 
@@ -511,7 +493,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -522,7 +505,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -530,64 +514,63 @@
 
 void MarbleWidget::centerOn( const qreal& lon, const qreal& lat, bool animated )
 {
-    if ( d->m_animationsEnabled && animated )
-    {
-        d->m_physics->setCurrentPosition( GeoDataCoordinates( centerLongitude(), centerLatitude(), distance(), GeoDataCoordinates::Degree ) );        
-        d->m_physics->jumpTo( GeoDataCoordinates( lon, lat, distance(), GeoDataCoordinates::Degree ) );
-    }
-    else
-    {
+    if ( d->m_animationsEnabled && animated ) {
+        d->m_physics->setCurrentPosition( GeoDataCoordinates( centerLongitude(), centerLatitude(),
+                                                              distance(),
+                                                              GeoDataCoordinates::Degree ) );
+        d->m_physics->jumpTo( GeoDataCoordinates( lon, lat, distance(),
+                                                  GeoDataCoordinates::Degree ) );
+    } else {
         d->m_map->centerOn( lon, lat );
     }
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
 
 void MarbleWidget::centerOn( const QModelIndex& index, bool animated )
 {
-    if ( d->m_animationsEnabled && animated )
-    {
+    if ( d->m_animationsEnabled && animated ) {
         QItemSelectionModel *selectionModel = d->m_map->model()->placeMarkSelectionModel();
         Q_ASSERT( selectionModel );
     
         selectionModel->clear();
     
         if ( index.isValid() ) {
-            const GeoDataCoordinates targetPosition = index.data( MarblePlacemarkModel::CoordinateRole ).value<GeoDataCoordinates>();
+            const GeoDataCoordinates targetPosition =
+                index.data( MarblePlacemarkModel::CoordinateRole ).value<GeoDataCoordinates>();
 
-            d->m_physics->setCurrentPosition( GeoDataCoordinates( centerLongitude(), centerLatitude(), distance(), GeoDataCoordinates::Degree ) );
+            d->m_physics->setCurrentPosition( GeoDataCoordinates( centerLongitude(),
+                                                                  centerLatitude(), distance(),
+                                                                  GeoDataCoordinates::Degree ) );
             d->m_physics->jumpTo( targetPosition );
 
             selectionModel->select( index, QItemSelectionModel::SelectCurrent );
         }
-    }
-    else
-    {
+    } else {
         d->m_map->centerOn( index );
     }
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
 
 void MarbleWidget::centerOn( const GeoDataCoordinates &position, bool animated )
 {
-    if ( d->m_animationsEnabled && animated )
-    {
+    if ( d->m_animationsEnabled && animated ) {
         GeoDataCoordinates targetPosition = position;
         targetPosition.setAltitude( distance() );
 
         d->m_physics->jumpTo( targetPosition );
-    }
-    else
-    {
+    } else {
         qreal  lon, lat;
         position.geoCoordinates( lon, lat, GeoDataCoordinates::Degree );
         d->m_map->setDistance( position.altitude() );
@@ -596,7 +579,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -605,8 +589,7 @@
 {
     GeoDataCoordinates position = d->m_physics->suggestedPosition();
 
-    if ( updateValue < 1.0 )
-    {
+    if ( updateValue < 1.0 ) {
         setViewContext( Marble::Animation );
         centerOn( position );
         setViewContext( Marble::Still );
@@ -622,7 +605,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 }
 
 void MarbleWidget::setCenterLongitude( qreal lon )
@@ -631,7 +615,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 }
 
 Projection MarbleWidget::projection() const
@@ -643,7 +628,8 @@
 {
     d->m_map->setProjection( projection );
 
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -675,7 +661,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -686,7 +673,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -698,7 +686,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -709,7 +698,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
 }
@@ -724,7 +714,8 @@
     setUpdatesEnabled( false );
     d->m_map->setSize( width(), height() );
 
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint();
     setUpdatesEnabled( true );
@@ -803,12 +794,12 @@
 
 const QRegion MarbleWidget::activeRegion()
 {
-    return d->m_map->viewParams()->currentProjection()->helper()->activeRegion();;
+    return d->m_map->viewParams()->currentProjection()->helper()->activeRegion();
 }
 
 const QRegion MarbleWidget::projectedRegion()
 {
-    return d->m_map->viewParams()->currentProjection()->helper()->projectedRegion();;
+    return d->m_map->viewParams()->currentProjection()->helper()->projectedRegion();
 }
 
 void MarbleWidget::paintEvent(QPaintEvent *evt)
@@ -831,11 +822,11 @@
     // Draws the map like MarbleMap::paint does, but adds our customPaint in between
     d->m_map->d->paintGround( painter, dirtyRect );
     d->m_map->customPaint( &painter );
-    customPaint(&painter);
+    customPaint( &painter );
     d->m_map->d->paintOverlay( painter, dirtyRect );
 
     qreal fps = 1000.0 / (qreal)( t.elapsed() );
-    d->m_map->d->paintFps(painter, dirtyRect, fps);
+    d->m_map->d->paintFps( painter, dirtyRect, fps );
     emit d->m_map->framesPerSecond( fps );
 }
 
@@ -852,7 +843,8 @@
 
     // We only have to repaint the background every time if the earth
     // doesn't cover the whole image.
-    setAttribute(Qt::WA_NoSystemBackground, d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
+    setAttribute( Qt::WA_NoSystemBackground,
+                  d->m_map->mapCoversViewport() && !mapThemeId().isEmpty() );
 
     repaint(); // not obsolete in case the zoomlevel stays unaltered
 }
@@ -1031,11 +1023,10 @@
 
 void MarbleWidget::notifyMouseClick( int x, int y)
 {
-    bool    valid = false;
     qreal  lon   = 0;
     qreal  lat   = 0;
 
-    valid = geoCoordinates( x, y, lon, lat, GeoDataCoordinates::Radian );
+    bool const valid = geoCoordinates( x, y, lon, lat, GeoDataCoordinates::Radian );
 
     if ( valid ) {
         emit mouseClickGeoPosition( lon, lat, GeoDataCoordinates::Radian);
@@ -1045,11 +1036,10 @@
 void MarbleWidget::updateGps()
 {
     QRegion temp;
-    bool    draw;
-    draw = d->m_model->gpsLayer()->updateGps( size(),
-                                              d->m_map->viewParams(),
-                                              temp );
-    if ( draw ){
+    const bool draw = d->m_model->gpsLayer()->updateGps( size(),
+                                                         d->m_map->viewParams(),
+                                                         temp );
+    if ( draw ) {
         update( temp );
     }
     /*
@@ -1122,7 +1112,7 @@
 {
     Q_UNUSED(box);
 
-    //really not sure if this is nessary as its designed for
+    //really not sure if this is nessary as it is designed for
     //placemark based layers
     setNeedsUpdate();
 
@@ -1227,10 +1217,10 @@
     // NOTE: coordinates as lon1, lat1, lon2, lat2 (or West, North, East, South)
     // as left/top, right/bottom rectangle.
     QList<double> coordinates;
-    coordinates << box.west(GeoDataPoint::Degree) << box.north(GeoDataPoint::Degree) 
+    coordinates << box.west(GeoDataPoint::Degree) << box.north(GeoDataPoint::Degree)
                 << box.east(GeoDataPoint::Degree) << box.south(GeoDataPoint::Degree);
 
-    qDebug() << "West: " << coordinates[0] << " North: " <<  coordinates[1] 
+    qDebug() << "West: " << coordinates[0] << " North: " <<  coordinates[1]
              << " East: " << coordinates[2] << " South: " << coordinates[3] << endl;
 
     emit regionSelected(coordinates);
@@ -1270,7 +1260,6 @@
     qreal  lat = sunLocator->getLat();
     centerOn( lon, lat );
 
-    qDebug() << "centering on Sun at" << lat << lon;
     disableInput();
 }
 
@@ -1281,14 +1270,18 @@
 
 void MarbleWidget::enableInput()
 {
-    if ( !d->m_inputhandler ) 
+    if ( !d->m_inputhandler ) {
         setInputHandler( new MarbleWidgetDefaultInputHandler );
+    }
+    else {
+        installEventFilter( d->m_inputhandler );
+    }
 }
 
 void MarbleWidget::disableInput()
 {
     qDebug() << "MarbleWidget::disableInput";
-    setInputHandler( 0 );
+    removeEventFilter( d->m_inputhandler );
     setCursor( Qt::ArrowCursor );
 }
 

Modified: marble/trunk/src/lib/MarbleWidget.h
===================================================================
--- marble/trunk/src/lib/MarbleWidget.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleWidget.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -28,8 +28,6 @@
 #include <QtGui/QPixmap>
 #include <QtDesigner/QDesignerExportWidget>
 
-//#include <QtDBus/QtDBus>
-
 #include "marble_export.h"
 #include "GeoDataCoordinates.h"       // In geodata/data/
 #include "MarbleWidgetInputHandler.h"
@@ -115,7 +113,9 @@
 class MARBLE_EXPORT MarbleWidget : public QWidget
 {
     Q_OBJECT
-    Q_CLASSINFO("D-Bus Interface", "org.kde.marble")
+#ifdef MARBLE_DBUS
+    Q_CLASSINFO("D-Bus Interface", "org.kde.MarbleWidget")
+#endif
 
     Q_PROPERTY(int zoom          READ zoom            WRITE zoomView)
 
@@ -299,9 +299,8 @@
      * @return @c true  if the pixel (x, y) is within the globe
      *         @c false if the pixel (x, y) is outside the globe, i.e. in space
      */
+    // FIXME: refactor the GPS/GPX code, so that this nonsense method can die.
     bool    globalQuaternion( int x, int y, Quaternion &q);
-    // FIXME: Make the names of globalQuaternion() and
-    //        geoCoordinates() follow a pattern.
 
     /**
      * @brief Return the longitude of the center point.
@@ -980,8 +979,6 @@
  private:
     Q_DISABLE_COPY( MarbleWidget )
     MarbleWidgetPrivate  * const d;
-
-    Q_PRIVATE_SLOT( d, void _q_initGui() )
 };
 
 }

Modified: marble/trunk/src/lib/MarbleWidgetInputHandler.cpp
===================================================================
--- marble/trunk/src/lib/MarbleWidgetInputHandler.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleWidgetInputHandler.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -27,6 +27,8 @@
 #include "ViewParams.h"
 #include "ViewportParams.h"
 #include "MarbleAbstractFloatItem.h"
+#include "MeasureTool.h"
+#include "MarbleWidgetPopupMenu.h"
 
 using namespace Marble;
 
@@ -58,7 +60,7 @@
 
 
 MarbleWidgetDefaultInputHandler::MarbleWidgetDefaultInputHandler()
-    : MarbleWidgetInputHandler()
+    : MarbleWidgetInputHandler(), m_popupmenu( 0 ), m_leftpopup(true)
 {
     curpmtl.load( ":/bitmaps/cursor_tl.xpm" );
     curpmtc.load( ":/bitmaps/cursor_tc.xpm" );
@@ -85,7 +87,7 @@
     m_selectionRubber = new QRubberBand(QRubberBand::Rectangle, m_widget);
     m_selectionRubber->hide();
 
-    m_dragThreshold   = 3;
+    m_dragThreshold   = 3;    
 }
 
 void MarbleWidgetInputHandler::restoreViewContext()
@@ -102,6 +104,46 @@
     }
 }
 
+void MarbleWidgetDefaultInputHandler::init(MarbleWidget *w)
+{
+    MarbleWidgetInputHandler::init(w);
+  
+    // The interface to the measure tool consists of a RMB popup menu
+    // and some signals.
+    MeasureTool  *measureTool = m_widget->map()->measureTool();
+
+    // Connect the inputHandler and the measure tool to the popup menu
+    if ( !m_popupmenu ) {
+        m_popupmenu    = new MarbleWidgetPopupMenu( m_widget, m_model );
+    }
+    connect( this, SIGNAL( rmbRequest( int, int ) ),
+                       m_popupmenu,    SLOT( showRmbMenu( int, int ) ) );
+    connect( m_popupmenu, SIGNAL( addMeasurePoint( qreal, qreal ) ),
+                       measureTool, SLOT( addMeasurePoint( qreal, qreal ) ) );
+    connect( m_popupmenu, SIGNAL( removeMeasurePoints() ),
+                       measureTool, SLOT( removeMeasurePoints( ) ) );  
+    connect( this, SIGNAL( lmbRequest( int, int ) ),
+                       this,    SLOT( showLmbMenu( int, int ) ) );		       
+}
+
+void MarbleWidgetDefaultInputHandler::showLmbMenu( int x, int y)
+{
+  if (m_leftpopup)
+  {
+    m_popupmenu->showLmbMenu(x,y);
+  }
+}
+
+void MarbleWidgetDefaultInputHandler::setLeftMouseButtonPopup(bool enabled)
+{
+  m_leftpopup = enabled;
+}
+    
+bool MarbleWidgetDefaultInputHandler::leftMouseButtonPopup()
+{
+  return m_leftpopup;
+}
+
 bool MarbleWidgetDefaultInputHandler::eventFilter( QObject* o, QEvent* e )
 {
     Q_UNUSED( o );

Modified: marble/trunk/src/lib/MarbleWidgetInputHandler.h
===================================================================
--- marble/trunk/src/lib/MarbleWidgetInputHandler.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/MarbleWidgetInputHandler.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -37,6 +37,7 @@
 class MarbleModel;
 class MarbleWidget;
 class MarbleMap;
+class MarbleWidgetPopupMenu;
 
 class MARBLE_EXPORT MarbleWidgetInputHandler  : public QObject
 {
@@ -49,7 +50,7 @@
     void setPositionSignalConnected( bool connected ){ m_positionSignalConnected = connected; }
     bool isPositionSignalConnected() const { return m_positionSignalConnected; }
 
-    void init(MarbleWidget*);
+    virtual void init(MarbleWidget*);
 
  Q_SIGNALS:
     // Mouse button menus
@@ -77,14 +78,33 @@
 
 class MarbleWidgetDefaultInputHandler  : public MarbleWidgetInputHandler
 {
+ Q_OBJECT
+
  public:
     MarbleWidgetDefaultInputHandler();
 
     static bool keyEvent( MarbleMap * map, QEvent* e );
+    
+    virtual void init(MarbleWidget*);
+    
+    /**
+     * @brief  Set whether a popup menu appears on a click (not drag) with the left mouse button
+     * @param  enabled True to enable the popup menu (default), false to disable it
+     */
+    void setLeftMouseButtonPopup(bool enabled);
+    
+    /**
+     * @brief  Return whether the left mouse button popup menu is active
+     * @return True iff a popup menu is shown on left mouse button clicks
+     */
+    bool leftMouseButtonPopup();
 
  protected:
     bool eventFilter( QObject *, QEvent * );
 
+ private Q_SLOTS:
+    void showLmbMenu( int, int );
+    
  private:
     QPixmap  curpmtl;
     QPixmap  curpmtc;
@@ -113,6 +133,10 @@
 
     QPoint       m_selectionOrigin;
     QRubberBand *m_selectionRubber;
+    
+    MarbleWidgetPopupMenu     *m_popupmenu;
+    
+    bool m_leftpopup;
 };
 
 }

Modified: marble/trunk/src/lib/PlaceMarkInfoDialog.ui
===================================================================
--- marble/trunk/src/lib/PlaceMarkInfoDialog.ui	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/PlaceMarkInfoDialog.ui	2009-02-24 20:37:32 UTC (rev 3589)
@@ -5,7 +5,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>513</width>
+    <width>800</width>
     <height>565</height>
    </rect>
   </property>

Modified: marble/trunk/src/lib/PlaceMarkManager.cpp
===================================================================
--- marble/trunk/src/lib/PlaceMarkManager.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/PlaceMarkManager.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -45,6 +45,12 @@
 
 PlaceMarkManager::~PlaceMarkManager()
 {
+    foreach( PlaceMarkLoader *loader, m_loaderList ) {
+        if ( loader ) {
+            loader->wait();
+        }
+    }
+
     delete m_model;
     /* do not delete the m_geomodel here
      * it is not this models property

Modified: marble/trunk/src/lib/PlanetaryConstants.h
===================================================================
--- marble/trunk/src/lib/PlanetaryConstants.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/PlanetaryConstants.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -17,79 +17,94 @@
 #ifndef PLANETARYCONSTANTS_H
 #define PLANETARYCONSTANTS_H
 
-#define pc_deg2rad(x) x*M_PI/180.0
+#include "global.h"
 
-struct PlanetaryConstants {
-	qreal M_0, M_1; // for calculating mean anomaly
-	qreal C_1, C_2, C_3, C_4, C_5, C_6; // for calculating equation of center
-	qreal Pi; // ecliptic longitude of the perihelion
-	qreal epsilon; // obliquity of the ecliptic plane
-	qreal theta_0, theta_1; // for calculating sidereal time
+namespace Marble {
+
+struct PlanetaryConstants
+{
+    qreal M_0, M_1; // for calculating mean anomaly
+    qreal C_1, C_2, C_3, C_4, C_5, C_6; // for calculating equation of center
+    qreal Pi; // ecliptic longitude of the perihelion
+    qreal epsilon; // obliquity of the ecliptic plane
+    qreal theta_0, theta_1; // for calculating sidereal time
 };
 
-// constants taken from http://www.astro.uu.nl/~strous/AA/en/reken/zonpositie.html
+// constants taken from
+// http://www.astro.uu.nl/~strous/AA/en/reken/zonpositie.html
 PlanetaryConstants PC_MERCURY = {
-	pc_deg2rad(174.7948), pc_deg2rad(4.09233445),
-	pc_deg2rad(23.4400), pc_deg2rad(2.9818), pc_deg2rad(0.5255), pc_deg2rad(0.1058), pc_deg2rad(0.0241), pc_deg2rad(0.0055),
-	pc_deg2rad(111.5943),
-	pc_deg2rad(0.02),
-	pc_deg2rad(13.5964), pc_deg2rad(6.1385025)
+    (174.7948*DEG2RAD), (4.09233445*DEG2RAD),
+    (23.4400*DEG2RAD), (2.9818*DEG2RAD), (0.5255*DEG2RAD), (0.1058*DEG2RAD),
+    (0.0241*DEG2RAD), (0.0055*DEG2RAD),
+    (111.5943*DEG2RAD),
+    (0.02*DEG2RAD),
+    (13.5964*DEG2RAD), (6.1385025*DEG2RAD)
 };
 PlanetaryConstants PC_VENUS = {
-	pc_deg2rad(50.4161), pc_deg2rad(1.60213034),
-	pc_deg2rad(0.7758), pc_deg2rad(0.0033), pc_deg2rad(0.0000), pc_deg2rad(0.0000), pc_deg2rad(0.0000), pc_deg2rad(0.0000),
-	pc_deg2rad(73.9519),
-	pc_deg2rad(2.64),
-	pc_deg2rad(215.2995), pc_deg2rad(-1.4813688)
+    (50.4161*DEG2RAD), (1.60213034*DEG2RAD),
+    (0.7758*DEG2RAD), (0.0033*DEG2RAD), (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (73.9519*DEG2RAD),
+    (2.64*DEG2RAD),
+    (215.2995*DEG2RAD), (-1.4813688*DEG2RAD)
 };
 PlanetaryConstants PC_EARTH = {
-	pc_deg2rad(357.5291), pc_deg2rad(0.98560028),
-	pc_deg2rad(1.9148), pc_deg2rad(0.0200), pc_deg2rad(0.0003), pc_deg2rad(0.0000), pc_deg2rad(0.0000), pc_deg2rad(0.0000),
-	pc_deg2rad(102.9372),
-	pc_deg2rad(23.45),
-	pc_deg2rad(280.1600), pc_deg2rad(360.9856235),
+    (357.5291*DEG2RAD), (0.98560028*DEG2RAD),
+    (1.9148*DEG2RAD), (0.0200*DEG2RAD), (0.0003*DEG2RAD), (0.0000*DEG2RAD),
+    (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (102.9372*DEG2RAD),
+    (23.45*DEG2RAD),
+    (280.1600*DEG2RAD), (360.9856235*DEG2RAD),
 };
 PlanetaryConstants PC_MARS = {
-	pc_deg2rad(19.3730), pc_deg2rad(0.52402068),
-	pc_deg2rad(10.6912), pc_deg2rad(0.6228), pc_deg2rad(0.0503), pc_deg2rad(0.0046), pc_deg2rad(0.0005), pc_deg2rad(0.0000),
-	pc_deg2rad(70.9812),
-	pc_deg2rad(25.19),
-	pc_deg2rad(313.4803), pc_deg2rad(350.89198226)
+    (19.3730*DEG2RAD), (0.52402068*DEG2RAD),
+    (10.6912*DEG2RAD), (0.6228*DEG2RAD), (0.0503*DEG2RAD), (0.0046*DEG2RAD),
+    (0.0005*DEG2RAD), (0.0000*DEG2RAD),
+    (70.9812*DEG2RAD),
+    (25.19*DEG2RAD),
+    (313.4803*DEG2RAD), (350.89198226*DEG2RAD)
 };
 PlanetaryConstants PC_JUPITER = {
-	pc_deg2rad(20.0202), pc_deg2rad(0.08308529),
-	pc_deg2rad(5.5549), pc_deg2rad(0.1683), pc_deg2rad(0.0071), pc_deg2rad(0.0003), pc_deg2rad(0.0000), pc_deg2rad(0.0000),
-	pc_deg2rad(237.2074),
-	pc_deg2rad(3.12),
-	pc_deg2rad(146.0727), pc_deg2rad(870.5366420)
+    (20.0202*DEG2RAD), (0.08308529*DEG2RAD),
+    (5.5549*DEG2RAD), (0.1683*DEG2RAD), (0.0071*DEG2RAD), (0.0003*DEG2RAD),
+    (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (237.2074*DEG2RAD),
+    (3.12*DEG2RAD),
+    (146.0727*DEG2RAD), (870.5366420*DEG2RAD)
 };
 PlanetaryConstants PC_SATURN = {
-	pc_deg2rad(317.0207), pc_deg2rad(0.03344414),
-	pc_deg2rad(6.3585), pc_deg2rad(0.2204), pc_deg2rad(0.0106), pc_deg2rad(0.0006), pc_deg2rad(0.0000), pc_deg2rad(0.0000),
-	pc_deg2rad(99.4571),
-	pc_deg2rad(26.74),
-	pc_deg2rad(174.3479), pc_deg2rad(810.7939024)
+    (317.0207*DEG2RAD), (0.03344414*DEG2RAD),
+    (6.3585*DEG2RAD), (0.2204*DEG2RAD), (0.0106*DEG2RAD), (0.0006*DEG2RAD),
+    (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (99.4571*DEG2RAD),
+    (26.74*DEG2RAD),
+    (174.3479*DEG2RAD), (810.7939024*DEG2RAD)
 };
 PlanetaryConstants PC_URANUS = {
-	pc_deg2rad(141.0498), pc_deg2rad(0.01172834),
-	pc_deg2rad(5.3042), pc_deg2rad(0.1534), pc_deg2rad(0.0062), pc_deg2rad(0.0003), pc_deg2rad(0.0000), pc_deg2rad(0.0000),
-	pc_deg2rad(5.4639),
-	pc_deg2rad(82.22),
-	pc_deg2rad(17.9705), pc_deg2rad(-501.1600928)
+    (141.0498*DEG2RAD), (0.01172834*DEG2RAD),
+    (5.3042*DEG2RAD), (0.1534*DEG2RAD), (0.0062*DEG2RAD), (0.0003*DEG2RAD),
+    (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (5.4639*DEG2RAD),
+    (82.22*DEG2RAD),
+    (17.9705*DEG2RAD), (-501.1600928*DEG2RAD)
 };
 PlanetaryConstants PC_NEPTUNE = {
-	pc_deg2rad(256.2250), pc_deg2rad(0.00598103),
-	pc_deg2rad(1.0302), pc_deg2rad(0.0058), pc_deg2rad(0.0000), pc_deg2rad(0.0000), pc_deg2rad(0.0000), pc_deg2rad(0.0000),
-	pc_deg2rad(182.1957),
-	pc_deg2rad(27.84),
-	pc_deg2rad(52.3996), pc_deg2rad(536.3128492)
+    (256.2250*DEG2RAD), (0.00598103*DEG2RAD),
+    (1.0302*DEG2RAD), (0.0058*DEG2RAD), (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (0.0000*DEG2RAD), (0.0000*DEG2RAD),
+    (182.1957*DEG2RAD),
+    (27.84*DEG2RAD),
+    (52.3996*DEG2RAD), (536.3128492*DEG2RAD)
 };
 PlanetaryConstants PC_PLUTO = {
-	pc_deg2rad(14.882), pc_deg2rad(0.00396),
-	pc_deg2rad(28.3150), pc_deg2rad(4.3408), pc_deg2rad(0.9214), pc_deg2rad(0.2235), pc_deg2rad(0.0627), pc_deg2rad(0.0174),
-	pc_deg2rad(4.5433),
-	pc_deg2rad(57.46),
-	pc_deg2rad(56.3183), pc_deg2rad(-56.3623195)
+    (14.882*DEG2RAD), (0.00396*DEG2RAD),
+    (28.3150*DEG2RAD), (4.3408*DEG2RAD), (0.9214*DEG2RAD), (0.2235*DEG2RAD),
+    (0.0627*DEG2RAD), (0.0174*DEG2RAD),
+    (4.5433*DEG2RAD),
+    (57.46*DEG2RAD),
+    (56.3183*DEG2RAD), (-56.3623195*DEG2RAD)
 };
 
+}
+
 #endif

Modified: marble/trunk/src/lib/PluginManager.cpp
===================================================================
--- marble/trunk/src/lib/PluginManager.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/PluginManager.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -96,7 +96,7 @@
 
         MarbleRenderPlugin * layerPlugin;
         if ( obj ) {
-            layerPlugin = qobject_cast<MarbleRenderPlugin *>(obj);
+            layerPlugin = qobject_cast<MarbleRenderPlugin *>(obj)->pluginInstance();
         }
 
         if( obj && layerPlugin ) {

Modified: marble/trunk/src/lib/Projections/SphericalProjection.cpp
===================================================================
--- marble/trunk/src/lib/Projections/SphericalProjection.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/Projections/SphericalProjection.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -23,21 +23,17 @@
 
 static SphericalProjectionHelper  theHelper;
 
+// Since SphericalProjection does not have members yet, the
+// private class for the members is empty.
+// For ABI reasons it is there however, but we do not yet need to
+// construct/destruct an object of this class
 class SphericalProjectionPrivate
 {
- public:
-    SphericalProjectionPrivate()
-    {
-    }
-
-    ~SphericalProjectionPrivate()
-    {
-    }
 };
 
 SphericalProjection::SphericalProjection()
     : AbstractProjection(), 
-      d( new SphericalProjectionPrivate() )
+      d( 0 )
 {
     m_maxLat  = 90.0 * DEG2RAD;
     m_minLat  = -90.0 * DEG2RAD;
@@ -47,16 +43,13 @@
 
 SphericalProjection::~SphericalProjection()
 {
-    delete d;
 }
 
-
 AbstractProjectionHelper *SphericalProjection::helper()
 {
     return &theHelper;
 }
 
-
 bool SphericalProjection::screenCoordinates( const qreal lon, const qreal lat,
                                              const ViewportParams *viewport,
                                              int& x, int& y )

Modified: marble/trunk/src/lib/Projections/SphericalProjection.h
===================================================================
--- marble/trunk/src/lib/Projections/SphericalProjection.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/Projections/SphericalProjection.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -54,13 +54,13 @@
      * @return @c true  if the geographical coordinates are visible on the screen
      *         @c false if the geographical coordinates are not visible on the screen
      */
-    inline bool screenCoordinates( const qreal lon, const qreal lat,
+    bool screenCoordinates( const qreal lon, const qreal lat,
                             const ViewportParams *params,
                             int& x, int& y );
 
-    inline bool screenCoordinates( const GeoDataCoordinates &coordinates, 
-                                   const ViewportParams *params,
-                                   int &x, int &y, bool &globeHidesPoint );
+    bool screenCoordinates( const GeoDataCoordinates &coordinates, 
+                            const ViewportParams *params,
+                            int &x, int &y, bool &globeHidesPoint );
 
     bool screenCoordinates( const GeoDataCoordinates &coordinates,
                             const ViewportParams * viewport,
@@ -80,10 +80,10 @@
      * @return @c true  if the pixel (x, y) is within the globe
      *         @c false if the pixel (x, y) is outside the globe, i.e. in space.
      */
-    inline bool geoCoordinates( int x, int y,
-                                const ViewportParams *params,
-                                qreal& lon, qreal& lat,
-                                GeoDataCoordinates::Unit unit = GeoDataCoordinates::Degree );
+    bool geoCoordinates( int x, int y,
+                         const ViewportParams *params,
+                         qreal& lon, qreal& lat,
+                         GeoDataCoordinates::Unit unit = GeoDataCoordinates::Degree );
 
     /**
      * @brief Get a quaternion representing a point on the earth corresponding to a pixel in the map.
@@ -93,9 +93,9 @@
      * @return @c true  if the pixel (x, y) is within the globe
      *         @c false if the pixel (x, y) is outside the globe, i.e. in space
      */
-    inline bool geoCoordinates( int x, int y, 
-                                const ViewportParams *params,
-                                Quaternion &q );
+    bool geoCoordinates( int x, int y, 
+                         const ViewportParams *params,
+                         Quaternion &q );
 
     GeoDataLatLonAltBox latLonAltBox( const QRect& screenRect,
                                       const ViewportParams *viewport );

Modified: marble/trunk/src/lib/SunControlWidget.cpp
===================================================================
--- marble/trunk/src/lib/SunControlWidget.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/SunControlWidget.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -9,9 +9,14 @@
 // Copyright 2008      Inge Wallin    <inge@xxxxxxxxxxxxxx>
 //
 
-
+// Own
 #include "SunControlWidget.h"
 
+// Qt
+#include <QShowEvent>
+
+#include "ExtDateTime.h"
+
 using namespace Marble;
 
 SunControlWidget::SunControlWidget(QWidget* parent, SunLocator* sunLocator)
@@ -34,10 +39,10 @@
              this,                        SLOT( timeChanged( const QTime& ) ) );
     connect( m_uiWidget.timeSlider,       SIGNAL( sliderMoved( int ) ),
              this,                        SLOT( hourChanged( int ) ) );
-	connect(m_uiWidget.speedSlider, SIGNAL(sliderMoved(int)), this, SLOT(speedChanged(int)));
-	
+    connect(m_uiWidget.speedSlider, SIGNAL(sliderMoved(int)), this, SLOT(speedChanged(int)));
+
     setModal( false );
-	
+
     updateDateTime();
     connect( m_sunLocator->datetime(), SIGNAL( timeChanged() ),
              this,                     SLOT( updateDateTime() ) );
@@ -75,6 +80,7 @@
         m_sunLocator->setCitylights( false );
     else if ( index == 1 )
         m_sunLocator->setCitylights( true );
+    m_sunLocator->update();
 }
 
 void SunControlWidget::centerSunClicked(bool checked)
@@ -148,4 +154,19 @@
     m_uiWidget.speedLabel->setText( QString( "%1x" ).arg( speed ) );
 }
 
+void SunControlWidget::showEvent(QShowEvent* event)
+{
+    if( !event->spontaneous() ) {
+        // Loading all options
+        m_uiWidget.speedSlider->setValue( m_sunLocator->datetime()->getSpeed() );
+        updateDateTime();
+        if( m_sunLocator->getCitylights() )
+            m_uiWidget.sunShadingComboBox->setCurrentIndex(1);
+        else
+            m_uiWidget.sunShadingComboBox->setCurrentIndex(0);
+        m_uiWidget.centerToolButton->setChecked( m_sunLocator->getCentered() );
+        m_uiWidget.showToolButton->setChecked( m_sunLocator->getShow() );
+    }
+}
+
 #include "SunControlWidget.moc"

Modified: marble/trunk/src/lib/SunControlWidget.h
===================================================================
--- marble/trunk/src/lib/SunControlWidget.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/SunControlWidget.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -53,6 +53,7 @@
     void datetimeChanged(QDateTime datetime);
 	
  protected:
+    void showEvent(QShowEvent* event);
     Q_DISABLE_COPY( SunControlWidget )
 
     Ui::SunControlWidget  m_uiWidget;

Modified: marble/trunk/src/lib/SunLocator.cpp
===================================================================
--- marble/trunk/src/lib/SunLocator.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/SunLocator.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -21,8 +21,14 @@
  
 #include <QtCore/QDebug>
 
-using namespace Marble;
+#include <cmath>
+// M_PI is sometimes defined in <cmath>
+#ifndef M_PI 
+#define M_PI 3.14159265358979323846264338327950288419717
+#endif
 
+namespace Marble {
+
 using std::sin;
 using std::cos;
 using std::asin;
@@ -31,94 +37,141 @@
 qreal deg2rad(qreal x) { return x*M_PI/180.0; }
 qreal rad2deg(qreal x) { return x*180.0/M_PI; }
 
-const int J2000 = 2451545; // epoch J2000 = 1 January 2000, noon Terrestrial Time (11:58:55.816 UTC)
+// epoch J2000 = 1 January 2000, noon Terrestrial Time (11:58:55.816 UTC)
+const int J2000 = 2451545;
 
 // taking the full moon of 15 January 1900 19:07 UTC as the epoch for the moon
-const qreal MOON_EPOCH = 2415035.297; // value from http://home.hiwaay.net/~krcool/Astro/moon/fullmoon.htm
+// value from http://home.hiwaay.net/~krcool/Astro/moon/fullmoon.htm
+const qreal MOON_EPOCH = 2415035.297;
 const qreal MOON_SYNODIC_PERIOD = 29.530588;
 
-const int update_interval = 60000; // emit updateSun() every update_interval ms
+// emit updateSun() every update_interval ms
+const int update_interval = 60000;
 
-namespace Marble {
+class SunLocatorPrivate
+{
+public:
+    explicit SunLocatorPrivate(ExtDateTime *dateTime)
+        : m_lon( 0.0 ),
+          m_lat( 0.0 ),
+          m_datetime( dateTime ),
+          m_show( false ),
+          m_citylights( false ),
+          m_centered( false ),
+          m_body( "" )
+    {
+    }
 
-class SunLocatorPrivate { };
+    qreal m_lon;
+    qreal m_lat;
 
-}
+    ExtDateTime* m_datetime;
+    bool m_show;
+    bool m_citylights;
+    bool m_centered;
+    QString m_body;
+};
 
+
 SunLocator::SunLocator(ExtDateTime *dateTime)
   : QObject(),
-    d( new SunLocatorPrivate ),
-    m_datetime( dateTime ),
-    m_show( false ),
-    m_citylights( false ),
-    m_centered( false ),
-    m_body( "" )
+    d( new SunLocatorPrivate( dateTime ))
 {
 }
 
-SunLocator::~SunLocator() {
-//     delete m_datetime;
+SunLocator::~SunLocator()
+{
     delete d;
 }
 
 void SunLocator::updatePosition()
 {
-    if( m_body == "moon" ) {
-        qreal d = (qreal)m_datetime->toJDN() + m_datetime->dayFraction() - MOON_EPOCH; // days since the first full moon of the 20th century
-        d /= MOON_SYNODIC_PERIOD; // number of orbits the moon has made (relative to the sun as observed from earth)
-        d = d - (int)d; // take fractional part
-        if(d < 0.0) d += 1.0; // for dates before MOON_EPOCH
-        
-        qDebug() << "MOON:" << (int)(d*100) << "% of orbit completed and" << (int)(abs((d-0.5)*2) * 100) << "% illuminated";
-        
-        m_lon = (1-d) * 2*M_PI;
-        m_lat = 0.0; // not necessarily accurate but close enough (only differs by about +-6 degrees of this value)
-	
+    if( d->m_body == "moon" ) {
+        // days since the first full moon of the 20th century
+        qreal days = (qreal)d->m_datetime->toJDN() + d->m_datetime->dayFraction() - MOON_EPOCH;
+
+        // number of orbits the moon has made (relative to the sun as observed from earth)
+        days /= MOON_SYNODIC_PERIOD;
+
+        // take fractional part
+        days = days - (int)days;
+
+        // for dates before MOON_EPOCH
+        if (days < 0.0)
+            days += 1.0;
+
+        qDebug() << "MOON:" << (int)(days*100) << "% of orbit completed and"
+                 << (int)(abs((days-0.5)*2) * 100) << "% illuminated";
+
+        d->m_lon = (1-days) * 2*M_PI;
+
+        // not necessarily accurate but close enough
+        // (only differs by about +-6 degrees of this value)
+        d->m_lat = 0.0;
 	return;
     }
-    
-    PlanetaryConstants pc = PC_EARTH; // default to the earth
+
+    // default to the earth
+    PlanetaryConstants pc = PC_EARTH;
     // planets
-         if ( m_body == "mercury" ) pc = PC_MERCURY;
-    else if ( m_body == "venus" )   pc = PC_VENUS;
-    else if ( m_body == "earth" )   pc = PC_EARTH;
-    else if ( m_body == "mars" )    pc = PC_MARS;
-    else if ( m_body == "jupiter" ) pc = PC_JUPITER;
-    else if ( m_body == "saturn" )  pc = PC_SATURN;
-    else if ( m_body == "uranus" )  pc = PC_URANUS;
-    else if ( m_body == "neptune" ) pc = PC_NEPTUNE;
-    // dwarf planets ... (everybody likes pluto)
-    else if ( m_body == "pluto" )   pc = PC_PLUTO;
-    
-    long d = m_datetime->toJDN() - J2000; // find current Julian day number relative to epoch J2000
-    
+    if ( d->m_body == "mercury" ) pc = PC_MERCURY;
+    else if ( d->m_body == "venus" )   pc = PC_VENUS;
+    else if ( d->m_body == "earth" )   pc = PC_EARTH;
+    else if ( d->m_body == "mars" )    pc = PC_MARS;
+    else if ( d->m_body == "jupiter" ) pc = PC_JUPITER;
+    else if ( d->m_body == "saturn" )  pc = PC_SATURN;
+    else if ( d->m_body == "uranus" )  pc = PC_URANUS;
+    else if ( d->m_body == "neptune" ) pc = PC_NEPTUNE;
+    else if ( d->m_body == "pluto" )   pc = PC_PLUTO;
+
+    // find current Julian day number relative to epoch J2000
+    long day = d->m_datetime->toJDN() - J2000;
+
     // from http://www.astro.uu.nl/~strous/AA/en/reken/zonpositie.html
-    qreal M = pc.M_0 + pc.M_1*d; // mean anomaly
-    qreal C = pc.C_1*sin(M) + pc.C_2*sin(2*M) + pc.C_3*sin(3*M) + pc.C_4*sin(4*M) + pc.C_5*sin(5*M) + pc.C_6*sin(6*M); // equation of center
-    qreal nu = M + C; // true anomaly
-    qreal lambda_sun = nu + pc.Pi + M_PI; // ecliptic longitude of sun as seen from planet
-    qreal delta_sun = asin(sin(pc.epsilon)*sin(lambda_sun)); // declination of sun as seen from planet
-    qreal alpha_sun = atan2(cos(pc.epsilon)*sin(lambda_sun), cos(lambda_sun)); // right ascension of sun as seen from planet
-    
-    qreal theta = alpha_sun; // solar noon occurs when sidereal time is equal to alpha_sun
-    m_lon = M_PI - (pc.theta_0 + pc.theta_1 * (d+m_datetime->dayFraction()) - theta); // convert sidereal time to geographic longitude
-    while(m_lon < 0) m_lon += 2*M_PI;
-    m_lat = -delta_sun; // convert positive north to positive south
-    
+    // mean anomaly
+    qreal M = pc.M_0 + pc.M_1*day;
+
+    // equation of center
+    qreal C = pc.C_1*sin(M) + pc.C_2*sin(2*M) + pc.C_3*sin(3*M) + pc.C_4*sin(4*M)
+        + pc.C_5*sin(5*M) + pc.C_6*sin(6*M);
+
+    // true anomaly
+    qreal nu = M + C;
+
+    // ecliptic longitude of sun as seen from planet
+    qreal lambda_sun = nu + pc.Pi + M_PI;
+
+    // declination of sun as seen from planet
+    qreal delta_sun = asin(sin(pc.epsilon)*sin(lambda_sun));
+
+    // right ascension of sun as seen from planet
+    qreal alpha_sun = atan2(cos(pc.epsilon)*sin(lambda_sun), cos(lambda_sun));
+
+    // solar noon occurs when sidereal time is equal to alpha_sun
+    qreal theta = alpha_sun;
+
+    // convert sidereal time to geographic longitude
+    d->m_lon = M_PI - (pc.theta_0 + pc.theta_1 * (day + d->m_datetime->dayFraction()) - theta);
+
+    while(d->m_lon < 0)
+        d->m_lon += 2*M_PI;
+
+    // convert positive north to positive south
+    d->m_lat = -delta_sun;
+
     qDebug() << "alpha_sun =" << rad2deg(alpha_sun);
     qDebug() << "delta_sun =" << rad2deg(delta_sun);
-    qDebug() << "m_lon =" << rad2deg(m_lon);
-    qDebug() << "m_lat =" << rad2deg(m_lat);
+    qDebug() << "d->m_lon =" << rad2deg(d->m_lon);
+    qDebug() << "d->m_lat =" << rad2deg(d->m_lat);
 }
 
 
-qreal SunLocator::shading(qreal lon, qreal lat)
+qreal SunLocator::shading(qreal lon, qreal lat) const
 {
-
     // haversine formula
-    qreal a = sin((lat-m_lat)/2.0);
-    qreal b = sin((lon-m_lon)/2.0);
-    qreal h = (a*a)+cos(lat)*cos(m_lat)*(b*b); 
+    qreal a = sin((lat-d->m_lat)/2.0);
+    qreal b = sin((lon-d->m_lon)/2.0);
+    qreal h = (a*a)+cos(lat)*cos(d->m_lat)*(b*b); 
 
     /*
       h = 0.0 // directly beneath sun
@@ -129,10 +182,10 @@
 
     qreal twilightZone = 0.0;
 
-    if ( m_body == "earth" || m_body == "venus" ) {
+    if ( d->m_body == "earth" || d->m_body == "venus" ) {
         twilightZone = 0.1; // this equals 18 deg astronomical twilight.
     }
-	
+
     qreal brightness;
     if ( h <= 0.5 - twilightZone / 2.0 )
         brightness = 1.0;
@@ -140,20 +193,21 @@
         brightness = 0.0;
     else
         brightness = ( 0.5 + twilightZone/2.0 - h ) / twilightZone;
-	
+
     return brightness;
 }
 
-void SunLocator::shadePixel(QRgb& pixcol, qreal brightness)
+void SunLocator::shadePixel(QRgb& pixcol, qreal brightness) const
 {
     // daylight - no change
     if ( brightness > 0.99999 )
         return;
-		
+
     if ( brightness < 0.00001 ) {
         // night
-//      Doing  "pixcol = qRgb(r/2, g/2, b/2);" by shifting some electrons around ;)
-        pixcol = qRgb(qRed(pixcol) * 0.35, qGreen(pixcol) * 0.35, qBlue(pixcol)  * 0.35); // by shifting some electrons around ;)
+        //      Doing  "pixcol = qRgb(r/2, g/2, b/2);" by shifting some electrons around ;)
+        // by shifting some electrons around ;)
+        pixcol = qRgb(qRed(pixcol) * 0.35, qGreen(pixcol) * 0.35, qBlue(pixcol)  * 0.35);
         // pixcol = (pixcol & 0xff000000) | ((pixcol >> 1) & 0x7f7f7f);
     } else {
         // gradual shadowing
@@ -166,27 +220,27 @@
 }
 
 void SunLocator::shadePixelComposite(QRgb& pixcol, QRgb& dpixcol,
-                                     qreal brightness)
+                                     qreal brightness) const
 {
     // daylight - no change
     if ( brightness > 0.99999 )
         return;
-	
+
     if ( brightness < 0.00001 ) {
         // night
         pixcol = dpixcol;
     } else {
         // gradual shadowing
         qreal& d = brightness;
-		
+
         int r = qRed( pixcol );
         int g = qGreen( pixcol );
         int b = qBlue( pixcol );
-		
+
         int dr = qRed( dpixcol );
         int dg = qGreen( dpixcol );
         int db = qBlue( dpixcol );
-		
+
         pixcol = qRgb( (int)( d * r + (1 - d) * dr ),
                        (int)( d * g + (1 - d) * dg ),
                        (int)( d * b + (1 - d) * db ) );
@@ -197,11 +251,10 @@
 {
     qDebug() << "void SunLocator::update()";
     updatePosition();
-    if ( m_show || m_centered )
-    {
-        if ( m_show )
+    if ( d->m_show || d->m_centered ) {
+        if ( d->m_show )
             emit updateSun();
-        if ( m_centered )
+        if ( d->m_centered )
             emit centerSun();
         return;
     }
@@ -211,12 +264,12 @@
 
 void SunLocator::setShow(bool show)
 {
-    if ( show == m_show ) {
+    if ( show == d->m_show ) {
         return;
     }
-    
+
     qDebug() << "void SunLocator::setShow( bool )";
-    m_show = show;
+    d->m_show = show;
     updatePosition();
 
     emit updateSun();
@@ -224,14 +277,14 @@
 
 void SunLocator::setCentered(bool centered)
 {
-    if ( centered == m_centered ) {
+    if ( centered == d->m_centered ) {
         return;
     }
 
     qDebug() << "SunLocator::setCentered";
     qDebug() << "sunLocator =" << this;
-    m_centered = centered;
-    if ( m_centered ) {
+    d->m_centered = centered;
+    if ( d->m_centered ) {
         updatePosition();
         emit centerSun();
     } else
@@ -240,14 +293,14 @@
 
 void SunLocator::setBody(QString body)
 {
-    if ( body == m_body ) {
+    if ( body == d->m_body ) {
         return;
     }
 
-    QString previousBody = m_body;
+    QString previousBody = d->m_body;
 
-    qDebug() << "SunLocator::setBody( QString )";    
-    m_body = body;
+    qDebug() << "SunLocator::setBody( QString )";
+    d->m_body = body;
     updatePosition();
 
     if ( !previousBody.isEmpty() ) {
@@ -255,4 +308,41 @@
     }
 }
 
+void SunLocator::setCitylights(bool show)
+{
+    d->m_citylights = show;
+}
+
+bool SunLocator::getShow() const
+{
+    return d->m_show;
+}
+
+bool SunLocator::getCitylights() const
+{
+    return d->m_citylights;
+}
+
+bool SunLocator::getCentered() const
+{
+    return d->m_centered;
+}
+
+qreal SunLocator::getLon() const
+{
+    return d->m_lon * 180.0 / M_PI;
+}
+
+qreal SunLocator::getLat() const
+{
+    return -d->m_lat * 180.0 / M_PI;
+}
+
+ExtDateTime* SunLocator::datetime() const
+{
+    return d->m_datetime;
+}
+
+}
+
 #include "SunLocator.moc"

Modified: marble/trunk/src/lib/SunLocator.h
===================================================================
--- marble/trunk/src/lib/SunLocator.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/SunLocator.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -17,30 +17,23 @@
 #ifndef SUNLOCATOR_H
 #define SUNLOCATOR_H
 
-#include <cmath>
-// M_PI is sometimes defined in <cmath>
-#ifndef M_PI 
-#define M_PI 3.14159265358979323846264338327950288419717
-#endif
 
 #include <QtCore/QObject>
 #include <QtCore/QString>
 #include <QtGui/QColor>
-//#include <QtCore/QTimer>
 
-#include "ExtDateTime.h"
 //FIXME: This class shouldn't be exposed but is needed by the worldclock plasmoid
 #include "marble_export.h"
 
 namespace Marble
 {
-
+class ExtDateTime;
 class SunLocatorPrivate;
 
 class MARBLE_EXPORT SunLocator : public QObject
 {
     Q_OBJECT
-	
+
  public:
     /** At the moment Sunlocator does not take ownership of dateTime.
 	However in the destructor there is a delete commented out.
@@ -50,48 +43,38 @@
     explicit SunLocator(ExtDateTime *dateTime);
     virtual ~SunLocator();
 
-    qreal  shading(qreal lon, qreal lat);
-    void    shadePixel(QRgb& pixcol, qreal shade);
-    void    shadePixelComposite(QRgb& pixcol, QRgb& dpixcol, qreal shade);
-	
+    qreal shading(qreal lon, qreal lat) const;
+    void  shadePixel(QRgb& pixcol, qreal shade) const;
+    void  shadePixelComposite(QRgb& pixcol, QRgb& dpixcol, qreal shade) const;
+
     void  setShow(bool show);
-    void  setCitylights(bool show) {m_citylights = show;}
+    void  setCitylights(bool show);
     void  setCentered(bool show);
     void  setBody(QString body);
-	
-    bool getShow() {return m_show;}
-    bool getCitylights() {return m_citylights;}
-    bool getCentered() {return m_centered;}
-    qreal getLon() {return m_lon * 180.0 / M_PI;}
-    qreal getLat() {return -m_lat * 180.0 / M_PI;}
-	
-    ExtDateTime* datetime() {return m_datetime;}
-	
+
+    bool getShow() const;
+    bool getCitylights() const;
+    bool getCentered() const;
+    qreal getLon() const;
+    qreal getLat() const;
+
+    ExtDateTime* datetime() const;
+
  public Q_SLOTS:
     void update();
-	
+
  Q_SIGNALS:
     void updateStars();
     void updateSun();
     void centerSun();
     void reenableWidgetInput();
-	
+
  private:
     void updatePosition();
 
     SunLocatorPrivate * const d;
 
- protected:
     Q_DISABLE_COPY( SunLocator )
-    qreal m_lon;
-    qreal m_lat;
-
-    ExtDateTime* m_datetime;
-    bool m_show;
-    bool m_citylights;
-    bool m_centered;
-    QString m_body;
-//     QTimer* m_timer;
 };
 
 }

Modified: marble/trunk/src/lib/TextureColorizer.h
===================================================================
--- marble/trunk/src/lib/TextureColorizer.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/TextureColorizer.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -43,7 +43,7 @@
 class TextureColorizer
 {
  public:
-    TextureColorizer(const QString&, const QString&);
+    explicit TextureColorizer(const QString&, const QString&);
     virtual ~TextureColorizer(){}
 
     void colorize(ViewParams *viewParams);

Modified: marble/trunk/src/lib/TileLoader.cpp
===================================================================
--- marble/trunk/src/lib/TileLoader.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/TileLoader.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -152,11 +152,11 @@
     while ( it.hasNext() ) {
         it.next();
         if ( it.value()->used() == false ) {
-
+            // If inCache == false then the cache is too small to store the tile 
+            // but the item will get deleted nevertheless and the pointer we have 
+            // doesn't get set to zero (so don't delete it in this case or it will crash!)
             bool inCache = d->m_tileCache.insert( it.key(), it.value(), it.value()->numBytes() );
             d->m_tileHash.remove( it.key() );
-            if ( inCache == false )
-                delete it.value();
         }
     }
 }
@@ -167,11 +167,11 @@
     QHashIterator<TileId, TextureTile*> it( d->m_tileHash );
     while ( it.hasNext() ) {
         it.next();
-
+        // If inCache == false then the cache is too small to store the tile 
+        // but the item will get deleted nevertheless and the pointer we have 
+        // doesn't get set to zero (so don't delete it in this case or it will crash!)
         bool inCache = d->m_tileCache.insert( it.key(), it.value(), it.value()->numBytes() );
         d->m_tileHash.remove( it.key() );
-        if ( inCache == false )
-            delete it.value();
     }
 
     d->m_tileHash.clear();

Modified: marble/trunk/src/lib/TinyWebBrowser.cpp
===================================================================
--- marble/trunk/src/lib/TinyWebBrowser.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/TinyWebBrowser.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -7,6 +7,7 @@
 //
 // Copyright 2006-2007 Torsten Rahn <tackat@xxxxxxx>"
 // Copyright 2007      Inge Wallin  <ingwa@xxxxxxx>"
+// Copyright 2008      Simon Hausmann  <hausmann@xxxxxxx>"
 //
 
 
@@ -54,6 +55,8 @@
     return QString ( "http://%1.wikipedia.org/"; ).arg ( code );
 }
 
+#if QT_VERSION < 0x040400
+
 TinyWebBrowser::TinyWebBrowser ( QWidget *parent )
         : QTextBrowser ( parent ),
         m_source ( guessWikipediaDomain() )
@@ -78,9 +81,9 @@
     << MarbleDirs::systemPath() + "/cache/";
     setSearchPaths ( searchPaths );
 
-#if QT_VERSION >= 0x040300
+// #if QT_VERSION >= 0x040300
     setOpenLinks ( false );
-#endif
+// #endif
     setOpenExternalLinks ( false );
 }
 
@@ -220,4 +223,45 @@
     format.setMargin ( 12 ) ;
     document()->rootFrame()->setFrameFormat ( format );
 }
+
+#else
+
+TinyWebBrowser::TinyWebBrowser( QWidget* parent )
+{
+    connect( this, SIGNAL( statusBarMessage( QString ) ),
+             this, SIGNAL( statusMessage( QString ) ) );
+
+    page()->setLinkDelegationPolicy( QWebPage::DelegateAllLinks );
+    connect( this, SIGNAL( linkClicked( QUrl ) ),
+             this, SLOT( openExternalLink( QUrl ) ) );
+}
+
+TinyWebBrowser::~TinyWebBrowser()
+{
+}
+
+void TinyWebBrowser::setSource( const QString& relativeUrl )
+{
+    QUrl url = relativeUrl;
+    if ( url.isRelative() )
+        url = QUrl( guessWikipediaDomain() ).resolved( url );
+    load( url );
+}
+
+void TinyWebBrowser::print()
+{
+  QPrinter printer;
+
+  QPrintDialog dlg( &printer, this );
+  if ( dlg.exec() )
+    QWebView::print( &printer );
+}
+
+void TinyWebBrowser::openExternalLink( QUrl url )
+{
+    QDesktopServices::openUrl( url );
+}
+
+#endif
+
 #include "TinyWebBrowser.moc"

Modified: marble/trunk/src/lib/TinyWebBrowser.h
===================================================================
--- marble/trunk/src/lib/TinyWebBrowser.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/TinyWebBrowser.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -15,10 +15,13 @@
 // Author: Torsten Rahn
 //
 
+#include <qglobal.h>
 
 #ifndef TINYWEBBROWSER_H
 #define TINYWEBBROWSER_H
 
+#if QT_VERSION < 0x040400
+
 #include <QtCore/QString>
 #include <QtCore/QVariant>
 #include <QtGui/QTextBrowser>
@@ -27,9 +30,8 @@
 
 namespace Marble
 {
-
+class CacheStoragePolicy;
 class HttpDownloadManager;
-class CacheStoragePolicy;
 
 class TinyWebBrowser : public QTextBrowser
 {
@@ -43,7 +45,6 @@
         void setSource ( const QString& urlString );
         void print();
 
-
     Q_SIGNALS:
         void backwardAvailable ( bool );
         void statusMessage ( QString );
@@ -61,9 +62,43 @@
         Q_DISABLE_COPY ( TinyWebBrowser )
         CacheStoragePolicy *m_storagePolicy;
         HttpDownloadManager *m_downloadManager;
+
         QString         m_source;
 };
 
 }
 
+#else
+
+#include <QtWebKit/QWebView>
+#include <QtGui/QDesktopServices>
+
+namespace Marble
+{
+
+class TinyWebBrowser : public QWebView
+{
+    Q_OBJECT
+
+ public:
+    TinyWebBrowser( QWidget* parent = 0 );
+    ~TinyWebBrowser();
+
+ public Q_SLOTS:
+    void setSource( const QString& relativeUrl );
+    void print();
+
+ Q_SIGNALS:
+    void statusMessage( QString );
+
+ private Q_SLOTS:
+    void openExternalLink( QUrl );
+
+ private:
+    QString         m_source;
+};
+
+}
+#endif
+
 #endif // TINYWEBBROWSER_H

Modified: marble/trunk/src/lib/geodata/handlers/osm-namefinder/NamedTagHandler.cpp
===================================================================
--- marble/trunk/src/lib/geodata/handlers/osm-namefinder/NamedTagHandler.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/geodata/handlers/osm-namefinder/NamedTagHandler.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -106,7 +106,7 @@
         qDebug() << "added via parent nearestplaces, not implemented";
 
     } else if ( parentItem.first.first.isEmpty() && !parentItem.second ) {
-        // ok, its the parentItem would be searchresults, but we
+        // ok, it is the parentItem would be searchresults, but we
         // have here to work around the GeoParser bug
         GeoDocument * const document = parser.activeDocument();
         Q_ASSERT( document );

Modified: marble/trunk/src/lib/global.h
===================================================================
--- marble/trunk/src/lib/global.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/global.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -133,14 +133,14 @@
 // Version definitions to use with an external application (as digiKam)
 
 // String for about dialog.
-const QString MARBLE_VERSION_STRING = QString::fromLatin1( "0.7" );
+const QString MARBLE_VERSION_STRING = QString::fromLatin1( "0.8SVN" );
 
 // API Version id:
 // form : 0xMMmmpp
 //        MM = major revision.
 //        mm = minor revision.
 //        pp = patch revision.
-#define MARBLE_VERSION 0x000700
+#define MARBLE_VERSION 0x000800
 
 static const char NOT_AVAILABLE[] = QT_TR_NOOP("not available");
 

Modified: marble/trunk/src/lib/runners/LatLonRunner.cpp
===================================================================
--- marble/trunk/src/lib/runners/LatLonRunner.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/runners/LatLonRunner.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -49,15 +49,13 @@
 {
 }
 
-void LatLonRunner::parse(const QString &input)
+void LatLonRunner::run()
 {
-    emit runnerStarted();
-    
     bool successful = false;
-    GeoDataCoordinates coord = GeoDataCoordinates::fromString( input, successful );
+    GeoDataCoordinates coord = GeoDataCoordinates::fromString( m_input, successful );
     
     GeoDataPlacemark *placemark = new GeoDataPlacemark();
-    placemark->setName( input );
+    placemark->setName( m_input );
     qreal lon, lat;
     coord.geoCoordinates( lon, lat );
     placemark->setCoordinate( lon, lat );
@@ -70,7 +68,7 @@
         vector.append( placemark );
     }
     
-    emit runnerFinished( vector );    
+    emit runnerFinished( this, vector );    
 }
 
 }

Modified: marble/trunk/src/lib/runners/LatLonRunner.h
===================================================================
--- marble/trunk/src/lib/runners/LatLonRunner.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/runners/LatLonRunner.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -23,6 +23,8 @@
 
 #include "MarbleAbstractRunner.h"
 
+#include <QtCore/QString>
+
 namespace Marble
 {
 
@@ -33,9 +35,8 @@
     LatLonRunner(QObject *parent = 0);
     ~LatLonRunner();
     GeoDataFeature::GeoDataVisualCategory category() const;
+    void run();
     
-public slots:
-    void parse(const QString &input);
 };
 
 }

Modified: marble/trunk/src/lib/runners/MarbleAbstractRunner.cpp
===================================================================
--- marble/trunk/src/lib/runners/MarbleAbstractRunner.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/runners/MarbleAbstractRunner.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -39,8 +39,9 @@
     return GeoDataFeature::Default;
 }
 
-void MarbleAbstractRunner::parse(const QString& /*input*/)
+void MarbleAbstractRunner::parse(const QString &input)
 {
+    m_input = input;
 }
 
 void MarbleAbstractRunner::run() 

Modified: marble/trunk/src/lib/runners/MarbleAbstractRunner.h
===================================================================
--- marble/trunk/src/lib/runners/MarbleAbstractRunner.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/runners/MarbleAbstractRunner.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -66,7 +66,10 @@
      * @p input the string to be parsed
      */
     virtual void parse(const QString &input);
-    
+
+protected:
+    QString m_input;
+
 signals:
     /**
      * This is emitted to indicate that the runner has started to work.
@@ -75,10 +78,11 @@
     void runnerStarted();
     /**
      * This is emitted to indicate that the runner has finished.
+     * @param the address of the runner itself
      * @param result the result of the parsing.
      * @see parse()
      */
-    void runnerFinished(QVector<GeoDataPlacemark*> result);
+    void runnerFinished(MarbleAbstractRunner* runner, QVector<GeoDataPlacemark*> result);
 };
 
 }

Modified: marble/trunk/src/lib/runners/OnfRunner.cpp
===================================================================
--- marble/trunk/src/lib/runners/OnfRunner.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/runners/OnfRunner.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -65,14 +65,13 @@
     //in order to have a balanced count of active runners. So
     //we emit runnerFinished() to balance the previous failed runnerStarted()
     QVector<GeoDataPlacemark*> empty;
-    emit runnerFinished( empty );
+    emit runnerFinished( this, empty );
     return;
 }
 
-void OnfRunner::parse(const QString &input)
+void OnfRunner::run()
 {
-    emit runnerStarted();
-    if( input.isEmpty() ) {
+    if( m_input.isEmpty() ) {
         fail();
     }
     //no point to keep downloading if we're doing a new one
@@ -88,8 +87,8 @@
         delete m_buffer;
     }
     m_buffer = new QBuffer;
-    qDebug() << "ONF search: GET /namefinder/search.xml?find=" << input;
-    m_http->get( "/namefinder/search.xml?find=" + input, m_buffer );
+    qDebug() << "ONF search: GET /namefinder/search.xml?find=" << m_input;
+    m_http->get( "/namefinder/search.xml?find=" + m_input, m_buffer );
 }
 
 void OnfRunner::slotRequestFinished( int id, bool error )
@@ -123,7 +122,7 @@
     foreach( GeoDataPlacemark* placemark, placemarks ) {
         placemark->setVisualCategory( category() );
     }
-    emit runnerFinished( placemarks );
+    emit runnerFinished( this, placemarks );
     return;
 }
 

Modified: marble/trunk/src/lib/runners/OnfRunner.h
===================================================================
--- marble/trunk/src/lib/runners/OnfRunner.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/lib/runners/OnfRunner.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -24,6 +24,7 @@
 #include "MarbleAbstractRunner.h"
 
 #include <QtCore/QString>
+
 class QHttp;
 class QBuffer;
 
@@ -37,9 +38,9 @@
     OnfRunner(QObject *parent = 0);
     ~OnfRunner();
     GeoDataFeature::GeoDataVisualCategory category() const;
+    void run();
     
 public slots:
-    void parse(const QString &input);
     void slotRequestFinished( int id, bool error );
 private:
     void fail();

Modified: marble/trunk/src/marble.kcfg
===================================================================
--- marble/trunk/src/marble.kcfg	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/marble.kcfg	2009-02-24 20:37:32 UTC (rev 3589)
@@ -104,6 +104,17 @@
    <default code="true">KGlobalSettings::generalFont()</default>
   </entry>
  </group>
+ <group name="Sun" >
+  <entry name="showSun" type="Bool" >
+   <default>false</default>
+  </entry>
+  <entry name="showCitylights" type="Bool" >
+   <default>false</default>
+  </entry>
+  <entry name="centerOnSun" type="Bool" >
+   <default>false</default>
+  </entry>
+ </group>
  <group name="Navigation" >
   <entry key="dragLocation" type="Enum" >
    <label>The behaviour of the planet's axis on mouse dragging.</label>

Modified: marble/trunk/src/marble_part.cpp
===================================================================
--- marble/trunk/src/marble_part.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/marble_part.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -130,7 +130,9 @@
 
 KAboutData *MarblePart::createAboutData()
 {
-  	return new KAboutData( I18N_NOOP( "marble_part" ), 0, ki18n( "A Desktop Globe" ), MARBLE_VERSION_STRING.toLatin1() );
+    return new KAboutData( I18N_NOOP( "marble_part" ), 0,
+                           ki18n( "A Desktop Globe" ),
+                           MARBLE_VERSION_STRING.toLatin1() );
 }
 
 bool MarblePart::openUrl( const KUrl &url )
@@ -365,6 +367,11 @@
     m_showAtmosphereAction->setChecked( MarbleSettings::showAtmosphere() );
     m_lockFloatItemsAct->setChecked(MarbleSettings::lockFloatItemPositions());
     lockFloatItemPosition(MarbleSettings::lockFloatItemPositions());
+    
+    // Sun
+    m_controlView->sunLocator()->setShow( MarbleSettings::showSun() );
+    m_controlView->sunLocator()->setCitylights( MarbleSettings::showCitylights() );
+    m_controlView->sunLocator()->setCentered( MarbleSettings::centerOnSun() );
 
     // Plugins
     QHash<QString, int> pluginEnabled;
@@ -438,6 +445,11 @@
     MarbleSettings::setDistanceUnit( MarbleGlobal::getInstance()->locale()->distanceUnit() );
     MarbleSettings::setAngleUnit( m_controlView->marbleWidget()->defaultAngleUnit() );
 
+    // Sun
+    MarbleSettings::setShowSun( m_controlView->sunLocator()->getShow() );
+    MarbleSettings::setShowCitylights( m_controlView->sunLocator()->getCitylights() );
+    MarbleSettings::setCenterOnSun( m_controlView->sunLocator()->getCentered() );
+
     // Caches
     MarbleSettings::setVolatileTileCacheLimit( m_controlView->marbleWidget()->volatileTileCacheLimit() / 1000 );
     MarbleSettings::setPersistentTileCacheLimit( m_controlView->marbleWidget()->persistentTileCacheLimit() / 1000 );

Modified: marble/trunk/src/plasmoid/worldclock.cpp
===================================================================
--- marble/trunk/src/plasmoid/worldclock.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plasmoid/worldclock.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -73,6 +73,7 @@
 {
     KConfigGroup cg = config();
     m_map = new MarbleMap();
+
     if(cg.readEntry("projection", static_cast<int>(Equirectangular)) == Mercator)
         m_map->setProjection(Mercator);
     else

Modified: marble/trunk/src/plugins/designer/latloneditwidget/LatLonEditPlugin.cpp
===================================================================
--- marble/trunk/src/plugins/designer/latloneditwidget/LatLonEditPlugin.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/designer/latloneditwidget/LatLonEditPlugin.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -38,7 +38,7 @@
 }
 QIcon LatLonEditPlugin::icon() const
 {
-    return QIcon();
+    return QIcon(":/icons/marble.png");
 }
 QString LatLonEditPlugin::domXml() const
 {

Modified: marble/trunk/src/plugins/render/fileview/FileViewFloatItem.cpp
===================================================================
--- marble/trunk/src/plugins/render/fileview/FileViewFloatItem.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/fileview/FileViewFloatItem.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -104,7 +104,11 @@
 QPainterPath FileViewFloatItem::backgroundShape() const
 {
     QPainterPath path;
+#if QT_VERSION >= 0x040400
     path.addRoundedRect( QRectF( 0.0, 0.0, renderedRect().size().width() - 1, renderedRect().size().height() - 1 ), 6, 6 );
+#else
+    path.addRoundRect( QRectF( 0.0, 0.0, renderedRect().size().width() - 1, renderedRect().size().height() - 1 ), 6, 6 );
+#endif
     return path;
 }
 
@@ -218,9 +222,9 @@
     qDebug() << "custom Context menu requested!" << pos;
     QMenu *test = new QMenu( m_fileView );
     test->move( m_itemPosition );
-    connect( test->addAction( "Open new kml file..." ), SIGNAL( triggered() ),
+    connect( test->addAction( tr( "Open new kml file..." ) ), SIGNAL( triggered() ),
              this, SLOT( addFile() ) );
-    connect( test->addAction("close this kml file..." ), SIGNAL( triggered() ),
+    connect( test->addAction( tr( "close this kml file..." ) ), SIGNAL( triggered() ),
              this, SLOT( removeFile() ) );
     m_persIndex = new QPersistentModelIndex( m_fileView->indexAt( pos ) );
     test->exec();

Modified: marble/trunk/src/plugins/render/navigation/NavigationFloatItem.cpp
===================================================================
--- marble/trunk/src/plugins/render/navigation/NavigationFloatItem.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/navigation/NavigationFloatItem.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -13,6 +13,7 @@
 #include <QtCore/QRect>
 #include <QtGui/QPixmap>
 #include <QtGui/QSlider>
+#include <QWidget>
 
 #include "AbstractProjection.h"
 #include "MarbleDirs.h"
@@ -107,7 +108,11 @@
 QPainterPath NavigationFloatItem::backgroundShape() const
 {
     QPainterPath path;
+#if QT_VERSION >= 0x040400
     path.addRoundedRect( QRectF( 0.0, 0.0, renderedRect().size().width() - 1, renderedRect().size().height() - 1 ), 6, 6 );
+#else
+    path.addRoundRect( QRectF( 0.0, 0.0, renderedRect().size().width() - 1, renderedRect().size().height() - 1 ), 6, 6 );
+#endif
     return path;
 }
 
@@ -118,8 +123,13 @@
     Q_UNUSED(layer);
 
     // Paint widget without a background
+#if QT_VERSION >= 0x040400
     m_navigationParent->render( painter, 
           QPoint( padding(), padding() ), QRegion(),QWidget::RenderFlags(QWidget::DrawChildren));
+#else
+    m_navigationParent->render( painter->device(), 
+          QPoint( padding(), padding() ), QRegion(),QWidget::RenderFlag(QWidget::DrawChildren));
+#endif
 
     return true;
 }

Added: marble/trunk/src/plugins/render/panoramio/Panoramio.py
===================================================================
--- marble/trunk/src/plugins/render/panoramio/Panoramio.py	                        (rev 0)
+++ marble/trunk/src/plugins/render/panoramio/Panoramio.py	2009-02-24 20:37:32 UTC (rev 3589)
@@ -0,0 +1,20 @@
+#this is a sample parnomaio query rpely script in python
+
+
+import httplib
+import json
+
+conn = httplib.HTTPConnection("www.panoramio.com",80)
+conn.request("GET","/map/get_panoramas.php?order=popularity&set=public&from=0&to=10&minx=-124.29382324218749&miny=36.089060460282006&maxx=-119.8773193359375&maxy=38.724090458956965")
+
+r1 = conn.getresponse()
+print r1.status
+data1 = r1.read()
+#print data1
+a=json.loads (data1)
+#print a
+#print a
+for keys,x in a.iteritems() :
+	z=x
+	print z , ":::::::::::::keys" , keys,"\n"
+a=json.load(keys)

Modified: marble/trunk/src/plugins/render/panoramio/PanoramioPlugin.cpp
===================================================================
--- marble/trunk/src/plugins/render/panoramio/PanoramioPlugin.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/panoramio/PanoramioPlugin.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -104,10 +104,10 @@
             painter->setPen(Qt::Dense1Pattern);
             painter->setPen(Qt::white);
             painter->drawRect(GeoDataCoordinates(parsedData[x].longitude, parsedData[x].latitude, 0.0, GeoDataCoordinates::Degree),/*parsedData[x].height , parsedData[x].width*/50, 50);
-//             qDebug() <<"Shanky: Coordinates are lon-lat: " << parsedData[x].longitude << parsedData[x].latitude;
+             qDebug() <<"Shanky: Coordinates are lon-lat: " << parsedData[x].longitude << parsedData[x].latitude;
         }
     }
-    qDebug() << "deltas" << west - deltaWest << east - deltaEast << south - deltaSouth << north - deltaNorth;
+    //qDebug() << "deltas" << west - deltaWest << east - deltaEast << south - deltaSouth << north - deltaNorth;
 
     deltaWest = west;
     deltaEast = east ;
@@ -124,11 +124,12 @@
     for (int x = 0; x < numberOfImagesToShow; ++x) {
         temp = panoramioJsonParser.parseObjectOnPosition(QString::fromUtf8(m_storagePolicy->data(id)), x);
         parsedData.append(temp);
+//	qDebug()<<temp.photo_file_url;
         if (!m_storagePolicy->fileExists(temp.photo_title)) {
             m_downloadManager->addJob(QUrl(temp.photo_file_url), temp.photo_title, QString::number(x));
-            qDebug() << "skipping " << temp.photo_title;
+           qDebug() << "adding " << temp.photo_title;
         }
-        qDebug() << ":::::::shanky1" << temp.photo_file_url;
+       // qDebug() << ":::::::shanky1" << temp.photo_file_url;
     }
 
 //         HttpJob *job = new HttpJob ( sourceUrl, destFileName, id );
@@ -140,7 +141,7 @@
 
     //     temp.loadFromData ( m_storagePolicy->data ( id ) );
     tempImage.load(MarbleDirs::localPath() + "/cache/" + relativeUrlString);
-    imagesWeHave.append(tempImage.scaled(QSize(50, 50),  Qt::IgnoreAspectRatio , Qt::SmoothTransformation));
+    imagesWeHave.append(tempImage.scaled(QSize(50, 50),  Qt::IgnoreAspectRatio , Qt::FastTransformation));
     qDebug() << "::::::::::::::shanky2" << id << "=" << tempImage.isNull() << MarbleDirs::localPath() + "/cache/" + relativeUrlString ;
     flag = 1;
 }
@@ -155,7 +156,7 @@
                                    + "&maxx=" + QString::number(north * RADIANSTODEGREES)
                                    + "&maxy=" + QString::number(south * RADIANSTODEGREES) + "&size=medium"), "panoramio" + QString::number(east), "panoramio" + QString::number(east));
     connect(m_downloadManager, SIGNAL(downloadComplete(QString, QString)), this, SLOT(slotJsonDownloadComplete(QString , QString)));
-    qDebug() << "::::::::::::::shanky0";
+//    qDebug() << "::::::::::::::shanky0";
 //         job = new HttpJob ( QUrl ( "http://www.panoramio.com/map/get_panoramas.php?from=";
 //                                    + QString::number ( rangeFrom )
 //                                    + "&to=" + QString::number ( rangeTo )

Modified: marble/trunk/src/plugins/render/panoramio/jsonparser.cpp
===================================================================
--- marble/trunk/src/plugins/render/panoramio/jsonparser.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/panoramio/jsonparser.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -9,6 +9,7 @@
 
 jsonParser::jsonParser()
 {
+   myEngine.setProcessEventsInterval(10);//this lets the gui remain responsive
 }
 
 jsonParser::~jsonParser()
@@ -19,10 +20,17 @@
 {
     QString temp = "var myJSONObject =" + content;
     myEngine.evaluate(temp);
+    myEngine.evaluate(QString("function count(){ return myJSONObject.count };"));
+    myEngine.evaluate(QString("function height(x){return myJSONObject.photos[x].height};"));
+    myEngine.evaluate(QString("function latitude(x){return myJSONObject.photos[x].latitude};"));
+    myEngine.evaluate(QString("function longitude (x){return myJSONObject.photos[x].longitude};"));
+   myEngine.evaluate(QString("function owner_id(x){return myJSONObject.photos[x].owner_id};"));
+   myEngine.evaluate(QString("function photo_file_url(x){return myJSONObject.photos[x].photo_file_url};"));
 
-    dataStorage.count = myEngine.evaluate("return myJSONObject.count;").toInteger();
+	
+     dataStorage.count = myEngine.evaluate("count();").toInteger();
 
-    dataStorage.height = myEngine.evaluate(QString("return myJSONObject.photos[")
+/*    dataStorage.height = myEngine.evaluate(QString("return myJSONObject.photos[")
                                            + QString::number(requiredObjectPosition)
                                            + QString("].height;")) .toInteger();
     dataStorage.latitude = myEngine.evaluate(QString("return myJSONObject.photos[")
@@ -59,13 +67,18 @@
                                            + QString::number(requiredObjectPosition)
                                            + QString("].width;")).toInteger();
 
-
+*/
+	myEngine.evaluate(QString("var x="+QString::number(requiredObjectPosition)));
+	dataStorage.longitude=myEngine.evaluate(QString("longitude(x)")).toNumber();
+	dataStorage.latitude=myEngine.evaluate(QString("latitude(x)")).toNumber();
+	dataStorage.photo_file_url=myEngine.evaluate(QString("photo_file_url(x)")).toString();
+//qDebug()<<":::::::"<<myEngine.evaluate("longitude(x)").toNumber();
     return dataStorage;
 }
 
 QList <panoramioDataStructure> jsonParser::parseAllObjects(const QString &content , int numberOfObjects)
 {
-    QString temp = "var myJSONObject = " + content;
+    /*QString temp = "var myJSONObject = " + content;
     int iterator = 0;//the count starts fom one
 
     myEngine.evaluate(temp);
@@ -111,6 +124,6 @@
         parsedJsonOutput.insert(iterator , dataStorage);
         ++iterator;
     }
-
+*/
     return parsedJsonOutput;
 }

Modified: marble/trunk/src/plugins/render/panoramio/jsonparser.h
===================================================================
--- marble/trunk/src/plugins/render/panoramio/jsonparser.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/panoramio/jsonparser.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -33,8 +33,8 @@
     QString photo_title; // Title of each photograph
     QString photo_url; // Url of each photograph
     QString photo_file_url;
-    qreal longitude;
-    qreal latitude;
+    int longitude;
+    int latitude;
     int width;
     int height;
     QString upload_date;
@@ -43,9 +43,8 @@
     QString owner_url; // Url of the User Uplaoded
 };
 
-class jsonParser : public QObject
+class jsonParser 
 {
-    Q_OBJECT
 public:
     jsonParser();
 

Modified: marble/trunk/src/plugins/render/twitter/jsonparser.cpp
===================================================================
--- marble/trunk/src/plugins/render/twitter/jsonparser.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/twitter/jsonparser.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -9,6 +9,7 @@
 
 jsonParser::jsonParser()
 {
+  myEngine.setProcessEventsInterval(10);//this lets the gui remain responsive
 }
 
 jsonParser::~jsonParser()
@@ -18,7 +19,7 @@
 twitterDataStructure jsonParser::parseObjectOnPosition(const QString &content , int requiredObjectPosition)
 {
 
-    QString temp = "var myJSONObject =" + content;
+ /*   QString temp = "var myJSONObject =" + content;
     myEngine.evaluate(temp);
 
     dataStorage.user = myEngine.evaluate(QString("return myJSONObject.photos[")
@@ -31,7 +32,7 @@
                                          + QString::number(requiredObjectPosition)
                                          + QString("].text;")).toString();
 
-
+*/
     return dataStorage;
 }
 
@@ -39,38 +40,53 @@
 {
     QString temp = "var myJSONObject =  { \"twitter\":" + content + "}";
     int iterator = 0;//the count starts fom one
+//qDebug()<<"::::::::::::::::::::::::"<<temp;
+if (temp != "Twitter is down for database maintenance. It will return in about 30 minutes")
+{
+	myEngine.evaluate(QString("function userName(k){return myJSONObject.twitter[k].user.name};"));
+	myEngine.evaluate(QString("function userLocation(k){return myJSONObject.twitter[k].user.location};"));
+	myEngine.evaluate(QString("function userText(k){return myJSONObject.twitter[k].text};"));
 
     myEngine.evaluate(temp);
     while ((iterator) < numberOfObjects) {
-        dataStorage.user = myEngine.evaluate(QString("return myJSONObject.twitter[")
-                                             + QString::number(iterator)
-                                             + QString("].user.name;")).toString();
-        dataStorage.location = myEngine.evaluate(QString("return myJSONObject.twitter[")
-                               + QString::number(iterator)
-                               + QString("].user.location;")).toString();
-        dataStorage.text = myEngine.evaluate(QString("return myJSONObject.twitter[")
-                                             + QString::number(iterator)
-                                             + QString("].text;")).toString();
-        parsedJsonOutput.insert(iterator , dataStorage);
+	myEngine.evaluate(QString("var a ="+QString::number(iterator) )).toString();
+        dataStorage.user=myEngine.evaluate(QString("userName(a)")).toString();
+ 	dataStorage.location=myEngine.evaluate(QString("userLocation(a)")).toString();
+ 	dataStorage.text=myEngine.evaluate(QString("userText(a)")).toString();
+        
+	parsedJsonOutput.insert(iterator , dataStorage);
 
-        /*qDebug() << "in json parser" << myEngine.evaluate(QString("return myJSONObject.twitter[" + QString::number(iterator) + "].user.location")).toString() << dataStorage.location;*/
         ++iterator;
     }
+//qDebug()<<"::::::::::::::::::::::"<<dataStorage.user;
 
-    return parsedJsonOutput;
+//qDebug()<<":::::::::::::::::parsed Output"<<parsedJsonOutput[0].location;
 }
+else 
+{
+//twitter is down :(
+dataStorage.user="@Twitter Plugin";
+dataStorage.location="Equator";
+dataStorage.text="Twitter is down , Please try in 30 minutes " ;
+parsedJsonOutput<<dataStorage;
 
+}
+   return parsedJsonOutput;
+}
+
 googleMapDataStructure jsonParser::geoCodingAPIparseObject(QString content)
 {
-//     qDebug() << "in geoCodingAPIparseObject";
+     qDebug() << "in geoCodingAPIparseObject";
     QString temp = "var myJSONObject = " + content;
 
     googleMapDataStructure returnStructure;
+	myEngine.evaluate("function lat(){return myJSONObject.Placemark[0].Point.coordinates[0]}");
+	myEngine.evaluate("function lon(){return myJSONObject.Placemark[0].Point.coordinates[1]}");
+    myEngine.evaluate(temp);
 
-    myEngine.evaluate(temp);
-    returnStructure.lat = myEngine.evaluate("return myJSONObject.Placemark[0].Point.coordinates[0]").toNumber();
-    returnStructure.lon = myEngine.evaluate("return myJSONObject.Placemark[0].Point.coordinates[1]").toNumber();
-//     qDebug() << "twitter lan lon text=" << returnStructure.lat << returnStructure.lon;
+    returnStructure.lon = myEngine.evaluate("lon()").toNumber();
+ returnStructure.lat = myEngine.evaluate("lat()").toNumber();
+     qDebug() << "twitter lan lon text=" << returnStructure.lat << returnStructure.lon;
     return returnStructure;
 }
 

Modified: marble/trunk/src/plugins/render/twitter/jsonparser.h
===================================================================
--- marble/trunk/src/plugins/render/twitter/jsonparser.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/twitter/jsonparser.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -39,15 +39,15 @@
     qreal lon;
 };
 
-class jsonParser : public QObject
+class jsonParser 
 {
-    Q_OBJECT
+    
 public:
     jsonParser();
 
     ~jsonParser();
 
-    twitterDataStructure parseObjectOnPosition(const QString &content, int requiredObjectPosition);   //for parsing single object
+   twitterDataStructure parseObjectOnPosition(const QString &content, int requiredObjectPosition);   //for parsing single object
 
     QList<twitterDataStructure> parseAllObjects(const QString &content, int numberOfObjects);   //for parsing a list objects
 
@@ -59,6 +59,7 @@
     twitterDataStructure dataStorage;
 
     QScriptEngine myEngine;
+
 };
 
 

Modified: marble/trunk/src/plugins/render/twitter/twitterPlugin.cpp
===================================================================
--- marble/trunk/src/plugins/render/twitter/twitterPlugin.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/twitter/twitterPlugin.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -16,15 +16,15 @@
 #include <QSize>
 #include <QRegExp>
 
-namespace Marble
-{
+using namespace Marble;
+
 /**
 Right now this plugin displays public twit from Twitter , and gecocodes [i.e getting lat lon from a given street address] using Google Map API , i plan to extend it to use OSM GeoCoding in net few days :) [The API key has been taken for  my personal website , please don't misuse it :) ]
 */
 
 twitterPlugin::~twitterPlugin()
 {
-    delete m_storagePolicy;
+//    delete m_storagePolicy;
 }
 
 QStringList twitterPlugin::backendTypes() const
@@ -74,7 +74,7 @@
     m_storagePolicy = new CacheStoragePolicy(MarbleDirs::localPath() + "/cache/");
     m_downloadManager = new HttpDownloadManager(QUrl("http://twiter.com";), m_storagePolicy);
     downloadtwitter(0, 0, 0.0, 0.0, 0.0, 0.0);
-//     qDebug() << "twitter plugin was started";
+     qDebug() << "twitter plugin was started";
 }
 
 bool twitterPlugin::isInitialized() const
@@ -93,38 +93,46 @@
 
     if (privateFlagForRenderingTwitts >= 1) {
         for (int counter = 0;counter < 4;counter++)
-            painter->drawAnnotation(twitsWithLocation[counter].location,
+//painter->drawAnnotation(GeoDataCoordinates(0.0,0.0),"hiiiiiiiiii");            
+
+painter->drawAnnotation(twitsWithLocation[counter].location,
 				    parsedData[counter].user + " said \n"
 				    + parsedData[counter].text,
-				    QSize(140, 140));
+				    QSize(140, 140)) ;
     } else {
         painter->drawAnnotation(GeoDataCoordinates(0.0, 0.0, 0.0,
 						   GeoDataCoordinates::Degree),
-				"Twitts are being Downlaoded @Twitter Plugin");
+				"Twitts are being Downlaoded @Twitter/Identi.CA Plugin");
     }
     return true;
 }
 
 void twitterPlugin::slotJsonDownloadComplete(QString relativeUrlString, QString id)
 {
-// temp.twitter = parsedData[counter].text ;
-    parsedData = twitterJsonParser.parseAllObjects(QString::fromUtf8(m_storagePolicy->data(id)), 20);
-
+static int counter=0;
+twitterStructure temp;
+//qDebug()<<"::::"<<temp.;
+//temp.twit = parsedData[counter].text ;
+ parsedData = twitterJsonParser.parseAllObjects(QString::fromUtf8(m_storagePolicy->data(id)), 20);
+qDebug()<<"::::::::::::::::slot"<<parsedData[0].text;
     disconnect(m_downloadManager, SIGNAL(downloadComplete(QString, QString)), this, SLOT(slotJsonDownloadComplete(QString , QString)));
 
     connect(m_downloadManager, SIGNAL(downloadComplete(QString, QString)), this, SLOT(slotGeoCodingReplyRecieved(QString , QString)));
     for (int counter = 0;counter < 10;counter++) {
-        if (parsedData[counter].location != "null") {
-            parsedData[counter].location.replace(QRegExp("[?,:!/\\s]+"), "+");//remove whitespace and replace it with + for query api
+       if (parsedData[counter].location != "null") {
+           parsedData[counter].location.replace(QRegExp("[?,:!/\\s]+"), "+");//remove whitespace and replace it with + for query api
             findLatLonOfStreetAddress(parsedData [ counter ].location) ;   //this will set temp
-        }
+       }
     }
 }
 
 
 void twitterPlugin::downloadtwitter(int rangeFrom , int rangeTo , qreal east , qreal west , qreal north , qreal south)
 {
+qDebug()<<"::::::downloading"<<rangeFrom ;
+/** to use identi.ca line also */
     m_downloadManager->addJob(QUrl("http://twitter.com/statuses/public_timeline.json";), "twitter", "twitter");
+//    m_downloadManager->addJob(QUrl("http://identi.ca/api/statuses/public_timeline.json";), "identica", "identica");
 
     connect(m_downloadManager, SIGNAL(downloadComplete(QString, QString)), this, SLOT(slotJsonDownloadComplete(QString , QString)));
 
@@ -143,18 +151,18 @@
     twitterStructure twitterData;
     googleMapDataStructure geoCodedData;
 
-    geoCodedData = twitterJsonParser.geoCodingAPIparseObject(QString::fromUtf8(m_storagePolicy->data(id))) ;
-//     twitterData.twit = "hi" ;
+   geoCodedData = twitterJsonParser.geoCodingAPIparseObject(QString::fromUtf8(m_storagePolicy->data(id))) ;
+     twitterData.twit = "hi" ;
     twitterData.location = GeoDataCoordinates(geoCodedData.lat, geoCodedData.lon, 1.0, GeoDataCoordinates::Degree);
-    twitsWithLocation.append(twitterData);
-    localCountOfTwitts ++;
-// qDebug()<<"twitter count has value == " << count ;
-    if (localCountOfTwitts >= 5)
+   twitsWithLocation.append(twitterData);
+  localCountOfTwitts ++;
+qDebug()<<"::::::::::::::::::::twitter count has value == " << localCountOfTwitts;
+    if (localCountOfTwitts >= 1)
         privateFlagForRenderingTwitts = 1;//1 means unblock
 }
 
-}
 
+
 Q_EXPORT_PLUGIN2(twitterPlugin, Marble::twitterPlugin)
 
-// #include "twitterPlugin.moc"
+ #include "twitterPlugin.moc"

Modified: marble/trunk/src/plugins/render/twitter/twitterPlugin.h
===================================================================
--- marble/trunk/src/plugins/render/twitter/twitterPlugin.h	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/plugins/render/twitter/twitterPlugin.h	2009-02-24 20:37:32 UTC (rev 3589)
@@ -35,7 +35,7 @@
  *
  */
 struct twitterStructure {
-    QString twitter ;
+    QString twit ;
     GeoDataCoordinates location;
 };
 
@@ -70,6 +70,7 @@
     bool render(GeoPainter *painter, ViewportParams *viewport, const QString& renderPos, GeoSceneLayer * layer = 0);
 
     ~twitterPlugin();
+
 public slots:
     void slotJsonDownloadComplete(QString , QString);   //completed download of json reply fom panoramio
     void slotGeoCodingReplyRecieved(QString , QString);   //completed download of image
@@ -83,7 +84,7 @@
     void downloadtwitter(int, int, qreal, qreal, qreal, qreal);
     QList <twitterStructure > twitsWithLocation;//this list will hold pointers to TWITT we have downloaded successfully figured out :)
     QList <twitterDataStructure> parsedData;
-    void findLatLonOfStreetAddress(QString streetAddress);
+   void findLatLonOfStreetAddress(QString streetAddress);
     int privateFlagForRenderingTwitts;//this flag is one when globe has an Image  (downloaded or already there in cache)
 
 };

Modified: marble/trunk/src/qtmain.cpp
===================================================================
--- marble/trunk/src/qtmain.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/src/qtmain.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -90,7 +90,7 @@
 
 
 //    window->marbleWidget()->rotateTo( 0, 0, -90 );
-    window->show();
+//    window->show();
 
     for ( int i = 1; i < argc; ++i ) {
         if ( strcmp( argv[ i ], "--timedemo" ) == 0 )

Modified: marble/trunk/tools/iau2kml/iau2kml.cpp
===================================================================
--- marble/trunk/tools/iau2kml/iau2kml.cpp	2009-02-24 20:21:40 UTC (rev 3588)
+++ marble/trunk/tools/iau2kml/iau2kml.cpp	2009-02-24 20:37:32 UTC (rev 3589)
@@ -91,7 +91,7 @@
 
             rawline = sourcestream.readLine();
 //            if ( !rawline.startsWith("\"E\"|\"m\"|\"" ) ) {
-            if ( !rawline.startsWith("\"M\"|\"M\"|\"" ) ) {
+            if ( !rawline.startsWith("\"V\"|\"V\"|\"" ) ) {
                 continue;
             }
             rawline = rawline.replace( "\"|", "|" );
@@ -124,8 +124,9 @@
 
             lon = lonString.toFloat();
 
-            if ( !rawline.startsWith("\"M\"|\"M\"|\"" ) ) {
-                if ( lon > 180.0 ) lon = lon - 360.0;
+            if ( lon > 180.0 ) lon = lon - 360.0;
+
+            if ( rawline.startsWith("\"M\"|\"M\"|\"" ) || rawline.startsWith("\"V\"|\"V\"|\"" ) ) {
                 lon = -lon;
             }