]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/preferences/EditTemplateDialog.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / preferences / EditTemplateDialog.java
diff --git a/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/preferences/EditTemplateDialog.java b/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/preferences/EditTemplateDialog.java
new file mode 100644 (file)
index 0000000..64a351e
--- /dev/null
@@ -0,0 +1,691 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.preferences;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.ibm.icu.text.Collator;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+import org.eclipse.core.expressions.Expression;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.commands.ActionHandler;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+
+import org.eclipse.ui.ActiveShellExpression;
+import org.eclipse.ui.IWorkbenchCommandConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerActivation;
+import org.eclipse.ui.handlers.IHandlerService;
+
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.IUpdate;
+
+import org.eclipse.jdt.ui.IContextMenuConstants;
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jdt.ui.text.IJavaPartitions;
+import org.eclipse.jdt.ui.text.JavaTextTools;
+
+import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer;
+import org.eclipse.jdt.internal.ui.text.template.preferences.TemplateVariableProcessor;
+import org.eclipse.jdt.internal.ui.util.SWTUtil;
+
+
+/**
+ * Dialog to edit a template.
+ * <p>
+ * <strong>Note:</strong> This is a copy of org.eclipse.ui.texteditor.templates.TemplatePreferencePage.EditTemplateDialog
+ * which we should try to eliminate (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=208865).
+ * </p>
+ */
+public class EditTemplateDialog extends StatusDialog {
+
+       private static class TextViewerAction extends Action implements IUpdate {
+
+               private int fOperationCode= -1;
+               private ITextOperationTarget fOperationTarget;
+
+               /**
+                * Creates a new action.
+                *
+                * @param viewer the viewer
+                * @param operationCode the opcode
+                */
+               public TextViewerAction(ITextViewer viewer, int operationCode) {
+                       fOperationCode= operationCode;
+                       fOperationTarget= viewer.getTextOperationTarget();
+                       update();
+               }
+
+               /**
+                * Updates the enabled state of the action.
+                * Fires a property change if the enabled state changes.
+                *
+                * @see Action#firePropertyChange(String, Object, Object)
+                */
+               public void update() {
+                       // XXX: workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=206111
+                       if (fOperationCode == ITextOperationTarget.UNDO || fOperationCode == ITextOperationTarget.REDO)
+                               return;
+
+                       boolean wasEnabled= isEnabled();
+                       boolean isEnabled= (fOperationTarget != null && fOperationTarget.canDoOperation(fOperationCode));
+                       setEnabled(isEnabled);
+
+                       if (wasEnabled != isEnabled) {
+                               firePropertyChange(ENABLED, wasEnabled ? Boolean.TRUE : Boolean.FALSE, isEnabled ? Boolean.TRUE : Boolean.FALSE);
+                       }
+               }
+
+               /**
+                * @see Action#run()
+                */
+               @Override
+               public void run() {
+                       if (fOperationCode != -1 && fOperationTarget != null) {
+                               fOperationTarget.doOperation(fOperationCode);
+                       }
+               }
+       }
+
+       private Template fTemplate;
+
+       private Text fNameText;
+       private Text fDescriptionText;
+       private Combo fContextCombo;
+       private SourceViewer fPatternEditor;
+       private Button fInsertVariableButton;
+       private Button fAutoInsertCheckbox;
+       private boolean fIsNameModifiable;
+
+       private StatusInfo fValidationStatus;
+       private boolean fSuppressError= true; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=4354
+       private Map<String, TextViewerAction> fGlobalActions= new HashMap<String, TextViewerAction>(10);
+       private List<String> fSelectionActions = new ArrayList<String>(3);
+       private String[][] fContextTypes;
+
+       private ContextTypeRegistry fContextTypeRegistry;
+
+       private final TemplateVariableProcessor fTemplateProcessor= new TemplateVariableProcessor();
+
+       /**
+        * Creates a new dialog.
+        *
+        * @param parent the shell parent of the dialog
+        * @param template the template to edit
+        * @param edit whether this is a new template or an existing being edited
+        * @param isNameModifiable whether the name of the template may be modified
+        * @param registry the context type registry to use
+        */
+       public EditTemplateDialog(Shell parent, Template template, boolean edit, boolean isNameModifiable, ContextTypeRegistry registry) {
+               super(parent);
+
+               String title= edit
+                       ? PreferencesMessages.EditTemplateDialog_title_edit
+                       : PreferencesMessages.EditTemplateDialog_title_new;
+               setTitle(title);
+
+               fTemplate= template;
+               fIsNameModifiable= isNameModifiable;
+
+               String delim= new Document().getLegalLineDelimiters()[0];
+
+               List<String[]> contexts= new ArrayList<String[]>();
+               for (Iterator<TemplateContextType> it= registry.contextTypes(); it.hasNext();) {
+                       TemplateContextType type= it.next();
+                       if (type.getId().equals("javadoc")) //$NON-NLS-1$
+                               contexts.add(new String[] { type.getId(), type.getName(), "/**" + delim }); //$NON-NLS-1$
+                       else
+                               contexts.add(0, new String[] { type.getId(), type.getName(), "" }); //$NON-NLS-1$
+               }
+               Collections.sort(contexts, new Comparator<String[]>() {
+                       Collator fCollator= Collator.getInstance();
+                       public int compare(String[] o1, String[] o2) {
+                               return fCollator.compare(o1[1], o2[1]);
+                       }
+               });
+               fContextTypes= contexts.toArray(new String[contexts.size()][]);
+
+               fValidationStatus= new StatusInfo();
+
+               fContextTypeRegistry= registry;
+
+               TemplateContextType type= fContextTypeRegistry.getContextType(template.getContextTypeId());
+               fTemplateProcessor.setContextType(type);
+       }
+
+       /*
+        * @see org.eclipse.jface.dialogs.Dialog#isResizable()
+        * @since 3.4
+        */
+       @Override
+       protected boolean isResizable() {
+               return true;
+       }
+
+       /*
+        * @see org.eclipse.jdt.internal.ui.dialogs.StatusDialog#create()
+        */
+       @Override
+       public void create() {
+               super.create();
+               updateStatusAndButtons();
+               getButton(IDialogConstants.OK_ID).setEnabled(getStatus().isOK());
+       }
+
+       /*
+        * @see Dialog#createDialogArea(Composite)
+        */
+       @Override
+       protected Control createDialogArea(Composite ancestor) {
+               Composite parent= new Composite(ancestor, SWT.NONE);
+               GridLayout layout= new GridLayout();
+               layout.numColumns= 2;
+               layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+               layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+               layout.verticalSpacing= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+               layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+
+               parent.setLayout(layout);
+               parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+               ModifyListener listener= new ModifyListener() {
+                       public void modifyText(ModifyEvent e) {
+                               doTextWidgetChanged(e.widget);
+                       }
+               };
+
+               if (fIsNameModifiable) {
+                       createLabel(parent, PreferencesMessages.EditTemplateDialog_name);
+
+                       Composite composite= new Composite(parent, SWT.NONE);
+                       composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+                       layout= new GridLayout();
+                       layout.numColumns= 4;
+                       layout.marginWidth= 0;
+                       layout.marginHeight= 0;
+                       composite.setLayout(layout);
+
+                       fNameText= createText(composite);
+                       fNameText.addFocusListener(new FocusListener() {
+
+                               public void focusGained(FocusEvent e) {
+                               }
+
+                               public void focusLost(FocusEvent e) {
+                                       if (fSuppressError) {
+                                               fSuppressError= false;
+                                               updateStatusAndButtons();
+                                       }
+                               }
+                       });
+
+                       createLabel(composite, PreferencesMessages.EditTemplateDialog_context);
+                       fContextCombo= new Combo(composite, SWT.READ_ONLY);
+                       SWTUtil.setDefaultVisibleItemCount(fContextCombo);
+
+                       for (int i= 0; i < fContextTypes.length; i++) {
+                               fContextCombo.add(fContextTypes[i][1]);
+                       }
+
+                       fContextCombo.addModifyListener(listener);
+
+                       fAutoInsertCheckbox= createCheckbox(composite, PreferencesMessages.EditTemplateDialog_autoinsert);
+                       fAutoInsertCheckbox.setSelection(fTemplate.isAutoInsertable());
+               }
+
+               createLabel(parent, PreferencesMessages.EditTemplateDialog_description);
+
+               int descFlags= fIsNameModifiable ? SWT.BORDER : SWT.BORDER | SWT.READ_ONLY;
+               fDescriptionText= new Text(parent, descFlags );
+               fDescriptionText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               fDescriptionText.addModifyListener(listener);
+
+               Label patternLabel= createLabel(parent, PreferencesMessages.EditTemplateDialog_pattern);
+               patternLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+               fPatternEditor= createEditor(parent);
+
+               Label filler= new Label(parent, SWT.NONE);
+               filler.setLayoutData(new GridData());
+
+               Composite composite= new Composite(parent, SWT.NONE);
+               layout= new GridLayout();
+               layout.marginWidth= 0;
+               layout.marginHeight= 0;
+               composite.setLayout(layout);
+               composite.setLayoutData(new GridData());
+
+               fInsertVariableButton= new Button(composite, SWT.NONE);
+               fInsertVariableButton.setLayoutData(getButtonGridData());
+               fInsertVariableButton.setText(PreferencesMessages.EditTemplateDialog_insert_variable);
+               fInsertVariableButton.addSelectionListener(new SelectionListener() {
+                       public void widgetSelected(SelectionEvent e) {
+                               fPatternEditor.getTextWidget().setFocus();
+                               fPatternEditor.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
+                       }
+
+                       public void widgetDefaultSelected(SelectionEvent e) {}
+               });
+
+               fDescriptionText.setText(fTemplate.getDescription());
+               if (fIsNameModifiable) {
+                       fNameText.setText(fTemplate.getName());
+                       fNameText.addModifyListener(listener);
+                       fContextCombo.select(getIndex(fTemplate.getContextTypeId()));
+               } else {
+                       fPatternEditor.getControl().setFocus();
+               }
+               initializeActions();
+
+               applyDialogFont(parent);
+               return composite;
+       }
+
+       protected void doTextWidgetChanged(Widget w) {
+               if (w == fNameText) {
+                       fSuppressError= false;
+                       updateStatusAndButtons();
+               } else if (w == fContextCombo) {
+                       String contextId= getContextId();
+                       fTemplateProcessor.setContextType(fContextTypeRegistry.getContextType(contextId));
+                       IDocument document= fPatternEditor.getDocument();
+                       String prefix= getPrefix();
+                       document.set(prefix + getPattern());
+                       fPatternEditor.setVisibleRegion(prefix.length(), document.getLength() - prefix.length());
+                       updateStatusAndButtons();
+               } else if (w == fDescriptionText) {
+                       // nothing
+               }
+       }
+
+       private String getContextId() {
+               if (fContextCombo != null && !fContextCombo.isDisposed()) {
+                       String name= fContextCombo.getText();
+                       for (int i= 0; i < fContextTypes.length; i++) {
+                               if (name.equals(fContextTypes[i][1])) {
+                                       return fContextTypes[i][0];
+                               }
+                       }
+               }
+
+               return fTemplate.getContextTypeId();
+       }
+
+       protected void doSourceChanged(IDocument document) {
+               String text= document.get();
+               fValidationStatus.setOK();
+               TemplateContextType contextType= fContextTypeRegistry.getContextType(getContextId());
+               if (contextType != null) {
+                       try {
+                               contextType.validate(text);
+                       } catch (TemplateException e) {
+                               fValidationStatus.setError(e.getLocalizedMessage());
+                       }
+               }
+
+               updateAction(ITextEditorActionConstants.UNDO);
+               updateStatusAndButtons();
+       }
+
+       private static GridData getButtonGridData() {
+               GridData data= new GridData(GridData.FILL_HORIZONTAL);
+               return data;
+       }
+
+       private static Label createLabel(Composite parent, String name) {
+               Label label= new Label(parent, SWT.NULL);
+               label.setText(name);
+               label.setLayoutData(new GridData());
+
+               return label;
+       }
+
+       private static Button createCheckbox(Composite parent, String name) {
+               Button button= new Button(parent, SWT.CHECK);
+               button.setText(name);
+               button.setLayoutData(new GridData());
+
+               return button;
+       }
+
+       private static Text createText(Composite parent) {
+               Text text= new Text(parent, SWT.BORDER);
+               text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               return text;
+       }
+
+       private SourceViewer createEditor(Composite parent) {
+               String prefix= getPrefix();
+               IDocument document= new Document(prefix + fTemplate.getPattern());
+               JavaTextTools tools= JavaPlugin.getDefault().getJavaTextTools();
+               tools.setupJavaDocumentPartitioner(document, IJavaPartitions.JAVA_PARTITIONING);
+               IPreferenceStore store= JavaPlugin.getDefault().getCombinedPreferenceStore();
+               SourceViewer viewer= new JavaSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, store);
+               CodeTemplateSourceViewerConfiguration configuration= new CodeTemplateSourceViewerConfiguration(tools.getColorManager(), store, null, fTemplateProcessor);
+               viewer.configure(configuration);
+               viewer.setEditable(true);
+               viewer.setDocument(document, prefix.length(), document.getLength() - prefix.length());
+
+               Font font= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT);
+               viewer.getTextWidget().setFont(font);
+               new JavaSourcePreviewerUpdater(viewer, configuration, store);
+
+               int nLines= document.getNumberOfLines();
+               if (nLines < 5) {
+                       nLines= 5;
+               } else if (nLines > 12) {
+                       nLines= 12;
+               }
+
+               Control control= viewer.getControl();
+               GridData data= new GridData(GridData.FILL_BOTH);
+               data.widthHint= convertWidthInCharsToPixels(80);
+               data.heightHint= convertHeightInCharsToPixels(nLines);
+               control.setLayoutData(data);
+
+               viewer.addTextListener(new ITextListener() {
+                       public void textChanged(TextEvent event) {
+                               if (event .getDocumentEvent() != null)
+                                       doSourceChanged(event.getDocumentEvent().getDocument());
+                       }
+               });
+
+               viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               updateSelectionDependentActions();
+                       }
+               });
+
+               return viewer;
+       }
+
+       private String getPrefix() {
+               String id= getContextId();
+               int idx= getIndex(id);
+               if (idx != -1)
+                       return fContextTypes[idx][2];
+               else
+                       return ""; //$NON-NLS-1$
+       }
+
+       private void initializeActions() {
+               final ArrayList<IHandlerActivation> handlerActivations= new ArrayList<IHandlerActivation>(3);
+               final IHandlerService handlerService= (IHandlerService) PlatformUI.getWorkbench().getAdapter(IHandlerService.class);
+               final Expression expression= new ActiveShellExpression(fPatternEditor.getControl().getShell());
+
+               getShell().addDisposeListener(new DisposeListener() {
+                       public void widgetDisposed(DisposeEvent e) {
+                               handlerService.deactivateHandlers(handlerActivations);
+                               }
+                                               });
+
+               fPatternEditor.getTextWidget().addFocusListener(new FocusListener() {
+                       public void focusLost(FocusEvent e) {
+                               handlerService.deactivateHandlers(handlerActivations);
+                       }
+                       public void focusGained(FocusEvent e) {
+                               IAction action= fGlobalActions.get(ITextEditorActionConstants.REDO);
+                               handlerActivations.add(handlerService.activateHandler(IWorkbenchCommandConstants.EDIT_REDO, new ActionHandler(action), expression));
+                               action= fGlobalActions.get(ITextEditorActionConstants.UNDO);
+                               handlerActivations.add(handlerService.activateHandler(IWorkbenchCommandConstants.EDIT_UNDO, new ActionHandler(action), expression));
+                               action= fGlobalActions.get(ITextEditorActionConstants.CONTENT_ASSIST);
+                               handlerActivations.add(handlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new ActionHandler(action), expression));
+                       }
+               });
+
+
+               TextViewerAction action= new TextViewerAction(fPatternEditor, ITextOperationTarget.UNDO);
+               action.setText(PreferencesMessages.EditTemplateDialog_undo);
+               fGlobalActions.put(ITextEditorActionConstants.UNDO, action);
+
+               action= new TextViewerAction(fPatternEditor, ITextOperationTarget.REDO);
+               action.setText(PreferencesMessages.EditTemplateDialog_redo);
+               fGlobalActions.put(ITextEditorActionConstants.REDO, action);
+
+               action= new TextViewerAction(fPatternEditor, ITextOperationTarget.CUT);
+               action.setText(PreferencesMessages.EditTemplateDialog_cut);
+               fGlobalActions.put(ITextEditorActionConstants.CUT, action);
+
+               action= new TextViewerAction(fPatternEditor, ITextOperationTarget.COPY);
+               action.setText(PreferencesMessages.EditTemplateDialog_copy);
+               fGlobalActions.put(ITextEditorActionConstants.COPY, action);
+
+               action= new TextViewerAction(fPatternEditor, ITextOperationTarget.PASTE);
+               action.setText(PreferencesMessages.EditTemplateDialog_paste);
+               fGlobalActions.put(ITextEditorActionConstants.PASTE, action);
+
+               action= new TextViewerAction(fPatternEditor, ITextOperationTarget.SELECT_ALL);
+               action.setText(PreferencesMessages.EditTemplateDialog_select_all);
+               fGlobalActions.put(ITextEditorActionConstants.SELECT_ALL, action);
+
+               action= new TextViewerAction(fPatternEditor, ISourceViewer.CONTENTASSIST_PROPOSALS);
+               action.setText(PreferencesMessages.EditTemplateDialog_content_assist);
+               fGlobalActions.put(ITextEditorActionConstants.CONTENT_ASSIST, action);
+
+               fSelectionActions.add(ITextEditorActionConstants.CUT);
+               fSelectionActions.add(ITextEditorActionConstants.COPY);
+               fSelectionActions.add(ITextEditorActionConstants.PASTE);
+
+               // create context menu
+               MenuManager manager= new MenuManager(null, null);
+               manager.setRemoveAllWhenShown(true);
+               manager.addMenuListener(new IMenuListener() {
+                       public void menuAboutToShow(IMenuManager mgr) {
+                               fillContextMenu(mgr);
+                       }
+               });
+
+               StyledText text= fPatternEditor.getTextWidget();
+               Menu menu= manager.createContextMenu(text);
+               text.setMenu(menu);
+       }
+
+       private void fillContextMenu(IMenuManager menu) {
+               menu.add(new GroupMarker(ITextEditorActionConstants.GROUP_UNDO));
+               menu.appendToGroup(ITextEditorActionConstants.GROUP_UNDO, fGlobalActions.get(ITextEditorActionConstants.UNDO));
+               menu.appendToGroup(ITextEditorActionConstants.GROUP_UNDO, fGlobalActions.get(ITextEditorActionConstants.REDO));
+
+               menu.add(new Separator(ITextEditorActionConstants.GROUP_EDIT));
+               menu.appendToGroup(ITextEditorActionConstants.GROUP_EDIT, fGlobalActions.get(ITextEditorActionConstants.CUT));
+               menu.appendToGroup(ITextEditorActionConstants.GROUP_EDIT, fGlobalActions.get(ITextEditorActionConstants.COPY));
+               menu.appendToGroup(ITextEditorActionConstants.GROUP_EDIT, fGlobalActions.get(ITextEditorActionConstants.PASTE));
+               menu.appendToGroup(ITextEditorActionConstants.GROUP_EDIT, fGlobalActions.get(ITextEditorActionConstants.SELECT_ALL));
+
+               menu.add(new Separator(IContextMenuConstants.GROUP_GENERATE));
+               menu.appendToGroup(IContextMenuConstants.GROUP_GENERATE, fGlobalActions.get("ContentAssistProposal")); //$NON-NLS-1$
+       }
+
+
+       protected void updateSelectionDependentActions() {
+               Iterator<String> iterator= fSelectionActions.iterator();
+               while (iterator.hasNext())
+                       updateAction(iterator.next());
+       }
+
+       protected void updateAction(String actionId) {
+               IAction action= fGlobalActions.get(actionId);
+               if (action instanceof IUpdate)
+                       ((IUpdate) action).update();
+       }
+
+       private int getIndex(String contextid) {
+
+               if (contextid == null)
+                       return -1;
+
+               for (int i= 0; i < fContextTypes.length; i++) {
+                       if (contextid.equals(fContextTypes[i][0])) {
+                               return i;
+                       }
+               }
+               return -1;
+       }
+
+       @Override
+       protected void okPressed() {
+               String name= fNameText == null ? fTemplate.getName() : fNameText.getText();
+               boolean isAutoInsertable= fAutoInsertCheckbox != null && fAutoInsertCheckbox.getSelection();
+               fTemplate= new Template(name, fDescriptionText.getText(), getContextId(), getPattern(), isAutoInsertable);
+               super.okPressed();
+       }
+
+       private void updateStatusAndButtons() {
+               StatusInfo status= fValidationStatus;
+               boolean isEmpty= fNameText != null && fNameText.getText().length() == 0;
+               if (!fSuppressError && isEmpty) {
+                       status= new StatusInfo();
+                       status.setError(PreferencesMessages.EditTemplateDialog_error_noname);
+               } else if (fNameText != null && !isValidTemplateName(fNameText.getText())) {
+                       status= new StatusInfo();
+                       status.setError(PreferencesMessages.EditTemplateDialog_error_invalidName);
+               } else if (!isValidPattern(fPatternEditor.getDocument().get())) {
+                       status= new StatusInfo();
+                       status.setError(PreferencesMessages.EditTemplateDialog_error_invalidPattern);
+               }
+               updateStatus(status);
+       }
+
+       /**
+        * Validates the pattern.
+        * <p>
+        * This implementation rejects invalid XML characters.
+        * </p>
+        * 
+        * @param pattern the pattern to verify
+        * @return <code>true</code> if the pattern is valid
+        * @since 3.6
+        */
+       private boolean isValidPattern(String pattern) {
+               for (int i= 0; i < pattern.length(); i++) {
+                       char ch= pattern.charAt(i);
+                       if (!(ch == 9 || ch == 10 || ch == 13 || ch >= 32))
+                               return false;
+               }
+               return true;
+       }
+
+       /**
+        * Checks whether the given string is a valid template name.
+        * 
+        * @param name the string to test
+        * @return <code>true</code> if the name is valid
+        * @since 3.3.1
+        */
+       private boolean isValidTemplateName(String name) {
+               return name.length() == 0 || name.trim().length() != 0;
+       }
+
+       /*
+        * @see org.eclipse.jface.window.Window#configureShell(Shell)
+        */
+       @Override
+       protected void configureShell(Shell newShell) {
+               super.configureShell(newShell);
+               PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, IJavaHelpContextIds.EDIT_TEMPLATE_DIALOG);
+       }
+
+       /**
+        * Returns the created template.
+        *
+        * @return the created template
+        * @since 3.1
+        */
+       public Template getTemplate() {
+               return fTemplate;
+       }
+
+       private String getPattern() {
+               IDocument doc= fPatternEditor.getDocument();
+               IRegion visible= fPatternEditor.getVisibleRegion();
+               try {
+                       return doc.get(visible.getOffset(), doc.getLength() - visible.getOffset());
+               } catch (BadLocationException e) {
+                       return ""; //$NON-NLS-1$
+               }
+       }
+
+       /*
+        * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
+        * @since 3.2
+        */
+       @Override
+       protected IDialogSettings getDialogBoundsSettings() {
+               String sectionName= getClass().getName() + "_dialogBounds"; //$NON-NLS-1$
+               IDialogSettings settings= JavaPlugin.getDefault().getDialogSettings();
+               IDialogSettings section= settings.getSection(sectionName);
+               if (section == null)
+                       section= settings.addNewSection(sectionName);
+               return section;
+       }
+
+}