Example #1
0
void SearchLocEditDlg::OnPathBrowse(void)
{
    xpr_tchar_t sPath[XPR_MAX_PATH + 1] = {0};
    GetDlgItemText(IDC_SEARCH_LOC_EDIT_PATH, sPath, XPR_MAX_PATH);

    if (_tcslen(sPath) == 2)
        _tcscat(sPath, XPR_STRING_LITERAL("\\"));

    LPITEMIDLIST sOldFullPidl = fxfile::base::Pidl::create(sPath);

    BROWSEINFO sBrowseInfo = {0};
    sBrowseInfo.hwndOwner = GetSafeHwnd();
    sBrowseInfo.ulFlags   = BIF_RETURNONLYFSDIRS;// | BIF_USENEWUI;
    sBrowseInfo.lpszTitle = gApp.loadString(XPR_STRING_LITERAL("popup.search_user_location_edit.exclude_path_browse.title"));
    sBrowseInfo.lpfn      = (BFFCALLBACK)BrowseCallbackProc;
    sBrowseInfo.lParam    = (LPARAM)sOldFullPidl;

    LPITEMIDLIST sFullPidl = ::SHBrowseForFolder(&sBrowseInfo);
    if (sFullPidl != XPR_NULL)
    {
        GetName(sFullPidl, SHGDN_FORPARSING, sPath);
        SetDlgItemText(IDC_SEARCH_LOC_EDIT_PATH, sPath);
    }

    COM_FREE(sFullPidl);
    COM_FREE(sOldFullPidl);
}
Example #2
0
void BookmarkToolBar::OnDropShortcut(STGMEDIUM *aStgMedium, xpr_sint_t aBookmark)
{
    if (aStgMedium == XPR_NULL)
        return;

    BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark);
    if (sBookmarkItem == XPR_NULL)
        return;

    LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal);
    if (sIda == XPR_NULL)
        return;

    LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath);
    if (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl) == XPR_TRUE)
    {
        xpr_sint_t sCount = sIda->cidl;
        LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL
        LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL
        LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL

        // get folder PIDL
        sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]);

        xpr_sint_t i;
        xpr_size_t sColon;
        xpr::string sDir;
        xpr::string sName;
        xpr::string sBookmarkPath;
        const xpr_tchar_t *sLinkSuffix = gApp.loadString(XPR_STRING_LITERAL("common.shortcut.suffix"));

        GetName(sFullPidl, SHGDN_FORPARSING, sDir);

        for (i = 0; i < sCount; ++i)
        {
            // get item PIDL and get full-qualified PIDL
            sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]);
            sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2);

            GetName(sFullPidl2, SHGDN_INFOLDER, sName);

            sColon = sName.find(XPR_STRING_LITERAL(':'));
            if (sColon != xpr::string::npos)
                sName.erase(sColon, 1);

            sName += sLinkSuffix;

            if (SetNewPath(sBookmarkPath, sDir, sName, XPR_STRING_LITERAL(".lnk")))
            {
                CreateShortcut(sBookmarkPath.c_str(), sFullPidl2);
            }

            COM_FREE(sFullPidl2);
        }
    }

    COM_FREE(sFullPidl);
    ::GlobalUnlock(aStgMedium->hGlobal);
}
Example #3
0
LPITEMIDLIST Pidl::create(const KNOWNFOLDERID &aKnownFolderId)
{
    HRESULT      sComResult;
    LPITEMIDLIST sFullPidl = XPR_NULL;

    HINSTANCE sDll = ::LoadLibrary(XPR_STRING_LITERAL("shell32.dll"));
    if (XPR_IS_NOT_NULL(sDll))
    {
        SHGetKnownFolderIDListFunc sSHGetKnownFolderIDListFunc = (SHGetKnownFolderIDListFunc)::GetProcAddress(sDll, (const xpr_char_t *)XPR_MBCS_STRING_LITERAL("SHGetKnownFolderIDList"));
        if (XPR_IS_NOT_NULL(sSHGetKnownFolderIDListFunc))
        {
            sComResult = sSHGetKnownFolderIDListFunc(aKnownFolderId, 0, XPR_NULL, &sFullPidl);
            if (FAILED(sComResult) || XPR_IS_NULL(sFullPidl))
            {
                XPR_ASSERT(sFullPidl == XPR_NULL);

                COM_FREE(sFullPidl);
            }
        }

        ::FreeLibrary(sDll);
    }

    return sFullPidl;
}
Example #4
0
xpr_sint_t Pidl::compare(LPCITEMIDLIST aPidl, xpr_sint_t aSpecialFolder)
{
    if (XPR_IS_NULL(aPidl))
    {
        return -1;
    }

    xpr_sint_t   sResult = 0;
    HRESULT      sComResult;
    LPITEMIDLIST sSpecialPidl = XPR_NULL;

    sComResult = ::SHGetSpecialFolderLocation(XPR_NULL, aSpecialFolder, &sSpecialPidl);
    if (FAILED(sComResult) || XPR_IS_NULL(sSpecialPidl))
    {
        sResult = -1;
    }
    else
    {
        if (Pidl::getSize(aPidl) != Pidl::getSize(sSpecialPidl))
        {
            sResult = -1;
        }
        else
        {
            sResult = memcmp(aPidl, sSpecialPidl, Pidl::getSize(aPidl));
        }
    }

    COM_FREE(sSpecialPidl);

    return sResult;
}
Example #5
0
LPITEMIDLIST Pidl::create(xpr_sint_t aSpecialFolder)
{
    HRESULT      sComResult;
    LPITEMIDLIST sFullPidl = XPR_NULL;

    sComResult = ::SHGetSpecialFolderLocation(XPR_NULL, aSpecialFolder, &sFullPidl);
    if (FAILED(sComResult) || XPR_IS_NULL(sFullPidl))
    {
        XPR_ASSERT(sFullPidl == XPR_NULL);

        COM_FREE(sFullPidl);
    }

    return sFullPidl;
}
Example #6
0
xpr_bool_t Pidl::getInfotip(LPSHELLFOLDER aShellFolder, LPCITEMIDLIST aPidl, xpr::string &aInfotip)
{
    xpr_bool_t  sResult    = XPR_FALSE;
    IQueryInfo *sQueryInfo = XPR_NULL;
    HRESULT     sComResult;

    sComResult = aShellFolder->GetUIObjectOf(
        XPR_NULL,
        1,
        (LPCITEMIDLIST *)&aPidl,
        IID_IQueryInfo,
        0,
        (LPVOID *)&sQueryInfo);

    if (SUCCEEDED(sComResult) && XPR_IS_NOT_NULL(sQueryInfo))
    {
        xpr_wchar_t *sWideInfotip = XPR_NULL;

        sComResult = sQueryInfo->GetInfoTip(SHGDN_INFOLDER, &sWideInfotip);
        if (SUCCEEDED(sComResult) && XPR_IS_NOT_NULL(sWideInfotip))
        {
            xpr_size_t sInfotipLen = wcslen(sWideInfotip);
            if (sInfotipLen != 0)
            {
                aInfotip.clear();
                aInfotip.reserve(sInfotipLen + 1);

                xpr_tchar_t *sInfotip = (xpr_tchar_t *)aInfotip.c_str();

                xpr_size_t sInputBytes = sInfotipLen * sizeof(xpr_wchar_t);
                xpr_size_t sOutputBytes = sInfotipLen * sizeof(xpr_tchar_t);
                XPR_UTF16_TO_TCS(sWideInfotip, &sInputBytes, sInfotip, &sOutputBytes);
                sInfotip[sOutputBytes / sizeof(xpr_tchar_t)] = 0;

                aInfotip.update();

                sResult = XPR_TRUE;
            }
        }

        COM_FREE(sWideInfotip);
    }

    COM_RELEASE(sQueryInfo);

    return sResult;
}
Example #7
0
void WnetMgr::getNetFullPath(xpr::string &aFullPath)
{
    aFullPath.clear();

    xpr::string sPath(XPR_STRING_LITERAL("\\\\127.0.0.1"));
    LPITEMIDLIST sFullPidl = fxfile::base::Pidl::create(sPath.c_str());
    if (XPR_IS_NOT_NULL(sFullPidl))
        return;

    GetDispFullPath(sFullPidl, aFullPath);

    xpr_size_t sFind = aFullPath.rfind(XPR_STRING_LITERAL('\\'));
    if (sFind != xpr::string::npos)
        aFullPath.erase(sFind);

    COM_FREE(sFullPidl);
}
Example #8
0
void BookmarkToolBar::OnDropInsertBookmark(STGMEDIUM *aStgMedium, xpr_sint_t aInsert)
{
    if (aStgMedium == XPR_NULL)
        return;

    LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal);
    if (sIda == XPR_NULL)
        return;

    {
        xpr_sint_t sCount = sIda->cidl;
        LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL
        LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL
        LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL

        // get folder PIDL
        sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]);

        xpr_sint_t i;
        xpr_sint_t sResult;

        for (i = 0; i < sCount; ++i)
        {
            // get item PIDL and get full-qualified PIDL
            sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]);
            sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2);

            {
                sResult = gFrame->addBookmark(sFullPidl2, aInsert);
                if (sResult == -1)
                    break;

                if (sResult == 1)
                {
                    updateBookmarkButton(aInsert);
                    gFrame->updateBookmark();
                }
            }

            COM_FREE(sFullPidl2);
        }
    }

    ::GlobalUnlock(aStgMedium->hGlobal);
}
Example #9
0
void ShortcutDlg::OnTargetBrowse(void) 
{
    BROWSEINFO sBrowseInfo = {0};
    sBrowseInfo.hwndOwner = GetSafeHwnd();
    sBrowseInfo.lpszTitle = gApp.loadString(XPR_STRING_LITERAL("popup.create_shortcut.folder_browse.title"));
    sBrowseInfo.ulFlags   = BIF_BROWSEINCLUDEFILES | BIF_RETURNONLYFSDIRS;// | BIF_USENEWUI;
    LPITEMIDLIST sFullPidl = ::SHBrowseForFolder(&sBrowseInfo);
    if (XPR_IS_NULL(sFullPidl))
        return;

    xpr::string sName, sPath;
    GetName(sFullPidl, SHGDN_INFOLDER,   sName);
    GetName(sFullPidl, SHGDN_FORPARSING, sPath);

    RemoveInvalidChar(sName);

    COM_FREE(mFullPidl);
    mFullPidl = sFullPidl;

    SetDlgItemText(IDC_CREATE_SHORTCUT_NAME, sName.c_str());
    SetDlgItemText(IDC_CREATE_SHORTCUT_TARGET, sPath.c_str());
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// IMPLEMENTATION
////////////////////////////////////////////////////////////////////////////////////////////////////
VOID Foundation::OnReceive(LPCSTR szwData, DWORD dwLength)
{
    LPWSTR szwArray;
    DWORD dwBytes = EngineAPI::WideUnicodeFromAscii(szwData, &szwArray, dwLength);
    {
        //!
        //! Allocate the packet
        //!
        BSTR sbMessage = COM_ALLOCATE_STRING(szwArray);

        //!
        //! Send the packet
        //!
        __asm PUSH sbMessage
        __asm CALL m_RecvDetour.lpTrampoline

        //!
        //! Free the packet
        //!
        COM_FREE(sbMessage);
    }
    FREE(szwArray);
}
Example #11
0
void BookmarkToolBar::OnDropExecFile(STGMEDIUM *aStgMedium, xpr_sint_t aBookmark)
{
    if (aStgMedium == XPR_NULL)
        return;

    BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark);
    if (sBookmarkItem == XPR_NULL)
        return;

    LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal);
    if (sIda == XPR_NULL)
        return;

    LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath);
    if (sFullPidl != XPR_NULL && IsFileSystem(sFullPidl) == XPR_TRUE && IsFileSystemFolder(sFullPidl) == XPR_FALSE)
    {
        xpr_sint_t sCount = sIda->cidl;
        LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL
        LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL
        LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL

        xpr_tchar_t sPath[XPR_MAX_PATH + 1] = {0};
        xpr_tchar_t sStartup[XPR_MAX_PATH + 1] = {0};
        xpr_tchar_t *sSplit;
        DWORD sAttributes;

        // get folder PIDL
        sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]);

        xpr_sint_t i;
        for (i = 0; i < sCount; ++i)
        {
            // get item PIDL and get full-qualified PIDL
            sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]);
            sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2);

            {
                sPath[0] = '\"';
                GetName(sFullPidl2, SHGDN_FORPARSING, sPath+1);
                _tcscpy(sStartup, sPath+1);
                _tcscat(sPath, XPR_STRING_LITERAL("\""));

                sAttributes = GetFileAttributes(sStartup);
                if (!XPR_TEST_BITS(sAttributes, FILE_ATTRIBUTE_DIRECTORY))
                {
                    sSplit = _tcsrchr(sStartup, '\\');
                    if (sSplit != XPR_NULL)
                        *sSplit = '\0';
                    if (_tcslen(sStartup) == 2) // Drive Root
                        _tcscat(sStartup, XPR_STRING_LITERAL("\\"));
                }

                ExecFile(sBookmarkItem->mPath.c_str(), sStartup, sPath);
            }

            COM_FREE(sFullPidl2);
        }
    }

    COM_FREE(sFullPidl);
    ::GlobalUnlock(aStgMedium->hGlobal);
}
Example #12
0
void BookmarkToolBar::OnDropTarget(COleDataObject *aOleDataObject, DROPEFFECT aDropEffect, CPoint aPoint, xpr_sint_t aBookmark)
{
    if (aOleDataObject == XPR_NULL)
        return;

    BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark);
    if (sBookmarkItem == XPR_NULL)
        return;

    LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath);
    if (sFullPidl != XPR_NULL)
    {
        xpr_bool_t    sResult;
        LPSHELLFOLDER sShellFolder = XPR_NULL;
        LPCITEMIDLIST sPidl = XPR_NULL;

        sResult = fxfile::base::Pidl::getSimplePidl(sFullPidl, sShellFolder, sPidl);
        if (XPR_IS_TRUE(sResult))
        {
            POINTL sPointL = {0};
            ClientToScreen(&aPoint);
            sPointL.x = aPoint.x;
            sPointL.y = aPoint.y;

            DWORD sKeyState = mDropTarget.isRightDrag() ? MK_RBUTTON : MK_LBUTTON;
            DWORD sTempEffect = DROPEFFECT_MOVE;

            switch (aDropEffect)
            {
            case DROPEFFECT_MOVE: sKeyState |= MK_SHIFT;              break;
            case DROPEFFECT_COPY: sKeyState |= MK_CONTROL;            break;
            case DROPEFFECT_LINK: sKeyState |= MK_SHIFT | MK_CONTROL; break;
            }

            LPDROPTARGET sDropTarget = XPR_NULL;
            HRESULT sHResult = sShellFolder->GetUIObjectOf(
                GetSafeHwnd(),
                1,
                (LPCITEMIDLIST*)&sPidl,
                IID_IDropTarget,
                XPR_NULL,
                (LPVOID*)&sDropTarget);

            if (SUCCEEDED(sHResult) && sDropTarget != XPR_NULL)
            {
                LPDATAOBJECT sDataObject = aOleDataObject->Detach();
                if (sDataObject != XPR_NULL)
                {
                    sDropTarget->DragEnter(sDataObject, sKeyState, sPointL, &sTempEffect);
                    sDropTarget->DragOver(sKeyState, sPointL, &sTempEffect);

                    if (mDropTarget.isRightDrag() == XPR_TRUE)
                        aDropEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;

                    sDropTarget->Drop(sDataObject, sKeyState, sPointL, &aDropEffect);
                }
            }

            COM_RELEASE(sDropTarget);
        }

        COM_RELEASE(sShellFolder);
    }

    COM_FREE(sFullPidl);
}
Example #13
0
void BookmarkToolBar::OnDropFileOperation(STGMEDIUM *aStgMedium, DROPEFFECT aDropEffect, xpr_sint_t aBookmark)
{
    if (aStgMedium == XPR_NULL)
        return;

    BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark);
    if (sBookmarkItem == XPR_NULL)
        return;

    LPIDA sIda = (LPIDA)::GlobalLock(aStgMedium->hGlobal);
    if (sIda == XPR_NULL)
        return;

    LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath);
    if (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl) == XPR_TRUE)
    {
        xpr_sint_t sCount = sIda->cidl;
        LPITEMIDLIST sFullPidl2 = XPR_NULL; // fully-qualified PIDL
        LPITEMIDLIST sPidl1 = XPR_NULL; // folder PIDL
        LPITEMIDLIST sPidl2 = XPR_NULL; // item PIDL

        // get folder PIDL
        sPidl1 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[0]);

        xpr_sint_t sSourceCount = 0;
        xpr_tchar_t *sSource = XPR_NULL;
        xpr_tchar_t *sTarget = XPR_NULL;
        xpr_tchar_t *sSourceEnum = XPR_NULL;

        sTarget = new xpr_tchar_t[XPR_MAX_PATH + 1];
        GetName(sFullPidl, SHGDN_FORPARSING, sTarget);
        sTarget[_tcslen(sTarget)+1] = '\0';

        sSource = new xpr_tchar_t[(XPR_MAX_PATH + 1) * sCount];
        sSourceEnum = sSource;

        xpr_sint_t i;
        for (i = 0; i < sCount; ++i)
        {
            // get item PIDL and get full-qualified PIDL
            sPidl2 = (LPITEMIDLIST)(((xpr_byte_t *)sIda)+(sIda)->aoffset[i+1]);
            sFullPidl2 = fxfile::base::Pidl::concat(sPidl1, sPidl2);

            if (IsFileSystem(sFullPidl2) == XPR_TRUE)
            {
                GetName(sFullPidl2, SHGDN_FORPARSING, sSourceEnum);
                sSourceEnum += _tcslen(sSourceEnum) + 1;
                sSourceCount++;
            }

            COM_FREE(sFullPidl2);
        }

        if (sSourceCount > 0)
        {
            // Last Element - 2 Null
            *sSourceEnum = '\0';

            xpr_uint_t sFunc = 0;
            WORD sFlags = 0;
            // Drop Effect
            // 1-Copy, 2-Move, 3-Bookmark, 5-Copy+Bookmark
            if (aDropEffect == DROPEFFECT_MOVE)
                sFunc = FO_MOVE;
            else
            {
                sFunc = FO_COPY;

                CString sCompare;
                AfxExtractSubString(sCompare, sSource, 0, '\0');
                sCompare = sCompare.Left(sCompare.ReverseFind('\\'));
                if (_tcscmp(sCompare, sTarget) == 0)
                    sFlags |= FOF_RENAMEONCOLLISION;
            }

            // windows vista bug
            //if (sSourceCount > 1)
            //    sFlags |= FOF_MULTIDESTFILES;

            SHFILEOPSTRUCT *sShFileOpStruct = new SHFILEOPSTRUCT;
            memset(sShFileOpStruct, 0, sizeof(SHFILEOPSTRUCT));
            sShFileOpStruct->hwnd   = AfxGetMainWnd()->GetSafeHwnd();
            sShFileOpStruct->wFunc  = sFunc;
            sShFileOpStruct->fFlags = sFlags;
            sShFileOpStruct->pFrom  = sSource;
            sShFileOpStruct->pTo    = sTarget;

            FileOpThread *sFileOpThread = new FileOpThread;
            sFileOpThread->start(sShFileOpStruct);
        }
    }

    COM_FREE(sFullPidl);
    ::GlobalUnlock(aStgMedium->hGlobal);
}
Example #14
0
void BookmarkToolBar::OnDrop(COleDataObject *aOleDataObject, DROPEFFECT aDropEffect, CPoint aPoint)
{
    CToolBarCtrl &sToolBarCtrl = GetToolBarCtrl();

    DragImage &sDragImage = DragImage::instance();

    if (sDragImage.isMyDragging() == XPR_TRUE)
    {
        CImageList *sMyDragImage = sDragImage.getMyDragImage();
        if (XPR_IS_NOT_NULL(sMyDragImage))
        {
            sMyDragImage->EndDrag();
            sMyDragImage->DragShowNolock(XPR_FALSE);
        }
    }
    else
    {
        if (mDropTarget.isUseDropHelper() == XPR_TRUE)
            mDropTarget.getDropHelper()->DragLeave();
    }

    if (mOldInsert >= 0)
    {
        TBINSERTMARK sTbInsertMark = {0};
        sTbInsertMark.iButton = -1;
        sToolBarCtrl.SetInsertMark(&sTbInsertMark);
    }

    if (mOldBookmark >= 0)
    {
        TBBUTTON sTbButton = {0};
        sToolBarCtrl.GetButton(mOldBookmark, &sTbButton);
        sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED);
    }

    if (XPR_IS_NOT_NULL(mObserver))
    {
        mObserver->onBookmarkToolBarStatus(*this, -1, -1, DROPEFFECT_NONE);
    }

    COleDataObject *sOleDataObject = aOleDataObject;
    if (sOleDataObject->IsDataAvailable(mShellIDListClipFormat) == XPR_FALSE)
        return;

    // 3 Operation
    //--------------------------------------------------
    // 1. Insert Bookmark Item
    // 2. Run Program & Bookmark File
    // 3. File Operation

    STGMEDIUM sStgMedium = {0};
    FORMATETC sFormatEtc = {(CLIPFORMAT)mShellIDListClipFormat, XPR_NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
    if (sOleDataObject->GetData(mShellIDListClipFormat, &sStgMedium, &sFormatEtc) == XPR_FALSE)
        return;

    if (mOldBookmark < 0)
    {
        OnDropInsertBookmark(&sStgMedium, mOldInsert);
    }
    else
    {
        xpr_bool_t sFileOperation = XPR_FALSE;

        BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(mOldBookmark);
        if (mOldBookmark >= 0 && sBookmarkItem != XPR_NULL)
        {
            LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath);
            sFileOperation = (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl));
            COM_FREE(sFullPidl);
        }

        if (sFileOperation == XPR_TRUE)
        {
            if (aDropEffect == DROPEFFECT_LINK)
                OnDropShortcut(&sStgMedium, mOldBookmark);
            else
                OnDropFileOperation(&sStgMedium, aDropEffect, mOldBookmark);
        }
        else
        {
            OnDropTarget(sOleDataObject, aDropEffect, aPoint, mOldBookmark);
        }
    }

    if (XPR_IS_NOT_NULL(sStgMedium.pUnkForRelease))
    {
        ::ReleaseStgMedium(&sStgMedium);
    }
}
Example #15
0
DROPEFFECT BookmarkToolBar::OnDragOver(COleDataObject* aOleDataObject, DWORD aKeyState, CPoint aPoint)
{
    DROPEFFECT sDropEffect = DROPEFFECT_LINK;

    DragImage &sDragImage = DragImage::instance();

    if (sDragImage.isMyDragging() == XPR_TRUE)
    {
        CImageList *sMyDragImage = sDragImage.getMyDragImage();
        if (XPR_IS_NOT_NULL(sMyDragImage))
        {
            CPoint sDragPoint(aPoint);
            ClientToScreen(&sDragPoint);
            sMyDragImage->DragMove(sDragPoint);
        }
    }
    else
    {
        if (mDropTarget.isUseDropHelper() == XPR_TRUE)
        {
            CPoint sDragPoint(aPoint);
            mDropTarget.getDropHelper()->DragOver(&sDragPoint, sDropEffect);
        }
    }

    CToolBarCtrl &sToolBarCtrl = GetToolBarCtrl();

    TBBUTTON sTbButton = {0};
    TBINSERTMARK sTbInsertMark = {0};
    xpr_sint_t sHitTest = GetToolBarCtrl().HitTest(&aPoint);
    xpr_sint_t sInsertHitTest = -1;
    if (sToolBarCtrl.InsertMarkHitTest(&aPoint, &sTbInsertMark) && sTbInsertMark.iButton >= 0)
        sInsertHitTest = sTbInsertMark.iButton;

    xpr_sint_t sBookmark, sInsert;
    if (XPR_TEST_BITS(aKeyState, MK_SHIFT) && XPR_TEST_BITS(aKeyState, MK_CONTROL))
    {
        sInsert = -1;
        sBookmark = -1;
    }
    else
    {
        if (sHitTest < 0 || sInsertHitTest >= 0)
        {
            if (sTbInsertMark.dwFlags == TBIMHT_AFTER)
            {
                sTbInsertMark.dwFlags = 0;
                sInsertHitTest++;
            }

            if (sHitTest == -1)
                sInsertHitTest = -1;

            sInsert = sInsertHitTest;
            sBookmark = -1;
        }
        else
        {
            sInsert = -1;
            sBookmark = sHitTest;
        }
    }

    BookmarkMgr &sBookmarkMgr = BookmarkMgr::instance();

    if (sBookmark >= sBookmarkMgr.getCount())
        sBookmark = -1;

    if (sBookmark != -1)
    {
        sDropEffect = DROPEFFECT_LINK;

        BookmarkItem *sBookmarkItem = sBookmarkMgr.getBookmark(sBookmark);
        if (sBookmarkItem != XPR_NULL)
        {
            xpr_bool_t sGetPidl = XPR_TRUE;
            LPITEMIDLIST sFullPidl = XPR_NULL;

            if (IsNetItem(sBookmarkItem->mPath.c_str()))
                sGetPidl = WnetMgr::instance().isConnectedServer(sBookmarkItem->mPath);

            if (sGetPidl == XPR_TRUE)
                sFullPidl = Path2Pidl(sBookmarkItem->mPath);

            if (sFullPidl != XPR_NULL && IsFileSystemFolder(sFullPidl))
            {
                sDropEffect = DROPEFFECT_MOVE;

                if (aKeyState & MK_ALT)          sDropEffect = DROPEFFECT_LINK;
                else if (aKeyState & MK_CONTROL) sDropEffect = DROPEFFECT_COPY;
                else if (aKeyState & MK_SHIFT)   sDropEffect = DROPEFFECT_MOVE;
                else
                {
                    switch (gOpt->mConfig.mDragDefaultFileOp)
                    {
                    case DRAG_FILE_OP_DEFAULT:  sDropEffect = DROPEFFECT_MOVE; break;
                    case DRAG_FILE_OP_COPY:     sDropEffect = DROPEFFECT_COPY; break;
                    case DRAG_FILE_OP_LINK:     sDropEffect = DROPEFFECT_LINK; break;
                    default:                    sDropEffect = DROPEFFECT_MOVE; break;
                    }
                }
            }
            else
            {
                HRESULT       sHResult;
                LPSHELLFOLDER sShellFolder = XPR_NULL;
                LPCITEMIDLIST sPidl        = XPR_NULL;

                fxfile::base::Pidl::getSimplePidl(sFullPidl, sShellFolder, sPidl);

                sHResult = E_FAIL;
                LPDROPTARGET sDropTarget = XPR_NULL;

                if (sShellFolder != XPR_NULL && sPidl != XPR_NULL)
                {
                    sHResult = sShellFolder->GetUIObjectOf(GetSafeHwnd(),
                        1,
                        (LPCITEMIDLIST *)&sPidl,
                        IID_IDropTarget,
                        XPR_NULL,
                        (LPVOID *)&sDropTarget);
                }

                xpr_bool_t sSucceeded = XPR_FALSE;

                if (SUCCEEDED(sHResult) && sDropTarget != XPR_NULL)
                {
                    POINTL sPointL = {0};
                    ClientToScreen(&aPoint);
                    sPointL.x = aPoint.x;
                    sPointL.y = aPoint.y;

                    DWORD sTempDropEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;

                    sHResult = sDropTarget->DragEnter(aOleDataObject->m_lpDataObject, aKeyState, sPointL, &sTempDropEffect);
                    if (SUCCEEDED(sHResult))
                    {
                        sHResult = sDropTarget->DragOver(aKeyState, sPointL, &sTempDropEffect);
                        sSucceeded = SUCCEEDED(sHResult) && sTempDropEffect != 0;
                    }
                }

                COM_RELEASE(sDropTarget);
                COM_RELEASE(sShellFolder);

                if (sSucceeded == XPR_TRUE)
                    sDropEffect = DROPEFFECT_MOVE;
                else
                {
                    sBookmark = -1;
                    sDropEffect = DROPEFFECT_NONE;
                }
            }

            COM_FREE(sFullPidl);
        }
        else
        {
            sBookmark = -1;
            sDropEffect = DROPEFFECT_NONE;
        }
    }

    if (sBookmark == -1)
    {
        // Insert Bookmark
        if (mOldBookmark >= 0)
        {
            sToolBarCtrl.GetButton(mOldBookmark, &sTbButton);
            sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED);
        }

        if (mOldInsert != sInsert)
        {
            sTbInsertMark.iButton = sInsert;
            sToolBarCtrl.SetInsertMark(&sTbInsertMark);
        }

        sDropEffect = DROPEFFECT_LINK;
    }
    else
    {
        // Run Program or File Operation
        if (mOldInsert >= 0)
        {
            sTbInsertMark.iButton = -1;
            sToolBarCtrl.SetInsertMark(&sTbInsertMark);
        }

        if (mOldBookmark != sBookmark)
        {
            sToolBarCtrl.GetButton(mOldBookmark, &sTbButton);
            sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED);

            sToolBarCtrl.GetButton(sBookmark, &sTbButton);
            sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_MARKED | TBSTATE_PRESSED | TBSTATE_ENABLED);
        }
    }

    mOldInsert = sInsert;
    mOldBookmark = sBookmark;

    if (XPR_IS_NOT_NULL(mObserver))
    {
        mObserver->onBookmarkToolBarStatus(*this, mOldBookmark, mOldInsert, sDropEffect);
    }

    return sDropEffect;
}
Example #16
0
// full qualified PIDL -> IShellFolder, PIDL
xpr_bool_t Pidl::getSimplePidl(LPCITEMIDLIST aFullPidl, LPSHELLFOLDER &aShellFolder, LPCITEMIDLIST &aSimplePidl)
{
    if (XPR_IS_NULL(aFullPidl))
    {
        return XPR_FALSE;
    }

    LPSHELLFOLDER sShellFolder = XPR_NULL;
    LPITEMIDLIST  sSimplePidl  = XPR_NULL;
    HRESULT       sComResult     = E_FAIL;

    if (Pidl::isSimplePidl(aFullPidl) == XPR_TRUE)
    {
        LPITEMIDLIST sChildPidl;

        sChildPidl = Pidl::findLastItem(aFullPidl);

        sComResult = ::SHGetDesktopFolder((LPSHELLFOLDER *)&sShellFolder);
        if (SUCCEEDED(sComResult))
        {
            sSimplePidl = sChildPidl;
        }
    }
    else
    {
        LPSHELLFOLDER sDesktopShellFolder;
        LPITEMIDLIST  sParentPidl;
        LPITEMIDLIST  sChildPidl;

        sChildPidl = Pidl::findLastItem(aFullPidl);

        sParentPidl = Pidl::clone(aFullPidl);

        if (XPR_IS_TRUE(Pidl::removeLastItem(sParentPidl)))
        {
            sComResult = ::SHGetDesktopFolder(&sDesktopShellFolder);
            if (SUCCEEDED(sComResult))
            {
                sComResult = sDesktopShellFolder->BindToObject(
                    sParentPidl,
                    XPR_NULL,
                    IID_IShellFolder,
                    (LPVOID *)&sShellFolder);

                if (SUCCEEDED(sComResult))
                {
                    sSimplePidl = sChildPidl;
                }

                COM_RELEASE(sDesktopShellFolder);
            }
        }

        COM_FREE(sParentPidl);
    }

    if (XPR_IS_NULL(sSimplePidl))
    {
        COM_RELEASE(sShellFolder);

        return XPR_FALSE;
    }

    if (XPR_IS_NULL(sShellFolder))
    {
        return XPR_FALSE;
    }

    aShellFolder = sShellFolder;
    aSimplePidl  = sSimplePidl;

    return XPR_TRUE;
}
Example #17
0
void BookmarkEditDlg::OnQuickLaunch(void) 
{
    const xpr_tchar_t *sMsg = gApp.loadString(XPR_STRING_LITERAL("popup.bookmark_edit.msg.question_quick_launch"));
    xpr_sint_t sMsgId = MessageBox(sMsg, XPR_NULL, MB_YESNO | MB_ICONQUESTION);
    if (sMsgId == IDNO)
        return;

    CWaitCursor sWaitCursor;

    HRESULT sHResult;
    xpr_tchar_t sQuickLaunch[XPR_MAX_PATH + 1] = {0};
    sHResult = ::SHGetSpecialFolderPath(XPR_NULL, sQuickLaunch, CSIDL_APPDATA, XPR_FALSE);
    if (FAILED(sHResult))
        return;

    _tcscat(sQuickLaunch, XPR_STRING_LITERAL("\\Microsoft\\Internet Explorer\\Quick Launch"));

    xpr_tchar_t sPath[XPR_MAX_PATH + 1] = {0};
    _tcscpy(sPath, sQuickLaunch);

    xpr_tchar_t *sFileName = sPath + _tcslen(sPath) + 1;
    _tcscat(sPath, XPR_STRING_LITERAL("\\*.*"));

    WIN32_FIND_DATA sFindData = {0};
    HANDLE sFindHandle = ::FindFirstFile(sPath, &sFindData);
    if (sFindHandle == INVALID_HANDLE_VALUE)
        return;

    xpr_tchar_t *sExt;
    LPITEMIDLIST sFullPidl = XPR_NULL;
    LPITEMIDLIST sResolvedFullPidl = XPR_NULL;
    BookmarkItem *sBookmarkItem;
    xpr_bool_t sResolved;

    do
    {
        if (_tcscmp(sFindData.cFileName, XPR_STRING_LITERAL(".")) == 0 || _tcscmp(sFindData.cFileName, XPR_STRING_LITERAL("..")) == 0)
            continue;

        _tcscpy(sFileName, sFindData.cFileName);
        sHResult = fxfile::base::Pidl::create(sPath, sFullPidl);
        if (SUCCEEDED(sHResult) && sFullPidl != XPR_NULL)
        {
            sExt = (xpr_tchar_t *)GetFileExt(sFindData.cFileName);
            if (sExt != XPR_NULL && !_tcsicmp(sExt+1, XPR_STRING_LITERAL("lnk")))
            {
                sResolved = ResolveShortcut(GetSafeHwnd(), sPath, &sResolvedFullPidl);
                if (sResolved && sResolvedFullPidl)
                {
                    COM_FREE(sFullPidl);
                    sFullPidl = sResolvedFullPidl;
                }
                else
                {
                    COM_FREE(sResolvedFullPidl);
                }
            }

            sBookmarkItem = new BookmarkItem;

            Pidl2Path(sFullPidl, sBookmarkItem->mPath);
            GetName(sFullPidl, SHGDN_INFOLDER, sBookmarkItem->mName);

            addBookmark(sBookmarkItem, IconReqShellIcon);
        }

        COM_FREE(sFullPidl);
    }
    while (::FindNextFile(sFindHandle, &sFindData) == XPR_TRUE);

    ::FindClose(sFindHandle);

    if (mListCtrl.GetItemCount() > 0)
        setItemFocus(0);

    updateStatus();
}
Example #18
0
void BookmarkToolBar::OnContextMenu(CWnd* pWnd, CPoint aPoint)
{
    CToolBarCtrl &sToolBarCtrl = GetToolBarCtrl();

    CPoint sClientPoint(aPoint);
    ScreenToClient(&sClientPoint);

    xpr_bool_t sSucceeded = XPR_FALSE;
    xpr_sint_t sIndex = sToolBarCtrl.HitTest(&sClientPoint);
    if (GetKeyState(VK_CONTROL) < 0 && sIndex >= 0)
    {
        BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(sIndex);
        if (sBookmarkItem != XPR_NULL)
        {
            LPITEMIDLIST sFullPidl = sBookmarkItem->getPidl();
            if (sFullPidl != XPR_NULL)
            {
                xpr_bool_t    sResult;
                LPSHELLFOLDER sShellFolder = XPR_NULL;
                LPCITEMIDLIST sPidl        = XPR_NULL;

                sResult = fxfile::base::Pidl::getSimplePidl(sFullPidl, sShellFolder, sPidl);
                if (SUCCEEDED(sResult) && sShellFolder != XPR_NULL && sPidl != XPR_NULL)
                {
                    ContextMenu sContextMenu(GetSafeHwnd());
                    if (sContextMenu.init(sShellFolder, &sPidl, 1))
                    {
                        TBBUTTON sTbButton = {0};
                        sToolBarCtrl.GetButton(sIndex, &sTbButton);
                        sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_MARKED | TBSTATE_ENABLED);

                        xpr_uint_t sId = sContextMenu.trackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON, &aPoint, CMF_EXPLORE);
                        if (sId != -1)
                        {
                            sId -= sContextMenu.getFirstId();

                            xpr_tchar_t sVerb[0xff] = {0};
                            sContextMenu.getCommandVerb(sId, sVerb, 0xfe);

                            xpr_bool_t sSelfInvoke = XPR_FALSE;

                            if (_tcsicmp(sVerb, CMID_VERB_OPEN) == 0)
                            {
                                gFrame->gotoBookmark(sIndex);
                                sSelfInvoke = XPR_TRUE;
                            }

                            if (sSelfInvoke == XPR_FALSE)
                                sContextMenu.invokeCommand(sId);
                        }

                        sToolBarCtrl.GetButton(sIndex, &sTbButton);
                        sToolBarCtrl.SetState(sTbButton.idCommand, TBSTATE_ENABLED);
                    }

                    sContextMenu.destroy();

                    sSucceeded = XPR_TRUE;
                }

                COM_RELEASE(sShellFolder);
                COM_FREE(sFullPidl);
            }
        }
    }

    if (sSucceeded == XPR_FALSE)
    {
        BCMenu sMenu;
        if (sMenu.LoadMenu(IDR_COOLBAR_BOOKMARKBAR) == XPR_TRUE)
        {
            BCMenu *sPopupMenu = (BCMenu *)sMenu.GetSubMenu(0);
            if (XPR_IS_NOT_NULL(sPopupMenu))
                sPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, aPoint, AfxGetMainWnd());
        }
    }
}