PCUITEMID_CHILD *m_apidl;
PIDLIST_ABSOLUTE m_pidlParent;
LISTVIEW_SORT_INFO m_sortInfo;
- ULONG m_hNotify; /* change notification handle */
+ ULONG m_hNotify; /* Change notification handle */
HACCEL m_hAccel;
DWORD m_dwAspects;
DWORD m_dwAdvf;
CComPtr<IAdviseSink> m_pAdvSink;
// for drag and drop
- CComPtr<IDropTarget> m_pCurDropTarget; /* The sub-item, which is currently dragged over */
- CComPtr<IDataObject> m_pCurDataObject; /* The dragged data-object */
- LONG m_iDragOverItem; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
- UINT m_cScrollDelay; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
- POINT m_ptLastMousePos; /* Mouse position at last DragOver call */
+ CComPtr<IDataObject> m_pSourceDataObject;
+ CComPtr<IDropTarget> m_pCurDropTarget; /* The sub-item, which is currently dragged over */
+ CComPtr<IDataObject> m_pCurDataObject; /* The dragged data-object */
+ LONG m_iDragOverItem; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
+ UINT m_cScrollDelay; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
+ POINT m_ptLastMousePos; /* Mouse position at last DragOver call */
//
CComPtr<IContextMenu> m_pCM;
// *** IServiceProvider methods ***
virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
- // message handlers
+ // Message handlers
LRESULT OnShowWindow(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
{
static ATL::CWndClassInfo wc =
{
- { sizeof(WNDCLASSEX), 0, StartWindowProc,
+ { sizeof(WNDCLASSEX), CS_PARENTDC, StartWindowProc,
0, 0, NULL, NULL,
LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, SV_CLASS_NAME, NULL
},
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- CDefView *pThis;
- LRESULT result;
+ CDefView *pThis;
+ LRESULT result;
- // must hold a reference during message handling
+ // Must hold a reference during message handling
pThis = reinterpret_cast<CDefView *>(hWnd);
pThis->AddRef();
result = CWindowImpl<CDefView, CWindow, CControlWinTraits>::WindowProc(hWnd, uMsg, wParam, lParam);
#define ID_LISTVIEW 1
/*windowsx.h */
-#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
-#define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
-#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
+#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
+#define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
+#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
* - creates the list view window
*/
BOOL CDefView::CreateList()
-{ DWORD dwStyle, dwExStyle;
+{
+ DWORD dwStyle, dwExStyle;
TRACE("%p\n", this);
dwExStyle &= ~WS_EX_CLIENTEDGE;
RECT rcListView = {0,0,0,0};
- m_ListView.Create(m_hWnd, rcListView, NULL,dwStyle, dwExStyle, ID_LISTVIEW);
+ m_ListView.Create(m_hWnd, rcListView, L"FolderView", dwStyle, dwExStyle, ID_LISTVIEW);
if (!m_ListView)
return FALSE;
/* Check if drop shadows option is enabled */
BOOL bDropShadow = FALSE;
DWORD cbDropShadow = sizeof(bDropShadow);
- WCHAR wszBuf[16] = L"";
+
+ /*
+ * The desktop ListView always take the default desktop colours, by
+ * remaining transparent and letting user32/win32k paint itself the
+ * desktop background color, if any.
+ */
+ m_ListView.SetBkColor(CLR_NONE);
RegGetValueW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
L"ListviewShadow", RRF_RT_DWORD, NULL, &bDropShadow, &cbDropShadow);
- if (bDropShadow && SystemParametersInfoW(SPI_GETDESKWALLPAPER, _countof(wszBuf), wszBuf, 0) && wszBuf[0])
+ if (bDropShadow)
{
+ /* Set the icon background transparent */
m_ListView.SetTextBkColor(CLR_NONE);
- m_ListView.SetBkColor(CLR_NONE);
m_ListView.SetTextColor(RGB(255, 255, 255));
m_ListView.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT, LVS_EX_TRANSPARENTSHADOWTEXT);
}
else
{
+ /* Set the icon background as the same colour as the desktop */
COLORREF crDesktop = GetSysColor(COLOR_DESKTOP);
m_ListView.SetTextBkColor(crDesktop);
- m_ListView.SetBkColor(crDesktop);
if (GetRValue(crDesktop) + GetGValue(crDesktop) + GetBValue(crDesktop) > 128 * 3)
m_ListView.SetTextColor(RGB(0, 0, 0));
else
m_ListView.SetTextColor(RGB(255, 255, 255));
- m_ListView.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT);
+ m_ListView.SetExtendedListViewStyle(0, LVS_EX_TRANSPARENTSHADOWTEXT);
}
}
}
*/
BOOL CDefView::InitList()
{
- SHELLDETAILS sd;
- WCHAR szTemp[50];
+ SHELLDETAILS sd;
+ WCHAR szTemp[50];
HIMAGELIST big_icons, small_icons;
TRACE("%p\n", this);
}
else
{
- FIXME("no SF2\n");
+ FIXME("no m_pSF2Parent\n");
}
Shell_GetImageLists(&big_icons, &small_icons);
*/
BOOLEAN CDefView::LV_AddItem(PCUITEMID_CHILD pidl)
{
- LVITEMW lvItem;
+ LVITEMW lvItem;
TRACE("(%p)(pidl=%p)\n", this, pidl);
nItem = LV_FindItemByPidl(pidl);
- if ( -1 != nItem )
+ if (-1 != nItem)
{
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = nItem;
* - sorts the list
* - fills the list into the view
*/
-INT CALLBACK CDefView::fill_list( LPVOID ptr, LPVOID arg )
+INT CALLBACK CDefView::fill_list(LPVOID ptr, LPVOID arg)
{
PITEMID_CHILD pidl = static_cast<PITEMID_CHILD>(ptr);
CDefView *pThis = static_cast<CDefView *>(arg);
DPA_DestroyCallback( hdpa, fill_list, this);
/* sort the array */
- m_pSF2Parent->GetDefaultColumn(NULL, (ULONG*)&m_sortInfo.nHeaderID, NULL);
+ if (m_pSF2Parent)
+ {
+ m_pSF2Parent->GetDefaultColumn(NULL, (ULONG*)&m_sortInfo.nHeaderID, NULL);
+ }
+ else
+ {
+ FIXME("no m_pSF2Parent\n");
+ }
m_sortInfo.bIsAscending = TRUE;
m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
m_ListView.SortItems(ListViewCompareItems, this);
*/
LRESULT CDefView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- CComPtr<IDropTarget> pdt;
- SHChangeNotifyEntry ntreg;
- CComPtr<IPersistFolder2> ppf2;
+ CComPtr<IDropTarget> pdt;
+ SHChangeNotifyEntry ntreg;
+ CComPtr<IPersistFolder2> ppf2;
TRACE("%p\n", this);
- if(CreateList())
+ if (CreateList())
{
- if(InitList())
+ if (InitList())
{
FillList();
}
HMENU hmenu = CreatePopupMenu();
- //FIXME: get proper numbers ?
+ // FIXME: get proper numbers ?
const UINT first = 0x7800;
const UINT last = 0x7A00;
hr = cm->QueryContextMenu(hmenu, 0, first, last, 0);
if (FAILED(hResult))
goto cleanup;
+ IUnknown_SetSite(m_pCM, (IShellView *)this);
+
hResult = m_pCM->QueryContextMenu(hMenu, 0, 0x20, 0x7fff, CMF_DEFAULTONLY);
if (FAILED(hResult))
goto cleanup;
DestroyMenu(hMenu);
if (m_pCM)
+ {
+ IUnknown_SetSite(m_pCM, NULL);
m_pCM.Release();
+ }
return hResult;
}
*/
LRESULT CDefView::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- WORD x;
- WORD y;
- UINT uCommand;
- HMENU hMenu;
- HRESULT hResult;
+ WORD x, y;
+ UINT uCommand;
+ HMENU hMenu;
+ HRESULT hResult;
// for some reason I haven't figured out, we sometimes recurse into this method
if (m_pCM != NULL)
if (FAILED( hResult))
goto cleanup;
+ IUnknown_SetSite(m_pCM, (IShellView *)this);
+
hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
if (FAILED( hResult))
goto cleanup;
cleanup:
if (m_pCM)
+ {
+ IUnknown_SetSite(m_pCM, NULL);
m_pCM.Release();
+ }
if (hMenu)
DestroyMenu(hMenu);
if (FAILED( hResult))
goto cleanup;
+ IUnknown_SetSite(m_pCM, (IShellView *)this);
+
hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
if (FAILED( hResult))
goto cleanup;
cleanup:
if (m_pCM)
+ {
+ IUnknown_SetSite(m_pCM, NULL);
m_pCM.Release();
+ }
if (hMenu)
DestroyMenu(hMenu);
*/
LRESULT CDefView::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- WORD wWidth;
- WORD wHeight;
+ WORD wWidth, wHeight;
- wWidth = LOWORD(lParam);
+ wWidth = LOWORD(lParam);
wHeight = HIWORD(lParam);
TRACE("%p width=%u height=%u\n", this, wWidth, wHeight);
- /*resize the ListView to fit our window*/
+ /* Resize the ListView to fit our window */
if (m_ListView)
{
::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE);
}
else
{
- if(m_hMenu)
+ if (m_hMenu)
{
if (!m_menusLoaded)
{
}
else
{
- FIXME("no SF2\n");
+ FIXME("no m_pSF2Parent\n");
}
}
if(lpdi->item.mask & LVIF_IMAGE) /* image requested */
}
DWORD dwEffect2;
+
+ m_pSourceDataObject = pda;
+
DoDragDrop(pda, this, dwEffect, &dwEffect2);
+
+ m_pSourceDataObject.Release();
}
}
break;
HRESULT WINAPI CDefView::UIActivate(UINT uState)
{
- /*
- CHAR szName[MAX_PATH];
- */
- LRESULT lResult;
- int nPartArray[1] = { -1};
+ // CHAR szName[MAX_PATH];
+ LRESULT lResult;
+ int nPartArray[1] = { -1};
TRACE("(%p)->(state=%x) stub\n", this, uState);
- /*don't do anything if the state isn't really changing*/
+ /* don't do anything if the state isn't really changing */
if (m_uState == uState)
{
return S_OK;
}
- /*OnActivate handles the menu merging and internal state*/
+ /* OnActivate handles the menu merging and internal state */
DoActivate(uState);
- /*only do This if we are active*/
+ /* only do This if we are active */
if (uState != SVUIA_DEACTIVATE)
{
HRESULT WINAPI CDefView::CreateViewWindow(IShellView *lpPrevView, LPCFOLDERSETTINGS lpfs, IShellBrowser *psb, RECT *prcView, HWND *phWnd)
{
- OLEMENUGROUPWIDTHS omw = { { 0, 0, 0, 0, 0, 0 } };
+ OLEMENUGROUPWIDTHS omw = { { 0, 0, 0, 0, 0, 0 } };
*phWnd = 0;
if (psb == NULL || m_hWnd)
return E_UNEXPECTED;
- /*set up the member variables*/
+ /* Set up the member variables */
m_pShellBrowser = psb;
m_FolderSettings = *lpfs;
- /*get our parent window*/
+ /* Get our parent window */
m_pShellBrowser->GetWindow(&m_hWndParent);
- /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
+ /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
m_pCommDlgBrowser = NULL;
if (SUCCEEDED(m_pShellBrowser->QueryInterface(IID_PPV_ARG(ICommDlgBrowser, &m_pCommDlgBrowser))))
{
TRACE("-- CommDlgBrowser\n");
}
- Create(m_hWndParent, prcView, NULL, WS_CHILD | WS_TABSTOP, 0, 0U);
+ Create(m_hWndParent, prcView, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP, 0, 0U);
if (m_hWnd == NULL)
return E_FAIL;
{
TRACE("(%p)\n", this);
- /*Make absolutely sure all our UI is cleaned up.*/
+ /* Make absolutely sure all our UI is cleaned up */
UIActivate(SVUIA_DEACTIVATE);
if (m_hAccel)
else if (IsEqualIID(riid, IID_IDispatch))
{
if (m_pShellFolderViewDual == NULL)
+ {
hr = CDefViewDual_Constructor(riid, (LPVOID*)&m_pShellFolderViewDual);
+ if (FAILED_UNEXPECTEDLY(hr))
+ {
+ return hr;
+ }
+ }
hr = m_pShellFolderViewDual->QueryInterface(riid, ppvOut);
}
break;
HRESULT WINAPI CDefView::Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
{
- if (m_pCurDropTarget)
+ ERR("GetKeyState(VK_LBUTTON): %d\n", GetKeyState(VK_LBUTTON));
+
+ if ((m_iDragOverItem == -1) &&
+ (*pdwEffect & DROPEFFECT_MOVE) &&
+ (GetKeyState(VK_LBUTTON) != 0) &&
+ (m_pSourceDataObject.p) &&
+ (SHIsSameObject(pDataObject, m_pSourceDataObject)))
+ {
+ ERR("Should implement moving items here!\n");
+
+ if (m_pCurDropTarget)
+ {
+ m_pCurDropTarget->DragLeave();
+ m_pCurDropTarget.Release();
+ }
+ }
+ else if (m_pCurDropTarget)
{
m_pCurDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect);
m_pCurDropTarget.Release();
HRESULT CDefView::_MergeToolbar()
{
- CComPtr<IExplorerToolbar> ptb; // [sp+8h] [bp-4h]@1
-
+ CComPtr<IExplorerToolbar> ptb;
HRESULT hr = S_OK;
hr = IUnknown_QueryService(m_pShellBrowser, IID_IExplorerToolbar, IID_PPV_ARG(IExplorerToolbar, &ptb));