bool CPlugin::GetFilesFromParams(LPWSTR szCmdLine, LPCWSTR** ppFiles, unsigned* pnFiles, unsigned* pnFolders, auto_sz* pstrCurDir, bool bSkipFirst) { int Size=(int)PanelControl(PANEL_ACTIVE,FCTL_GETPANELDIRECTORY,0,NULL); FarPanelDirectory* dirInfo=(FarPanelDirectory*)new char[Size]; dirInfo->StructSize = sizeof(FarPanelDirectory); PanelControl(PANEL_ACTIVE,FCTL_GETPANELDIRECTORY,Size,dirInfo); *pstrCurDir=auto_sz(dirInfo->Name); delete[](char *)dirInfo; if (pstrCurDir->Len()) { pstrCurDir->Realloc(pstrCurDir->Len()+2); m_fsf.AddEndSlash(*pstrCurDir); } unsigned nCnt=ParseParams(szCmdLine); if (!nCnt) return false; *ppFiles=new LPCWSTR[nCnt]; ParseParams(szCmdLine, *ppFiles); for (unsigned i=bSkipFirst?1:0; i<nCnt; i++) { DWORD dwAttr=GetFileAttributes((*ppFiles)[i]); if (DWORD(-1)!=dwAttr && dwAttr&FILE_ATTRIBUTE_DIRECTORY) (*pnFolders)++; else (*pnFiles)++; } return true; }
HANDLE CPlugin::OpenPlugin(int nOpenFrom, INT_PTR nItem) { LPCWSTR MsgItems[2]={GetMsg(LNG_TITLE)}; bool bSuccess=false; switch (OleThread::OpenPlugin(nOpenFrom, nItem)) { case DOMNU_ERR_DIFFERENT_FOLDERS: { MsgItems[1]=GetMsg(LNG_ERR_DIFFERENT_FOLDERS); Message(FMSG_WARNING|FMSG_MB_OK, g_szTopicError0, MsgItems, ARRAYSIZE(MsgItems), 0); } break; case DOMNU_ERR_SHOW: { MsgItems[1]=GetMsg(LNG_ERR_SHOW); Message(FMSG_WARNING|FMSG_MB_OK, g_szTopicError1, MsgItems, ARRAYSIZE(MsgItems), 0); } break; case DOMNU_ERR_INVOKE: { MsgItems[1]=GetMsg(LNG_ERR_INVOKE); Message(FMSG_WARNING|FMSG_MB_OK, g_szTopicError2, MsgItems, ARRAYSIZE(MsgItems), 0); } break; case DOMNU_OK: if (m_WaitToContinue) { MsgItems[1]=GetMsg(LNG_CLOSE); Message(FMSG_MB_OK, g_szTopicClose, MsgItems, ARRAYSIZE(MsgItems), 0); } bSuccess=true; break; case DOMENU_CANCELLED: break; default: assert(0); } if (bSuccess) { if (m_ClearSel && !PanelControl(PANEL_ACTIVE,FCTL_UPDATEPANEL, 0, NULL)) { assert(0); } } return nullptr; }
bool CPluginW2800::GetPanelInfo(GetPanelDirFlags Flags, CEPanelInfo* pInfo) { if (!InfoW2800 || !InfoW2800->PanelControl) return false; HANDLE hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; PanelInfo pasv = {sizeof(pasv)}, actv = {sizeof(actv)}; PanelInfo* p; if (Flags & (gpdf_Left|gpdf_Right)) { InfoW2800->PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &actv); InfoW2800->PanelControl(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, &pasv); PanelInfo* pLeft = (actv.Flags & PFLAGS_PANELLEFT) ? &actv : &pasv; PanelInfo* pRight = (actv.Flags & PFLAGS_PANELLEFT) ? &pasv : &actv; p = (Flags & gpdf_Left) ? pLeft : pRight; hPanel = ((p->Flags & PFLAGS_FOCUS) == PFLAGS_FOCUS) ? PANEL_ACTIVE : PANEL_PASSIVE; } else { hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; InfoW2800->PanelControl(hPanel, FCTL_GETPANELINFO, 0, &actv); p = &actv; } if (Flags & ppdf_GetItems) { static PanelInfo store; store = *p; pInfo->panelInfo = &store; } else { pInfo->panelInfo = NULL; } pInfo->bVisible = ((p->Flags & PFLAGS_VISIBLE) == PFLAGS_VISIBLE); pInfo->bFocused = ((p->Flags & PFLAGS_FOCUS) == PFLAGS_FOCUS); pInfo->bPlugin = ((p->Flags & PFLAGS_PLUGIN) == PFLAGS_PLUGIN); pInfo->nPanelType = (int)p->PanelType; pInfo->rcPanelRect = p->PanelRect; pInfo->ItemsNumber = p->ItemsNumber; pInfo->SelectedItemsNumber = p->SelectedItemsNumber; pInfo->CurrentItem = p->CurrentItem; if ((Flags & gpdf_NoHidden) && !pInfo->bVisible) return false; if (pInfo->szCurDir) { GetPanelDir(pInfo->bFocused ? gpdf_Active : gpdf_Passive, pInfo->szCurDir, BkPanelInfo_CurDirMax); } if (pInfo->bPlugin) { if (pInfo->szFormat) { PanelControl(hPanel, FCTL_GETPANELFORMAT, BkPanelInfo_FormatMax, pInfo->szFormat); // Если "Формат" панели получить не удалось - попробуем взять "префикс" плагина if (!*pInfo->szFormat) PanelControl(hPanel, FCTL_GETPANELPREFIX, BkPanelInfo_FormatMax, pInfo->szFormat); } if (pInfo->szHostFile) { PanelControl(hPanel, FCTL_GETPANELHOSTFILE, BkPanelInfo_HostFileMax, pInfo->szHostFile); } } else { if (pInfo->szFormat) pInfo->szFormat[0] = 0; if (pInfo->szHostFile) pInfo->szHostFile[0] = 0; } return true; }
bool CPlugin::GetFilesFromPanel(LPCWSTR** ppFiles, unsigned* pnFiles, unsigned* pnFolders, auto_sz* pstrCurDir) { if(SelectedItems && SelectedItemsCount) { for(int i=0;i<SelectedItemsCount;i++) if(SelectedItems[i]) delete[](char *)SelectedItems[i]; delete[] SelectedItems; SelectedItems=NULL; SelectedItemsCount=0; } PanelInfo pi = {sizeof(PanelInfo)}; if (!PanelControl(PANEL_ACTIVE,FCTL_GETPANELINFO,0,&pi)) { return false; } int Size=(int)PanelControl(PANEL_ACTIVE,FCTL_GETPANELDIRECTORY,0,NULL); FarPanelDirectory* dirInfo=(FarPanelDirectory*)new char[Size]; dirInfo->StructSize = sizeof(FarPanelDirectory); PanelControl(PANEL_ACTIVE,FCTL_GETPANELDIRECTORY,Size,dirInfo); // preserve space for AddEndSlash *pstrCurDir=auto_sz(dirInfo->Name); delete[](char *)dirInfo; bool Root=!pi.SelectedItemsNumber; if(!Root) { size_t Size=PanelControl(PANEL_ACTIVE,FCTL_GETSELECTEDPANELITEM,0,NULL); if(Size) { PluginPanelItem *PPI=(PluginPanelItem*)new char[Size]; if(PPI) { FarGetPluginPanelItem gpi={sizeof(FarGetPluginPanelItem), Size, PPI}; PanelControl(PANEL_ACTIVE,FCTL_GETSELECTEDPANELITEM,0,&gpi); Root=(pi.SelectedItemsNumber==1 && !lstrcmp(PPI->FileName,L"..")); delete[](char *)PPI; } } } if(Root) { *pnFolders=1; LPCWSTR szFName=m_fsf.PointToName(*pstrCurDir); if (*szFName==L'\0') { // это бывает для дисков (c:, c:\) szFName=*pstrCurDir; } static wchar_t szFNameTmp[1024]; lstrcpy(szFNameTmp,szFName); (*ppFiles)=new LPCWSTR[1]; (*ppFiles)[0]=szFNameTmp; pstrCurDir->Trunc(szFName-pstrCurDir->operator LPCWSTR()); } else { if (pstrCurDir->Len()) { pstrCurDir->Realloc(pstrCurDir->Len()+2); m_fsf.AddEndSlash(*pstrCurDir); } *ppFiles=new LPCWSTR[pi.SelectedItemsNumber]; SelectedItemsCount=(int)pi.SelectedItemsNumber; SelectedItems=new PluginPanelItem*[SelectedItemsCount]; for (size_t i=0; i<pi.SelectedItemsNumber; i++) { size_t SelSize = PanelControl(PANEL_ACTIVE,FCTL_GETSELECTEDPANELITEM,(int)i,NULL); SelectedItems[i]=(PluginPanelItem*)new char[SelSize]; FarGetPluginPanelItem sgpi={sizeof(FarGetPluginPanelItem), SelSize, SelectedItems[i]}; PanelControl(PANEL_ACTIVE,FCTL_GETSELECTEDPANELITEM,(int)i,&sgpi); LPCWSTR szPath=SelectedItems[i]->FileName; size_t Size = PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,(int)pi.CurrentItem,NULL); PluginPanelItem *PPI=(PluginPanelItem*)new char[Size]; FarGetPluginPanelItem gpi={sizeof(FarGetPluginPanelItem), Size, PPI}; PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,(int)pi.CurrentItem,&gpi); bool Equal=!lstrcmp(PPI->FileName,szPath); delete[](char *)PPI; if(Equal) { (*ppFiles)[i]=(*ppFiles)[0]; (*ppFiles)[0]=szPath; } else { (*ppFiles)[i]=szPath; } if (FILE_ATTRIBUTE_DIRECTORY&SelectedItems[i]->FileAttributes) { (*pnFolders)++; } else { (*pnFiles)++; } } } return true; }// CurDir
bool CPluginW995::GetPanelInfo(GetPanelDirFlags Flags, CEPanelInfo* pInfo) { if (!InfoW995 || !InfoW995->Control) return false; _ASSERTE(gFarVersion.dwBuild >= 1657); HANDLE hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; PanelInfo pasv = {}, actv = {}; PanelInfo* p; if (Flags & (gpdf_Left|gpdf_Right)) { InfoW995->Control(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, (LONG_PTR)&actv); InfoW995->Control(PANEL_PASSIVE, FCTL_GETPANELINFO, 0, (LONG_PTR)&pasv); PanelInfo* pLeft = (actv.Flags & PFLAGS_PANELLEFT) ? &actv : &pasv; PanelInfo* pRight = (actv.Flags & PFLAGS_PANELLEFT) ? &pasv : &actv; p = (Flags & gpdf_Left) ? pLeft : pRight; hPanel = (p->Focus) ? PANEL_ACTIVE : PANEL_PASSIVE; } else { hPanel = (Flags & gpdf_Active) ? PANEL_ACTIVE : PANEL_PASSIVE; InfoW995->Control(hPanel, FCTL_GETPANELINFO, 0, (LONG_PTR)&actv); p = &actv; } if (Flags & ppdf_GetItems) { static PanelInfo store; store = *p; pInfo->panelInfo = &store; } else { pInfo->panelInfo = NULL; } pInfo->bVisible = p->Visible; pInfo->bFocused = p->Focus; pInfo->bPlugin = p->Plugin; pInfo->nPanelType = p->PanelType; pInfo->rcPanelRect = p->PanelRect; pInfo->ItemsNumber = p->ItemsNumber; pInfo->SelectedItemsNumber = p->SelectedItemsNumber; pInfo->CurrentItem = p->CurrentItem; if ((Flags & gpdf_NoHidden) && !pInfo->bVisible) return false; if (pInfo->szCurDir) { GetPanelDir(pInfo->bFocused ? gpdf_Active : gpdf_Passive, pInfo->szCurDir, BkPanelInfo_CurDirMax); } if (pInfo->bPlugin) { if (pInfo->szFormat) PanelControl(hPanel, FCTL_GETPANELFORMAT, BkPanelInfo_FormatMax, pInfo->szFormat); if (pInfo->szHostFile) PanelControl(hPanel, FCTL_GETPANELHOSTFILE, BkPanelInfo_HostFileMax, pInfo->szHostFile); } else { if (pInfo->szFormat) pInfo->szFormat[0] = 0; if (pInfo->szHostFile) pInfo->szHostFile[0] = 0; } return true; }