]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/stattext.cpp
1. DoSetSize() simplified, DoGetBestSize() introduced
[wxWidgets.git] / src / msw / stattext.cpp
index 2d5600229626702ecfd4ac89c7799bd97c8235c3..31c7c0141b653a463ab145b0437edecc8effc42c 100644 (file)
@@ -94,75 +94,45 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
   return TRUE;
 }
 
-void wxStaticText::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+wxSize wxStaticText::DoGetBestSize()
 {
-  int currentX, currentY;
-  GetPosition(&currentX, &currentY);
-  int x1 = x;
-  int y1 = y;
-
-  if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
-    x1 = currentX;
-  if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
-    y1 = currentY;
-
-  AdjustForParentClientOrigin(x1, y1, sizeFlags);
-
-  int actualWidth = width;
-  int actualHeight = height;
-
-  int current_width;
-  int cyf;
-
-  wxString text(wxGetWindowText(GetHWND()));
-  GetTextExtent(text, &current_width, &cyf, NULL, NULL, & GetFont());
-
-  int ww, hh;
-  GetSize(&ww, &hh);
-
-  // If we're prepared to use the existing width, then...
-  if (width == -1 && ((sizeFlags & wxSIZE_AUTO_WIDTH) != wxSIZE_AUTO_WIDTH))
-    actualWidth = ww;
-  else if (width == -1)
-  {
-    int cx;
-    int cy;
-    wxGetCharSize(GetHWND(), &cx, &cy, & GetFont());
-    actualWidth = (int)(current_width + cx) ;
-  }
-
-  // If we're prepared to use the existing height, then...
-  if (height == -1 && ((sizeFlags & wxSIZE_AUTO_HEIGHT) != wxSIZE_AUTO_HEIGHT))
-    actualHeight = hh;
-  else if (height == -1)
-  {
-    actualHeight = (int)(cyf) ;
-  }
-
-  MoveWindow((HWND) GetHWND(), x1, y1, actualWidth, actualHeight, TRUE);
+    wxString text(wxGetWindowText(GetHWND()));
+
+    int widthTextMax = 0, widthLine,
+        heightTextTotal = 0, heightLine;
+
+    wxString curLine;
+    for ( const char *pc = text; ; pc++ ) {
+        if ( *pc == '\n' || *pc == '\0' ) {
+            GetTextExtent(curLine, &widthLine, &heightLine);
+            if ( widthLine > widthTextMax )
+                widthTextMax = widthLine;
+            heightTextTotal += heightLine;
+
+            if ( *pc == '\n' ) {
+               curLine.Empty();
+            }
+            else {
+               // the end of string
+               break;
+            }
+        }
+        else {
+            curLine += *pc;
+        }
+    }
+
+    return wxSize(widthTextMax, heightTextTotal);
 }
 
 void wxStaticText::SetLabel(const wxString& label)
 {
-  wxWindow *parent = GetParent();
-
-  RECT rect;
-  GetWindowRect((HWND) GetHWND(), &rect);
-
-  // Since we now have the absolute screen coords, if there's a parent we must
-  // subtract its top left corner
-  POINT point;
-  point.x = rect.left;
-  point.y = rect.top;
-  if (parent)
-  {
-    ::ScreenToClient((HWND) parent->GetHWND(), &point);
-  }
+    SetWindowText(GetHwnd(), label);
 
-  int w, h;
-  GetTextExtent(label, &w, &h, NULL, NULL, & GetFont());
-  MoveWindow((HWND) GetHWND(), point.x, point.y, (int)(w + 10), (int)h, TRUE);
-  SetWindowText((HWND) GetHWND(), (const wxChar *)label);
+    // adjust the size of the window to fit to the label (this behaviour is
+    // backward compatible and generally makes sense but we might want to still
+    // provide the user a way to disable it) (VZ)
+    DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
 }
 
 WXHBRUSH wxStaticText::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,