00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "DownloadsGroupsComboBox.h"
00009 #include "GroupDlg.h"
00010
00011 #ifdef _DEBUG
00012 #define new DEBUG_NEW
00013 #undef THIS_FILE
00014 static char THIS_FILE[] = __FILE__;
00015 #endif
00016
00017 CDownloadsGroupsComboBox::CDownloadsGroupsComboBox()
00018 {
00019 m_wndTree.m_pCombo = this;
00020 m_bHasAllGroupsItem = false;
00021 }
00022
00023 CDownloadsGroupsComboBox::~CDownloadsGroupsComboBox()
00024 {
00025 }
00026
00027 BEGIN_MESSAGE_MAP(CDownloadsGroupsComboBox, CComboBox)
00028
00029 ON_WM_DESTROY()
00030 ON_WM_LBUTTONDOWN()
00031 ON_WM_LBUTTONUP()
00032 ON_WM_KEYDOWN()
00033 ON_WM_KILLFOCUS()
00034 ON_WM_SETFOCUS()
00035 ON_WM_LBUTTONDBLCLK()
00036
00037 END_MESSAGE_MAP()
00038
00039 void CDownloadsGroupsComboBox::Fill()
00040 {
00041 m_wndTree.CreateEx (0, WC_TREEVIEW, "", WS_POPUP | WS_BORDER |
00042 TVS_FULLROWSELECT | TVS_HASLINES | TVS_TRACKSELECT,
00043 CRect (0,0,0,0), GetParent (), 0);
00044 m_wndTree.SetWindowPos (&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
00045
00046 HTREEITEM hRoot = TVI_ROOT;
00047
00048 if (m_bHasAllGroupsItem)
00049 {
00050 _inc_TreeCtrlGroups item;
00051 item.pGroup = NULL;
00052 hRoot = item.hItem = m_wndTree.InsertItem (LS (L_ALLGROUPS), TVI_ROOT, TVI_SORT);
00053 m_wndTree.SetItemData (item.hItem, NULL);
00054 m_vGroupItems.push_back (item);
00055 }
00056
00057 FillGroups (_DldsGrps.GetGroupsTree (), hRoot);
00058
00059 if (m_bHasAllGroupsItem)
00060 m_wndTree.Expand (hRoot, TVE_EXPAND);
00061
00062 UINT nId = _App.CreateDld_IdOfLastGrpSelected ();
00063 for (size_t i = m_bHasAllGroupsItem ? 1 : 0; i < m_vGroupItems.size (); i++)
00064 {
00065 if (m_vGroupItems [i].pGroup->nId == nId)
00066 {
00067 m_wndTree.SelectItem (m_vGroupItems [i].hItem);
00068 break;
00069 }
00070 }
00071 if (i == m_vGroupItems.size ())
00072 m_wndTree.SelectItem (m_vGroupItems [0].hItem);
00073
00074 Tree_UpdateSelection (FALSE);
00075 }
00076
00077 BOOL CDownloadsGroupsComboBox::SelectGroup(vmsDownloadsGroupSmartPtr grp)
00078 {
00079 HTREEITEM hSelect = NULL;
00080
00081 if (grp == NULL)
00082 {
00083 if (m_bHasAllGroupsItem)
00084 {
00085 hSelect = m_vGroupItems [0].hItem;
00086 }
00087 }
00088 else
00089 {
00090 for (size_t i = m_bHasAllGroupsItem ? 1 : 0; i < m_vGroupItems.size (); i++)
00091 {
00092 if (m_vGroupItems [i].pGroup->nId == grp->nId)
00093 {
00094 hSelect = m_vGroupItems [i].hItem;
00095 break;
00096 }
00097 }
00098
00099 if (hSelect == NULL)
00100 return FALSE;
00101 }
00102
00103 m_wndTree.SelectItem (hSelect);
00104
00105 Tree_UpdateSelection (FALSE);
00106
00107 return TRUE;
00108 }
00109
00110 vmsDownloadsGroupSmartPtr CDownloadsGroupsComboBox::CreateNewGroup(vmsDownloadsGroupSmartPtr pParentGroup)
00111 {
00112 CGroupDlg dlg (NULL, pParentGroup, this);
00113 if (IDCANCEL == _DlgMgr.DoModal (&dlg))
00114 return NULL;
00115
00116 HTREEITEM hRoot = TVI_ROOT;
00117 if (dlg.m_pParentGroup != NULL)
00118 {
00119 for (size_t i = m_bHasAllGroupsItem ? 1 : 0; i < m_vGroupItems.size (); i++)
00120 {
00121 if (dlg.m_pParentGroup->nId == m_vGroupItems [i].pGroup->nId)
00122 {
00123 hRoot = m_vGroupItems [i].hItem;
00124 break;
00125 }
00126 }
00127 }
00128
00129 _inc_TreeCtrlGroups item;
00130 item.pGroup = dlg.m_pGroup;
00131 item.hItem = m_wndTree.InsertItem (dlg.m_pGroup->strName, hRoot, TVI_SORT);
00132 m_wndTree.SetItemData (item.hItem, (DWORD_PTR)(vmsDownloadsGroup*)dlg.m_pGroup);
00133 m_vGroupItems.push_back (item);
00134
00135 SelectGroup (dlg.m_pGroup);
00136
00137 return dlg.m_pGroup;
00138 }
00139
00140 vmsDownloadsGroupSmartPtr CDownloadsGroupsComboBox::GetSelectedGroup()
00141 {
00142 return m_pSelectedGroup;
00143 }
00144
00145 void CDownloadsGroupsComboBox::OnDestroy()
00146 {
00147 RememberSelectedGroup ();
00148
00149 CComboBox::OnDestroy();
00150 }
00151
00152 void CDownloadsGroupsComboBox::RememberSelectedGroup()
00153 {
00154 vmsDownloadsGroupSmartPtr pGroup = GetSelectedGroup ();
00155 if (pGroup != NULL)
00156 _App.CreateDld_IdOfLastGrpSelected (pGroup->nId);
00157 }
00158
00159 BOOL CDownloadsGroupsComboBox::SelectGroupById(UINT nGroupId)
00160 {
00161 if (nGroupId == (UINT)-1)
00162 return FALSE;
00163
00164 vmsDownloadsGroupSmartPtr pGroup = _DldsGrps.FindGroup (nGroupId);
00165 if (pGroup == NULL)
00166 return FALSE;
00167
00168 return SelectGroup (pGroup);
00169 }
00170
00171 void CDownloadsGroupsComboBox::OnLButtonDown(UINT nFlags, CPoint point)
00172 {
00173 fsTicksMgr timeNow; timeNow.Now ();
00174 if (timeNow - m_timeLastHide > 300)
00175 {
00176 CComboBox::OnLButtonDown(nFlags, point);
00177
00178 if (m_wndTree.IsWindowVisible () == FALSE)
00179 ShowDropDown (TRUE);
00180 }
00181 }
00182
00183 void CDownloadsGroupsComboBox::OnLButtonUp(UINT nFlags, CPoint point)
00184 {
00185 CComboBox::OnLButtonUp(nFlags, point);
00186 }
00187
00188 void CDownloadsGroupsComboBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
00189 {
00190 if (nChar == VK_DOWN || nChar == VK_UP)
00191 {
00192 m_wndTree.SendMessage (WM_KEYDOWN, nChar, 0);
00193 Tree_UpdateSelection ();
00194 }
00195
00196 CComboBox::OnKeyDown(nChar, nRepCnt, nFlags);
00197 }
00198
00199 void CDownloadsGroupsComboBox::ShowDropDown(BOOL bShow)
00200 {
00201 if (m_wndTree.IsWindowVisible ())
00202 {
00203 if (bShow == FALSE)
00204 {
00205 m_wndTree.ShowWindow (SW_HIDE);
00206 m_timeLastHide.Now ();
00207 }
00208 return;
00209 }
00210
00211 if (bShow == FALSE)
00212 return;
00213
00214 CRect rc;
00215 GetWindowRect (&rc);
00216
00217 rc.top = rc.bottom;
00218 rc.bottom += 150;
00219
00220 m_wndTree.MoveWindow (&rc);
00221
00222 m_wndTree.ShowWindow (SW_SHOW);
00223
00224 m_wndTree.SetFocus ();
00225 }
00226
00227 void CDownloadsGroupsComboBox::OnKillFocus(CWnd* pNewWnd)
00228 {
00229 CComboBox::OnKillFocus(pNewWnd);
00230 }
00231
00232 void CDownloadsGroupsComboBox::OnSetFocus(CWnd* pOldWnd)
00233 {
00234 CComboBox::OnSetFocus(pOldWnd);
00235
00236 if (pOldWnd != NULL && pOldWnd->m_hWnd == m_wndTree.m_hWnd)
00237 ShowDropDown (FALSE);
00238 }
00239
00240 void CDownloadsGroupsComboBox::OnLButtonDblClk(UINT nFlags, CPoint point)
00241 {
00242 OnLButtonDown (nFlags, point);
00243
00244 }
00245
00246 void CDownloadsGroupsComboBox::Tree_UpdateSelection(BOOL bPostNotificationMsg)
00247 {
00248 DeleteString (0);
00249 HTREEITEM hItem = m_wndTree.GetSelectedItem ();
00250 if (hItem)
00251 {
00252 m_pSelectedGroup = (vmsDownloadsGroup*)m_wndTree.GetItemData (hItem);
00253 AddString (m_wndTree.GetItemText (hItem));
00254 }
00255 else
00256 {
00257 m_pSelectedGroup = NULL;
00258 AddString ("");
00259 }
00260 SetCurSel (0);
00261
00262 if (bPostNotificationMsg)
00263 {
00264 GetParent ()->PostMessage (WM_COMMAND, MAKEWPARAM (GetDlgCtrlID (), CBN_SELCHANGE),
00265 (LPARAM)m_hWnd);
00266 }
00267 }
00268
00269 void CDownloadsGroupsComboBox::FillGroups(PDLDS_GROUPS_TREE pGroupsTree, HTREEITEM hRoot)
00270 {
00271 for (int i = 0; i < pGroupsTree->GetLeafCount (); i++)
00272 {
00273
00274 _inc_TreeCtrlGroups item;
00275 item.pGroup = pGroupsTree->GetLeaf (i)->GetData ();
00276 item.hItem = m_wndTree.InsertItem (
00277 item.pGroup->nId != GRP_OTHER_ID ? item.pGroup->strName : LS (L_OTHER),
00278 hRoot, TVI_SORT);
00279 m_wndTree.SetItemData (item.hItem, (DWORD_PTR)(vmsDownloadsGroup*)item.pGroup);
00280 m_vGroupItems.push_back (item);
00281
00282 FillGroups (pGroupsTree->GetLeaf (i), item.hItem);
00283
00284 m_wndTree.Expand (item.hItem, TVE_EXPAND);
00285 }
00286 }