/* ==============================================================================
* 功能描述:RevitRibbon生成操作
* 创 建 者:Garrett
* 创建日期:2018/9/17 18:01:44
* ==============================================================================*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using Autodesk.Revit.UI;
using Autodesk.Windows;
using SAGA.RevitUtils;
using RibbonItem = Autodesk.Revit.UI.RibbonItem;
using RibbonPanel = Autodesk.Revit.UI.RibbonPanel;
namespace SAGA.RevitMenu.Configuration
{
///
/// RevitRibbonOperate
///
class RevitRibbonOperate
{
///
/// 创建菜单
///
///
///
///
public static bool ApplyConfigTabs(UIControlledApplication app, TszTabData[] configTabs)
{
int index = 0;
if (!AddSignToTab(configTabs))
return false;
for (int j = 0; j < configTabs.Length; j++)
{
if (j == 18)
{
//经测试,最多为20个,为保险暂保留15个。
MessageShow.Infomation("菜单Tab页签项过多,只加载了18个Tab页签。");
break;
}
#region 创建RibbonTab 前后加【】
TszTabData tabData = configTabs[j];
//没有可用button不创建
if (!tabData.HasVisibleItem())
continue;
List listRibPanel;
try
{//获取自定义Tab下的Panel,如果Tab不存在,抛出异常
listRibPanel = app.GetRibbonPanels(tabData.TabName);
}
catch (Exception e)
{
app.CreateRibbonTab(tabData.TabName);
listRibPanel = new List();
}
#endregion
foreach (TszPanelData panelData in tabData.Panels)
{
#region 创建RibbonPanel
bool blnExist = panelData.ValidateData();
if (!blnExist||!panelData.HasVisibleItem())
{
continue;
}
var rvtRibbonPanel = listRibPanel.Find(p => p.Name == panelData.PanelName);
List listPanelItem = new List();
if (rvtRibbonPanel == null)
{
rvtRibbonPanel = app.CreateRibbonPanel(tabData.TabName, panelData.PanelName);
rvtRibbonPanel.Visible = panelData.Visible;
}
else
{
listPanelItem = rvtRibbonPanel.GetItems().ToList();
}
#endregion
//分割符数据
RibbonItem separatorBeforeVisibleItem = null;//分割符之前的可见Button
bool separatorStandBy = false;//准备放置分割符
Action setRibbonItemVisibleAction = (t, b) =>
{
t.Visible = b;
if (b)
separatorBeforeVisibleItem = t;
};
PulldownButton pulldownButton = null;
List> stackButtonDatas = new List>();
IList ribbonItems = null;
for (int i = 0; i < panelData.Buttons.Count; i++)
{
bool isLast = false;
#region 按钮
TszButtonData tszbuttonData = panelData.Buttons[i];
tszbuttonData.ButtonText = tszbuttonData.ButtonText?.Replace(" ", Environment.NewLine);
//不加载名为NEWTEXTBUTTON的按钮(该按钮在Panel为空时仅为找TabName用,自行在XML中添加) wxy 2017-4-18
if (tszbuttonData.ButtonText == "NEWTEXTBUTTON")
continue;
//RibbonPalel中不允许同名Button
if (listPanelItem.Exists(p => p.Name == tszbuttonData.ButtonName))
{
continue;
}
PushButtonData pushbuttonData = null;
PushButton pushButton = null;
//加载Stack排列类型的命令
#region 添加Stack Button
PlaceStackStart:
if (stackButtonDatas.Count > 0 && tszbuttonData.Styles != ButtonStyles.Stacked || isLast)
{
if (stackButtonDatas.Count >= 3)
{
ribbonItems = rvtRibbonPanel.AddStackedItems(stackButtonDatas[0].Item1, stackButtonDatas[1].Item1, stackButtonDatas[2].Item1);
SetStackItemsVisible(ribbonItems, stackButtonDatas);
stackButtonDatas.RemoveRange(0, 3);
goto PlaceStackStart;
}
if (stackButtonDatas.Count == 2)
{
ribbonItems = rvtRibbonPanel.AddStackedItems(stackButtonDatas[0].Item1, stackButtonDatas[1].Item1);
SetStackItemsVisible(ribbonItems, stackButtonDatas);
}
else if (stackButtonDatas.Count == 1)
{
pushButton = rvtRibbonPanel.AddItem(stackButtonDatas[0].Item1) as PushButton;
setRibbonItemVisibleAction(pushButton, stackButtonDatas[0].Item2);
}
stackButtonDatas.Clear();
if (isLast)
continue;
}
#endregion
//创建分割符。分割符创建条件,1,分割符之前有可见Button,2,在分割符之后的下一个可见Button之前创建分割符
if (separatorStandBy && tszbuttonData.Visible)
{
rvtRibbonPanel.AddSeparator();
separatorBeforeVisibleItem = null;
separatorStandBy = false;
}
//创建pullButton
if (tszbuttonData.Styles != ButtonStyles.Separator)
{
pushbuttonData = new PushButtonData(tszbuttonData.ButtonName, tszbuttonData.ButtonText,
tszbuttonData.AssemblyName, tszbuttonData.ClassName);
if (!string.IsNullOrEmpty(tszbuttonData.ImageName))
{
var stringImagePath = tszbuttonData.ImageName + "16.png";
var stringLargeImagePath = tszbuttonData.ImageName + ".png";
if (File.Exists(stringImagePath))
{
pushbuttonData.Image = new BitmapImage(new Uri(stringImagePath));
}
if (File.Exists(stringLargeImagePath))
{
pushbuttonData.LargeImage = new BitmapImage(new Uri(stringLargeImagePath));
}
}
pushbuttonData.ToolTip = tszbuttonData.ToolTip;
pushbuttonData.LongDescription = tszbuttonData.LongDescription;
pushbuttonData.AvailabilityClassName = tszbuttonData.ClassName;
}
//加载图标并且将Button添加到菜单
switch (tszbuttonData.Styles)
{
case ButtonStyles.Separator:
if (separatorBeforeVisibleItem != null)
separatorStandBy = true;
//rvtRibbonPanel.AddSeparator();
break;
case ButtonStyles.Large:
pushButton = rvtRibbonPanel.AddItem(pushbuttonData) as PushButton;
setRibbonItemVisibleAction(pushButton, tszbuttonData.Visible);
break;
case ButtonStyles.Pushdown:
if (pulldownButton == null || pulldownButton.Visible == false)
{
SplitButtonData spliteButtonData = new SplitButtonData("push" + panelData.PanelName + i, panelData.PanelName);
spliteButtonData.Text = pushbuttonData.Text;
spliteButtonData.LargeImage = pushbuttonData.LargeImage;
spliteButtonData.ToolTip = tszbuttonData.ToolTip;
spliteButtonData.LongDescription = tszbuttonData.LongDescription;
pulldownButton = rvtRibbonPanel.AddItem(spliteButtonData) as PulldownButton;
pulldownButton.Visible = tszbuttonData.Visible;
setRibbonItemVisibleAction(pulldownButton, tszbuttonData.Visible);
}
pushButton = pulldownButton?.AddPushButton(pushbuttonData);
setRibbonItemVisibleAction(pushButton, tszbuttonData.Visible);
break;
case ButtonStyles.Stacked:
case ButtonStyles.StackedBox:
stackButtonDatas.Add(new Tuple(pushbuttonData, tszbuttonData.Visible));
break;
}
//最后一项,并且是Stacked ,跳转到添加Stacked
isLast = panelData.Buttons.Count - 1 == i;
if (isLast&&stackButtonDatas.Count>0)
goto PlaceStackStart;
#endregion
}
}
////调整选项卡到最前
RibbonTab tab = ComponentManager.Ribbon.Tabs.FirstOrDefault(t => t.Name == tabData.TabName);
if (tab != null)
{
ComponentManager.Ribbon.Tabs.Remove(tab);
ComponentManager.Ribbon.Tabs.Insert(index, tab);
index++;
}
}
return true;
}
///
/// Tab前后加【】
///
///
///
private static bool AddSignToTab(TszTabData[] configTabs)
{
var firstVisibleTabItem = configTabs.FirstOrDefault(t => t.HasVisibleItem());
//如果都不可见,直接返回,不创建了
if (firstVisibleTabItem == null) return false;
firstVisibleTabItem.TabName = "【"+ firstVisibleTabItem.TabName;
var lastVisibleTabItem = configTabs.LastOrDefault(t => t.HasVisibleItem());
if (lastVisibleTabItem == null) return false;
lastVisibleTabItem.TabName += "】";
return true;
}
///
/// 设置StackButton的可见性
///
///
///
private static void SetStackItemsVisible(IList ribbonItems, List> stackButtonDatas)
{
int i = 0;
foreach (RibbonItem ribbonItem in ribbonItems)
{
var tuple = stackButtonDatas[i];
ribbonItem.Visible = tuple.Item2;
i++;
}
}
}
}