#endif
#include "wx/univ/inpcons.h"
+#include "wx/univ/inphand.h"
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// frame decorations type flags used in wxRenderer and wxColourScheme
+// (also used for hit tests)
enum
{
- wxTOPLEVEL_BORDER = 0x00000001,
+ wxTOPLEVEL_ACTIVE = 0x00000001,
wxTOPLEVEL_MAXIMIZED = 0x00000002,
wxTOPLEVEL_TITLEBAR = 0x00000004,
wxTOPLEVEL_RESIZEABLE = 0x00000008,
wxTOPLEVEL_ICON = 0x00000010,
- wxTOPLEVEL_CLOSE_BUTTON = 0x00000020,
- wxTOPLEVEL_MAXIMIZE_BUTTON = 0x00000040,
- wxTOPLEVEL_MINIMIZE_BUTTON = 0x00000080,
- wxTOPLEVEL_RESTORE_BUTTON = 0x00000100,
- wxTOPLEVEL_HELP_BUTTON = 0x00000200,
- wxTOPLEVEL_ACTIVE = 0x00000400
+ wxTOPLEVEL_BUTTON_CLOSE = 0x00000020,
+ wxTOPLEVEL_BUTTON_MAXIMIZE = 0x00000040,
+ wxTOPLEVEL_BUTTON_MINIMIZE = 0x00000080,
+ wxTOPLEVEL_BUTTON_RESTORE = 0x00000100,
+ wxTOPLEVEL_BUTTON_HELP = 0x00000200,
+ wxTOPLEVEL_BORDER = 0x00000400,
};
+// frame hit test return values:
+enum
+{
+ wxHT_TOPLEVEL_NOWHERE = 0,
+ wxHT_TOPLEVEL_CLIENT_AREA,
+ wxHT_TOPLEVEL_ICON,
+ wxHT_TOPLEVEL_TITLEBAR,
+ wxHT_TOPLEVEL_BUTTON_CLOSE = wxTOPLEVEL_BUTTON_CLOSE,
+ wxHT_TOPLEVEL_BUTTON_MAXIMIZE = wxTOPLEVEL_BUTTON_MAXIMIZE,
+ wxHT_TOPLEVEL_BUTTON_MINIMIZE = wxTOPLEVEL_BUTTON_MINIMIZE,
+ wxHT_TOPLEVEL_BUTTON_RESTORE = wxTOPLEVEL_BUTTON_RESTORE,
+ wxHT_TOPLEVEL_BUTTON_HELP = wxTOPLEVEL_BUTTON_HELP,
+ wxHT_TOPLEVEL_BORDER_N,
+ wxHT_TOPLEVEL_BORDER_S,
+ wxHT_TOPLEVEL_BORDER_E,
+ wxHT_TOPLEVEL_BORDER_W,
+ wxHT_TOPLEVEL_BORDER_NE = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_E,
+ wxHT_TOPLEVEL_BORDER_SE = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_E,
+ wxHT_TOPLEVEL_BORDER_NW = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_W,
+ wxHT_TOPLEVEL_BORDER_SW = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_W,
+};
+
+// ----------------------------------------------------------------------------
+// the actions supported by this control
+// ----------------------------------------------------------------------------
+
+#define wxACTION_TOPLEVEL_ACTIVATE _T("activate") // (de)activate the frame
+#define wxACTION_TOPLEVEL_CLOSE _T("close") // close the frame
+#define wxACTION_TOPLEVEL_MAXIMIZE _T("maximize") // maximize the frame
+#define wxACTION_TOPLEVEL_MINIMIZE _T("minimize") // minimize the frame
+#define wxACTION_TOPLEVEL_RESTORE _T("restore") // undo maximization
+#define wxACTION_TOPLEVEL_CONTEXT_HELP _T("contexthelp")// context help mode
+
//-----------------------------------------------------------------------------
// wxTopLevelWindow
//-----------------------------------------------------------------------------
-class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative
+class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative,
+ public wxInputConsumer
{
public:
// construction
// --------------------------
protected:
+ virtual bool PerformAction(const wxControlAction& action,
+ long numArg = -1,
+ const wxString& strArg = wxEmptyString);
+ virtual wxWindow *GetInputWindow() const { return (wxWindow*)this; }
+
// common part of all ctors
void Init();
// return wxTOPLEVEL_xxx combination based on current state of the frame
long GetDecorationsStyle() const;
- DECLARE_DYNAMIC_CLASS(wxTopLevelWindow)
- DECLARE_EVENT_TABLE()
void OnNcPaint(wxPaintEvent& event);
// TRUE if wxTLW should render decorations (aka titlebar) itself
bool m_isActive:1;
// version of icon for titlebar (16x16)
wxIcon m_titlebarIcon;
-
+ // saved window style in fullscreen mdoe
+ long m_fsSavedStyle;
+
+ DECLARE_DYNAMIC_CLASS(wxTopLevelWindow)
+ DECLARE_EVENT_TABLE()
+ WX_DECLARE_INPUT_CONSUMER()
+};
+
+// ----------------------------------------------------------------------------
+// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStdFrameInputHandler : public wxStdInputHandler
+{
+public:
+ wxStdFrameInputHandler(wxInputHandler *inphand);
+
+ virtual bool HandleMouse(wxInputConsumer *consumer,
+ const wxMouseEvent& event);
+ virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event);
+ virtual bool HandleActivation(wxInputConsumer *consumer, bool activated);
};
#endif // __WX_UNIV_TOPLEVEL_H__
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative)
+ WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow)
EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint)
END_EVENT_TABLE()
+WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow)
+
// ============================================================================
// implementation
void wxTopLevelWindow::Init()
{
m_isActive = FALSE;
+ m_windowStyle = 0;
}
bool wxTopLevelWindow::Create(wxWindow *parent,
if ( ms_drawDecorations )
{
+ CreateInputHandler(wxINP_HANDLER_TOPLEVEL);
+
styleOrig = style;
exstyleOrig = GetExtraStyle();
- style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
- wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW |
- wxTHICK_FRAME);
- style = wxSIMPLE_BORDER;
- SetExtraStyle(exstyleOrig &
- ~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP));
+// style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
+// wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW |
+// wxTHICK_FRAME);
+// style = wxSIMPLE_BORDER;
+// SetExtraStyle(exstyleOrig &
+// ~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP));
}
if ( !wxTopLevelWindowNative::Create(parent, id, title, pos,
bool wxTopLevelWindow::ShowFullScreen(bool show, long style)
{
- // VZ: doesn't compile
-#if 0
if ( show == IsFullScreen() ) return FALSE;
- return wxTopLevelWindowNative::ShowFullScreen(show, style);
-
- // FIXME_MGL -- must handle caption hiding here if not in
- // native decorations mode
-#endif // 0
+ if ( ms_drawDecorations )
+ {
+ if ( show )
+ {
+ m_fsSavedStyle = m_windowStyle;
+ if ( style & wxFULLSCREEN_NOBORDER )
+ m_windowStyle |= wxSIMPLE_BORDER;
+ if ( style & wxFULLSCREEN_NOCAPTION )
+ m_windowStyle &= ~wxCAPTION;
+ }
+ else
+ {
+ m_windowStyle = m_fsSavedStyle;
+ }
+ }
- return FALSE;
+ return wxTopLevelWindowNative::ShowFullScreen(show, style);
}
long wxTopLevelWindow::GetDecorationsStyle() const
if ( m_windowStyle & wxCAPTION )
{
- style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_CLOSE_BUTTON;
+ style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE;
if ( m_windowStyle & wxMINIMIZE_BOX )
- style |= wxTOPLEVEL_MINIMIZE_BUTTON;
+ style |= wxTOPLEVEL_BUTTON_MINIMIZE;
if ( m_windowStyle & wxMAXIMIZE_BOX )
- style |= wxTOPLEVEL_MAXIMIZE_BUTTON;
+ style |= wxTOPLEVEL_BUTTON_MAXIMIZE;
if ( m_exStyle & (wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP))
- style |= wxTOPLEVEL_HELP_BUTTON;
+ style |= wxTOPLEVEL_BUTTON_HELP;
}
if ( (m_windowStyle & (wxSIMPLE_BORDER | wxNO_BORDER)) == 0 )
style |= wxTOPLEVEL_BORDER;
style |= wxTOPLEVEL_MAXIMIZED;
if ( GetIcon().Ok() )
style |= wxTOPLEVEL_ICON;
- if ( /*m_isActive*/ 1 /* FIXME_MGL*/ )
+ if ( m_isActive )
style |= wxTOPLEVEL_ACTIVE;
return style;
{
wxImage img = bmp1.ConvertToImage();
img.Rescale(size.x, size.y);
- m_titlebarIcon.CopyFromBitmap(wxBitmap(img));
+ m_titlebarIcon.CopyFromBitmap(wxBitmap(img));
}
}
}
+
+// ----------------------------------------------------------------------------
+// actions
+// ----------------------------------------------------------------------------
+
+bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
+ long numArg,
+ const wxString& strArg)
+{
+ if ( action == wxACTION_TOPLEVEL_ACTIVATE )
+ {
+ if ( m_isActive != (bool)numArg )
+ {
+ Refresh();
+ m_isActive = (bool)numArg;
+ wxNcPaintEvent event(GetId());
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+ printf("activation: %i\n", m_isActive);
+ }
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+
+// ============================================================================
+// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
+// ============================================================================
+
+wxStdFrameInputHandler::wxStdFrameInputHandler(wxInputHandler *inphand)
+ : wxStdInputHandler(inphand)
+{
+}
+
+bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
+ const wxMouseEvent& event)
+{
+ return wxStdInputHandler::HandleMouse(consumer, event);
+}
+
+bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
+ const wxMouseEvent& event)
+{
+ return wxStdInputHandler::HandleMouseMove(consumer, event);
+}
+
+bool wxStdFrameInputHandler::HandleActivation(wxInputConsumer *consumer,
+ bool activated)
+{
+ consumer->PerformAction(wxACTION_TOPLEVEL_ACTIVATE, activated);
+ return FALSE;
+}