From c39eda949db88e0ac068e19f1898ad45b8c25ed0 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Mon, 26 Jul 1999 09:46:53 +0000
Subject: [PATCH] Centre() supports wxCENTER_FRAME flag now

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3138 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/window.tex |  4 +++-
 include/wx/window.h      |  8 ++++----
 src/common/wincmn.cpp    | 43 ++++++++++++----------------------------
 3 files changed, 20 insertions(+), 35 deletions(-)

diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex
index fa0c7ec57a..8cb18c8594 100644
--- a/docs/latex/wx/window.tex
+++ b/docs/latex/wx/window.tex
@@ -137,7 +137,9 @@ Centres the window.
 \wxheading{Parameters}
 
 \docparam{direction}{Specifies the direction for the centering. May be {\tt wxHORIZONTAL}, {\tt wxVERTICAL}\rtfsp
-or {\tt wxBOTH}.}
+or {\tt wxBOTH}. It may also include {\tt wxCENTER\_FRAME} flag if you want to center the window
+on its parent and not on the screen (actually, this flag is added automatically for all controls
+because it makes no sense to center them on the screen)}
 
 \wxheading{Remarks}
 
diff --git a/include/wx/window.h b/include/wx/window.h
index 34049b6af0..7be5f5413b 100644
--- a/include/wx/window.h
+++ b/include/wx/window.h
@@ -257,10 +257,10 @@ public:
     }
 
         // centre with respect to the the parent window
-    void Centre( int direction = wxHORIZONTAL );
-    void Center( int direction = wxHORIZONTAL ) { Centre(direction); }
-    void CentreOnParent(int direction = wxHORIZONTAL );
-    void CenterOnParent(int direction = wxHORIZONTAL ) { CentreOnParent(direction); }
+    void Centre( int direction = wxBOTH );
+    void Center( int direction = wxBOTH ) { Centre(direction); }
+    void CentreOnParent( int dir = wxBOTH ) { Centre(dir | wxCENTER_FRAME); }
+    void CenterOnParent( int dir = wxBOTH ) { Centre(dir | wxCENTER_FRAME); }
 
         // set window size to wrap around its children
     virtual void Fit();
diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp
index 71028dc3ac..bf4921ff5a 100644
--- a/src/common/wincmn.cpp
+++ b/src/common/wincmn.cpp
@@ -314,44 +314,27 @@ void wxWindowBase::Centre(int direction)
     int width, height;
     GetSize(&width, &height);
 
-    int new_x = -1,
-        new_y = -1;
+    int xNew = -1,
+        yNew = -1;
 
     if ( direction & wxHORIZONTAL )
-        new_x = (widthParent - width)/2;
+        xNew = (widthParent - width)/2;
 
     if ( direction & wxVERTICAL )
-        new_y = (heightParent - height)/2;
+        yNew = (heightParent - height)/2;
 
-    Move(new_x, new_y);
-}
+    // controls are always centered on their parent because it doesn't make
+    // sense to centre them on the screen
+    if ( (direction & wxCENTER_FRAME) || wxDynamicCast(this, wxControl) )
+    {
+        // adjust to the parents client area origin
+        wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0));
 
-// Center TopLevel windows over thier parent instead of the whole screen
-void wxWindowBase::CentreOnParent(int direction)
-{
-    wxPoint     ppos;
-    wxSize      psze;
-    wxSize      wsze;
-    wxWindow*   parent = GetParent();
-    int         x, y;
-
-    if (!parent || !IsTopLevel()) {
-        Centre(direction);
-        return;
+        xNew += posParent.x;
+        yNew += posParent.y;
     }
 
-    psze = parent->GetSize();
-    ppos = parent->ClientToScreen(wxPoint(0,0));
-    wsze = GetSize();
-
-    x = y = -1;
-
-    if (direction == wxBOTH || direction == wxHORIZONTAL)
-        x = ppos.x + (psze.x  - wsze.x)/2;
-    if (direction == wxBOTH || direction == wxVERTICAL)
-        y = ppos.y + (psze.y - wsze.y)/2;
-
-    Move(x, y);
+    Move(xNew, yNew);
 }
 
 // fits the window around the children
-- 
2.50.0

