From 2c175f57ae45b6eae3fc0eebafa45e5182a05adf Mon Sep 17 00:00:00 2001
From: James Turner <zakalawe@mac.com>
Date: Tue, 7 Dec 2010 10:33:14 +0000
Subject: [PATCH] Override puaComboBox recalc_bbox, ignore the popup-menu

---
 src/GUI/WaypointList.cxx |  1 +
 src/GUI/dialog.cxx       | 32 ++++++++++++++++++++++++++++++++
 src/GUI/dialog.hxx       |  5 ++++-
 src/GUI/layout.cxx       |  2 +-
 4 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/src/GUI/WaypointList.cxx b/src/GUI/WaypointList.cxx
index 1c1014e03..31c5e480c 100644
--- a/src/GUI/WaypointList.cxx
+++ b/src/GUI/WaypointList.cxx
@@ -818,6 +818,7 @@ void ScrolledWaypointList::setScrollPercent(float v)
 void ScrolledWaypointList::setSize(int w, int h)
 {
   updateWantsScroll(w, h);
+  puGroup::setSize(w, h);
 }
 
 void ScrolledWaypointList::updateWantsScroll(int w, int h)
diff --git a/src/GUI/dialog.cxx b/src/GUI/dialog.cxx
index 71852fbc7..8a4160499 100644
--- a/src/GUI/dialog.cxx
+++ b/src/GUI/dialog.cxx
@@ -1376,4 +1376,36 @@ int fgComboBox::checkHit(int b, int up, int x, int y)
   return r;
 }
 
+void fgComboBox::setSize(int w, int h)
+{
+  puaComboBox::setSize(w, h);
+  recalc_bbox();
+}
+
+void fgComboBox::recalc_bbox()
+{
+// bug-fix for issue #192
+// http://code.google.com/p/flightgear-bugs/issues/detail?id=192
+// puaComboBox is including the height of its popupMenu in the height
+// computation, which breaks layout computations.
+// this implementation skips popup-menus
+  
+  puBox contents;
+  contents.empty();
+  
+  for (puObject *bo = dlist; bo != NULL; bo = bo -> getNextObject()) {
+    if (bo->getType() & PUCLASS_POPUPMENU) {
+      continue;
+    }
+    
+    contents.extend (bo -> getBBox()) ;
+  }
+  
+  abox.max[0] = abox.min[0] + contents.max[0] ;
+  abox.max[1] = abox.min[1] + contents.max[1] ;
+
+  puObject::recalc_bbox () ;
+
+}
+
 // end of dialog.cxx
diff --git a/src/GUI/dialog.hxx b/src/GUI/dialog.hxx
index 10739280d..497e07104 100644
--- a/src/GUI/dialog.hxx
+++ b/src/GUI/dialog.hxx
@@ -266,8 +266,11 @@ public:
         
     void update();
     
+    virtual void setSize(int w, int h);
+    
     virtual int checkHit(int b, int up, int x, int y);
-
+    
+    virtual void recalc_bbox();
 private:
     bool _inHit;
 };
diff --git a/src/GUI/layout.cxx b/src/GUI/layout.cxx
index f9581b3d5..b6fa5ab8f 100644
--- a/src/GUI/layout.cxx
+++ b/src/GUI/layout.cxx
@@ -80,7 +80,7 @@ void LayoutWidget::calcPrefSize(int* w, int* h)
         if(getBool("vertical")) *w = 4*UNIT;
         else                    *h = 4*UNIT;
     } else if (isType("list") || isType("airport-list")
-            || isType("property-list") || isType("dial")) {
+            || isType("property-list") || isType("dial") || isType("waypointlist")) {
         *w = *h = 12*UNIT;
     } else if (isType("hrule")) {
         *h = 1;