root / trunk / win / GrpTree.cpp

Revision 680, 6.0 kB (checked in by leo, 19 months ago)

Added lcPivot class to replace the old group system.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// GrpTree.cpp : implementation file
2//
3
4#include "lc_global.h"
5#include "lc_object.h"
6#include "GrpTree.h"
7#include "group.h"
8
9#ifdef _DEBUG
10#define new DEBUG_NEW
11#undef THIS_FILE
12static char THIS_FILE[] = __FILE__;
13#endif
14
15/////////////////////////////////////////////////////////////////////////////
16// CGroupEditTree
17
18CGroupEditTree::CGroupEditTree()
19{
20  m_bDragging = FALSE;
21}
22
23CGroupEditTree::~CGroupEditTree()
24{
25}
26
27
28BEGIN_MESSAGE_MAP(CGroupEditTree, CTreeCtrl)
29    //{{AFX_MSG_MAP(CGroupEditTree)
30    ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBeginDrag)
31    ON_WM_LBUTTONUP()
32    ON_WM_MOUSEMOVE()
33    ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginLabelEdit)
34    ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndLabelEdit)
35    //}}AFX_MSG_MAP
36END_MESSAGE_MAP()
37
38/////////////////////////////////////////////////////////////////////////////
39// CGroupEditTree message handlers
40
41void CGroupEditTree::AddChildren(HTREEITEM hParent, Group* pGroup)
42{
43    /*
44    FIXME: groups
45    int i;
46    TV_INSERTSTRUCT tvstruct;
47    tvstruct.hParent = hParent;
48    tvstruct.hInsertAfter = TVI_SORT;
49
50    for (i = 0; i < opts->groupcount; i++)
51        if (opts->groupsgroups[i] == pGroup)
52        {
53            tvstruct.item.lParam = i + 0xFFFF;
54            tvstruct.item.iImage = 0;
55            tvstruct.item.iSelectedImage = 1;
56            tvstruct.item.pszText = opts->groups[i]->m_strName;
57            tvstruct.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
58
59            HTREEITEM hti = InsertItem(&tvstruct);
60            AddChildren(hti, opts->groups[i]);
61        }
62
63    for (i = 0; i < opts->piececount; i++)
64        if (opts->piecesgroups[i] == pGroup)
65        {
66            tvstruct.item.lParam = i;
67            tvstruct.item.iImage = 2;
68            tvstruct.item.iSelectedImage = 2;
69            tvstruct.item.pszText = (char*)opts->pieces[i]->m_Name;
70            tvstruct.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
71            InsertItem(&tvstruct);
72        }
73        */
74}
75
76void CGroupEditTree::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
77{
78    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
79    GetEditControl()->LimitText(80);
80    *pResult = 0;
81}
82
83void CGroupEditTree::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
84{
85    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
86
87    // Set result to TRUE to accept the changes
88    *pResult = TRUE;
89}
90
91void CGroupEditTree::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult)
92{
93    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
94    *pResult = 0;
95
96    SetFocus(); // Receive WM_KEYDOWN
97    m_hitemDrag = pNMTreeView->itemNew.hItem;
98    m_hitemDrop = NULL;
99
100    SelectItem(m_hitemDrag);
101    if (!IsDropSource(m_hitemDrag))
102        return;
103
104    // get the image list for dragging
105    m_pDragImage = CreateDragImage(m_hitemDrag);
106
107    // CreateDragImage() returns NULL if no image list
108    // associated with the tree view control
109    if (!m_pDragImage)
110        return;
111
112    m_bDragging = TRUE;
113    m_pDragImage->BeginDrag(0, CPoint(-15,-15));
114
115    m_dropCursor = LoadCursor(NULL, IDC_ARROW);
116    m_noDropCursor = LoadCursor(NULL, IDC_NO);
117
118    POINT pt = pNMTreeView->ptDrag;
119    ClientToScreen(&pt);
120    m_pDragImage->DragEnter(NULL, pt);
121    SetCapture();
122   
123    *pResult = 0;
124}
125
126void CGroupEditTree::OnMouseMove(UINT nFlags, CPoint point)
127{
128    HTREEITEM hitem;
129    UINT flags;
130
131    if (m_bDragging)
132    {
133        POINT pt = point;
134        ClientToScreen(&pt);
135        CImageList::DragMove(pt);
136        if ((hitem = HitTest(point, &flags)) != NULL)
137        {
138            CImageList::DragShowNolock(FALSE);
139            m_hitemDrop = GetDropTarget(hitem);
140            SelectDropTarget(m_hitemDrop);
141            CImageList::DragShowNolock(TRUE);
142        }
143        else
144            m_hitemDrop = NULL;
145
146        if (m_hitemDrop)
147            SetCursor(m_dropCursor);
148        else
149            SetCursor(m_noDropCursor);
150    }
151
152    CTreeCtrl::OnMouseMove(nFlags, point);
153}
154
155void CGroupEditTree::OnLButtonUp(UINT nFlags, CPoint point)
156{
157    CTreeCtrl::OnLButtonUp(nFlags, point);
158/*
159FIXME: groups
160    if (m_bDragging)
161    {
162        m_bDragging = FALSE;
163        CImageList::DragLeave(this);
164        CImageList::EndDrag();
165        ReleaseCapture();
166
167        delete m_pDragImage;
168
169        // Remove drop target highlighting
170        SelectDropTarget(NULL);
171
172        if (m_hitemDrag == m_hitemDrop || m_hitemDrop == NULL)
173            return;
174
175        // If Drag item is an ancestor of Drop item then return
176        HTREEITEM htiParent = m_hitemDrop;
177        while ((htiParent = GetParentItem(htiParent)) != NULL)
178            if (htiParent == m_hitemDrag)
179                return;
180       
181        Expand(m_hitemDrop, TVE_EXPAND);
182
183        DWORD source = GetItemData(m_hitemDrag);
184        DWORD dest = GetItemData(m_hitemDrop) - 0xFFFF;
185        TV_INSERTSTRUCT tvstruct;
186        tvstruct.hParent = m_hitemDrop;
187        tvstruct.hInsertAfter = TVI_SORT;
188        tvstruct.item.lParam = source;
189        tvstruct.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
190        DeleteItem(m_hitemDrag);
191
192        if (source < 0xFFFF)
193        {
194            opts->piecesgroups[source] = opts->groups[dest];
195
196            tvstruct.item.iImage = 2;
197            tvstruct.item.iSelectedImage = 2;
198            tvstruct.item.pszText = (char*)opts->pieces[source]->m_Name;
199            InsertItem(&tvstruct);
200        }
201        else
202        {
203            opts->groupsgroups[source - 0xFFFF] = opts->groups[dest];
204
205            tvstruct.item.iImage = 0;
206            tvstruct.item.iSelectedImage = 1;
207            tvstruct.item.pszText = opts->groups[source - 0xFFFF]->m_strName;
208
209            HTREEITEM hti = InsertItem(&tvstruct);
210            AddChildren(hti, opts->groups[source - 0xFFFF]);
211        }
212
213//      AddChildren(m_hitemDrop, opts->groups[dest]);
214    }
215    */
216}
217
218BOOL CGroupEditTree::PreTranslateMessage(MSG* pMsg)
219{
220    if (pMsg->message == WM_KEYDOWN)
221    {
222        if (GetEditControl()
223            && (pMsg->wParam == VK_RETURN
224            ||  pMsg->wParam == VK_ESCAPE))
225        {
226            ::TranslateMessage(pMsg);
227            ::DispatchMessage(pMsg);
228            return TRUE;    // DO NOT process further
229        }
230
231        if (pMsg->wParam == VK_ESCAPE
232            && m_bDragging)
233        {
234            m_bDragging = 0;
235            CImageList::DragLeave(NULL);
236            CImageList::EndDrag();
237            ReleaseCapture();
238            SelectDropTarget(NULL);
239            delete m_pDragImage;
240            return TRUE;    // DO NOT process further
241        }
242    }
243
244    return CTreeCtrl::PreTranslateMessage(pMsg);
245}
246
247BOOL CGroupEditTree::IsDropSource(HTREEITEM /*hItem*/)
248{
249    return TRUE;
250}
251
252HTREEITEM CGroupEditTree::GetDropTarget(HTREEITEM hItem)
253{
254    if (GetItemData(hItem) < 0xFFFF)
255        hItem = GetParentItem(hItem);
256
257    // inhibit drop on the drop source or its parent
258    if (hItem == m_hitemDrag || hItem == GetParentItem(m_hitemDrag))
259        return NULL;
260
261    HTREEITEM htiParent = hItem;
262    while ((htiParent = GetParentItem(htiParent)) != NULL)
263        if (htiParent == m_hitemDrag)
264            return NULL;
265
266    return hItem;
267}
Note: See TracBrowser for help on using the browser.