csharp
复制代码
using EA;
using EA_AutoModeler_64.Class;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using static EA_AutoModeler_64.FormStatusStatistics;
using static EA_AutoModeler_64.OpenAIClient.tables.ClassStructOpenAI;
namespace EA_AutoModeler_64.Template.UcTab
{
public partial class UcTabWindow : UserControl
{
private SplitContainer splitContainer1;
private SplitContainer splitContainer2;
private TabControl tabControl1;
private TabPage tabPageWork;
private TabPage tabPageChat;
private TabPage tabPageKnowledge;
//private TabPage tabPageInformation;
private TabPage tabPageModelSkills;
private TabPage tabPageLargeModel;
//private TabPage tabPageFileExplorer;
private UcTabWork ucTabWork;
private UcTabChat ucTabChat;
private UcTabKnowledge ucTabKnowledge;
//private UcTabInformation ucTabInformation;
private UcTabModelSkills ucTabModelSkills;
private UcTabLargeModel ucTabLargeModel;
private FileExplorer fileExplorer;
private Button btnToggleExplorer; // 新增
private EA.Repository repository = null;
private string tabTitle = "";
public string chat_id = "";
public EA.Element currentElement = null;
public EA.Package currentPackage = null;
// 在类中添加新字段(与原有字段一起声明)
private bool isFileExplorerExpanded = true;
private int expandedPanel1Width = 200; // 存储展开状态时 Panel1 的宽度
private int COLLAPSED_PANEL2_WIDTH = 12; // 折叠时 Panel2 显示边缘条的宽度
public UcTabWindow()
{
InitializeComponent();
try
{
InitializeControls();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("初始化控件失败: " + ex.Message);
}
}
private void InitializeControls()
{
// 根据当前字体大小计算,但限制在 12~16 之间
int fontSize = (int)this.Font.Size;
COLLAPSED_PANEL2_WIDTH = Math.Max(12, Math.Min(16, (int)(fontSize * 1.2)));
// 创建SplitContainer
splitContainer1 = new SplitContainer();
splitContainer1.Dock = DockStyle.Fill;
splitContainer1.FixedPanel = FixedPanel.Panel1;
// 暂时将最小尺寸设置为0,避免初始化验证错误
splitContainer1.Panel1MinSize = 0;
splitContainer1.Panel2MinSize = 0;
splitContainer1.SplitterDistance = 200;
// 创建SplitContainer
splitContainer2 = new SplitContainer();
splitContainer2.Dock = DockStyle.Fill;
splitContainer2.FixedPanel = FixedPanel.Panel1;
// 暂时将最小尺寸设置为0,避免初始化验证错误
splitContainer2.Panel1MinSize = 0;
splitContainer2.Panel2MinSize = 0;
splitContainer2.SplitterDistance = 200;
// 创建TabControl
tabControl1 = new TabControl();
tabControl1.Dock = DockStyle.Fill;
// 创建TabPage
tabPageWork = new TabPage("工作");
tabPageChat = new TabPage("会话记录");
tabPageKnowledge = new TabPage("知识库");
//tabPageInformation = new TabPage("资料库");
tabPageModelSkills = new TabPage("技能库");
tabPageLargeModel = new TabPage("大模型");
// 添加TabPage到TabControl
tabControl1.TabPages.Add(tabPageWork);
tabControl1.TabPages.Add(tabPageChat);
tabControl1.TabPages.Add(tabPageKnowledge);
//tabControl1.TabPages.Add(tabPageInformation);
tabControl1.TabPages.Add(tabPageModelSkills);
tabControl1.TabPages.Add(tabPageLargeModel);
// 创建各个Tab页的用户控件
try
{
ucTabWork = new UcTabWork();
// 然后再添加到Tab页
ucTabWork.Dock = DockStyle.Fill;
tabPageWork.Controls.Add(ucTabWork);
}
catch (Exception ex)
{
AppLog.Error("UcTabWindow InitializeControls ucTabWork: " + ex.Message);
}
try
{
ucTabChat = new UcTabChat();
ucTabChat.Dock = DockStyle.Fill;
tabPageChat.Controls.Add(ucTabChat);
}
catch (Exception ex)
{
AppLog.Error("UcTabWindow InitializeControls ucTabChat: " + ex.Message);
}
try
{
ucTabKnowledge = new UcTabKnowledge();
ucTabKnowledge.Dock = DockStyle.Fill;
tabPageKnowledge.Controls.Add(ucTabKnowledge);
}
catch (Exception ex)
{
AppLog.Error("UcTabWindow InitializeControls ucTabKnowledge: " + ex.Message);
}
//try
//{
// ucTabInformation = new UcTabInformation();
// ucTabInformation.Dock = DockStyle.Fill;
// tabPageInformation.Controls.Add(ucTabInformation);
//}
//catch (Exception ex)
//{
// AppLog.Error("UcTabWindow InitializeControls ucTabInformation: " + ex.Message);
//}
try {
ucTabModelSkills = new UcTabModelSkills();
ucTabModelSkills.Dock = DockStyle.Fill;
tabPageModelSkills.Controls.Add(ucTabModelSkills);
}
catch (Exception ex)
{
AppLog.Error("UcTabWindow InitializeControls ucTabModelSkills: " + ex.Message);
}
try
{
ucTabLargeModel = new UcTabLargeModel();
ucTabLargeModel.Dock = DockStyle.Fill;
tabPageLargeModel.Controls.Add(ucTabLargeModel);
}
catch (Exception ex)
{
AppLog.Error("UcTabWindow InitializeControls ucTabLargeModel: " + ex.Message);
}
// 创建 splitContainer2 (垂直左右分割)
splitContainer2 = new SplitContainer();
splitContainer2.Dock = DockStyle.Fill;
splitContainer2.Orientation = Orientation.Vertical; // 明确左右分割
splitContainer2.FixedPanel = FixedPanel.Panel1; // 固定 Panel1(TabControl),Panel2 自适应
splitContainer2.Panel1MinSize = 0;
splitContainer2.Panel2MinSize = COLLAPSED_PANEL2_WIDTH;
splitContainer2.SplitterDistance = 200; // 初始 Panel1 宽度
// 记录展开时的 Panel1 宽度
expandedPanel1Width = splitContainer2.SplitterDistance;
// 将 TabControl 放入 Panel1
splitContainer2.Panel1.Controls.Add(tabControl1);
// 创建边缘条(Panel2 中的左侧固定条)
Panel edgePanel = new Panel
{
Width = COLLAPSED_PANEL2_WIDTH,
Dock = DockStyle.Left,
BackColor = SystemColors.ControlDark,
Cursor = Cursors.Hand,
BorderStyle = BorderStyle.None
};
btnToggleExplorer = new Button
{
Text = "▶", // 初始为展开状态,箭头指向右侧(表示可折叠)
TextAlign = ContentAlignment.MiddleCenter,
Dock = DockStyle.Fill,
FlatStyle = FlatStyle.Flat, // 改用 Flat 样式
BackColor = SystemColors.Control, // 背景与边缘条一致,进一步融入
Cursor = Cursors.Hand
};
btnToggleExplorer.FlatAppearance.BorderSize = 0;
btnToggleExplorer.Click += (s, e) => ToggleFileExplorer();
edgePanel.Controls.Add(btnToggleExplorer);
// 资源管理器填充 Panel2 剩余区域
fileExplorer = new FileExplorer();
fileExplorer.Location = new Point(edgePanel.Width, 0);
fileExplorer.Dock = DockStyle.None;
fileExplorer.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
fileExplorer.Size = new Size(splitContainer2.Panel2.Width - edgePanel.Width, splitContainer2.Panel2.Height);
// 绑定父窗体的 Resize 事件,动态调整
splitContainer2.Panel2.Resize += (s, e) => {
fileExplorer.Size = new Size(splitContainer2.Panel2.Width - edgePanel.Width, splitContainer2.Panel2.Height);
};
fileExplorer.ParentWindow = this;
fileExplorer.WorkArea = ucTabWork;
// 将边缘条和文件浏览器都添加到 Panel2
splitContainer2.Panel2.Controls.Add(edgePanel);
splitContainer2.Panel2.Controls.Add(fileExplorer);
// 将 splitContainer2 放入 splitContainer1 的右侧面板
splitContainer1.Panel2.Controls.Add(splitContainer2);
// 添加TabControl的SelectedIndexChanged事件处理
tabControl1.SelectedIndexChanged += TabControl1_SelectedIndexChanged;
// 添加SplitContainer到当前控件
this.Controls.Add(splitContainer1);
}
private void UcTabWindow_Load(object sender, EventArgs e)
{
try
{
splitContainer1.Panel1MinSize = 200;
splitContainer1.Panel2MinSize = 300;
splitContainer1.SplitterDistance = Clamp((int)(this.Width * 0.4),
splitContainer1.Panel1MinSize, this.Width - splitContainer1.Panel2MinSize);
// 根据折叠状态设置 splitContainer2 的初始宽度
if (isFileExplorerExpanded)
{
int desired = (int)(this.Width * 0.4);
int max = splitContainer2.Width - splitContainer2.Panel2MinSize - splitContainer2.SplitterWidth;
splitContainer2.SplitterDistance = Clamp(desired, splitContainer2.Panel1MinSize, max);
expandedPanel1Width = splitContainer2.SplitterDistance;
fileExplorer.Visible = true;
btnToggleExplorer.Text = "▶";
}
else
{
// 折叠状态:Panel1 宽度 = 总宽 - 边缘条宽 - 分割条宽
int newPanel1Width = splitContainer2.Width - COLLAPSED_PANEL2_WIDTH - splitContainer2.SplitterWidth;
splitContainer2.SplitterDistance = Math.Max(newPanel1Width, splitContainer2.Panel1MinSize);
fileExplorer.Visible = false;
btnToggleExplorer.Text = "◀";
}
this.SizeChanged += UcTabWindow_SizeChanged;
}
catch (Exception ex)
{
AppLog.Error("UcTabWindow_Load Exception: " + ex.Message);
}
}
//private void UcTabWindow_SizeChanged(object sender, EventArgs e)
//{
// // 在SizeChanged事件中重新计算SplitterDistance
// try
// {
// // 设置SplitterDistance,确保在有效范围内
// if (this.Width > 0)
// {
// int maxSplitterDistance = this.Width - splitContainer1.Panel2MinSize;
// //splitContainer1.SplitterDistance = Math.Min(splitContainer1.Panel1MinSize, Math.Min(splitContainer1.SplitterDistance, maxSplitterDistance));
// splitContainer1.SplitterDistance = (int)(this.Width * 0.4);
// splitContainer2.SplitterDistance = (int)(this.Width * 0.4);
// }
// else
// {
// // 如果宽度为0,设置默认值
// splitContainer1.SplitterDistance = 200;
// }
// }
// catch (Exception ex)
// {
// AppLog.Error("UcTabWindow_SizeChanged Exception: " + ex.Message);
// }
//}
// 修改 UcTabWindow_SizeChanged 方法,处理折叠状态下的布局重算
private void UcTabWindow_SizeChanged(object sender, EventArgs e)
{
try
{
if (this.Width <= 0) return;
// 修正 splitContainer1
int maxDist1 = this.Width - splitContainer1.Panel2MinSize;
int dist1 = (int)(this.Width * 0.4);
splitContainer1.SplitterDistance = Clamp(dist1, splitContainer1.Panel1MinSize, maxDist1);
// 修正 splitContainer2(仅在当前距离超出有效范围时调整)
if (splitContainer2 != null && splitContainer2.Width > 0)
{
int minPanel1 = splitContainer2.Panel1MinSize;
int maxPanel1 = splitContainer2.Width - splitContainer2.Panel2MinSize - splitContainer2.SplitterWidth;
int current = splitContainer2.SplitterDistance;
if (current < minPanel1 || current > maxPanel1)
{
int newDist = Clamp(current, minPanel1, maxPanel1);
splitContainer2.SplitterDistance = newDist;
if (isFileExplorerExpanded)
expandedPanel1Width = newDist;
}
}
}
catch (Exception ex)
{
AppLog.Error("UcTabWindow_SizeChanged Exception: " + ex.Message);
}
}
private static int Clamp(int value, int min, int max)
{
if (value < min) return min;
if (value > max) return max;
return value;
}
// 优化后的 ToggleFileExplorer 方法
public void ToggleFileExplorer()
{
if (isFileExplorerExpanded)
{
// 折叠
fileExplorer.Visible = false;
int splitterWidth = splitContainer2.SplitterWidth;
int newPanel1Width = splitContainer2.Width - COLLAPSED_PANEL2_WIDTH - splitterWidth;
newPanel1Width = Math.Max(newPanel1Width, splitContainer2.Panel1MinSize);
splitContainer2.SplitterDistance = newPanel1Width;
btnToggleExplorer.Text = "◀";
}
else
{
// 展开
fileExplorer.Visible = true;
int maxPanel1 = splitContainer2.Width - splitContainer2.Panel2MinSize - splitContainer2.SplitterWidth;
int target = Math.Min(expandedPanel1Width, maxPanel1);
target = Math.Max(target, splitContainer2.Panel1MinSize);
splitContainer2.SplitterDistance = target;
btnToggleExplorer.Text = "▶";
}
isFileExplorerExpanded = !isFileExplorerExpanded;
}
public bool IsFileExplorerCollapsed()
{
return !isFileExplorerExpanded;
}
// ResetToDefaultLayout 方法可保留,但建议重新实现以重置所有布局
public void ResetToDefaultLayout()
{
if (splitContainer1 == null || splitContainer2 == null) return;
// 确保文件浏览器展开
if (!isFileExplorerExpanded)
ToggleFileExplorer(); // 直接调用切换方法展开
else
{
fileExplorer.Visible = true;
int w = this.Width;
if (w > 0)
{
int dist1 = (int)(w * 0.4);
int max1 = w - splitContainer1.Panel2MinSize;
splitContainer1.SplitterDistance = Math.Max(splitContainer1.Panel1MinSize, Math.Min(dist1, max1));
int dist2 = (int)(w * 0.4);
int max2 = splitContainer2.Width - splitContainer2.Panel2MinSize - splitContainer2.SplitterWidth;
splitContainer2.SplitterDistance = Math.Max(splitContainer2.Panel1MinSize, Math.Min(dist2, max2));
expandedPanel1Width = splitContainer2.SplitterDistance;
}
}
btnToggleExplorer.Text = "◀";
isFileExplorerExpanded = true;
}
public void ShowList(EA.Repository repository, string title)
{
#region 初始化
this.repository = repository;
this.tabTitle = title;
//Console.WriteLine("notesMermaid "+ notesMermaid);
// 将repository传递给UcTabWork
ucTabWork.ucTabWindow = this;
//ucTabWork.ShowList(repository, title, notesMermaid);
ucTabWork.ShowList(repository, title);
ucTabKnowledge.RefreshParent += LoadModelKnowledgeBase;
#endregion
string celetype = Convert.ToString(repository.GetTreeSelectedItemType());
if (celetype != "otPackage")
{
//System.Windows.Forms.MessageBox.Show("Please select an Package or Element with a Notes that is not empty!");
//return;
}
//tree上选择的元素
currentPackage = repository.GetTreeSelectedObject() as EA.Package;
if (currentPackage.ParentID == 0)
{
//System.Windows.Forms.MessageBox.Show("Please select a sub-package!");
//return;
}
}
public void ShowLeft(string DiagramType="", string DiagramNotes = "")
{
if (string.IsNullOrEmpty(DiagramType) || string.IsNullOrEmpty(DiagramNotes))
{
return;
}
switch (DiagramType.ToLower())
{
case "activity":
ucActivityDiagram ucActivityDiagramObj = new ucActivityDiagram();
ucActivityDiagramObj.repository = this.repository;
ucActivityDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucActivityDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucActivityDiagramObj);
break;
case "class":
ucClassDiagram ucClassDiagramObj = new ucClassDiagram();
ucClassDiagramObj.repository = this.repository;
ucClassDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucClassDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucClassDiagramObj);
break;
case "class dictionary":
case "classdictionary":
ucClassDictionary ucClassDictionaryObj = new ucClassDictionary();
ucClassDictionaryObj.repository = this.repository;
ucClassDictionaryObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucClassDictionaryObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucClassDictionaryObj);
break;
case "usecase":
ucUsecaseDiagram ucUsecaseDiagramObj = new ucUsecaseDiagram();
ucUsecaseDiagramObj.repository = this.repository;
ucUsecaseDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucUsecaseDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucUsecaseDiagramObj);
break;
case "behavior":
ucBehaviorDiagram ucBehaviorObj = new ucBehaviorDiagram();
ucBehaviorObj.repository = this.repository;
ucBehaviorObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucBehaviorObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucBehaviorObj);
break;
case "dataflow":
ucDataflowDiagram ucDataflowObj = new ucDataflowDiagram();
ucDataflowObj.repository = this.repository;
ucDataflowObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucDataflowObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucDataflowObj);
break;
case "sequence":
ucSequenceDiagram ucSequenceDiagramObj = new ucSequenceDiagram();
ucSequenceDiagramObj.repository = this.repository;
ucSequenceDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucSequenceDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucSequenceDiagramObj);
break;
case "statemachine":
ucStateMachineDiagram ucStateMachineDiagramObj = new ucStateMachineDiagram();
ucStateMachineDiagramObj.repository = this.repository;
ucStateMachineDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucStateMachineDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucStateMachineDiagramObj);
break;
case "component":
ucComponentDiagram ucComponentDiagramObj = new ucComponentDiagram();
ucComponentDiagramObj.repository = this.repository;
ucComponentDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucComponentDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucComponentDiagramObj);
break;
case "deployment":
ucDeploymentDiagram ucDeploymentDiagramObj = new ucDeploymentDiagram();
ucDeploymentDiagramObj.repository = this.repository;
ucDeploymentDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucDeploymentDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucDeploymentDiagramObj);
break;
case "composite structure":
case "compositestructure":
ucCompositeStructureDiagram ucCompositeStructureDiagramObj = new ucCompositeStructureDiagram();
ucCompositeStructureDiagramObj.repository = this.repository;
ucCompositeStructureDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucCompositeStructureDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucCompositeStructureDiagramObj);
break;
case "block definition":
case "blockdefinition":
ucSysMLBlockDefinitionDiagram ucSysMLBlockDefinitionDiagramObj = new ucSysMLBlockDefinitionDiagram();
ucSysMLBlockDefinitionDiagramObj.repository = this.repository;
ucSysMLBlockDefinitionDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucSysMLBlockDefinitionDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucSysMLBlockDefinitionDiagramObj);
break;
case "requirement":
ucSysMLRequirementDiagram ucSysMLRequirementDiagramObj = new ucSysMLRequirementDiagram();
ucSysMLRequirementDiagramObj.repository = this.repository;
ucSysMLRequirementDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucSysMLRequirementDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucSysMLRequirementDiagramObj);
break;
case "internal block":
case "internalblock":
ucSysMLInternalBlockDiagram ucSysMLInternalBlockDiagramObj = new ucSysMLInternalBlockDiagram();
ucSysMLInternalBlockDiagramObj.repository = this.repository;
ucSysMLInternalBlockDiagramObj.LoadItems(DiagramNotes);
// 清空Panel1的现有控件
splitContainer1.Panel1.Controls.Clear();
// 将新的用户控件添加到Panel1
ucSysMLInternalBlockDiagramObj.Dock = DockStyle.Fill;
splitContainer1.Panel1.Controls.Add(ucSysMLInternalBlockDiagramObj);
break;
default:
MessageBox.Show("没有找到对应建模技能,请根据支持的建模技能编写NML", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
break;
}
}
public void LoadModelKnowledgeBase(ModelKnowledgeBase modelKnowledgeBase)
{
ModelKnowledge modelKnowledge = new ModelKnowledge();
modelKnowledge.title = modelKnowledgeBase.title;
modelKnowledge.content = modelKnowledgeBase.content;
MessageStyle.LoadModelKnowledgeHistory(ucTabWork.fctb, modelKnowledge);
//labelModelTask.Text = "建模任务:" + modelKnowledge.title;
//ucTabWork.LoadModelKnowledgeHistory(modelKnowledge);
}
private void TabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (ucTabWork != null)
{
chat_id = ucTabWork.chat_id;
}
// 当切换到知识库标签页时重新加载数据
if (tabControl1.SelectedTab == tabPageKnowledge && ucTabKnowledge != null)
{
ucTabKnowledge.LoadData();
}
if (tabControl1.SelectedTab == tabPageChat && ucTabChat != null)
{
ucTabChat.chat_id = chat_id;
ucTabChat.ShowList(repository, tabTitle);
}
if (tabControl1.SelectedTab == tabPageWork && ucTabWork != null)
{
ucTabWork.ReloadComboBox();
}
}
}
}