package org.xmind.ui.internal.protocols;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.xmind.core.ISheet;
import org.xmind.core.ITopic;
import org.xmind.core.IWorkbook;
import org.xmind.core.util.HyperlinkUtils;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.mindmap.IMindMapImages;
import org.xmind.ui.mindmap.IProtocol;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.MindMapUtils;
public class TopicProtocol implements IProtocol {
// private Collection<ITopic> analyzingTopics = new HashSet<ITopic>();
public TopicProtocol() {
}
public IAction createOpenHyperlinkAction(final Object context,
final String uri) {
final IWorkbook workbook = MindMapUtils.findWorkbook(context);
if (workbook == null)
return null;
final Object element = HyperlinkUtils.findElement(uri, workbook);
// if (element == null)
// return null;
ImageDescriptor icon = getIcon(element);
if (icon == null) {
icon = MindMapUI.getImages().get(IMindMapImages.UNKNOWN_FILE, true);
}
String title = getTitle(element);
String sheetTitle = getSheetTitle(element);
String name;
if (sheetTitle != null) {
name = String.format("%s (%s)", title, sheetTitle); //$NON-NLS-1$
} else {
name = title;
}
Action action = new Action(
MindMapMessages.TopicProtocol_GoToTopic_text, icon) {
public void run() {
if (element != null) {
navigateTo(context, element, workbook);
}
}
};
action.setToolTipText(name);
return action;
}
/**
* @param element
* @return
*/
private ImageDescriptor getIcon(Object element) {
if (element instanceof ITopic) {
ITopic topic = (ITopic) element;
return MindMapUI.getImages().getTopicIcon(topic, true);
}
return null;
}
/**
* @param element
* @return
*/
private String getSheetTitle(Object element) {
ISheet sheet = getSheet(element);
return sheet == null ? null : sheet.getTitleText();
}
/**
* @param element
* @return
*/
private ISheet getSheet(Object element) {
return MindMapUtils.findSheet(element);
}
/**
* @param element
* @return
*/
private String getTitle(Object element) {
return MindMapUtils.getText(element);
}
private static void navigateTo(Object context, Object element,
IWorkbook workbook) {
if (context instanceof IAdaptable) {
ISelectionProvider selectionProvider = (ISelectionProvider) ((IAdaptable) context)
.getAdapter(ISelectionProvider.class);
if (selectionProvider != null) {
selectionProvider
.setSelection(new StructuredSelection(element));
return;
}
}
}
public boolean isHyperlinkModifiable(Object source, String uri) {
return true;
}
}