1///////////////////////////////////////////////////////////////////////////////
2// Name:        src/univ/frame.cpp
3// Purpose:     wxFrame class for wxUniversal
4// Author:      Vadim Zeitlin
5// Modified by:
6// Created:     19.05.01
7// RCS-ID:      $Id: framuniv.cpp 42664 2006-10-29 20:39:31Z VZ $
8// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
9// Licence:     wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12// ===========================================================================
13// declarations
14// ===========================================================================
15
16// ---------------------------------------------------------------------------
17// headers
18// ---------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24    #pragma hdrstop
25#endif
26
27#include "wx/frame.h"
28
29#ifndef WX_PRECOMP
30    #include "wx/menu.h"
31    #include "wx/statusbr.h"
32    #include "wx/settings.h"
33    #include "wx/toolbar.h"
34#endif // WX_PRECOMP
35
36// ============================================================================
37// implementation
38// ============================================================================
39
40BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
41    EVT_SIZE(wxFrame::OnSize)
42    EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
43END_EVENT_TABLE()
44
45IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow)
46
47// ----------------------------------------------------------------------------
48// ctors
49// ----------------------------------------------------------------------------
50
51bool wxFrame::Create(wxWindow *parent,
52                     wxWindowID id,
53                     const wxString& title,
54                     const wxPoint& pos,
55                     const wxSize& size,
56                     long style,
57                     const wxString& name)
58{
59    if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) )
60        return false;
61
62    SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
63
64    return true;
65}
66
67// Responds to colour changes, and passes event on to children.
68void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event)
69{
70    SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
71    Refresh();
72
73    event.Skip();
74}
75
76// ----------------------------------------------------------------------------
77// menu support
78// ----------------------------------------------------------------------------
79
80void wxFrame::OnSize(wxSizeEvent& event)
81{
82#if wxUSE_MENUS
83    PositionMenuBar();
84#endif // wxUSE_MENUS
85#if wxUSE_STATUSBAR
86    PositionStatusBar();
87#endif // wxUSE_STATUSBAR
88#if wxUSE_TOOLBAR
89    PositionToolBar();
90#endif // wxUSE_TOOLBAR
91
92    event.Skip();
93}
94
95void wxFrame::SendSizeEvent()
96{
97    wxSizeEvent event(GetSize(), GetId());
98    event.SetEventObject(this);
99    GetEventHandler()->ProcessEvent(event);
100}
101
102#if wxUSE_MENUS
103
104void wxFrame::PositionMenuBar()
105{
106    if ( m_frameMenuBar )
107    {
108        // the menubar is positioned above the client size, hence the negative
109        // y coord
110        wxCoord heightMbar = m_frameMenuBar->GetSize().y;
111
112        wxCoord heightTbar = 0;
113
114#if wxUSE_TOOLBAR
115        if ( m_frameToolBar )
116            heightTbar = m_frameToolBar->GetSize().y;
117#endif // wxUSE_TOOLBAR
118
119        m_frameMenuBar->SetSize(0,
120#ifdef __WXPM__   // FIXME -- remove this, make wxOS2/Univ behave as
121                 //          the rest of the world!!!
122                                GetClientSize().y - heightMbar - heightTbar,
123#else
124                                - (heightMbar + heightTbar),
125#endif
126                                GetClientSize().x, heightMbar);
127    }
128}
129
130void wxFrame::DetachMenuBar()
131{
132    wxFrameBase::DetachMenuBar();
133    SendSizeEvent();
134}
135
136void wxFrame::AttachMenuBar(wxMenuBar *menubar)
137{
138    wxFrameBase::AttachMenuBar(menubar);
139    SendSizeEvent();
140}
141
142#endif // wxUSE_MENUS
143
144#if wxUSE_STATUSBAR
145
146void wxFrame::PositionStatusBar()
147{
148    if ( m_frameStatusBar )
149    {
150        wxSize size = GetClientSize();
151        m_frameStatusBar->SetSize(0, size.y, size.x, wxDefaultCoord);
152    }
153}
154
155wxStatusBar* wxFrame::CreateStatusBar(int number, long style,
156                                      wxWindowID id, const wxString& name)
157{
158    wxStatusBar *bar = wxFrameBase::CreateStatusBar(number, style, id, name);
159    SendSizeEvent();
160    return bar;
161}
162
163#endif // wxUSE_STATUSBAR
164
165#if wxUSE_TOOLBAR
166
167wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name)
168{
169    if ( wxFrameBase::CreateToolBar(style, id, name) )
170    {
171        PositionToolBar();
172    }
173
174    return m_frameToolBar;
175}
176
177void wxFrame::PositionToolBar()
178{
179    if ( m_frameToolBar )
180    {
181        wxSize size = GetClientSize();
182        int tw, th, tx, ty;
183
184        tx = ty = 0;
185        m_frameToolBar->GetSize(&tw, &th);
186        if ( m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL )
187        {
188            tx = -tw;
189            th = size.y;
190        }
191        else
192        {
193            ty = -th;
194            tw = size.x;
195        }
196
197        m_frameToolBar->SetSize(tx, ty, tw, th);
198    }
199}
200#endif // wxUSE_TOOLBAR
201
202wxPoint wxFrame::GetClientAreaOrigin() const
203{
204    wxPoint pt = wxFrameBase::GetClientAreaOrigin();
205
206#if wxUSE_MENUS && !defined(__WXPM__)
207    if ( m_frameMenuBar )
208    {
209        pt.y += m_frameMenuBar->GetSize().y;
210    }
211#endif // wxUSE_MENUS
212
213#if wxUSE_TOOLBAR
214    if ( m_frameToolBar )
215    {
216        if ( m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL )
217            pt.x += m_frameToolBar->GetSize().x;
218        else
219            pt.y += m_frameToolBar->GetSize().y;
220    }
221#endif // wxUSE_TOOLBAR
222
223    return pt;
224}
225
226void wxFrame::DoGetClientSize(int *width, int *height) const
227{
228    wxFrameBase::DoGetClientSize(width, height);
229
230#if wxUSE_MENUS
231    if ( m_frameMenuBar && height )
232    {
233        (*height) -= m_frameMenuBar->GetSize().y;
234    }
235#endif // wxUSE_MENUS
236
237#if wxUSE_STATUSBAR
238    if ( m_frameStatusBar && height )
239    {
240        (*height) -= m_frameStatusBar->GetSize().y;
241    }
242#endif // wxUSE_STATUSBAR
243
244#if wxUSE_TOOLBAR
245    if ( m_frameToolBar )
246    {
247        if ( width && (m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL) )
248            (*width) -= m_frameToolBar->GetSize().x;
249        else if ( height )
250            (*height) -= m_frameToolBar->GetSize().y;
251    }
252#endif // wxUSE_TOOLBAR
253}
254
255void wxFrame::DoSetClientSize(int width, int height)
256{
257#if wxUSE_MENUS
258    if ( m_frameMenuBar )
259    {
260        height += m_frameMenuBar->GetSize().y;
261    }
262#endif // wxUSE_MENUS
263
264#if wxUSE_STATUSBAR
265    if ( m_frameStatusBar )
266    {
267        height += m_frameStatusBar->GetSize().y;
268    }
269#endif // wxUSE_STATUSBAR
270
271#if wxUSE_TOOLBAR
272    if ( m_frameToolBar )
273    {
274#if wxUSE_STATUSBAR
275        height += m_frameStatusBar->GetSize().y;
276#endif // wxUSE_STATUSBAR
277
278        if ( m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL )
279            width += m_frameToolBar->GetSize().x;
280        else
281            height += m_frameToolBar->GetSize().y;
282    }
283#endif // wxUSE_TOOLBAR
284
285    wxFrameBase::DoSetClientSize(width, height);
286}
287
288wxSize wxFrame::GetMinSize() const
289{
290    wxSize size = wxFrameBase::GetMinSize();
291
292#if wxUSE_MENUS
293    if ( m_frameMenuBar )
294    {
295        const wxSize sizeMenu = m_frameMenuBar->GetBestSize();
296        if ( sizeMenu.x > size.x )
297            size.x = sizeMenu.x;
298        size.y += sizeMenu.y;
299    }
300#endif // wxUSE_MENUS
301
302#if wxUSE_TOOLBAR
303    if ( m_frameToolBar )
304    {
305        size.y += m_frameToolBar->GetSize().y;
306    }
307#endif // wxUSE_TOOLBAR
308
309#if wxUSE_STATUSBAR
310    if ( m_frameStatusBar )
311    {
312        size.y += m_frameStatusBar->GetSize().y;
313    }
314#endif // wxUSE_STATUSBAR
315
316    return size;
317}
318
319bool wxFrame::Enable(bool enable)
320{
321    if (!wxFrameBase::Enable(enable))
322        return false;
323#ifdef __WXMICROWIN__
324    if (m_frameMenuBar)
325        m_frameMenuBar->Enable(enable);
326#endif
327    return true;
328}
329