]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/window.cpp
added wxUSE_NOTEBOOK to include/wx/msw/setup0.h, removed wxUSE_RADIOBUTTON (we
[wxWidgets.git] / src / mac / window.cpp
index 18ab38338affebb05e738ede0f61c16741bcfddd..cae38465c2c7b09522f9a1beb88497958f450b8d 100644 (file)
 #include "wx/menuitem.h"
 #include "wx/log.h"
 
 #include "wx/menuitem.h"
 #include "wx/log.h"
 
+#if wxUSE_CARET
+    #include "wx/caret.h"
+#endif // wxUSE_CARET
+
 #define wxWINDOW_HSCROLL 5998
 #define wxWINDOW_VSCROLL 5997
 #define MAC_SCROLLBAR_SIZE 16
 #define wxWINDOW_HSCROLL 5998
 #define wxWINDOW_VSCROLL 5997
 #define MAC_SCROLLBAR_SIZE 16
@@ -50,7 +54,6 @@
 extern wxList wxPendingDelete;
 wxWindow* gFocusWindow = NULL ;
 
 extern wxList wxPendingDelete;
 wxWindow* gFocusWindow = NULL ;
 
-#if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
 
 BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
 IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
 
 BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
@@ -58,9 +61,9 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
   EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
   EVT_INIT_DIALOG(wxWindow::OnInitDialog)
   EVT_IDLE(wxWindow::OnIdle)
   EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
   EVT_INIT_DIALOG(wxWindow::OnInitDialog)
   EVT_IDLE(wxWindow::OnIdle)
+//  EVT_SCROLL(wxWindow::OnScroll)
 END_EVENT_TABLE()
 
 END_EVENT_TABLE()
 
-#endif
 
 
 
 
 
 
@@ -197,25 +200,45 @@ void wxWindow::SetFocus()
        {
                if (gFocusWindow )
                {
        {
                if (gFocusWindow )
                {
+                       #if wxUSE_CARET
+                           // Deal with caret
+                           if ( gFocusWindow->m_caret )
+                           {
+                                 gFocusWindow->m_caret->OnKillFocus();
+                           }
+                       #endif // wxUSE_CARET
                        wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
                        if ( control && control->GetMacControl() )
                        {
                                UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlFocusNoPart ) ;
                        }
                        wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
                        if ( control && control->GetMacControl() )
                        {
                                UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlFocusNoPart ) ;
                        }
-           wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
-           event.SetEventObject(gFocusWindow);
+               wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
+               event.SetEventObject(gFocusWindow);
                        gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
                }
                gFocusWindow = this ;
                {
                        gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
                }
                gFocusWindow = this ;
                {
+                       #if wxUSE_CARET
+                   // Deal with caret
+                   if ( m_caret )
+                   {
+                       m_caret->OnSetFocus();
+                   }
+                       #endif // wxUSE_CARET
+                       // panel wants to track the window which was the last to have focus in it
+               wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
+               if ( panel )
+               {
+                       panel->SetLastFocus(this);
+               }
                        wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
                        if ( control && control->GetMacControl() )
                        {
                                UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlEditTextPart ) ;
                        }
 
                        wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
                        if ( control && control->GetMacControl() )
                        {
                                UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlEditTextPart ) ;
                        }
 
-           wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
-           event.SetEventObject(this);
+               wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
+               event.SetEventObject(this);
                        GetEventHandler()->ProcessEvent(event) ;
                }
        }
                        GetEventHandler()->ProcessEvent(event) ;
                }
        }
@@ -295,6 +318,34 @@ void wxWindow::DoGetPosition(int *x, int *y) const
     }
 }
 
     }
 }
 
+wxSize wxWindow::DoGetBestSize()
+{
+       return wxSize( 0 , 0 ) ;
+}
+
+bool wxWindow::Reparent(wxWindow *parent)
+{
+    if ( !wxWindowBase::Reparent(parent) )
+        return FALSE;
+
+    return TRUE;
+}
+
+bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
+{
+       menu->SetInvokingWindow(this);
+    menu->UpdateUI();
+       ClientToScreen( &x , &y ) ;
+
+       ::InsertMenu( menu->GetHMenu() , -1 ) ;
+       long menuResult = ::PopUpMenuSelect(menu->GetHMenu() ,y,x, 0) ;
+       menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ;
+       ::DeleteMenu( menu->MacGetMenuId() ) ;
+       menu->SetInvokingWindow(NULL);
+
+  return TRUE;
+}
+
 void wxWindow::DoScreenToClient(int *x, int *y) const
 {
        WindowRef window = GetMacRootWindow() ;
 void wxWindow::DoScreenToClient(int *x, int *y) const
 {
        WindowRef window = GetMacRootWindow() ;
@@ -401,6 +452,28 @@ void wxWindow::DoGetClientSize(int *x, int *y) const
        (*y) -= MAC_SCROLLBAR_SIZE;
 }
 
        (*y) -= MAC_SCROLLBAR_SIZE;
 }
 
+
+// ----------------------------------------------------------------------------
+// tooltips
+// ----------------------------------------------------------------------------
+
+#if wxUSE_TOOLTIPS
+
+void wxWindow::DoSetToolTip(wxToolTip *tooltip)
+{
+    wxWindowBase::DoSetToolTip(tooltip);
+
+//    if ( m_tooltip )
+//        m_tooltip->SetWindow(this);
+}
+
+#endif // wxUSE_TOOLTIPS
+
+void wxWindow::DoMoveWindow(int x, int y, int width, int height)
+{
+       DoSetSize( x,y, width, height ) ;
+}
+
 void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
        int former_x = m_x ;
 void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
        int former_x = m_x ;
@@ -601,17 +674,14 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
     const wxFont *fontToUse = theFont;
     if ( !fontToUse )
         fontToUse = &m_font;
     const wxFont *fontToUse = theFont;
     if ( !fontToUse )
         fontToUse = &m_font;
-/*
-    if ( x )
-        *x = sizeRect.cx;
-    if ( y )
-        *y = sizeRect.cy;
-    if ( descent )
-        *descent = tm.tmDescent;
-    if ( externalLeading )
-        *externalLeading = tm.tmExternalLeading;
-*/
-
+        
+    wxClientDC dc( this ) ;
+    long lx,ly,ld,le ;
+    dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ;
+    *externalLeading = le ;
+    *descent = ld ;
+    *x = lx ;
+    *y = ly ;
 }
 
 void wxWindow::MacEraseBackground( Rect *rect )
 }
 
 void wxWindow::MacEraseBackground( Rect *rect )
@@ -790,7 +860,6 @@ void wxWindow::WarpPointer (int x_pos, int y_pos)
 void wxWindow::OnEraseBackground(wxEraseEvent& event)
 {
     // TODO : probably we would adopt the EraseEvent structure
 void wxWindow::OnEraseBackground(wxEraseEvent& event)
 {
     // TODO : probably we would adopt the EraseEvent structure
-    Default();
 }
 
 int wxWindow::GetScrollPos(int orient) const
 }
 
 int wxWindow::GetScrollPos(int orient) const
@@ -918,6 +987,51 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
        }
 }
 
        }
 }
 
+void wxWindow::MacOnScroll(wxScrollEvent &event )
+{
+       if ( event.m_eventObject == m_vScrollBar || event.m_eventObject == m_hScrollBar )
+       {
+           wxScrollWinEvent wevent;
+           wevent.SetPosition(event.GetPosition());
+           wevent.SetOrientation(event.GetOrientation());
+           wevent.m_eventObject = this;
+       
+           switch ( event.m_eventType )
+           {
+           case wxEVT_SCROLL_TOP:
+               wevent.m_eventType = wxEVT_SCROLLWIN_TOP;
+               break;
+       
+           case wxEVT_SCROLL_BOTTOM:
+               wevent.m_eventType = wxEVT_SCROLLWIN_BOTTOM;
+               break;
+       
+           case wxEVT_SCROLL_LINEUP:
+               wevent.m_eventType = wxEVT_SCROLLWIN_LINEUP;
+               break;
+       
+           case wxEVT_SCROLL_LINEDOWN:
+               wevent.m_eventType = wxEVT_SCROLLWIN_LINEDOWN;
+               break;
+       
+           case wxEVT_SCROLL_PAGEUP:
+               wevent.m_eventType = wxEVT_SCROLLWIN_PAGEUP;
+               break;
+       
+           case wxEVT_SCROLL_PAGEDOWN:
+               wevent.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN;
+               break;
+       
+           case wxEVT_SCROLL_THUMBTRACK:
+               wevent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
+               break;
+       
+           }
+               
+           GetEventHandler()->ProcessEvent(wevent);
+    }
+}
+
 bool wxWindow::SetFont(const wxFont& font)
 {
     if ( !wxWindowBase::SetFont(font) )
 bool wxWindow::SetFont(const wxFont& font)
 {
     if ( !wxWindowBase::SetFont(font) )
@@ -1256,6 +1370,9 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time)
                if ( focus.Ok() )
                {
                        WindowRef window = GetMacRootWindow() ;
                if ( focus.Ok() )
                {
                        WindowRef window = GetMacRootWindow() ;
+                       bool eraseBackground = false ;
+                       if ( m_macWindowData )
+                               eraseBackground = true ;
                        if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
                        {
                                        UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ;
                        if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
                        {
                                        UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ;
@@ -1282,13 +1399,13 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time)
                                                        if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
                                                        {
                                                                // if we have any other colours in the hierarchy
                                                        if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
                                                        {
                                                                // if we have any other colours in the hierarchy
-                                                       RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
-                                                       break ;
+                                                               RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
+                                                               break ;
                                                        }
                                                        // if we have the normal colours in the hierarchy but another control etc. -> use it's background
                                                        if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
                                                        {
                                                        }
                                                        // if we have the normal colours in the hierarchy but another control etc. -> use it's background
                                                        if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
                                                        {
-                                                               ApplyThemeBackground                    (kThemeBackgroundTabPane, &(**updatergn).rgnBBox , kThemeStateActive,8,true);
+                                                               ApplyThemeBackground(kThemeBackgroundTabPane, &(**updatergn).rgnBBox , kThemeStateActive,8,true);
                                                                break ;
                                                        }
                                                }
                                                                break ;
                                                        }
                                                }
@@ -1309,8 +1426,13 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time)
                        {
                                RGBBackColor( &m_backgroundColour.GetPixel()) ;
                        }
                        {
                                RGBBackColor( &m_backgroundColour.GetPixel()) ;
                        }
+                       if ( GetParent() && m_backgroundColour != GetParent()->GetBackgroundColour() )
+                               eraseBackground = true ;
                        SetClip( updatergn ) ;
                        SetClip( updatergn ) ;
-                       EraseRgn( updatergn ) ; 
+                       if ( eraseBackground )
+                       {
+                               EraseRgn( updatergn ) ; 
+                       }
                }
        }
 
                }
        }
 
@@ -1428,12 +1550,15 @@ void wxWindow::MacCreateScrollBars( long style )
        {
                m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, wxPoint(m_width-MAC_SCROLLBAR_SIZE, 0), 
                        wxSize(MAC_SCROLLBAR_SIZE, m_height - adjust), wxVERTICAL);
        {
                m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, wxPoint(m_width-MAC_SCROLLBAR_SIZE, 0), 
                        wxSize(MAC_SCROLLBAR_SIZE, m_height - adjust), wxVERTICAL);
+//             m_vScrollBar->PushEventHandler( this ) ;
        }
        if ( style  & wxHSCROLL )
        {
                m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, wxPoint(0 , m_height-MAC_SCROLLBAR_SIZE ), 
                        wxSize( m_width - adjust, MAC_SCROLLBAR_SIZE), wxHORIZONTAL);
        }
        if ( style  & wxHSCROLL )
        {
                m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, wxPoint(0 , m_height-MAC_SCROLLBAR_SIZE ), 
                        wxSize( m_width - adjust, MAC_SCROLLBAR_SIZE), wxHORIZONTAL);
+//             m_hScrollBar->PushEventHandler( this ) ;
        }
        }
+       
        // because the create does not take into account the client area origin
        MacRepositionScrollBars() ; // we might have a real position shift
 }
        // because the create does not take into account the client area origin
        MacRepositionScrollBars() ; // we might have a real position shift
 }
@@ -1458,7 +1583,10 @@ void wxWindow::MacKeyDown( EventRecord *ev )
 }
 
 
 }
 
 
-
+bool wxWindow::AcceptsFocus() const
+{
+    return MacCanFocus() && wxWindowBase::AcceptsFocus();
+}
 
 ControlHandle wxWindow::MacGetContainerForEmbedding() 
 {
 
 ControlHandle wxWindow::MacGetContainerForEmbedding() 
 {
@@ -1764,13 +1892,3 @@ wxMacDrawingClientHelper::~wxMacDrawingClientHelper()
        if ( m_formerPort != m_currentPort )
                SetPort( m_formerPort ) ;
 }
        if ( m_formerPort != m_currentPort )
                SetPort( m_formerPort ) ;
 }
-
-// ----------------------------------------------------------------------------
-// list classes implementation
-// ----------------------------------------------------------------------------
-
-void wxWindowListNode::DeleteData()
-{
-    delete (wxWindow *)GetData();
-}
-