void m_genDataViewer_TriggerAction(object sender, TriggerActionArgs e) { if (this.m_detailHostObj != null) { if (this._myForm != null && this._myForm.IsDisposed == true) { if (this.m_genDataViewer != null) { this.m_genDataViewer.Clear(); #if NO this.m_genDataViewer.Close(); this.m_genDataViewer = null; #endif CloseGenDataViewer(); return; } } if (String.IsNullOrEmpty(e.EntryName) == false) { this.SynchronizeMarc(); this.m_detailHostObj.Invoke(e.EntryName, e.sender, e.e); // if (this.tabControl_biblioInfo.SelectedTab == this.tabPage_template) TODO: 这里是不是没有必要优化了 this.SynchronizeMarc(); } if (this.m_genDataViewer != null) { this.m_genDataViewer.RefreshState(); } } }
int _inCloseGenDataViewer = 0; // 防止重入 void CloseGenDataViewer() { if (_inCloseGenDataViewer > 0) { return; } _inCloseGenDataViewer++; try { if (this.m_genDataViewer != null) { // 2015/11/7 // 注意解除 dock 时建立的关系。便于后面 Dispose() if (Program.MainForm.CurrentGenerateDataControl == m_genDataViewer.Table) { Program.MainForm.CurrentGenerateDataControl = null; } this.m_genDataViewer.Close(); m_genDataViewer.DoDockEvent -= new DoDockEventHandler(m_genDataViewer_DoDockEvent); m_genDataViewer.SetMenu -= new RefreshMenuEventHandler(m_genDataViewer_SetMenu); m_genDataViewer.TriggerAction -= new TriggerActionEventHandler(m_genDataViewer_TriggerAction); m_genDataViewer.MyFormClosed -= new EventHandler(m_genDataViewer_MyFormClosed); m_genDataViewer.FormClosed -= new FormClosedEventHandler(m_genDataViewer_FormClosed); this.m_genDataViewer = null; } } finally { _inCloseGenDataViewer--; } }
void m_genDataViewer_FormClosed(object sender, FormClosedEventArgs e) { if (m_genDataViewer != null) { Program.MainForm.AppInfo.SetBoolean("detailform", "gen_auto_run", m_genDataViewer.AutoRun); { // 保存列宽度 string strWidths = DpTable.GetColumnWidthListString(m_genDataViewer.ActionTable); Program.MainForm.AppInfo.SetString( "gen_data_dlg", "column_width", strWidths); } Program.MainForm.AppInfo.UnlinkFormState(m_genDataViewer); #if NO this.m_genDataViewer = null; #endif CloseGenDataViewer(); } }
void DisplayAutoGenMenuWindow(bool bOpenWindow) { // string strError = ""; // 优化,避免无谓地进行服务器调用 if (bOpenWindow == false) { if (Program.MainForm.PanelFixedVisible == false && (m_genDataViewer == null || m_genDataViewer.Visible == false)) { return; } } if (this.m_genDataViewer == null || (bOpenWindow == true && this.m_genDataViewer.Visible == false)) { m_genDataViewer = new GenerateDataForm(); m_genDataViewer.AutoRun = Program.MainForm.AppInfo.GetBoolean("detailform", "gen_auto_run", false); // MainForm.SetControlFont(m_genDataViewer, this.Font, false); { // 恢复列宽度 string strWidths = Program.MainForm.AppInfo.GetString( "gen_data_dlg", "column_width", ""); if (String.IsNullOrEmpty(strWidths) == false) { DpTable.SetColumnHeaderWidth(m_genDataViewer.ActionTable, strWidths, false); } } // m_genDataViewer.MainForm = Program.MainForm; // 必须是第一句 m_genDataViewer.Text = "创建数据"; m_genDataViewer.DoDockEvent -= new DoDockEventHandler(m_genDataViewer_DoDockEvent); m_genDataViewer.DoDockEvent += new DoDockEventHandler(m_genDataViewer_DoDockEvent); m_genDataViewer.SetMenu -= new RefreshMenuEventHandler(m_genDataViewer_SetMenu); m_genDataViewer.SetMenu += new RefreshMenuEventHandler(m_genDataViewer_SetMenu); m_genDataViewer.TriggerAction -= new TriggerActionEventHandler(m_genDataViewer_TriggerAction); m_genDataViewer.TriggerAction += new TriggerActionEventHandler(m_genDataViewer_TriggerAction); m_genDataViewer.MyFormClosed -= new EventHandler(m_genDataViewer_MyFormClosed); m_genDataViewer.MyFormClosed += new EventHandler(m_genDataViewer_MyFormClosed); m_genDataViewer.FormClosed -= new FormClosedEventHandler(m_genDataViewer_FormClosed); m_genDataViewer.FormClosed += new FormClosedEventHandler(m_genDataViewer_FormClosed); } if (bOpenWindow == true) { if (m_genDataViewer.Visible == false) { Program.MainForm.AppInfo.LinkFormState(m_genDataViewer, "autogen_viewer_state"); m_genDataViewer.Show(this._myForm); m_genDataViewer.Activate(); Program.MainForm.CurrentGenerateDataControl = null; } else { if (m_genDataViewer.WindowState == FormWindowState.Minimized) { m_genDataViewer.WindowState = FormWindowState.Normal; } m_genDataViewer.Activate(); } } else { if (m_genDataViewer.Visible == true) { } else { if (Program.MainForm.CurrentGenerateDataControl != m_genDataViewer.Table) { m_genDataViewer.DoDock(false); // 不会自动显示FixedPanel } } } if (this.m_genDataViewer != null) { this.m_genDataViewer.CloseWhenComplete = bOpenWindow; } return; /* * ERROR1: * MessageBox.Show(this, "DisplayAutoGenMenu() 出错: " + strError); * */ }
// 自动加工数据 // parameters: // sender 从何处启动? MarcEditor EntityEditForm BindingForm public void AutoGenerate(object sender, GenerateDataEventArgs e, string strBiblioRecPath, bool bOnlyFillMenu = false) { int nRet = 0; string strError = ""; bool bAssemblyReloaded = false; // 防止重入 if (bOnlyFillMenu == true && this.m_nInFillMenu > 0) { return; } this.m_nInFillMenu++; try { // 初始化 dp2circulation_marc_autogen.cs 的 Assembly,并new DetailHost对象 // return: // -1 error // 0 没有重新初始化Assembly,而是直接用以前Cache的Assembly // 1 重新(或者首次)初始化了Assembly nRet = InitialAutogenAssembly(strBiblioRecPath, // null, out strError); if (nRet == -1) { goto ERROR1; } if (nRet == 0) { if (this.m_detailHostObj == null) { return; // 库名不具备,无法初始化 } } if (nRet == 1) { bAssemblyReloaded = true; } Debug.Assert(this.m_detailHostObj != null, ""); if (this.AutoGenNewStyle == true) { bool bDisplayWindow = Program.MainForm.PanelFixedVisible == false ? true : false; if (bDisplayWindow == true) { if (String.IsNullOrEmpty(e.ScriptEntry) != true && e.ScriptEntry != "Main") { bDisplayWindow = false; } } if (sender is EntityEditForm && (String.IsNullOrEmpty(e.ScriptEntry) == true || e.ScriptEntry == "Main")) { bDisplayWindow = true; } else if (sender is BindingForm && (String.IsNullOrEmpty(e.ScriptEntry) == true || e.ScriptEntry == "Main")) { bDisplayWindow = true; } DisplayAutoGenMenuWindow(bDisplayWindow); // 可能会改变 .ActionTable以及 .Count if (bOnlyFillMenu == false) { if (Program.MainForm.PanelFixedVisible == true && e.Parameter == null) // 2015/6/5 { Program.MainForm.ActivateGenerateDataPage(); } } if (this.m_genDataViewer != null) { this.m_genDataViewer.sender = sender; this.m_genDataViewer.e = e; } // 清除残留菜单事项 if (m_autogenSender != sender || bAssemblyReloaded == true) { if (this.m_genDataViewer != null && this.m_genDataViewer.Count > 0) { this.m_genDataViewer.Clear(); } } } else // 旧的风格 { #if NO if (this.m_genDataViewer != null) { this.m_genDataViewer.Close(); this.m_genDataViewer = null; } #endif CloseGenDataViewer(); if (this._myForm.Focused == true // || this.m_marcEditor.Focused TODO: 这里要研究一下如何实现 ) { Program.MainForm.CurrentGenerateDataControl = null; } // 如果意图仅仅为填充菜单 if (bOnlyFillMenu == true) { return; } } try { // 旧的风格 if (this.AutoGenNewStyle == false) { this.m_detailHostObj.Invoke(String.IsNullOrEmpty(e.ScriptEntry) == true ? "Main" : e.ScriptEntry, sender, e); // this.SetSaveAllButtonState(true); TODO: 应该没有必要。MARC 编辑器内容修改自然会引起保存按钮状态变化 return; } // 初始化菜单 try { if (this.m_genDataViewer != null) { // 出现菜单界面 if (this.m_genDataViewer.Count == 0) { dynamic o = this.m_detailHostObj; o.CreateMenu(sender, e); this.m_genDataViewer.Actions = this.m_detailHostObj.ScriptActions; } // 根据当前插入符位置刷新加亮事项 this.m_genDataViewer.RefreshState(); } if (String.IsNullOrEmpty(e.ScriptEntry) == false) { this.m_detailHostObj.Invoke(e.ScriptEntry, sender, e); } else { if (Program.MainForm.PanelFixedVisible == true && bOnlyFillMenu == false && Program.MainForm.CurrentGenerateDataControl != null) { TableLayoutPanel table = (TableLayoutPanel)Program.MainForm.CurrentGenerateDataControl; for (int i = 0; i < table.Controls.Count; i++) { Control control = table.Controls[i]; if (control is DpTable) { control.Focus(); break; } } } } } catch (Exception /*ex*/) { /* * // 被迫改用旧的风格 * this.m_detailHostObj.Invoke(String.IsNullOrEmpty(e.ScriptEntry) == true ? "Main" : e.ScriptEntry, * sender, * e); * this.SetSaveAllButtonState(true); * return; * */ throw; } } catch (Exception ex) { strError = "执行脚本文件 '" + m_strAutogenDataCfgFilename + "' 过程中发生异常: \r\n" + ExceptionUtil.GetDebugText(ex); goto ERROR1; } this.m_autogenSender = sender; // 记忆最近一次的调用发起者 if (bOnlyFillMenu == false && this.m_genDataViewer != null) { this.m_genDataViewer.TryAutoRun(); } return; ERROR1: // TODO: 报错是否要直接显示在 dpTable 中? // MessageBox.Show(this._myForm, strError); DisplayAutoGenMenuWindow(false); if (this.m_genDataViewer != null) { this.m_genDataViewer.DisplayError(strError); } } finally { this.m_nInFillMenu--; } }