blob: a674069fdc7ea604abc0b30c8d797f0b8bc60ace [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 Peter Stibrany 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
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Peter Stibrany - initial API and implementation
* Tasktop Technologies - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
import org.eclipse.mylyn.tasks.core.ITaskAttachment;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.EditorsUI;
/**
* @author Peter Stibrany
*/
public class TaskAttachmentViewerManager {
public ITaskAttachmentViewer getBrowserViewer(ITaskAttachment attachment) {
if (attachment.getUrl() != null && attachment.getUrl().trim().length() > 0) {
return new TaskAttachmentBrowserViewer();
}
return null;
}
public List<ITaskAttachmentViewer> getWorkbenchViewers(ITaskAttachment attachment) {
List<ITaskAttachmentViewer> result = new ArrayList<ITaskAttachmentViewer>();
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor defaultEditor = registry.getDefaultEditor(AttachmentUtil.getAttachmentFilename(attachment));
if (defaultEditor != null) {
result.add(new TaskAttachmentEditorViewer(defaultEditor, true));
}
IEditorDescriptor defaultTextEditor = registry.findEditor(EditorsUI.DEFAULT_TEXT_EDITOR_ID); // may be null
if (defaultTextEditor != null
&& (defaultEditor == null || !defaultTextEditor.getId().equals(defaultEditor.getId()))) {
result.add(new TaskAttachmentEditorViewer(defaultTextEditor));
}
IEditorDescriptor[] descriptors = registry.getEditors(AttachmentUtil.getAttachmentFilename(attachment));
for (IEditorDescriptor ied : descriptors) {
if (defaultEditor == null || !ied.getId().equals(defaultEditor.getId())) {
result.add(new TaskAttachmentEditorViewer(ied));
}
}
return result;
}
public List<ITaskAttachmentViewer> getSystemViewers(ITaskAttachment attachment) {
List<ITaskAttachmentViewer> result = new ArrayList<ITaskAttachmentViewer>();
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
// Don't check whether system external editor is available (IEditorRegistry.isSystemExternalEditorAvailable) ...
// At least Windows can handle even unknown files, and offers user to choose correct program to open file with
IEditorDescriptor extern = registry.findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
result.add(new TaskAttachmentEditorViewer(extern, false, true));
if (registry.isSystemInPlaceEditorAvailable(AttachmentUtil.getAttachmentFilename(attachment))) {
IEditorDescriptor inplace = registry.findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
result.add(new TaskAttachmentEditorViewer(inplace, false, true));
}
return result;
}
public List<ITaskAttachmentViewer> getTaskAttachmentViewers(ITaskAttachment attachment) {
List<ITaskAttachmentViewer> result = new ArrayList<ITaskAttachmentViewer>();
ITaskAttachmentViewer browserViewer = getBrowserViewer(attachment);
if (browserViewer != null) {
result.add(browserViewer);
}
result.addAll(getWorkbenchViewers(attachment));
result.addAll(getSystemViewers(attachment));
return result;
}
/**
* @param attachment
* @return preferred attachment viewers, or null if no suitable viewer can be found
*/
public ITaskAttachmentViewer getPreferredViewer(ITaskAttachment attachment) {
/*
* Find viewers in order of preference: preferred, workbench default, system editor, first editor in list
*/
List<ITaskAttachmentViewer> viewers = getTaskAttachmentViewers(attachment);
ITaskAttachmentViewer defaultViewer = null;
String preferred = getPreferredViewerID(attachment);
for (ITaskAttachmentViewer viewer : viewers) {
if ((preferred != null && preferred.equals(viewer.getId()))) {
return viewer;
} else if (viewer.isWorkbenchDefault()) {
defaultViewer = viewer;
} else if (defaultViewer == null && Platform.getOS().equals(Platform.OS_WIN32)
&& IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID.equals(viewer.getId())) {
defaultViewer = viewer;
}
}
if (defaultViewer == null && !viewers.isEmpty()) {
defaultViewer = viewers.get(0);
}
return defaultViewer;
}
public String getPreferredViewerID(ITaskAttachment attachment) {
String ext = getExtension(attachment);
if (ext == null) {
return null;
}
return getPreferencesStore().getString(
ITasksUiPreferenceConstants.PREFERRED_TASK_ATTACHMENT_VIEWER_ID + "_" + ext);//$NON-NLS-1$
}
private IPreferenceStore getPreferencesStore() {
return TasksUiPlugin.getDefault().getPreferenceStore();
}
public void savePreferredViewerID(ITaskAttachment attachment, String handlerID) {
String ext = getExtension(attachment);
if (ext == null) {
return;
}
getPreferencesStore().putValue(
ITasksUiPreferenceConstants.PREFERRED_TASK_ATTACHMENT_VIEWER_ID + "_" + ext, handlerID); //$NON-NLS-1$
}
private String getExtension(ITaskAttachment attachment) {
if (attachment == null) {
return null;
}
String fname = AttachmentUtil.getAttachmentFilename(attachment);
int dot = fname.lastIndexOf('.');
if (dot < 0) {
return null;
}
return fname.substring(dot + 1);
}
}