using DevExpress.Mvvm; using DevExpress.Xpo; using DevExpress.Xpo.DB; using DevExpress.XtraBars; using DevExpress.XtraBars.Docking2010; using DevExpress.XtraEditors; using DevExpress.XtraGrid.Views.Base; using DevExpress.XtraGrid.Views.Grid; using Ips.Library.Basic; using Ips.Library.DxpLib; using Ips.Library.Entity; using Ips.Sps.Scheduling; using Ips.Sps.Tsks.Commands; using Ips.Sps.TskStrategys; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Ips.Sps.Tsks { public partial class TskListCtrl : DevExpress.XtraEditors.XtraUserControl { public TskListCtrl() { InitializeComponent(); gvSignalList.ShowRowNumber(); _tskManager = TskManager.Default; new LogCtrl() { Parent = grpTskLog }; this.RegisterCommands(); } Session Session { get; set; } TskManager _tskManager; public void RegisterCommands() { Messenger.Default.Register(this, OnReloadTsk); Messenger.Default.Register(this, OnTskStateChanged); } private void OnReloadTsk(ReloadTskMessage message) { Reload(); if (message.TskId.HasValue) { gvTskList.FocusedRowHandle = gvTskList.LocateByValue(nameof(Tsk.Oid), message.TskId); } } private void OnTskStateChanged(TskStateChangedMessage cmd) { var rowHandle = gvTskList.LocateByValue(nameof(Tsk.Oid), cmd.TskId); if (rowHandle < 0) return; var tsk = gvTskList.GetRow(rowHandle) as Tsk; this.Invoke(() => tsk.Reload()); } private void TskListForm_Load(object sender, EventArgs e) { _tskManager.ResetAll(); tskStateEdit.AddEnum(); Reload(); } private void Reload() { Session = new Session(); var sortProperties = new SortProperty[]{ new SortProperty(nameof(Tsk.Oid), SortingDirection.Descending) }; bsTskList.DataSource = new XPCollection(Session, null, sortProperties); } private void gvTskList_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { if (e.Button == MouseButtons.Left && e.Clicks == 1) { e.Handled = true; //btnEdit.PerformClick(); var tskId = (int)gvTskList.GetRowCellValue(e.RowHandle, colOid); _tskManager.SelectTsk(tskId, 0); } } private void ShowEditForm(int? id, int stgId, string caption = null) { caption = caption.IfNullOrWhitespace(id.HasValue ? $"编辑任务-{caption}" : "新建任务"); var form = new TskEditForm(id, stgId); form.Text = caption; //form.FormClosed += EditFormClosed; var documentManager = DocumentManager.FromControl(this.ParentForm); if (documentManager != null) { documentManager.View.AddDocument(form); } else { try { form.ShowDialog(); } finally { form.Dispose(); } } } private void EditFormClosed(object sender, FormClosedEventArgs e) { var form = sender as TskEditForm; form.FormClosed -= EditFormClosed; if (form.Id.HasValue) { Reload(); gvTskList.FocusedRowHandle = gvTskList.LocateByValue(nameof(Tsk.Oid), form.Id); } } private void btnAdd_ItemClick(object sender, ItemClickEventArgs e) { //ShowEditForm(null, null); } private void btnEdit_ItemClick(object sender, ItemClickEventArgs e) { if (gvTskList.FocusedRowHandle < 0) return; var tsk = gvTskList.GetFocusedRow() as Tsk; //var id = (int)gvTskList.GetFocusedRowCellValue(colOid); ShowEditForm(tsk.Oid, tsk.Strategy?.Oid ?? 0, tsk.Name); } private void btnDelete_ItemClick(object sender, ItemClickEventArgs e) { if (gvTskList.FocusedRowHandle < 0) return; var handles = gvTskList.GetSelectedRows(); if (handles.Length == 0) return; if (MsgHelper.ShowConfirm("确定删除选中的记录吗?")) { var modelList = handles.Select(m => gvTskList.GetRow(m) as Tsk).ToList(); Session.Delete(modelList); Reload(); } } private void gvTskList_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { var hitInfo = gvTskList.CalcHitInfo(e.Location); btnStart.Visibility = btnStop.Visibility = btnEdit.Visibility = btnDelete.Visibility = hitInfo.InRow ? BarItemVisibility.Always : BarItemVisibility.Never; var tsk = gvTskList.GetRow(hitInfo.RowHandle) as Tsk; if (tsk != null) { bool isStart = tsk.State != TskState.Stop; btnStart.Enabled = !isStart; btnStop.Enabled = isStart; } popTskList.ShowPopup(grdTskList.PointToScreen(e.Location)); } } private void btnStart_ItemClick(object sender, ItemClickEventArgs e) { if (gvTskList.FocusedRowHandle < 0) return; var tsk = gvTskList.GetFocusedRow() as Tsk; if (tsk.IsHistory) { StartTskForm startTskForm = new StartTskForm(tsk.Oid); if (startTskForm.ShowDialog() != DialogResult.OK) return; } try { TskScheduler.Default.Start(tsk.Oid); } catch (Exception ex) { MsgHelper.ShowError("启动任务出错," + ex.Message); } } private void btnStop_ItemClick(object sender, ItemClickEventArgs e) { if (gvTskList.FocusedRowHandle < 0) return; var id = (int)gvTskList.GetFocusedRowCellValue(colOid); try { TskScheduler.Default.Stop(id); } catch (Exception ex) { MsgHelper.ShowError("停止任务出错," + ex.Message); } } private void gvTskList_FocusedRowObjectChanged(object sender, FocusedRowObjectChangedEventArgs e) { } private void gvSignalList_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { if (e.Button == MouseButtons.Left && e.Clicks == 1) { e.Handled = true; var sig = (sender as GridView).GetRow(e.RowHandle) as TskSignal; _tskManager.SelectTsk(sig.Tsk.Oid, sig.Oid); } } } }