X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c2794afdbb17b46a677e28e73ac5e50a82e13399..dae2800ac82493e2f3cae2ce0231309a8e877683:/src/generic/toolbkg.cpp diff --git a/src/generic/toolbkg.cpp b/src/generic/toolbkg.cpp index 4c25444a00..1693b3cfe2 100644 --- a/src/generic/toolbkg.cpp +++ b/src/generic/toolbkg.cpp @@ -18,12 +18,19 @@ #if wxUSE_TOOLBOOK +#ifndef WX_PRECOMP + #include "wx/icon.h" + #include "wx/settings.h" + #include "wx/toolbar.h" +#endif + #include "wx/imaglist.h" -#include "wx/icon.h" -#include "wx/toolbar.h" -#include "wx/toolbook.h" -#include "wx/settings.h" #include "wx/sysopt.h" +#include "wx/toolbook.h" + +#if defined(__WXMAC__) && wxUSE_TOOLBAR && wxUSE_BMPBUTTON +#include "wx/generic/buttonbar.h" +#endif // ---------------------------------------------------------------------------- // various wxWidgets macros @@ -41,7 +48,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolbookEvent, wxNotifyEvent) const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING = wxNewEventType(); const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED = wxNewEventType(); -const int wxID_TOOLBOOKTOOLBAR = wxNewId(); BEGIN_EVENT_TABLE(wxToolbook, wxBookCtrlBase) EVT_SIZE(wxToolbook::OnSize) @@ -81,19 +87,41 @@ bool wxToolbook::Create(wxWindow *parent, wxDefaultValidator, name) ) return false; - int orient = wxTB_HORIZONTAL; - if ( (style & (wxBK_LEFT | wxBK_RIGHT)) != 0) - orient = wxTB_VERTICAL; + int tbFlags = wxTB_TEXT | wxTB_FLAT | wxBORDER_NONE; + if ( (style & (wxBK_LEFT | wxBK_RIGHT)) != 0 ) + tbFlags |= wxTB_VERTICAL; + else + tbFlags |= wxTB_HORIZONTAL; + + if ( style & wxTBK_HORZ_LAYOUT ) + tbFlags |= wxTB_HORZ_LAYOUT; // TODO: make more configurable - m_bookctrl = new wxToolBar + +#if defined(__WXMAC__) && wxUSE_TOOLBAR && wxUSE_BMPBUTTON + if (style & wxTBK_BUTTONBAR) + { + m_bookctrl = new wxButtonToolBar + ( + this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize, + tbFlags + ); + } + else +#endif + { + m_bookctrl = new wxToolBar ( this, - wxID_TOOLBOOKTOOLBAR, + wxID_ANY, wxDefaultPosition, wxDefaultSize, - orient | wxTB_TEXT|wxTB_FLAT|wxTB_NODIVIDER + tbFlags | wxTB_NODIVIDER ); + } return true; } @@ -219,39 +247,20 @@ int wxToolbook::GetSelection() const return m_selection; } -int wxToolbook::SetSelection(size_t n) +wxBookCtrlBaseEvent* wxToolbook::CreatePageChangingEvent() const { - wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND, - wxT("invalid page index in wxToolbook::SetSelection()") ); - - const int oldSel = m_selection; - - if ( int(n) != m_selection ) - { - wxToolbookEvent event(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, m_windowId); - event.SetSelection(n); - event.SetOldSelection(m_selection); - event.SetEventObject(this); - if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) - { - if ( m_selection != wxNOT_FOUND ) - m_pages[m_selection]->Hide(); - - wxWindow *page = m_pages[n]; - page->SetSize(GetPageRect()); - page->Show(); - - // change m_selection now to ignore the selection change event - m_selection = n; - GetToolBar()->ToggleTool(n + 1, true); + return new wxToolbookEvent(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, m_windowId); +} - // program allows the page change - event.SetEventType(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED); - (void)GetEventHandler()->ProcessEvent(event); - } - } +void wxToolbook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED); +} - return oldSel; +void wxToolbook::UpdateSelectedPage(size_t newsel) +{ + m_selection = newsel; + GetToolBar()->ToggleTool(newsel + 1, true); } // Not part of the wxBookctrl API, but must be called in OnIdle or @@ -283,6 +292,39 @@ void wxToolbook::Realize() DoSize(); } +int wxToolbook::HitTest(const wxPoint& pt, long *flags) const +{ + int pagePos = wxNOT_FOUND; + + if ( flags ) + *flags = wxBK_HITTEST_NOWHERE; + + // convert from wxToolbook coordinates to wxToolBar ones + const wxToolBarBase * const tbar = GetToolBar(); + const wxPoint tbarPt = tbar->ScreenToClient(ClientToScreen(pt)); + + // is the point over the toolbar? + if ( wxRect(tbar->GetSize()).Contains(tbarPt) ) + { + const wxToolBarToolBase * const + tool = tbar->FindToolForPosition(tbarPt.x, tbarPt.y); + + if ( tool ) + { + pagePos = tbar->GetToolPos(tool->GetId()); + if ( flags ) + *flags = wxBK_HITTEST_ONICON | wxBK_HITTEST_ONLABEL; + } + } + else // not over the toolbar + { + if ( flags && GetPageRect().Contains(pt) ) + *flags |= wxBK_HITTEST_ONPAGE; + } + + return pagePos; +} + void wxToolbook::OnIdle(wxIdleEvent& event) { if (m_needsRealizing) @@ -329,7 +371,7 @@ bool wxToolbook::InsertPage(size_t n, if (bSelect) { - // GetToolBar()->ToggleTool(n, true); + GetToolBar()->ToggleTool(n, true); m_selection = n; } else @@ -395,7 +437,9 @@ void wxToolbook::OnToolSelected(wxCommandEvent& event) // change wasn't allowed, return to previous state if (m_selection != selNew) + { GetToolBar()->ToggleTool(m_selection, false); + } } #endif // wxUSE_TOOLBOOK