Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 4
0
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;
}