Example #1
0
INT_PTR CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG :
    {
        ProjectPanel::initMenus();

        // Create toolbar menu
        int style = WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_AUTOSIZE | TBSTYLE_FLAT | TBSTYLE_LIST;
        _hToolbarMenu = CreateWindowEx(0,TOOLBARCLASSNAME,NULL, style,
                                       0,0,0,0,_hSelf,(HMENU)0, _hInst, NULL);
        TBBUTTON tbButtons[2];

        NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
        generic_string workspace_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 0, PM_WORKSPACEMENUENTRY);
        generic_string edit_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 1, PM_EDITMENUENTRY);

        tbButtons[0].idCommand = IDB_PROJECT_BTN;
        tbButtons[0].iBitmap = I_IMAGENONE;
        tbButtons[0].fsState = TBSTATE_ENABLED;
        tbButtons[0].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE;
        tbButtons[0].iString = (INT_PTR)workspace_entry.c_str();

        tbButtons[1].idCommand = IDB_EDIT_BTN;
        tbButtons[1].iBitmap = I_IMAGENONE;
        tbButtons[1].fsState = TBSTATE_ENABLED;
        tbButtons[1].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE;
        tbButtons[1].iString = (INT_PTR)edit_entry.c_str();

        SendMessage(_hToolbarMenu, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
        SendMessage(_hToolbarMenu, TB_ADDBUTTONS,       (WPARAM)sizeof(tbButtons) / sizeof(TBBUTTON),       (LPARAM)&tbButtons);
        SendMessage(_hToolbarMenu, TB_AUTOSIZE, 0, 0);
        ShowWindow(_hToolbarMenu, SW_SHOW);

        _treeView.init(_hInst, _hSelf, ID_PROJECTTREEVIEW);

        setImageList(IDI_PROJECT_WORKSPACE, IDI_PROJECT_WORKSPACEDIRTY, IDI_PROJECT_PROJECT, IDI_PROJECT_FOLDEROPEN, IDI_PROJECT_FOLDERCLOSE, IDI_PROJECT_FILE, IDI_PROJECT_FILEINVALID);
        _treeView.addCanNotDropInList(INDEX_LEAF);
        _treeView.addCanNotDropInList(INDEX_LEAF_INVALID);

        _treeView.addCanNotDragOutList(INDEX_CLEAN_ROOT);
        _treeView.addCanNotDragOutList(INDEX_DIRTY_ROOT);
        _treeView.addCanNotDragOutList(INDEX_PROJECT);

        _treeView.display();
        if (!openWorkSpace(_workSpaceFilePath.c_str()))
            newWorkSpace();

        return TRUE;
    }


    case WM_MOUSEMOVE:
        if (_treeView.isDragging())
            _treeView.dragItem(_hSelf, LOWORD(lParam), HIWORD(lParam));
        break;
    case WM_LBUTTONUP:
        if (_treeView.isDragging())
            if (_treeView.dropItem())
                setWorkSpaceDirty(true);
        break;

    case WM_NOTIFY:
    {
        notified((LPNMHDR)lParam);
    }
    return TRUE;

    case WM_SIZE:
    {
        int width = LOWORD(lParam);
        int height = HIWORD(lParam);
        RECT toolbarMenuRect;
        ::GetClientRect(_hToolbarMenu, &toolbarMenuRect);

        ::MoveWindow(_hToolbarMenu, 0, 0, width, toolbarMenuRect.bottom, TRUE);

        HWND hwnd = _treeView.getHSelf();
        if (hwnd)
            ::MoveWindow(hwnd, 0, toolbarMenuRect.bottom + 2, width, height - toolbarMenuRect.bottom - 2, TRUE);
        break;
    }

    case WM_CONTEXTMENU:
        if (!_treeView.isDragging())
            showContextMenu(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
        return TRUE;

    case WM_COMMAND:
    {
        popupMenuCmd(LOWORD(wParam));
        break;
    }

    case WM_DESTROY:
    {
        _treeView.destroy();
        destroyMenus();
        ::DestroyWindow(_hToolbarMenu);
        break;
    }
    case WM_KEYDOWN:
        //if (wParam == VK_F2)
    {
        ::MessageBoxA(NULL,"vkF2","",MB_OK);
    }
    break;

    default :
        return DockingDlgInterface::run_dlgProc(message, wParam, lParam);
    }
    return DockingDlgInterface::run_dlgProc(message, wParam, lParam);
}
Example #2
0
void ProjectPanel::notified(LPNMHDR notification)
{
    if ((notification->hwndFrom == _treeView.getHSelf()))
    {
        TCHAR textBuffer[MAX_PATH];
        TVITEM tvItem;
        tvItem.mask = TVIF_TEXT | TVIF_PARAM;
        tvItem.pszText = textBuffer;
        tvItem.cchTextMax = MAX_PATH;

        switch (notification->code)
        {
        case NM_DBLCLK:
        {
            openSelectFile();
        }
        break;

        case TVN_ENDLABELEDIT:
        {
            LPNMTVDISPINFO tvnotif = (LPNMTVDISPINFO)notification;
            if (!tvnotif->item.pszText)
                return;
            if (getNodeType(tvnotif->item.hItem) == nodeType_root)
                return;

            // Processing for only File case
            if (tvnotif->item.lParam)
            {
                // Get the old label
                tvItem.hItem = _treeView.getSelection();
                ::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem);
                size_t len = lstrlen(tvItem.pszText);

                // Find the position of old label in File path
                generic_string *filePath = (generic_string *)tvnotif->item.lParam;
                size_t found = filePath->rfind(tvItem.pszText);

                // If found the old label, replace it with the modified one
                if (found != generic_string::npos)
                    filePath->replace(found, len, tvnotif->item.pszText);

                // Check the validity of modified file path
                tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
                if (::PathFileExists(filePath->c_str()))
                {
                    tvItem.iImage = INDEX_LEAF;
                    tvItem.iSelectedImage = INDEX_LEAF;
                }
                else
                {
                    tvItem.iImage = INDEX_LEAF_INVALID;
                    tvItem.iSelectedImage = INDEX_LEAF_INVALID;
                }
                TreeView_SetItem(_treeView.getHSelf(), &tvItem);
            }

            // For File, Folder and Project
            ::SendMessage(_treeView.getHSelf(), TVM_SETITEM, 0,(LPARAM)(&(tvnotif->item)));
            setWorkSpaceDirty(true);
        }
        break;

        case TVN_GETINFOTIP:
        {
            LPNMTVGETINFOTIP lpGetInfoTip = (LPNMTVGETINFOTIP)notification;
            generic_string *str = NULL ;

            if (_treeView.getRoot() == lpGetInfoTip->hItem)
            {
                str = &_workSpaceFilePath;
            }
            else
            {
                str = (generic_string *)lpGetInfoTip->lParam;
                if (!str)
                    return;
            }
            lpGetInfoTip->pszText = (LPTSTR)str->c_str();
            lpGetInfoTip->cchTextMax = str->size();
        }
        break;

        case TVN_KEYDOWN:
        {
            //tvItem.hItem = _treeView.getSelection();
            //::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem);
            LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)notification;

            if (ptvkd->wVKey == VK_DELETE)
            {
                HTREEITEM hItem = _treeView.getSelection();
                NodeType nType = getNodeType(hItem);
                if (nType == nodeType_project || nType == nodeType_folder)
                    popupMenuCmd(IDM_PROJECT_DELETEFOLDER);
                else if (nType == nodeType_file)
                    popupMenuCmd(IDM_PROJECT_DELETEFILE);
            }
            else if (ptvkd->wVKey == VK_RETURN)
            {
                HTREEITEM hItem = _treeView.getSelection();
                NodeType nType = getNodeType(hItem);
                if (nType == nodeType_file)
                    openSelectFile();
                else
                    _treeView.toggleExpandCollapse(hItem);
            }
            else if (ptvkd->wVKey == VK_UP)
            {
                if (0x80 & GetKeyState(VK_CONTROL))
                {
                    popupMenuCmd(IDM_PROJECT_MOVEUP);
                }
            }
            else if (ptvkd->wVKey == VK_DOWN)
            {
                if (0x80 & GetKeyState(VK_CONTROL))
                {
                    popupMenuCmd(IDM_PROJECT_MOVEDOWN);
                }
            }
            else if (ptvkd->wVKey == VK_F2)
                popupMenuCmd(IDM_PROJECT_RENAME);

        }
        break;

        case TVN_ITEMEXPANDED:
        {
            LPNMTREEVIEW nmtv = (LPNMTREEVIEW)notification;
            tvItem.hItem = nmtv->itemNew.hItem;
            tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;

            if (getNodeType(nmtv->itemNew.hItem) == nodeType_folder)
            {
                if (nmtv->action == TVE_COLLAPSE)
                {
                    _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_CLOSED_NODE, INDEX_CLOSED_NODE);
                }
                else if (nmtv->action == TVE_EXPAND)
                {
                    _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE);
                }
            }
        }
        break;

        case TVN_BEGINDRAG:
        {
            //printStr(TEXT("hello"));
            _treeView.beginDrag((LPNMTREEVIEW)notification);

        }
        break;
        }
    }
}
INT_PTR CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_INITDIALOG :
        {
			FileBrowser::initPopupMenus();

			_treeView.init(_hInst, _hSelf, ID_FILEBROWSERTREEVIEW);
			setImageList(IDI_PROJECT_WORKSPACE, IDI_PROJECT_WORKSPACEDIRTY, IDI_PROJECT_PROJECT, IDI_PROJECT_FOLDEROPEN, IDI_PROJECT_FOLDERCLOSE, IDI_PROJECT_FILE, IDI_PROJECT_FILEINVALID);

			_treeView.addCanNotDropInList(INDEX_OPEN_ROOT);
			_treeView.addCanNotDropInList(INDEX_CLOSE_ROOT);
			_treeView.addCanNotDropInList(INDEX_OPEN_NODE);
			_treeView.addCanNotDropInList(INDEX_CLOSED_NODE);
			_treeView.addCanNotDropInList(INDEX_LEAF);
			_treeView.addCanNotDropInList(INDEX_LEAF_INVALID);

			_treeView.addCanNotDragOutList(INDEX_OPEN_ROOT);
			_treeView.addCanNotDragOutList(INDEX_CLOSE_ROOT);
			_treeView.addCanNotDragOutList(INDEX_OPEN_NODE);
			_treeView.addCanNotDragOutList(INDEX_CLOSED_NODE);
			_treeView.addCanNotDragOutList(INDEX_LEAF);
			_treeView.addCanNotDragOutList(INDEX_LEAF_INVALID);

			_treeView.makeLabelEditable(false);
			_treeView.display();

            return TRUE;
        }

		case WM_MOUSEMOVE:
			if (_treeView.isDragging())
				_treeView.dragItem(_hSelf, LOWORD(lParam), HIWORD(lParam));
			break;
		case WM_LBUTTONUP:
			if (_treeView.isDragging())
				if (_treeView.dropItem())
				{
				
				}
			break;

		case WM_NOTIFY:
		{
			notified((LPNMHDR)lParam);
		}
		return TRUE;

        case WM_SIZE:
        {
            int width = LOWORD(lParam);
            int height = HIWORD(lParam);

			HWND hwnd = _treeView.getHSelf();
			if (hwnd)
				::MoveWindow(hwnd, 0, 0, width, height, TRUE);
            break;
        }

        case WM_CONTEXTMENU:
			if (!_treeView.isDragging())
				showContextMenu(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
        return TRUE;

		case WM_COMMAND:
		{
			popupMenuCmd(LOWORD(wParam));
			break;
		}

		case WM_DESTROY:
        {
			_treeView.destroy();
			destroyMenus();
            break;
        }

		case FB_ADDFILE:
		{
			const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam;
			generic_string separator = TEXT("\\\\");

			size_t sepPos = file2Change[0].find(separator);
			if (sepPos == generic_string::npos)
				return false;

			generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1);

			// remove prefix of file/folder in changeInfo, splite the remained path
			vector<generic_string> linarPathArray = split(pathSuffix, '\\');

			generic_string rootPath = file2Change[0].substr(0, sepPos);
			generic_string path = rootPath;

			generic_string addedFilePath = file2Change[0].substr(0, sepPos + 1);
			addedFilePath += pathSuffix;
			bool isAdded = addInTree(rootPath, addedFilePath, nullptr, linarPathArray);
			if (not isAdded)
			{
				//MessageBox(NULL, addedFilePath.c_str(), TEXT("file/folder is not added"), MB_OK);
			}
			break;
		}

		case FB_RMFILE:
		{
			const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam;
			generic_string separator = TEXT("\\\\");

			size_t sepPos = file2Change[0].find(separator);
			if (sepPos == generic_string::npos)
				return false;

			generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1);

			// remove prefix of file/folder in changeInfo, splite the remained path
			vector<generic_string> linarPathArray = split(pathSuffix, '\\');

			generic_string rootPath = file2Change[0].substr(0, sepPos);
			// search recursively and modify the tree structure

			bool isRemoved = deleteFromTree(rootPath, nullptr, linarPathArray);
			if (not isRemoved)
			{
				//MessageBox(NULL, file2Change[0].c_str(), TEXT("file/folder is not removed"), MB_OK);
			}
			break;
		}

		case FB_RNFILE:
		{
			const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam;
			generic_string separator = TEXT("\\\\");

			size_t sepPos = file2Change[0].find(separator);
			if (sepPos == generic_string::npos)
				return false;

			generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1);

			// remove prefix of file/folder in changeInfo, splite the remained path
			vector<generic_string> linarPathArray = split(pathSuffix, '\\');

			generic_string rootPath = file2Change[0].substr(0, sepPos);

			size_t sepPos2 = file2Change[1].find(separator);
			if (sepPos2 == generic_string::npos)
				return false;

			generic_string pathSuffix2 = file2Change[1].substr(sepPos2 + separator.length(), file2Change[1].length() - 1);
			vector<generic_string> linarPathArray2 = split(pathSuffix2, '\\');

			bool isRenamed = renameInTree(rootPath, nullptr, linarPathArray, linarPathArray2);
			if (not isRenamed)
			{
				//MessageBox(NULL, file2Change[0].c_str(), TEXT("file/folder is not removed"), MB_OK);
			}
			break;
		}

        default :
            return DockingDlgInterface::run_dlgProc(message, wParam, lParam);
    }
	return DockingDlgInterface::run_dlgProc(message, wParam, lParam);
}