e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
384 lines
13 KiB
C#
384 lines
13 KiB
C#
#region Using directives
|
|
|
|
using System;
|
|
using System.CodeDom;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel.Design;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms.Design;
|
|
using System.Workflow.ComponentModel;
|
|
using System.Workflow.ComponentModel.Design;
|
|
using System.Workflow.Activities.Rules;
|
|
using System.Workflow.Interop;
|
|
using System.Globalization;
|
|
using System.Workflow.Activities.Common;
|
|
|
|
#endregion
|
|
|
|
namespace System.Workflow.Activities.Rules.Design
|
|
{
|
|
#region class BasicBrowserDialog
|
|
|
|
internal abstract partial class BasicBrowserDialog : Form
|
|
{
|
|
#region members and constructors
|
|
|
|
private Activity activity;
|
|
private string name;
|
|
private IServiceProvider serviceProvider;
|
|
|
|
protected BasicBrowserDialog(Activity activity, string name)
|
|
{
|
|
if (activity == null)
|
|
throw (new ArgumentNullException("activity"));
|
|
|
|
this.activity = activity;
|
|
|
|
InitializeComponent();
|
|
|
|
// set captions
|
|
this.descriptionLabel.Text = DescriptionText;
|
|
this.Text = TitleText;
|
|
this.previewLabel.Text = PreviewLabelText;
|
|
|
|
this.newRuleToolStripButton.Enabled = true;
|
|
this.name = name;
|
|
|
|
serviceProvider = activity.Site;
|
|
|
|
//Set dialog fonts
|
|
IUIService uisvc = (IUIService)activity.Site.GetService(typeof(IUIService));
|
|
if (uisvc != null)
|
|
this.Font = (Font)uisvc.Styles["DialogFont"];
|
|
|
|
HelpRequested += new HelpEventHandler(OnHelpRequested);
|
|
HelpButtonClicked += new CancelEventHandler(OnHelpClicked);
|
|
|
|
this.rulesListView.Select();
|
|
}
|
|
|
|
protected Activity Activity
|
|
{
|
|
get
|
|
{
|
|
return this.activity;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region public properties
|
|
|
|
public string SelectedName
|
|
{
|
|
get
|
|
{
|
|
return this.name;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region event handlers
|
|
|
|
private void OnCancel(object sender, EventArgs e)
|
|
{
|
|
this.name = null;
|
|
this.DialogResult = DialogResult.Cancel;
|
|
this.Close();
|
|
}
|
|
|
|
private void OnOk(object sender, EventArgs e)
|
|
{
|
|
object ruleObject = this.rulesListView.SelectedItems[0].Tag;
|
|
this.name = this.GetObjectName(ruleObject);
|
|
|
|
this.DialogResult = DialogResult.OK;
|
|
this.Close();
|
|
}
|
|
|
|
private void OnHelpClicked(object sender, CancelEventArgs e)
|
|
{
|
|
e.Cancel = true;
|
|
ShowHelp();
|
|
}
|
|
|
|
private void OnHelpRequested(object sender, HelpEventArgs e)
|
|
{
|
|
ShowHelp();
|
|
}
|
|
|
|
private void ShowHelp()
|
|
{
|
|
if (serviceProvider != null)
|
|
{
|
|
IHelpService helpService = serviceProvider.GetService(typeof(IHelpService)) as IHelpService;
|
|
if (helpService != null)
|
|
{
|
|
helpService.ShowHelpFromKeyword(this.GetType().FullName + ".UI");
|
|
}
|
|
else
|
|
{
|
|
IUIService uisvc = serviceProvider.GetService(typeof(IUIService)) as IUIService;
|
|
if (uisvc != null)
|
|
uisvc.ShowError(Messages.NoHelp);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
IUIService uisvc = (IUIService)GetService(typeof(IUIService));
|
|
if (uisvc != null)
|
|
uisvc.ShowError(Messages.NoHelp);
|
|
}
|
|
}
|
|
|
|
private void OnNew(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
this.OnComponentChanging();
|
|
object newObject = OnNewInternal();
|
|
if (newObject != null)
|
|
{
|
|
using (new WaitCursor())
|
|
{
|
|
ListViewItem listViewItem = this.rulesListView.Items.Add(new ListViewItem());
|
|
this.UpdateListViewItem(newObject, listViewItem);
|
|
listViewItem.Selected = true;
|
|
this.OnComponentChanged();
|
|
}
|
|
}
|
|
}
|
|
catch (InvalidOperationException ex)
|
|
{
|
|
DesignerHelpers.DisplayError(ex.Message, this.Text, this.activity.Site);
|
|
}
|
|
}
|
|
|
|
private void OnEdit(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
this.OnComponentChanging();
|
|
object updatedRuleObject = null;
|
|
object ruleObject = this.rulesListView.SelectedItems[0].Tag;
|
|
if (OnEditInternal(ruleObject, out updatedRuleObject))
|
|
{
|
|
using (new WaitCursor())
|
|
{
|
|
this.UpdateListViewItem(updatedRuleObject, this.rulesListView.SelectedItems[0]);
|
|
this.UpdatePreview(this.previewRichTextBox, updatedRuleObject);
|
|
this.OnComponentChanged();
|
|
}
|
|
}
|
|
}
|
|
catch (InvalidOperationException ex)
|
|
{
|
|
DesignerHelpers.DisplayError(ex.Message, this.Text, this.activity.Site);
|
|
}
|
|
}
|
|
|
|
private void OnRename(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
this.OnComponentChanging();
|
|
object ruleObject = this.rulesListView.SelectedItems[0].Tag;
|
|
string newName = OnRenameInternal(ruleObject);
|
|
if (newName != null)
|
|
{
|
|
using (new WaitCursor())
|
|
{
|
|
ListViewItem selectedItem = this.rulesListView.SelectedItems[0];
|
|
selectedItem.Text = newName;
|
|
this.OnComponentChanged();
|
|
}
|
|
}
|
|
}
|
|
catch (InvalidOperationException ex)
|
|
{
|
|
DesignerHelpers.DisplayError(ex.Message, this.Text, this.activity.Site);
|
|
}
|
|
}
|
|
|
|
private void OnDelete(object sender, EventArgs e)
|
|
{
|
|
MessageBoxOptions mbo = (MessageBoxOptions)0;
|
|
if (CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft)
|
|
mbo = MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading;
|
|
DialogResult dr = MessageBox.Show(this, this.ConfirmDeleteMessageText, this.ConfirmDeleteTitleText,
|
|
MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, mbo);
|
|
if (dr == DialogResult.OK)
|
|
{
|
|
using (new WaitCursor())
|
|
{
|
|
object ruleObject = this.rulesListView.SelectedItems[0].Tag;
|
|
|
|
try
|
|
{
|
|
this.OnComponentChanging();
|
|
int selectionIndex = this.rulesListView.SelectedIndices[0];
|
|
object selectedRuleObject = null;
|
|
OnDeleteInternal(ruleObject);
|
|
this.rulesListView.Items.RemoveAt(selectionIndex);
|
|
if (this.rulesListView.Items.Count > 0)
|
|
{
|
|
int newSelectionIndex = Math.Min(selectionIndex, this.rulesListView.Items.Count - 1);
|
|
this.rulesListView.Items[newSelectionIndex].Selected = true;
|
|
selectedRuleObject = this.rulesListView.Items[newSelectionIndex].Tag;
|
|
}
|
|
this.UpdatePreview(this.previewRichTextBox, selectedRuleObject);
|
|
this.OnComponentChanged();
|
|
}
|
|
catch (InvalidOperationException ex)
|
|
{
|
|
DesignerHelpers.DisplayError(ex.Message, this.Text, this.activity.Site);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
|
|
{
|
|
if (e.IsSelected)
|
|
e.Item.Focused = true;
|
|
|
|
OnToolbarStatus();
|
|
this.okButton.Enabled = e.IsSelected;
|
|
|
|
object currentRuleObject = null;
|
|
if (e.IsSelected)
|
|
currentRuleObject = e.Item.Tag;
|
|
|
|
UpdatePreview(this.previewRichTextBox, currentRuleObject);
|
|
}
|
|
|
|
private void OnDoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (this.rulesListView.SelectedItems.Count > 0)
|
|
this.OnOk(sender, e);
|
|
}
|
|
|
|
private void OnToolbarStatus()
|
|
{
|
|
if (this.rulesListView.SelectedItems.Count == 1)
|
|
{
|
|
this.editToolStripButton.Enabled = true;
|
|
this.renameToolStripButton.Enabled = true;
|
|
this.deleteToolStripButton.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
this.editToolStripButton.Enabled = false;
|
|
this.renameToolStripButton.Enabled = false;
|
|
this.deleteToolStripButton.Enabled = false;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region helpers
|
|
|
|
private bool OnComponentChanging()
|
|
{
|
|
bool canChange = true;
|
|
ISite site = ((IComponent)this.activity).Site;
|
|
IComponentChangeService changeService = (IComponentChangeService)site.GetService(typeof(IComponentChangeService));
|
|
|
|
if (changeService != null)
|
|
{
|
|
try
|
|
{
|
|
changeService.OnComponentChanging(this.activity, null);
|
|
}
|
|
catch (CheckoutException coEx)
|
|
{
|
|
if (coEx == CheckoutException.Canceled)
|
|
canChange = false;
|
|
else
|
|
throw;
|
|
}
|
|
}
|
|
return canChange;
|
|
}
|
|
|
|
private void OnComponentChanged()
|
|
{
|
|
ISite site = ((IComponent)this.activity).Site;
|
|
IComponentChangeService changeService = (IComponentChangeService)site.GetService(typeof(IComponentChangeService));
|
|
|
|
if (changeService != null)
|
|
changeService.OnComponentChanged(this.activity, null, null, null);
|
|
|
|
ConditionHelper.Flush_Rules_DT(site, Helpers.GetRootActivity(this.activity));
|
|
}
|
|
|
|
protected void InitializeListView(IList list, string selectedName)
|
|
{
|
|
foreach (object ruleObject in list)
|
|
{
|
|
ListViewItem listViewItem = this.rulesListView.Items.Add(new ListViewItem());
|
|
this.UpdateListViewItem(ruleObject, listViewItem);
|
|
if (GetObjectName(ruleObject) == selectedName)
|
|
listViewItem.Selected = true;
|
|
}
|
|
|
|
if (this.rulesListView.SelectedItems.Count == 0)
|
|
OnToolbarStatus();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region override methods
|
|
|
|
protected abstract string GetObjectName(object ruleObject);
|
|
|
|
//commands
|
|
protected abstract object OnNewInternal();
|
|
protected abstract bool OnEditInternal(object currentRuleObject, out object updatedRuleObject);
|
|
protected abstract void OnDeleteInternal(object ruleObject);
|
|
protected abstract string OnRenameInternal(object ruleObject);
|
|
|
|
// populating controls
|
|
protected abstract void UpdateListViewItem(object ruleObject, ListViewItem listViewItem);
|
|
protected abstract void UpdatePreview(TextBox previewTextBox, object ruleObject);
|
|
|
|
// captions
|
|
protected abstract string DescriptionText { get; }
|
|
protected abstract string TitleText { get; }
|
|
protected abstract string PreviewLabelText { get; }
|
|
protected abstract string ConfirmDeleteMessageText { get; }
|
|
protected abstract string ConfirmDeleteTitleText { get; }
|
|
internal abstract string EmptyNameErrorText { get; }
|
|
internal abstract string DuplicateNameErrorText { get; }
|
|
internal abstract string NewNameLabelText { get; }
|
|
internal abstract string RenameTitleText { get; }
|
|
|
|
internal abstract bool IsUniqueName(string ruleName);
|
|
|
|
#endregion
|
|
|
|
private class WaitCursor : IDisposable
|
|
{
|
|
private Cursor oldCursor;
|
|
public WaitCursor()
|
|
{
|
|
Application.DoEvents(); // Force redraw before waiting
|
|
oldCursor = Cursor.Current;
|
|
Cursor.Current = Cursors.WaitCursor;
|
|
}
|
|
public void Dispose()
|
|
{
|
|
Cursor.Current = oldCursor;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|