// wxWin macros
// ----------------------------------------------------------------------------
-#if wxUSE_EXTENDED_RTTI
-WX_DEFINE_FLAGS( wxComboBoxStyle )
-
-wxBEGIN_FLAGS( wxComboBoxStyle )
- // new style border flags, we put them first to
- // use them for streaming out
- wxFLAGS_MEMBER(wxBORDER_SIMPLE)
- wxFLAGS_MEMBER(wxBORDER_SUNKEN)
- wxFLAGS_MEMBER(wxBORDER_DOUBLE)
- wxFLAGS_MEMBER(wxBORDER_RAISED)
- wxFLAGS_MEMBER(wxBORDER_STATIC)
- wxFLAGS_MEMBER(wxBORDER_NONE)
-
- // old style border flags
- wxFLAGS_MEMBER(wxSIMPLE_BORDER)
- wxFLAGS_MEMBER(wxSUNKEN_BORDER)
- wxFLAGS_MEMBER(wxDOUBLE_BORDER)
- wxFLAGS_MEMBER(wxRAISED_BORDER)
- wxFLAGS_MEMBER(wxSTATIC_BORDER)
- wxFLAGS_MEMBER(wxBORDER)
-
- // standard window styles
- wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
- wxFLAGS_MEMBER(wxCLIP_CHILDREN)
- wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
- wxFLAGS_MEMBER(wxWANTS_CHARS)
- wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
- wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
- wxFLAGS_MEMBER(wxVSCROLL)
- wxFLAGS_MEMBER(wxHSCROLL)
-
- wxFLAGS_MEMBER(wxCB_SIMPLE)
- wxFLAGS_MEMBER(wxCB_SORT)
- wxFLAGS_MEMBER(wxCB_READONLY)
- wxFLAGS_MEMBER(wxCB_DROPDOWN)
-
-wxEND_FLAGS( wxComboBoxStyle )
-
-IMPLEMENT_DYNAMIC_CLASS_XTI(wxComboBox, wxChoice,"wx/combobox.h")
-
-wxBEGIN_PROPERTIES_TABLE(wxComboBox)
- wxEVENT_PROPERTY( Select , wxEVT_COMMAND_COMBOBOX_SELECTED , wxCommandEvent )
- wxEVENT_PROPERTY( TextEnter , wxEVT_COMMAND_TEXT_ENTER , wxCommandEvent )
-
- // TODO DELEGATES
- wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
- wxPROPERTY_COLLECTION( Choices , wxArrayString , wxString , AppendString , GetStrings , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
- wxPROPERTY( Value ,wxString, SetValue, GetValue, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
- wxPROPERTY( Selection ,int, SetSelection, GetSelection, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
- wxPROPERTY_FLAGS( WindowStyle , wxComboBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
-wxEND_PROPERTIES_TABLE()
-
-wxBEGIN_HANDLERS_TABLE(wxComboBox)
-wxEND_HANDLERS_TABLE()
-
-wxCONSTRUCTOR_5( wxComboBox , wxWindow* , Parent , wxWindowID , Id , wxString , Value , wxPoint , Position , wxSize , Size )
-
-#else
-
-IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxChoice)
-
-#endif
-
BEGIN_EVENT_TABLE(wxComboBox, wxControl)
EVT_MENU(wxID_CUT, wxComboBox::OnCut)
EVT_MENU(wxID_COPY, wxComboBox::OnCopy)
// implementation
// ============================================================================
+namespace
+{
+
+// Check if the given message should be forwarded from the edit control which
+// is part of the combobox to wxComboBox itself. All messages generating the
+// events that the code using wxComboBox could be interested in must be
+// forwarded.
+bool ShouldForwardFromEditToCombo(UINT message)
+{
+ switch ( message )
+ {
+ case WM_KEYUP:
+ case WM_KEYDOWN:
+ case WM_CHAR:
+ case WM_SYSCHAR:
+ case WM_SYSKEYDOWN:
+ case WM_SYSKEYUP:
+ case WM_SETFOCUS:
+ case WM_KILLFOCUS:
+ case WM_CUT:
+ case WM_COPY:
+ case WM_PASTE:
+ return true;
+ }
+
+ return false;
+}
+
+} // anonymous namespace
+
// ----------------------------------------------------------------------------
// wnd proc for subclassed edit control
// ----------------------------------------------------------------------------
HWND hwndCombo = ::GetParent(hWnd);
wxWindow *win = wxFindWinFromHandle((WXHWND)hwndCombo);
- switch ( message )
+ if ( ShouldForwardFromEditToCombo(message) )
{
- // forward some messages to the combobox to generate the appropriate
- // wxEvents from them
- case WM_KEYUP:
- case WM_KEYDOWN:
- case WM_CHAR:
- case WM_SYSCHAR:
- case WM_SYSKEYDOWN:
- case WM_SYSKEYUP:
- case WM_SETFOCUS:
- case WM_KILLFOCUS:
+ wxComboBox *combo = wxDynamicCast(win, wxComboBox);
+ if ( !combo )
+ {
+ // we can get WM_KILLFOCUS while our parent is already half
+ // destroyed and hence doesn't look like a combobx any
+ // longer, check for it to avoid bogus assert failures
+ if ( !win->IsBeingDeleted() )
{
- wxComboBox *combo = wxDynamicCast(win, wxComboBox);
- if ( !combo )
- {
- // we can get WM_KILLFOCUS while our parent is already half
- // destroyed and hence doesn't look like a combobx any
- // longer, check for it to avoid bogus assert failures
- if ( !win->IsBeingDeleted() )
- {
- wxFAIL_MSG( wxT("should have combo as parent") );
- }
- }
- else if ( combo->MSWProcessEditMsg(message, wParam, lParam) )
- {
- // handled by parent
- return 0;
- }
+ wxFAIL_MSG( wxT("should have combo as parent") );
}
- break;
-
- case WM_GETDLGCODE:
- {
- wxCHECK_MSG( win, 0, wxT("should have a parent") );
+ }
+ else if ( combo->MSWProcessEditMsg(message, wParam, lParam) )
+ {
+ // handled by parent
+ return 0;
+ }
+ }
+ else if ( message == WM_GETDLGCODE )
+ {
+ wxCHECK_MSG( win, 0, wxT("should have a parent") );
- if ( win->GetWindowStyle() & wxTE_PROCESS_ENTER )
- {
- // need to return a custom dlg code or we'll never get it
- return DLGC_WANTMESSAGE;
- }
- }
- break;
+ if ( win->GetWindowStyle() & wxTE_PROCESS_ENTER )
+ {
+ // need to return a custom dlg code or we'll never get it
+ return DLGC_WANTMESSAGE;
+ }
}
return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit, hWnd, message, wParam, lParam);
return true;
}
}
- // fall through
-
- case WM_SYSCHAR:
- return HandleChar(wParam, lParam);
+ // fall through, WM_CHAR is one of the message we should forward.
- case WM_SYSKEYDOWN:
- case WM_KEYDOWN:
- return HandleKeyDown(wParam, lParam);
-
- case WM_SYSKEYUP:
- case WM_KEYUP:
- return HandleKeyUp(wParam, lParam);
-
- case WM_SETFOCUS:
- return HandleSetFocus((WXHWND)wParam);
-
- case WM_KILLFOCUS:
- return HandleKillFocus((WXHWND)wParam);
-
- case WM_CUT:
- case WM_COPY:
- case WM_PASTE:
- return HandleClipboardEvent(msg);
+ default:
+ if ( ShouldForwardFromEditToCombo(msg) )
+ {
+ // For all the messages forward from the edit control the
+ // result is not used.
+ WXLRESULT result;
+ return MSWHandleMessage(&result, msg, wParam, lParam);
+ }
}
return false;
// this string is going to become the new combobox value soon but
// we need it to be done right now, otherwise the event handler
// could get a wrong value when it calls our GetValue()
- ::SetWindowText(GetHwnd(), value.wx_str());
+ ::SetWindowText(GetHwnd(), value.t_str());
{
wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, GetId());
wxTextEntry::Clear();
}
+bool wxComboBox::ContainsHWND(WXHWND hWnd) const
+{
+ return hWnd == GetEditHWNDIfAvailable();
+}
+
void wxComboBox::GetSelection(long *from, long *to) const
{
if ( !HasFlag(wxCB_READONLY) )
event.Enable(IsEditable() && !wxTextEntry::IsEmpty());
}
-void wxComboBox::MSWDoPopupOrDismiss(bool show)
-{
- wxASSERT_MSG( !HasFlag(wxCB_SIMPLE),
- wxT("can't popup/dismiss the list for simple combo box") );
-
- // we *must* set focus to the combobox before showing or hiding the drop
- // down as without this we get WM_LBUTTONDOWN messages with invalid HWND
- // when hiding it (whether programmatically or manually) resulting in a
- // crash when we pass them to IsDialogMessage()
- //
- // this can be seen in the combo page of the widgets sample under Windows 7
- SetFocus();
-
- ::SendMessage(GetHwnd(), CB_SHOWDROPDOWN, show, 0);
-}
-
#if wxUSE_TOOLTIPS
void wxComboBox::DoSetToolTip(wxToolTip *tip)
wxChoice::DoSetToolTip(tip);
if ( tip && !HasFlag(wxCB_READONLY) )
- tip->Add(GetEditHWND());
+ tip->AddOtherWindow(GetEditHWND());
}
#endif // wxUSE_TOOLTIPS