public TemplateCompletionData(CodeTemplate template, bool automaticInsert)
				: base(template.Shortcut,
				       template.Description + StringParser.Parse("\n${res:Dialog.Options.CodeTemplate.PressTabToInsertTemplate}\n\n") + template.Text,
				       ClassBrowserIconService.CodeTemplateIndex)
			{
				this.template = template;
				this.automaticInsert = automaticInsert;
			}
			public TemplateCompletionData(CodeTemplate template)
			{
				this.template = template;
			}
		ArrayList CopyCodeTemplateGroups(ArrayList groups)
		{
			ArrayList copiedGroups = new ArrayList();
			foreach (CodeTemplateGroup group in groups) {
				CodeTemplateGroup newGroup = new CodeTemplateGroup(String.Join(";", group.ExtensionStrings));
				foreach (CodeTemplate template in group.Templates) {
					CodeTemplate newTemplate = new CodeTemplate(template.Shortcut, template.Description, template.Text);
					newGroup.Templates.Add(newTemplate);
				}
				copiedGroups.Add(newGroup);
			}
			return copiedGroups;
		}
		void EditEvent(object sender, System.EventArgs e)
		{
			int i = GetCurrentIndex();
			if (i != -1) {
				ListViewItem item = ((ListView)ControlDictionary["templateListView"]).SelectedItems[0];
				CodeTemplate template = (CodeTemplate)item.Tag;
				template = new CodeTemplate(template.Shortcut, template.Description, template.Text);
				
				using (EditTemplateDialog etd = new EditTemplateDialog(template)) {
					if (etd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) {
						item.Tag = template;
						StoreTemplateGroup();
					}
				}
				
				BuildListView();
			}
		}
		void AddEvent(object sender, System.EventArgs e)
		{
			CodeTemplate newTemplate = new CodeTemplate();
			using (EditTemplateDialog etd = new EditTemplateDialog(newTemplate)) {
				if (etd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) {
					CurrentTemplateGroup.Templates.Add(newTemplate);
					((ListView)ControlDictionary["templateListView"]).SelectedItems.Clear();
					BuildListView();
					((ListView)ControlDictionary["templateListView"]).Select();
				}
			}
		}
		public EditTemplateDialog(CodeTemplate codeTemplate)
		{
			this.codeTemplate = codeTemplate;
			InitializeComponents();
		}
        /// <remarks>
        /// This method inserts a code template at the current caret position
        /// </remarks>
        public void InsertTemplate(CodeTemplate template)
        {
            string selectedText = String.Empty;
            Document.UndoStack.StartUndoGroup();
            if (base.ActiveTextAreaControl.TextArea.SelectionManager.HasSomethingSelected) {
                selectedText = base.ActiveTextAreaControl.TextArea.SelectionManager.SelectedText;
                ActiveTextAreaControl.TextArea.Caret.Position = ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection[0].StartPosition;
                base.ActiveTextAreaControl.TextArea.SelectionManager.RemoveSelectedText();
            }

            // save old properties, these properties cause strange effects, when not
            // be turned off (like insert curly braces or other formatting stuff)

            string templateText = StringParser.Parse(template.Text, new string[,] { { "Selection", selectedText } });
            int finalCaretOffset = templateText.IndexOf('|');
            if (finalCaretOffset >= 0) {
                templateText = templateText.Remove(finalCaretOffset, 1);
            } else {
                finalCaretOffset = templateText.Length;
            }
            int caretOffset = ActiveTextAreaControl.TextArea.Caret.Offset;

            BeginUpdate();
            int beginLine = ActiveTextAreaControl.TextArea.Caret.Line;
            Document.Insert(caretOffset, templateText);

            ActiveTextAreaControl.TextArea.Caret.Position = Document.OffsetToPosition(caretOffset + finalCaretOffset);
            int endLine = Document.OffsetToPosition(caretOffset + templateText.Length).Y;

            IndentStyle save1 = TextEditorProperties.IndentStyle;
            TextEditorProperties.IndentStyle = IndentStyle.Smart;
            Console.WriteLine("Indent between {0} and {1}", beginLine, endLine);

            Document.FormattingStrategy.IndentLines(ActiveTextAreaControl.TextArea, beginLine, endLine);

            Document.UndoStack.EndUndoGroup();
            EndUpdate();
            Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
            Document.CommitUpdate();

            // restore old property settings
            TextEditorProperties.IndentStyle = save1;
        }