/// <summary>
/// загрузка CUIX если его еще нет в загруженных. проверяет обновление файла. проверяет, что загрузились ленты
/// </summary>
internal static void LoadMenu(string pluginPath, string pluginName)
{
string myCuiName = pluginName + ".cuix";
string myCuiFile = Path.Combine(pluginPath, myCuiName);
if (!File.Exists(myCuiFile))
return;
string mainCuiFile = Application.GetSystemVariable("MENUNAME") + ".cuix";
if (!File.Exists(mainCuiFile)) // бывает и так
return;
CustomizationSection mainCui = new(mainCuiFile);
if (mainCui is null) return;
PartialCuiFileCollection partialFiles = mainCui.PartialCuiFiles;
if (partialFiles.Contains(myCuiName)) //мой Cuix уже загружен
{
// проверим, что мой новейший cuix скопирован из папки плагина в папку support
FileInfo myInf = new(myCuiFile);
FileInfo mainInf = new(mainCuiFile);
if (myInf.LastWriteTime > mainInf.LastWriteTime) // не 100% гарантия, но на практике можно и так проверить
{
mainCui.RemovePartialMenu(myCuiName, pluginName); // выгрузка, чтоб потом сразу опять загрузить
if (mainCui.IsModified) mainCui.Save();
}
else // с версией все хорошо, но проверим еще, что видны ленты или ленточные панели из моего cuix
{
//if ((Int16)Application.GetSystemVariable("RIBBONSTATE") == 0) return; всегда 0 если вызывать из InitializationPlugin
string wsname = (string)Application.GetSystemVariable("WSCURRENT");
if (IsNullOrEmpty(wsname)) return;
Workspace ws = mainCui.getWorkspace(wsname);
HashSet<string> paneles = AllRibbonPanels(ws.WorkspaceRibbonRoot); // все панели всех лент главного CUI
CustomizationSection myCui = new(myCuiFile);
RibbonRoot root = myCui.MenuGroup?.RibbonRoot;
if (root is null) return;
bool loaded = false;
foreach (RibbonTabSource myTab in root.RibbonTabSources)
{
//if (cs.LookupElement(myTab.ElementID) is not null) // так не работает - ElementID меняется при подключении к главному cui
//{ loaded = true; break; }
if (ws.WorkspaceRibbonRoot.FindTabReference(myCui.MenuGroup.Name, myTab.ElementID) is not null)
{ loaded = true; break; } // нашли одну из лент из моего cuix
foreach (RibbonPanelSourceReference panel in myTab.Items)
if (paneles.Contains(myCui.MenuGroup.Name + '.' + panel.PanelId)) // панели из частичного cui имеют составные Id
{ loaded = true; break; }
if (loaded) break; // нашли одну из панелей из моего cuix на ленте Add-ins
}
if (!loaded) // cuix загрузился, но панели в текущем пространстве не подключились
{
mainCui.RemovePartialMenu(myCuiName, pluginName);
if (mainCui.IsModified) mainCui.Save();
}
else
return;
}
}
// мой cuix не загружен или пришлось выгрузить
if (mainCui.AddPartialMenu(myCuiFile))
{
if (mainCui.IsModified)
{
mainCui.Save();
Application.ReloadAllMenus();
}
}
}
/// <summary>
/// Идентификаторы всех панелей всех лент
/// </summary>
static HashSet<string> AllRibbonPanels(WSRibbonRoot root)
{
HashSet<string> ret = new();
if (root is not null)
foreach (WSRibbonTabSourceReference tab in root.WorkspaceTabs)
foreach (WSRibbonPanelSourceReference panel in tab.Panels)
if (!ret.Contains(panel.PanelId))
ret.Add(panel.PanelId);
return ret;
}