blob: 6af218de8bfaa1f34a1b6cece174cc12151ec36a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Mickael Istria (Red Hat Inc.) - [91965] associate contenttype with editors
* Lucas Bullen (Red Hat Inc.) - [520156 ] Able to Add Duplicate Associated Editors
*******************************************************************************/
package org.eclipse.ui.internal.dialogs;
import static org.eclipse.jface.viewers.LabelProvider.createTextImageProvider;
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.TextProcessor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.EditorSelectionDialog;
import org.eclipse.ui.dialogs.PreferenceLinkArea;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.misc.StatusUtil;
import org.eclipse.ui.internal.progress.ProgressManager;
import org.eclipse.ui.internal.registry.EditorRegistry;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* Preference page that allows manipulation of core content types. Unlike most
* preference pages, it does not work on the preference store itself but rather
* the content type manager. As such, there are no apply/default buttons and all
* changes made take effect immediately.
*
* @since 3.1
*/
public class ContentTypesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
public ContentTypesPreferencePage() {
}
private TableViewer fileAssociationViewer;
private Button removeButton;
private TreeViewer contentTypesViewer;
private Button addButton;
private Button editButton;
private Text charsetField;
private Button setButton;
private IWorkbench workbench;
private Button removeContentTypeButton;
private Button addChildContentTypeButton;
private TableViewer editorAssociationsViewer;
private Button addEditorAssociationButton;
private Set<Image> disposableEditorIcons = new HashSet<>();
private static class Spec {
/**
* the spec text: file name, extension or pattern
*/
final String text;
/**
* one of {@link IContentType#FILE_NAME_SPEC},
* {@link IContentType#FILE_EXTENSION_SPEC},
* {@link IContentType#FILE_PATTERN_SPEC}
*/
final int type;
final boolean isPredefined;
final int sortValue;
/**
* @param specText the spec text (filename, extension or pattern)
* @param specType one of {@link IContentType#FILE_NAME_SPEC},
* {@link IContentType#FILE_EXTENSION_SPEC},
* {@link IContentType#FILE_PATTERN_SPEC}
* @param isPredefined true if predefined, false is user-defined
* @param sortValue
*/
public Spec(String specText, int specType, boolean isPredefined, int sortValue) {
if (specType != IContentType.FILE_NAME_SPEC && specType != IContentType.FILE_EXTENSION_SPEC
&& specType != IContentType.FILE_PATTERN_SPEC) {
throw new IllegalArgumentException("Invalid specType"); //$NON-NLS-1$
}
this.type = specType;
this.text = specText;
this.isPredefined = isPredefined;
this.sortValue = sortValue;
}
@Override
public String toString() {
if (this.type == IContentType.FILE_EXTENSION_SPEC) {
return "*." + this.text; //$NON-NLS-1$
}
return this.text;
}
public boolean getPredefined() {
return isPredefined;
}
}
private static class FileSpecComparator extends ViewerComparator {
@Override
public int category(Object element) {
// only Spec objects in here - unchecked cast
return ((Spec) element).sortValue;
}
}
private class FileSpecLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
String label = super.getText(element);
return TextProcessor.process(label, "*."); //$NON-NLS-1$
}
@Override
public Image getImage(Object element) {
// only Spec objects will be in here
Spec spec = (Spec) element;
if (spec.getPredefined()) {
// Temporary until we decide on a location to host the icon
return JFaceResources.getImage(ProgressManager.BLOCKED_JOB_KEY);
}
return null;
}
}
private static class FileSpecContentProvider implements IStructuredContentProvider {
@Override
public Object[] getElements(Object inputElement) {
IContentType contentType = (IContentType) inputElement;
String[] userextfileSpecs = contentType
.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_PRE_DEFINED);
String[] usernamefileSpecs = contentType
.getFileSpecs(IContentType.FILE_NAME_SPEC | IContentType.IGNORE_PRE_DEFINED);
String[] preextfileSpecs = contentType
.getFileSpecs(IContentType.FILE_EXTENSION_SPEC | IContentType.IGNORE_USER_DEFINED);
String[] prenamefileSpecs = contentType
.getFileSpecs(IContentType.FILE_NAME_SPEC | IContentType.IGNORE_USER_DEFINED);
String[] userPatternFileSpecs = contentType
.getFileSpecs(IContentType.FILE_PATTERN_SPEC | IContentType.IGNORE_PRE_DEFINED);
String[] prePatternFileSpecs = contentType
.getFileSpecs(IContentType.FILE_PATTERN_SPEC | IContentType.IGNORE_USER_DEFINED);
return createSpecs(userextfileSpecs, usernamefileSpecs, userPatternFileSpecs, preextfileSpecs,
prenamefileSpecs, prePatternFileSpecs);
}
private Spec[] createSpecs(String[] userextfileSpecs, String[] usernamefileSpecs, String[] userPatternFileSpecs,
String[] preextfileSpecs, String[] prenamefileSpecs, String[] prePatternFileSpecs) {
List<Spec> returnValues = new ArrayList<>();
for (String usernamefileSpec : usernamefileSpecs) {
Spec spec = new Spec(usernamefileSpec, IContentType.FILE_NAME_SPEC, false, 0);
returnValues.add(spec);
}
for (String prenamefileSpec : prenamefileSpecs) {
Spec spec = new Spec(prenamefileSpec, IContentType.FILE_NAME_SPEC, true, 1);
returnValues.add(spec);
}
for (String userextfileSpec : userextfileSpecs) {
Spec spec = new Spec(userextfileSpec, IContentType.FILE_EXTENSION_SPEC, false, 2);
returnValues.add(spec);
}
for (String preextfileSpec : preextfileSpecs) {
Spec spec = new Spec(preextfileSpec, IContentType.FILE_EXTENSION_SPEC, true, 3);
returnValues.add(spec);
}
for (String userPatternFileSpec : userPatternFileSpecs) {
Spec spec = new Spec(userPatternFileSpec, IContentType.FILE_PATTERN_SPEC, false, 4);
returnValues.add(spec);
}
for (String prePatternFileSpec : prePatternFileSpecs) {
Spec spec = new Spec(prePatternFileSpec, IContentType.FILE_PATTERN_SPEC, true, 5);
returnValues.add(spec);
}
return returnValues.toArray(new Spec[returnValues.size()]);
}
}
private static class ContentTypesLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
IContentType contentType = (IContentType) element;
return contentType.getName();
}
}
private static class ContentTypesContentProvider implements ITreeContentProvider {
private IContentTypeManager manager;
@Override
public Object[] getChildren(Object parentElement) {
List<IContentType> elements = new ArrayList<>();
IContentType baseType = (IContentType) parentElement;
for (IContentType contentType : manager.getAllContentTypes()) {
if (Objects.equals(contentType.getBaseType(), baseType)) {
elements.add(contentType);
}
}
return elements.toArray(new IContentType[0]);
}
@Override
public Object getParent(Object element) {
IContentType contentType = (IContentType) element;
return contentType.getBaseType();
}
@Override
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
@Override
public Object[] getElements(Object inputElement) {
return getChildren(null);
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
manager = (IContentTypeManager) newInput;
}
}
@Override
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = layout.marginWidth = 0;
composite.setLayout(layout);
PreferenceLinkArea contentTypeArea = new PreferenceLinkArea(composite, SWT.NONE,
"org.eclipse.ui.preferencePages.FileEditors", WorkbenchMessages.ContentTypes_FileEditorsRelatedLink, //$NON-NLS-1$
(IWorkbenchPreferenceContainer) getContainer(), null);
GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
contentTypeArea.getControl().setLayoutData(data);
createContentTypesTree(composite);
createFileAssociations(composite);
createEditors(composite);
createCharset(composite);
workbench.getHelpSystem().setHelp(parent, IWorkbenchHelpContextIds.CONTENT_TYPES_PREFERENCE_PAGE);
applyDialogFont(composite);
return composite;
}
private IEditorDescriptor[] getAssociatedEditors() {
Table editorTable = editorAssociationsViewer.getTable();
if (editorTable == null) {
return null;
}
if (editorTable.getItemCount() > 0) {
ArrayList<IEditorDescriptor> editorList = new ArrayList<>();
for (int i = 0; i < editorTable.getItemCount(); i++) {
editorList.add((IEditorDescriptor) editorTable.getItem(i).getData());
}
return editorList.toArray(new IEditorDescriptor[editorList.size()]);
}
return null;
}
private void createEditors(Composite parent) {
final IEditorRegistry editorRegistry = PlatformUI.getWorkbench().getEditorRegistry();
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
Label label = new Label(composite, SWT.NONE);
label.setFont(composite.getFont());
label.setText(WorkbenchMessages.ContentTypes_editorAssociations);
GridData data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
editorAssociationsViewer = new TableViewer(composite);
editorAssociationsViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
editorAssociationsViewer.setContentProvider((IStructuredContentProvider) arg0 -> {
if (arg0 instanceof IContentType) {
return editorRegistry.getEditors(null, (IContentType) arg0);
}
return new Object[0];
});
editorAssociationsViewer.setLabelProvider(
createTextImageProvider(element -> ((IEditorDescriptor) element).getLabel(),
element -> {
Image res = ((IEditorDescriptor) element).getImageDescriptor().createImage();
if (res != null) {
disposableEditorIcons.add(res);
}
return res;
}));
Composite buttonsComposite = new Composite(composite, SWT.NONE);
buttonsComposite.setLayout(new GridLayout(1, false));
buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
addEditorAssociationButton = new Button(buttonsComposite, SWT.PUSH);
addEditorAssociationButton.setText(WorkbenchMessages.ContentTypes_editorAssociationAddLabel);
setButtonLayoutData(addEditorAssociationButton);
addEditorAssociationButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (editorRegistry instanceof EditorRegistry) {
EditorSelectionDialog dialog = new EditorSelectionDialog(getShell());
dialog.setEditorsToFilter(getAssociatedEditors());
EditorRegistry registry = (EditorRegistry) editorRegistry;
IContentType contentType = (IContentType) editorAssociationsViewer.getInput();
if (dialog.open() == IDialogConstants.OK_ID) {
registry.addUserAssociation(contentType, dialog.getSelectedEditor());
editorAssociationsViewer.refresh();
}
}
}
});
final Button removeEditorButton = new Button(buttonsComposite, SWT.PUSH);
removeEditorButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (editorRegistry instanceof EditorRegistry) {
EditorRegistry registry = (EditorRegistry) editorRegistry;
IEditorDescriptor editor = (IEditorDescriptor) editorAssociationsViewer.getStructuredSelection()
.getFirstElement();
IContentType contentType = (IContentType) editorAssociationsViewer.getInput();
registry.removeUserAssociation(contentType, editor);
editorAssociationsViewer.refresh();
}
}
});
removeEditorButton.setText(WorkbenchMessages.ContentTypes_editorAssociationRemoveLabel);
setButtonLayoutData(removeEditorButton);
editorAssociationsViewer.addSelectionChangedListener(event -> {
if (editorRegistry instanceof EditorRegistry) {
EditorRegistry registry = (EditorRegistry) editorRegistry;
IEditorDescriptor editor = (IEditorDescriptor) editorAssociationsViewer.getStructuredSelection()
.getFirstElement();
IContentType contentType = (IContentType) editorAssociationsViewer.getInput();
removeEditorButton.setEnabled(registry.isUserAssociation(contentType, editor));
}
});
addEditorAssociationButton.setEnabled(editorAssociationsViewer.getInput() != null);
removeEditorButton.setEnabled(editorAssociationsViewer.getInput() != null);
}
private void createCharset(final Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
GridData compositeData = new GridData(GridData.FILL_HORIZONTAL);
composite.setLayoutData(compositeData);
composite.setLayout(layout);
Label label = new Label(composite, SWT.NONE);
label.setFont(parent.getFont());
label.setText(WorkbenchMessages.ContentTypes_characterSetLabel);
charsetField = new Text(composite, SWT.SINGLE | SWT.BORDER);
charsetField.setFont(parent.getFont());
charsetField.setEnabled(false);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
charsetField.setLayoutData(data);
setButton = new Button(composite, SWT.PUSH);
setButton.setFont(parent.getFont());
setButton.setText(WorkbenchMessages.ContentTypes_characterSetUpdateLabel);
setButton.setEnabled(false);
setButtonLayoutData(setButton);
setButton.addSelectionListener(widgetSelectedAdapter(e -> {
try {
String text = charsetField.getText().trim();
if (text.isEmpty()) {
text = null;
}
getSelectedContentType().setDefaultCharset(text);
setButton.setEnabled(false);
} catch (CoreException e1) {
StatusUtil.handleStatus(e1.getStatus(), StatusManager.SHOW);
}
}));
charsetField.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
IContentType contentType = getSelectedContentType();
String charset = contentType.getDefaultCharset();
if (charset == null) {
charset = ""; //$NON-NLS-1$
}
setButton.setEnabled(!charset.equals(charsetField.getText()) && getErrorMessage() == null);
}
});
charsetField.addModifyListener(e -> {
String errorMessage = null;
String text = charsetField.getText();
try {
if (text.length() != 0 && !Charset.isSupported(text))
errorMessage = WorkbenchMessages.ContentTypes_unsupportedEncoding;
} catch (IllegalCharsetNameException ex) {
errorMessage = WorkbenchMessages.ContentTypes_unsupportedEncoding;
}
setErrorMessage(errorMessage);
});
}
@SuppressWarnings("unchecked")
private void createFileAssociations(final Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
Label label = new Label(composite, SWT.NONE);
label.setFont(composite.getFont());
label.setText(WorkbenchMessages.ContentTypes_fileAssociationsLabel);
GridData data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
fileAssociationViewer = new TableViewer(composite);
fileAssociationViewer.setComparator(new FileSpecComparator());
fileAssociationViewer.getControl().setFont(composite.getFont());
fileAssociationViewer.setContentProvider(new FileSpecContentProvider());
fileAssociationViewer.setLabelProvider(new FileSpecLabelProvider());
data = new GridData(GridData.FILL_BOTH);
fileAssociationViewer.getControl().setLayoutData(data);
fileAssociationViewer.addSelectionChangedListener(event -> {
IStructuredSelection selection = event.getStructuredSelection();
if (selection.isEmpty()) {
editButton.setEnabled(false);
removeButton.setEnabled(false);
return;
}
boolean enabled = true;
for (Spec spec : (Iterable<Spec>) selection) {
if (spec.isPredefined) {
enabled = false;
}
}
editButton.setEnabled(enabled && selection.size() == 1);
removeButton.setEnabled(enabled);
});
Composite buttonArea = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
buttonArea.setLayout(layout);
data = new GridData(SWT.DEFAULT, SWT.TOP, false, false);
buttonArea.setLayoutData(data);
addButton = new Button(buttonArea, SWT.PUSH);
addButton.setFont(composite.getFont());
addButton.setText(WorkbenchMessages.ContentTypes_fileAssociationsAddLabel);
addButton.setEnabled(false);
setButtonLayoutData(addButton);
addButton.addSelectionListener(widgetSelectedAdapter(e -> {
Shell shell = composite.getShell();
IContentType selectedContentType = getSelectedContentType();
ContentTypeFilenameAssociationDialog dialog = new ContentTypeFilenameAssociationDialog(shell,
WorkbenchMessages.ContentTypes_addDialog_title, IWorkbenchHelpContextIds.FILE_EXTENSION_DIALOG,
WorkbenchMessages.ContentTypes_addDialog_messageHeader,
WorkbenchMessages.ContentTypes_addDialog_message, WorkbenchMessages.ContentTypes_addDialog_label);
if (dialog.open() == Window.OK) {
try {
selectedContentType.addFileSpec(dialog.getSpecText(), dialog.getSpecType());
} catch (CoreException ex) {
StatusUtil.handleStatus(ex.getStatus(), StatusManager.SHOW);
WorkbenchPlugin.log(ex);
} finally {
fileAssociationViewer.refresh(false);
}
}
}));
editButton = new Button(buttonArea, SWT.PUSH);
editButton.setFont(composite.getFont());
editButton.setText(WorkbenchMessages.ContentTypes_fileAssociationsEditLabel);
editButton.setEnabled(false);
setButtonLayoutData(editButton);
editButton.addSelectionListener(widgetSelectedAdapter(e -> {
Shell shell = composite.getShell();
IContentType selectedContentType = getSelectedContentType();
Spec spec = getSelectedSpecs()[0];
ContentTypeFilenameAssociationDialog dialog = new ContentTypeFilenameAssociationDialog(shell,
WorkbenchMessages.ContentTypes_editDialog_title, IWorkbenchHelpContextIds.FILE_EXTENSION_DIALOG,
WorkbenchMessages.ContentTypes_editDialog_messageHeader,
WorkbenchMessages.ContentTypes_editDialog_message, WorkbenchMessages.ContentTypes_editDialog_label);
dialog.setInitialValue(spec.toString());
if (dialog.open() == Window.OK) {
try {
// remove the original spec
selectedContentType.removeFileSpec(spec.text, spec.type);
// add the new one
selectedContentType.addFileSpec(dialog.getSpecText(), dialog.getSpecType());
} catch (CoreException ex) {
StatusUtil.handleStatus(ex.getStatus(), StatusManager.SHOW);
WorkbenchPlugin.log(ex);
} finally {
fileAssociationViewer.refresh(false);
}
}
}));
removeButton = new Button(buttonArea, SWT.PUSH);
removeButton.setEnabled(false);
removeButton.setText(WorkbenchMessages.ContentTypes_fileAssociationsRemoveLabel);
setButtonLayoutData(removeButton);
removeButton.addSelectionListener(widgetSelectedAdapter(event -> {
IContentType contentType = getSelectedContentType();
Spec[] specs = getSelectedSpecs();
MultiStatus result = new MultiStatus(PlatformUI.PLUGIN_ID, 0, new IStatus[0],
WorkbenchMessages.ContentTypes_errorDialogMessage, null);
for (Spec spec : specs) {
try {
contentType.removeFileSpec(spec.text, spec.type);
} catch (CoreException e) {
result.add(e.getStatus());
}
}
if (!result.isOK()) {
StatusUtil.handleStatus(result, StatusManager.SHOW);
}
fileAssociationViewer.refresh(false);
}));
}
protected Spec[] getSelectedSpecs() {
List<Spec> list = fileAssociationViewer.getStructuredSelection().toList();
return list.toArray(new Spec[list.size()]);
}
protected IContentType getSelectedContentType() {
return (IContentType) contentTypesViewer.getStructuredSelection().getFirstElement();
}
private void createContentTypesTree(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Label label = new Label(composite, SWT.NONE);
label.setFont(composite.getFont());
label.setText(WorkbenchMessages.ContentTypes_contentTypesLabel);
GridData data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
contentTypesViewer = new TreeViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
contentTypesViewer.getControl().setFont(composite.getFont());
contentTypesViewer.setContentProvider(new ContentTypesContentProvider());
contentTypesViewer.setLabelProvider(new ContentTypesLabelProvider());
contentTypesViewer.setComparator(new ViewerComparator());
contentTypesViewer.setInput(Platform.getContentTypeManager());
data = new GridData(GridData.FILL_BOTH);
contentTypesViewer.getControl().setLayoutData(data);
contentTypesViewer.addSelectionChangedListener(event -> {
IContentType contentType = (IContentType) event.getStructuredSelection().getFirstElement();
fileAssociationViewer.setInput(contentType);
editorAssociationsViewer.setInput(contentType);
editButton.setEnabled(false);
removeButton.setEnabled(false);
if (contentType != null) {
String charset = contentType.getDefaultCharset();
if (charset == null) {
charset = ""; //$NON-NLS-1$
}
charsetField.setText(charset);
} else {
charsetField.setText(""); //$NON-NLS-1$
}
charsetField.setEnabled(contentType != null);
addEditorAssociationButton.setEnabled(contentType != null);
addButton.setEnabled(contentType != null);
setButton.setEnabled(false);
addChildContentTypeButton.setEnabled(contentType != null);
removeContentTypeButton.setEnabled(contentType != null && contentType.isUserDefined());
});
Composite buttonsComposite = new Composite(composite, SWT.NONE);
buttonsComposite.setLayoutData(new GridData(SWT.DEFAULT, SWT.TOP, false, false));
buttonsComposite.setLayout(new GridLayout(1, false));
Button addRootContentTypeButton = new Button(buttonsComposite, SWT.PUSH);
addRootContentTypeButton.setText(WorkbenchMessages.ContentTypes_addRootContentTypeButton);
setButtonLayoutData(addRootContentTypeButton);
addRootContentTypeButton.addSelectionListener(widgetSelectedAdapter(e -> {
String id = "userCreated" + System.currentTimeMillis(); //$NON-NLS-1$
IContentTypeManager manager = (IContentTypeManager) contentTypesViewer.getInput();
NewContentTypeDialog dialog = new NewContentTypeDialog(ContentTypesPreferencePage.this.getShell(), manager,
null);
if (dialog.open() == IDialogConstants.OK_ID) {
try {
IContentType newContentType = manager.addContentType(id, dialog.getName(), null);
contentTypesViewer.refresh();
contentTypesViewer.setSelection(new StructuredSelection(newContentType));
} catch (CoreException e1) {
MessageDialog.openError(getShell(), WorkbenchMessages.ContentTypes_failedAtEditingContentTypes,
e1.getMessage());
}
}
}));
addChildContentTypeButton = new Button(buttonsComposite, SWT.PUSH);
addChildContentTypeButton.setText(WorkbenchMessages.ContentTypes_addChildContentTypeButton);
setButtonLayoutData(addChildContentTypeButton);
addChildContentTypeButton.addSelectionListener(widgetSelectedAdapter(e -> {
String id = "userCreated" + System.currentTimeMillis(); //$NON-NLS-1$
IContentTypeManager manager = (IContentTypeManager) contentTypesViewer.getInput();
NewContentTypeDialog dialog = new NewContentTypeDialog(ContentTypesPreferencePage.this.getShell(), manager,
getSelectedContentType());
if (dialog.open() == IDialogConstants.OK_ID) {
try {
IContentType newContentType = manager.addContentType(id, dialog.getName(),
getSelectedContentType());
contentTypesViewer.refresh(getSelectedContentType());
contentTypesViewer.setSelection(new StructuredSelection(newContentType));
} catch (CoreException e1) {
MessageDialog.openError(getShell(), WorkbenchMessages.ContentTypes_failedAtEditingContentTypes,
e1.getMessage());
}
}
}));
addChildContentTypeButton.setEnabled(getSelectedContentType() != null);
removeContentTypeButton = new Button(buttonsComposite, SWT.PUSH);
removeContentTypeButton.setText(WorkbenchMessages.ContentTypes_removeContentTypeButton);
setButtonLayoutData(removeContentTypeButton);
removeContentTypeButton.addSelectionListener(widgetSelectedAdapter(e -> {
IContentType selectedContentType = getSelectedContentType();
try {
Platform.getContentTypeManager().removeContentType(selectedContentType.getId());
contentTypesViewer.refresh();
} catch (CoreException e1) {
MessageDialog.openError(getShell(), WorkbenchMessages.ContentTypes_failedAtEditingContentTypes,
e1.getMessage());
}
}));
removeContentTypeButton
.setEnabled(getSelectedContentType() != null && getSelectedContentType().isUserDefined());
}
@Override
public void init(IWorkbench workbench) {
this.workbench = workbench;
noDefaultAndApplyButton();
}
@Override
public void dispose() {
super.dispose();
this.disposableEditorIcons.forEach(Image::dispose);
}
}