blob: 449a32290f49eb869e550930a0ce0d9172f80a4e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 xored software, Inc. and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.ui.preferences;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.dltk.internal.ui.editor.ScriptSourceViewer;
import org.eclipse.dltk.internal.ui.preferences.OptionsConfigurationBlock;
import org.eclipse.dltk.internal.ui.preferences.ScriptSourcePreviewerUpdater;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.ITreeListAdapter;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.dltk.internal.ui.wizards.dialogfields.TreeListDialogField;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.IDLTKUILanguageToolkit;
import org.eclipse.dltk.ui.text.ScriptSourceViewerConfiguration;
import org.eclipse.dltk.ui.text.ScriptTextTools;
import org.eclipse.dltk.ui.text.templates.ICodeTemplateAccess;
import org.eclipse.dltk.ui.text.templates.ICodeTemplateCategory;
import org.eclipse.dltk.ui.text.templates.ProjectTemplateStore;
import org.eclipse.dltk.ui.text.templates.TemplateVariableProcessor;
import org.eclipse.dltk.ui.util.IStatusChangeListener;
import org.eclipse.dltk.ui.util.PixelConverter;
import org.eclipse.dltk.ui.viewsupport.BasicElementLabels;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
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.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.text.templates.TemplatePersistenceData;
import org.eclipse.text.templates.TemplateReaderWriter;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
public class CodeTemplateBlock extends OptionsConfigurationBlock {
private class CodeTemplateAdapter extends ViewerComparator implements ITreeListAdapter, IDialogFieldListener {
private final Object[] NO_CHILDREN = new Object[0];
@Override
public void customButtonPressed(TreeListDialogField field, int index) {
doButtonPressed(index, field.getSelectedElements());
}
@Override
public void selectionChanged(TreeListDialogField field) {
List selected = field.getSelectedElements();
field.enableButton(IDX_ADD, canAdd(selected));
field.enableButton(IDX_EDIT, canEdit(selected));
field.enableButton(IDX_REMOVE, canRemove(selected));
field.enableButton(IDX_EXPORT, !selected.isEmpty());
updateSourceViewerInput(selected);
}
@Override
public void doubleClicked(TreeListDialogField field) {
List selected = field.getSelectedElements();
if (canEdit(selected)) {
doButtonPressed(IDX_EDIT, selected);
}
}
@Override
public Object[] getChildren(TreeListDialogField field, Object element) {
if (element instanceof ICodeTemplateCategory) {
ICodeTemplateCategory category = (ICodeTemplateCategory) element;
if (category.isGroup()) {
return getTemplateContextTypes(category);
}
return getTemplatesOfCategory(category);
} else if (element instanceof TemplateContextType) {
return getTemplatesOfContextType(((TemplateContextType) element).getId());
}
return NO_CHILDREN;
}
@Override
public Object getParent(TreeListDialogField field, Object element) {
if (element instanceof TemplatePersistenceData) {
final TemplatePersistenceData data = (TemplatePersistenceData) element;
final String contextTypeId = data.getTemplate().getContextTypeId();
final ICodeTemplateCategory category = codeTemplateAccess.getCategoryOfContextType(contextTypeId);
if (category == null) {
return null;
}
if (category.isGroup()) {
return codeTemplateAccess.getContextTypeRegistry().getContextType(contextTypeId);
}
return category;
} else if (element instanceof TemplateContextType) {
return codeTemplateAccess.getCategoryOfContextType(((TemplateContextType) element).getId());
}
return null;
}
@Override
public boolean hasChildren(TreeListDialogField field, Object element) {
return element instanceof ICodeTemplateCategory || element instanceof TemplateContextType;
}
@Override
public void dialogFieldChanged(DialogField field) {
// if (field == fGenerateComments) {
// setValue(PREF_GENERATE_COMMENTS, fGenerateComments.isSelected());
// }
}
@Override
public void keyPressed(TreeListDialogField field, KeyEvent event) {
}
@Override
public int category(Object element) {
if (element instanceof ICodeTemplateCategory) {
return ((ICodeTemplateCategory) element).getPriority();
}
return 1000;
}
}
private static class CodeTemplateLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (element instanceof ICodeTemplateCategory) {
return ((ICodeTemplateCategory) element).getName();
} else if (element instanceof TemplateContextType) {
return ((TemplateContextType) element).getName();
} else if (element instanceof TemplatePersistenceData) {
final TemplatePersistenceData data = (TemplatePersistenceData) element;
return data.getTemplate().getDescription();
} else {
return element.toString();
}
}
}
// private static final PreferenceKey PREF_GENERATE_COMMENTS =
// getJDTUIKey(PreferenceConstants.CODEGEN_ADD_COMMENTS);
private static PreferenceKey[] getAllKeys() {
return new PreferenceKey[] { /* PREF_GENERATE_COMMENTS */ };
}
private final static int IDX_ADD = 0;
private final static int IDX_EDIT = 1;
private final static int IDX_REMOVE = 2;
private final static int IDX_IMPORT = 3;
private final static int IDX_EXPORT = 4;
private final static int IDX_EXPORTALL = 5;
// protected final static Object COMMENT_NODE =
// PreferencesMessages.CodeTemplateBlock_templates_comment_node;
// protected final static Object CODE_NODE =
// PreferencesMessages.CodeTemplateBlock_templates_code_node;
private TreeListDialogField fCodeTemplateTree;
// private SelectionButtonDialogField fGenerateComments;
protected ProjectTemplateStore fTemplateStore;
private PixelConverter fPixelConverter;
private SourceViewer fPatternViewer;
private final IDLTKUILanguageToolkit toolkit;
private final ICodeTemplateAccess codeTemplateAccess;
private TemplateVariableProcessor fTemplateProcessor;
public CodeTemplateBlock(IStatusChangeListener context, IProject project, IWorkbenchPreferenceContainer container,
IDLTKUILanguageToolkit toolkit, ICodeTemplateAccess codeTemplateAccess) {
super(context, project, getAllKeys(), container);
this.toolkit = toolkit;
this.codeTemplateAccess = codeTemplateAccess;
fTemplateStore = new ProjectTemplateStore(codeTemplateAccess, project);
try {
fTemplateStore.load();
} catch (IOException e) {
DLTKUIPlugin.log(e);
}
fTemplateProcessor = new TemplateVariableProcessor();
CodeTemplateAdapter adapter = new CodeTemplateAdapter();
String[] buttonLabels = new String[] { PreferencesMessages.CodeTemplateBlock_templates_new_button,
PreferencesMessages.CodeTemplateBlock_templates_edit_button,
PreferencesMessages.CodeTemplateBlock_templates_remove_button,
PreferencesMessages.CodeTemplateBlock_templates_import_button,
PreferencesMessages.CodeTemplateBlock_templates_export_button,
PreferencesMessages.CodeTemplateBlock_templates_exportall_button };
fCodeTemplateTree = new TreeListDialogField(adapter, buttonLabels, new CodeTemplateLabelProvider());
fCodeTemplateTree.setDialogFieldListener(adapter);
fCodeTemplateTree.setLabelText(PreferencesMessages.CodeTemplateBlock_templates_label);
fCodeTemplateTree.setViewerComparator(adapter);
fCodeTemplateTree.enableButton(IDX_EXPORT, false);
fCodeTemplateTree.enableButton(IDX_ADD, false);
fCodeTemplateTree.enableButton(IDX_EDIT, false);
fCodeTemplateTree.enableButton(IDX_REMOVE, false);
fCodeTemplateTree.addElements(Arrays.asList(codeTemplateAccess.getCategories()));
fCodeTemplateTree.selectFirstElement();
// fGenerateComments = new SelectionButtonDialogField(SWT.CHECK |
// SWT.WRAP);
// fGenerateComments.setDialogFieldListener(adapter);
// fGenerateComments
// .setLabelText(PreferencesMessages.CodeTemplateBlock_createcomment_label);
updateControls();
}
public void postSetSelection(Object element) {
fCodeTemplateTree.postSetSelection(new StructuredSelection(element));
}
@Override
public boolean hasProjectSpecificOptions(IProject project) {
if (super.hasProjectSpecificOptions(project))
return true;
if (project != null) {
return fTemplateStore.hasProjectSpecificTempates(project);
}
return false;
}
@Override
public void useProjectSpecificSettings(boolean enable) {
fCodeTemplateTree.setEnabled(enable);
// need to set because super implementation only updates controls
super.useProjectSpecificSettings(enable);
}
@Override
protected Control createContents(Composite parent) {
fPixelConverter = new PixelConverter(parent);
setShell(parent.getShell());
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = 2;
composite.setLayout(layout);
fCodeTemplateTree.doFillIntoGrid(composite, 3);
LayoutUtil.setHorizontalSpan(fCodeTemplateTree.getLabelControl(null), 2);
LayoutUtil.setHorizontalGrabbing(fCodeTemplateTree.getTreeControl(null));
fPatternViewer = createViewer(composite, 2);
// fGenerateComments.doFillIntoGrid(composite, 2);
return composite;
}
protected void updateControls() {
// fGenerateComments.setSelection(getBooleanValue(PREF_GENERATE_COMMENTS));
}
private SourceViewer createViewer(Composite parent, int nColumns) {
Label label = new Label(parent, SWT.NONE);
label.setText(PreferencesMessages.CodeTemplateBlock_preview);
GridData data = new GridData();
data.horizontalSpan = nColumns;
label.setLayoutData(data);
IDocument document = new Document();
ScriptTextTools tools = toolkit.getTextTools();
tools.setupDocumentPartitioner(document);
IPreferenceStore store = toolkit.getCombinedPreferenceStore();
SourceViewer viewer = new ScriptSourceViewer(parent, null, null, false,
SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, store);
ScriptSourceViewerConfiguration configuration = tools.createSourceViewerConfiguraton(store, null,
fTemplateProcessor);
viewer.configure(configuration);
viewer.setEditable(false);
Cursor arrowCursor = viewer.getTextWidget().getDisplay().getSystemCursor(SWT.CURSOR_ARROW);
viewer.getTextWidget().setCursor(arrowCursor);
viewer.getTextWidget().setCaret(null);
viewer.setDocument(document);
Font font = JFaceResources.getFont(configuration.getFontPropertyPreferenceKey());
viewer.getTextWidget().setFont(font);
new ScriptSourcePreviewerUpdater(viewer, configuration, store);
Control control = viewer.getControl();
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
data.horizontalSpan = nColumns;
data.heightHint = fPixelConverter.convertHeightInCharsToPixels(5);
control.setLayoutData(data);
return viewer;
}
protected TemplatePersistenceData[] getTemplatesOfCategory(ICodeTemplateCategory category) {
ArrayList<TemplatePersistenceData> res = new ArrayList<>();
TemplatePersistenceData[] templates = fTemplateStore.getTemplateData();
for (int i = 0; i < templates.length; i++) {
TemplatePersistenceData curr = templates[i];
// FIXME if (isComment == curr.getTemplate().getName().endsWith(
// CodeTemplateContextType.COMMENT_SUFFIX)) {
res.add(curr);
// }
}
return res.toArray(new TemplatePersistenceData[res.size()]);
}
private TemplatePersistenceData[] getTemplatesOfContextType(TemplateContextType contextType) {
return getTemplatesOfContextType(contextType.getId());
}
protected TemplatePersistenceData[] getTemplatesOfContextType(String contextTypeId) {
List<TemplatePersistenceData> res = new ArrayList<>();
TemplatePersistenceData[] templates = fTemplateStore.getTemplateData();
for (int i = 0; i < templates.length; ++i) {
TemplatePersistenceData curr = templates[i];
if (contextTypeId.equals(curr.getTemplate().getContextTypeId())) {
res.add(curr);
}
}
return res.toArray(new TemplatePersistenceData[res.size()]);
}
protected TemplateContextType[] getTemplateContextTypes(ICodeTemplateCategory category) {
ArrayList<TemplateContextType> result = new ArrayList<>();
TemplateContextType[] contextTypes = category.getTemplateContextTypes();
for (int i = 0; i < contextTypes.length; ++i) {
TemplateContextType contextType = contextTypes[i];
if (getTemplatesOfContextType(contextType).length > 0) {
result.add(contextType);
}
}
return result.toArray(new TemplateContextType[result.size()]);
}
protected boolean canAdd(List selected) {
if (selected.size() == 1) {
Object element = selected.get(0);
if (element instanceof TemplateContextType
|| element instanceof ICodeTemplateCategory && ((ICodeTemplateCategory) element).isGroup()) {
return true;
}
if (element instanceof TemplatePersistenceData) {
final TemplatePersistenceData data = (TemplatePersistenceData) element;
final ICodeTemplateCategory category = codeTemplateAccess
.getCategoryOfContextType(data.getTemplate().getContextTypeId());
if (category != null && category.isGroup()) {
return true;
}
}
}
return false;
}
protected static boolean canEdit(List selected) {
return selected.size() == 1 && (selected.get(0) instanceof TemplatePersistenceData);
}
protected static boolean canRemove(List selected) {
if (selected.size() == 1 && (selected.get(0) instanceof TemplatePersistenceData)) {
TemplatePersistenceData data = (TemplatePersistenceData) selected.get(0);
return data.isUserAdded();
}
return false;
}
protected void updateSourceViewerInput(List selection) {
if (fPatternViewer == null || fPatternViewer.getTextWidget().isDisposed()) {
return;
}
if (selection.size() == 1 && selection.get(0) instanceof TemplatePersistenceData) {
TemplatePersistenceData data = (TemplatePersistenceData) selection.get(0);
Template template = data.getTemplate();
TemplateContextType type = codeTemplateAccess.getContextTypeRegistry()
.getContextType(template.getContextTypeId());
fTemplateProcessor.setContextType(type);
fPatternViewer.getDocument().set(template.getPattern());
} else {
fPatternViewer.getDocument().set(""); //$NON-NLS-1$
}
}
protected void doButtonPressed(int buttonIndex, List selected) {
switch (buttonIndex) {
case IDX_EDIT:
edit((TemplatePersistenceData) selected.get(0), false);
break;
case IDX_ADD: {
Object element = selected.get(0);
Template orig = null;
String contextTypeId;
if (element instanceof TemplatePersistenceData) {
orig = ((TemplatePersistenceData) element).getTemplate();
contextTypeId = orig.getContextTypeId();
} else if (element instanceof TemplateContextType) {
TemplateContextType type = (TemplateContextType) selected.get(0);
contextTypeId = type.getId();
} else if (element instanceof ICodeTemplateCategory) {
// default: text file
contextTypeId = ((ICodeTemplateCategory) element).getTemplateContextTypes()[0].getId();
} else {
return;
}
Template newTemplate;
if (orig != null) {
newTemplate = new Template("", "", contextTypeId, //$NON-NLS-1$//$NON-NLS-2$
orig.getPattern(), false);
} else {
newTemplate = new Template("", "", contextTypeId, "", false); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
}
TemplatePersistenceData newData = new TemplatePersistenceData(newTemplate, true);
edit(newData, true);
break;
}
case IDX_REMOVE:
remove((TemplatePersistenceData) selected.get(0));
break;
case IDX_EXPORT:
export(selected);
break;
case IDX_EXPORTALL:
exportAll();
break;
case IDX_IMPORT:
import_();
break;
}
}
private void remove(TemplatePersistenceData data) {
if (data.isUserAdded()) {
fTemplateStore.delete(data);
fCodeTemplateTree.refresh();
}
}
private void edit(TemplatePersistenceData data, boolean isNew) {
final Template newTemplate = new Template(data.getTemplate());
final ICodeTemplateCategory category = codeTemplateAccess
.getCategoryOfContextType(newTemplate.getContextTypeId());
if (category == null) {
return;
}
final ContextTypeRegistry contextTypeRegistry;
if (category.isGroup()) {
contextTypeRegistry = new ContextTypeRegistry();
TemplateContextType[] contextTypes = category.getTemplateContextTypes();
for (int i = 0; i < contextTypes.length; ++i) {
contextTypeRegistry.addContextType(contextTypes[i]);
}
} else {
contextTypeRegistry = codeTemplateAccess.getContextTypeRegistry();
}
EditTemplateDialog dialog = new EditTemplateDialog(toolkit, getShell(), newTemplate, !isNew, data.isUserAdded(),
category.isGroup(), contextTypeRegistry);
if (dialog.open() == Window.OK) {
// changed
data.setTemplate(dialog.getTemplate());
if (isNew) {
// add to store
fTemplateStore.addTemplateData(data);
}
if (isNew || category.isGroup()) {
fCodeTemplateTree.refresh();
} else {
fCodeTemplateTree.refresh(data);
}
fCodeTemplateTree.selectElements(new StructuredSelection(data));
}
}
private void import_() {
FileDialog dialog = new FileDialog(getShell());
dialog.setText(PreferencesMessages.CodeTemplateBlock_import_title);
dialog.setFilterExtensions(new String[] { PreferencesMessages.CodeTemplateBlock_import_extension });
String path = dialog.open();
if (path == null)
return;
try {
TemplateReaderWriter reader = new TemplateReaderWriter();
File file = new File(path);
if (file.exists()) {
try (InputStream input = new BufferedInputStream(new FileInputStream(file))) {
TemplatePersistenceData[] datas = reader.read(input, null);
for (int i = 0; i < datas.length; i++) {
updateTemplate(datas[i]);
}
}
}
fCodeTemplateTree.refresh();
updateSourceViewerInput(fCodeTemplateTree.getSelectedElements());
} catch (FileNotFoundException e) {
openReadErrorDialog(e);
} catch (IOException e) {
openReadErrorDialog(e);
}
}
private void updateTemplate(TemplatePersistenceData data) {
String dataId = data.getId();
TemplatePersistenceData[] datas = fTemplateStore.getTemplateData();
if (dataId != null) {
// predefined
for (int i = 0; i < datas.length; ++i) {
TemplatePersistenceData data2 = datas[i];
String id = data2.getId();
if (id != null && id.equals(dataId)) {
data2.setTemplate(data.getTemplate());
return;
}
}
} else {
// user added
String dataName = data.getTemplate().getName();
for (int i = 0; i < datas.length; ++i) {
TemplatePersistenceData data2 = datas[i];
if (data2.getId() == null) {
String name = data2.getTemplate().getName();
String contextTypeId = data2.getTemplate().getContextTypeId();
if (name != null && name.equals(dataName)
&& contextTypeId.equals(data.getTemplate().getContextTypeId())) {
data2.setTemplate(data.getTemplate());
return;
}
}
}
// new
fTemplateStore.addTemplateData(data);
}
}
private void exportAll() {
export(fTemplateStore.getTemplateData());
}
private void export(List selected) {
Set<TemplatePersistenceData> datas = new HashSet<>();
for (int i = 0; i < selected.size(); i++) {
Object curr = selected.get(i);
if (curr instanceof TemplatePersistenceData) {
datas.add((TemplatePersistenceData) curr);
} else if (curr instanceof TemplateContextType) {
TemplatePersistenceData[] cat = getTemplatesOfContextType((TemplateContextType) curr);
datas.addAll(Arrays.asList(cat));
} else if (curr instanceof ICodeTemplateCategory) {
ICodeTemplateCategory category = (ICodeTemplateCategory) curr;
if (category.isGroup()) {
TemplateContextType[] types = getTemplateContextTypes(category);
for (int j = 0; j < types.length; ++j) {
TemplateContextType contextType = types[j];
TemplatePersistenceData[] cat = getTemplatesOfContextType(contextType);
datas.addAll(Arrays.asList(cat));
}
} else {
TemplatePersistenceData[] cat = getTemplatesOfCategory(category);
datas.addAll(Arrays.asList(cat));
}
}
}
export(datas.toArray(new TemplatePersistenceData[datas.size()]));
}
private void export(TemplatePersistenceData[] templates) {
FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
dialog.setText(NLS.bind(PreferencesMessages.CodeTemplateBlock_export_title, String.valueOf(templates.length)));
dialog.setFilterExtensions(new String[] { PreferencesMessages.CodeTemplateBlock_export_extension });
dialog.setFileName(PreferencesMessages.CodeTemplateBlock_export_filename);
String path = dialog.open();
if (path == null)
return;
File file = new File(path);
if (file.isHidden()) {
String title = PreferencesMessages.CodeTemplateBlock_export_error_title;
String message = NLS.bind(PreferencesMessages.CodeTemplateBlock_export_error_hidden,
BasicElementLabels.getPathLabel(file));
MessageDialog.openError(getShell(), title, message);
return;
}
if (file.exists() && !file.canWrite()) {
String title = PreferencesMessages.CodeTemplateBlock_export_error_title;
String message = NLS.bind(PreferencesMessages.CodeTemplateBlock_export_error_canNotWrite,
BasicElementLabels.getPathLabel(file));
MessageDialog.openError(getShell(), title, message);
return;
}
if (!file.exists() || confirmOverwrite(file)) {
try (OutputStream output = new BufferedOutputStream(new FileOutputStream(file))) {
TemplateReaderWriter writer = new TemplateReaderWriter();
writer.save(templates, output);
output.close();
} catch (IOException e) {
openWriteErrorDialog();
}
}
}
private boolean confirmOverwrite(File file) {
return MessageDialog.openQuestion(getShell(), PreferencesMessages.CodeTemplateBlock_export_exists_title,
NLS.bind(PreferencesMessages.CodeTemplateBlock_export_exists_message,
BasicElementLabels.getPathLabel(file)));
}
@Override
public void performDefaults() {
fTemplateStore.restoreDefaults();
// refresh
fCodeTemplateTree.refresh();
super.performDefaults();
}
public boolean performOk(boolean enabled) {
boolean res = super.performOk();
if (!res)
return false;
if (fProject != null) {
TemplatePersistenceData[] templateData = fTemplateStore.getTemplateData();
for (int i = 0; i < templateData.length; i++) {
fTemplateStore.setProjectSpecific(templateData[i].getId(), enabled);
}
}
try {
fTemplateStore.save();
} catch (IOException e) {
DLTKUIPlugin.log(e);
openWriteErrorDialog();
}
return true;
}
public void performCancel() {
try {
fTemplateStore.revertChanges();
} catch (IOException e) {
openReadErrorDialog(e);
}
}
private void openReadErrorDialog(Exception e) {
String title = PreferencesMessages.CodeTemplateBlock_error_read_title;
String message = e.getLocalizedMessage();
if (message != null)
message = NLS.bind(PreferencesMessages.CodeTemplateBlock_error_parse_message, message);
else
message = PreferencesMessages.CodeTemplateBlock_error_read_message;
MessageDialog.openError(getShell(), title, message);
}
private void openWriteErrorDialog() {
String title = PreferencesMessages.CodeTemplateBlock_error_write_title;
String message = PreferencesMessages.CodeTemplateBlock_error_write_message;
MessageDialog.openError(getShell(), title, message);
}
}