package org.xmind.ui.internal.views;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Control;
import org.xmind.core.Core;
import org.xmind.core.ISheet;
import org.xmind.core.ITopic;
import org.xmind.core.event.CoreEvent;
import org.xmind.core.event.CoreEventRegister;
import org.xmind.core.event.ICoreEventListener;
import org.xmind.core.event.ICoreEventRegister;
import org.xmind.gef.IGraphicalViewer;
import org.xmind.ui.mindmap.IMindMapImages;
import org.xmind.ui.mindmap.MindMapUI;
public class HyperlinkInspectorSection extends InspectorContentSection
implements ICoreEventListener {
private ICoreEventRegister register;
private List<ITopic> topicsWithHyperlink;
private List<ITopic> allTopics;
public HyperlinkInspectorSection() {
setTitle(NLS.bind(Messages.HyperlinkInspectorSection_title, 0));
}
@Override
protected void refreshList() {
super.refreshList();
if (topicsWithHyperlink != null)
setTitle(NLS.bind(Messages.HyperlinkInspectorSection_title,
topicsWithHyperlink.size()));
else
setTitle(NLS.bind(Messages.HyperlinkInspectorSection_title, 0));
}
@Override
protected Object[] getAllPropertyContents(IGraphicalViewer viewer) {
List<ITopic> topicsWithHyperlink = null;
List<ITopic> allTopics = null;
ISheet sheet = (ISheet) viewer.getAdapter(ISheet.class);
if (sheet != null) {
allTopics = getAllTopics();
topicsWithHyperlink = getTopicsWithHyperlink(allTopics);
}
setLabelRef(topicsWithHyperlink, allTopics);
if (topicsWithHyperlink != null)
return topicsWithHyperlink.toArray();
return new Object[0];
}
private void setLabelRef(List<ITopic> topicsWithHyperlink,
List<ITopic> allTopics) {
if (topicsWithHyperlink == this.topicsWithHyperlink
&& allTopics == this.allTopics)
return;
if (register != null) {
register.unregisterAll();
register = null;
}
this.topicsWithHyperlink = topicsWithHyperlink;
this.allTopics = allTopics;
if (allTopics != null) {
register = new CoreEventRegister(getCurrentWorkbook(), this);
register.register(Core.ModifyTime);
}
}
private List<ITopic> getTopicsWithHyperlink(List<ITopic> all) {
List<ITopic> topics = null;
for (ITopic topic : all) {
if (hasHyperlink(topic)) {
if (topics == null)
topics = new ArrayList<ITopic>();
topics.add(topic);
}
}
return topics;
}
private boolean hasHyperlink(ITopic topic) {
return topic.getHyperlink() != null
&& !topic.getHyperlink().startsWith("xap:") //$NON-NLS-1$
&& !topic.getHyperlink().startsWith("file:"); //$NON-NLS-1$
}
@Override
protected Image getPropertyInspectorImage(Object element) {
return MindMapUI.getImages().get(IMindMapImages.HYPERLINK, true)
.createImage();
}
@Override
protected String getPropertyInspectorText(Object element) {
if (element instanceof ITopic)
return ((ITopic) element).getTitleText().replaceAll(
"\r\n|\r|\n", " ") //$NON-NLS-1$ //$NON-NLS-2$
+ ContentListViewer.SEP + ((ITopic) element).getHyperlink();
return null;
}
public String getPropertyInspectorHyperlink(Object element) {
if (element instanceof ITopic) {
return ((ITopic) element).getHyperlink();
}
return null;
}
public void handleCoreEvent(final CoreEvent event) {
Control c = getControl();
if (c == null || c.isDisposed())
return;
c.getDisplay().syncExec(new Runnable() {
public void run() {
refreshList(event);
}
});
}
protected void refreshList(CoreEvent event) {
refreshList();
getControl().getParent().layout();
}
@Override
protected void handleDispose() {
if (register != null) {
register.unregisterAll();
register = null;
}
}
}