/////////////////////////////////////////////////////////////////////////////
-// Name: topluniv.cpp
+// Name: src/univ/topluniv.cpp
// Author: Vaclav Slavik
// Id: $Id$
// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
-#include "wx/defs.h"
+#include "wx/toplevel.h"
#ifndef WX_PRECOMP
#include "wx/dcclient.h"
#include "wx/settings.h"
+ #include "wx/bitmap.h"
+ #include "wx/image.h"
+ #include "wx/frame.h"
#endif
-#include "wx/toplevel.h"
#include "wx/univ/renderer.h"
-#include "wx/bitmap.h"
-#include "wx/image.h"
#include "wx/cshelp.h"
#include "wx/evtloop.h"
+// ----------------------------------------------------------------------------
+// wxStdTLWInputHandler: handles focus, resizing and titlebar buttons clicks
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStdTLWInputHandler : public wxStdInputHandler
+{
+public:
+ wxStdTLWInputHandler(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);
+
+private:
+ // the window (button) which has capture or NULL and the last hittest result
+ wxTopLevelWindow *m_winCapture;
+ long m_winHitTest;
+ long m_winPressed;
+ bool m_borderCursorOn;
+ wxCursor m_origCursor;
+};
+
// ----------------------------------------------------------------------------
// event tables
void wxTopLevelWindow::Init()
{
+ // once-only ms_drawDecorations initialization
+ if ( ms_drawDecorations == -1 )
+ {
+ ms_drawDecorations =
+ !wxSystemSettings::HasFeature(wxSYS_CAN_DRAW_FRAME_DECORATIONS) ||
+ wxGetEnv(wxT("WXDECOR"), NULL);
+ }
+
+ m_usingNativeDecorations = ms_drawDecorations == 0;
m_isActive = false;
m_windowStyle = 0;
m_pressedButton = 0;
long styleOrig = 0,
exstyleOrig = 0;
- if ( ms_drawDecorations == -1 )
- {
- ms_drawDecorations =
- !wxSystemSettings::HasFeature(wxSYS_CAN_DRAW_FRAME_DECORATIONS)
- || wxGetEnv(wxT("WXDECOR"), NULL);
- // FIXME -- wxUniv should provide a way to force non-native decorations!
- // $WXDECOR is just a hack in absence of better wxUniv solution
- }
-
- if ( ms_canIconize == -1 )
- {
- ms_canIconize = wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME);
- }
-
- if ( ms_drawDecorations )
+ if ( !m_usingNativeDecorations )
{
CreateInputHandler(wxINP_HANDLER_TOPLEVEL);
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));
+ wxRESIZE_BORDER);
+ style |= wxBORDER_NONE;
+ SetExtraStyle(exstyleOrig & ~wxWS_EX_CONTEXTHELP);
}
if ( !wxTopLevelWindowNative::Create(parent, id, title, pos,
size, style, name) )
return false;
- if ( ms_drawDecorations )
+ if ( !m_usingNativeDecorations )
{
m_windowStyle = styleOrig;
m_exStyle = exstyleOrig;
{
if ( show == IsFullScreen() ) return false;
- if ( ms_drawDecorations )
+ if ( !m_usingNativeDecorations )
{
if ( show )
{
return wxTopLevelWindowNative::ShowFullScreen(show, style);
}
+/* static */
+void wxTopLevelWindow::UseNativeDecorationsByDefault(bool native)
+{
+ ms_drawDecorations = !native;
+}
+
+void wxTopLevelWindow::UseNativeDecorations(bool native)
+{
+ wxASSERT_MSG( !m_windowStyle, _T("must be called before Create()") );
+
+ m_usingNativeDecorations = native;
+}
+
+bool wxTopLevelWindow::IsUsingNativeDecorations() const
+{
+ return m_usingNativeDecorations;
+}
+
long wxTopLevelWindow::GetDecorationsStyle() const
{
long style = 0;
if ( m_windowStyle & wxCAPTION )
{
+ if ( ms_canIconize == -1 )
+ {
+ ms_canIconize = wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME);
+ }
+
style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE;
if ( (m_windowStyle & wxMINIMIZE_BOX) && ms_canIconize )
style |= wxTOPLEVEL_BUTTON_ICONIZE;
style |= wxTOPLEVEL_BUTTON_MAXIMIZE;
}
#if wxUSE_HELP
- if ( m_exStyle & (wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP))
+ if ( m_exStyle & wxWS_EX_CONTEXTHELP)
style |= wxTOPLEVEL_BUTTON_HELP;
#endif
}
if ( (m_windowStyle & (wxSIMPLE_BORDER | wxNO_BORDER)) == 0 )
style |= wxTOPLEVEL_BORDER;
- if ( m_windowStyle & (wxRESIZE_BORDER | wxTHICK_FRAME) )
+ if ( m_windowStyle & (wxRESIZE_BORDER | wxRESIZE_BORDER) )
style |= wxTOPLEVEL_RESIZEABLE;
if ( IsMaximized() )
wxPoint wxTopLevelWindow::GetClientAreaOrigin() const
{
- if ( ms_drawDecorations )
+ if ( !m_usingNativeDecorations )
{
int w, h;
wxTopLevelWindowNative::DoGetClientSize(&w, &h);
void wxTopLevelWindow::DoGetClientSize(int *width, int *height) const
{
- if ( ms_drawDecorations )
+ if ( !m_usingNativeDecorations )
{
int w, h;
wxTopLevelWindowNative::DoGetClientSize(&w, &h);
void wxTopLevelWindow::DoSetClientSize(int width, int height)
{
- if ( ms_drawDecorations )
+ if ( !m_usingNativeDecorations )
{
wxSize size = m_renderer->GetFrameTotalSize(wxSize(width, height),
GetDecorationsStyle());
void wxTopLevelWindow::OnNcPaint(wxNcPaintEvent& event)
{
- if ( !ms_drawDecorations || !m_renderer )
+ if ( m_usingNativeDecorations || !m_renderer )
+ {
event.Skip();
- else
+ }
+ else // we're drawing the decorations ourselves
{
// get the window rect
- wxRect rect;
- wxSize size = GetSize();
- rect.x =
- rect.y = 0;
- rect.width = size.x;
- rect.height = size.y;
+ wxRect rect(GetSize());
wxWindowDC dc(this);
m_renderer->DrawFrameTitleBar(dc, rect,
return m_renderer->HitTestFrame(rect, pt+GetClientAreaOrigin(), GetDecorationsStyle());
}
-int wxTopLevelWindow::GetMinWidth() const
+wxSize wxTopLevelWindow::GetMinSize() const
{
- if ( ms_drawDecorations )
+ wxSize size = wxTopLevelWindowNative::GetMinSize();
+ if ( !m_usingNativeDecorations )
{
- return wxMax(wxTopLevelWindowNative::GetMinWidth(),
- m_renderer->GetFrameMinSize(GetDecorationsStyle()).x);
+ size.IncTo(m_renderer->GetFrameMinSize(GetDecorationsStyle()));
}
- else
- return wxTopLevelWindowNative::GetMinWidth();
-}
-int wxTopLevelWindow::GetMinHeight() const
-{
- if ( ms_drawDecorations )
- {
- return wxMax(wxTopLevelWindowNative::GetMinHeight(),
- m_renderer->GetFrameMinSize(GetDecorationsStyle()).y);
- }
- else
- return wxTopLevelWindowNative::GetMinHeight();
+ return size;
}
// ----------------------------------------------------------------------------
{
wxTopLevelWindowNative::SetIcons(icons);
- if ( ms_drawDecorations && m_renderer )
+ if ( !m_usingNativeDecorations && m_renderer )
{
wxSize size = m_renderer->GetFrameIconSize();
const wxIcon& icon = icons.GetIcon( size );
m_titlebarIcon = wxNullIcon;
else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y )
m_titlebarIcon = icon;
+#if wxUSE_IMAGE
else
{
wxImage img = bmp1.ConvertToImage();
img.Rescale(size.x, size.y);
m_titlebarIcon.CopyFromBitmap(wxBitmap(img));
}
+#endif // wxUSE_IMAGE
}
}
}
break;
default:
return false;
- #if 0
- // not rachable due to earlier return
- break;
- #endif
}
return true;
}
-
+
return false;
}
{
public:
wxInteractiveMoveHandler(wxInteractiveMoveData& data) : m_data(data) {}
-
+
private:
DECLARE_EVENT_TABLE()
void OnMouseMove(wxMouseEvent& event);
END_EVENT_TABLE()
-static inline LINKAGEMODE
+static inline LINKAGEMODE
void wxApplyResize(wxInteractiveMoveData& data, const wxPoint& diff)
{
if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
{
data.m_rect.height += diff.y;
}
-
+
if ( data.m_minSize.x != wxDefaultCoord && data.m_rect.width < data.m_minSize.x )
{
if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
{
wxPoint diff(wxDefaultCoord,wxDefaultCoord);
-
+
switch ( event.GetKeyCode() )
{
case WXK_UP: diff = wxPoint(0, -16); break;
m_data.m_evtLoop->Exit();
return;
}
-
+
if ( diff.x != wxDefaultCoord )
{
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
{
- m_data.m_pos = m_data.m_window->GetPosition() +
+ m_data.m_pos = m_data.m_window->GetPosition() +
wxPoint(m_data.m_window->GetSize().x/2, 8);
}
}
wxPoint warp;
bool changeCur = false;
-
+
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
{
m_data.m_rect.Offset(diff);
}
else /* wxINTERACTIVE_RESIZE */
{
- if ( !(m_data.m_flags &
+ if ( !(m_data.m_flags &
(wxINTERACTIVE_RESIZE_N | wxINTERACTIVE_RESIZE_S)) )
{
if ( diff.y < 0 )
changeCur = true;
}
}
- if ( !(m_data.m_flags &
+ if ( !(m_data.m_flags &
(wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E)) )
{
if ( diff.x < 0 )
wxASSERT_MSG( !((flags & wxINTERACTIVE_MOVE) && (flags & wxINTERACTIVE_RESIZE)),
wxT("can't move and resize window at the same time") );
- wxASSERT_MSG( !(flags & wxINTERACTIVE_RESIZE) ||
- (flags & wxINTERACTIVE_WAIT_FOR_INPUT) ||
+ wxASSERT_MSG( !(flags & wxINTERACTIVE_RESIZE) ||
+ (flags & wxINTERACTIVE_WAIT_FOR_INPUT) ||
(flags & wxINTERACTIVE_RESIZE_DIR),
wxT("direction of resizing not specified") );
wxInteractiveMoveData data;
wxEventLoop loop;
-
+
SetFocus();
-#ifndef __WXGTK__
+#ifndef __WXGTK__
if ( flags & wxINTERACTIVE_WAIT_FOR_INPUT )
{
wxCursor sizingCursor(wxCURSOR_SIZING);
void wxTopLevelWindow::OnSystemMenu(wxCommandEvent& event)
{
bool ret = true;
-
+
switch (event.GetId())
{
case wxID_CLOSE_FRAME:
default:
ret = false;
}
-
+
if ( !ret )
event.Skip();
}
+/* static */
+wxInputHandler *
+wxTopLevelWindow::GetStdInputHandler(wxInputHandler *handlerDef)
+{
+ static wxStdTLWInputHandler s_handler(handlerDef);
+
+ return &s_handler;
+}
// ============================================================================
-// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
+// wxStdTLWInputHandler: handles focus, resizing and titlebar buttons clicks
// ============================================================================
-wxStdFrameInputHandler::wxStdFrameInputHandler(wxInputHandler *inphand)
- : wxStdInputHandler(inphand)
+wxStdTLWInputHandler::wxStdTLWInputHandler(wxInputHandler *inphand)
+ : wxStdInputHandler(inphand)
{
m_winCapture = NULL;
m_winHitTest = 0;
m_borderCursorOn = false;
}
-bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
- const wxMouseEvent& event)
+bool wxStdTLWInputHandler::HandleMouse(wxInputConsumer *consumer,
+ const wxMouseEvent& event)
{
// the button has 2 states: pressed and normal with the following
// transitions between them:
return wxStdInputHandler::HandleMouse(consumer, event);
}
-bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
- const wxMouseEvent& event)
+bool wxStdTLWInputHandler::HandleMouseMove(wxInputConsumer *consumer,
+ const wxMouseEvent& event)
{
if ( event.GetEventObject() == m_winCapture )
{
return wxStdInputHandler::HandleMouseMove(consumer, event);
}
-bool wxStdFrameInputHandler::HandleActivation(wxInputConsumer *consumer,
- bool activated)
+bool wxStdTLWInputHandler::HandleActivation(wxInputConsumer *consumer,
+ bool activated)
{
if ( m_borderCursorOn )
{