/////////////////////////////////////////////////////////////////////////////
-// Name: msw/wince/tbarwce.cpp
+// Name: src/msw/wince/tbarwce.cpp
// Purpose: wxToolBar for Windows CE
// Author: Julian Smart
// Modified by:
// 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"
#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 <commctrl.h> "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
#include <tchar.h>
#include <ole2.h>
#include <shellapi.h>
-#include <commctrl.h>
#if defined(WINCE_WITHOUT_COMMANDBAR)
#include <aygshell.h>
+ #include "wx/msw/wince/resources.h"
#endif
#include "wx/msw/wince/missing.h"
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;
// 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; }
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);
}
// ----------------------------------------------------------------------------
void wxToolMenuBar::Init()
{
wxToolBar::Init();
-
- m_nButtons = 0;
+
+ m_nButtons = 0;
m_menuBar = NULL;
}
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<SHMENUBARINFO> 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
// 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;
}
// ----------------------------------------------------------------------------
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
RECT r;
if ( !::SendMessage(GetHwnd(), TB_GETITEMRECT, pos, (LPARAM)&r) )
{
- wxLogLastError(_T("TB_GETITEMRECT"));
+ wxLogLastError(wxT("TB_GETITEMRECT"));
}
int width = r.right - r.left;
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;
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)label.wx_str();
}
}
wxBitmap bmpToUse = bmp;
- if (bmp.GetWidth() < 16 || bmp.GetHeight() < 16)
+ if (bmp.GetWidth() < 16 || bmp.GetHeight() < 16 || bmp.GetMask() != NULL)
{
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;
break;
default:
- wxFAIL_MSG( _T("unexpected toolbar button kind") );
+ wxFAIL_MSG( wxT("unexpected toolbar button kind") );
// fall through
case wxITEM_NORMAL:
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;
}
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);
}
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
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
// satisfy other parts of wxWidgets.
parent->AddChild(this);
-
+
SetWindowStyle(style);
SetName(name);
-
+
return true;
}
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