Index: Qt/Core/pqSettings.cxx
===================================================================
RCS file: /cvsroot/ParaView3/ParaView3/Qt/Core/pqSettings.cxx,v
retrieving revision 1.8
diff -u -r1.8 pqSettings.cxx
--- Qt/Core/pqSettings.cxx	7 Nov 2008 17:32:14 -0000	1.8
+++ Qt/Core/pqSettings.cxx	4 Mar 2009 15:31:34 -0000
@@ -7,7 +7,7 @@
    All rights reserved.
 
    ParaView is a free software; you can redistribute it and/or modify it
-   under the terms of the ParaView license version 1.2. 
+   under the terms of the ParaView license version 1.2.
 
    See License_v1.2.txt for the full ParaView license.
    A copy of this license can be obtained by contacting
@@ -34,13 +34,14 @@
 #include <QDialog>
 #include <QMainWindow>
 #include <QDesktopWidget>
+#include <QDockWidget>
 
 //-----------------------------------------------------------------------------
 pqSettings::pqSettings(
-    const QString& organization, 
+    const QString& organization,
     const QString& application,
     QObject* p) :
-  QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application, p)
+QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application, p)
 {
 }
 
@@ -69,17 +70,17 @@
 void pqSettings::restoreState(const QString& key, QMainWindow& window)
 {
   this->beginGroup(key);
-  
+
   if(this->contains("Size"))
     {
     window.resize(this->value("Size").toSize());
     }
-    
+
   if(this->contains("Position"))
     {
     QPoint windowTopLeft = this->value("Position").toPoint();
     QRect mwRect(windowTopLeft, window.size());
-    
+
     QDesktopWidget desktop;
     QRect desktopRect = desktop.availableGeometry( desktop.primaryScreen() );
     // try moving it to keep size
@@ -99,20 +100,29 @@
   if(this->contains("Layout"))
     {
     window.restoreState(this->value("Layout").toByteArray());
-    }
-  
+
+    QList<QDockWidget*> dockWidgets = window.findChildren<QDockWidget*>();
+    foreach(QDockWidget* dock_widget, dockWidgets)
+      {
+      if (dock_widget->isFloating() == true )
+        {
+        sanityCheckDock(dock_widget);
+        }
+      }
+   }
+
   this->endGroup();
 }
 
 void pqSettings::restoreState(const QString& key, QDialog& dialog)
 {
   this->beginGroup(key);
-  
+
   if(this->contains("Size"))
     {
     dialog.resize(this->value("Size").toSize());
     }
-    
+
   if(this->contains("Position"))
     {
     dialog.move(this->value("Position").toPoint());
@@ -120,3 +130,111 @@
 
   this->endGroup();
 }
+
+void pqSettings::sanityCheckDock(QDockWidget* dock_widget)
+{
+  QDesktopWidget desktop;
+  int screen = -1;
+  if (NULL == dock_widget)
+  {
+    return;
+  }
+
+  QPoint dockTopLeft = dock_widget->pos();
+  QRect dockRect(dockTopLeft, dock_widget->size());
+
+  QRect geometry = QRect(dockTopLeft, dock_widget->frameSize());
+  int titleBarHeight = geometry.height() - dockRect.height();
+
+  screen = desktop.screenNumber(dock_widget);
+  if (screen == -1) // Dock is at least partially on a screen
+  {
+    screen = desktop.screenNumber(dockTopLeft);
+  }
+
+  QRect screenRect = desktop.availableGeometry(screen);
+  QRect desktopRect = desktop.availableGeometry(); // SHould give us the entire Desktop geometry
+  // Ensure the top left corner of the window is on the screen
+  if (!screenRect.contains(dockTopLeft))
+  {
+    // Are we High?
+    if (dockTopLeft.y() < screenRect.y()) {
+      dock_widget->move(dockRect.x(), screenRect.y());
+      dockTopLeft = dock_widget->pos();
+      dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+   }
+    // Are we low
+    if (dockTopLeft.y() > screenRect.y() + screenRect.height()) {
+      dock_widget->move(dockRect.x(), screenRect.y() + screenRect.height() - 20);
+      dockTopLeft = dock_widget->pos();
+      dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+      }
+    // Are we left
+    if (dockTopLeft.x() < screenRect.x()) {
+      dock_widget->move(screenRect.x(), dockRect.y());
+      dockTopLeft = dock_widget->pos();
+      dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+      }
+    // Are we right
+    if (dockTopLeft.x() > screenRect.x() + screenRect.width()) {
+        dock_widget->move(screenRect.x() + screenRect.width() - dockRect.width(), dockRect.y());
+        dockTopLeft = dock_widget->pos();
+        dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+     }
+
+    dockTopLeft = dock_widget->pos();
+    dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+    }
+
+  if ( !desktopRect.contains(dockRect))
+  {
+    //Are we too wide
+    if (dockRect.x() + dockRect.width() > screenRect.x() + screenRect.width())
+    {
+      if (screenRect.x() + screenRect.width() - dockRect.width() > screenRect.x() )
+      {
+        // Move dock side to side
+        dockRect.setX(screenRect.x() + screenRect.width() - dockRect.width() );
+        dock_widget->move(dockRect.x(), dockRect.y());
+        dockTopLeft = dock_widget->pos();
+        dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+     }
+      else
+      {
+        // Move dock side to side + resize to fit
+        dockRect.setX(screenRect.x() + screenRect.width() - dockRect.width() );
+        dockRect.setWidth(screenRect.width());
+        dock_widget->resize(dockRect.width(), dockRect.height());
+        dock_widget->move(dockRect.x(), dockRect.y());
+        dockTopLeft = dock_widget->pos();
+        dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+         }
+    }
+
+    dockTopLeft = dock_widget->pos();
+    dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+    // Are we too Tall
+    if (dockRect.y() + dockRect.height() > screenRect.y() + screenRect.height())
+    {
+      // See if we can move it more on screen so that the entire dock is on screen
+      if (screenRect.y() + screenRect.height() - dockRect.height() > screenRect.y() )
+      {
+        // Move dock up
+        dockRect.setY(screenRect.y() + screenRect.height() - dockRect.height() );
+        dock_widget->move(dockRect.x(), dockRect.y());
+        dockTopLeft = dock_widget->pos();
+        dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+      }
+      else
+      {
+        // Move dock up + resize to fit
+        dock_widget->resize(dockRect.width(), screenRect.height() - titleBarHeight);
+        dock_widget->move(dockRect.x(), screenRect.y());
+        dockTopLeft = dock_widget->pos();
+        dockRect = QRect(dockTopLeft, dock_widget->frameSize());
+       }
+    }
+  }
+
+}
+
