|
#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
}
|