1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/mac/classic/stattext.cpp
3// Purpose:     wxStaticText
4// Author:      Stefan Csomor
5// Modified by:
6// Created:     04/01/98
7// RCS-ID:      $Id: stattext.cpp 42816 2006-10-31 08:50:17Z RD $
8// Copyright:   (c) Stefan Csomor
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#include "wx/stattext.h"
15
16#ifndef WX_PRECOMP
17    #include "wx/app.h"
18    #include "wx/utils.h"
19    #include "wx/dc.h"
20    #include "wx/dcclient.h"
21    #include "wx/settings.h"
22#endif
23
24#include "wx/notebook.h"
25#include "wx/tabctrl.h"
26
27#include <stdio.h>
28
29IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl)
30
31#include "wx/mac/uma.h"
32
33BEGIN_EVENT_TABLE(wxStaticText, wxStaticTextBase)
34    EVT_PAINT(wxStaticText::OnPaint)
35END_EVENT_TABLE()
36
37bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
38           const wxString& label,
39           const wxPoint& pos,
40           const wxSize& size,
41           long style,
42           const wxString& name)
43{
44    m_label = wxStripMenuCodes(label) ;
45
46    if ( !wxControl::Create( parent, id, pos, size, style,
47                             wxDefaultValidator , name ) )
48    {
49        return false;
50    }
51
52    SetInitialSize( size ) ;
53
54    return true;
55}
56
57const wxString punct = wxT(" ,.-;:!?");
58
59void wxStaticText::DrawParagraph(wxDC &dc, wxString paragraph, int &y)
60{
61    long width, height ;
62
63    if (paragraph.length() == 0)
64    {
65        // empty line
66        dc.GetTextExtent( wxT("H"), &width, &height );
67        y += height;
68
69        return;
70    }
71
72    int x = 0 ;
73
74    bool linedrawn = true;
75    while( paragraph.length() > 0 )
76    {
77        dc.GetTextExtent( paragraph , &width , &height ) ;
78
79        if ( width > m_width )
80        {
81            for ( size_t p = paragraph.length() - 1 ; p > 0 ; --p )
82            {
83                if ((punct.Find(paragraph[p]) != wxNOT_FOUND) || !linedrawn)
84                {
85                    int blank = (paragraph[p] == ' ') ? 0 : 1;
86
87                    dc.GetTextExtent( paragraph.Left(p + blank) , &width , &height ) ;
88
89                    if ( width <= m_width )
90                    {
91                        int pos = x ;
92                        if ( HasFlag( wxALIGN_CENTER ) )
93                        {
94                            pos += ( m_width - width ) / 2 ;
95                        }
96                        else if ( HasFlag( wxALIGN_RIGHT ) )
97                        {
98                            pos += ( m_width - width ) ;
99                        }
100
101                        dc.DrawText( paragraph.Left(p + blank), pos , y) ;
102                        y += height ;
103                        paragraph = paragraph.Mid(p+1) ;
104                        linedrawn = true;
105                        break ;
106                    }
107                }
108            }
109
110            linedrawn = false;
111        }
112        else
113        {
114            int pos = x ;
115            if ( HasFlag( wxALIGN_CENTER ) )
116            {
117                pos += ( m_width - width ) / 2 ;
118            }
119            else if ( HasFlag( wxALIGN_RIGHT ) )
120            {
121                pos += ( m_width - width ) ;
122            }
123
124            dc.DrawText( paragraph, pos , y) ;
125            paragraph=wxEmptyString;
126            y += height ;
127        }
128    }
129}
130
131void wxStaticText::OnDraw( wxDC &dc )
132{
133    if (m_width <= 0 || m_height <= 0)
134        return;
135    /*
136        dc.Clear() ;
137        wxRect rect(0,0,m_width,m_height) ;
138        dc.SetFont(*wxSMALL_FONT) ;
139
140          dc.DrawRectangle(rect) ;
141    */
142    if ( !IsWindowHilited( (WindowRef) MacGetRootWindow() ) &&
143        ( GetBackgroundColour() == wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE )
144        || GetBackgroundColour() == wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) )
145    {
146        dc.SetTextForeground( wxColour( 0x80 , 0x80 , 0x80 ) ) ;
147    }
148    else
149    {
150        dc.SetTextForeground( GetForegroundColour() ) ;
151    }
152
153    wxString paragraph;
154    size_t i = 0 ;
155    wxString text = m_label;
156    int y = 0 ;
157    while (i < text.length())
158    {
159
160        if (text[i] == 13 || text[i] == 10)
161        {
162            DrawParagraph(dc, paragraph,y);
163            paragraph = wxEmptyString ;
164        }
165        else
166        {
167            paragraph += text[i];
168        }
169        ++i;
170    }
171    if (paragraph.length() > 0)
172        DrawParagraph(dc, paragraph,y);
173}
174
175void wxStaticText::OnPaint( wxPaintEvent & WXUNUSED(event) )
176{
177    wxPaintDC dc(this);
178    OnDraw( dc ) ;
179}
180
181wxSize wxStaticText::DoGetBestSize() const
182{
183    int widthTextMax = 0, widthLine,
184        heightTextTotal = 0, heightLineDefault = 0, heightLine = 0;
185
186    wxString curLine;
187    for ( const wxChar *pc = m_label; ; pc++ )
188    {
189        if ( *pc == wxT('\n') || *pc == wxT('\r') || *pc == wxT('\0') )
190        {
191            if ( !curLine )
192            {
193                // we can't use GetTextExtent - it will return 0 for both width
194                // and height and an empty line should count in height
195                // calculation
196                if ( !heightLineDefault )
197                    heightLineDefault = heightLine;
198                if ( !heightLineDefault )
199                    GetTextExtent(_T("W"), NULL, &heightLineDefault);
200
201                heightTextTotal += heightLineDefault;
202
203                heightTextTotal++;  // FIXME: why is this necessary?
204            }
205            else
206            {
207                GetTextExtent(curLine, &widthLine, &heightLine);
208                if ( widthLine > widthTextMax )
209                    widthTextMax = widthLine;
210                heightTextTotal += heightLine;
211
212                heightTextTotal++;  // FIXME: why is this necessary?
213            }
214
215            if ( *pc == wxT('\n') || *pc == wxT('\r')) {
216               curLine.Empty();
217            }
218            else {
219               // the end of string
220               break;
221            }
222        }
223        else {
224            curLine += *pc;
225        }
226    }
227
228    return wxSize(widthTextMax, heightTextTotal);
229}
230
231void wxStaticText::SetLabel(const wxString& st )
232{
233    wxStaticTextBase::SetLabel( st ) ;
234    m_label = st ;
235    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
236    {
237        // temporary fix until layout measurement and drawing are in synch again
238        Refresh() ;
239        InvalidateBestSize();
240        SetSize( GetBestSize() ) ;
241    }
242    Refresh() ;
243    Update() ;
244}
245
246bool wxStaticText::SetFont(const wxFont& font)
247{
248    bool ret = wxControl::SetFont(font);
249
250    if ( ret )
251    {
252        // adjust the size of the window to fit to the label unless autoresizing is
253        // disabled
254        if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
255        {
256            // temporary fix until layout measurement and drawing are in synch again
257            Refresh() ;
258            InvalidateBestSize();
259            SetSize( GetBestSize() );
260        }
261    }
262
263    return ret;
264}
265