1 #include <creaImageIOWxTreeView.h>
2 #include <creaImageIOGimmickView.h>
3 #include <creaImageIOSystem.h>
4 #include <wx/splitter.h>
6 ///Comparing function for ordering algorithm. Takes parameters as strings.
7 int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
9 std::string s1((char*)((long*)item1)[1]);
10 std::string s2((char*)((long*)item2)[1]);
34 ///Comparing function for ordering algorithm. Takes parameters as ints.
35 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
37 int val1=atoi((char*)((long*)item1)[1]);
38 int val2=atoi((char*)((long*)item2)[1]);
64 //=====================================================================
66 WxTreeView::WxTreeView(TreeHandler* handler,
71 TreeView(handler,gimmick)
73 GimmickDebugMessage(1,"WxTreeView::WxTreeView"
77 // Split part below toolbar into notebook for views and panel
78 // for preview, messages...
80 // mSplitter = new wxSplitterWindow( this , -1);
83 wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
85 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
86 int col_style = wxLIST_FORMAT_LEFT;
88 // Creating the ListCtrl for the levels > 0 (not for Root level)
90 i < handler->GetTree().GetNumberOfLevels();
94 GimmickDebugMessage(5,"Creating view for level "<<i
98 // If the first level : parent = this
99 wxWindow* sparent = this;
100 // else parent = last splitter
101 if (i>1) sparent = mLevelList[i-2].wxSplitter;
103 level.wxSplitter = new wxSplitterWindow( sparent , -1);
106 level.wxSplitter->Show(false);
108 // level.wxSplitter->SetMinimumPaneSize(100);
110 wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
116 level.wxSplitter->Initialize(ctrl);
119 // Create the columns : one for each attribute of the level
122 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
123 for (a = handler->GetTree().GetAttributeDescriptorList(i).begin();
124 a != handler->GetTree().GetAttributeDescriptorList(i).end();
128 GimmickDebugMessage(5,"Creating column "<<col<<" : "
132 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
135 if(a->GetName()=="UNKNOWN")
138 title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
139 if (title[title.size()-1]!='s')
147 ctrl->InsertColumn(col,
150 level.key.push_back(a->GetKey());
151 // ctrl->SetColumnWidth(col, wxLIST_AUTOSIZE );
157 mLevelList.push_back(level);
163 wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
164 wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
165 wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
166 mAscendingID=m1->GetId();
167 mDescendingID=m2->GetId();
168 mFilterID=m3->GetId();
169 Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
170 Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
171 Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
173 #endif // wxUSE_MENUS
176 /// Initialize the first level splitter
178 sizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0);
183 mSelectionMade=false;
185 //CreateColorPalette();
193 //=====================================================================
195 //=====================================================================
197 WxTreeView::~WxTreeView()
199 GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
202 //=====================================================================
205 //=====================================================================
212 //=====================================================================
213 std::vector<tree::Node*> WxTreeView::GetSelected(int level)
216 // the selection of upper level
217 std::vector<tree::Node*> sel;
221 sel.push_back(GetTreeHandler()->GetTree().GetTree());
225 int n = GetCtrl(l-1)->GetItemCount();
226 for (int i = 0; i < n; i++)
228 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
230 long adr = GetCtrl(l-1)->GetItemData(i);
231 tree::Node* n = ((ItemData*)adr)->node;
234 std::vector<tree::Node*>::iterator it;
236 it = sel.insert ( it , n );
249 //=====================================================================
251 ///Removes selected nodes on last selected level
252 void WxTreeView::RemoveSelected()
255 std::vector<tree::Node*> sel=GetSelected(mLastLevel+1);
257 std::stringstream out;
258 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
261 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
268 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
270 if (wxMessageBox(_T(out.str()),
272 wxYES_NO,this ) == wxYES)
278 bool needRefresh=false;
279 std::vector<tree::Node*>::iterator i;
280 for (i=sel.begin(); i!=sel.end(); ++i)
287 if((*i)->GetParent()->GetNumberOfChildren()<2)
291 GetTreeHandler()->Remove(*i);
294 if(needRefresh && mLastLevel>1)
296 UpdateLevel(mLastLevel-2);
298 else if(mLastLevel>1)
300 UpdateLevel(mLastLevel-1);
304 UpdateLevel(mLastLevel);
311 //=====================================================================
314 //=====================================================================
315 /// Updates a level of the view (adds or removes children, proganizes, etc.)
316 void WxTreeView::UpdateLevel( int level )
318 GimmickDebugMessage(1,
319 GetTreeHandler()->GetTree().GetLabel()
320 <<" view : updating level "<<level
324 RecursiveUpdateLevel(level);
326 for (i=0; i<level-1; i++)
328 if (!GetSplitter(i)->IsSplit())
329 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),
332 if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();
335 //=====================================================================
337 /// Recursive method called upon by UpdateLevel to refresh all windows
338 void WxTreeView::RecursiveUpdateLevel( int level )
340 GimmickDebugMessage(2,
341 GetTreeHandler()->GetTree().GetLabel()
342 <<" view : updating level (recursive)"<<level
346 std::vector<tree::Node*> sel=GetSelected(level);
350 // to speed up inserting we hide the control temporarily
352 GetCtrl(l)->DeleteAllItems();
354 std::vector<tree::Node*>::iterator i;
356 for (i=sel.begin(); i!=sel.end(); ++i)
358 GimmickDebugMessage(2,
359 "adding children of '"
365 //Adds items and sets their attributes
366 GetCtrl(l)->InsertItem(0, _T(""));
367 GetTreeHandler()->LoadChildren(*i,1);
368 tree::Node::ChildrenListType::reverse_iterator j;
369 for (j = (*i)->GetChildrenList().rbegin();
370 j!= (*i)->GetChildrenList().rend();
373 wxListItem* item= new wxListItem;
374 item->SetMask(wxLIST_MASK_STATE |
376 // wxLIST_MASK_IMAGE |
378 // wxLIST_MASK_WIDTH |
382 ItemData* data = new ItemData;
391 GetCtrl(l)->InsertItem(*item);
395 for (int k=0; k<GetCtrl(l)->GetColumnCount(); k++)
397 std::string val = (*j)->GetAttribute(mLevelList[l].key[k]);
398 if (val.size()==0) val = "?";
399 item->SetText( crea::std2wx(val));
401 GetCtrl(l)->SetItem(*item);
405 GetCtrl(l)->DeleteItem(0);
411 //=====================================================================
414 //================================================================
415 void WxTreeView::OnSelectedChanged(wxListEvent& event)
417 GimmickDebugMessage(1,
418 GetTreeHandler()->GetTree().GetLabel()
419 <<" view : item selected "
423 info.m_itemId = event.m_itemIndex;
424 mLastSelected = event.m_itemIndex;
425 // retrieve the level
426 wxObject* obj = event.GetEventObject();
427 unsigned int level = 0;
428 for (level = 0; level<mLevelList.size(); ++level)
430 if ( GetCtrl(level) == obj ) break;
433 GimmickDebugMessage(1,
437 // Update the children level (if selection not at last level)
438 if (level<mLevelList.size()-1)
441 UpdateLevel( level + 2 );
442 // Reset the viewer setting the default image
443 GetGimmickView()->ClearSelection();
445 // Select all images if the selection is at series level
446 if (level==mLevelList.size()-2) SelectLowerLevel();
447 // Validate selected images if the selection is at image level
448 if (level==(mLevelList.size()-1)&&mProcess)
450 if(event.GetEventType()==10145)
452 ValidateSelectedImages (true);
456 ValidateSelectedImages (false);
461 //================================================================
463 //================================================================
464 void WxTreeView::SelectLowerLevel()
467 int level=mLevelList.size()-1;
470 item = GetCtrl(level)->GetNextItem(item,
475 if(item==(GetCtrl(level)->GetItemCount()-1))
483 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
484 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
488 //================================================================
489 //================================================================
491 void WxTreeView::OnColClick(wxListEvent& event)
493 mColumnSelected=event.m_col;
495 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
496 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
497 senderCtrl = event.GetEventObject();
498 unsigned int level = 0;
499 for (level = 0; level<mLevelList.size(); ++level)
501 if ( GetCtrl(level) == senderCtrl ) break;
503 PopupMenu(menu, clientpt);
507 //================================================================
508 //================================================================
510 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
513 GimmickDebugMessage(7,
514 "WxTreeView::OnEndLabelEdit"
516 wxObject* ctrl = event.GetEventObject();
517 unsigned int level = 0;
518 for (level = 0; level<mLevelList.size(); ++level)
520 if ( GetCtrl(level) == senderCtrl ) break;
522 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
527 UpdateLevel(level+1);
529 std::vector<long> items;
534 it = GetCtrl(level)->GetNextItem(it,
539 long adr = GetCtrl(level)->GetItemData(it);
540 tree::Node* nod = ((ItemData*)adr)->node;
541 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
544 if(att.find(filter)>900)
556 items.push_back(it-del);
560 std::vector<long>::iterator iter;
561 for(iter=items.begin();iter!=items.end();++iter)
563 GetCtrl(level)->DeleteItem(*iter);
565 GetGimmickView()->ClearSelection();
567 //================================================================
569 //================================================================
570 void WxTreeView::OnPopupSort(wxCommandEvent& event)
573 unsigned int level = 0;
574 for (level = 0; level<mLevelList.size(); ++level)
576 if ( GetCtrl(level) == senderCtrl ) break;
578 if(event.GetId()==mAscendingID)
582 else if(event.GetId()==mDescendingID)
589 //================================================================
590 void WxTreeView::OnSort(int level)
592 //Obtain the column name and the level that needs to be organized
595 //Sets the data for the items to be sorted
598 int n = GetCtrl(level)->GetItemCount();
599 for (int i = 0; i < n; i++)
602 //Gets current item data
603 long adr = GetCtrl(level)->GetItemData(i);
605 //Extracts the node and the type of attribute
606 tree::Node* nod = ((ItemData*)adr)->node;
609 (*nod).GetAttributeDescriptor(mLevelList[level].key[mColumnSelected]).DecodeType(ty);
611 //Obtains the organizing attribute
612 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
614 char* d= new char [att.size()+1];
615 strcpy (d, att.c_str());
618 long* lp= new long[2];
622 //Sets it as the data
623 GetCtrl(level)->SetItemData(i,(long)lp);
630 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
634 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
642 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
646 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
650 //Resets original data
654 it = GetCtrl(level)->GetNextItem(it,
659 //Gets current item data, extracts the node and resets it
660 long item = GetCtrl(level)->GetItemData(it);
661 GetCtrl(level)->SetItemData(it,((long*)item)[0]);
662 //tree::Node* n= ((ItemData*)((long*)item)[0])->node;
668 //================================================================
669 void WxTreeView::ValidateSelectedImages(bool isSelection)
671 GimmickDebugMessage(7,
672 "WxTreeView::ValidateSelectedImages"
674 std::vector<tree::Node*> sel(GetSelected(mLevelList.size()+1));
675 GetGimmickView()->OnSelectionChange(sel,isSelection,(mLastSelected-1), mProcess);
678 //================================================================
681 //================================================================
682 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
684 long item = mLastSelected;
685 int level=mLevelList.size()-1;
686 //Gets current item data
687 long adr = GetCtrl(level)->GetItemData(item);
689 tree::Node* nod = ((ItemData*)adr)->node;
694 item = GetCtrl(level)->GetNextItem(item,
699 item = GetCtrl(level)->GetNextItem(item,
702 if ( item == -1 || item==0 )
706 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
708 adr = GetCtrl(level)->GetItemData(item);
709 nod = ((ItemData*)adr)->node;
710 nodes.push_back(nod);
716 //================================================================
717 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
719 int level=mLevelList.size();
720 std::vector<tree::Node*> sel=GetSelected(level+1);
721 std::vector<tree::Node*>::iterator i;
723 for (i=sel.begin(); i!=sel.end(); ++i)
725 std::string filename=(*i)->GetAttribute("FullFileName");
726 s.push_back(filename);
730 //================================================================
731 void WxTreeView::SetColor(int l, int item)
734 GetCtrl(l)->SetItemTextColour(item, wxColourDatabase().Find
735 (crea::std2wx(mColorPalette[colorId])));
736 GetCtrl(l)->SetItemState(item,wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED); /*
738 //Setting the color according to the parent
741 item.SetBackgroundColour
742 (wxColourDatabase().Find
743 (crea::std2wx(mColorPalette[colorId])));
746 (*j,wxColourDatabase().Find
747 (crea::std2wx(mColorPalette[colorId]))));
757 else if(l!=mLevelList.size()-1)
759 item.SetBackgroundColour(mColorMap[*i]);
760 mColorMap.insert(NodeColorPair(*j,mColorMap[*i]));
764 item.SetBackgroundColour(mColorMap[*i]);
767 //================================================================
768 void WxTreeView::CreateColorPalette()
770 GimmickDebugMessage(6,"WxTreeView::CreateColorPalette");
771 mColorPalette.push_back("WHITE");
772 mColorPalette.push_back("LIGHT GREY");
773 mColorPalette.push_back("AQUAMARINE");
774 mColorPalette.push_back("MEDIUM FOREST GREEN");
775 mColorPalette.push_back("INDIAN RED");
776 mColorPalette.push_back("KHAKI");
777 mColorPalette.push_back("ORANGE");
778 mColorPalette.push_back("LIGHT BLUE");
779 mColorPalette.push_back("LIGHT STEEL BLUE");
780 mColorPalette.push_back("PINK");
781 mColorPalette.push_back("PLUM");
782 mColorPalette.push_back("PURPLE");
783 mColorPalette.push_back("RED");
784 mColorPalette.push_back("SEA GREEN");
785 mColorPalette.push_back("SIENNA");
786 mColorPalette.push_back("SKY BLUE");
787 mColorPalette.push_back("SLATE BLUE");
788 mColorPalette.push_back("SPRING GREEN");
789 mColorPalette.push_back("TAN");
790 mColorPalette.push_back("THISTLE");
791 mColorPalette.push_back("TURQUOISE");
792 mColorPalette.push_back("VIOLET");
793 mColorPalette.push_back("VIOLET RED");
794 mColorPalette.push_back("WHEAT");
795 mColorPalette.push_back("YELLOW");
796 mColorPalette.push_back("YELLOW GREEN");
797 mColorPalette.push_back("BLUE");
798 mColorPalette.push_back("BLUE VIOLET");
799 mColorPalette.push_back("BROWN");
800 mColorPalette.push_back("CADET BLUE");
801 mColorPalette.push_back("CORAL");
802 mColorPalette.push_back("CORNFLOWER BLUE");
803 mColorPalette.push_back("CYAN");
804 mColorPalette.push_back("DARK GREY");
805 mColorPalette.push_back("DARK GREEN");
806 mColorPalette.push_back("DARK OLIVE GREEN");
807 mColorPalette.push_back("DARK ORCHID");
808 mColorPalette.push_back("DARK SLATE BLUE");
809 mColorPalette.push_back("DARK SLATE GREY");
810 mColorPalette.push_back("DARK TURQUOISE");
811 mColorPalette.push_back("FIREBRICK");
812 mColorPalette.push_back("FOREST GREEN");
813 mColorPalette.push_back("GOLD");
814 mColorPalette.push_back("GOLDENROD");
815 mColorPalette.push_back("GREY");
816 mColorPalette.push_back("GREEN");
817 mColorPalette.push_back("GREEN YELLOW");
818 mColorPalette.push_back("LIME GREEN");
819 mColorPalette.push_back("MAGENTA");
820 mColorPalette.push_back("MAROON");
821 mColorPalette.push_back("MEDIUM AQUAMARINE");
822 mColorPalette.push_back("MEDIUM BLUE");
823 mColorPalette.push_back("MEDIUM GOLDENROD");
824 mColorPalette.push_back("MEDIUM ORCHID");
825 mColorPalette.push_back("MEDIUM SEA GREEN");
826 mColorPalette.push_back("MEDIUM SLATE BLUE");
827 mColorPalette.push_back("MEDIUM SPRING GREEN");
828 mColorPalette.push_back("MEDIUM TURQUOISE");
829 mColorPalette.push_back("MEDIUM VIOLET RED");
830 mColorPalette.push_back("MIDNIGHT BLUE");
831 mColorPalette.push_back("NAVY");
832 mColorPalette.push_back("ORANGE RED");
833 mColorPalette.push_back("ORCHID, PALE GREEN");
834 mColorPalette.push_back("STEEL BLUE");
835 mColorPalette.push_back("BLACK");
839 //================================================================
840 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
842 EVT_SIZE(MyFrame::OnSize)
844 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
845 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
846 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
847 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
848 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
849 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
850 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
851 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
852 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
853 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
855 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
856 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
857 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
858 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
859 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
860 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
861 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
862 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
863 EVT_MENU(LIST_SORT, MyFrame::OnSort)
864 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
865 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
866 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
867 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
868 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
869 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
870 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
871 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
872 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
874 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
875 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
878 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
879 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
880 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
882 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
883 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
885 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
886 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
887 #if WXWIN_COMPATIBILITY_2_4
888 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
889 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
892 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnSelectedChanged)
894 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnSelectedChanged)
896 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
897 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
898 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
900 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
902 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
904 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
906 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
907 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
908 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
910 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
913 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
915 EVT_CHAR(MyListCtrl::OnChar)
917 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
921 } // EO namespace creaImageIO