1 // WindowsManagerDialog.cpp : implementation file
6 #include "WindowsManagerDialog.h"
11 static char THIS_FILE[] = __FILE__;
14 /////////////////////////////////////////////////////////////////////////////
15 // CWindowsManagerDialog dialog
17 CWindowsManagerDialog::CWindowsManagerDialog(CWnd* pParent/* = NULL*/)
18 : CDialog(CWindowsManagerDialog::IDD, pParent)
19 ,m_bAutoCleanup(FALSE)
23 //{{AFX_DATA_INIT(CWindowsManagerDialog)
24 // NOTE: the ClassWizard will add member initialization here
28 CWindowsManagerDialog::~CWindowsManagerDialog()
30 if (NULL != m_pIL->GetSafeHandle())
31 m_pIL->DeleteImageList();
36 void CWindowsManagerDialog::DoDataExchange(CDataExchange* pDX)
38 CDialog::DoDataExchange(pDX);
39 //{{AFX_DATA_MAP(CWindowsManagerDialog)
40 // NOTE: the ClassWizard will add DDX and DDV calls here
42 DDX_Control(pDX, IDC_LIST_FILE, m_List);
45 BEGIN_MESSAGE_MAP(CWindowsManagerDialog, CDialog)
46 //{{AFX_MSG_MAP(CWindowsManagerDialog)
51 ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_FILE, &CWindowsManagerDialog::OnNMCustomdrawListFile)
52 ON_NOTIFY(NM_DBLCLK, IDC_LIST_FILE, &CWindowsManagerDialog::OnNMDblclkListFile)
54 ON_MESSAGE(WMU_ISOPEN, &CWindowsManagerDialog::OnIsOpen)
55 ON_MESSAGE(WMU_SELECTNEXT, &CWindowsManagerDialog::OnSelectNext)
58 /////////////////////////////////////////////////////////////////////////////
59 // CWindowsManagerDialog message handlers
61 BOOL CWindowsManagerDialog::PreTranslateMessage(MSG* pMsg)
63 // TODO: Add your specialized code here and/or call the base class
65 if ((WM_KEYUP == pMsg->message && VK_CONTROL == pMsg->wParam) ||
66 (WM_KEYDOWN == pMsg->message && VK_ESCAPE == pMsg->wParam))
68 PostMessage(WM_CLOSE);
71 if (WM_KEYDOWN == pMsg->message && VK_TAB == pMsg->wParam)
73 PostMessage(WMU_SELECTNEXT, (GetAsyncKeyState(VK_SHIFT) < 0) ? 1 : 0, 0);
76 return CDialog::PreTranslateMessage(pMsg);
79 BOOL CWindowsManagerDialog::OnInitDialog()
81 CDialog::OnInitDialog();
83 // TODO: Add extra initialization here
85 m_List.SetExtendedStyle(LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT);
88 m_pIL = new CImageList();
90 m_pIL->DeleteImageList();
91 m_pIL->Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 1);
92 m_List.SetImageList(m_pIL, LVSIL_SMALL);
93 m_List.SetBkColor(WMD_LISTCOLOR_BKG);
94 m_List.SetTextBkColor(WMD_LISTCOLOR_BKG);
98 if(m_List.GetItemCount() > 0)
99 m_List.SetItemState((1 == m_List.GetItemCount()) ? 0 : 1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
102 CenterWindow(m_pFrame); // please initialize the parent window before creating dialog
104 return TRUE; // return TRUE unless you set the focus to a control
105 // EXCEPTION: OCX Property Pages should return FALSE
108 void CWindowsManagerDialog::PopulateList()
110 if (m_List.GetItemCount() <= 0)
113 m_List.GetWindowRect(rect);
114 m_List.InsertColumn(0, _T("Files"), LVCFMT_LEFT, rect.Width());
117 m_List.DeleteAllItems();
120 const CTypedPtrArray<CPtrArray, CMDIChildWnd*>* pArrChild = m_pFrame->GetChildArray();
121 for (int i = 0; i < pArrChild->GetSize(); ++i)
123 HICON hIcon = pArrChild->GetAt(i)->GetIcon(TRUE);
125 hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
127 sText = pArrChild->GetAt(i)->GetActiveDocument()->GetPathName();
129 pArrChild->GetAt(i)->GetWindowText(sText);
130 m_List.InsertItem(i, sText, m_pIL->GetImageCount() - 1);
131 m_List.SetItemData(i, (DWORD_PTR)pArrChild->GetAt(i));
134 // adjust size to listctrl column and dialog
135 void CWindowsManagerDialog::AdjustSize()
138 m_List.GetItemRect(0, rect, LVIR_ICON);
140 const int nImgWidth = rect.right - rect.left;
141 const int nSpaceWidth = m_List.GetStringWidth(_T(" "));
142 const int nLeftMargin = ::GetSystemMetrics(SM_CXFRAME) * 2 + nSpaceWidth * 4;
147 CRect _rc(0, 0, 0, 0);
148 for (int i = 0; i < m_List.GetItemCount(); ++i)
150 sText = m_List.GetItemText(i, 0);
151 int nWidth = m_List.GetStringWidth(sText);
152 if (nWidth > nMaxWidth)
154 _rc.bottom += rect.bottom - rect.top;
157 _rc.right = nMaxWidth + nImgWidth + nLeftMargin + 2 * ::GetSystemMetrics(SM_CYVSCROLL);
158 m_List.SetColumnWidth(0, _rc.right - ::GetSystemMetrics(SM_CYFRAME));
160 //if the tasklist exceeds the height of the display, leave some space at the bottom
161 if (_rc.bottom > ::GetSystemMetrics(SM_CYSCREEN) - 50)
163 _rc.bottom = ::GetSystemMetrics(SM_CYSCREEN) - 50;
164 m_List.SetColumnWidth(0, _rc.right - ::GetSystemMetrics(SM_CYFRAME) - ::GetSystemMetrics(SM_CYVSCROLL));
166 // Task List's border is 1px smaller than ::GetSystemMetrics(SM_CYFRAME) returns
167 _rc.bottom += ::GetSystemMetrics(SM_CYFRAME);
168 MoveWindow(_rc, FALSE);
171 void CWindowsManagerDialog::SetParentWnd(CWnd* pWnd)
173 ASSERT(NULL != pWnd);
174 m_pFrame = DYNAMIC_DOWNCAST(CMainFrame, pWnd);
177 void CWindowsManagerDialog::OnSize(UINT nType, int cx, int cy)
179 CDialog::OnSize(nType, cx, cy);
181 // TODO: Add your message handler code here
183 if(NULL != m_List.GetSafeHwnd() && cx > 0 && cy > 0)
184 m_List.MoveWindow(0, 0, cx, cy);
187 void CWindowsManagerDialog::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
189 CDialog::OnActivate(nState, pWndOther, bMinimized);
191 if (WA_INACTIVE == nState)
192 PostMessage(WM_CLOSE);
195 void CWindowsManagerDialog::OnClose()
197 // TODO: Add your message handler code here and/or call default
205 void CWindowsManagerDialog::OnOK()
207 // TODO: Add extra validation here
215 void CWindowsManagerDialog::OnCancel()
217 // TODO: Add extra cleanup here
225 void CWindowsManagerDialog::PostNcDestroy()
227 // TODO: Add your specialized code here and/or call the base class
228 CDialog::PostNcDestroy();
234 void CWindowsManagerDialog::OnDestroy()
236 CDialog::OnDestroy();
238 // TODO: Add your message handler code here
240 const int nIndex = m_List.GetNextItem(-1, LVNI_SELECTED);
241 if (nIndex >= 0 && nIndex < m_List.GetItemCount())
242 ::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), WMU_CHILDFRAMEACTIVATE, 0, (LPARAM)m_List.GetItemData(nIndex));
245 LRESULT CWindowsManagerDialog::OnIsOpen(WPARAM wParam, LPARAM lParam)
250 LRESULT CWindowsManagerDialog::OnSelectNext(WPARAM wParam, LPARAM lParam)
252 int nIndex = m_List.GetNextItem(-1, LVNI_SELECTED);
253 if (wParam) // reverse order
256 nIndex = m_List.GetItemCount() - 1;
262 if (nIndex == m_List.GetItemCount() - 1)
268 m_List.SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
269 m_List.EnsureVisible(nIndex, FALSE);
274 void CWindowsManagerDialog::OnNMCustomdrawListFile(NMHDR* pNMHDR, LRESULT* pResult)
276 // LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
277 NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
278 // TODO: Add your control notification handler code here
280 switch (pLVCD->nmcd.dwDrawStage)
283 *pResult = CDRF_NOTIFYITEMDRAW;
285 case CDDS_ITEMPREPAINT:
286 if (CDIS_FOCUS == (pLVCD->nmcd.uItemState & CDIS_FOCUS))
288 pLVCD->nmcd.uItemState = CDIS_DEFAULT;
289 pLVCD->clrTextBk = WMD_LISTCOLOR_BKGSEL;
291 *pResult = CDRF_DODEFAULT;
294 *pResult = CDRF_DODEFAULT;
299 void CWindowsManagerDialog::OnNMDblclkListFile(NMHDR* pNMHDR, LRESULT* pResult)
301 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
302 // TODO: Add your control notification handler code here
305 PostMessage(WM_CLOSE);