📄 plugin.cpp
字号:
// { kpidType, L"Type" }
};
static const int kNumPropertyIDInfos = sizeof(kPropertyIDInfos) /
sizeof(kPropertyIDInfos[0]);
static int FindPropertyInfo(PROPID propID)
{
for(int i = 0; i < kNumPropertyIDInfos; i++)
if(kPropertyIDInfos[i].PropID == propID)
return i;
return -1;
}
*/
// char *g_Titles[] = { "a", "f", "v" };
static void SmartAddToString(AString &aDestString, const char *aSrcString)
{
if (!aDestString.IsEmpty())
aDestString += ',';
aDestString += aSrcString;
}
/*
void CPlugin::AddColumn(PROPID propID)
{
int index = FindPropertyInfo(propID);
if (index >= 0)
{
for(int i = 0; i < m_ProxyHandler->m_InternalProperties.Size(); i++)
{
const CArchiveItemProperty &aHandlerProperty = m_ProxyHandler->m_InternalProperties[i];
if (aHandlerProperty.ID == propID)
break;
}
if (i == m_ProxyHandler->m_InternalProperties.Size())
return;
const CPropertyIDInfo &aPropertyIDInfo = kPropertyIDInfos[index];
SmartAddToString(PanelModeColumnTypes, aPropertyIDInfo.FarID);
char aTmp[32];
itoa(aPropertyIDInfo.Width, aTmp, 10);
SmartAddToString(PanelModeColumnWidths, aTmp);
return;
}
}
*/
void CPlugin::GetOpenPluginInfo(struct OpenPluginInfo *info)
{
info->StructSize = sizeof(*info);
info->Flags = OPIF_USEFILTER | OPIF_USESORTGROUPS| OPIF_USEHIGHLIGHTING|
OPIF_ADDDOTS | OPIF_COMPAREFATTIME;
UINT codePage = ::AreFileApisANSI() ? CP_ACP : CP_OEMCP;
strcpy(m_FileNameBuffer, UnicodeStringToMultiByte(m_FileName, codePage));
info->HostFile = m_FileNameBuffer; // test it it is not static
strcpy(m_CurrentDirBuffer, UnicodeStringToMultiByte(m_CurrentDir, CP_OEMCP));
info->CurDir = m_CurrentDirBuffer;
info->Format = kPluginFormatName;
UString name;
{
UString fullName;
int index;
NFile::NDirectory::MyGetFullPathName(m_FileName, fullName, index);
name = fullName.Mid(index);
}
m_PannelTitle =
UString(L' ') +
_archiveTypeName +
UString(L':') +
name +
UString(L' ');
if(!m_CurrentDir.IsEmpty())
{
// m_PannelTitle += '\\';
m_PannelTitle += m_CurrentDir;
}
strcpy(m_PannelTitleBuffer, UnicodeStringToMultiByte(m_PannelTitle, CP_OEMCP));
info->PanelTitle = m_PannelTitleBuffer;
memset(m_InfoLines,0,sizeof(m_InfoLines));
strcpy(m_InfoLines[0].Text,"");
m_InfoLines[0].Separator = TRUE;
strcpy(m_InfoLines[1].Text, g_StartupInfo.GetMsgString(NMessageID::kArchiveType));
strcpy(m_InfoLines[1].Data, UnicodeStringToMultiByte(_archiveTypeName, CP_OEMCP));
int numItems = 2;
UINT32 numProps;
if (m_ArchiveHandler->GetNumberOfArchiveProperties(&numProps) == S_OK)
{
for (UINT32 i = 0; i < numProps && numItems < 30; i++)
{
CMyComBSTR name;
PROPID propID;
VARTYPE vt;
if (m_ArchiveHandler->GetArchivePropertyInfo(i, &name, &propID, &vt) != S_OK)
continue;
InfoPanelLine &item = m_InfoLines[numItems];
int index = FindPropertyToName(propID);
if (index < 0)
{
if (name != 0)
strcpy(item.Text, UnicodeStringToMultiByte(
(const wchar_t *)name, CP_OEMCP));
else
strcpy(item.Text, "");
}
else
strcpy(item.Text, g_StartupInfo.GetMsgString(kPROPIDToName[index].PluginID));
NCOM::CPropVariant propVariant;
if (m_ArchiveHandler->GetArchiveProperty(propID, &propVariant) != S_OK)
continue;
CSysString s = ConvertPropertyToString2(propVariant, propID);
strcpy(item.Data, s);
numItems++;
}
}
//m_InfoLines[1].Separator = 0;
info->InfoLines = m_InfoLines;
info->InfoLinesNumber = numItems;
info->DescrFiles = NULL;
info->DescrFilesNumber = 0;
PanelModeColumnTypes.Empty();
PanelModeColumnWidths.Empty();
/*
AddColumn(kpidName);
AddColumn(kpidSize);
AddColumn(kpidPackedSize);
AddColumn(kpidLastWriteTime);
AddColumn(kpidCreationTime);
AddColumn(kpidLastAccessTime);
AddColumn(kpidAttributes);
PanelMode.ColumnTypes = (char *)(const char *)PanelModeColumnTypes;
PanelMode.ColumnWidths = (char *)(const char *)PanelModeColumnWidths;
PanelMode.ColumnTitles = NULL;
PanelMode.FullScreen = TRUE;
PanelMode.DetailedStatus = FALSE;
PanelMode.AlignExtensions = FALSE;
PanelMode.CaseConversion = FALSE;
PanelMode.StatusColumnTypes = "N";
PanelMode.StatusColumnWidths = "0";
PanelMode.Reserved[0] = 0;
PanelMode.Reserved[1] = 0;
info->PanelModesArray = &PanelMode;
info->PanelModesNumber = 1;
*/
info->PanelModesArray = NULL;
info->PanelModesNumber = 0;
info->StartPanelMode = 0;
info->StartSortMode = 0;
info->KeyBar = NULL;
info->ShortcutData = NULL;
}
struct CArchiveItemProperty
{
AString Name;
PROPID ID;
VARTYPE Type;
};
HRESULT CPlugin::ShowAttributesWindow()
{
PluginPanelItem pluginPanelItem;
if (!g_StartupInfo.ControlGetActivePanelCurrentItemInfo(pluginPanelItem))
return S_FALSE;
if (strcmp(pluginPanelItem.FindData.cFileName, "..") == 0 &&
NFile::NFind::NAttributes::IsDirectory(pluginPanelItem.FindData.dwFileAttributes))
return S_FALSE;
int itemIndex = pluginPanelItem.UserData;
CObjectVector<CArchiveItemProperty> properties;
UINT32 numProps;
RINOK(m_ArchiveHandler->GetNumberOfProperties(&numProps));
int i;
for (i = 0; i < (int)numProps; i++)
{
CMyComBSTR name;
PROPID propID;
VARTYPE vt;
RINOK(m_ArchiveHandler->GetPropertyInfo(i, &name, &propID, &vt));
CArchiveItemProperty destProperty;
destProperty.Type = vt;
destProperty.ID = propID;
if (destProperty.ID == kpidPath)
destProperty.ID = kpidName;
AString propName;
{
if (name != NULL)
destProperty.Name = UnicodeStringToMultiByte(
(const wchar_t *)name, CP_OEMCP);
else
destProperty.Name = "Error";
}
properties.Add(destProperty);
}
/*
LPCITEMIDLIST aProperties;
if (index < m_FolderItem->m_DirSubItems.Size())
{
const CArchiveFolderItem &anItem = m_FolderItem->m_DirSubItems[index];
aProperties = anItem.m_Properties;
}
else
{
const CArchiveFolderFileItem &anItem =
m_FolderItem->m_FileSubItems[index - m_FolderItem->m_DirSubItems.Size()];
aProperties = anItem.m_Properties;
}
*/
const int kPathIndex = 2;
const int kOkButtonIndex = 4;
int size = 2;
CRecordVector<CInitDialogItem> initDialogItems;
int xSize = 70;
CInitDialogItem initDialogItem =
{ DI_DOUBLEBOX, 3, 1, xSize - 4, size - 2, false, false, 0, false, NMessageID::kProperties, NULL, NULL };
initDialogItems.Add(initDialogItem);
AStringVector aValues;
for (i = 0; i < properties.Size(); i++)
{
const CArchiveItemProperty &property = properties[i];
CInitDialogItem initDialogItem =
{ DI_TEXT, 5, 3 + i, 0, 0, false, false, 0, false, 0, NULL, NULL };
int index = FindPropertyToName(property.ID);
if (index < 0)
{
initDialogItem.DataMessageId = -1;
initDialogItem.DataString = property.Name;
}
else
initDialogItem.DataMessageId = kPROPIDToName[index].PluginID;
initDialogItems.Add(initDialogItem);
NCOM::CPropVariant propVariant;
RINOK(_folder->GetProperty(itemIndex,
property.ID, &propVariant));
CSysString aString = ConvertPropertyToString2(propVariant, property.ID);
aValues.Add(aString);
{
CInitDialogItem initDialogItem =
{ DI_TEXT, 30, 3 + i, 0, 0, false, false, 0, false, -1, NULL, NULL };
initDialogItems.Add(initDialogItem);
}
}
int numLines = aValues.Size();
for(i = 0; i < numLines; i++)
{
CInitDialogItem &initDialogItem = initDialogItems[1 + i * 2 + 1];
initDialogItem.DataString = aValues[i];
}
int numDialogItems = initDialogItems.Size();
CRecordVector<FarDialogItem> dialogItems;
dialogItems.Reserve(numDialogItems);
for(i = 0; i < numDialogItems; i++)
dialogItems.Add(FarDialogItem());
g_StartupInfo.InitDialogItems(&initDialogItems.Front(),
&dialogItems.Front(), numDialogItems);
int maxLen = 0;
for (i = 0; i < numLines; i++)
{
FarDialogItem &dialogItem = dialogItems[1 + i * 2];
int len = strlen(dialogItem.Data);
if (len > maxLen)
maxLen = len;
}
int maxLen2 = 0;
const int kSpace = 10;
for (i = 0; i < numLines; i++)
{
FarDialogItem &dialogItem = dialogItems[1 + i * 2 + 1];
int len = strlen(dialogItem.Data);
if (len > maxLen2)
maxLen2 = len;
dialogItem.X1 = maxLen + kSpace;
}
size = numLines + 6;
xSize = maxLen + kSpace + maxLen2 + 5;
FarDialogItem &aFirstDialogItem = dialogItems.Front();
aFirstDialogItem.Y2 = size - 2;
aFirstDialogItem.X2 = xSize - 4;
int askCode = g_StartupInfo.ShowDialog(xSize, size, NULL, &dialogItems.Front(), numDialogItems);
return S_OK;
}
int CPlugin::ProcessKey(int aKey, unsigned int controlState)
{
if (controlState == PKF_CONTROL && aKey == 'A')
{
HRESULT result = ShowAttributesWindow();
if (result == S_OK)
return TRUE;
if (result == S_FALSE)
return FALSE;
throw "Error";
}
if ((controlState & PKF_ALT) != 0 && aKey == VK_F6)
{
UString folderPath;
if (!NFile::NDirectory::GetOnlyDirPrefix(m_FileName, folderPath))
return FALSE;
PanelInfo panelInfo;
g_StartupInfo.ControlGetActivePanelInfo(panelInfo);
GetFilesReal(panelInfo.SelectedItems,
panelInfo.SelectedItemsNumber, FALSE,
UnicodeStringToMultiByte(folderPath, CP_OEMCP), OPM_SILENT, true);
g_StartupInfo.Control(this, FCTL_UPDATEPANEL, NULL);
g_StartupInfo.Control(this, FCTL_REDRAWPANEL, NULL);
g_StartupInfo.Control(this, FCTL_UPDATEANOTHERPANEL, NULL);
g_StartupInfo.Control(this, FCTL_REDRAWANOTHERPANEL, NULL);
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -