Added various #includes for non-precompiled headers.
[wxWidgets.git] / src / os2 / stattext.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: stattext.cpp
3 // Purpose: wxStaticText
4 // Author: David Webster
5 // Modified by:
6 // Created: 10/17/99
7 // RCS-ID: $Id$
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "stattext.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifndef WX_PRECOMP
20 #include "wx/event.h"
21 #include "wx/app.h"
22 #include "wx/brush.h"
23 #include "wx/scrolwin.h"
24 #endif
25
26 #include "wx/stattext.h"
27 #include "wx/os2/private.h"
28 #include <stdio.h>
29
30 IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl)
31
32 bool wxStaticText::Create(
33 wxWindow* pParent
34 , wxWindowID vId
35 , const wxString& rsLabel
36 , const wxPoint& rPos
37 , const wxSize& rSize
38 , long lStyle
39 , const wxString& rsName
40 )
41 {
42 SetName(rsName);
43 if (pParent)
44 pParent->AddChild(this);
45
46 SetBackgroundColour(pParent->GetBackgroundColour()) ;
47 SetForegroundColour(pParent->GetForegroundColour()) ;
48
49 if ( vId == -1 )
50 m_windowId = (int)NewControlId();
51 else
52 m_windowId = vId;
53
54 int nX = rPos.x;
55 int nY = rPos.y;
56 int nWidth = rSize.x;
57 int nHeight = rSize.y;
58
59 m_windowStyle = lStyle;
60
61 long lSstyle = 0L;
62
63 lSstyle = WS_VISIBLE | SS_TEXT | DT_VCENTER;
64 if (m_windowStyle & wxALIGN_CENTRE)
65 lSstyle |= DT_CENTER;
66 else if (m_windowStyle & wxALIGN_RIGHT)
67 lSstyle |= DT_RIGHT;
68 else
69 lSstyle |= DT_LEFT;
70 //
71 // If the parent is a scrolled window the controls must
72 // have this style or they will overlap the scrollbars
73 //
74 if (pParent)
75 if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
76 pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
77 lSstyle |= WS_CLIPSIBLINGS;
78
79 m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
80 ,WC_STATIC // Window class
81 ,(PSZ)rsLabel.c_str() // Initial Text
82 ,(ULONG)lSstyle // Style flags
83 ,0L, 0L, 0L, 0L // Origin -- 0 size
84 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
85 ,HWND_TOP // initial z position
86 ,(ULONG)m_windowId // Window identifier
87 ,NULL // no control data
88 ,NULL // no Presentation parameters
89 );
90
91 wxCHECK_MSG(m_hWnd, FALSE, wxT("Failed to create static ctrl"));
92
93 wxColour vColour;
94
95 vColour.Set(wxString("BLACK"));
96
97 LONG lColor = (LONG)vColour.GetPixel();
98
99 ::WinSetPresParam( m_hWnd
100 ,PP_FOREGROUNDCOLOR
101 ,sizeof(LONG)
102 ,(PVOID)&lColor
103 );
104 lColor = (LONG)m_backgroundColour.GetPixel();
105
106 ::WinSetPresParam( m_hWnd
107 ,PP_BACKGROUNDCOLOR
108 ,sizeof(LONG)
109 ,(PVOID)&lColor
110 );
111
112 SubclassWin(m_hWnd);
113 wxControl::SetFont(pParent->GetFont());
114 SetSize( nX
115 ,nY
116 ,nWidth
117 ,nHeight
118 );
119 return TRUE;
120 } // end of wxStaticText::Create
121
122 wxSize wxStaticText::DoGetBestSize() const
123 {
124 wxString sText(wxGetWindowText(GetHWND()));
125 int nWidthTextMax = 0;
126 int nWidthLine = 0;
127 int nHeightTextTotal = 0;
128 int nHeightLineDefault = 0;
129 int nHeightLine = 0;
130 wxString sCurLine;
131
132 for (const wxChar *pc = sText; ; pc++)
133 {
134 if ( *pc == wxT('\n') || *pc == wxT('\0') )
135 {
136 if (!sCurLine )
137 {
138 //
139 // We can't use GetTextExtent - it will return 0 for both width
140 // and height and an empty line should count in height
141 // calculation
142 //
143 if (!nHeightLineDefault)
144 nHeightLineDefault = nHeightLine;
145 if (!nHeightLineDefault)
146 GetTextExtent(_T("W"), NULL, &nHeightLineDefault);
147 nHeightTextTotal += nHeightLineDefault;
148 }
149 else
150 {
151 GetTextExtent( sCurLine
152 ,&nWidthLine
153 ,&nHeightLine
154 );
155 if (nWidthLine > nWidthTextMax)
156 nWidthTextMax = nWidthLine;
157 nHeightTextTotal += nHeightLine;
158 }
159
160 if ( *pc == wxT('\n') )
161 {
162 sCurLine.Empty();
163 }
164 else
165 {
166 break;
167 }
168 }
169 else
170 {
171 sCurLine += *pc;
172 }
173 }
174 return wxSize( nWidthTextMax
175 ,nHeightTextTotal
176 );
177 } // end of wxStaticText::DoGetBestSize
178
179 void wxStaticText::DoSetSize(
180 int nX
181 , int nY
182 , int nWidth
183 , int nHeight
184 , int nSizeFlags
185 )
186 {
187 //
188 // We need to refresh the window after changing its size as the standard
189 // control doesn't always update itself properly.
190 //
191 wxStaticTextBase::DoSetSize( nX
192 ,nY
193 ,nWidth
194 ,nHeight
195 ,nSizeFlags
196 );
197 Refresh();
198 } // end of wxStaticText::DoSetSize
199
200 bool wxStaticText::SetFont(
201 const wxFont& rFont
202 )
203 {
204 bool bRet = wxControl::SetFont(rFont);
205
206 //
207 // Adjust the size of the window to fit to the label unless autoresizing is
208 // disabled
209 //
210 if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
211 {
212 DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
213 }
214 return bRet;
215 } // end of wxStaticText::SetFont
216
217 void wxStaticText::SetLabel(
218 const wxString& rsLabel
219 )
220 {
221 ::WinSetWindowText(GetHwnd(), rsLabel.c_str());
222
223 //
224 // Adjust the size of the window to fit to the label unless autoresizing is
225 // disabled
226 //
227 if (!(GetWindowStyle() & wxST_NO_AUTORESIZE))
228 {
229 DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
230 }
231 DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
232 } // end of wxStaticText::SetLabel
233
234 MRESULT wxStaticText::OS2WindowProc(
235 WXUINT uMsg
236 , WXWPARAM wParam
237 , WXLPARAM lParam
238 )
239 {
240 return wxWindow::OS2WindowProc( uMsg
241 ,wParam
242 ,lParam
243 );
244 } // end of wxStaticText::OS2WindowProc