X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec5f0c24123fe801fb82b69771c171c0b9d064fc..404b319a85dadd7decf7a5a5331020520031a41c:/src/msw/wince/tbarwce.cpp?ds=inline diff --git a/src/msw/wince/tbarwce.cpp b/src/msw/wince/tbarwce.cpp index 33f429e306..a2e2847ea2 100644 --- a/src/msw/wince/tbarwce.cpp +++ b/src/msw/wince/tbarwce.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/wince/tbarwce.cpp +// Name: src/msw/wince/tbarwce.cpp // Purpose: wxToolBar for Windows CE // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "tbarwce.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,24 +24,25 @@ #pragma hdrstop #endif +// Use the WinCE-specific toolbar only if we're either compiling +// with a WinCE earlier than 4, or we wish to emulate a PocketPC-style UI +#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && (_WIN32_WCE < 400 || defined(__POCKETPC__) || defined(__SMARTPHONE__)) + +#include "wx/toolbar.h" + #ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" + #include "wx/dynarray.h" #include "wx/frame.h" #include "wx/log.h" #include "wx/intl.h" - #include "wx/dynarray.h" #include "wx/settings.h" #include "wx/bitmap.h" #include "wx/dcmemory.h" #include "wx/control.h" #endif -// Use the WinCE-specific toolbar only if we're either compiling -// with a WinCE earlier than 4, or we wish to emulate a PocketPC-style UI -#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && (_WIN32_WCE < 400 || defined(__POCKETPC__) || defined(__SMARTPHONE__)) - -#include "wx/toolbar.h" - -#if !defined(__GNUWIN32__) && !defined(__SALFORDC__) +#if !defined(__GNUWIN32__) #include "malloc.h" #endif @@ -55,9 +52,9 @@ #include #include #include -#include #if defined(WINCE_WITHOUT_COMMANDBAR) #include + #include "wx/msw/wince/resources.h" #endif #include "wx/msw/wince/missing.h" @@ -100,8 +97,8 @@ public: m_bitmapIndex = -1; } - wxToolMenuBarTool(wxToolBar *tbar, wxControl *control) - : wxToolBarToolBase(tbar, control) + wxToolMenuBarTool(wxToolBar *tbar, wxControl *control, const wxString& label) + : wxToolBarToolBase(tbar, control, label) { m_nSepCount = 1; m_bitmapIndex = -1; @@ -124,7 +121,7 @@ public: // a control in the toolbar void SetSeparatorsCount(size_t count) { m_nSepCount = count; } size_t GetSeparatorsCount() const { return m_nSepCount; } - + void SetBitmapIndex(int idx) { m_bitmapIndex = idx; } int GetBitmapIndex() const { return m_bitmapIndex; } @@ -155,9 +152,10 @@ wxToolBarToolBase *wxToolMenuBar::CreateTool(int id, clientData, shortHelp, longHelp); } -wxToolBarToolBase *wxToolMenuBar::CreateTool(wxControl *control) +wxToolBarToolBase * +wxToolMenuBar::CreateTool(wxControl *control, const wxString& label) { - return new wxToolMenuBarTool(this, control); + return new wxToolMenuBarTool(this, control, label); } // ---------------------------------------------------------------------------- @@ -167,8 +165,8 @@ wxToolBarToolBase *wxToolMenuBar::CreateTool(wxControl *control) void wxToolMenuBar::Init() { wxToolBar::Init(); - - m_nButtons = 0; + + m_nButtons = 0; m_menuBar = NULL; } @@ -195,38 +193,34 @@ bool wxToolMenuBar::Create(wxWindow *parent, return true; } -bool wxToolMenuBar::MSWCreateToolbar(const wxPoint& WXUNUSED(pos), const wxSize& WXUNUSED(size), wxMenuBar* menuBar) +bool wxToolMenuBar::MSWCreateToolbar(const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(size), + wxMenuBar *menuBar) { SetMenuBar(menuBar); if (m_menuBar) m_menuBar->SetToolBar(this); + HWND hwndParent = GetHwndOf(GetParent()); + wxCHECK_MSG( hwndParent, false, wxT("should have valid parent HWND") ); + #if defined(WINCE_WITHOUT_COMMANDBAR) - // Create the menubar. - SHMENUBARINFO mbi; - - memset (&mbi, 0, sizeof (SHMENUBARINFO)); - mbi.cbSize = sizeof (SHMENUBARINFO); - mbi.hwndParent = (HWND) GetParent()->GetHWND(); -#ifdef __SMARTPHONE__ - mbi.nToolBarId = 5002; -#else - mbi.nToolBarId = 5000; -#endif - mbi.nBmpId = 0; - mbi.cBmpImages = 0; - mbi.dwFlags = 0 ; // SHCMBF_EMPTYBAR; + // create the menubar. + WinStruct mbi; + + mbi.hwndParent = hwndParent; + mbi.nToolBarId = wxIDM_SHMENU; mbi.hInstRes = wxGetInstance(); - if (!SHCreateMenuBar(&mbi)) + if ( !SHCreateMenuBar(&mbi) ) { - wxFAIL_MSG( _T("SHCreateMenuBar failed") ); + wxFAIL_MSG( wxT("SHCreateMenuBar failed") ); return false; } SetHWND((WXHWND) mbi.hwndMB); #else - HWND hWnd = CommandBar_Create(wxGetInstance(), (HWND) GetParent()->GetHWND(), GetId()); + HWND hWnd = CommandBar_Create(wxGetInstance(), hwndParent, GetId()); SetHWND((WXHWND) hWnd); #endif @@ -253,16 +247,14 @@ wxToolMenuBar::~wxToolMenuBar() // Return HMENU for the menu associated with the commandbar WXHMENU wxToolMenuBar::GetHMenu() { -#if defined(__HANDHELDPC__) - return 0; -#else +#if !defined(__HANDHELDPC__) if (GetHWND()) { - return (WXHMENU) (HMENU)::SendMessage((HWND) GetHWND(), SHCMBM_GETMENU, (WPARAM)0, (LPARAM)0); + return (WXHMENU)::SendMessage(GetHwnd(), SHCMBM_GETMENU, 0, 0); } - else - return 0; #endif + + return NULL; } // ---------------------------------------------------------------------------- @@ -280,6 +272,10 @@ bool wxToolMenuBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool) bool wxToolMenuBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) { + // Skip over the menus + if (GetMenuBar()) + pos += GetMenuBar()->GetMenuCount(); + // the main difficulty we have here is with the controls in the toolbars: // as we (sometimes) use several separators to cover up the space used by // them, the indices are not the same for us and the toolbar @@ -312,7 +308,7 @@ bool wxToolMenuBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) RECT r; if ( !::SendMessage(GetHwnd(), TB_GETITEMRECT, pos, (LPARAM)&r) ) { - wxLogLastError(_T("TB_GETITEMRECT")); + wxLogLastError(wxT("TB_GETITEMRECT")); } int width = r.right - r.left; @@ -376,7 +372,7 @@ bool wxToolMenuBar::Realize() #endif // 0 bool lastWasRadio = false; - wxToolBarToolsList::Node* node; + wxToolBarToolsList::compatibility_iterator node; for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { wxToolMenuBarTool *tool = (wxToolMenuBarTool*) node->GetData(); @@ -393,6 +389,7 @@ bool wxToolMenuBar::Realize() case wxTOOL_STYLE_CONTROL: button.idCommand = tool->GetId(); // fall through: create just a separator too + // TODO: controls are not yet supported on wxToolMenuBar. case wxTOOL_STYLE_SEPARATOR: button.fsState = TBSTATE_ENABLED; @@ -400,13 +397,13 @@ bool wxToolMenuBar::Realize() break; case wxTOOL_STYLE_BUTTON: - + if ( HasFlag(wxTB_TEXT) ) { const wxString& label = tool->GetLabel(); if ( !label.empty() ) { - button.iString = (int)label.c_str(); + button.iString = (int) wxMSW_CONV_LPCTSTR(label); } } @@ -419,7 +416,8 @@ bool wxToolMenuBar::Realize() wxMemoryDC memDC; wxBitmap b(16,16); memDC.SelectObject(b); - memDC.SetBackground(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE))); + wxColour col = wxColour(192,192,192); + memDC.SetBackground(wxBrush(col)); memDC.Clear(); int x = (16 - bmp.GetWidth())/2; int y = (16 - bmp.GetHeight())/2; @@ -431,7 +429,7 @@ bool wxToolMenuBar::Realize() } int n = 0; - if ( bmpToUse.Ok() ) + if ( bmpToUse.IsOk() ) { n = ::CommandBar_AddBitmap( (HWND) GetHWND(), NULL, (int) (HBITMAP) bmpToUse.GetHBITMAP(), 1, 16, 16 ); @@ -468,7 +466,7 @@ bool wxToolMenuBar::Realize() break; default: - wxFAIL_MSG( _T("unexpected toolbar button kind") ); + wxFAIL_MSG( wxT("unexpected toolbar button kind") ); // fall through case wxITEM_NORMAL: @@ -477,9 +475,10 @@ bool wxToolMenuBar::Realize() break; } - BOOL bRc = ::CommandBar_AddButtons( (HWND) GetHWND(), 1, buttons ); - - wxASSERT_MSG( bRc, wxT("Could not add toolbar button.")); + if ( !::CommandBar_AddButtons( (HWND) GetHWND(), 1, buttons ) ) + { + wxFAIL_MSG( wxT("Could not add toolbar button.")); + } lastWasRadio = isRadio; } @@ -487,15 +486,28 @@ bool wxToolMenuBar::Realize() return true; } -bool wxToolMenuBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) +bool wxToolMenuBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id_) { - wxToolBarToolBase *tool = FindById((int)id); + const int id = (signed short)id_; + + wxToolBarToolBase *tool = FindById(id); if ( !tool ) { + bool checked = false; + if ( m_menuBar ) + { + wxMenuItem *item = m_menuBar->FindItem(id); + if ( item && item->IsCheckable() ) + { + item->Toggle(); + checked = item->IsChecked(); + } + } + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED); event.SetEventObject(this); event.SetId(id); - event.SetInt(id); + event.SetInt(checked); return GetEventHandler()->ProcessEvent(event); } @@ -513,7 +525,7 @@ bool wxToolMenuBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) if ( !tool->CanBeToggled() || tool->GetKind() != wxITEM_RADIO || toggled ) { // OnLeftClick() can veto the button state change - for buttons which - // may be toggled only, of couse + // may be toggled only, of course. if ( !OnLeftClick((int)id, toggled) && tool->CanBeToggled() ) { // revert back @@ -527,6 +539,27 @@ bool wxToolMenuBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) return true; } +WXLRESULT wxToolMenuBar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + switch ( nMsg ) + { + case WM_SIZE: + break; + + case WM_MOUSEMOVE: + // we don't handle mouse moves, so always pass the message to + // wxControl::MSWWindowProc + HandleMouseMove(wParam, lParam); + break; + + case WM_PAINT: + break; + } + + return MSWDefWindowProc(nMsg, wParam, lParam); +} + + #else ////////////// For Smartphone @@ -569,10 +602,10 @@ bool wxToolBar::Create(wxWindow *parent, // satisfy other parts of wxWidgets. parent->AddChild(this); - + SetWindowStyle(style); SetName(name); - + return true; } @@ -611,13 +644,10 @@ void wxToolBar::DoToggleTool(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(to void wxToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(toggle)) { - wxFAIL_MSG( _T("not implemented") ); + wxFAIL_MSG( wxT("not implemented") ); } #endif // !__SMARTPHONE__ - - -#endif // wxUSE_TOOLBAR && Win95 - +#endif // wxUSE_TOOLBAR