// 设状态, 供Stop调 // locks: 集合读锁(如果bLock == true) public void ChangeState(Stop stop, StateParts parts, bool bLock) { if (stops.Count == 0) return; // TODO: 这里的整个逻辑有问题: 即便视觉上不表现,内存也应当兑现修改,以备后面切换时显示出来。动态不那么及时更新是可以的,但是关键状态变化,例如显示、隐藏等动作,一定要兑现到内存 if (stop != null && stop.ProgressValue == -1) { if ((parts & StateParts.ProgressValue) != 0) { // 如果为隐藏progress的意图, // 将max和min都设置为-1,以便将来刷新的时候能体现隐藏 // 2011/10/12 stop.ProgressMax = -1; stop.ProgressMin = -1; } } if (bLock == true) { WriteDebugInfo("collection read lock 7\r\n"); this.m_collectionlock.AcquireReaderLock(Stop.m_nLockTimeout); } bool bLoop = false; Stop active = null; try { if (bMultiple == false) { if (stop == null) { stop = (Stop)stops[stops.Count - 1]; } else { if (stop != stops[stops.Count - 1]) return; } bLoop = stop.State == 0 ? true : false; active = stop; } else { bool bFound = false; for (int i = 0; i < stops.Count; i++) { Stop temp = (Stop)stops[i]; if (bLoop == false) { if (temp.State == 0) bLoop = true; } if (stop == temp) { bFound = true; active = temp; break; } } if (bFound == false) return; } // 移走 } finally { if (bLock == true) { this.m_collectionlock.ReleaseReaderLock(); WriteDebugInfo("collection read unlock 7\r\n"); } } //if (m_stopToolButton != null) //??? //{ if ((parts & StateParts.StopButton) != 0) EnableStopButtons(bLoop); if ((parts & StateParts.ReverseButtons) != 0) EnableReverseButtons(!bLoop, parts); //} //if (m_messageStatusBar != null) //{ if ((parts & StateParts.Message) != 0) InternalSetMessage(active.Message); //} if ((parts & StateParts.ProgressRange) != 0) { // active.ProgressValue = 0; // 初始化 active.ProgressValue = active.ProgressMin; // 初始化 2008/5/16 changed InternalSetProgressBar(active.ProgressMin, active.ProgressMax, -1); } if ((parts & StateParts.ProgressValue) != 0) { /* if (active.ProgressValue == -1) { // 如果为隐藏progress的意图, // 将max和min都设置为-1,以便将来刷新的时候能体现隐藏 // 2008/3/10 active.ProgressMax = -1; active.ProgressMin = -1; } * */ InternalSetProgressBar(-1, -1, active.ProgressValue); } }
// 整体改变reverse_buttons的Enabled状态。 // 注意,在false时,是要改变为disabled状态;而true时,则是要恢复原来记忆(disable前)的状态 // parameters: // bEnabled true表示希望恢复按钮原来状态;false希望disable按钮 // parts SaveEnabledState希望先保存按钮原来的值;RestoreEnabledState表示要恢复按钮原来的值 void EnableReverseButtons(bool bEnabled, StateParts parts) { if (m_reverseButtons == null) return; if (m_reverseButtonEnableStates == null) m_reverseButtonEnableStates = new List<int>(); /* if ((parts & StateParts.All) != 0) throw new Exception("StateParts枚举中除了SaveEnabledState和RestoreEnabledState值外,其他值对于本函数没有意义"); * */ bool bSave = false; if ((parts & StateParts.SaveEnabledState) != 0) bSave = true; bool bRestore = false; if ((parts & StateParts.RestoreEnabledState) != 0) bRestore = true; // 保证两个数组的大小一致 while (m_reverseButtonEnableStates.Count < m_reverseButtons.Count) { m_reverseButtonEnableStates.Add(-1); } for (int i = 0; i < m_reverseButtons.Count; i++) { int nOldState = m_reverseButtonEnableStates[i]; bool bEnableResult = bEnabled; // TODO: 状态不明的时候,可以通过事件从外部索取信息 // 如果bEnabled要求true,而旧状态不明,那就询问 if (nOldState == -1 && bEnabled == true) { if (this.OnAskReverseButtonState != null) { AskReverseButtonStateEventArgs e = new AskReverseButtonStateEventArgs(); e.EnableQuestion = true; e.Button = m_reverseButtons[i]; this.OnAskReverseButtonState(this, e); bEnableResult = e.EnableResult; } } bool bOldState = (nOldState == 1 ? true : false); object button = m_reverseButtons[i]; if (button is Button) { bOldState = ((Button)button).Enabled; // ((Button)button).Enabled = (bRestore == true ? bOldState : bEnabled); Safe_EnableButton((Button)button, (bRestore == true ? bOldState : bEnableResult)); } else if (button is ToolBarButton) { // ((ToolBarButton)button).Enabled = bEnabled; bOldState = Safe_EnableToolBarButton(((ToolBarButton)button), bRestore == true ? bOldState : bEnableResult); /* if (button.Parent.InvokeRequired) { Delegate_SetToolBarButtonEnable d = new Delegate_SetToolBarButtonEnable(SetToolBarButtonEnable); button.Parent.Invoke(d, new object[] { button, bEnabled }); } else { button.Enabled = bEnabled; } * */ } else if (button is ToolStripButton) { // ((ToolStripButton)button).Enabled = bEnabled; bOldState = Safe_EnableToolStripButton(((ToolStripButton)button), bRestore == true ? bOldState : bEnableResult); } // 主动disable前,记忆以前的状态 if (bEnabled == false && bSave == true) m_reverseButtonEnableStates[i] = (bOldState == true ? 1 : 0); } }