Public Types | Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes

FindProgramDlg Struct Reference

Dialog to work with the complete list of start menu entries. More...

#include <searchprogram.h>

Inheritance diagram for FindProgramDlg:
Inheritance graph
[legend]
Collaboration diagram for FindProgramDlg:
Collaboration graph
[legend]

List of all members.

Public Types

typedef ResizeController< Dialogsuper

Public Member Functions

 FindProgramDlg (HWND hwnd)
 ~FindProgramDlg ()

Protected Member Functions

virtual LRESULT WndProc (UINT, WPARAM, LPARAM)
virtual int Command (int id, int code)
virtual int Notify (int id, NMHDR *pnmh)
void Refresh (bool delete_cache=false)
void add_entry (const FPDEntry &cache_entry)
void LaunchSelected ()
void CheckEntries ()

Static Protected Member Functions

static void collect_programs_callback (Entry *entry, void *param)
static int CALLBACK CompareFunc (LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort)

Protected Attributes

HWND _list_ctrl
HACCEL _haccel
String _lwr_filter
CollectProgramsThread _thread
FPDCache _cache
String _common_programs
String _user_programs
ListSort _sort

Detailed Description

Dialog to work with the complete list of start menu entries.

Definition at line 78 of file searchprogram.h.


Member Typedef Documentation

Reimplemented from ResizeController< Dialog >.

Definition at line 80 of file searchprogram.h.


Constructor & Destructor Documentation

FindProgramDlg::FindProgramDlg ( HWND  hwnd )

Definition at line 90 of file searchprogram.cpp.

References _common_programs, _haccel, ExplorerGlobals::_hInstance, ExplorerGlobals::_icon_cache, _list_ctrl, ResizeController< Dialog >::_resize_mgr, _user_programs, ResizeManager::Add(), CenterWindow(), g_Globals, IconCache::get_sys_imagelist(), IDA_SEARCH_PROGRAM, IDC_CHECK_ENTRIES, IDC_FILTER, IDC_PROGRAMS_FOUND, IDI_SEARCH, IDS_MENUCOLUMN, IDS_NAMECOLUMN, IDS_PATHCOLUMN, MOVE_X, Refresh(), Window::register_pretranslate(), ResizeManager::Resize(), RESIZE, RESIZE_X, and SetWindowIcon().

 :  super(hwnd),
    _list_ctrl(GetDlgItem(hwnd, IDC_PROGRAMS_FOUND)),
    _thread(collect_programs_callback, hwnd, this),
    _sort(_list_ctrl, CompareFunc/*, (LPARAM)this*/)
{
    TCHAR szTemp[256];
    const size_t nChars = sizeof(szTemp)/sizeof(*szTemp);
    SetWindowIcon(hwnd, IDI_SEARCH);

    _resize_mgr.Add(IDC_FILTER,         RESIZE_X);
    _resize_mgr.Add(IDC_CHECK_ENTRIES,  MOVE_X);
    _resize_mgr.Add(IDC_PROGRAMS_FOUND, RESIZE);

    _resize_mgr.Resize(+520, +300);

    _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_SEARCH_PROGRAM));

    (void)ListView_SetImageList(_list_ctrl, g_Globals._icon_cache.get_sys_imagelist(), LVSIL_SMALL);

    LV_COLUMN column = {LVCF_FMT|LVCF_WIDTH|LVCF_TEXT, LVCFMT_LEFT, 250};

    LoadString(g_Globals._hInstance, IDS_NAMECOLUMN, szTemp, nChars);
    column.pszText = szTemp;
    ListView_InsertColumn(_list_ctrl, 0, &column);

    column.cx = 300;
    LoadString(g_Globals._hInstance, IDS_PATHCOLUMN, szTemp, nChars);
    column.pszText = szTemp;
    ListView_InsertColumn(_list_ctrl, 1, &column);

    column.cx = 400;
    LoadString(g_Globals._hInstance, IDS_MENUCOLUMN, szTemp, nChars);
    column.pszText = szTemp;
    ListView_InsertColumn(_list_ctrl, 2, &column);

    ListView_SetExtendedListViewStyleEx(_list_ctrl, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

    _common_programs = SpecialFolderFSPath(CSIDL_COMMON_PROGRAMS, hwnd);
    if (!_common_programs.empty())
        _common_programs.append(_T("\\"));

    _user_programs = SpecialFolderFSPath(CSIDL_PROGRAMS, hwnd);
    if (!_user_programs.empty())
        _user_programs.append(_T("\\"));

    CenterWindow(hwnd);

    Refresh();

    register_pretranslate(hwnd);
}

Here is the call graph for this function:

FindProgramDlg::~FindProgramDlg (  )

Definition at line 143 of file searchprogram.cpp.

References WindowHandle::_hwnd, _thread, Thread::Stop(), and Window::unregister_pretranslate().

Here is the call graph for this function:


Member Function Documentation

void FindProgramDlg::add_entry ( const FPDEntry cache_entry ) [protected]

Definition at line 231 of file searchprogram.cpp.

References Entry::_display_name, FPDEntry::_entry, FPDEntry::_idxIcon, _list_ctrl, _lwr_filter, FPDEntry::_menu_path, FPDEntry::_path, _tcsstr, and String::toLower().

Referenced by collect_programs_callback(), and Refresh().

{
    String lwr_path = cache_entry._path;
    String lwr_name = cache_entry._entry->_display_name;

    lwr_path.toLower();
    lwr_name.toLower();

    if (_lwr_filter.empty())
        if (_tcsstr(lwr_name, _T("uninstal")) || _tcsstr(lwr_name, _T("deinstal"))) // filter out deinstallation links
            return;

    if (!_tcsstr(lwr_path, _lwr_filter) && !_tcsstr(lwr_name, _lwr_filter))
        return;

    LV_ITEM item = {LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM, INT_MAX};

    item.pszText = cache_entry._entry->_display_name;
    item.iImage = cache_entry._idxIcon;
    item.lParam = (LPARAM) &cache_entry;
    item.iItem = ListView_InsertItem(_list_ctrl, &item);    // We could use the information in _sort to enable manual sorting while populating the list.

    item.mask = LVIF_TEXT;

    item.iSubItem = 1;
    item.pszText = (LPTSTR)(LPCTSTR)cache_entry._path;
    ListView_SetItem(_list_ctrl, &item);

    item.iSubItem = 2;
    item.pszText = (LPTSTR)(LPCTSTR)cache_entry._menu_path;
    ListView_SetItem(_list_ctrl, &item);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void FindProgramDlg::CheckEntries (  ) [protected]

Todo:
check all entries for existing targets, display a list of not working entries and ask the user for permission to delete them

Definition at line 420 of file searchprogram.cpp.

Referenced by Command().

{
    ///@todo check all entries for existing targets, display a list of not working entries and ask the user for permission to delete them
}

Here is the caller graph for this function:

void FindProgramDlg::collect_programs_callback ( Entry entry,
void *  param 
) [static, protected]

Definition at line 175 of file searchprogram.cpp.

References _cache, _common_programs, Thread::_crit_sect, FPDEntry::_entry, WindowHandle::_hwnd, FPDEntry::_idxIcon, FPDEntry::_menu_path, FPDEntry::_path, _tcsnicmp, _thread, _user_programs, add_entry(), COUNTOF, Entry::get_path(), Entry::GetUIObjectOf(), IDS_ALL_USERS, and Thread::is_alive().

{
    FindProgramDlg* pThis = (FindProgramDlg*) param;

    IShellLink* pShellLink;
    HRESULT hr = entry->GetUIObjectOf(pThis->_hwnd, IID_IShellLink, (LPVOID*)&pShellLink);

    if (SUCCEEDED(hr)) {
        ShellLinkPtr shell_link(pShellLink);

        shell_link->Release();

        /*hr = pShellLink->Resolve(pThis->_hwnd, SLR_NO_UI);
        if (SUCCEEDED(hr))*/ {
            WIN32_FIND_DATA wfd;
            TCHAR path[MAX_PATH];

            hr = pShellLink->GetPath(path, COUNTOF(path)-1, &wfd, SLGP_UNCPRIORITY);

            if (SUCCEEDED(hr)) {
                TCHAR entry_path[MAX_PATH];

                entry->get_path(entry_path, COUNTOF(entry_path));

                String menu_path;

                int len = pThis->_common_programs.size();

                if (len && !_tcsnicmp(entry_path, pThis->_common_programs, len))
                    menu_path = ResString(IDS_ALL_USERS) + (String(entry_path)+len);
                else if ((len=pThis->_user_programs.size()) && !_tcsnicmp(entry_path, pThis->_user_programs, len))
                    menu_path = String(entry_path)+len;

                 // store info in cache
                FPDEntry new_entry;

                new_entry._entry = entry;
                new_entry._menu_path = menu_path;
                new_entry._path = path;
                new_entry._idxIcon = I_IMAGECALLBACK;

                pThis->_cache.push_front(new_entry);
                FPDEntry& cache_entry = pThis->_cache.front();

                Lock lock(pThis->_thread._crit_sect);

                 // resolve deadlocks while executing Thread::Stop()
                if (!pThis->_thread.is_alive())
                    return;

                pThis->add_entry(cache_entry);
            }
        }
    }
}

Here is the call graph for this function:

int FindProgramDlg::Command ( int  id,
int  code 
) [protected, virtual]

Reimplemented from Dialog.

Definition at line 286 of file searchprogram.cpp.

References CheckEntries(), Dialog::Command(), ID_REFRESH, IDC_CHECK_ENTRIES, IDC_FILTER, LaunchSelected(), and Refresh().

{
    if (code == BN_CLICKED) {
        switch(id) {
          case ID_REFRESH:
            Refresh(true);
            break;

          case IDOK:
            LaunchSelected();
            break;

          case IDC_CHECK_ENTRIES:
            CheckEntries();
            break;

          default:
            return super::Command(id, code);
        }

        return 0;
    }
    else if (code == EN_CHANGE) {
        switch(id) {
          case IDC_FILTER:
            Refresh();
            break;
        }

        return 0;
    }

    return 1;
}

Here is the call graph for this function:

int CALLBACK FindProgramDlg::CompareFunc ( LPARAM  lparam1,
LPARAM  lparam2,
LPARAM  lparamSort 
) [static, protected]

Definition at line 395 of file searchprogram.cpp.

References ListSort::_direction, Entry::_display_name, FPDEntry::_entry, FPDEntry::_menu_path, FPDEntry::_path, and ListSort::_sort_crit.

{
    ListSort* sort = (ListSort*)lparamSort;

    FPDEntry& a = *(FPDEntry*)lparam1;
    FPDEntry& b = *(FPDEntry*)lparam2;

    int cmp = 0;

    switch(sort->_sort_crit) {
      case 0:
        cmp = _tcsicoll(a._entry->_display_name, b._entry->_display_name);
        break;

      case 1:
        cmp = _tcsicoll(a._path, b._path);
        break;

      case 2:
        cmp = _tcsicoll(a._menu_path, b._menu_path);
    }

    return sort->_direction? -cmp: cmp;
}
void FindProgramDlg::LaunchSelected (  ) [protected]

Definition at line 321 of file searchprogram.cpp.

References Thread::_crit_sect, FPDEntry::_entry, WindowHandle::_hwnd, _list_ctrl, _thread, IDS_LAUNCH_MANY_PROGRAMS, IDS_TITLE, Entry::launch_entry(), and ListView_GetItemData().

Referenced by Command(), and Notify().

{
    Lock lock(_thread._crit_sect);

    int count = ListView_GetSelectedCount(_list_ctrl);

    if (count > 1)
        if (MessageBox(_hwnd, ResString(IDS_LAUNCH_MANY_PROGRAMS), ResString(IDS_TITLE), MB_OKCANCEL) != IDOK)
            return;

    for(int idx=-1; (idx=ListView_GetNextItem(_list_ctrl, idx, LVNI_SELECTED))!=-1; ) {
        LPARAM lparam = ListView_GetItemData(_list_ctrl, idx);

        if (lparam) {
            FPDEntry& cache_entry = *(FPDEntry*)lparam;
            cache_entry._entry->launch_entry(_hwnd);
        }
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

int FindProgramDlg::Notify ( int  id,
NMHDR *  pnmh 
) [protected, virtual]

Reimplemented from Window.

Definition at line 341 of file searchprogram.cpp.

References CollectProgramsThread::_cache_valid, FPDEntry::_entry, ExplorerGlobals::_icon_cache, Entry::_icon_id, _list_ctrl, _sort, _thread, g_Globals, IconCache::get_icon(), Icon::get_sysiml_idx(), ICF_SYSCACHE, ICID_UNKNOWN, LaunchSelected(), ListSort::sort(), and ListSort::toggle_sort().

{
    switch(pnmh->code) {
      case LVN_GETDISPINFO: {
        LV_DISPINFO* pDispInfo = (LV_DISPINFO*) pnmh;

        if (pnmh->hwndFrom == _list_ctrl) {
            if (pDispInfo->item.mask & LVIF_IMAGE) {
                FPDEntry& cache_entry = *(FPDEntry*)pDispInfo->item.lParam;
                Entry* entry = cache_entry._entry;

                if (entry->_icon_id == ICID_UNKNOWN)
                    entry->_icon_id = entry->extract_icon(ICF_SYSCACHE);

                pDispInfo->item.iImage = g_Globals._icon_cache.get_icon(entry->_icon_id).get_sysiml_idx();
                pDispInfo->item.mask |= LVIF_DI_SETITEM;

                return 1;
            }
        }}
        break;

      case NM_DBLCLK:
        if (pnmh->hwndFrom == _list_ctrl)
            LaunchSelected();
        /*{
            Lock lock(_thread._crit_sect);

            LPNMLISTVIEW pnmv = (LPNMLISTVIEW) pnmh;
            LPARAM lparam = ListView_GetItemData(pnmh->hwndFrom, pnmv->iItem);

            if (lparam) {
                FPDEntry& cache_entry = *(FPDEntry*)lparam;
                cache_entry._entry->launch_entry(_hwnd);
            }
        }*/
        break;

      case HDN_ITEMCLICK: {
        WaitCursor wait;
        NMHEADER* phdr = (NMHEADER*)pnmh;

        if (GetParent(pnmh->hwndFrom) == _list_ctrl) {
            if (_thread._cache_valid) { // disable manual sorting while populating the list
                _sort.toggle_sort(phdr->iItem);
                _sort.sort();
            }
        }
        break;}
    }

    return 0;
}

Here is the call graph for this function:

void FindProgramDlg::Refresh ( bool  delete_cache = false ) [protected]

Definition at line 151 of file searchprogram.cpp.

References _cache, CollectProgramsThread::_cache_valid, WindowHandle::_hwnd, _list_ctrl, _lwr_filter, _thread, add_entry(), COUNTOF, CollectProgramsThread::free_dirs(), IDC_FILTER, Thread::Start(), and Thread::Stop().

Referenced by Command(), and FindProgramDlg().

{
    WaitCursor wait;

    _thread.Stop();

    TCHAR buffer[1024];
    GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, COUNTOF(buffer));
    CharLower(buffer);
    _lwr_filter = buffer;

    HiddenWindow hide_listctrl(_list_ctrl);

    ListView_DeleteAllItems(_list_ctrl);

    if (delete_cache || !_thread._cache_valid) {
        _thread.free_dirs();
        _thread.Start();
    } else {
        for(FPDCache::const_iterator it=_cache.begin(); it!=_cache.end(); ++it)
            add_entry(*it);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

LRESULT FindProgramDlg::WndProc ( UINT  nmsg,
WPARAM  wparam,
LPARAM  lparam 
) [protected, virtual]

Reimplemented from ResizeController< Dialog >.

Definition at line 264 of file searchprogram.cpp.

References _haccel, WindowHandle::_hwnd, _list_ctrl, PM_TRANSLATE_MSG, and ResizeController< Dialog >::WndProc().

{
    switch(nmsg) {
      case WM_CLOSE:
        (void)ListView_SetImageList(_list_ctrl, 0, LVSIL_SMALL);    // detach system image list
        goto def;

      case PM_TRANSLATE_MSG: {
        MSG* pmsg = (MSG*) lparam;

        if (TranslateAccelerator(_hwnd, _haccel, pmsg))
            return TRUE;

        return FALSE;}

      default: def:
        return super::WndProc(nmsg, wparam, lparam);
    }

    return 0;
}

Here is the call graph for this function:


Member Data Documentation

Definition at line 91 of file searchprogram.h.

Referenced by collect_programs_callback(), and Refresh().

Definition at line 93 of file searchprogram.h.

Referenced by collect_programs_callback(), and FindProgramDlg().

HACCEL FindProgramDlg::_haccel [protected]

Definition at line 87 of file searchprogram.h.

Referenced by FindProgramDlg(), and WndProc().

Definition at line 86 of file searchprogram.h.

Referenced by add_entry(), FindProgramDlg(), LaunchSelected(), Notify(), Refresh(), and WndProc().

Definition at line 88 of file searchprogram.h.

Referenced by add_entry(), and Refresh().

Definition at line 95 of file searchprogram.h.

Referenced by Notify().

Definition at line 93 of file searchprogram.h.

Referenced by collect_programs_callback(), and FindProgramDlg().


The documentation for this struct was generated from the following files:

ROS Explorer Source Code Documentation
generated on 02.01.2013 by doxygen

ROS Explorer Homepage