]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/stattext.cpp
wxSpinCtrl
[wxWidgets.git] / src / msw / stattext.cpp
index e27866942b4123576b143b157e7c3ab4099ae15d..f1a947d26649f56338ba55d816bb321b796e8e18 100644 (file)
@@ -21,7 +21,9 @@
 #endif
 
 #ifndef WX_PRECOMP
+#include "wx/event.h"
 #include "wx/app.h"
+#include "wx/brush.h"
 #endif
 
 #include "wx/stattext.h"
@@ -70,14 +72,14 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
   if ( wxStyleHasBorder(m_windowStyle) )
     msStyle |= WS_BORDER;
 
-  m_hWnd = (WXHWND)::CreateWindowEx(MakeExtendedStyle(m_windowStyle), "STATIC", (const char *)label,
+  m_hWnd = (WXHWND)::CreateWindowEx(MakeExtendedStyle(m_windowStyle), wxT("STATIC"), (const wxChar *)label,
                          msStyle,
                          0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)m_windowId,
                          wxGetInstance(), NULL);
 
-  wxCHECK_MSG( m_hWnd, FALSE, "Failed to create static ctrl" );
+  wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static ctrl") );
 
-#if CTL3D
+#if wxUSE_CTL3D
 /*
   if (!(GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS))
     Ctl3dSubclassCtl(static_item);
@@ -86,90 +88,58 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
 
   SubclassWin(m_hWnd);
 
-  SetFont(parent->GetFont());
+  SetFont(parent->GetFont());
   SetSize(x, y, width, height);
 
   return TRUE;
 }
 
-void wxStaticText::SetSize(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;
-
-  char buf[300];
-  int current_width;
-  int cyf;
-
-  ::GetWindowText((HWND) GetHWND(), buf, 300);
-  GetTextExtent(buf, &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 wxChar *pc = text; ; pc++ ) {
+        if ( *pc == wxT('\n') || *pc == wxT('\0') ) {
+            GetTextExtent(curLine, &widthLine, &heightLine);
+            if ( widthLine > widthTextMax )
+                widthTextMax = widthLine;
+            heightTextTotal += heightLine;
+
+            if ( *pc == wxT('\n') ) {
+               curLine.Empty();
+            }
+            else {
+               // the end of string
+               break;
+            }
+        }
+        else {
+            curLine += *pc;
+        }
+    }
+
+    return wxSize(widthTextMax, heightTextTotal);
 }
 
 void wxStaticText::SetLabel(const wxString& label)
 {
-  int w, h;
-  RECT rect;
-
-  wxWindow *parent = GetParent();
-  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);
 
-  GetTextExtent(label, &w, &h, NULL, NULL, GetFont());
-  MoveWindow((HWND) GetHWND(), point.x, point.y, (int)(w + 10), (int)h,
-             TRUE);
-  SetWindowText((HWND) GetHWND(), (const char *)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,
       WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
 /*
-#if CTL3D
+#if wxUSE_CTL3D
   if ( m_useCtl3D )
   {
     HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);