#if defined(__WXWINCE__)
#include <ole2.h>
#include <shellapi.h>
- #include <aygshell.h>
+ #if _WIN32_WCE < 400
+ #include <aygshell.h>
+ #endif
#endif
// include <commctrl.h> "properly"
// Get the internal data structure
static wxListItemInternalData *wxGetInternalData(HWND hwnd, long itemId);
-static wxListItemInternalData *wxGetInternalData(wxListCtrl *ctl, long itemId);
+static wxListItemInternalData *wxGetInternalData(const wxListCtrl *ctl, long itemId);
static wxListItemAttr *wxGetInternalDataAttr(wxListCtrl *ctl, long itemId);
static void wxDeleteInternalData(wxListCtrl* ctl, long itemId);
m_imageListSmall = NULL;
m_imageListState = NULL;
m_ownsImageListNormal = m_ownsImageListSmall = m_ownsImageListState = FALSE;
- m_baseStyle = 0;
m_colCount = 0;
m_count = 0;
m_ignoreChangeMessages = FALSE;
const wxPoint& pos,
const wxSize& size,
long style,
- const wxValidator& wxVALIDATOR_PARAM(validator),
+ const wxValidator& validator,
const wxString& name)
{
-#if wxUSE_VALIDATORS
- SetValidator(validator);
-#endif // wxUSE_VALIDATORS
+ if ( !CreateControl(parent, id, pos, size, style, validator, name) )
+ return FALSE;
- SetName(name);
+ if ( !MSWCreateControl(WC_LISTVIEW, _T(""), pos, size) )
+ return FALSE;
- int x = pos.x;
- int y = pos.y;
- int width = size.x;
- int height = size.y;
+ // explicitly say that we want to use Unicode because otherwise we get ANSI
+ // versions of _some_ messages (notably LVN_GETDISPINFOA) in MSLU build
+#if wxUSE_UNICODE
+ ::SendMessage(GetHwnd(), LVM_SETUNICODEFORMAT, TRUE, 0);
+#endif
- m_windowStyle = style;
+ // for comctl32.dll v 4.70+ we want to have this attribute because it's
+ // prettier (and also because wxGTK does it like this)
+ if ( HasFlag(wxLC_REPORT) && wxTheApp->GetComCtl32Version() >= 470 )
+ {
+ ::SendMessage(GetHwnd(), LVM_SETEXTENDEDLISTVIEWSTYLE,
+ 0, LVS_EX_FULLROWSELECT);
+ }
- SetParent(parent);
+ // inherit foreground colour but our background should be the same as for
+ // listboxes and other such "container" windows and not inherited
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ SetForegroundColour(GetParent()->GetForegroundColour());
- if (width <= 0)
- width = 100;
- if (height <= 0)
- height = 30;
- if (x < 0)
- x = 0;
- if (y < 0)
- y = 0;
+ return TRUE;
+}
- m_windowId = (id == -1) ? NewControlId() : id;
+WXDWORD wxListCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
+{
+ WXDWORD wstyle = wxControl::MSWGetStyle(style, exstyle);
- DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP |
- LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS;
+ wstyle |= LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS;
- m_baseStyle = wstyle;
+#ifdef __WXDEBUG__
+ size_t nModes = 0;
- if ( !DoCreateControl(x, y, width, height) )
- return FALSE;
+ #define MAP_MODE_STYLE(wx, ms) \
+ if ( style & (wx) ) { wstyle |= (ms); nModes++; }
+#else // !__WXDEBUG__
+ #define MAP_MODE_STYLE(wx, ms) \
+ if ( style & (wx) ) wstyle |= (ms);
+#endif // __WXDEBUG__
- if (parent)
- parent->AddChild(this);
+ MAP_MODE_STYLE(wxLC_ICON, LVS_ICON)
+ MAP_MODE_STYLE(wxLC_SMALL_ICON, LVS_SMALLICON)
+ MAP_MODE_STYLE(wxLC_LIST, LVS_LIST)
+ MAP_MODE_STYLE(wxLC_REPORT, LVS_REPORT)
- return TRUE;
-}
+ wxASSERT_MSG( nModes == 1,
+ _T("wxListCtrl style should have exactly one mode bit set") );
-bool wxListCtrl::DoCreateControl(int x, int y, int w, int h)
-{
- DWORD wstyle = m_baseStyle;
+#undef MAP_MODE_STYLE
- WXDWORD exStyle = 0;
- WXDWORD standardStyle = MSWGetStyle(GetWindowStyle(), & exStyle) ;
+ if ( style & wxLC_ALIGN_LEFT )
+ wstyle |= LVS_ALIGNLEFT;
- long oldStyle = 0; // Dummy
- wstyle |= ConvertToMSWStyle(oldStyle, m_windowStyle);
- wstyle |= standardStyle;
+ if ( style & wxLC_ALIGN_TOP )
+ wstyle |= LVS_ALIGNTOP;
- // Create the ListView control.
- m_hWnd = (WXHWND)CreateWindowEx(exStyle,
- WC_LISTVIEW,
- wxEmptyString,
- wstyle,
- x, y, w, h,
- GetWinHwnd(GetParent()),
- (HMENU)m_windowId,
- wxGetInstance(),
- NULL);
+ if ( style & wxLC_AUTOARRANGE )
+ wstyle |= LVS_AUTOARRANGE;
- if ( !m_hWnd )
- {
- wxLogError(_("Can't create list control window, check that comctl32.dll is installed."));
+ if ( style & wxLC_NO_SORT_HEADER )
+ wstyle |= LVS_NOSORTHEADER;
- return FALSE;
- }
+ if ( style & wxLC_NO_HEADER )
+ wstyle |= LVS_NOCOLUMNHEADER;
- // explicitly say that we want to use Unicode because otherwise we get ANSI
- // versions of _some_ messages (notably LVN_GETDISPINFOA) in MSLU build
-#if wxUSE_UNICODE
- ::SendMessage(GetHwnd(), LVM_SETUNICODEFORMAT, TRUE, 0);
-#endif
+ if ( style & wxLC_EDIT_LABELS )
+ wstyle |= LVS_EDITLABELS;
- // for comctl32.dll v 4.70+ we want to have this attribute because it's
- // prettier (and also because wxGTK does it like this)
- if ( (wstyle & LVS_REPORT) && wxTheApp->GetComCtl32Version() >= 470 )
+ if ( style & wxLC_SINGLE_SEL )
+ wstyle |= LVS_SINGLESEL;
+
+ if ( style & wxLC_SORT_ASCENDING )
{
- ::SendMessage(GetHwnd(), LVM_SETEXTENDEDLISTVIEWSTYLE,
- 0, LVS_EX_FULLROWSELECT);
+ wstyle |= LVS_SORTASCENDING;
+
+ wxASSERT_MSG( !(style & wxLC_SORT_DESCENDING),
+ _T("can't sort in ascending and descending orders at once") );
}
+ else if ( style & wxLC_SORT_DESCENDING )
+ wstyle |= LVS_SORTDESCENDING;
- SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
- SetForegroundColour(GetParent()->GetForegroundColour());
+#if !( defined(__GNUWIN32__) && !wxCHECK_W32API_VERSION( 1, 0 ) )
+ if ( style & wxLC_VIRTUAL )
+ {
+ int ver = wxTheApp->GetComCtl32Version();
+ if ( ver < 470 )
+ {
+ wxLogWarning(_("Please install a newer version of comctl32.dll\n(at least version 4.70 is required but you have %d.%02d)\nor this program won't operate correctly."),
+ ver / 100, ver % 100);
+ }
- SubclassWin(m_hWnd);
+ wstyle |= LVS_OWNERDATA;
+ }
+#endif // ancient cygwin
- return TRUE;
+ return wstyle;
}
void wxListCtrl::UpdateStyle()
{
- if ( GetHWND() )
+ if ( GetHwnd() )
{
// The new window view style
- long dummy;
- DWORD dwStyleNew = ConvertToMSWStyle(dummy, m_windowStyle);
- dwStyleNew |= m_baseStyle;
+ DWORD dwStyleNew = MSWGetStyle(m_windowStyle, NULL);
// Get the current window style.
DWORD dwStyleOld = ::GetWindowLong(GetHwnd(), GWL_STYLE);
UpdateStyle();
}
-// Can be just a single style, or a bitlist
-long wxListCtrl::ConvertToMSWStyle(long& oldStyle, long style) const
-{
- long wstyle = 0;
- if ( style & wxLC_ICON )
- {
- if ( (oldStyle & LVS_TYPEMASK) == LVS_SMALLICON )
- oldStyle -= LVS_SMALLICON;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_REPORT )
- oldStyle -= LVS_REPORT;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_LIST )
- oldStyle -= LVS_LIST;
- wstyle |= LVS_ICON;
- }
-
- if ( style & wxLC_SMALL_ICON )
- {
- if ( (oldStyle & LVS_TYPEMASK) == LVS_ICON )
- oldStyle -= LVS_ICON;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_REPORT )
- oldStyle -= LVS_REPORT;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_LIST )
- oldStyle -= LVS_LIST;
- wstyle |= LVS_SMALLICON;
- }
-
- if ( style & wxLC_LIST )
- {
- if ( (oldStyle & LVS_TYPEMASK) == LVS_ICON )
- oldStyle -= LVS_ICON;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_REPORT )
- oldStyle -= LVS_REPORT;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_SMALLICON )
- oldStyle -= LVS_SMALLICON;
- wstyle |= LVS_LIST;
- }
-
- if ( style & wxLC_REPORT )
- {
- if ( (oldStyle & LVS_TYPEMASK) == LVS_ICON )
- oldStyle -= LVS_ICON;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_LIST )
- oldStyle -= LVS_LIST;
- if ( (oldStyle & LVS_TYPEMASK) == LVS_SMALLICON )
- oldStyle -= LVS_SMALLICON;
-
- wstyle |= LVS_REPORT;
- }
-
- if ( style & wxLC_ALIGN_LEFT )
- {
- if ( oldStyle & LVS_ALIGNTOP )
- oldStyle -= LVS_ALIGNTOP;
- wstyle |= LVS_ALIGNLEFT;
- }
-
- if ( style & wxLC_ALIGN_TOP )
- {
- if ( oldStyle & LVS_ALIGNLEFT )
- oldStyle -= LVS_ALIGNLEFT;
- wstyle |= LVS_ALIGNTOP;
- }
-
- if ( style & wxLC_AUTOARRANGE )
- wstyle |= LVS_AUTOARRANGE;
-
- if ( style & wxLC_NO_SORT_HEADER )
- wstyle |= LVS_NOSORTHEADER;
-
- if ( style & wxLC_NO_HEADER )
- wstyle |= LVS_NOCOLUMNHEADER;
-
- if ( style & wxLC_EDIT_LABELS )
- wstyle |= LVS_EDITLABELS;
-
- if ( style & wxLC_SINGLE_SEL )
- wstyle |= LVS_SINGLESEL;
-
- if ( style & wxLC_SORT_ASCENDING )
- {
- if ( oldStyle & LVS_SORTDESCENDING )
- oldStyle -= LVS_SORTDESCENDING;
- wstyle |= LVS_SORTASCENDING;
- }
-
- if ( style & wxLC_SORT_DESCENDING )
- {
- if ( oldStyle & LVS_SORTASCENDING )
- oldStyle -= LVS_SORTASCENDING;
- wstyle |= LVS_SORTDESCENDING;
- }
-
-#if !( defined(__GNUWIN32__) && !wxCHECK_W32API_VERSION( 1, 0 ) )
- if ( style & wxLC_VIRTUAL )
- {
- int ver = wxTheApp->GetComCtl32Version();
- if ( ver < 470 )
- {
- wxLogWarning(_("Please install a newer version of comctl32.dll\n(at least version 4.70 is required but you have %d.%02d)\nor this program won't operate correctly."),
- ver / 100, ver % 100);
- }
-
- wstyle |= LVS_OWNERDATA;
- }
-#endif
-
- return wstyle;
-}
-
// ----------------------------------------------------------------------------
// accessors
// ----------------------------------------------------------------------------
wxColour wxListCtrl::GetItemTextColour( long item ) const
{
- wxListItem info;
- info.m_itemId = item;
- GetItem( info );
- return info.GetTextColour();
+ wxColour col;
+ wxListItemInternalData *data = wxGetInternalData(this, item);
+ if ( data && data->attr )
+ col = data->attr->GetTextColour();
+
+ return col;
}
void wxListCtrl::SetItemBackgroundColour( long item, const wxColour &col )
wxColour wxListCtrl::GetItemBackgroundColour( long item ) const
{
- wxListItem info;
- info.m_itemId = item;
- GetItem( info );
- return info.GetBackgroundColour();
+ wxColour col;
+ wxListItemInternalData *data = wxGetInternalData(this, item);
+ if ( data && data->attr )
+ col = data->attr->GetBackgroundColour();
+
+ return col;
}
// Gets the number of selected items in the list control
{
// take copy of attributes
data->attr = new wxListItemAttr(*info.GetAttributes());
+
+ // and remember that we have some now...
+ m_hasAnyAttr = TRUE;
}
};
event.m_col = nmHDR->iItem;
break;
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && _WIN32_WCE < 400
case GN_CONTEXTMENU:
#endif //__WXWINCE__
case NM_RCLICK:
// where did the click occur?
POINT ptClick;
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && _WIN32_WCE < 400
if(nmhdr->code == GN_CONTEXTMENU) {
ptClick = ((NMRGINFO*)nmhdr)->ptAction;
} else
event.m_item.m_data = GetItemData(iItem);
break;
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && _WIN32_WCE < 400
case GN_CONTEXTMENU:
#endif //__WXWINCE__
case NM_RCLICK:
LV_HITTESTINFO lvhti;
wxZeroMemory(lvhti);
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && _WIN32_WCE < 400
if(nmhdr->code == GN_CONTEXTMENU) {
lvhti.pt = ((NMRGINFO*)nmhdr)->ptAction;
} else
RefreshRect(rect);
}
+// ----------------------------------------------------------------------------
+// internal data stuff
+// ----------------------------------------------------------------------------
+
static wxListItemInternalData *wxGetInternalData(HWND hwnd, long itemId)
{
LV_ITEM it;
it.mask = LVIF_PARAM;
it.iItem = itemId;
- bool success = ListView_GetItem(hwnd, &it) != 0;
- if (success)
- return (wxListItemInternalData *) it.lParam;
- else
+ if ( !ListView_GetItem(hwnd, &it) )
return NULL;
+
+ return (wxListItemInternalData *) it.lParam;
};
-static wxListItemInternalData *wxGetInternalData(wxListCtrl *ctl, long itemId)
+static
+wxListItemInternalData *wxGetInternalData(const wxListCtrl *ctl, long itemId)
{
- return wxGetInternalData((HWND) ctl->GetHWND(), itemId);
+ return wxGetInternalData(GetHwndOf(ctl), itemId);
};
static wxListItemAttr *wxGetInternalDataAttr(wxListCtrl *ctl, long itemId)
{
wxListItemInternalData *data = wxGetInternalData(ctl, itemId);
- if (data)
- return data->attr;
- else
- return NULL;
+
+ return data ? data->attr : NULL;
};
static void wxDeleteInternalData(wxListCtrl* ctl, long itemId)
}
}
+// ----------------------------------------------------------------------------
+// wxWin <-> MSW items conversions
+// ----------------------------------------------------------------------------
+
static void wxConvertFromMSWListItem(HWND hwndListCtrl,
wxListItem& info,
LV_ITEM& lvItem)