source: trunk/DirectShowSpy/FilterGraphList.h @ 242

Last change on this file since 242 was 242, checked in by roman, 8 years ago
File size: 22.0 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2014
3// Created by Roman Ryltsov roman@alax.info
4
5#pragma once
6
7#include <psapi.h>
8#include <atlctrlx.h>
9#include <atlsplit.h>
10#include "rofiles.h"
11#include "FilterGraphSpy.h"
12#include "FilterGraphHelper.h"
13#include "AboutDialog.h"
14
15#pragma comment(lib, "psapi.lib")
16
17////////////////////////////////////////////////////////////
18// CFilterGraphListPropertySheet
19
20INT_PTR DoFilterGraphListPropertySheetModal(HWND hParentWindow = GetActiveWindow());
21
22class CFilterGraphListPropertySheet :
23        public CSizablePropertySheetT<CFilterGraphListPropertySheet>,
24        public CPropertySheetWithAcceleratorsT<CFilterGraphListPropertySheet>
25{
26public:
27
28BEGIN_MSG_MAP_EX(CFilterGraphListPropertySheet)
29        CHAIN_MSG_MAP(CSizablePropertySheet)
30        MSG_WM_SYSCOMMAND(OnSysCommand)
31END_MSG_MAP()
32
33public:
34
35        ////////////////////////////////////////////////////////
36        // CListPropertyPage
37
38        class CListPropertyPage :
39                public CPropertyPageT<CListPropertyPage>,
40                public CDialogResize<CListPropertyPage>,
41                public CPropertyPageWithAcceleratorsT<CListPropertyPage>
42        {
43        public:
44
45                enum { IDD = IDD_FILTERGRAPHLIST_LIST_PROPERTYPAGE };
46
47        BEGIN_MSG_MAP_EX(CListPropertyPage)
48                CHAIN_MSG_MAP(CPropertyPage)
49                CHAIN_MSG_MAP(CDialogResize<CListPropertyPage>)
50                CHAIN_MSG_MAP(CPropertyPageWithAccelerators)
51                MSG_WM_INITDIALOG(OnInitDialog)
52                MSG_WM_DESTROY(OnDestroy)
53                MSG_LVN_GETDISPINFO(IDC_FILTERGRAPHLIST_LIST_GRAPH, OnGraphListViewGetDispInfo)
54                MSG_LVN_GETINFOTIP(IDC_FILTERGRAPHLIST_LIST_GRAPH, OnGraphListViewGetInfoTip)
55                MSG_LVN_ITEMCHANGED(IDC_FILTERGRAPHLIST_LIST_GRAPH, OnGraphListViewItemChanged)
56                MSG_LVN_DBLCLK(IDC_FILTERGRAPHLIST_LIST_GRAPH, OnGraphListViewDblClk)
57                MSG_WM_CONTEXTMENU(OnContextMenu)
58                COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHLIST_LIST_REFRESH, OnRefresh)
59                COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHLIST_LIST_CHECK, OnCheck)
60                COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHLIST_LIST_CHECKALL, OnCheckAll)
61                COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHLIST_LIST_COPYTOCLIPBOARD, OnCopyToClipboard)
62                COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHLIST_LIST_PROPERTIES, OnProperties)
63                COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHLIST_LIST_OPENGSN, OnOpenGsn)
64                COMMAND_ID_HANDLER_EX(IDC_FILTERGRAPHLIST_LIST_OPENGE, OnOpenGe)
65                REFLECT_NOTIFICATIONS()
66        END_MSG_MAP()
67
68        BEGIN_DLGRESIZE_MAP(CListPropertyPage)
69                DLGRESIZE_CONTROL(IDC_FILTERGRAPHLIST_LIST_GRAPH, DLSZ_SIZE_X | DLSZ_SIZE_Y)
70                DLGRESIZE_CONTROL(IDC_FILTERGRAPHLIST_LIST_REFRESH, DLSZ_MOVE_Y)
71                DLGRESIZE_CONTROL(IDC_FILTERGRAPHLIST_LIST_CHECK, DLSZ_MOVE_Y)
72                DLGRESIZE_CONTROL(IDC_FILTERGRAPHLIST_LIST_COPYTOCLIPBOARD, DLSZ_MOVE_Y)
73                DLGRESIZE_CONTROL(IDC_FILTERGRAPHLIST_LIST_PROPERTIES, DLSZ_MOVE_Y)
74        END_DLGRESIZE_MAP()
75
76        public:
77
78                ////////////////////////////////////////////////////
79                // CItem
80
81                class CItem
82                {
83                public:
84                        CComPtr<IMoniker> m_pMoniker;
85                        CStringW m_sDisplayName;
86                        DWORD64 m_nInstance;
87                        DWORD m_nProcessIdentifier;
88                        CPath m_sProcessImagePath;
89                        CString m_sTime;
90                        CComPtr<IUnknown> m_pFilterGraphUnknown;
91                        CComPtr<IFilterGraph> m_pFilterGraph;
92                        CStringW m_sFriendlyName;
93                        SIZE_T m_nFilterCount;
94                        CString m_sState;
95                        DOUBLE m_fDuration;
96                        DOUBLE m_fPosition;
97
98                public:
99                // CItem
100                        CItem() throw() :
101                                m_nFilterCount(0),
102                                m_fDuration(0),
103                                m_fPosition(0)
104                        {
105                        }
106                        CComPtr<IFilterGraph>& FilterGraphNeeded(IRunningObjectTable* pRunningObjectTable)
107                        {
108                                _A(pRunningObjectTable);
109                                if(!m_pFilterGraph && pRunningObjectTable && m_pMoniker)
110                                {
111                                        _A(m_pMoniker);
112                                        CComPtr<IBindCtx> pBindCtx;
113                                        __C(CreateBindCtx(0, &pBindCtx));
114                                        CComPtr<IUnknown> pUnknown;
115                                        __C(pRunningObjectTable->GetObject(m_pMoniker, &pUnknown));
116                                        const CComQIPtr<IFilterGraph> pFilterGraph = pUnknown;
117                                        __D(pFilterGraph, E_NOINTERFACE);
118                                        m_pFilterGraphUnknown = pUnknown;
119                                        m_pFilterGraph = pFilterGraph;
120                                        _ATLTRY
121                                        {
122                                                const CComQIPtr<ISpy> pSpy = pFilterGraph;
123                                                if(pSpy)
124                                                {
125                                                        CComBSTR sFriendlyName;
126                                                        __C(pSpy->get_FriendlyName(&sFriendlyName));
127                                                        m_sFriendlyName = sFriendlyName;
128                                                }
129                                        }
130                                        _ATLCATCHALL()
131                                        {
132                                                _Z_EXCEPTION();
133                                        }
134                                        m_nFilterCount = 0;
135                                        m_sState.Empty();
136                                }
137                                return m_pFilterGraph;
138                        }
139                        BOOL Check()
140                        {
141                                _ATLTRY
142                                {
143                                        _FilterGraphHelper::CFilterArray FilterArray;
144                                        _FilterGraphHelper::GetGraphFilters(m_pFilterGraph, FilterArray);
145                                        m_nFilterCount = FilterArray.GetCount();
146                                        #pragma region IMediaControl
147                                        _ATLTRY
148                                        {
149                                                m_sState.Empty();
150                                                const CComQIPtr<IMediaControl> pMediaControl = m_pFilterGraph;
151                                                if(pMediaControl)
152                                                {
153                                                        OAFilterState State;
154                                                        if(SUCCEEDED(pMediaControl->GetState(0, &State)))
155                                                        {
156                                                                static LPCTSTR g_ppszStates[] = { _T("Stopped"), _T("Paused"), _T("Running") };
157                                                                if((SIZE_T) State < DIM(g_ppszStates))
158                                                                        m_sState = g_ppszStates[(SIZE_T) State];
159                                                        }
160                                                }
161                                        }
162                                        _ATLCATCHALL()
163                                        {
164                                                _Z_EXCEPTION();
165                                        }
166                                        #pragma endregion
167                                        #pragma region IMediaPosition
168                                        _ATLTRY
169                                        {
170                                                m_fDuration = 0;
171                                                m_fPosition = 0;
172                                                const CComQIPtr<IMediaPosition> pMediaPosition = m_pFilterGraph;
173                                                if(pMediaPosition)
174                                                        if(SUCCEEDED(pMediaPosition->get_Duration(&m_fDuration)))
175                                                                pMediaPosition->get_CurrentPosition(&m_fPosition);
176                                        }
177                                        _ATLCATCHALL()
178                                        {
179                                                _Z_EXCEPTION();
180                                        }
181                                        #pragma endregion
182                                        // SUGG: Source and Sink Paths
183                                }
184                                _ATLCATCHALL()
185                                {
186                                        _Z_EXCEPTION();
187                                        return FALSE;
188                                }
189                                return TRUE;
190                        }
191                };
192
193        private:
194                CFilterGraphListPropertySheet& m_PropertySheet;
195                CRoListViewT<CItem, CRoListControlDataTraitsT> m_GraphListView;
196                CButton m_RefreshButton;
197                CButton m_CheckButton;
198                CButton m_CopyToClipboardButton;
199                CButton m_PropertiesButton;
200                CComPtr<IRunningObjectTable> m_pRunningObjectTable;
201
202        public:
203        // CListPropertyPage
204                CListPropertyPage(CFilterGraphListPropertySheet* pPropertySheet) throw() :
205                        m_PropertySheet(*pPropertySheet)
206                {
207                }
208                VOID UpdateControls()
209                {
210                        const UINT nSelectedCount = m_GraphListView.GetSelectedCount();
211                        m_CheckButton.EnableWindow(nSelectedCount > 0);
212                        m_CopyToClipboardButton.EnableWindow(nSelectedCount > 0);
213                        m_PropertiesButton.EnableWindow(nSelectedCount == 1);
214                }
215                INT SortGraphListViewItems(LPARAM nItemParameter1, LPARAM nItemParameter2)
216                {
217                        const CItem& Item1 = m_GraphListView.DataFromParameter(nItemParameter1);
218                        const CItem& Item2 = m_GraphListView.DataFromParameter(nItemParameter2);
219                        const INT nTime = _tcscmp(Item1.m_sTime, Item2.m_sTime);
220                        if(nTime)
221                                return -nTime;
222                        const INT nProcess = (INT) (Item1.m_nProcessIdentifier, Item2.m_nProcessIdentifier);
223                        if(nProcess)
224                                return -nProcess;
225                        return wcscmp(Item1.m_sDisplayName, Item2.m_sDisplayName);
226                }
227                static int CALLBACK SortGraphListViewItems(LPARAM nItemParameter1, LPARAM nItemParameter2, LPARAM nParameter)
228                {
229                        return ((CListPropertyPage*) nParameter)->SortGraphListViewItems(nItemParameter1, nItemParameter2);
230                }
231                VOID Refresh()
232                {
233                        CRoMapT<CStringW, CItem> ItemMap;
234                        #pragma region Enumerate
235                        _ATLTRY
236                        {
237                                if(!m_pRunningObjectTable)
238                                        __C(GetRunningObjectTable(0, &m_pRunningObjectTable));
239                                CComPtr<IEnumMoniker> pEnumMoniker;
240                                __C(m_pRunningObjectTable->EnumRunning(&pEnumMoniker));
241                                CComPtr<IMalloc> pMalloc;
242                                __C(CoGetMalloc(1, &pMalloc));
243                                CComPtr<IMoniker> pMoniker;
244                                while(pEnumMoniker->Next(1, &pMoniker, NULL) == S_OK)
245                                {
246                                        _ATLTRY
247                                        {
248                                                CComPtr<IBindCtx> pBindCtx;
249                                                __C(CreateBindCtx(0, &pBindCtx));
250                                                LPOLESTR pszDisplayName = NULL;
251                                                __C(pMoniker->GetDisplayName(pBindCtx, NULL, &pszDisplayName));
252                                                const CStringW sDisplayName = pszDisplayName;
253                                                _Z4(atlTraceGeneral, 4, _T("sDisplayName %ls\n"), sDisplayName);
254                                                pMalloc->Free(pszDisplayName);
255                                                static CRoStaticReW g_Expression(L"^\\!FilterGraph {[0-9A-F]+} pid {[0-9A-F]+}(; process\\: {.+?}, time\\: {[0-9]+\\-[0-9]+\\-[0-9]+})?", FALSE);
256                                                CRoReMatchContext MatchContext;
257                                                if(g_Expression.Match(sDisplayName, &MatchContext))
258                                                {
259                                                        CItem Item;
260                                                        Item.m_pMoniker = pMoniker;
261                                                        Item.m_sDisplayName = sDisplayName;
262                                                        _W(StrToInt64ExW(CStringW(L"0x") + MatchContext.GetMatchString(0), STIF_SUPPORT_HEX, &reinterpret_cast<LONGLONG&>(Item.m_nInstance)));
263                                                        _W(StrToIntExW(CStringW(L"0x") + MatchContext.GetMatchString(1), STIF_SUPPORT_HEX, &reinterpret_cast<INT&>(Item.m_nProcessIdentifier)));
264                                                        Item.m_sTime = CString(MatchContext.GetMatchString(3));
265                                                        Item.m_sTime.Replace(_T("-"), _T(":"));
266                                                        _W(ItemMap.SetAt(sDisplayName, Item) >= 0);
267                                                }
268                                        }
269                                        _ATLCATCHALL()
270                                        {
271                                                _Z_EXCEPTION();
272                                        }
273                                        pMoniker.Release();
274                                }
275                        }
276                        _ATLCATCHALL()
277                        {
278                                _Z_EXCEPTION();
279                        }
280                        #pragma endregion
281                        CWindowRedraw GraphListViewRedraw(m_GraphListView);
282                        BOOL bSortNeeded = FALSE;
283                        #pragma region Remove
284                        for(INT nItem = m_GraphListView.GetItemCount() - 1; nItem >= 0; nItem--)
285                        {
286                                const POSITION Position = ItemMap.Lookup(m_GraphListView.GetItemData(nItem).m_sDisplayName);
287                                if(Position)
288                                        ItemMap.RemoveAtPos(Position);
289                                else
290                                        _W(m_GraphListView.DeleteItem(nItem));
291                        }
292                        #pragma endregion
293                        #pragma region Add
294                        INT nItemIndex = m_GraphListView.GetItemCount();
295                        for(POSITION Position = ItemMap.GetStartPosition(); Position; ItemMap.GetNext(Position))
296                        {
297                                CItem& Item = ItemMap.GetValueAt(Position);
298                                _ATLTRY
299                                {
300                                        CHandle Process;
301                                        //Process.Attach(OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, Item.m_nProcessIdentifier));
302                                        Process.Attach(OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, Item.m_nProcessIdentifier));
303                                        __E(Process);
304                                        TCHAR pszPath[MAX_PATH] = { 0 };
305                                        //_W(GetProcessImageFileName(Process, pszPath, DIM(pszPath)));
306                                        _W(GetModuleFileNameEx(Process, NULL, pszPath, DIM(pszPath)));
307                                        Item.m_sProcessImagePath = pszPath;
308                                }
309                                _ATLCATCHALL()
310                                {
311                                        _Z_EXCEPTION();
312                                }
313                                const INT nItem = m_GraphListView.InsertItem(nItemIndex++, Item);
314                                _A(nItem >= 0);
315                                bSortNeeded = TRUE;
316                        }
317                        #pragma endregion
318                        if(bSortNeeded)
319                                m_GraphListView.SortItems(&CListPropertyPage::SortGraphListViewItems, (LPARAM) this);
320                }
321                CString GetText()
322                {
323                        CRoArrayT<CString> GraphArray;
324                        for(INT nItem = m_GraphListView.GetNextItem(-1, LVNI_SELECTED); nItem >= 0; nItem = m_GraphListView.GetNextItem(nItem, LVNI_SELECTED))
325                        {
326                                CItem& Item = m_GraphListView.GetItemData(nItem);
327                                _ATLTRY
328                                {
329                                        if(Item.FilterGraphNeeded(m_pRunningObjectTable))
330                                        {
331                                                Item.Check();
332                                                m_GraphListView.RedrawItems(nItem, nItem);
333                                                CFilterGraphHelper::CProcessData ProcessData;
334                                                ProcessData.m_sDisplayName = Item.m_sDisplayName;
335                                                ProcessData.m_nIdentifier = Item.m_nProcessIdentifier;
336                                                ProcessData.m_sImagePath = Item.m_sProcessImagePath;
337                                                GraphArray.Add(CFilterGraphHelper::GetText(Item.m_pFilterGraph, &ProcessData));
338                                        }
339                                }
340                                _ATLCATCHALL()
341                                {
342                                        _Z_EXCEPTION();
343                                }
344                        }
345                        return _StringHelper::Join(GraphArray, _T("\r\n") _T("---") _T("\r\n") _T("\r\n"));
346                }
347
348        // Window Message Handler
349                LRESULT OnInitDialog(HWND, LPARAM)
350                {
351                        _ATLTRY
352                        {
353                                CWaitCursor WaitCursor;
354                                m_GraphListView.Initialize(GetDlgItem(IDC_FILTERGRAPHLIST_LIST_GRAPH));
355                                CToolTipCtrl ToolTip = m_GraphListView.GetToolTips();
356                                ToolTip.SetDelayTime(TTDT_AUTOPOP, 30 * 1000); // 30 seconds
357                                ToolTip.SetMaxTipWidth(max(GetSystemMetrics(SM_CXSCREEN) * 5 / 8, 600));
358                                m_RefreshButton = GetDlgItem(IDC_FILTERGRAPHLIST_LIST_REFRESH);
359                                m_CheckButton = GetDlgItem(IDC_FILTERGRAPHLIST_LIST_CHECK);
360                                m_CopyToClipboardButton = GetDlgItem(IDC_FILTERGRAPHLIST_LIST_COPYTOCLIPBOARD);
361                                m_PropertiesButton = GetDlgItem(IDC_FILTERGRAPHLIST_LIST_PROPERTIES);
362                                DlgResize_Init(FALSE, FALSE);
363                                Refresh();
364                                #if _DEVELOPMENT
365                                        m_GraphListView.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
366                                #endif // _DEVELOPMENT
367                                UpdateControls();
368                                #pragma region Default Property Sheet Size
369                                CRect Position;
370                                _W(m_PropertySheet.GetWindowRect(Position));
371                                Position.InflateRect(6 * Position.Width() / 8, 1 * Position.Height() / 8);
372                                CSize ScreenExtent(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
373                                ScreenExtent.cx -= ScreenExtent.cx / 8;
374                                ScreenExtent.cy -= ScreenExtent.cy / 8;
375                                if(Position.Width() > ScreenExtent.cx)
376                                        Position.right = Position.left + ScreenExtent.cx;
377                                if(Position.Height() > ScreenExtent.cy)
378                                        Position.bottom = Position.top + ScreenExtent.cy;
379                                _W(m_PropertySheet.MoveWindow(Position));
380                                _W(m_PropertySheet.CenterWindow());
381                                #pragma endregion
382                                CancelToClose();
383                        }
384                        _ATLCATCHALL()
385                        {
386                                for(CWindow Window = GetWindow(GW_CHILD); Window.IsWindow(); Window = Window.GetWindow(GW_HWNDNEXT))
387                                        Window.EnableWindow(FALSE);
388                                _ATLRETHROW;
389                        }
390                        return TRUE;
391                }
392                LRESULT OnDestroy()
393                {
394                        return 0;
395                }
396                LRESULT OnTranslateAccelerator(MSG* pMessage)
397                {
398                        return TranslateAccelerator(m_hWnd, m_hAccelerators, pMessage) ? PSNRET_MESSAGEHANDLED : PSNRET_NOERROR;
399                }
400                LRESULT OnGraphListViewGetDispInfo(NMLVDISPINFO* pHeader)
401                {
402                        const CItem& Item = m_GraphListView.DataFromParameter(pHeader->item.lParam);
403                        if(pHeader->item.mask & LVIF_TEXT)
404                        {
405                                CString& sTextBuffer = m_GraphListView.GetTextBufferString(TRUE);
406                                switch(pHeader->item.iSubItem)
407                                {
408                                case 1: // Process Name
409                                        sTextBuffer = PathFindFileName(Item.m_sProcessImagePath);
410                                        break;
411                                case 2: // Creation Time
412                                        sTextBuffer = Item.m_sTime;
413                                        break;
414                                case 3: // Friendly Name
415                                        sTextBuffer = CString(Item.m_sFriendlyName);
416                                        break;
417                                case 4: // Filter Count
418                                        if(Item.m_pFilterGraph)
419                                                sTextBuffer = AtlFormatString(_T("%d"), Item.m_nFilterCount);
420                                        break;
421                                case 5: // State
422                                        if(Item.m_pFilterGraph)
423                                                sTextBuffer = Item.m_sState;
424                                        break;
425                                case 6: // Process Image Directory
426                                        sTextBuffer = (LPCTSTR) GetPathDirectory(Item.m_sProcessImagePath);
427                                        break;
428                                default: // Process, Instance
429                                        sTextBuffer = AtlFormatString(_T("%d - 0x%p"), Item.m_nProcessIdentifier, Item.m_nInstance);
430                                }
431                                pHeader->item.pszText = m_GraphListView.GetTextBuffer();
432                        }
433                        return 0;
434                }
435                LRESULT OnGraphListViewGetInfoTip(NMLVGETINFOTIP* pHeader)
436                {
437                        const CItem& Item = m_GraphListView.GetItemData(pHeader->iItem);
438                        CString& sTextBuffer = m_GraphListView.GetTextBufferString(TRUE);
439                        sTextBuffer.AppendFormat(_T("Process: %d (0x%X) %s\r\n"), Item.m_nProcessIdentifier, Item.m_nProcessIdentifier, CString(FindFileName(Item.m_sProcessImagePath)));
440                        if(!Item.m_sTime.IsEmpty())
441                                sTextBuffer.AppendFormat(_T("Creation Time: %s\r\n"), Item.m_sTime);
442                        if(!Item.m_sFriendlyName.IsEmpty())
443                                sTextBuffer.AppendFormat(_T("Friendly Name: %ls\r\n"), Item.m_sFriendlyName);
444                        if(Item.m_pFilterGraph)
445                        {
446                                sTextBuffer.AppendFormat(_T("Filter Count: %d\r\n"), Item.m_nFilterCount);
447                                if(!Item.m_sState.IsEmpty())
448                                        sTextBuffer.AppendFormat(_T("State: %s\r\n"), Item.m_sState);
449                                if(Item.m_fDuration > 0)
450                                {
451                                        sTextBuffer.AppendFormat(_T("Duration: %s seconds\r\n"), _StringHelper::FormatNumber(Item.m_fDuration, 3));
452                                        sTextBuffer.AppendFormat(_T("Position: %s seconds\r\n"), _StringHelper::FormatNumber(Item.m_fPosition, 3));
453                                }
454                        }
455                        sTextBuffer.AppendFormat(_T("Display Name: %ls\r\n"), Item.m_sDisplayName);
456                        sTextBuffer.AppendFormat(_T("Instance: 0x%p\r\n"), Item.m_nInstance);
457                        const CString sDirectory = (LPCTSTR) GetPathDirectory(Item.m_sProcessImagePath);
458                        if(!sDirectory.IsEmpty())
459                                sTextBuffer.AppendFormat(_T("Process Directory: %s\r\n"), sDirectory);
460                        sTextBuffer.TrimRight(_T("\t\n\r ."));
461                        #pragma region Clipboard Copy
462                        if(GetKeyState(VK_CONTROL) < 0 && GetKeyState(VK_SHIFT) < 0)
463                                _ATLTRY
464                                {
465                                        SetClipboardText(m_hWnd, sTextBuffer);
466                                        MessageBeep(MB_OK);
467                                }
468                                _ATLCATCHALL()
469                                {
470                                        _Z_EXCEPTION();
471                                        MessageBeep(MB_ICONERROR);
472                                }
473                        #pragma endregion
474                        _tcsncpy_s(pHeader->pszText, pHeader->cchTextMax, m_GraphListView.GetTextBuffer(), _TRUNCATE);
475                        return 0;
476                }
477                LRESULT OnGraphListViewItemChanged(NMLISTVIEW* pHeader)
478                {
479                        UpdateControls();
480                        return 0;
481                }
482                LRESULT OnGraphListViewDblClk(NMITEMACTIVATE* pHeader)
483                {
484                        //m_CheckButton.Click();
485                        m_PropertiesButton.Click();
486                        return 0;
487                }
488                LRESULT OnContextMenu(CWindow Window, CPoint Position)
489                {
490                        if(Window == m_GraphListView)
491                        {
492                                CMenu ContainerMenu = AtlLoadMenu(IDD);
493                                CMenuHandle Menu = ContainerMenu.GetSubMenu(0);
494                                const UINT nCount = m_GraphListView.GetItemCount();
495                                const UINT nSelectedCount = m_GraphListView.GetSelectedCount();
496                                Menu.EnableMenuItem(IDC_FILTERGRAPHLIST_LIST_CHECK, MF_BYCOMMAND | (m_CheckButton.IsWindowEnabled() ? MF_ENABLED : MF_GRAYED | MF_DISABLED));
497                                Menu.EnableMenuItem(IDC_FILTERGRAPHLIST_LIST_CHECKALL, MF_BYCOMMAND | ((nCount > 0) ? MF_ENABLED : MF_GRAYED | MF_DISABLED));
498                                Menu.EnableMenuItem(IDC_FILTERGRAPHLIST_LIST_COPYTOCLIPBOARD, MF_BYCOMMAND | (m_CopyToClipboardButton.IsWindowEnabled() ? MF_ENABLED : MF_GRAYED | MF_DISABLED));
499                                Menu.EnableMenuItem(IDC_FILTERGRAPHLIST_LIST_OPENGSN, MF_BYCOMMAND | ((nSelectedCount == 1) ? MF_ENABLED : MF_GRAYED | MF_DISABLED));
500                                Menu.EnableMenuItem(IDC_FILTERGRAPHLIST_LIST_OPENGE, MF_BYCOMMAND | ((nSelectedCount == 1) ? MF_ENABLED : MF_GRAYED | MF_DISABLED));
501                                Menu.EnableMenuItem(IDC_FILTERGRAPHLIST_LIST_REFRESH, MF_BYCOMMAND | (m_RefreshButton.IsWindowEnabled() ? MF_ENABLED : MF_GRAYED | MF_DISABLED));
502                                Menu.EnableMenuItem(IDC_FILTERGRAPHLIST_LIST_PROPERTIES, MF_BYCOMMAND | (m_PropertiesButton.IsWindowEnabled() ? MF_ENABLED : MF_GRAYED | MF_DISABLED));
503                                Menu.SetMenuDefaultItem(IDC_FILTERGRAPHLIST_LIST_PROPERTIES);
504                                Menu.TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_TOPALIGN, Position.x, Position.y, m_hWnd); 
505                        }
506                        return 0;
507                }
508                LRESULT OnRefresh(UINT, INT, HWND)
509                {
510                        CWaitCursor WaitCursor;
511                        Refresh();
512                        UpdateControls();
513                        return 0;
514                }
515                LRESULT OnCheck(UINT, INT, HWND)
516                {
517                        CWaitCursor WaitCursor;
518                        for(INT nItem = m_GraphListView.GetNextItem(-1, LVNI_SELECTED); nItem >= 0; nItem = m_GraphListView.GetNextItem(nItem, LVNI_SELECTED))
519                        {
520                                CItem& Item = m_GraphListView.GetItemData(nItem);
521                                if(Item.FilterGraphNeeded(m_pRunningObjectTable))
522                                        if(Item.Check())
523                                                m_GraphListView.RedrawItems(nItem, nItem);
524                        }
525                        return 0;
526                }
527                LRESULT OnCheckAll(UINT, INT, HWND)
528                {
529                        CWaitCursor WaitCursor;
530                        for(INT nItem = m_GraphListView.GetItemCount() - 1; nItem >= 0; nItem--)
531                        {
532                                CItem& Item = m_GraphListView.GetItemData(nItem);
533                                if(Item.FilterGraphNeeded(m_pRunningObjectTable))
534                                        if(Item.Check())
535                                                m_GraphListView.RedrawItems(nItem, nItem);
536                        }
537                        return 0;
538                }
539                LRESULT OnCopyToClipboard(UINT, INT, HWND)
540                {
541                        CWaitCursor WaitCursor;
542                        const CString sText = GetText();
543                        if(sText.IsEmpty())
544                                return 0;
545                        SetClipboardText(m_hWnd, sText);
546                        MessageBeep(MB_OK);
547                        return 0;
548                }
549                LRESULT OnProperties(UINT, INT, HWND)
550                {
551                        const INT nItem = m_GraphListView.GetNextItem(-1, LVNI_SELECTED);
552                        if(nItem < 0)
553                                return 0;
554                        CItem& Item = m_GraphListView.GetItemData(nItem);
555                        if(!Item.FilterGraphNeeded(m_pRunningObjectTable))
556                                return 0;
557                        Item.Check();
558                        CLocalObjectPtr<CFilterGraphHelper> pFilterGraphHelper;
559                        pFilterGraphHelper->SetFilterGraph(Item.m_pFilterGraph);
560                        _V(pFilterGraphHelper->DoPropertyFrameModal((LONG) (LONG_PTR) m_hWnd));
561                        return 0;
562                }
563                LRESULT OnOpenGsn(UINT, INT, HWND)
564                {
565                        const INT nItem = m_GraphListView.GetNextItem(-1, LVNI_SELECTED);
566                        if(nItem < 0)
567                                return 0;
568                        CItem& Item = m_GraphListView.GetItemData(nItem);
569                        if(!Item.FilterGraphNeeded(m_pRunningObjectTable))
570                                return 0;
571                        CFilterGraphHelper::OpenMonikerWithGsn(Item.m_sDisplayName, m_hWnd);
572                        return 0;
573                }
574                LRESULT OnOpenGe(UINT, INT, HWND)
575                {
576                        const INT nItem = m_GraphListView.GetNextItem(-1, LVNI_SELECTED);
577                        if(nItem < 0)
578                                return 0;
579                        CItem& Item = m_GraphListView.GetItemData(nItem);
580                        if(!Item.FilterGraphNeeded(m_pRunningObjectTable))
581                                return 0;
582                        CFilterGraphHelper::OpenMonikerWithGe(Item.m_sDisplayName, m_hWnd);
583                        return 0;
584                }
585        };
586
587private:
588        CListPropertyPage m_ListPropertyPage;
589
590public:
591// CFilterGraphListPropertySheet
592        CFilterGraphListPropertySheet() :
593                CSizablePropertySheetT<CFilterGraphListPropertySheet>(IDS_FILTERGRAPHLIST_LIST_PROPERTYSHEETCAPTION),
594                m_ListPropertyPage(this)
595        {
596                AddPage(m_ListPropertyPage);
597        }
598        BOOL SetInitialPosition()
599        {
600                if(!__super::SetInitialPosition())
601                        return FALSE;
602                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)), TRUE);
603                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)), FALSE);
604                #pragma region Bitness Indication
605                CString sCaption;
606                _W(GetWindowText(sCaption));
607                #if defined(_WIN64)
608                        sCaption.Append(_T(" (64-bit)"));
609                #else
610                        if(SafeIsWow64Process())
611                                sCaption.Append(_T(" (32-bit)"));
612                #endif // defined(_WIN64)
613                _W(SetWindowText(sCaption));
614                #pragma endregion
615                #pragma region System Menu
616                CMenuHandle Menu = GetSystemMenu(FALSE);
617                _W(Menu.AppendMenu(MF_SEPARATOR));
618                _W(Menu.AppendMenu(MF_STRING, ID_APP_ABOUT, _T("&About...")));
619                #pragma endregion
620                return TRUE;
621        }
622        INT_PTR DoModal(HWND hParentWindow)
623        {
624                return CPropertySheetWithAccelerators::DoModal(hParentWindow);
625        }
626
627// Window message handelrs
628        LRESULT OnSysCommand(UINT nCommand, CPoint)
629        {
630                switch(nCommand)
631                {
632                case ID_APP_ABOUT:
633                        {
634                                CAboutDialog Dialog;
635                                Dialog.DoModal(m_hWnd);
636                        }
637                        break;
638                default:
639                        SetMsgHandled(FALSE);
640                }
641                return 0;
642        }
643};
644
645inline INT_PTR DoFilterGraphListPropertySheetModal(HWND hParentWindow)
646{
647        CFilterGraphListPropertySheet PropertySheet;
648        return PropertySheet.DoModal(hParentWindow);
649}
Note: See TracBrowser for help on using the repository browser.