X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5d4ee50b0a9bf529328fbbe98ec22d9262f91513..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/msw/choice.cpp diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index 44f08b6985..03d3b3fb50 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -30,6 +30,7 @@ #ifndef WX_PRECOMP #include "wx/utils.h" + #include "wx/app.h" #include "wx/log.h" #include "wx/brush.h" #include "wx/settings.h" @@ -37,64 +38,6 @@ #include "wx/msw/private.h" -#if wxUSE_EXTENDED_RTTI -WX_DEFINE_FLAGS( wxChoiceStyle ) - -wxBEGIN_FLAGS( wxChoiceStyle ) - // 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) - -wxEND_FLAGS( wxChoiceStyle ) - -IMPLEMENT_DYNAMIC_CLASS_XTI(wxChoice, wxControlWithItems,"wx/choice.h") - -wxBEGIN_PROPERTIES_TABLE(wxChoice) - wxEVENT_PROPERTY( Select , wxEVT_COMMAND_CHOICE_SELECTED , wxCommandEvent ) - - 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( Selection ,int, SetSelection, GetSelection, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_FLAGS( WindowStyle , wxChoiceStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style -wxEND_PROPERTIES_TABLE() - -wxBEGIN_HANDLERS_TABLE(wxChoice) -wxEND_HANDLERS_TABLE() - -wxCONSTRUCTOR_4( wxChoice , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size ) -#else -IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControlWithItems) -#endif -/* - TODO PROPERTIES - selection (long) - content (list) - item -*/ - // ============================================================================ // implementation // ============================================================================ @@ -117,8 +60,8 @@ bool wxChoice::Create(wxWindow *parent, wxASSERT_MSG( !(style & wxCB_DROPDOWN) && !(style & wxCB_READONLY) && !(style & wxCB_SIMPLE), - _T("this style flag is ignored by wxChoice, you ") - _T("probably want to use a wxComboBox") ); + wxT("this style flag is ignored by wxChoice, you ") + wxT("probably want to use a wxComboBox") ); return CreateAndInit(parent, id, pos, size, n, choices, style, validator, name); @@ -142,10 +85,6 @@ bool wxChoice::CreateAndInit(wxWindow *parent, return false; - // choice/combobox normally has "white" (depends on colour scheme, of - // course) background rather than inheriting the parent's background - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - // initialize the controls contents for ( int i = 0; i < n; i++ ) { @@ -224,6 +163,39 @@ WXDWORD wxChoice::MSWGetStyle(long style, WXDWORD *exstyle) const return msStyle; } +#ifndef EP_EDITTEXT + #define EP_EDITTEXT 1 + #define ETS_NORMAL 1 +#endif + +wxVisualAttributes +wxChoice::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) +{ + // it is important to return valid values for all attributes from here, + // GetXXX() below rely on this + wxVisualAttributes attrs; + + // FIXME: Use better dummy window? + wxWindow* wnd = wxTheApp->GetTopWindow(); + if (!wnd) + return attrs; + + attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + + // there doesn't seem to be any way to get the text colour using themes + // API: TMT_TEXTCOLOR doesn't work neither for EDIT nor COMBOBOX + attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + + // NB: use EDIT, not COMBOBOX (the latter works in XP but not Vista) + attrs.colBg = wnd->MSWGetThemeColour(L"EDIT", + EP_EDITTEXT, + ETS_NORMAL, + ThemeColourBackground, + wxSYS_COLOUR_WINDOW); + + return attrs; +} + wxChoice::~wxChoice() { Clear(); @@ -523,8 +495,21 @@ void wxChoice::DoSetSize(int x, int y, int width, int height, int sizeFlags) { + const int heightBest = GetBestSize().y; + // we need the real height below so get the current one if it's not given - if ( height != wxDefaultCoord && height != GetBestSize().y ) + if ( height == wxDefaultCoord ) + { + // height not specified, use the same as before + DoGetSize(NULL, &height); + } + else if ( height == heightBest ) + { + // we don't need to manually manage our height, let the system use the + // default one + m_heightOwn = wxDefaultCoord; + } + else // non-default height specified { // set our new own height but be careful not to make it too big: the // native control apparently stores it as a single byte and so setting @@ -538,10 +523,6 @@ void wxChoice::DoSetSize(int x, int y, else if ( m_heightOwn < COMBO_HEIGHT_ADJ ) m_heightOwn = COMBO_HEIGHT_ADJ; } - else // height not specified - { - DoGetSize(NULL, &height); - } // the height which we must pass to Windows should be the total height of @@ -552,13 +533,20 @@ void wxChoice::DoSetSize(int x, int y, // don't make the drop down list too tall, arbitrarily limit it to 30 // items max and also don't make it too small if it's currently empty size_t nItems = GetCount(); - if ( !nItems ) - nItems = 9; - else if ( nItems > 30 ) - nItems = 30; + if (!HasFlag(wxCB_SIMPLE)) + { + if ( !nItems ) + nItems = 9; + else if ( nItems > 30 ) + nItems = 30; + } const int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, 0, 0); - const int heightWithItems = height + hItem*nItems; + int heightWithItems = 0; + if (!HasFlag(wxCB_SIMPLE)) + heightWithItems = height + hItem*nItems; + else + heightWithItems = SetHeightSimpleComboBox(nItems); // do resize the native control @@ -568,7 +556,7 @@ void wxChoice::DoSetSize(int x, int y, // make the control itself of the requested height: notice that this // must be done after changing its size or it has no effect (apparently // the height is reset to default during the control layout) and that it's - // useless to to do it when using the deferred sizing -- in this case it + // useless to do it when using the deferred sizing -- in this case it // will be done from MSWEndDeferWindowPos() #if wxUSE_DEFERRED_SIZING if ( m_pendingSize == wxDefaultSize ) @@ -592,6 +580,7 @@ wxSize wxChoice::DoGetBestSize() const { // find the widest string int wChoice = 0; + int hChoice; const unsigned int nItems = GetCount(); for ( unsigned int i = 0; i < nItems; i++ ) { @@ -608,12 +597,26 @@ wxSize wxChoice::DoGetBestSize() const // the combobox should be slightly larger than the widest string wChoice += 5*GetCharWidth(); + if( HasFlag( wxCB_SIMPLE ) ) + { + hChoice = SetHeightSimpleComboBox( nItems ); + } + else + hChoice = EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight()); - wxSize best(wChoice, EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight())); + wxSize best(wChoice, hChoice); CacheBestSize(best); return best; } +int wxChoice::SetHeightSimpleComboBox(int nItems) const +{ + int cx, cy; + wxGetCharSize( GetHWND(), &cx, &cy, GetFont() ); + int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, (WPARAM)-1, 0); + return EDIT_HEIGHT_FROM_CHAR_HEIGHT( cy ) * wxMin( wxMax( nItems, 3 ), 6 ) + hItem - 1; +} + // ---------------------------------------------------------------------------- // MSW message handlers // ----------------------------------------------------------------------------