-/*
- * File: TreeCtrl.cpp
- * Purpose: Tree control
- * Author: Julian Smart
- * Created: 1997
- * Updated:
- * Copyright:
- */
-
-/* static const char sccsid[] = "%W% %G%"; */
+/////////////////////////////////////////////////////////////////////////////
+// Name: treectrl.cpp
+// Purpose: wxTreeCtrl
+// Author: Julian Smart
+// Modified by:
+// Created: 1997
+// RCS-ID: $Id$
+// Copyright: (c) Julian Smart
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "treectrl.h"
{
m_imageListNormal = NULL;
m_imageListState = NULL;
+ m_textCtrl = NULL;
}
-bool wxTreeCtrl::Create(wxWindow *parent, const wxWindowID id, const wxPoint& pos, const wxSize& size,
- const long style, const wxValidator& validator, const wxString& name)
+bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
+ long style, const wxValidator& validator, const wxString& name)
{
wxSystemSettings settings;
SetBackgroundColour(settings.GetSystemColour(wxSYS_COLOUR_WINDOW));
m_imageListNormal = NULL;
m_imageListState = NULL;
+ m_textCtrl = NULL;
int x = pos.x;
int y = pos.y;
m_windowId = (id == -1) ? NewControlId() : id;
- DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP | TVS_HASLINES | TVS_LINESATROOT;
+ DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP | TVS_HASLINES;
bool want3D;
WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D) ;
wstyle |= WS_BORDER;
if ( m_windowStyle & wxTR_HAS_BUTTONS )
- wstyle |= TVS_HASBUTTONS;
+ wstyle |= TVS_HASBUTTONS;
if ( m_windowStyle & wxTR_EDIT_LABELS )
- wstyle |= TVS_EDITLABELS;
+ wstyle |= TVS_EDITLABELS;
+
+ if ( m_windowStyle & wxTR_LINES_AT_ROOT )
+ wstyle |= TVS_LINESATROOT;
// Create the toolbar control.
HWND hWndTreeControl = CreateWindowEx(exStyle,
wxTreeCtrl::~wxTreeCtrl(void)
{
- m_textCtrl.SetHWND((WXHWND) NULL);
+ if (m_textCtrl)
+ {
+ m_textCtrl->UnsubclassWin();
+ m_textCtrl->SetHWND((WXHWND) 0);
+ delete m_textCtrl;
+ }
}
// Attributes
TreeView_SetIndent((HWND) GetHWND(), indent);
}
-wxImageList *wxTreeCtrl::GetImageList(const int which) const
+wxImageList *wxTreeCtrl::GetImageList(int which) const
{
if ( which == wxIMAGE_LIST_NORMAL )
{
return NULL;
}
-void wxTreeCtrl::SetImageList(wxImageList *imageList, const int which)
+void wxTreeCtrl::SetImageList(wxImageList *imageList, int which)
{
int flags = 0;
if ( which == wxIMAGE_LIST_NORMAL )
TreeView_SetImageList((HWND) GetHWND(), (HIMAGELIST) imageList ? imageList->GetHIMAGELIST() : 0, flags);
}
-long wxTreeCtrl::GetNextItem(const long item, int code) const
+long wxTreeCtrl::GetNextItem(long item, int code) const
{
UINT flag = 0;
switch ( code )
return (long) TreeView_GetNextItem( (HWND) GetHWND(), (HTREEITEM) item, flag);
}
-bool wxTreeCtrl::ItemHasChildren(const long item) const
+bool wxTreeCtrl::ItemHasChildren(long item) const
{
TV_ITEM item2;
item2.hItem = (HTREEITEM) item;
return (item2.cChildren != 0);
}
-long wxTreeCtrl::GetChild(const long item) const
+long wxTreeCtrl::GetChild(long item) const
{
return (long) ::SendMessage((HWND) GetHWND(), TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)item);
}
-long wxTreeCtrl::GetParent(const long item) const
+long wxTreeCtrl::GetParent(long item) const
{
return (long) ::SendMessage((HWND) GetHWND(), TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)item);
}
return (long) ::SendMessage((HWND) GetHWND(), TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0);
}
-long wxTreeCtrl::GetNextVisibleItem(const long item) const
+long wxTreeCtrl::GetNextVisibleItem(long item) const
{
return (long) ::SendMessage((HWND) GetHWND(), TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)item);
}
return (long) ::SendMessage((HWND) GetHWND(), TVM_GETNEXTITEM, TVGN_ROOT, 0);
}
-// TODO: convert mask
bool wxTreeCtrl::GetItem(wxTreeItem& info) const
{
TV_ITEM tvItem;
tvItem.hItem = (HTREEITEM)info.m_itemId;
tvItem.pszText = NULL;
- tvItem.mask = 0;
+ tvItem.mask =
+ tvItem.stateMask = 0;
+
+ // TODO: convert other bits in the mask
if ( info.m_mask & wxTREE_MASK_TEXT )
{
tvItem.mask |= TVIF_TEXT;
}
if ( info.m_mask & wxTREE_MASK_DATA )
tvItem.mask |= TVIF_PARAM;
+ if ( info.m_stateMask & wxTREE_STATE_EXPANDED ) {
+ tvItem.mask |= TVIF_STATE;
+ tvItem.stateMask |= TVIS_EXPANDED;
+ }
bool success = TreeView_GetItem((HWND)GetHWND(), &tvItem) != 0;
return (::SendMessage((HWND) GetHWND(), TVM_SETITEM, 0, (LPARAM)&item) != 0);
}
-int wxTreeCtrl::GetItemState(const long item, const long stateMask) const
+int wxTreeCtrl::GetItemState(long item, long stateMask) const
{
wxTreeItem info;
return info.m_state;
}
-bool wxTreeCtrl::SetItemState(const long item, const long state, const long stateMask)
+bool wxTreeCtrl::SetItemState(long item, long state, long stateMask)
{
wxTreeItem info;
return SetItem(info);
}
-bool wxTreeCtrl::SetItemImage(const long item, const int image, const int selImage)
+bool wxTreeCtrl::SetItemImage(long item, int image, int selImage)
{
wxTreeItem info;
return SetItem(info);
}
-wxString wxTreeCtrl::GetItemText(const long item) const
+wxString wxTreeCtrl::GetItemText(long item) const
{
wxTreeItem info;
return info.m_text;
}
-void wxTreeCtrl::SetItemText(const long item, const wxString& str)
+void wxTreeCtrl::SetItemText(long item, const wxString& str)
{
wxTreeItem info;
SetItem(info);
}
-long wxTreeCtrl::GetItemData(const long item) const
+long wxTreeCtrl::GetItemData(long item) const
{
wxTreeItem info;
return info.m_data;
}
-bool wxTreeCtrl::SetItemData(const long item, long data)
+bool wxTreeCtrl::SetItemData(long item, long data)
{
wxTreeItem info;
return SetItem(info);
}
-bool wxTreeCtrl::GetItemRect(const long item, wxRectangle& rect, bool textOnly) const
+bool wxTreeCtrl::GetItemRect(long item, wxRectangle& rect, bool textOnly) const
{
RECT rect2;
return success;
}
-wxTextCtrl& wxTreeCtrl::GetEditControl(void) const
+wxTextCtrl* wxTreeCtrl::GetEditControl(void) const
{
- HWND hWnd = (HWND) TreeView_GetEditControl((HWND) GetHWND());
- ((wxTreeCtrl *)this)->m_textCtrl.SetHWND((WXHWND) hWnd);
- return (wxTextCtrl&) m_textCtrl;
+ return m_textCtrl;
}
// Operations
-bool wxTreeCtrl::DeleteItem(const long item)
+bool wxTreeCtrl::DeleteItem(long item)
{
return (TreeView_DeleteItem((HWND) GetHWND(), (HTREEITEM) item) != 0);
}
-bool wxTreeCtrl::ExpandItem(const long item, const int action)
+bool wxTreeCtrl::ExpandItem(long item, int action)
{
UINT mswAction = TVE_EXPAND;
switch ( action )
case wxTREE_EXPAND_EXPAND:
mswAction = TVE_EXPAND;
break;
+
case wxTREE_EXPAND_COLLAPSE:
mswAction = TVE_COLLAPSE;
+ break;
+
case wxTREE_EXPAND_COLLAPSE_RESET:
+ // @@@ it should also delete all the items! currently, if you do use this
+ // code your program will probaly crash. Feel free to remove this if
+ // it does work
+ wxFAIL_MSG("wxTREE_EXPAND_COLLAPSE_RESET probably doesn't work.");
mswAction = TVE_COLLAPSERESET;
+ break;
+
case wxTREE_EXPAND_TOGGLE:
mswAction = TVE_TOGGLE;
break;
- default :
- break;
+
+ default:
+ wxFAIL_MSG("unknown action in wxTreeCtrl::ExpandItem");
+ }
+
+ bool bOk = TreeView_Expand((HWND)GetHWND(), (HTREEITEM)item, mswAction) != 0;
+
+ // TreeView_Expand doesn't send TVN_EXPAND(ING) messages, so emulate them
+ if ( bOk ) {
+ wxTreeEvent event(wxEVT_NULL, m_windowId);
+ event.m_item.m_itemId = item;
+ event.m_item.m_mask =
+ event.m_item.m_stateMask = 0xffff; // get all
+ GetItem(event.m_item);
+
+ bool bIsExpanded = (event.m_item.m_state & wxTREE_STATE_EXPANDED) != 0;
+
+ event.m_code = action;
+ event.SetEventObject(this);
+
+ // @@@ return values of {EXPAND|COLLAPS}ING event handler is discarded
+ event.SetEventType(bIsExpanded ? wxEVT_COMMAND_TREE_ITEM_EXPANDING
+ : wxEVT_COMMAND_TREE_ITEM_COLLAPSING);
+ GetEventHandler()->ProcessEvent(event);
+
+ event.SetEventType(bIsExpanded ? wxEVT_COMMAND_TREE_ITEM_EXPANDED
+ : wxEVT_COMMAND_TREE_ITEM_COLLAPSED);
+ GetEventHandler()->ProcessEvent(event);
}
- return (TreeView_Expand((HWND) GetHWND(), (HTREEITEM) item, mswAction) != 0);
+
+ return bOk;
}
-long wxTreeCtrl::InsertItem(const long parent, wxTreeItem& info, const long insertAfter)
+long wxTreeCtrl::InsertItem(long parent, wxTreeItem& info, long insertAfter)
{
TV_INSERTSTRUCT tvInsertStruct;
tvInsertStruct.hParent = (HTREEITEM) parent ;
return (long) TreeView_InsertItem((HWND) GetHWND(), & tvInsertStruct);
}
-long wxTreeCtrl::InsertItem(const long parent, const wxString& label, const int image, const int selImage,
- const long insertAfter)
+long wxTreeCtrl::InsertItem(long parent, const wxString& label, int image, int selImage,
+ long insertAfter)
{
wxTreeItem info;
info.m_text = label;
return InsertItem(parent, info, insertAfter);
}
-bool wxTreeCtrl::SelectItem(const long item)
+bool wxTreeCtrl::SelectItem(long item)
{
return (TreeView_SelectItem((HWND) GetHWND(), (HTREEITEM) item) != 0);
}
-bool wxTreeCtrl::ScrollTo(const long item)
+bool wxTreeCtrl::ScrollTo(long item)
{
return (TreeView_SelectSetFirstVisible((HWND) GetHWND(), (HTREEITEM) item) != 0);
}
return (TreeView_DeleteAllItems((HWND) GetHWND()) != 0);
}
-wxTextCtrl& wxTreeCtrl::Edit(const long item)
+wxTextCtrl* wxTreeCtrl::EditLabel(long item, wxClassInfo* textControlClass)
{
- HWND hWnd = (HWND) TreeView_EditLabel((HWND) GetHWND(), item);
- m_textCtrl.SetHWND((WXHWND) hWnd);
- return m_textCtrl;
+ wxASSERT( (textControlClass->IsKindOf(CLASSINFO(wxTextCtrl))) );
+
+ HWND hWnd = (HWND) TreeView_EditLabel((HWND) GetHWND(), item);
+
+ if (m_textCtrl)
+ {
+ m_textCtrl->UnsubclassWin();
+ m_textCtrl->SetHWND(0);
+ delete m_textCtrl;
+ m_textCtrl = NULL;
+ }
+
+ m_textCtrl = (wxTextCtrl*) textControlClass->CreateObject();
+ m_textCtrl->SetHWND((WXHWND) hWnd);
+ m_textCtrl->SubclassWin((WXHWND) hWnd);
+
+ return m_textCtrl;
+}
+
+// End label editing, optionally cancelling the edit
+bool wxTreeCtrl::EndEditLabel(bool cancel)
+{
+ bool success = (TreeView_EndEditLabelNow((HWND) GetHWND(), cancel) != 0);
+
+ if (m_textCtrl)
+ {
+ m_textCtrl->UnsubclassWin();
+ m_textCtrl->SetHWND(0);
+ delete m_textCtrl;
+ m_textCtrl = NULL;
+ }
+ return success;
}
long wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
}
/*
-wxImageList *wxTreeCtrl::CreateDragImage(const long item)
+wxImageList *wxTreeCtrl::CreateDragImage(long item)
{
}
*/
-bool wxTreeCtrl::SortChildren(const long item)
+bool wxTreeCtrl::SortChildren(long item)
{
return (TreeView_SortChildren((HWND) GetHWND(), (HTREEITEM) item, 0) != 0);
}
-bool wxTreeCtrl::EnsureVisible(const long item)
+bool wxTreeCtrl::EnsureVisible(long item)
{
return (TreeView_EnsureVisible((HWND) GetHWND(), (HTREEITEM) item) != 0);
}
-bool wxTreeCtrl::MSWCommand(const WXUINT cmd, const WXWORD id)
+bool wxTreeCtrl::MSWCommand(WXUINT cmd, WXWORD id)
{
if (cmd == EN_UPDATE)
{
else return FALSE;
}
-bool wxTreeCtrl::MSWNotify(const WXWPARAM wParam, const WXLPARAM lParam)
+bool wxTreeCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam)
{
- wxTreeEvent event(0, m_windowId);
- int eventType = 0;
+ wxTreeEvent event(wxEVT_NULL, m_windowId);
+ wxEventType eventType = wxEVT_NULL;
NMHDR* hdr1 = (NMHDR*) lParam;
switch ( hdr1->code )
{
}
case TVN_ITEMEXPANDING:
{
- eventType = wxEVT_COMMAND_TREE_ITEM_EXPANDING;
NM_TREEVIEW* hdr = (NM_TREEVIEW*)lParam;
wxConvertFromMSWTreeItem(event.m_item, hdr->itemNew, (HWND) GetHWND());
switch ( hdr->action )
{
case TVE_EXPAND:
- event.m_code = wxTREE_EXPAND_EXPAND;
+ eventType = wxEVT_COMMAND_TREE_ITEM_EXPANDING;
break;
+
case TVE_COLLAPSE:
- event.m_code = wxTREE_EXPAND_COLLAPSE;
+ eventType = wxEVT_COMMAND_TREE_ITEM_COLLAPSING;
+ break;
+
case TVE_COLLAPSERESET:
- event.m_code = wxTREE_EXPAND_COLLAPSE_RESET;
case TVE_TOGGLE:
- event.m_code = wxTREE_EXPAND_TOGGLE;
- break;
- default :
+ wxLogDebug("unexpected code in TVN_ITEMEXPANDING message");
break;
}
break;
}
+
case TVN_ITEMEXPANDED:
{
- eventType = wxEVT_COMMAND_TREE_ITEM_EXPANDED;
NM_TREEVIEW* hdr = (NM_TREEVIEW*)lParam;
wxConvertFromMSWTreeItem(event.m_item, hdr->itemNew, (HWND) GetHWND());
switch ( hdr->action )
{
case TVE_EXPAND:
- event.m_code = wxTREE_EXPAND_EXPAND;
+ eventType = wxEVT_COMMAND_TREE_ITEM_EXPANDED;
break;
+
case TVE_COLLAPSE:
- event.m_code = wxTREE_EXPAND_COLLAPSE;
+ eventType = wxEVT_COMMAND_TREE_ITEM_COLLAPSED;
+ break;
+
case TVE_COLLAPSERESET:
- event.m_code = wxTREE_EXPAND_COLLAPSE_RESET;
case TVE_TOGGLE:
- event.m_code = wxTREE_EXPAND_TOGGLE;
- break;
- default :
+ wxLogDebug("unexpected code in TVN_ITEMEXPANDED message");
break;
}
break;
break;
}
- event.SetEventObject( this );
+ event.SetEventObject(this);
event.SetEventType(eventType);
if ( !GetEventHandler()->ProcessEvent(event) )
wxConvertToMSWTreeItem(event.m_item, info->item);
}
- return TRUE;
+ return TRUE;
}
// Tree item structure
// Tree event
IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxCommandEvent)
-wxTreeEvent::wxTreeEvent(WXTYPE commandType, int id):
+wxTreeEvent::wxTreeEvent(wxEventType commandType, int id):
wxCommandEvent(commandType, id)
{
m_code = 0;