void InitializeFields(ExtractInterfaceOptions o)
		{
			this.options = o;

			this.txtInterfaceName.Text = o.NewInterfaceName;
			this.txtNewFileName.Text = o.SuggestedFileName;
			this.txtGeneratedName.Text = o.FullyQualifiedName;
			
			IClass c = o.ClassEntity;
			foreach (IMethod m in c.Methods) {
				if (m.IsPublic && !m.IsConstructor && !m.IsConst && !m.IsStatic) {
					this.possibleInterfaceMembers.Add(m);
					this.selectMembersListBox.Items.Add(FormatMemberForDisplay(m), CheckState.Checked);
				}
			}
			foreach (IProperty p in c.Properties) {
				if (p.IsPublic && !p.IsConst && !p.IsStatic) {
					this.possibleInterfaceMembers.Add(p);
					this.selectMembersListBox.Items.Add(FormatMemberForDisplay(p), CheckState.Checked);
				}
			}
			foreach (IEvent classEvent in c.Events) {
				if (classEvent.IsPublic && !classEvent.IsStatic) {
					this.possibleInterfaceMembers.Add(classEvent);
					this.selectMembersListBox.Items.Add(FormatMemberForDisplay(classEvent), CheckState.Checked);
				}
			}
		}
        public static void ExtractInterface(IClass c)
        {
            ExtractInterfaceOptions extractInterface = new ExtractInterfaceOptions(c);

            using (ExtractInterfaceDialog eid = new ExtractInterfaceDialog()) {
                extractInterface = eid.ShowDialog(extractInterface);
                if (extractInterface.IsCancelled)
                {
                    return;
                }

                // do rename

                /*
                 * MessageService.ShowMessageFormatted("Extracting interface",
                 *                                  @"Extracting {0} [{1}] from {2} into {3}",
                 *                                  extractInterface.NewInterfaceName,
                 *                                  extractInterface.FullyQualifiedName,
                 *                                  extractInterface.ClassEntity.Name,
                 *                                  extractInterface.NewFileName
                 *                                 );
                 * `				*/
            }

            string newInterfaceFileName = Path.Combine(Path.GetDirectoryName(c.CompilationUnit.FileName),
                                                       extractInterface.NewFileName);

            if (File.Exists(newInterfaceFileName))
            {
                int confirmReplace = MessageService.ShowCustomDialog("Extract Interface",
                                                                     newInterfaceFileName + " already exists!",
                                                                     0,
                                                                     1,
                                                                     "${res:Global.ReplaceButtonText}",
                                                                     "${res:Global.AbortButtonText}");
                if (confirmReplace != 0)
                {
                    return;
                }
            }

            LanguageProperties language          = c.ProjectContent.Language;
            string             classFileName     = c.CompilationUnit.FileName;
            string             existingClassCode = ParserService.GetParseableFileContent(classFileName).Text;

            // build the new interface...
            string newInterfaceCode = language.RefactoringProvider.GenerateInterfaceForClass(extractInterface.NewInterfaceName,
                                                                                             existingClassCode,
                                                                                             extractInterface.ChosenMembers,
                                                                                             c, extractInterface.IncludeComments);

            if (newInterfaceCode == null)
            {
                return;
            }

            // ...dump it to a file...
            IViewContent        viewContent = FileService.GetOpenFile(newInterfaceFileName);
            ITextEditorProvider editable    = viewContent as ITextEditorProvider;

            if (viewContent != null && editable != null)
            {
                // simply update it
                editable.TextEditor.Document.Text = newInterfaceCode;
                viewContent.PrimaryFile.SaveToDisk();
            }
            else
            {
                // create it
                viewContent = FileService.NewFile(newInterfaceFileName, newInterfaceCode);
                viewContent.PrimaryFile.SaveToDisk(newInterfaceFileName);

                // ... and add it to the project
                IProject project = (IProject)c.ProjectContent.Project;
                if (project != null)
                {
                    FileProjectItem projectItem = new FileProjectItem(project, ItemType.Compile);
                    projectItem.FileName = newInterfaceFileName;
                    ProjectService.AddProjectItem(project, projectItem);
                    FileService.FireFileCreated(newInterfaceFileName, false);
                    project.Save();
                    ProjectBrowserPad.RefreshViewAsync();
                }
            }

            ICompilationUnit newCompilationUnit = ParserService.ParseFile(newInterfaceFileName).CompilationUnit;
            IClass           newInterfaceDef    = newCompilationUnit.Classes[0];

            // finally, add the interface to the base types of the class that we're extracting from
            if (extractInterface.AddInterfaceToClass)
            {
                string modifiedClassCode = language.RefactoringProvider.AddBaseTypeToClass(existingClassCode, c, newInterfaceDef);
                if (modifiedClassCode == null)
                {
                    return;
                }

                // TODO: replacing the whole text is not an option, we would loose all breakpoints/bookmarks.
                viewContent = FileService.OpenFile(classFileName);
                editable    = viewContent as ITextEditorProvider;
                if (editable == null)
                {
                    return;
                }
                editable.TextEditor.Document.Text = modifiedClassCode;
            }
        }
		public static void ExtractInterface(IClass c)
		{
			ExtractInterfaceOptions extractInterface = new ExtractInterfaceOptions(c);
			using (ExtractInterfaceDialog eid = new ExtractInterfaceDialog()) {
				extractInterface = eid.ShowDialog(extractInterface);
				if (extractInterface.IsCancelled) {
					return;
				}
				
				// do rename
				/*
				 MessageService.ShowMessageFormatted("Extracting interface",
				                                    @"Extracting {0} [{1}] from {2} into {3}",
				                                    extractInterface.NewInterfaceName,
				                                    extractInterface.FullyQualifiedName,
				                                    extractInterface.ClassEntity.Name,
				                                    extractInterface.NewFileName
				                                   );
`				*/
			}
			
			string newInterfaceFileName = Path.Combine(Path.GetDirectoryName(c.CompilationUnit.FileName),
			                                           extractInterface.NewFileName);
			if (File.Exists(newInterfaceFileName)) {
				int confirmReplace = MessageService.ShowCustomDialog("Extract Interface",
				                                                     newInterfaceFileName+" already exists!",
				                                                     0,
				                                                     1,
				                                                     "${res:Global.ReplaceButtonText}",
				                                                     "${res:Global.AbortButtonText}");
				if (confirmReplace != 0) {
					return;
				}
			}
			
			LanguageProperties language = c.ProjectContent.Language;
			string classFileName = c.CompilationUnit.FileName;
			string existingClassCode = ParserService.GetParseableFileContent(classFileName).Text;
			
			// build the new interface...
			string newInterfaceCode = language.RefactoringProvider.GenerateInterfaceForClass(extractInterface.NewInterfaceName,
			                                                                                 existingClassCode,
			                                                                                 extractInterface.ChosenMembers,
			                                                                                 c, extractInterface.IncludeComments);
			if (newInterfaceCode == null)
				return;
			
			// ...dump it to a file...
			IViewContent viewContent = FileService.GetOpenFile(newInterfaceFileName);
			ITextEditorProvider editable = viewContent as ITextEditorProvider;
			
			if (viewContent != null && editable != null) {
				// simply update it
				editable.TextEditor.Document.Text = newInterfaceCode;
				viewContent.PrimaryFile.SaveToDisk();
			} else {
				// create it
				viewContent = FileService.NewFile(newInterfaceFileName, newInterfaceCode);
				viewContent.PrimaryFile.SaveToDisk(newInterfaceFileName);

				// ... and add it to the project
				IProject project = (IProject)c.ProjectContent.Project;
				if (project != null) {
					FileProjectItem projectItem = new FileProjectItem(project, ItemType.Compile);
					projectItem.FileName = newInterfaceFileName;
					ProjectService.AddProjectItem(project, projectItem);
					FileService.FireFileCreated(newInterfaceFileName, false);
					project.Save();
					ProjectBrowserPad.RefreshViewAsync();
				}
			}
			
			ICompilationUnit newCompilationUnit = ParserService.ParseFile(newInterfaceFileName).CompilationUnit;
			IClass newInterfaceDef = newCompilationUnit.Classes[0];
			
			// finally, add the interface to the base types of the class that we're extracting from
			if (extractInterface.AddInterfaceToClass) {
				string modifiedClassCode = language.RefactoringProvider.AddBaseTypeToClass(existingClassCode, c, newInterfaceDef);
				if (modifiedClassCode == null) {
					return;
				}
				
				// TODO: replacing the whole text is not an option, we would loose all breakpoints/bookmarks.
				viewContent = FileService.OpenFile(classFileName);
				editable = viewContent as ITextEditorProvider;
				if (editable == null) {
					return;
				}
				editable.TextEditor.Document.Text = modifiedClassCode;
			}
		}
		/// <summary>
		/// A custom ShowDialog routine that handles pass-through deserialization and reserialization
		/// of a <see cref="ExtractInterfaceOptions"/> object to encapsulate this operation's
		/// parameters.
		/// </summary>
		/// <param name="options">
		/// A <see cref="ExtractInterfaceOptions"/> containing initial, default values for the operation.
		/// </param>
		/// <returns>
		/// A <see cref="ExtractInterfaceOptions"/> reference encapsulating the dialog's parameters.
		/// </returns>
		public ExtractInterfaceOptions ShowDialog(ExtractInterfaceOptions options)
		{
			InitializeFields(options);
			options.IsCancelled = (base.ShowDialog() == DialogResult.Cancel);
			return options;
		}
		/// <summary>
		/// A custom ShowDialog routine that handles pass-through deserialization and reserialization
		/// of a <see cref="ExtractInterfaceOptions"/> object to encapsulate this operation's
		/// parameters.
		/// </summary>
		/// <param name="options">
		/// A <see cref="ExtractInterfaceOptions"/> containing initial, default values for the operation.
		/// </param>
		/// <returns>
		/// A <see cref="ExtractInterfaceOptions"/> reference encapsulating the dialog's parameters.
		/// </returns>
		public ExtractInterfaceOptions ShowDialog(ExtractInterfaceOptions options)
		{
			InitializeFields(options);
			options.IsCancelled = (base.ShowDialog(WorkbenchSingleton.MainWin32Window) == DialogResult.Cancel);
			return options;
		}