]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/winuniv.cpp
generate middle click events (patch 1521314)
[wxWidgets.git] / src / univ / winuniv.cpp
index 21deb2f067bb454b3a4ccb647df41d6cdff763c7..a62dbdc55fe9164cadbf405388ae0849d271323c 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        univ/window.cpp
+// Name:        src/univ/window.cpp
 // Purpose:     implementation of extra wxWindow methods for wxUniv port
 // Author:      Vadim Zeitlin
 // Modified by:
 // headers
 // ---------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "univwindow.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #pragma hdrstop
 #endif
 
+#include "wx/window.h"
+
 #ifndef WX_PRECOMP
     #include "wx/app.h"
-    #include "wx/window.h"
     #include "wx/dcclient.h"
     #include "wx/dcmemory.h"
     #include "wx/event.h"
     #include "wx/scrolbar.h"
     #include "wx/menu.h"
     #include "wx/frame.h"
+    #include "wx/log.h"
 #endif // WX_PRECOMP
 
-#include "wx/log.h"
 #include "wx/univ/colschem.h"
 #include "wx/univ/renderer.h"
 #include "wx/univ/theme.h"
@@ -103,8 +100,10 @@ END_EVENT_TABLE()
 
 void wxWindow::Init()
 {
+#if wxUSE_SCROLLBAR
     m_scrollbarVert =
     m_scrollbarHorz = (wxScrollBar *)NULL;
+#endif // wxUSE_SCROLLBAR
 
     m_isCurrent = false;
 
@@ -122,13 +121,13 @@ bool wxWindow::Create(wxWindow *parent,
                       const wxString& name)
 {
     long actualStyle = style;
-    
+
     // FIXME: may need this on other platforms
 #ifdef __WXMSW__
     actualStyle &= ~wxVSCROLL;
     actualStyle &= ~wxHSCROLL;
-#endif    
-    
+#endif
+
     // we add wxCLIP_CHILDREN to get the same ("natural") behaviour under MSW
     // as under the other platforms
     if ( !wxWindowNative::Create(parent, id, pos, size,
@@ -142,43 +141,61 @@ bool wxWindow::Create(wxWindow *parent,
     // when calling the base window Create().
     wxWindowBase::SetWindowStyleFlag(style);
 
-    // if we should always have a vertical scrollbar, do show it
-    if ( style & wxALWAYS_SHOW_SB )
+    // if we allow or should always have a vertical scrollbar, make it
+    if ( style & wxVSCROLL || style & wxALWAYS_SHOW_SB )
     {
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( true );
 #endif
+#if wxUSE_SCROLLBAR
         m_scrollbarVert = new wxScrollBar(this, wxID_ANY,
                                           wxDefaultPosition, wxDefaultSize,
                                           wxSB_VERTICAL);
+#endif // wxUSE_SCROLLBAR
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( false );
 #endif
     }
 
-    // if we should always have a horizontal scrollbar, do show it
+    // if we should allow a horizontal scrollbar, make it
     if ( style & wxHSCROLL )
     {
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( true );
 #endif
+#if wxUSE_SCROLLBAR
         m_scrollbarHorz = new wxScrollBar(this, wxID_ANY,
                                           wxDefaultPosition, wxDefaultSize,
                                           wxSB_HORIZONTAL);
+#endif // wxUSE_SCROLLBAR
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( false );
 #endif
     }
-    
+
+#if wxUSE_SCROLLBAR
     if (m_scrollbarHorz || m_scrollbarVert)
     {
         // position it/them
         PositionScrollbars();
     }
+#endif // wxUSE_SCROLLBAR
 
     return true;
 }
 
+wxWindow::~wxWindow()
+{
+    m_isBeingDeleted = true;
+
+    // we have to destroy our children before we're destroyed because our
+    // children suppose that we're of type wxWindow, not just wxWindowNative,
+    // and so bad things may happen if they're deleted from the base class dtor
+    // as by then we're not a wxWindow any longer and wxUniv-specific virtual
+    // functions can't be called
+    DestroyChildren();
+}
+
 // ----------------------------------------------------------------------------
 // background pixmap
 // ----------------------------------------------------------------------------
@@ -216,13 +233,9 @@ void wxWindow::OnNcPaint(wxNcPaintEvent& WXUNUSED(event))
     if ( m_renderer )
     {
         // 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());
 
+#if wxUSE_SCROLLBAR
         // if the scrollbars are outside the border, we must adjust the rect to
         // exclude them
         if ( !m_renderer->AreScrollbarsInsideBorder() )
@@ -235,6 +248,7 @@ void wxWindow::OnNcPaint(wxNcPaintEvent& WXUNUSED(event))
             if ( scrollbar )
                 rect.height -= scrollbar->GetSize().y;
         }
+#endif // wxUSE_SCROLLBAR
 
         // get the DC and draw the border on it
         wxWindowDC dc(this);
@@ -272,6 +286,7 @@ void wxWindow::OnErase(wxEraseEvent& event)
 
     DoDrawBackground(*event.GetDC());
 
+#if wxUSE_SCROLLBAR
     // if we have both scrollbars, we also have a square in the corner between
     // them which we must paint
     if ( m_scrollbarVert && m_scrollbarHorz )
@@ -291,6 +306,7 @@ void wxWindow::OnErase(wxEraseEvent& event)
             m_renderer->DrawScrollCorner(*event.GetDC(), rectCorner);
         }
     }
+#endif // wxUSE_SCROLLBAR
 }
 
 bool wxWindow::DoDrawBackground(wxDC& dc)
@@ -304,7 +320,7 @@ bool wxWindow::DoDrawBackground(wxDC& dc)
     rect.height = size.y;
 
     wxWindow * const parent = GetParent();
-    if ( HasTransparentBackground() && parent && parent->ProvidesBackground() )
+    if ( HasTransparentBackground() && parent )
     {
         wxASSERT( !IsTopLevel() );
 
@@ -331,7 +347,7 @@ bool wxWindow::DoDrawBackground(wxDC& dc)
     }
     else
     {
-        // Draw background ouselves
+        // Draw background ourselves
         EraseBackground( dc, rect );
     }
 
@@ -426,11 +442,11 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient)
     while ( node )
     {
         wxWindow *win = node->GetData();
-        // Only refresh sub controls when it is visible 
+        // Only refresh sub controls when it is visible
         // and when it is in the update region.
         if(!win->IsKindOf(CLASSINFO(wxTopLevelWindow)) && win->IsShown() && wxRegion(rectWin).Contains(win->GetRect()) != wxOutRegion)
             win->Refresh(eraseBackground, &rectWin);
-            
+
         node = node->GetNext();
     }
 }
@@ -462,8 +478,7 @@ bool wxWindow::Enable(bool enable)
 
 bool wxWindow::IsFocused() const
 {
-    wxWindow *self = wxConstCast(this, wxWindow);
-    return self->FindFocus() == self;
+    return FindFocus() == this;
 }
 
 bool wxWindow::IsPressed() const
@@ -525,10 +540,12 @@ void wxWindow::OnSize(wxSizeEvent& event)
 {
     event.Skip();
 
+#if wxUSE_SCROLLBAR
     if ( m_scrollbarVert || m_scrollbarHorz )
     {
         PositionScrollbars();
     }
+#endif // wxUSE_SCROLLBAR
 
 #if 0   // ndef __WXMSW__
     // Refresh the area (strip) previously occupied by the border
@@ -689,13 +706,19 @@ void wxWindow::DoGetClientSize(int *width, int *height) const
 
     if ( width )
     {
+#if wxUSE_SCROLLBAR
         // in any case, take account of the scrollbar
         if ( m_scrollbarVert )
             w -= m_scrollbarVert->GetSize().x;
+#endif // wxUSE_SCROLLBAR
 
         // if we don't have scrollbar or if it is outside the border (and not
         // blended into it), take account of the right border as well
-        if ( !m_scrollbarVert || inside )
+        if (
+#if wxUSE_SCROLLBAR
+             !m_scrollbarVert ||
+#endif // wxUSE_SCROLLBAR
+             inside )
             w -= rectBorder.width;
 
         // and always account for the left border
@@ -708,10 +731,16 @@ void wxWindow::DoGetClientSize(int *width, int *height) const
 
     if ( height )
     {
+#if wxUSE_SCROLLBAR
         if ( m_scrollbarHorz )
             h -= m_scrollbarHorz->GetSize().y;
+#endif // wxUSE_SCROLLBAR
 
-        if ( !m_scrollbarHorz || inside )
+        if (
+#if wxUSE_SCROLLBAR
+            !m_scrollbarHorz ||
+#endif // wxUSE_SCROLLBAR
+            inside )
             h -= rectBorder.height;
 
         *height = h - rectBorder.y;
@@ -734,14 +763,26 @@ void wxWindow::DoSetClientSize(int width, int height)
     // had been called before)
     bool inside = m_renderer->AreScrollbarsInsideBorder();
     wxSize size = GetSize();
+#if wxUSE_SCROLLBAR
     if ( m_scrollbarVert )
         width += size.x - m_scrollbarVert->GetPosition().x;
-    if ( !m_scrollbarVert || inside )
+#endif // wxUSE_SCROLLBAR
+    if (
+#if wxUSE_SCROLLBAR
+        !m_scrollbarVert ||
+#endif // wxUSE_SCROLLBAR
+        inside )
         width += rectBorder.width;
 
+#if wxUSE_SCROLLBAR
     if ( m_scrollbarHorz )
         height += size.y - m_scrollbarHorz->GetPosition().y;
-    if ( !m_scrollbarHorz || inside )
+#endif // wxUSE_SCROLLBAR
+    if (
+#if wxUSE_SCROLLBAR
+        !m_scrollbarHorz ||
+#endif // wxUSE_SCROLLBAR
+        inside )
         height += rectBorder.height;
 
     wxWindowNative::DoSetClientSize(width, height);
@@ -750,6 +791,8 @@ void wxWindow::DoSetClientSize(int width, int height)
 wxHitTest wxWindow::DoHitTest(wxCoord x, wxCoord y) const
 {
     wxHitTest ht = wxWindowNative::DoHitTest(x, y);
+
+#if wxUSE_SCROLLBAR
     if ( ht == wxHT_WINDOW_INSIDE )
     {
         if ( m_scrollbarVert && x >= m_scrollbarVert->GetPosition().x )
@@ -764,6 +807,7 @@ wxHitTest wxWindow::DoHitTest(wxCoord x, wxCoord y) const
                                                   : wxHT_WINDOW_HORZ_SCROLLBAR;
         }
     }
+#endif // wxUSE_SCROLLBAR
 
     return ht;
 }
@@ -776,15 +820,18 @@ wxHitTest wxWindow::DoHitTest(wxCoord x, wxCoord y) const
 
 void wxWindow::RefreshScrollbars()
 {
+#if wxUSE_SCROLLBAR
     if ( m_scrollbarHorz )
         m_scrollbarHorz->Refresh();
 
     if ( m_scrollbarVert )
         m_scrollbarVert->Refresh();
+#endif // wxUSE_SCROLLBAR
 }
 
 void wxWindow::PositionScrollbars()
 {
+#if wxUSE_SCROLLBAR
     // do not use GetClientSize/Rect as it relies on the scrollbars being
     // correctly positioned
 
@@ -830,6 +877,7 @@ void wxWindow::PositionScrollbars()
     }
 
     RefreshScrollbars();
+#endif // wxUSE_SCROLLBAR
 }
 
 void wxWindow::SetScrollbar(int orient,
@@ -838,6 +886,7 @@ void wxWindow::SetScrollbar(int orient,
                             int range,
                             bool refresh)
 {
+#if wxUSE_SCROLLBAR
     wxASSERT_MSG( pageSize <= range,
                     _T("page size can't be greater than range") );
 
@@ -918,14 +967,22 @@ void wxWindow::SetScrollbar(int orient,
         (void)GetEventHandler()->ProcessEvent(event);
 #endif
     }
+#else
+    wxUnusedVar(orient);
+    wxUnusedVar(pos);
+    wxUnusedVar(pageSize);
+    wxUnusedVar(range);
+    wxUnusedVar(refresh);
+#endif // wxUSE_SCROLLBAR
 }
 
 void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
 {
+#if wxUSE_SCROLLBAR
     wxScrollBar *scrollbar = GetScrollbar(orient);
-    wxCHECK_RET( scrollbar, _T("no scrollbar to set position for") );
 
-    scrollbar->SetThumbPosition(pos);
+    if (scrollbar)
+        scrollbar->SetThumbPosition(pos);
 
     // VZ: I think we can safely ignore this as we always refresh it
     //     automatically whenever the value chanegs
@@ -933,24 +990,43 @@ void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
     if ( refresh )
         Refresh();
 #endif
+#else
+    wxUnusedVar(orient);
+    wxUnusedVar(pos);
+#endif // wxUSE_SCROLLBAR
 }
 
 int wxWindow::GetScrollPos(int orient) const
 {
+#if wxUSE_SCROLLBAR
     wxScrollBar *scrollbar = GetScrollbar(orient);
     return scrollbar ? scrollbar->GetThumbPosition() : 0;
+#else
+    wxUnusedVar(orient);
+    return 0;
+#endif // wxUSE_SCROLLBAR
 }
 
 int wxWindow::GetScrollThumb(int orient) const
 {
+#if wxUSE_SCROLLBAR
     wxScrollBar *scrollbar = GetScrollbar(orient);
     return scrollbar ? scrollbar->GetThumbSize() : 0;
+#else
+    wxUnusedVar(orient);
+    return 0;
+#endif // wxUSE_SCROLLBAR
 }
 
 int wxWindow::GetScrollRange(int orient) const
 {
+#if wxUSE_SCROLLBAR
     wxScrollBar *scrollbar = GetScrollbar(orient);
     return scrollbar ? scrollbar->GetRange() : 0;
+#else
+    wxUnusedVar(orient);
+    return 0;
+#endif // wxUSE_SCROLLBAR
 }
 
 void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
@@ -987,8 +1063,10 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
          node; node = node->GetNext())
     {
         wxWindow *child = node->GetData();
+#if wxUSE_SCROLLBAR
         if ( child == m_scrollbarVert || child == m_scrollbarHorz )
             continue;
+#endif // wxUSE_SCROLLBAR
 
         // VS: Scrolling children has non-trivial semantics. If rect=NULL then
         //     it is easy: we scroll all children. Otherwise it gets
@@ -1100,12 +1178,12 @@ wxRect wxWindow::ScrollNoRefresh(int dx, int dy, const wxRect *rectTotal)
         wxMemoryDC dcMem;
         dcMem.SelectObject(bmp);
 
-        dcMem.Blit(wxPoint(0, 0), size, &dc, ptSource
+        dcMem.Blit(wxPoint(0,0), size, &dc, ptSource
 #if defined(__WXGTK__) && !defined(wxHAS_WORKING_GTK_DC_BLIT)
                 + GetClientAreaOrigin()
 #endif // broken wxGTK wxDC::Blit
                   );
-        dc.Blit(ptDest, size, &dcMem, wxPoint(0, 0));
+        dc.Blit(ptDest, size, &dcMem, wxPoint(0,0));
 
         wxLogTrace(_T("scroll"),
                    _T("Blit: (%d, %d) of size %dx%d -> (%d, %d)"),
@@ -1189,7 +1267,7 @@ void wxWindow::OnKeyDown(wxKeyEvent& event)
 {
 #if wxUSE_MENUS
     int key = event.GetKeyCode();
-    if ( !event.ControlDown() && (key == WXK_MENU || key == WXK_F10) )
+    if ( !event.ControlDown() && (key == WXK_ALT || key == WXK_F10) )
     {
         ms_winLastAltPress = this;
 
@@ -1306,7 +1384,7 @@ void wxWindow::OnChar(wxKeyEvent& event)
 void wxWindow::OnKeyUp(wxKeyEvent& event)
 {
     int key = event.GetKeyCode();
-    if ( !event.HasModifiers() && (key == WXK_MENU || key == WXK_F10) )
+    if ( !event.HasModifiers() && (key == WXK_ALT || key == WXK_F10) )
     {
         // only process Alt release specially if there were no other key
         // presses since Alt had been pressed and if both events happened in
@@ -1356,4 +1434,3 @@ WXLRESULT wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPar
 }
 
 #endif // __WXMSW__
-