deargui-vpl/ref/virtools/Includes/CMultiListCtrl.h

670 lines
17 KiB
C++

// CMultiListCtrl.h : header file
#ifndef _CMULTILISTCTRL_H_
#define _CMULTILISTCTRL_H_
#include "CMHeaderCtrl.h"
#ifndef CUIK
namespace CKControl //----------------------------------------
{
#endif
/////////////////////////////////////////////////////////////////////////////
// Special Edit for MT
class CMLEdit : public CEdit
{
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};
/////////////////////////////////////////////////////////////////////////////
// CMultiListCtrl window
#define NLVS_SUBITEMSELECT 0x00000001
#define NLVS_DRAWHSEPARATOR 0x00000002
#define NLVS_DRAWVSEPARATOR 0x00000004
#define NLVS_NORIGHTSELECT 0x00000008
#define NLVS_USESELECTEDCOLUMN 0x00000010
#define NLVS_ALLOWCOLUMNDROP 0x00000020
#define NLVS_FIXEDCOLUMNORDER 0x00000040
#define NLVS_SINGLESELECTION 0x00000080
#define NLVS_DRAWBORDER 0x00000100 //does not work yet
#define NLVS_OWNERDRAWROLLOVER 0x00000200 //owner drawn items are redrawn with user callback when mouse is on the (sub)item
#define NLVS_DRAGABLE_ON_HEADER 0x00000400 //window can be dragged with mouse from header
#define NLVSI_NOP 0x00000001
#define NLVSI_TEXT 0x00000002
#define NLVSI_BITMAP 0x00000004
#define NLVSI_WINDOW 0x00000008
#define NLVSI_OWNERDRAWN 0x00000010
#define NLVSI_EDITABLE 0x00000020
#define NLVSI_TOP 0x00000000
#define NLVSI_LEFT 0x00000000
#define NLVSI_CENTER 0x00000100
#define NLVSI_RIGHT 0x00000200
#define NLVSI_VCENTER 0x00000400
#define NLVSI_BOTTOM 0x00000800
#define NLVSI_HIDDEN 0x00010000
#define NLVSI_STATENORMAL 0x00020000
#define NLVSI_STATEINTER 0x00040000
#define NLVSI_STATEPUSHED 0x00080000
#define NLVSI_DEFAULT (NLVSI_TEXT | NLVSI_VCENTER | NLVSI_CENTER)
struct tagNLVITEM;
struct tagVILVSUBITEM;
typedef void (*NLVUpdateValueCB)(tagNLVITEM *it,int sub,tagVILVSUBITEM *subitem);
typedef struct tagVILVSUBITEM{
char *Text;
int iIndex;
int iInterIndex;
int iPushedIndex;
DWORD Flags;
void *data;
NLVUpdateValueCB UpdateCB;
HWND hWnd;
RECT rcItem; // used for Picking not copied
int Height;
int Width;
public :
tagVILVSUBITEM()
{
Text = NULL;
Flags = NLVSI_DEFAULT;
iIndex = -1;
iInterIndex = -1;
iPushedIndex = -1;
rcItem.top = 0;
rcItem.bottom = 0;
rcItem.left = 0;
rcItem.right = 0;
Height = -1;
Width = -1;
hWnd = NULL;
UpdateCB = NULL;
data = NULL;
}
~tagVILVSUBITEM()
{
delete [] Text;
if(hWnd)
::DestroyWindow(hWnd);
}
tagVILVSUBITEM& operator=(const tagVILVSUBITEM& si)
{
Flags = si.Flags;
iIndex = si.iIndex;
iInterIndex = si.iInterIndex;
iPushedIndex= si.iPushedIndex;
Height = si.Height;
Width = si.Width;
hWnd = si.hWnd;
UpdateCB = si.UpdateCB;
data = si.data;
delete [] Text;
if(si.Text)
{
Text = new char[strlen(si.Text) + 1];
strcpy(Text,si.Text);
}
else
{
Text = NULL;
}
UpdateCB = si.UpdateCB;
hWnd = si.hWnd;
return *this;
}
} VILVSUBITEM;
// states Flags
#define NLVI_DISABLED 0x00000001 // Cannot be selected
#define NLVI_NOP 0x00000002 // not used
#define NLVI_ISSEPARATOR 0x00000004 // Flagged as a separator i.e. a black fat line will be drawn after this item
#define NLVI_HIDDEN 0x00000008 // Is hidden
#define NLVI_SELECTED 0x00000010 // Is Selected
#define NLVI_ISENTITY 0x00000020 // CkEntity Member is valid
#define NLVI_EDITABLE 0x00000040 // Can edit name
#define NLVI_DRAGABLE 0x00000080 // Can be dragged
#define NLVI_ALPHAFIRST 0x00000100 // Must be in top regardless of the sort fct used
#define NLVI_OWNERDRAW 0x00000200 // Owner Drawn (if on main HNTVITEM, then the whole row is custom draw)
#define NLVI_MAINOWNERDRAWN 0x00000400 //if on main HNTVITEM, then the whole column is custom draw only
// SetItem Flags
#define NLVIF_Flags 0x00000001 // Set Flags
#define NLVIF_FONT 0x00000002 // Set font
#define NLVIF_CKENTITY 0x00000004 // Set entity
#define NLVIF_DATA 0x00000008 // Set data
#define NLVIF_ICON 0x00000010 // Set icon
#define NLVIF_REDRAW 0x00000020 // Redraw After Flag settings
// Hit Test return Flags
#define NLVHT_NOWHERE 0x00000001 // In the client area but below the last item.
#define NLVHT_ONITEMBUTTON 0x00000002 // On the button associated with an item.
#define NLVHT_ONITEMICON 0x00000004 // On the bitmap associated with an item.
#define NLVHT_ONITEMINDENT 0x00000008 // In the indentation associated with an item.
#define NLVHT_ONITEMLABEL 0x00000010 // On the label (string) associated with an item.
#define NLVHT_ONITEMRIGHT 0x00000020 // Right off the label.
#define NLVHT_ONITEMSUB 0x00000040 // On sub Item
#define NLVHT_ONITEMSUBICON 0x00000080 // On sub Item icon
#define NLVHT_ONHEADER 0x00000100 // On Header
#define NLVHT_ONITEM ( NLVHT_ONITEMICON | NLVHT_ONITEMLABEL )// On the bitmap or label associated with an item.
// Select Flags
#define NLVS_SELECT 0x00000001 // Select Item
#define NLVS_UNSELECT 0x00000002 // Deselect Item
#define NLVS_TOGGLE 0x00000004 // Toggle Item Selection
#define NLVS_ADD 0x00000008 // Add to current Selection
#define NLVS_REDRAW 0x00000010 // Redraw after selection
typedef void (*NLVUpdateItemCB)(tagNLVITEM *it);
typedef struct tagNLVITEM
{
CString Text; // Text used for item that are not entities
int Icon; // Icon Index Associated with item
int Font; // Font Used to draw Item
DWORD CkEntity; // Is either an object id or a CK class ID for subfolders (check for Flags & IS_ENTITY)
DWORD Flags; // Flags
LPVOID Data; // Associated Data
VILVSUBITEM **pSubs; // Array of sub items
int nSubs ; // Number of subs
int Height; // height of item
int ToTop; // Distance to top
RECT rcText; // Text Rectangle
RECT rcClippedText; // Clipped text rectangle
NLVUpdateItemCB UpdateCB;
tagNLVITEM* PartOf; // Part of
tagNLVITEM()
{
Icon = 0;
Font = 0;
CkEntity = 0;
Flags = 0;
Data = NULL;
pSubs = NULL;
nSubs = 0;
Height = 0;
ToTop = 0;
PartOf = NULL;
UpdateCB = NULL;
ZeroMemory(&rcText,sizeof(rcText));
}
~tagNLVITEM()
{
if(pSubs)
{
int i;
for(i = 0; i < nSubs; i++ )
{
if(pSubs[i])
delete pSubs[i];
}
delete [] pSubs;
}
}
} NLVITEM,*HNLVITEM;
typedef int (*MULTILISTSORTF)(const void* it1,const void* it2);
#ifdef CUIK
class CMultiListCtrl : public CWnd
#else
class CKCONTROLS_CLASS_DECL CMultiListCtrl : public CWnd
#endif
{
// Construction
public:
// Ctors
CMultiListCtrl(CKContext* context=0);
virtual ~CMultiListCtrl();
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
BOOL CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
void SetCKContext(CKContext* context); //set ck context if you plan to use ckentities inside tree / list
void SetStyle(DWORD Style);
void ModifyStyle(DWORD iAdded,DWORD iRemoved=0);
DWORD GetStyle();
// List Functions :
void UpdateHScroll();
void UpdateVScroll();
// Image List management
void SetButtonImageList(CImageList *il); // Image List used to Draw arraws next to the Item Name
void SetItemImageList(CImageList *il); //
void SetSubItemImageList(CImageList *il);
CImageList *GetItemImageList();
CImageList *GetSubItemImageList();
CImageList *GetButtonImageList();
// Item Pre-allocation Size
void SetPreAllocSize(int size);
int GetPreAllocSize();
// Picking
HNLVITEM HitTest(CPoint point,int *sub,UINT *Flags);
// Apparence / Color / Font
void SetFont( CFont* pFont, BOOL bRedraw);
void SetColors( COLORREF backColor,
COLORREF textColor,
COLORREF textBackColor,
COLORREF textSelectedColor,
COLORREF textBackSelectedColor,
COLORREF textActivePartBackColor,
COLORREF borderColor=0
);
void CMultiListCtrl::GetColors(
COLORREF *backColor,
COLORREF *textColor,
COLORREF *textBackColor,
COLORREF *textSelectedColor,
COLORREF *textBackSelectedColor,
COLORREF *textActivePartBackColor,
COLORREF *borderColor=NULL
);
// Item Misc
int GetItemCount();
HNLVITEM GetItem(int pos);
int GetItemPos(HNLVITEM item);
// Iterator
int GetVisibleCount();
BOOL IsItemVisible(HNLVITEM item);
HNLVITEM GetFirstVisibleItem();
HNLVITEM GetLastVisibleItem();
HNLVITEM GetNextVisibleItem(HNLVITEM item);
HNLVITEM GetPreviousVisibleItem(HNLVITEM item);
HNLVITEM GetNextVisibleItem(int pos);
HNLVITEM GetPreviousVisibleItem(int pos);
HNLVITEM GetNextItem(HNLVITEM item);
HNLVITEM GetNextItem(int pos);
HNLVITEM GetPreviousItem(HNLVITEM item);
HNLVITEM GetPreviousItem(int pos);
int FindItemPosition(HNLVITEM item);
// Item Insertion
HNLVITEM InsertItem( LPCTSTR lpszItem, HNLVITEM hAfter = NULL, BOOL draw = TRUE);
HNLVITEM InsertItem( LPCTSTR lpszItem, int IconId = -1,HNLVITEM hAfter = NULL, BOOL draw = TRUE);
HNLVITEM InsertItem( CK_ID ckid,HNLVITEM hAfter = NULL,BOOL draw = TRUE);
HNLVITEM InsertItem( HNLVITEM it,HNLVITEM hAfter = NULL,BOOL draw = TRUE);
// Item Removal Functions
void DeleteItem(HNLVITEM item,BOOL redraw = TRUE);
void DeleteItem(int pos,BOOL redraw = TRUE);
void DeleteAllItem(BOOL redraw = TRUE);
void DeleteSelectedItems(BOOL redraw = TRUE);
//Move Selection
HNLVITEM RemoveItem(HNLVITEM item,BOOL redraw=FALSE); //no deletion of the HNLVITEM
HNLVITEM RemoveItem(int pos,BOOL redraw=FALSE); //no deletion of the HNLVITEM
void MoveSelectionUp(BOOL redraw=TRUE);
void MoveSelectionDown(BOOL redraw=TRUE);
void MoveSelectionToTop(BOOL redraw=TRUE);
void MoveSelectionToBottom(BOOL redraw=TRUE);
// Item content management
BOOL SetItemData( HNLVITEM hItem, LPVOID dwData);
LPVOID GetItemData( HNLVITEM hItem);
BOOL SetItemFont( HNLVITEM hItem, int font);
int GetItemFont( HNLVITEM hItem);
BOOL SetItemFlags( HNLVITEM hItem, DWORD Flags);
DWORD GetItemFlags( HNLVITEM hItem);
BOOL SetItemIcon( HNLVITEM hItem, int Icon);
int GetItemIcon( HNLVITEM hItem);
void SetItemVisibility(HNLVITEM it,BOOL vis);
BOOL GetItemVisibility(HNLVITEM it);
void SetItemDragable(HNLVITEM it,BOOL drag);
BOOL GetItemDragability(HNLVITEM it);
BOOL SetItemProperties( HNLVITEM hItem,DWORD mask,NLVITEM *it);
void SetItemHeight(int height);
int GetItemHeight();
void SetItemHeight(HNLVITEM item,int height);
int GetItemHeight(HNLVITEM item);
// Selection Management
int GetCurSelRow();
void Select(HNLVITEM item,DWORD Flags,BOOL notify = TRUE);
void SelectRange(HNLVITEM itemStart,HNLVITEM itemEnd,DWORD Flags);
void SelectRange(int start,int end,DWORD Flags);
BOOL IsItemSelected(HNLVITEM item);
HNLVITEM GetLastSelected();
HNLVITEM GetPrevSelected();
CPtrList *GetSelectedItems();
int GetSelectedItemsCount();
void ClearSelection(BOOL redraw,BOOL sync = TRUE);
void SelectItemByID(CK_ID id,HNLVITEM start);
void SelectVisibleItemByID(CK_ID id,HNLVITEM partof);
BOOL IsSelectionLocked();
void LockSelection(BOOL bLock);
// Label Edition
CEdit *GetEdit();
CEdit* EditItemText(HNLVITEM it);
HNLVITEM GetEditedEntity();
CEdit* EditSubItemText(HNLVITEM it,int sub);
int GetEditedSubItemIndex();
// Sub Item Functions
void SwapSubItems(HNLVITEM item,int p1,int p2);
void AddSubItem(HNLVITEM item,int subItem, VILVSUBITEM *ntvsi);
void SetSubItem(HNLVITEM item,int subItem, VILVSUBITEM *ntvsi);
void SetSubItemFlags(HNLVITEM item,int subItem, DWORD Flags);
DWORD GetSubItemFlags(HNLVITEM item,int subItem);
void SetSubItemData(HNLVITEM item,int subItem, void *data);
void* GetSubItemData(HNLVITEM item,int subItem);
void SetSubItemText(HNLVITEM item,int subItem, char *text);
char *GetSubItemText(HNLVITEM item,int subItem);
VILVSUBITEM *GetSubItem(HNLVITEM item,int subItem);
void RemoveSubItem(HNLVITEM item,int subItem);
int GetSubItemCount(HNLVITEM item);
void GetItemRect(HNLVITEM item, int col,RECT *r, BOOL textOnly);
void GetItemEditRect(HNLVITEM item, int col,RECT *r);
int GetSubItemHeight(HNLVITEM item,int subItem);
void SetSubItemHeight(HNLVITEM item,int subItem, int height);
// Column Functions
// Set Selected Column
void SetSelectedColumn(int Column);
int GetSelectedColumn();
void SetColumnCount(int count);
int GetColumnCount();
void InsertColumn(char *name,int pos=-1,int size = 100);
void SwapColumns(int c1,int c2);
void SetColumn(int pos,CString str,int image,int width);
void SetActiveColumn(int pos);
int GetActiveColumn();
void SetColumnWidth(int pos, int w);
void GetColumnInfo(int index,int *start, int *width);
void SetColumnSortFct(int col, MULTILISTSORTF sortf);
void SizeColumnToOptimalSize(int col);
void SetColumnText(int pos,CString str);
void SetColumnOrder(int *order);
void AddColumn();
void RemoveColumn(int pos);
void SwapItems(int pos1, int pos2);
void SetHeaderColors(
COLORREF backColor,
COLORREF textColor,
COLORREF textBackColor,
COLORREF textSelectedColor,
COLORREF textBackSelectedColor
);
// Sorting
void Sort(HNLVITEM start = NULL,HNLVITEM end = NULL,BOOL redraw = FALSE);
void SetCurrentSort(int col);
// ID Searching Function
HNLVITEM IdFind(CK_ID id, HNLVITEM startat);
HNLVITEM IdFind(CK_ID id, int pos);
// DnD Management
CImageList *CreateDragImage(HNLVITEM item); // It up to you to destroy img list after use
// Misc
void Check(HNLVITEM start = NULL); // Check for every item if the corresopnding CKObject still exists, if not, deletes the item
// Show/Hide Layer
void ToggleShowHideLayer();
BOOL HideLayerOn();
// Active Part
void SetActivePart(HNLVITEM it);
HNLVITEM GetActivePart();
// Item Drawing
BOOL DrawItem(HNLVITEM item,CDC *cdc = NULL,BOOL draw = TRUE);
BOOL DrawOwnerDrawItem(HNLVITEM item,int sub,BOOL highlight=FALSE); //sub =-1=> main, otherwise subitems
void RedrawItems(HNLVITEM first = NULL,HNLVITEM last = NULL,BOOL draw = TRUE);
void UpdateVisibleList(HNLVITEM start = NULL);
void RemoveEntity(HNLVITEM start,CK_ID id);
void EnsureVisible(HNLVITEM it);
//Clipboard
void CopyContentToClipboard();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMultiListCtrl)
protected:
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
// Generated message map functions
protected:
//{{AFX_MSG(CMultiListCtrl)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnDestroy();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
// Members Datas
CKContext *m_Context;
int m_NbColumns;
CBrush m_Brush;
CMHeaderCtrl *m_Header;
int m_HeaderSize;
DWORD m_Style;
COLORREF m_GreyedColor;
CImageList *m_SIL;
CImageList *m_IL;
CImageList *m_SubIL;
BOOL m_HideLayerOn;
BOOL m_bDrag;
CPoint m_LastPickedPoint;
// List data :
int m_PreallocSize;
int m_ItemCount;
int m_AllocatedItemCount;
HNLVITEM *m_ItemArray;
int m_StartIndent;
int m_ItemHeight;
int m_IconSize;
int m_IconSpace;
CPtrList m_SelectedItems;
HNLVITEM m_LastPicked;
int m_HScrollPos;
int m_VScrollPos;
int m_ListHeight;
BOOL m_bNeedUpdate;
HNLVITEM m_ActivePart;
int m_WheelSize;
MULTILISTSORTF m_SortFct;
MULTILISTSORTF *m_SortFctArray;
CMLEdit *m_Edit;
HNLVITEM m_EditedItem;
int m_EditedSub;
// Colors :
DWORD m_backColor;
DWORD m_textColor;
DWORD m_textBackColor;
DWORD m_textSelectedColor;
DWORD m_textBackSelectedColor;
DWORD m_textActivePartBackColor;
DWORD m_borderColor;
CFont *m_Font;
BOOL m_Locked; //use not implemented
int m_SelectedColumn;
//rollover with NLVS_OWNERDRAWROLLOVER
HNLVITEM m_rolloverItem;
int m_rolloverSubitem;
//
void _Create(DWORD dwStyle, const RECT& rect);
/*****************************************/
// Members Function
HRESULT ProcessHeaderNotification(LPNMHDR nm);
int XToColumn(int x);
int GetColumnOptimalSize(int c);
void CalcColumnRect(int c,RECT *r);
void OnVKUp(BOOL extend= FALSE);
void OnVKDown(BOOL extend= FALSE);
void OnVKPgUp(BOOL extend= FALSE);
void OnVKPgDown(BOOL extend = FALSE);
void OnVKHome(BOOL extend= FALSE);
void OnVKEnd(BOOL extend= FALSE);
void ScrollUp();
void ScrollDown();
DECLARE_MESSAGE_MAP()
};
#ifndef CUIK
} //namespace CKControl
#endif
#endif