1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/toplevel.h
3// Purpose:     Top level window, abstraction of wxFrame and wxDialog
4// Author:      Vaclav Slavik
5// Id:          $Id: toplevel.h 61872 2009-09-09 22:37:05Z VZ $
6// Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
7// Licence:     wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10
11#ifndef __WX_UNIV_TOPLEVEL_H__
12#define __WX_UNIV_TOPLEVEL_H__
13
14#include "wx/univ/inpcons.h"
15#include "wx/univ/inphand.h"
16#include "wx/icon.h"
17
18// ----------------------------------------------------------------------------
19// constants
20// ----------------------------------------------------------------------------
21
22// frame decorations type flags used in wxRenderer and wxColourScheme
23enum
24{
25    wxTOPLEVEL_ACTIVE          = 0x00000001,
26    wxTOPLEVEL_MAXIMIZED       = 0x00000002,
27    wxTOPLEVEL_TITLEBAR        = 0x00000004,
28    wxTOPLEVEL_ICON            = 0x00000008,
29    wxTOPLEVEL_RESIZEABLE      = 0x00000010,
30    wxTOPLEVEL_BORDER          = 0x00000020,
31    wxTOPLEVEL_BUTTON_CLOSE    = 0x01000000,
32    wxTOPLEVEL_BUTTON_MAXIMIZE = 0x02000000,
33    wxTOPLEVEL_BUTTON_ICONIZE =  0x04000000,
34    wxTOPLEVEL_BUTTON_RESTORE  = 0x08000000,
35    wxTOPLEVEL_BUTTON_HELP     = 0x10000000
36};
37
38// frame hit test return values:
39enum
40{
41    wxHT_TOPLEVEL_NOWHERE         = 0x00000000,
42    wxHT_TOPLEVEL_CLIENT_AREA     = 0x00000001,
43    wxHT_TOPLEVEL_ICON            = 0x00000002,
44    wxHT_TOPLEVEL_TITLEBAR        = 0x00000004,
45
46    wxHT_TOPLEVEL_BORDER_N        = 0x00000010,
47    wxHT_TOPLEVEL_BORDER_S        = 0x00000020,
48    wxHT_TOPLEVEL_BORDER_E        = 0x00000040,
49    wxHT_TOPLEVEL_BORDER_W        = 0x00000080,
50    wxHT_TOPLEVEL_BORDER_NE       = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_E,
51    wxHT_TOPLEVEL_BORDER_SE       = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_E,
52    wxHT_TOPLEVEL_BORDER_NW       = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_W,
53    wxHT_TOPLEVEL_BORDER_SW       = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_W,
54    wxHT_TOPLEVEL_ANY_BORDER      = 0x000000F0,
55
56    wxHT_TOPLEVEL_BUTTON_CLOSE    = /*0x01000000*/ wxTOPLEVEL_BUTTON_CLOSE,
57    wxHT_TOPLEVEL_BUTTON_MAXIMIZE = /*0x02000000*/ wxTOPLEVEL_BUTTON_MAXIMIZE,
58    wxHT_TOPLEVEL_BUTTON_ICONIZE =  /*0x04000000*/ wxTOPLEVEL_BUTTON_ICONIZE,
59    wxHT_TOPLEVEL_BUTTON_RESTORE  = /*0x08000000*/ wxTOPLEVEL_BUTTON_RESTORE,
60    wxHT_TOPLEVEL_BUTTON_HELP     = /*0x10000000*/ wxTOPLEVEL_BUTTON_HELP,
61    wxHT_TOPLEVEL_ANY_BUTTON      =   0x1F000000
62};
63
64// Flags for interactive frame manipulation functions (only in wxUniversal):
65enum
66{
67    wxINTERACTIVE_MOVE           = 0x00000001,
68    wxINTERACTIVE_RESIZE         = 0x00000002,
69    wxINTERACTIVE_RESIZE_S       = 0x00000010,
70    wxINTERACTIVE_RESIZE_N       = 0x00000020,
71    wxINTERACTIVE_RESIZE_W       = 0x00000040,
72    wxINTERACTIVE_RESIZE_E       = 0x00000080,
73    wxINTERACTIVE_WAIT_FOR_INPUT = 0x10000000
74};
75
76// ----------------------------------------------------------------------------
77// the actions supported by this control
78// ----------------------------------------------------------------------------
79
80#define wxACTION_TOPLEVEL_ACTIVATE       wxT("activate")   // (de)activate the frame
81#define wxACTION_TOPLEVEL_BUTTON_PRESS   wxT("pressbtn")   // press titlebar btn
82#define wxACTION_TOPLEVEL_BUTTON_RELEASE wxT("releasebtn") // press titlebar btn
83#define wxACTION_TOPLEVEL_BUTTON_CLICK   wxT("clickbtn")   // press titlebar btn
84#define wxACTION_TOPLEVEL_MOVE           wxT("move")       // move the frame
85#define wxACTION_TOPLEVEL_RESIZE         wxT("resize")     // resize the frame
86
87//-----------------------------------------------------------------------------
88// wxTopLevelWindow
89//-----------------------------------------------------------------------------
90
91class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative,
92                                     public wxInputConsumer
93{
94public:
95    // construction
96    wxTopLevelWindow() { Init(); }
97    wxTopLevelWindow(wxWindow *parent,
98                     wxWindowID id,
99                     const wxString& title,
100                     const wxPoint& pos = wxDefaultPosition,
101                     const wxSize& size = wxDefaultSize,
102                     long style = wxDEFAULT_FRAME_STYLE,
103                     const wxString& name = wxFrameNameStr)
104    {
105        Init();
106
107        Create(parent, id, title, pos, size, style, name);
108    }
109
110    bool Create(wxWindow *parent,
111                wxWindowID id,
112                const wxString& title,
113                const wxPoint& pos = wxDefaultPosition,
114                const wxSize& size = wxDefaultSize,
115                long style = wxDEFAULT_FRAME_STYLE,
116                const wxString& name = wxFrameNameStr);
117
118    // wxUniv-specific methods: do [not] use native decorations for this (or
119    // all) window(s)
120    //
121    // notice that this has no effect if the system doesn't support any native
122    // decorations anyhow and that by default native decorations are used
123    //
124    // if UseNativeDecorations() is used, it must be called before Create()
125    static void UseNativeDecorationsByDefault(bool native = true);
126    void UseNativeDecorations(bool native = true);
127    bool IsUsingNativeDecorations() const;
128
129
130    // implement base class pure virtuals
131    virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL);
132    virtual wxPoint GetClientAreaOrigin() const;
133    virtual void SetIcon(const wxIcon& icon) { SetIcons( wxIconBundle( icon ) ); }
134    virtual void SetIcons(const wxIconBundle& icons);
135
136    // implementation from now on
137    // --------------------------
138
139    // tests for frame's part at given point
140    long HitTest(const wxPoint& pt) const;
141
142    virtual bool PerformAction(const wxControlAction& action,
143                               long numArg = -1,
144                               const wxString& strArg = wxEmptyString);
145
146    static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef);
147    virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef)
148    {
149        return GetStdInputHandler(handlerDef);
150    }
151
152    // move/resize the frame interactively, i.e. let the user do it
153    virtual void InteractiveMove(int flags = wxINTERACTIVE_MOVE);
154
155    virtual wxSize GetMinSize() const;
156
157    virtual wxWindow *GetInputWindow() const { return wx_const_cast(wxTopLevelWindow*, this); }
158
159protected:
160    virtual void DoGetClientSize(int *width, int *height) const;
161    virtual void DoSetClientSize(int width, int height);
162
163    // handle titlebar button click event
164    virtual void ClickTitleBarButton(long button);
165
166    // return wxTOPLEVEL_xxx combination based on current state of the frame
167    long GetDecorationsStyle() const;
168
169    // common part of all ctors
170    void Init();
171
172    void RefreshTitleBar();
173    void OnNcPaint(wxNcPaintEvent& event);
174    void OnSystemMenu(wxCommandEvent& event);
175
176    // true if wxTLW should render decorations (aka titlebar) itself
177    static int ms_drawDecorations;
178    // true if wxTLW can be iconized
179    static int ms_canIconize;
180
181    // true if we're using native decorations
182    bool m_usingNativeDecorations;
183    // true for currently active frame
184    bool m_isActive;
185    // version of icon for titlebar (16x16)
186    wxIcon m_titlebarIcon;
187    // saved window style in fullscreen mdoe
188    long m_fsSavedStyle;
189    // currently pressed titlebar button
190    long m_pressedButton;
191
192    DECLARE_DYNAMIC_CLASS(wxTopLevelWindow)
193    DECLARE_EVENT_TABLE()
194    WX_DECLARE_INPUT_CONSUMER()
195};
196
197#endif // __WX_UNIV_TOPLEVEL_H__
198