/// <summary>
        /// Shows the FeatureWindow modally, using the specified window as the owner.
        /// </summary>
        /// <param name="owner">The window that owns the FeatureWindow</param>
        /// <returns></returns>
        public static DialogResult ShowFeatureWindow(IWin32Window owner, object sender)
        {
            DialogResult result = DialogResult.Cancel;

            // get the executing window manager
            WindowManager windowManager = WindowManager.GetExecutingInstance();

            // create the features window
            FeatureWindow window = new FeatureWindow();

            // ask the window manager if we can show the window
            if (windowManager.CanShow(window, new object[] {}))
            {
                // ask the window manager to track the window
                windowManager.BeginTrackingLifetime(window, SnapIns.SnapInHostingEngine.WindowKeys.FeaturesWindowKey);

                // build the list of features to display
                FeatureCollectionEventArgs cea = new FeatureCollectionEventArgs();
                FeatureEngine.OnBuildingFeatureList(sender, cea);

                // select the features into the feature window
                window.SelectedFeatures = cea.Features;

                // show the window modally
                result = (owner == null ? window.ShowDialog() : window.ShowDialog(owner));
            }

            // if the result is ok, then something may need to be dealt with
            if (result == DialogResult.OK)
            {
                // grab the checked features
                FeatureCollection features = window.CheckedFeatures;

                // iterate over each feature
                foreach (Feature feature in features)
                {
                    // see if anyone wants to cancel the action on the feature
                    FeatureCancelEventArgs fcea = new FeatureCancelEventArgs(feature, false);
                    FeatureEngine.OnBeforeActionTakenForFeature(sender, fcea);
                    if (!fcea.Cancel)
                    {
                        // take the action on the feature
                        FeatureEventArgs fea = new FeatureEventArgs(feature);
                        FeatureEngine.OnTakeActionForFeature(sender, fea);

                        // notify others that an action has been taken on a feature
                        FeatureEngine.OnAfterActionTakenForFeature(sender, fea);
                    }
                }
            }

            return(result);
        }
		/// <summary>
		/// Shows the FeatureWindow modally, using the specified window as the owner.
		/// </summary>
		/// <param name="owner">The window that owns the FeatureWindow</param>
		/// <returns></returns>
		public static DialogResult ShowFeatureWindow(IWin32Window owner, object sender)
		{
			DialogResult result = DialogResult.Cancel;

			// get the executing window manager
			WindowManager windowManager = WindowManager.GetExecutingInstance();

			// create the features window
			FeatureWindow window = new FeatureWindow();

			// ask the window manager if we can show the window
			if (windowManager.CanShow(window, new object[] {}))
			{
				// ask the window manager to track the window
				windowManager.BeginTrackingLifetime(window, SnapIns.SnapInHostingEngine.WindowKeys.FeaturesWindowKey);

				// build the list of features to display
				FeatureCollectionEventArgs cea = new FeatureCollectionEventArgs();			
				FeatureEngine.OnBuildingFeatureList(sender, cea);

				// select the features into the feature window
				window.SelectedFeatures = cea.Features;

				// show the window modally
				result = (owner == null ? window.ShowDialog() : window.ShowDialog(owner));
			}
			
			// if the result is ok, then something may need to be dealt with
			if (result == DialogResult.OK)
			{
				// grab the checked features
				FeatureCollection features = window.CheckedFeatures;

				// iterate over each feature 
				foreach(Feature feature in features)
				{
					// see if anyone wants to cancel the action on the feature
					FeatureCancelEventArgs fcea = new FeatureCancelEventArgs(feature, false);
					FeatureEngine.OnBeforeActionTakenForFeature(sender, fcea);
					if (!fcea.Cancel)
					{
						// take the action on the feature
						FeatureEventArgs fea = new FeatureEventArgs(feature);
						FeatureEngine.OnTakeActionForFeature(sender, fea);
							
						// notify others that an action has been taken on a feature
						FeatureEngine.OnAfterActionTakenForFeature(sender, fea);
					}
				}		
			}

			return result;
		}