/////////////////////////////////////////////////////////////////////////////
-// Name: stattext.cpp
+// Name: src/os2/stattext.cpp
// Purpose: wxStaticText
// Author: David Webster
// Modified by:
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#include "wx/stattext.h"
+
#ifndef WX_PRECOMP
-#include "wx/event.h"
-#include "wx/app.h"
-#include "wx/brush.h"
+ #include "wx/event.h"
+ #include "wx/app.h"
+ #include "wx/brush.h"
+ #include "wx/scrolwin.h"
#endif
-#include "wx/stattext.h"
#include "wx/os2/private.h"
#include <stdio.h>
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl)
-#endif
-bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
- const wxString& label,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString& name)
+bool wxStaticText::Create( wxWindow* pParent,
+ wxWindowID vId,
+ const wxString& rsLabel,
+ const wxPoint& rPos,
+ const wxSize& rSize,
+ long lStyle,
+ const wxString& rsName )
{
- SetName(name);
- if (parent) parent->AddChild(this);
+ SetName(rsName);
+ if (pParent)
+ pParent->AddChild(this);
- SetBackgroundColour(parent->GetBackgroundColour()) ;
- SetForegroundColour(parent->GetForegroundColour()) ;
+ SetBackgroundColour(pParent->GetBackgroundColour()) ;
+ SetForegroundColour(pParent->GetForegroundColour()) ;
- if ( id == -1 )
+ if ( vId == wxID_ANY )
m_windowId = (int)NewControlId();
else
- m_windowId = id;
+ m_windowId = vId;
+
+ int nX = rPos.x;
+ int nY = rPos.y;
+ int nWidth = rSize.x;
+ int nHeight = rSize.y;
+
+ m_windowStyle = lStyle;
+
+ long lSstyle = 0L;
+
+ // Used to have DT_VCENTER but that doesn't work correctly with
+ // multiline strings and DT_WORDBREAK. Accept a reasonable
+ // compromise for now
+ lSstyle = WS_VISIBLE | SS_TEXT | DT_WORDBREAK | DT_MNEMONIC;
+ if (m_windowStyle & wxALIGN_CENTRE)
+ lSstyle |= DT_CENTER;
+ else if (m_windowStyle & wxALIGN_RIGHT)
+ lSstyle |= DT_RIGHT;
+ else
+ lSstyle |= DT_LEFT;
- int x = pos.x;
- int y = pos.y;
- int width = size.x;
- int height = size.y;
+ m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
+ ,WC_STATIC // Window class
+ ,NULL // Initial Text
+ ,(ULONG)lSstyle // Style flags
+ ,0L, 0L, 0L, 0L // Origin -- 0 size
+ ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
+ ,HWND_TOP // initial z position
+ ,(ULONG)m_windowId // Window identifier
+ ,NULL // no control data
+ ,NULL // no Presentation parameters
+ );
- m_windowStyle = style;
+ wxCHECK_MSG(m_hWnd, false, wxT("Failed to create static ctrl"));
+
+ LONG lColor = (LONG)wxBLACK->GetPixel();
+
+ ::WinSetPresParam( m_hWnd
+ ,PP_FOREGROUNDCOLOR
+ ,sizeof(LONG)
+ ,(PVOID)&lColor
+ );
+ lColor = (LONG)m_backgroundColour.GetPixel();
+
+ ::WinSetPresParam( m_hWnd
+ ,PP_BACKGROUNDCOLOR
+ ,sizeof(LONG)
+ ,(PVOID)&lColor
+ );
- // TODO
SubclassWin(m_hWnd);
+ SetFont(*wxSMALL_FONT);
+ SetXComp(0);
+ SetYComp(0);
+ SetSize( nX, nY, nWidth, nHeight );
- SetFont(parent->GetFont());
- SetSize(x, y, width, height);
+ SetLabel(rsLabel);
- return FALSE;
-}
+ return true;
+} // end of wxStaticText::Create
-wxSize wxStaticText::DoGetBestSize()
+wxSize wxStaticText::DoGetBestSize() const
{
- wxString text(wxGetWindowText(GetHWND()));
-
- int widthTextMax = 0, widthLine,
- heightTextTotal = 0, heightLine;
+ wxString sText(GetLabel());
+ int nWidthTextMax = 0;
+ int nWidthLine = 0;
+ int nHeightTextTotal = 0;
+ int nHeightLineDefault = 0;
+ int nHeightLine = 0;
+ wxString sCurLine;
+ bool bLastWasTilde = false;
- 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;
+ for (const wxChar *pc = sText; ; pc++)
+ {
+ if ( *pc == wxT('\n') || *pc == wxT('\0') )
+ {
+ if (!sCurLine )
+ {
+ //
+ // We can't use GetTextExtent - it will return 0 for both width
+ // and height and an empty line should count in height
+ // calculation
+ //
+ if (!nHeightLineDefault)
+ nHeightLineDefault = nHeightLine;
+ if (!nHeightLineDefault)
+ GetTextExtent(_T("W"), NULL, &nHeightLineDefault);
+ nHeightTextTotal += nHeightLineDefault;
+ }
+ else
+ {
+ GetTextExtent( sCurLine
+ ,&nWidthLine
+ ,&nHeightLine
+ );
+ if (nWidthLine > nWidthTextMax)
+ nWidthTextMax = nWidthLine;
+ nHeightTextTotal += nHeightLine;
+ }
- if ( *pc == wxT('\n') ) {
- curLine.Empty();
+ if ( *pc == wxT('\n') )
+ {
+ sCurLine.Empty();
}
- else {
- // the end of string
+ else
+ {
break;
}
}
- else {
- curLine += *pc;
+ else
+ {
+ //
+ // We shouldn't take into account the '~' which just introduces the
+ // mnemonic characters and so are not shown on the screen -- except
+ // when it is preceded by another '~' in which case it stands for a
+ // literal tilde
+ //
+ if (*pc == _T('~'))
+ {
+ if (!bLastWasTilde)
+ {
+ bLastWasTilde = true;
+
+ //
+ // Skip the statement adding pc to curLine below
+ //
+ continue;
+ }
+
+ //
+ // It is a literal tilde
+ //
+ bLastWasTilde = false;
+ }
+ sCurLine += *pc;
}
}
+ return wxSize( nWidthTextMax
+ ,nHeightTextTotal
+ );
+} // end of wxStaticText::DoGetBestSize
- return wxSize(widthTextMax, heightTextTotal);
-}
+void wxStaticText::DoSetSize(
+ int nX
+, int nY
+, int nWidth
+, int nHeight
+, int nSizeFlags
+)
+{
+ //
+ // We need to refresh the window after changing its size as the standard
+ // control doesn't always update itself properly.
+ //
+ wxStaticTextBase::DoSetSize( nX
+ ,nY
+ ,nWidth
+ ,nHeight
+ ,nSizeFlags
+ );
+
+ // eventually update label (if ellipsizing is on):
+ UpdateLabel();
+
+ Refresh();
+} // end of wxStaticText::DoSetSize
-void wxStaticText::SetLabel(const wxString& label)
+bool wxStaticText::SetFont(
+ const wxFont& rFont
+)
{
- // TODO
+ bool bRet = wxControl::SetFont(rFont);
- // 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);
-}
+ //
+ // Adjust the size of the window to fit to the label unless autoresizing is
+ // disabled
+ //
+ if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
+ {
+ DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
+ }
+ return bRet;
+} // end of wxStaticText::SetFont
-WXHBRUSH wxStaticText::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
- WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+void wxStaticText::SetLabel(
+ const wxString& rsLabel
+)
{
- // TODO:
-/*
- if (GetParent()->GetTransparentBackground())
- SetBkMode((HDC) pDC, TRANSPARENT);
- else
- SetBkMode((HDC) pDC, OPAQUE);
-
- ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
- ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
- wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
- // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
- // has a zero usage count.
-// backgroundBrush->RealizeResource();
- return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-*/
- return (WXHBRUSH)0;
+ m_labelOrig = rsLabel; // save original label
+
+ // OS/2 does not support neither ellipsize nor markup in static text:
+ DoSetLabel(rsLabel);
+ DoSetLabel(GetEllipsizedLabelWithoutMarkup());
+
+ //
+ // Adjust the size of the window to fit to the label unless autoresizing is
+ // disabled
+ //
+ if (!(GetWindowStyle() & wxST_NO_AUTORESIZE) &&
+ !IsEllipsized())
+ {
+ wxCoord vX;
+ wxCoord vY;
+ wxCoord vWidth;
+ wxCoord vHeight;
+
+ GetPosition(&vX, &vY);
+ GetSize(&vWidth, &vHeight);
+ if (!(vX == -1 && vY == -1 && vWidth == -1 && vHeight == -1))
+ DoSetSize(vX, vY, vWidth, vHeight, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
+ else
+ DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
+ }
+} // end of wxStaticText::SetLabel
+
+MRESULT wxStaticText::OS2WindowProc(
+ WXUINT uMsg
+, WXWPARAM wParam
+, WXLPARAM lParam
+)
+{
+ return wxWindow::OS2WindowProc( uMsg
+ ,wParam
+ ,lParam
+ );
+} // end of wxStaticText::OS2WindowProc
+
+
+// for wxST_ELLIPSIZE_* support:
+
+void wxStaticText::DoSetLabel(const wxString& str)
+{
+ wxString sLabel = ::wxPMTextToLabel(str);
+ ::WinSetWindowText(GetHwnd(), sLabel.c_str());
}
-MRESULT wxStaticText::OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+wxString wxStaticText::DoGetLabel() const
{
- // Ensure that static items get messages. Some controls don't like this
- // message to be intercepted (e.g. RichEdit), hence the tests.
-// TODO:
-/*
- if (nMsg == WM_NCHITTEST)
- return (long)HTCLIENT;
-*/
- return wxWindow::OS2WindowProc(hwnd, nMsg, wParam, lParam);
+ return wxGetWindowText(GetHwnd());
}