/////////////////////////////////////////////////////////////////////////////
// Name: listctrl.cpp
// Purpose: wxListCtrl. See also Robert's generic wxListCtrl
-// Author: AUTHOR
+// Author: David Webster
// Modified by:
-// Created: ??/??/98
+// Created: 10/10/99
// RCS-ID: $Id$
-// Copyright: (c) AUTHOR
-// Licence: wxWindows licence
+// Copyright: (c) David Webster
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "listctrl.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
#endif
-#include "wx/stubs/textctrl.h"
-#include "wx/stubs/listctrl.h"
+#include "wx/listctrl.h"
+#include "wx/log.h"
+
+#include "wx/os2/private.h"
+
+// TODO: not sure if we will need these
+/*
+static void wxConvertToOS2ListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ITEM& tvItem);
+static void wxConvertFromOS2ListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ITEM& tvItem, HWND getFullInfo = 0);
+*/
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl)
IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject)
-
#endif
wxListCtrl::wxListCtrl()
{
- m_imageListNormal = NULL;
- m_imageListSmall = NULL;
- m_imageListState = NULL;
- m_baseStyle = 0;
+ m_imageListNormal = NULL;
+ m_imageListSmall = NULL;
+ m_imageListState = NULL;
+ m_baseStyle = 0;
m_colCount = 0;
+ m_textCtrl = NULL;
}
bool wxListCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
SetValidator(validator);
SetName(name);
+ int x = pos.x;
+ int y = pos.y;
+ int width = size.x;
+ int height = size.y;
+
m_windowStyle = style;
SetParent(parent);
if (parent) parent->AddChild(this);
// TODO create list control
+// DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP |
+// LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS;
+// if ( wxStyleHasBorder(m_windowStyle) )
+// wstyle |= WS_BORDER;
+// m_baseStyle = wstyle;
+//
+// if ( !DoCreateControl(x, y, width, height) )
+// return FALSE;
+//
+// if (parent)
+// parent->AddChild(this);
return TRUE;
}
+bool wxListCtrl::DoCreateControl(int x, int y, int w, int h)
+{
+ DWORD wstyle = m_baseStyle;
+
+ bool want3D;
+// TODO
+// WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D);
+
+ // Even with extended styles, need to combine with WS_BORDER
+ // for them to look right.
+// if ( want3D )
+// wstyle |= WS_BORDER;
+
+// long oldStyle = 0; // Dummy
+// wstyle |= ConvertToMSWStyle(oldStyle, m_windowStyle);
+
+ // Create the ListView control.
+// m_hWnd = (WXHWND)CreateWindowEx(exStyle,
+// WC_LISTVIEW,
+// wxT(""),
+// wstyle,
+// x, y, w, h,
+// GetWinHwnd(GetParent()),
+// (HMENU)m_windowId,
+// wxGetInstance(),
+// NULL);
+
+// if ( !m_hWnd )
+// {
+// wxLogError(wxT("Can't create list control window."));
+//
+// return FALSE;
+// }
+
+ // for comctl32.dll v 4.70+ we want to have this attribute because it's
+ // prettier (and also because wxGTK does it like this)
+#ifdef ListView_SetExtendedListViewStyle
+// if ( wstyle & LVS_REPORT )
+// {
+// ListView_SetExtendedListViewStyle(GetHwnd(),
+// LVS_EX_FULLROWSELECT);
+// }
+#endif // ListView_SetExtendedListViewStyle
+
+ SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
+ SetForegroundColour(GetParent()->GetForegroundColour());
+
+// SubclassWin(m_hWnd);
+
+ return TRUE;
+}
+
+void wxListCtrl::UpdateStyle()
+{
+/*
+ if ( GetHWND() )
+ {
+ // The new window view style
+ long dummy;
+ DWORD dwStyleNew = ConvertToMSWStyle(dummy, m_windowStyle);
+ dwStyleNew |= m_baseStyle;
+
+ // Get the current window style.
+ DWORD dwStyleOld = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+
+ // Only set the window style if the view bits have changed.
+ if ( dwStyleOld != dwStyleNew )
+ {
+ ::SetWindowLong(GetHwnd(), GWL_STYLE, dwStyleNew);
+ }
+ }
+*/
+}
wxListCtrl::~wxListCtrl()
{
+ if (m_textCtrl)
+ {
+ m_textCtrl->UnsubclassWin();
+ m_textCtrl->SetHWND(0);
+ delete m_textCtrl;
+ m_textCtrl = NULL;
+ }
}
// Add or remove a single window style
void wxListCtrl::SetSingleStyle(long style, bool add)
{
- long flag = GetWindowStyleFlag();
-
- // Get rid of conflicting styles
- if ( add )
- {
- if ( style & wxLC_MASK_TYPE)
- flag = flag & ~wxLC_MASK_TYPE ;
- if ( style & wxLC_MASK_ALIGN )
- flag = flag & ~wxLC_MASK_ALIGN ;
- if ( style & wxLC_MASK_SORT )
- flag = flag & ~wxLC_MASK_SORT ;
- }
+ long flag = GetWindowStyleFlag();
- if ( flag & style )
- {
- if ( !add )
- flag -= style;
- }
- else
- {
- if ( add )
- {
- flag |= style;
- }
- }
+ // Get rid of conflicting styles
+ if ( add )
+ {
+ if ( style & wxLC_MASK_TYPE)
+ flag = flag & ~wxLC_MASK_TYPE ;
+ if ( style & wxLC_MASK_ALIGN )
+ flag = flag & ~wxLC_MASK_ALIGN ;
+ if ( style & wxLC_MASK_SORT )
+ flag = flag & ~wxLC_MASK_SORT ;
+ }
+
+ if ( flag & style )
+ {
+ if ( !add )
+ flag -= style;
+ }
+ else
+ {
+ if ( add )
+ {
+ flag |= style;
+ }
+ }
- m_windowStyle = flag;
+ m_windowStyle = flag;
- /* TODO RecreateWindow(); */
+ UpdateStyle();
}
// Set the whole window style
void wxListCtrl::SetWindowStyleFlag(long flag)
{
- m_windowStyle = flag;
+ m_windowStyle = flag;
- /* TODO RecreateWindow(); */
+ UpdateStyle();
}
+// Can be just a single style, or a bitlist
+long wxListCtrl::ConvertToOS2Style(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;
+
+ // Apparently, no such style (documentation wrong?)
+ // if ( style & wxLC_BUTTON )
+ // wstyle |= LVS_BUTTON;
+
+ 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;
+ }
+*/
+ return wstyle;
+}
+
+// Sets the background colour (GetBackgroundColour already implicit in
+// wxWindow class)
+bool wxListCtrl::SetBackgroundColour(const wxColour& col)
+{
+ if ( !wxWindow::SetBackgroundColour(col) )
+ return FALSE;
+
+// ListView_SetBkColor(GetHwnd(), PALETTERGB(col.Red(), col.Green(), col.Blue()));
+
+ return TRUE;
+}
// Gets information about this column
bool wxListCtrl::GetColumn(int col, wxListItem& item) const
{
- // TODO
+ // TODO
return FALSE;
}
// Sets information about this column
bool wxListCtrl::SetColumn(int col, wxListItem& item)
{
- // TODO
+ // TODO
return FALSE;
}
// Gets the column width
int wxListCtrl::GetColumnWidth(int col) const
{
- // TODO
+ // TODO
return 0;
}
// Sets the column width
bool wxListCtrl::SetColumnWidth(int col, int width)
{
- // TODO
+ // TODO
return FALSE;
}
// or small icon view)
int wxListCtrl::GetCountPerPage() const
{
- // TODO
+ // TODO
return 0;
}
// Gets the edit control for editing labels.
wxTextCtrl* wxListCtrl::GetEditControl() const
{
- return m_textCtrl;
+ return m_textCtrl;
}
// Gets information about the item
bool wxListCtrl::GetItem(wxListItem& info) const
{
- // TODO
+ // TODO
return FALSE;
}
// Sets information about the item
bool wxListCtrl::SetItem(wxListItem& info)
{
- // TODO
+ // TODO
return FALSE;
}
long wxListCtrl::SetItem(long index, int col, const wxString& label, int imageId)
{
- wxListItem info;
- info.m_text = label;
- info.m_mask = wxLIST_MASK_TEXT;
- info.m_itemId = index;
- info.m_col = col;
- if ( imageId > -1 )
- {
- info.m_image = imageId;
- info.m_mask |= wxLIST_MASK_IMAGE;
- }
- return SetItem(info);
+ wxListItem info;
+ info.m_text = label;
+ info.m_mask = wxLIST_MASK_TEXT;
+ info.m_itemId = index;
+ info.m_col = col;
+ if ( imageId > -1 )
+ {
+ info.m_image = imageId;
+ info.m_mask |= wxLIST_MASK_IMAGE;
+ }
+ return SetItem(info);
}
// Gets the item state
int wxListCtrl::GetItemState(long item, long stateMask) const
{
- wxListItem info;
+ wxListItem info;
- info.m_mask = wxLIST_MASK_STATE ;
- info.m_stateMask = stateMask;
- info.m_itemId = item;
+ info.m_mask = wxLIST_MASK_STATE ;
+ info.m_stateMask = stateMask;
+ info.m_itemId = item;
- if (!GetItem(info))
- return 0;
+ if (!GetItem(info))
+ return 0;
- return info.m_state;
+ return info.m_state;
}
// Sets the item state
bool wxListCtrl::SetItemState(long item, long state, long stateMask)
{
- wxListItem info;
+ wxListItem info;
- info.m_mask = wxLIST_MASK_STATE ;
- info.m_state = state;
- info.m_stateMask = stateMask;
- info.m_itemId = item;
+ info.m_mask = wxLIST_MASK_STATE ;
+ info.m_state = state;
+ info.m_stateMask = stateMask;
+ info.m_itemId = item;
- return SetItem(info);
+ return SetItem(info);
}
// Sets the item image
bool wxListCtrl::SetItemImage(long item, int image, int selImage)
{
- wxListItem info;
+ wxListItem info;
- info.m_mask = wxLIST_MASK_IMAGE ;
- info.m_image = image;
- info.m_itemId = item;
+ info.m_mask = wxLIST_MASK_IMAGE ;
+ info.m_image = image;
+ info.m_itemId = item;
- return SetItem(info);
+ return SetItem(info);
}
// Gets the item text
wxString wxListCtrl::GetItemText(long item) const
{
- wxListItem info;
+ wxListItem info;
- info.m_mask = wxLIST_MASK_TEXT ;
- info.m_itemId = item;
+ info.m_mask = wxLIST_MASK_TEXT ;
+ info.m_itemId = item;
- if (!GetItem(info))
- return wxString("");
- return info.m_text;
+ if (!GetItem(info))
+ return wxString("");
+ return info.m_text;
}
// Sets the item text
void wxListCtrl::SetItemText(long item, const wxString& str)
{
- wxListItem info;
+ wxListItem info;
- info.m_mask = wxLIST_MASK_TEXT ;
- info.m_itemId = item;
- info.m_text = str;
+ info.m_mask = wxLIST_MASK_TEXT ;
+ info.m_itemId = item;
+ info.m_text = str;
- SetItem(info);
+ SetItem(info);
}
// Gets the item data
long wxListCtrl::GetItemData(long item) const
{
- wxListItem info;
+ wxListItem info;
- info.m_mask = wxLIST_MASK_DATA ;
- info.m_itemId = item;
+ info.m_mask = wxLIST_MASK_DATA ;
+ info.m_itemId = item;
- if (!GetItem(info))
- return 0;
- return info.m_data;
+ if (!GetItem(info))
+ return 0;
+ return info.m_data;
}
// Sets the item data
bool wxListCtrl::SetItemData(long item, long data)
{
- wxListItem info;
+ wxListItem info;
- info.m_mask = wxLIST_MASK_DATA ;
- info.m_itemId = item;
- info.m_data = data;
+ info.m_mask = wxLIST_MASK_DATA ;
+ info.m_itemId = item;
+ info.m_data = data;
- return SetItem(info);
+ return SetItem(info);
}
// Gets the item rectangle
bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const
{
- // TODO
+ // TODO
return FALSE;
}
// Gets the item position
bool wxListCtrl::GetItemPosition(long item, wxPoint& pos) const
{
- // TODO
+ // TODO
return FALSE;
}
// Sets the item position.
bool wxListCtrl::SetItemPosition(long item, const wxPoint& pos)
{
- // TODO
+ // TODO
return FALSE;
}
// Gets the number of items in the list control
int wxListCtrl::GetItemCount() const
{
- // TODO
+ // TODO
return FALSE;
}
// view, otherwise the large icon view.
int wxListCtrl::GetItemSpacing(bool isSmall) const
{
- // TODO
+ // TODO
return FALSE;
}
// Gets the number of selected items in the list control
int wxListCtrl::GetSelectedItemCount() const
{
- // TODO
+ // TODO
return FALSE;
}
// Gets the text colour of the listview
wxColour wxListCtrl::GetTextColour() const
{
- // TODO
+ // TODO
return wxColour();
}
// Sets the text colour of the listview
void wxListCtrl::SetTextColour(const wxColour& col)
{
- // TODO
+ // TODO
}
// Gets the index of the topmost visible item when in
// list or report view
long wxListCtrl::GetTopItem() const
{
- // TODO
+ // TODO
return 0;
}
// Returns the item or -1 if unsuccessful.
long wxListCtrl::GetNextItem(long item, int geom, int state) const
{
- // TODO
+ // TODO
return 0;
}
wxImageList *wxListCtrl::GetImageList(int which) const
{
- if ( which == wxIMAGE_LIST_NORMAL )
+ if ( which == wxIMAGE_LIST_NORMAL )
{
- return m_imageListNormal;
- }
- else if ( which == wxIMAGE_LIST_SMALL )
+ return m_imageListNormal;
+ }
+ else if ( which == wxIMAGE_LIST_SMALL )
{
- return m_imageListSmall;
- }
- else if ( which == wxIMAGE_LIST_STATE )
+ return m_imageListSmall;
+ }
+ else if ( which == wxIMAGE_LIST_STATE )
{
- return m_imageListState;
- }
- return NULL;
+ return m_imageListState;
+ }
+ return NULL;
}
void wxListCtrl::SetImageList(wxImageList *imageList, int which)
{
- int flags = 0;
- if ( which == wxIMAGE_LIST_NORMAL )
+ int flags = 0;
+ if ( which == wxIMAGE_LIST_NORMAL )
{
- m_imageListNormal = imageList;
- }
- else if ( which == wxIMAGE_LIST_SMALL )
+ m_imageListNormal = imageList;
+ }
+ else if ( which == wxIMAGE_LIST_SMALL )
{
- m_imageListSmall = imageList;
- }
- else if ( which == wxIMAGE_LIST_STATE )
+ m_imageListSmall = imageList;
+ }
+ else if ( which == wxIMAGE_LIST_STATE )
{
- m_imageListState = imageList;
- }
- // TODO set image list
+ m_imageListState = imageList;
+ }
+ // TODO set image list
}
// Operations
// Arranges the items
bool wxListCtrl::Arrange(int flag)
{
- // TODO
+ // TODO
return FALSE;
}
// Deletes an item
bool wxListCtrl::DeleteItem(long item)
{
- // TODO
+ // TODO
return FALSE;
}
// Deletes all items
bool wxListCtrl::DeleteAllItems()
{
- // TODO
+ // TODO
return FALSE;
}
// Deletes all items
bool wxListCtrl::DeleteAllColumns()
{
- // TODO
+ // TODO
return FALSE;
}
// Deletes a column
bool wxListCtrl::DeleteColumn(int col)
{
- // TODO
+ // TODO
return FALSE;
}
long wxListCtrl::InsertItem(long index, const wxString& label)
{
- wxListItem info;
- info.m_text = label;
- info.m_mask = wxLIST_MASK_TEXT;
- info.m_itemId = index;
- return InsertItem(info);
+ wxListItem info;
+ info.m_text = label;
+ info.m_mask = wxLIST_MASK_TEXT;
+ info.m_itemId = index;
+ return InsertItem(info);
}
// Inserts an image item
long wxListCtrl::InsertItem(long index, int imageIndex)
{
- wxListItem info;
- info.m_image = imageIndex;
- info.m_mask = wxLIST_MASK_IMAGE;
- info.m_itemId = index;
- return InsertItem(info);
+ wxListItem info;
+ info.m_image = imageIndex;
+ info.m_mask = wxLIST_MASK_IMAGE;
+ info.m_itemId = index;
+ return InsertItem(info);
}
// Inserts an image/string item
long wxListCtrl::InsertItem(long index, const wxString& label, int imageIndex)
{
- wxListItem info;
- info.m_image = imageIndex;
- info.m_text = label;
- info.m_mask = wxLIST_MASK_IMAGE | wxLIST_MASK_TEXT;
- info.m_itemId = index;
- return InsertItem(info);
+ wxListItem info;
+ info.m_image = imageIndex;
+ info.m_text = label;
+ info.m_mask = wxLIST_MASK_IMAGE | wxLIST_MASK_TEXT;
+ info.m_itemId = index;
+ return InsertItem(info);
}
// For list view mode (only), inserts a column.
long wxListCtrl::InsertColumn(long col, const wxString& heading, int format,
int width)
{
- wxListItem item;
- item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT;
- item.m_text = heading;
- if ( width > -1 )
- {
- item.m_mask |= wxLIST_MASK_WIDTH;
- item.m_width = width;
- }
- item.m_format = format;
+ wxListItem item;
+ item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT;
+ item.m_text = heading;
+ if ( width > -1 )
+ {
+ item.m_mask |= wxLIST_MASK_WIDTH;
+ item.m_width = width;
+ }
+ item.m_format = format;
- return InsertColumn(col, item);
+ return InsertColumn(col, item);
}
// Scrolls the list control. If in icon, small icon or report view mode,
return FALSE;
}
+bool wxListCtrl::OS2Command(WXUINT cmd, WXWORD id)
+{
+/*
+ if (cmd == EN_UPDATE)
+ {
+ wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, id);
+ event.SetEventObject( this );
+ ProcessCommand(event);
+ return TRUE;
+ }
+ else if (cmd == EN_KILLFOCUS)
+ {
+ wxCommandEvent event(wxEVT_KILL_FOCUS, id);
+ event.SetEventObject( this );
+ ProcessCommand(event);
+ return TRUE;
+ }
+ else
+ return FALSE;
+*/
+ return FALSE;
+}
+
+bool wxListCtrl::OS2OnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
+{
+ // TODO
+/*
+ wxListEvent event(wxEVT_NULL, m_windowId);
+ wxEventType eventType = wxEVT_NULL;
+ NMHDR *hdr1 = (NMHDR *) lParam;
+ switch ( hdr1->code )
+ {
+ case LVN_BEGINRDRAG:
+ eventType = wxEVT_COMMAND_LIST_BEGIN_RDRAG;
+ // fall through
+
+ case LVN_BEGINDRAG:
+ if ( eventType == wxEVT_NULL )
+ {
+ eventType = wxEVT_COMMAND_LIST_BEGIN_DRAG;
+ }
+
+ {
+ NM_LISTVIEW *hdr = (NM_LISTVIEW *)lParam;
+ event.m_itemIndex = hdr->iItem;
+ event.m_pointDrag.x = hdr->ptAction.x;
+ event.m_pointDrag.y = hdr->ptAction.y;
+ }
+ break;
+
+ case LVN_BEGINLABELEDIT:
+ {
+ eventType = wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT;
+ LV_DISPINFO *info = (LV_DISPINFO *)lParam;
+ wxConvertFromMSWListItem(this, event.m_item, info->item, GetHwnd());
+ break;
+ }
+
+ case LVN_COLUMNCLICK:
+ {
+ eventType = wxEVT_COMMAND_LIST_COL_CLICK;
+ NM_LISTVIEW* hdr = (NM_LISTVIEW*)lParam;
+ event.m_itemIndex = -1;
+ event.m_col = hdr->iSubItem;
+ break;
+ }
+
+ case LVN_DELETEALLITEMS:
+ // what's the sense of generating a wxWin event for this when
+ // it's absolutely not portable?
+#if 0
+ eventType = wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS;
+ event.m_itemIndex = -1;
+#endif // 0
+
+ // return TRUE to suppress all additional LVN_DELETEITEM
+ // notifications - this makes deleting all items from a list ctrl
+ // much faster
+ *result = TRUE;
+ return TRUE;
+
+ case LVN_DELETEITEM:
+ {
+ eventType = wxEVT_COMMAND_LIST_DELETE_ITEM;
+ NM_LISTVIEW* hdr = (NM_LISTVIEW*)lParam;
+ event.m_itemIndex = hdr->iItem;
+ break;
+ }
+ case LVN_ENDLABELEDIT:
+ {
+ eventType = wxEVT_COMMAND_LIST_END_LABEL_EDIT;
+ LV_DISPINFO *info = (LV_DISPINFO *)lParam;
+ wxConvertFromMSWListItem(this, event.m_item, info->item, GetHwnd());
+ if ( info->item.pszText == NULL || info->item.iItem == -1 )
+ event.m_cancelled = TRUE;
+ break;
+ }
+ case LVN_GETDISPINFO:
+ return FALSE;
+
+ // this provokes stack overflow: indeed, wxConvertFromMSWListItem()
+ // sends us WM_NOTIFY! As it doesn't do anything for now, just leave
+ // it out.
+#if 0
+ {
+ // TODO: some text buffering here, I think
+ // TODO: API for getting Windows to retrieve values
+ // on demand.
+ eventType = wxEVT_COMMAND_LIST_GET_INFO;
+ LV_DISPINFO *info = (LV_DISPINFO *)lParam;
+ wxConvertFromMSWListItem(this, event.m_item, info->item, GetHwnd());
+ break;
+ }
+#endif // 0
+
+ case LVN_INSERTITEM:
+ {
+ eventType = wxEVT_COMMAND_LIST_INSERT_ITEM;
+ NM_LISTVIEW* hdr = (NM_LISTVIEW*)lParam;
+ event.m_itemIndex = hdr->iItem;
+ break;
+ }
+ case LVN_ITEMCHANGED:
+ {
+ // This needs to be sent to wxListCtrl as a rather more
+ // concrete event. For now, just detect a selection
+ // or deselection.
+ NM_LISTVIEW* hdr = (NM_LISTVIEW*)lParam;
+ if ( (hdr->uNewState & LVIS_SELECTED) && !(hdr->uOldState & LVIS_SELECTED) )
+ {
+ eventType = wxEVT_COMMAND_LIST_ITEM_SELECTED;
+ event.m_itemIndex = hdr->iItem;
+ }
+ else if ( !(hdr->uNewState & LVIS_SELECTED) && (hdr->uOldState & LVIS_SELECTED) )
+ {
+ eventType = wxEVT_COMMAND_LIST_ITEM_DESELECTED;
+ event.m_itemIndex = hdr->iItem;
+ }
+ else
+ return FALSE;
+ break;
+ }
+
+ case LVN_KEYDOWN:
+ {
+ LV_KEYDOWN *info = (LV_KEYDOWN *)lParam;
+ WORD wVKey = info->wVKey;
+
+ // get the current selection
+ long lItem = GetNextItem(-1,
+ wxLIST_NEXT_ALL,
+ wxLIST_STATE_SELECTED);
+
+ // <Enter> or <Space> activate the selected item if any
+ if ( lItem != -1 && (wVKey == VK_RETURN || wVKey == VK_SPACE) )
+ {
+ // TODO this behaviour probably should be optional
+ eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED;
+ event.m_itemIndex = lItem;
+ }
+ else
+ {
+ eventType = wxEVT_COMMAND_LIST_KEY_DOWN;
+ event.m_code = wxCharCodeMSWToWX(wVKey);
+ }
+ break;
+ }
+
+ case NM_DBLCLK:
+ // if the user processes it in wxEVT_COMMAND_LEFT_CLICK(), don't do
+ // anything else
+ if ( wxControl::MSWOnNotify(idCtrl, lParam, result) )
+ {
+ return TRUE;
+ }
+
+ // else translate it into wxEVT_COMMAND_LIST_ITEM_ACTIVATED event
+ eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED;
+ break;
+
+ case LVN_SETDISPINFO:
+ {
+ eventType = wxEVT_COMMAND_LIST_SET_INFO;
+ LV_DISPINFO *info = (LV_DISPINFO *)lParam;
+ wxConvertFromMSWListItem(this, event.m_item, info->item, GetHwnd());
+ break;
+ }
+
+ default:
+ return wxControl::MSWOnNotify(idCtrl, lParam, result);
+ }
+
+ event.SetEventObject( this );
+ event.SetEventType(eventType);
+
+ if ( !GetEventHandler()->ProcessEvent(event) )
+ return FALSE;
+
+ if (hdr1->code == LVN_GETDISPINFO)
+ {
+ LV_DISPINFO *info = (LV_DISPINFO *)lParam;
+ if ( info->item.mask & LVIF_TEXT )
+ {
+ if ( !event.m_item.m_text.IsNull() )
+ {
+ info->item.pszText = AddPool(event.m_item.m_text);
+ info->item.cchTextMax = wxStrlen(info->item.pszText) + 1;
+ }
+ }
+ // wxConvertToMSWListItem(this, event.m_item, info->item);
+ }
+
+ *result = !event.IsAllowed();
+*/
+ return TRUE;
+}
+
+wxChar *wxListCtrl::AddPool(const wxString& str)
+{
+ // Remove the first element if 3 strings exist
+ if ( m_stringPool.Number() == 3 )
+ {
+ wxNode *node = m_stringPool.First();
+ delete[] (char *)node->Data();
+ delete node;
+ }
+ wxNode *node = m_stringPool.Add(WXSTRINGCAST str);
+ return (wxChar *)node->Data();
+}
// List item structure
wxListItem::wxListItem()
{
m_state = 0;
m_stateMask = 0;
m_image = 0;
- m_data = 0;
+ m_data = 0;
- m_format = wxLIST_FORMAT_CENTRE;
- m_width = 0;
+ m_format = wxLIST_FORMAT_CENTRE;
+ m_width = 0;
}
+// TODO see if we need these
+/*
+static void wxConvertFromOS2ListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ITEM& lvItem, HWND getFullInfo)
+{
+ info.m_data = lvItem.lParam;
+ info.m_mask = 0;
+ info.m_state = 0;
+ info.m_stateMask = 0;
+ info.m_itemId = lvItem.iItem;
+
+ long oldMask = lvItem.mask;
+
+ bool needText = FALSE;
+ if (getFullInfo != 0)
+ {
+ if ( lvItem.mask & LVIF_TEXT )
+ needText = FALSE;
+ else
+ needText = TRUE;
+
+ if ( needText )
+ {
+ lvItem.pszText = new wxChar[513];
+ lvItem.cchTextMax = 512;
+ }
+ // lvItem.mask |= TVIF_HANDLE | TVIF_STATE | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM;
+ lvItem.mask |= LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+ ::SendMessage(getFullInfo, LVM_GETITEM, 0, (LPARAM)& lvItem);
+ }
+
+ if ( lvItem.mask & LVIF_STATE )
+ {
+ info.m_mask |= wxLIST_MASK_STATE;
+
+ if ( lvItem.stateMask & LVIS_CUT)
+ {
+ info.m_stateMask |= wxLIST_STATE_CUT;
+ if ( lvItem.state & LVIS_CUT )
+ info.m_state |= wxLIST_STATE_CUT;
+ }
+ if ( lvItem.stateMask & LVIS_DROPHILITED)
+ {
+ info.m_stateMask |= wxLIST_STATE_DROPHILITED;
+ if ( lvItem.state & LVIS_DROPHILITED )
+ info.m_state |= wxLIST_STATE_DROPHILITED;
+ }
+ if ( lvItem.stateMask & LVIS_FOCUSED)
+ {
+ info.m_stateMask |= wxLIST_STATE_FOCUSED;
+ if ( lvItem.state & LVIS_FOCUSED )
+ info.m_state |= wxLIST_STATE_FOCUSED;
+ }
+ if ( lvItem.stateMask & LVIS_SELECTED)
+ {
+ info.m_stateMask |= wxLIST_STATE_SELECTED;
+ if ( lvItem.state & LVIS_SELECTED )
+ info.m_state |= wxLIST_STATE_SELECTED;
+ }
+ }
+
+ if ( lvItem.mask & LVIF_TEXT )
+ {
+ info.m_mask |= wxLIST_MASK_TEXT;
+ info.m_text = lvItem.pszText;
+ }
+ if ( lvItem.mask & LVIF_IMAGE )
+ {
+ info.m_mask |= wxLIST_MASK_IMAGE;
+ info.m_image = lvItem.iImage;
+ }
+ if ( lvItem.mask & LVIF_PARAM )
+ info.m_mask |= wxLIST_MASK_DATA;
+ if ( lvItem.mask & LVIF_DI_SETITEM )
+ info.m_mask |= wxLIST_SET_ITEM;
+ info.m_col = lvItem.iSubItem;
+
+ if (needText)
+ {
+ if (lvItem.pszText)
+ delete[] lvItem.pszText;
+ }
+ lvItem.mask = oldMask;
+}
+
+static void wxConvertToOS2ListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ITEM& lvItem)
+{
+ lvItem.iItem = (int) info.m_itemId;
+
+ lvItem.iImage = info.m_image;
+ lvItem.lParam = info.m_data;
+ lvItem.stateMask = 0;
+ lvItem.state = 0;
+ lvItem.mask = 0;
+ lvItem.iSubItem = info.m_col;
+
+ if (info.m_mask & wxLIST_MASK_STATE)
+ {
+ lvItem.mask |= LVIF_STATE;
+ if (info.m_stateMask & wxLIST_STATE_CUT)
+ {
+ lvItem.stateMask |= LVIS_CUT;
+ if (info.m_state & wxLIST_STATE_CUT)
+ lvItem.state |= LVIS_CUT;
+ }
+ if (info.m_stateMask & wxLIST_STATE_DROPHILITED)
+ {
+ lvItem.stateMask |= LVIS_DROPHILITED;
+ if (info.m_state & wxLIST_STATE_DROPHILITED)
+ lvItem.state |= LVIS_DROPHILITED;
+ }
+ if (info.m_stateMask & wxLIST_STATE_FOCUSED)
+ {
+ lvItem.stateMask |= LVIS_FOCUSED;
+ if (info.m_state & wxLIST_STATE_FOCUSED)
+ lvItem.state |= LVIS_FOCUSED;
+ }
+ if (info.m_stateMask & wxLIST_STATE_SELECTED)
+ {
+ lvItem.stateMask |= LVIS_SELECTED;
+ if (info.m_state & wxLIST_STATE_SELECTED)
+ lvItem.state |= LVIS_SELECTED;
+ }
+ }
+
+ if (info.m_mask & wxLIST_MASK_TEXT)
+ {
+ lvItem.mask |= LVIF_TEXT;
+ if ( ctrl->GetWindowStyleFlag() & wxLC_USER_TEXT )
+ {
+ lvItem.pszText = LPSTR_TEXTCALLBACK;
+ }
+ else
+ {
+ lvItem.pszText = WXSTRINGCAST info.m_text;
+ if ( lvItem.pszText )
+ lvItem.cchTextMax = info.m_text.Length();
+ else
+ lvItem.cchTextMax = 0;
+ }
+ }
+ if (info.m_mask & wxLIST_MASK_IMAGE)
+ lvItem.mask |= LVIF_IMAGE;
+ if (info.m_mask & wxLIST_MASK_DATA)
+ lvItem.mask |= LVIF_PARAM;
+}
+*/
+
// List event
IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxCommandEvent)
-wxListEvent::wxListEvent(wxEventType commandType, int id):
- wxCommandEvent(commandType, id)
+wxListEvent::wxListEvent(wxEventType commandType, int id)
+ : wxNotifyEvent(commandType, id)
{
- m_code = 0;
- m_itemIndex = 0;
- m_col = 0;
- m_cancelled = FALSE;
+ m_code = 0;
+ m_itemIndex = 0;
+ m_col = 0;
+ m_cancelled = FALSE;
}