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 if ((WM_KEYUP == pMsg->message && VK_CONTROL == pMsg->wParam) ||
64 (WM_KEYDOWN == pMsg->message && VK_ESCAPE == pMsg->wParam))
66 PostMessage(WM_CLOSE);
69 if (WM_KEYDOWN == pMsg->message && VK_TAB == pMsg->wParam)
71 PostMessage(WMU_SELECTNEXT, (GetAsyncKeyState(VK_SHIFT) < 0) ? 1 : 0, 0);
74 return CDialog::PreTranslateMessage(pMsg);
77 BOOL CWindowsManagerDialog::OnInitDialog()
79 CDialog::OnInitDialog();
81 m_List.SetExtendedStyle(LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT);
84 m_pIL = new CImageList();
86 m_pIL->DeleteImageList();
87 m_pIL->Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 1);
88 m_List.SetImageList(m_pIL, LVSIL_SMALL);
89 m_List.SetBkColor(WMD_LISTCOLOR_BKG);
90 m_List.SetTextBkColor(WMD_LISTCOLOR_BKG);
94 if(m_List.GetItemCount() > 0)
95 m_List.SetItemState((1 == m_List.GetItemCount()) ? 0 : 1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
98 CenterWindow(m_pFrame); // please initialize the parent window before creating dialog
100 return TRUE; // return TRUE unless you set the focus to a control
101 // EXCEPTION: OCX Property Pages should return FALSE
104 void CWindowsManagerDialog::PopulateList()
106 if (m_List.GetItemCount() <= 0)
109 m_List.GetWindowRect(rect);
110 m_List.InsertColumn(0, _T("Files"), LVCFMT_LEFT, rect.Width());
113 m_List.DeleteAllItems();
116 const CTypedPtrArray<CPtrArray, CMDIChildWnd*>* pArrChild = m_pFrame->GetChildArray();
117 for (int i = 0; i < pArrChild->GetSize(); ++i)
119 HICON hIcon = pArrChild->GetAt(i)->GetIcon(TRUE);
121 hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
123 sText = pArrChild->GetAt(i)->GetActiveDocument()->GetPathName();
125 pArrChild->GetAt(i)->GetWindowText(sText);
126 m_List.InsertItem(i, sText, m_pIL->GetImageCount() - 1);
127 m_List.SetItemData(i, (DWORD_PTR)pArrChild->GetAt(i));
130 // adjust size to listctrl column and dialog
131 void CWindowsManagerDialog::AdjustSize()
134 m_List.GetItemRect(0, rect, LVIR_ICON);
136 const int nImgWidth = rect.right - rect.left;
137 const int nSpaceWidth = m_List.GetStringWidth(_T(" "));
138 const int nLeftMargin = ::GetSystemMetrics(SM_CXFRAME) * 2 + nSpaceWidth * 4;
143 CRect _rc(0, 0, 0, 0);
144 for (int i = 0; i < m_List.GetItemCount(); ++i)
146 sText = m_List.GetItemText(i, 0);
147 int nWidth = m_List.GetStringWidth(sText);
148 if (nWidth > nMaxWidth)
150 _rc.bottom += rect.bottom - rect.top;
153 _rc.right = nMaxWidth + nImgWidth + nLeftMargin + 2 * ::GetSystemMetrics(SM_CYVSCROLL);
154 m_List.SetColumnWidth(0, _rc.right - ::GetSystemMetrics(SM_CYFRAME));
156 //if the tasklist exceeds the height of the display, leave some space at the bottom
157 if (_rc.bottom > ::GetSystemMetrics(SM_CYSCREEN) - 50)
159 _rc.bottom = ::GetSystemMetrics(SM_CYSCREEN) - 50;
160 m_List.SetColumnWidth(0, _rc.right - ::GetSystemMetrics(SM_CYFRAME) - ::GetSystemMetrics(SM_CYVSCROLL));
162 // Task List's border is 1px smaller than ::GetSystemMetrics(SM_CYFRAME) returns
163 _rc.bottom += ::GetSystemMetrics(SM_CYFRAME);
164 MoveWindow(_rc, FALSE);
167 void CWindowsManagerDialog::SetParentWnd(CWnd* pWnd)
169 ASSERT(NULL != pWnd);
170 m_pFrame = DYNAMIC_DOWNCAST(CMainFrame, pWnd);
173 void CWindowsManagerDialog::OnSize(UINT nType, int cx, int cy)
175 CDialog::OnSize(nType, cx, cy);
177 if(NULL != m_List.GetSafeHwnd() && cx > 0 && cy > 0)
178 m_List.MoveWindow(0, 0, cx, cy);
181 void CWindowsManagerDialog::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
183 CDialog::OnActivate(nState, pWndOther, bMinimized);
185 if (WA_INACTIVE == nState)
186 PostMessage(WM_CLOSE);
189 void CWindowsManagerDialog::OnClose()
197 void CWindowsManagerDialog::OnOK()
205 void CWindowsManagerDialog::OnCancel()
213 void CWindowsManagerDialog::PostNcDestroy()
215 CDialog::PostNcDestroy();
221 void CWindowsManagerDialog::OnDestroy()
223 CDialog::OnDestroy();
225 const int nIndex = m_List.GetNextItem(-1, LVNI_SELECTED);
226 if (nIndex >= 0 && nIndex < m_List.GetItemCount())
227 ::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), WMU_CHILDFRAMEACTIVATE, 0, (LPARAM)m_List.GetItemData(nIndex));
230 LRESULT CWindowsManagerDialog::OnIsOpen(WPARAM wParam, LPARAM lParam)
235 LRESULT CWindowsManagerDialog::OnSelectNext(WPARAM wParam, LPARAM lParam)
237 int nIndex = m_List.GetNextItem(-1, LVNI_SELECTED);
238 if (wParam) // reverse order
241 nIndex = m_List.GetItemCount() - 1;
247 if (nIndex == m_List.GetItemCount() - 1)
253 m_List.SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
254 m_List.EnsureVisible(nIndex, FALSE);
259 void CWindowsManagerDialog::OnNMCustomdrawListFile(NMHDR* pNMHDR, LRESULT* pResult)
261 NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
263 switch (pLVCD->nmcd.dwDrawStage)
266 *pResult = CDRF_NOTIFYITEMDRAW;
268 case CDDS_ITEMPREPAINT:
269 if (CDIS_FOCUS == (pLVCD->nmcd.uItemState & CDIS_FOCUS))
271 pLVCD->nmcd.uItemState = CDIS_DEFAULT;
272 pLVCD->clrTextBk = WMD_LISTCOLOR_BKGSEL;
274 *pResult = CDRF_DODEFAULT;
277 *pResult = CDRF_DODEFAULT;
282 void CWindowsManagerDialog::OnNMDblclkListFile(NMHDR* pNMHDR, LRESULT* pResult)
286 PostMessage(WM_CLOSE);