The mmedia contrib requires sys/soundcard.h on unix, so disable it on unix
[wxWidgets.git] / src / univ / framuniv.cpp
index 19b2c610cb47ae582c0c169da08ee2a820fdba95..7f179b0eeed275ea678e5735f7168db5c242ca2d 100644 (file)
@@ -17,7 +17,7 @@
 // headers
 // ---------------------------------------------------------------------------
 
 // headers
 // ---------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "univframe.h"
 #endif
 
     #pragma implementation "univframe.h"
 #endif
 
@@ -32,6 +32,8 @@
 #ifndef WX_PRECOMP
     #include "wx/frame.h"
     #include "wx/statusbr.h"
 #ifndef WX_PRECOMP
     #include "wx/frame.h"
     #include "wx/statusbr.h"
+    #include "wx/settings.h"
+    #include "wx/toolbar.h"
 #endif // WX_PRECOMP
 
 // ============================================================================
 #endif // WX_PRECOMP
 
 // ============================================================================
@@ -40,6 +42,7 @@
 
 BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
     EVT_SIZE(wxFrame::OnSize)
 
 BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
     EVT_SIZE(wxFrame::OnSize)
+    EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow)
@@ -56,9 +59,22 @@ bool wxFrame::Create(wxWindow *parent,
                 long style,
                 const wxString& name)
 {
                 long style,
                 const wxString& name)
 {
-    return wxTopLevelWindow::Create(parent, id, title, pos, size, style, name);
+    if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) )
+        return false;
+
+    SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
+
+    return true;
 }
 
 }
 
+// Responds to colour changes, and passes event on to children.
+void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event)
+{
+    SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
+    Refresh();
+
+    event.Skip();
+}
 
 // ----------------------------------------------------------------------------
 // menu support
 
 // ----------------------------------------------------------------------------
 // menu support
@@ -72,12 +88,15 @@ void wxFrame::OnSize(wxSizeEvent& event)
 #if wxUSE_STATUSBAR
     PositionStatusBar();
 #endif // wxUSE_STATUSBAR
 #if wxUSE_STATUSBAR
     PositionStatusBar();
 #endif // wxUSE_STATUSBAR
+#if wxUSE_TOOLBAR
+    PositionToolBar();
+#endif // wxUSE_TOOLBAR
 
     event.Skip();
 }
 
 void wxFrame::SendSizeEvent()
 
     event.Skip();
 }
 
 void wxFrame::SendSizeEvent()
-{    
+{
     wxSizeEvent event(GetSize(), GetId());
     event.SetEventObject(this);
     GetEventHandler()->ProcessEvent(event);
     wxSizeEvent event(GetSize(), GetId());
     event.SetEventObject(this);
     GetEventHandler()->ProcessEvent(event);
@@ -92,7 +111,21 @@ void wxFrame::PositionMenuBar()
         // the menubar is positioned above the client size, hence the negative
         // y coord
         wxCoord heightMbar = m_frameMenuBar->GetSize().y;
         // the menubar is positioned above the client size, hence the negative
         // y coord
         wxCoord heightMbar = m_frameMenuBar->GetSize().y;
-        m_frameMenuBar->SetSize(0, -heightMbar,
+
+        wxCoord heightTbar = 0;
+
+#if wxUSE_TOOLBAR
+        if ( m_frameToolBar )
+            heightTbar = m_frameToolBar->GetSize().y;
+#endif // wxUSE_TOOLBAR
+
+        m_frameMenuBar->SetSize(0,
+#ifdef __WXPM__   // FIXME -- remove this, make wxOS2/Univ behave as
+                 //          the rest of the world!!!
+                                GetClientSize().y - heightMbar - heightTbar,
+#else
+                                - (heightMbar + heightTbar),
+#endif
                                 GetClientSize().x, heightMbar);
     }
 }
                                 GetClientSize().x, heightMbar);
     }
 }
@@ -117,9 +150,8 @@ void wxFrame::PositionStatusBar()
 {
     if ( m_frameStatusBar )
     {
 {
     if ( m_frameStatusBar )
     {
-        wxCoord heightBar = m_frameStatusBar->GetSize().y;
-        m_frameStatusBar->SetSize(0, GetClientSize().y,
-                                  GetClientSize().x, heightBar);
+        wxSize size = GetClientSize();
+        m_frameStatusBar->SetSize(0, size.y, size.x, wxDefaultCoord);
     }
 }
 
     }
 }
 
@@ -133,17 +165,64 @@ wxStatusBar* wxFrame::CreateStatusBar(int number, long style,
 
 #endif // wxUSE_STATUSBAR
 
 
 #endif // wxUSE_STATUSBAR
 
+#if wxUSE_TOOLBAR
+
+wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name)
+{
+    if ( wxFrameBase::CreateToolBar(style, id, name) )
+    {
+        PositionToolBar();
+    }
+
+    return m_frameToolBar;
+}
+
+void wxFrame::PositionToolBar()
+{
+    if ( m_frameToolBar )
+    {
+        wxSize size = GetClientSize();
+        int tw, th, tx, ty;
+
+        tx = ty = 0;
+        m_frameToolBar->GetSize(&tw, &th);
+        if ( m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL )
+        {
+            tx = -tw;
+            th = size.y;
+        }
+        else
+        {
+            ty = -th;
+            tw = size.x;
+        }
+
+        m_frameToolBar->SetSize(tx, ty, tw, th);
+    }
+}
+#endif // wxUSE_TOOLBAR
+
 wxPoint wxFrame::GetClientAreaOrigin() const
 {
     wxPoint pt = wxFrameBase::GetClientAreaOrigin();
 
 wxPoint wxFrame::GetClientAreaOrigin() const
 {
     wxPoint pt = wxFrameBase::GetClientAreaOrigin();
 
-#if wxUSE_MENUS
+#if wxUSE_MENUS && !defined(__WXPM__)
     if ( m_frameMenuBar )
     {
         pt.y += m_frameMenuBar->GetSize().y;
     }
 #endif // wxUSE_MENUS
 
     if ( m_frameMenuBar )
     {
         pt.y += m_frameMenuBar->GetSize().y;
     }
 #endif // wxUSE_MENUS
 
+#if wxUSE_TOOLBAR
+    if ( m_frameToolBar )
+    {
+        if ( m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL )
+            pt.x += m_frameToolBar->GetSize().x;
+        else
+            pt.y += m_frameToolBar->GetSize().y;
+    }
+#endif // wxUSE_TOOLBAR
+
     return pt;
 }
 
     return pt;
 }
 
@@ -164,6 +243,16 @@ void wxFrame::DoGetClientSize(int *width, int *height) const
         (*height) -= m_frameStatusBar->GetSize().y;
     }
 #endif // wxUSE_STATUSBAR
         (*height) -= m_frameStatusBar->GetSize().y;
     }
 #endif // wxUSE_STATUSBAR
+
+#if wxUSE_TOOLBAR
+    if ( m_frameToolBar )
+    {
+        if ( width && (m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL) )
+            (*width) -= m_frameToolBar->GetSize().x;
+        else if ( height )
+            (*height) -= m_frameToolBar->GetSize().y;
+    }
+#endif // wxUSE_TOOLBAR
 }
 
 void wxFrame::DoSetClientSize(int width, int height)
 }
 
 void wxFrame::DoSetClientSize(int width, int height)
@@ -182,16 +271,73 @@ void wxFrame::DoSetClientSize(int width, int height)
     }
 #endif // wxUSE_STATUSBAR
 
     }
 #endif // wxUSE_STATUSBAR
 
+#if wxUSE_TOOLBAR
+    if ( m_frameToolBar )
+    {
+#if wxUSE_STATUSBAR
+        height += m_frameStatusBar->GetSize().y;
+#endif // wxUSE_STATUSBAR
+
+        if ( m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL )
+            width += m_frameToolBar->GetSize().x;
+        else
+            height += m_frameToolBar->GetSize().y;
+    }
+#endif // wxUSE_TOOLBAR
+
     wxFrameBase::DoSetClientSize(width, height);
 }
 
     wxFrameBase::DoSetClientSize(width, height);
 }
 
+int wxFrame::GetMinWidth() const
+{
+#if wxUSE_MENUS
+    if ( m_frameMenuBar )
+    {
+        return wxMax(m_frameMenuBar->GetBestSize().x, wxFrameBase::GetMinWidth());
+    }
+    else
+#endif // wxUSE_MENUS
+        return wxFrameBase::GetMinWidth();
+}
+
+int wxFrame::GetMinHeight() const
+{
+    int height = 0;
+
+#if wxUSE_MENUS
+    if ( m_frameMenuBar )
+    {
+        height += m_frameMenuBar->GetSize().y;
+    }
+#endif // wxUSE_MENUS
+
+#if wxUSE_TOOLBAR
+    if ( m_frameToolBar )
+    {
+        height += m_frameToolBar->GetSize().y;
+    }
+#endif // wxUSE_TOOLBAR
+
+#if wxUSE_STATUSBAR
+    if ( m_frameStatusBar )
+    {
+        height += m_frameStatusBar->GetSize().y;
+    }
+#endif // wxUSE_STATUSBAR
+
+    if ( height )
+        return height + wxMax(0, wxFrameBase::GetMinHeight());
+    else
+        return wxFrameBase::GetMinHeight();
+}
+
 bool wxFrame::Enable(bool enable)
 {
     if (!wxFrameBase::Enable(enable))
 bool wxFrame::Enable(bool enable)
 {
     if (!wxFrameBase::Enable(enable))
-       return FALSE;
+        return false;
 #ifdef __WXMICROWIN__
     if (m_frameMenuBar)
         m_frameMenuBar->Enable(enable);
 #endif
 #ifdef __WXMICROWIN__
     if (m_frameMenuBar)
         m_frameMenuBar->Enable(enable);
 #endif
-    return TRUE;
+    return true;
 }
 }