File: Rules\Design\Dialogs\BasicBrowserDialog.cs
Project: ndp\cdf\src\WF\Activities\System.Workflow.Activities.csproj (System.Workflow.Activities)
#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
}