674 lines
18 KiB
C++
674 lines
18 KiB
C++
// ExtendedTreeControlDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "ExtendedTreeControl.h"
|
|
#include "ExtendedTreeControlDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExtendedTreeControlDlg dialog
|
|
|
|
CExtendedTreeControlDlg::CExtendedTreeControlDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CExtendedTreeControlDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CExtendedTreeControlDlg)
|
|
m_bMultiSel=FALSE;
|
|
m_bHasButtons=FALSE;
|
|
m_bHasLines=FALSE;
|
|
m_bHasLinesAtRoot=FALSE;
|
|
m_bShowSelAlways=FALSE;
|
|
m_bHasGrid=FALSE;
|
|
m_bRowSel=FALSE;
|
|
m_bItemTips=FALSE;
|
|
m_bNoSortHeader=FALSE;
|
|
//}}AFX_DATA_INIT
|
|
m_pDragImage=NULL;
|
|
m_bDragging=FALSE;
|
|
m_hDropItem=NULL;
|
|
|
|
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
}
|
|
|
|
CExtendedTreeControlDlg::~CExtendedTreeControlDlg()
|
|
{
|
|
if (m_pDragImage)
|
|
delete m_pDragImage;
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CExtendedTreeControlDlg)
|
|
DDX_Control(pDX, IDC_STATIC_EXTENDED_STYLES, m_sepExtendedStyle);
|
|
DDX_Control(pDX, IDC_STATIC_BASIC_STYLES, m_sepBasicStyles);
|
|
DDX_Control(pDX, IDC_EXTENDED_TREE, m_xlc);
|
|
DDX_Check(pDX, IDC_TVOXS_MULTISEL, m_bMultiSel);
|
|
DDX_Check(pDX, IDC_TVS_HASBUTTONS, m_bHasButtons);
|
|
DDX_Check(pDX, IDC_TVS_HASLINES, m_bHasLines);
|
|
DDX_Check(pDX, IDC_TVS_HASLINESATROOT, m_bHasLinesAtRoot);
|
|
DDX_Check(pDX, IDC_TVS_SHOWSELALWAYS, m_bShowSelAlways);
|
|
DDX_Check(pDX, IDC_TVOXS_GRID, m_bHasGrid);
|
|
DDX_Check(pDX, IDC_TVOXS_ROWSEL, m_bRowSel);
|
|
DDX_Check(pDX, IDC_TVOXS_ITEMTIPS, m_bItemTips);
|
|
DDX_Check(pDX, IDC_TVOXS_NOSORTHEADER, m_bNoSortHeader);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CExtendedTreeControlDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CExtendedTreeControlDlg)
|
|
ON_WM_PAINT()
|
|
ON_WM_QUERYDRAGICON()
|
|
ON_BN_CLICKED(IDC_TVOXS_MULTISEL, OnTvoxsMultisel)
|
|
ON_BN_CLICKED(IDC_TVS_HASBUTTONS, OnTvsHasbuttons)
|
|
ON_BN_CLICKED(IDC_TVS_HASLINES, OnTvsHaslines)
|
|
ON_BN_CLICKED(IDC_TVS_HASLINESATROOT, OnTvsHaslinesatroot)
|
|
ON_BN_CLICKED(IDC_TVS_SHOWSELALWAYS, OnTvsShowselalways)
|
|
ON_BN_CLICKED(IDC_HIDE, OnHide)
|
|
ON_BN_CLICKED(IDC_UNHIDE_ALL, OnUnhideAll)
|
|
ON_BN_CLICKED(IDC_SET_FONT, OnSetFontToSel)
|
|
ON_BN_CLICKED(IDC_TOGGLE_DISABLE, OnToggleDisable)
|
|
ON_BN_CLICKED(IDC_TVOXS_GRID, OnGrid)
|
|
ON_BN_CLICKED(IDC_TVOXS_ROWSEL, OnRowSel)
|
|
ON_NOTIFY(LVN_BEGINDRAG, IDC_EXTENDED_TREE, OnBegindragExtendedTree)
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONUP()
|
|
ON_BN_CLICKED(IDC_TVOXS_ITEMTIPS, OnTvoxsItemtips)
|
|
ON_BN_CLICKED(IDC_TVOXS_NOSORTHEADER, OnTvoxsNosortheader)
|
|
ON_WM_DESTROY()
|
|
ON_WM_GETMINMAXINFO()
|
|
ON_BN_CLICKED(IDC_BUTTON1, OnDelete)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExtendedTreeControlDlg message handlers
|
|
|
|
void CExtendedTreeControlDlg::InsertItems()
|
|
{
|
|
CStringArray arrCity;
|
|
arrCity.Add(_T("Amsterdam"));
|
|
arrCity.Add(_T("Berlin"));
|
|
arrCity.Add(_T("Edingburg"));
|
|
arrCity.Add(_T("Madrid"));
|
|
arrCity.Add(_T("Mexico City"));
|
|
arrCity.Add(_T("Moscow"));
|
|
arrCity.Add(_T("Niece"));
|
|
arrCity.Add(_T("New York"));
|
|
arrCity.Add(_T("Rome"));
|
|
arrCity.Add(_T("Toronto"));
|
|
arrCity.Add(_T("Zurich"));
|
|
|
|
CStringArray arrPosition;
|
|
arrPosition.Add(_T("CEO"));
|
|
arrPosition.Add(_T("Computer Programmer"));
|
|
arrPosition.Add(_T("Consultant"));
|
|
arrPosition.Add(_T("Engineer"));
|
|
arrPosition.Add(_T("Head Chef"));
|
|
arrPosition.Add(_T("Professional Athlete"));
|
|
arrPosition.Add(_T("Shipper"));
|
|
arrPosition.Add(_T("Singer"));
|
|
|
|
CStringArray arrDate;
|
|
arrDate.Add(_T("01/01/1998"));
|
|
arrDate.Add(_T("31/12/2001"));
|
|
|
|
TCHAR szItems[][50]={
|
|
_T("Bob Jackson"),_T("Niece"),_T("Computer Programmer"), _T("(213)-456-7689"),_T("bobj@comp.net"),_T("09.12.1998"),
|
|
_T("Elizabeth Sizeberg"),_T("Berlin"),_T("Shipper"), _T("(343)-534-2653"),_T("elsize@berco.com"),_T("11.03.1998"),
|
|
_T("Janna Stevens"),_T("Zurich"),_T("Consultant"), _T("(312)-232-4467 ext. 2098"),_T("stevensj@hotmail.com"),_T("10.22.1998"),
|
|
_T("John McDonald"),_T("Toronto"),_T("CEO"), _T("(416)-568-3379"),_T("john.mcdonald@echo.com"),_T("07.30.1998"),
|
|
_T("Margaret Atwal"),_T("Madrid"),_T("Singer"), _T("(568)-803-3149"),_T("margo@jinglebells.com"),_T("09.02.1998"),
|
|
_T("Markus Brody"),_T("Mexico City"),_T("Engineer"), _T("(476)-671-0951"),_T("brody@techdome.net"),_T("03.21.1998"),
|
|
_T("Martha Lenton"),_T("Rome"),_T("Professional Athlete"), _T("(805)-609-9087"),_T("martha@sportnet.com"),_T("06.29.1998"),
|
|
_T("Mary Bolten"),_T("New York"),_T("Head Chef"), _T("(502)-403-0261"),_T("mlenton@cook.net"),_T("05.09.1998")
|
|
};
|
|
|
|
for(int nIndex=0; nIndex<8; nIndex++)
|
|
{
|
|
// Name
|
|
HTREEITEM hItem=m_xlc.InsertItem(szItems[nIndex*6]);
|
|
ASSERT(hItem!=NULL);
|
|
m_xlc.SetItemImage(hItem,0,0,0);
|
|
m_xlc.SetItemColor(hItem,RGB(0,0,255));
|
|
// City
|
|
m_xlc.SetSubItem(hItem,1,OX_SUBITEM_TEXT,szItems[nIndex*6+1]);
|
|
m_xlc.SetEditMode(hItem,OXET_COMBO,arrCity,1);
|
|
m_xlc.SetItemColor(hItem,RGB(0,128,0),1);
|
|
// Position
|
|
m_xlc.SetSubItem(hItem,2,OX_SUBITEM_TEXT,szItems[nIndex*6+2]);
|
|
m_xlc.SetEditMode(hItem,OXET_COMBO,arrPosition,2);
|
|
m_xlc.SetItemColor(hItem,RGB(128,0,0),2);
|
|
|
|
// Phone
|
|
HTREEITEM hSubItem=m_xlc.InsertItem(_T("Telephone:"),hItem);
|
|
ASSERT(hSubItem!=NULL);
|
|
m_xlc.SetItemImage(hSubItem,1,1,0);
|
|
m_xlc.SetSubItem(hSubItem,1,OX_SUBITEM_TEXT,szItems[nIndex*6+3]);
|
|
m_xlc.SetItemColor(hSubItem,RGB(0,128,0),1);
|
|
|
|
// E-mail
|
|
hSubItem=m_xlc.InsertItem(_T("E-mail:"),hItem);
|
|
ASSERT(hSubItem!=NULL);
|
|
m_xlc.SetItemImage(hSubItem,2,2,0);
|
|
m_xlc.SetSubItem(hSubItem,1,OX_SUBITEM_TEXT,szItems[nIndex*6+4]);
|
|
m_xlc.SetItemColor(hSubItem,RGB(0,128,0),1);
|
|
|
|
// Last contact
|
|
hSubItem=m_xlc.InsertItem(_T("Last contact:"),hItem);
|
|
ASSERT(hSubItem!=NULL);
|
|
m_xlc.SetItemImage(hSubItem,3,3,0);
|
|
m_xlc.SetSubItem(hSubItem,1,OX_SUBITEM_TEXT,szItems[nIndex*6+5]);
|
|
m_xlc.SetEditMode(hSubItem,OXET_CALENDAR,arrDate,1);
|
|
m_xlc.SetItemColor(hSubItem,RGB(0,128,0),1);
|
|
}
|
|
}
|
|
|
|
BOOL CExtendedTreeControlDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// Set the icon for this dialog. The framework does this automatically
|
|
// when the application's main window is not a dialog
|
|
SetIcon(m_hIcon, TRUE); // Set big icon
|
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
|
|
|
// TODO: Add extra initialization here
|
|
VERIFY(m_il.Create(IDB_IL_TREE,16,1,RGB(255,0,255)));
|
|
m_xlc.SetImageList(&m_il,TVSIL_NORMAL);
|
|
|
|
// Setup columns
|
|
m_xlc.DeleteColumn(0);
|
|
m_xlc.InsertColumn(0,_T("Name"),LVCFMT_LEFT,150);
|
|
m_xlc.InsertColumn(1,_T("City"),LVCFMT_LEFT,100);
|
|
m_xlc.InsertColumn(2,_T("Title"),LVCFMT_LEFT,120);
|
|
//////////////////////////
|
|
|
|
|
|
InsertItems();
|
|
|
|
m_xlc.ModifyExStyle(0,TVOXS_COLUMNHDR);
|
|
m_xlc.ModifyExStyle(0,TVOXS_MULTISEL);
|
|
m_xlc.ModifyStyle(0,TVS_EDITLABELS);
|
|
m_xlc.ModifyStyle(0,TVS_HASBUTTONS);
|
|
m_xlc.ModifyStyle(0,TVS_HASLINES);
|
|
m_xlc.ModifyStyle(0,TVS_LINESATROOT);
|
|
m_xlc.ModifyStyle(0,TVS_SHOWSELALWAYS);
|
|
m_xlc.ModifyExStyle(TVOXS_VGRID,0);
|
|
m_xlc.ModifyExStyle(TVOXS_HGRID,0);
|
|
m_xlc.ModifyExStyle(0,TVOXS_FLGRID);
|
|
m_xlc.ModifyExStyle(0,TVOXS_ROWSEL);
|
|
m_xlc.ModifyExStyle(0,TVOXS_PICKANYWHERE);
|
|
m_xlc.ModifyExStyle(0,TVOXS_ITEMTIPS);
|
|
|
|
m_bHasLines=m_xlc.HasLines();
|
|
m_bHasButtons=m_xlc.HasButtons();
|
|
m_bHasLinesAtRoot=m_xlc.HasLinesAtRoot();
|
|
m_bShowSelAlways=m_xlc.GetShowSelAlways();
|
|
DWORD dwStyleEx=m_xlc.GetExStyle();
|
|
m_bMultiSel=(dwStyleEx & TVOXS_MULTISEL)!=0;
|
|
m_bHasGrid=((dwStyleEx & TVOXS_HGRID)!=0 && (dwStyleEx & TVOXS_VGRID)!=0);
|
|
m_bRowSel=(dwStyleEx & TVOXS_ROWSEL)!=0;
|
|
m_bItemTips=(dwStyleEx & TVOXS_ITEMTIPS)!=0;
|
|
m_bNoSortHeader=(dwStyleEx & TVOXS_NOSORTHEADER)!=0;
|
|
/*
|
|
// separators
|
|
COLORREF clr=::GetSysColor(COLOR_WINDOW);
|
|
m_sepBasicStyles.SetTextColor(clr);
|
|
m_sepExtendedStyle.SetTextColor(clr);
|
|
*/
|
|
// layout
|
|
//
|
|
m_LayoutManager.Attach(this);
|
|
m_LayoutManager.TieChild(&m_xlc,
|
|
OX_LMS_LEFT|OX_LMS_RIGHT|OX_LMS_TOP|OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
|
|
m_LayoutManager.TieChild(IDC_SET_FONT,OX_LMS_RIGHT,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_HIDE,OX_LMS_RIGHT,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_UNHIDE_ALL,OX_LMS_RIGHT,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TOGGLE_DISABLE,OX_LMS_RIGHT,OX_LMT_SAME);
|
|
|
|
m_LayoutManager.TieChild(IDC_STATIC_BASIC_STYLES,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_STATIC_EXTENDED_STYLES,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVS_HASLINES,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVS_HASBUTTONS,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVS_HASLINESATROOT,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVS_SHOWSELALWAYS,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVOXS_MULTISEL,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVOXS_NOSORTHEADER,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVOXS_GRID,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVOXS_ROWSEL,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
m_LayoutManager.TieChild(IDC_TVOXS_ITEMTIPS,OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
// If you add a minimize button to your dialog, you will need the code below
|
|
// to draw the icon. For MFC applications using the document/view model,
|
|
// this is automatically done for you by the framework.
|
|
|
|
void CExtendedTreeControlDlg::OnPaint()
|
|
{
|
|
if (IsIconic())
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
|
|
|
|
// Center icon in client rectangle
|
|
int cxIcon = GetSystemMetrics(SM_CXICON);
|
|
int cyIcon = GetSystemMetrics(SM_CYICON);
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
int x = (rect.Width() - cxIcon + 1) / 2;
|
|
int y = (rect.Height() - cyIcon + 1) / 2;
|
|
|
|
// Draw the icon
|
|
dc.DrawIcon(x, y, m_hIcon);
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnPaint();
|
|
}
|
|
}
|
|
|
|
// The system calls this to obtain the cursor to display while the user drags
|
|
// the minimized window.
|
|
HCURSOR CExtendedTreeControlDlg::OnQueryDragIcon()
|
|
{
|
|
return (HCURSOR) m_hIcon;
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnTvoxsMultisel()
|
|
{
|
|
UpdateData();
|
|
if(m_bMultiSel)
|
|
{
|
|
m_xlc.ModifyExStyle(0,TVOXS_MULTISEL);
|
|
}
|
|
else
|
|
{
|
|
m_xlc.ModifyExStyle(TVOXS_MULTISEL,0);
|
|
}
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnTvsHasbuttons()
|
|
{
|
|
UpdateData();
|
|
if(m_bHasButtons)
|
|
{
|
|
m_xlc.ModifyStyle(0,TVS_HASBUTTONS);
|
|
}
|
|
else
|
|
{
|
|
m_xlc.ModifyStyle(TVS_HASBUTTONS,0);
|
|
}
|
|
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnTvsHaslines()
|
|
{
|
|
UpdateData();
|
|
if(m_bHasLines)
|
|
{
|
|
m_xlc.ModifyStyle(0,TVS_HASLINES);
|
|
}
|
|
else
|
|
{
|
|
m_xlc.ModifyStyle(TVS_HASLINES,0);
|
|
}
|
|
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnTvsHaslinesatroot()
|
|
{
|
|
UpdateData();
|
|
if(m_bHasLinesAtRoot)
|
|
{
|
|
m_xlc.ModifyStyle(0,TVS_LINESATROOT);
|
|
}
|
|
else
|
|
{
|
|
m_xlc.ModifyStyle(TVS_LINESATROOT,0);
|
|
}
|
|
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnTvsShowselalways()
|
|
{
|
|
UpdateData();
|
|
if(m_bShowSelAlways)
|
|
{
|
|
m_xlc.ModifyStyle(0,TVS_SHOWSELALWAYS);
|
|
}
|
|
else
|
|
{
|
|
m_xlc.ModifyStyle(TVS_SHOWSELALWAYS,0);
|
|
}
|
|
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnHide()
|
|
{
|
|
HTREEITEM hItem=m_xlc.GetNextItem(TVI_ROOT,TVGN_FIRSTSELECTED);
|
|
while(hItem)
|
|
{
|
|
HTREEITEM hItem1=hItem;
|
|
hItem=m_xlc.GetNextItem(hItem,TVGN_NEXTSELECTED);
|
|
m_xlc.HideItem(hItem1);
|
|
}
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnUnhideAll()
|
|
{
|
|
HTREEITEM hItem=m_xlc.GetFirstHiddenItem();
|
|
while(hItem)
|
|
{
|
|
HTREEITEM hItem1=hItem;
|
|
hItem=m_xlc.GetNextHiddenItem(hItem);
|
|
m_xlc.HideItem(hItem1,FALSE);
|
|
}
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnSetFontToSel()
|
|
{
|
|
int nSelectedCount=m_xlc.GetSelectedCount();
|
|
if(nSelectedCount==0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Use font common dialog
|
|
CFontDialog* pFontDlg;
|
|
if(nSelectedCount==1)
|
|
{
|
|
HTREEITEM hSelectedItem=m_xlc.GetNextItem(TVI_ROOT,TVGN_FIRSTSELECTED);
|
|
CFont* pFont=m_xlc.GetItemFont(hSelectedItem);
|
|
if(pFont==NULL)
|
|
{
|
|
pFont=m_xlc.GetFont();
|
|
}
|
|
ASSERT(pFont!=NULL);
|
|
LOGFONT lf;
|
|
pFont->GetLogFont(&lf);
|
|
pFontDlg=new CFontDialog(&lf);
|
|
pFontDlg->m_cf.rgbColors=m_xlc.GetItemColor(hSelectedItem);
|
|
}
|
|
else
|
|
{
|
|
pFontDlg=new CFontDialog();
|
|
}
|
|
ASSERT(pFontDlg!=NULL);
|
|
|
|
if(pFontDlg->DoModal()==IDOK)
|
|
{
|
|
LOGFONT lf;
|
|
pFontDlg->GetCurrentFont(&lf);
|
|
CFont font;
|
|
VERIFY(font.CreateFontIndirect(&lf));
|
|
HTREEITEM hItem=m_xlc.GetNextItem(TVI_ROOT,TVGN_FIRSTSELECTED);
|
|
while(hItem)
|
|
{
|
|
m_xlc.SetItemFont(hItem,&font,0);
|
|
m_xlc.SetItemFont(hItem,&font,1);
|
|
m_xlc.SetItemFont(hItem,&font,2);
|
|
m_xlc.SetItemColor(hItem,pFontDlg->m_cf.rgbColors);
|
|
m_xlc.SetItemColor(hItem,pFontDlg->m_cf.rgbColors,1);
|
|
m_xlc.SetItemColor(hItem,pFontDlg->m_cf.rgbColors,2);
|
|
hItem=m_xlc.GetNextItem(hItem,TVGN_NEXTSELECTED);
|
|
}
|
|
|
|
UINT nHeight=m_xlc.GetItemHeight();
|
|
lf.lfHeight=(lf.lfHeight>0 ? lf.lfHeight : -lf.lfHeight)+6;
|
|
if(lf.lfHeight>(int)nHeight)
|
|
{
|
|
m_xlc.SetItemHeight(lf.lfHeight);
|
|
}
|
|
}
|
|
|
|
delete pFontDlg;
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnToggleDisable()
|
|
{
|
|
HTREEITEM hItem=m_xlc.GetNextItem(TVI_ROOT,TVGN_FIRSTSELECTED);
|
|
while(hItem)
|
|
{
|
|
m_xlc.DisableItem(hItem,!m_xlc.IsItemDisabled(hItem));
|
|
hItem=m_xlc.GetNextItem(hItem,TVGN_NEXTSELECTED);
|
|
}
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnGrid()
|
|
{
|
|
UpdateData();
|
|
DWORD dwStyleAdd=m_bHasGrid ? TVOXS_VGRID|TVOXS_HGRID|TVOXS_FLGRID : 0;
|
|
DWORD dwStyleRemove=m_bHasGrid ? 0 : TVOXS_VGRID|TVOXS_HGRID|TVOXS_FLGRID;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnRowSel()
|
|
{
|
|
UpdateData();
|
|
DWORD dwStyleAdd=m_bRowSel ? TVOXS_ROWSEL : 0;
|
|
DWORD dwStyleRemove=m_bRowSel ? 0 : TVOXS_ROWSEL;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
|
|
void CExtendedTreeControlDlg::OnBegindragExtendedTree(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
|
|
if(m_pDragImage)
|
|
{
|
|
delete m_pDragImage;
|
|
}
|
|
|
|
HTREEITEM hDragItem=m_xlc.GetSelectedItem();
|
|
ASSERT (hDragItem);
|
|
m_pDragImage=m_xlc.CreateDragImage (hDragItem);
|
|
ASSERT (m_pDragImage);
|
|
|
|
// changes the cursor to the drag image (DragMove() is still required in
|
|
// OnMouseMove())
|
|
VERIFY (m_pDragImage->BeginDrag (0, CPoint (8, 8)));
|
|
VERIFY (m_pDragImage->DragEnter (GetDesktopWindow (), pNMListView->ptAction));
|
|
|
|
IMAGEINFO pImageInfo;
|
|
VERIFY(m_pDragImage->GetImageInfo(0,&pImageInfo));
|
|
|
|
// set dragging flag
|
|
m_bDragging=TRUE;
|
|
m_hDropItem=NULL;
|
|
|
|
// capture all mouse messages
|
|
SetCapture();
|
|
|
|
*pResult=0;
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
if (m_bDragging)
|
|
{
|
|
CPoint pt (point);
|
|
ClientToScreen (&pt);
|
|
|
|
// move the drag image
|
|
VERIFY (m_pDragImage->DragMove (pt));
|
|
|
|
BOOL bDraw=FALSE;
|
|
|
|
// get the CWnd pointer of the window that is under the mouse cursor
|
|
CWnd* pDropWnd=WindowFromPoint (pt);
|
|
ASSERT (pDropWnd);
|
|
// if we drag outside current window
|
|
if (pDropWnd != &m_xlc)
|
|
{
|
|
// turn off drag hilite for tree control
|
|
if (m_hDropItem)
|
|
{
|
|
if(!bDraw)
|
|
{
|
|
// unlock window updates
|
|
VERIFY (m_pDragImage->DragShowNolock(FALSE));
|
|
bDraw=TRUE;
|
|
}
|
|
m_xlc.SelectDropTarget (NULL);
|
|
m_hDropItem=NULL;
|
|
}
|
|
}
|
|
|
|
// convert from screen coordinates to drop target client coordinates
|
|
pDropWnd->ScreenToClient (&pt);
|
|
|
|
// if window is CTreeCtrl
|
|
if (pDropWnd == &m_xlc)
|
|
{
|
|
UINT uFlags;
|
|
// get the item that is below cursor
|
|
int nIndex=m_xlc.HitTest(pt, &uFlags);
|
|
if(nIndex>=0)
|
|
{
|
|
m_hDropItem=m_xlc.GetItemFromIndex(nIndex);
|
|
HTREEITEM hOldDropItem=m_xlc.GetNextItem(m_xlc.GetRootItem(),
|
|
TVGN_DROPHILITE);
|
|
if(hOldDropItem!=m_hDropItem)
|
|
{
|
|
if(!bDraw)
|
|
{
|
|
// unlock window updates
|
|
VERIFY (m_pDragImage->DragShowNolock(FALSE));
|
|
bDraw=TRUE;
|
|
}
|
|
// highlight it
|
|
m_xlc.SelectDropTarget(m_hDropItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(bDraw)
|
|
{
|
|
// lock window updates
|
|
VERIFY (m_pDragImage->DragShowNolock (TRUE));
|
|
}
|
|
}
|
|
|
|
CDialog::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
if (m_bDragging)
|
|
{
|
|
// end dragging
|
|
VERIFY (m_pDragImage->DragLeave (GetDesktopWindow ()));
|
|
m_pDragImage->EndDrag ();
|
|
// stop intercepting all mouse messages
|
|
VERIFY (::ReleaseCapture ());
|
|
m_bDragging=FALSE;
|
|
|
|
CPoint pt (point);
|
|
ClientToScreen (&pt);
|
|
// m_dropPoint=pt;
|
|
|
|
// get the CWnd pointer of the window that is under the mouse cursor
|
|
CWnd* pDropWnd=WindowFromPoint (pt);
|
|
ASSERT (pDropWnd);
|
|
|
|
// if window is CTreeCtrl
|
|
if (pDropWnd == &m_xlc)
|
|
{
|
|
HTREEITEM htiDropTarget=m_xlc.GetDropHilightItem();
|
|
ASSERT(m_hDropItem==htiDropTarget);
|
|
m_xlc.SelectDropTarget(NULL);
|
|
// move only if we selected only one item
|
|
if(htiDropTarget!=NULL)
|
|
{
|
|
if(m_xlc.GetSelectedCount()<2)
|
|
{
|
|
// the last selected item is the dragged one
|
|
HTREEITEM hDragItem=m_xlc.GetSelectedItem();
|
|
ASSERT (hDragItem);
|
|
|
|
HTREEITEM htiParent=m_xlc.GetParentItem(htiDropTarget);
|
|
if (::GetKeyState(VK_CONTROL) & 0x8000)
|
|
m_xlc.CopyItem(hDragItem,htiDropTarget);
|
|
else
|
|
m_xlc.MoveItem(hDragItem,htiParent,htiDropTarget);
|
|
}
|
|
else
|
|
{
|
|
if (::GetKeyState(VK_CONTROL) & 0x8000)
|
|
AfxMessageBox("Cannot copy more than 1 item at once!");
|
|
else
|
|
AfxMessageBox("Cannot move more than 1 item at once!");
|
|
}
|
|
}
|
|
|
|
m_hDropItem=NULL;
|
|
}
|
|
}
|
|
|
|
CDialog::OnLButtonUp(nFlags, point);
|
|
}
|
|
|
|
|
|
void CExtendedTreeControlDlg::OnTvoxsItemtips()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
UpdateData();
|
|
DWORD dwStyleAdd=m_bItemTips ? TVOXS_ITEMTIPS : 0;
|
|
DWORD dwStyleRemove=m_bItemTips ? 0 : TVOXS_ITEMTIPS;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
|
|
|
|
void CExtendedTreeControlDlg::OnTvoxsNosortheader()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
UpdateData();
|
|
DWORD dwStyleAdd=m_bNoSortHeader ? TVOXS_NOSORTHEADER : 0;
|
|
DWORD dwStyleRemove=m_bNoSortHeader ? 0 : TVOXS_NOSORTHEADER;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
|
|
void CExtendedTreeControlDlg::OnDestroy()
|
|
{
|
|
if (m_LayoutManager.IsAttached())
|
|
m_LayoutManager.Detach();
|
|
|
|
CDialog::OnDestroy();
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
lpMMI->ptMinTrackSize.x = 500;
|
|
lpMMI->ptMinTrackSize.y = 300;
|
|
|
|
CDialog::OnGetMinMaxInfo(lpMMI);
|
|
}
|
|
|
|
void CExtendedTreeControlDlg::OnDelete()
|
|
{
|
|
m_xlc.DeleteAllItems();
|
|
InsertItems();
|
|
// m_xlc.DeleteItem(m_xlc.GetSelectedItem());
|
|
} |