package org.xmind.ui.internal.views; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; 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.core.util.HyperlinkUtils; import org.xmind.gef.IGraphicalViewer; import org.xmind.ui.internal.AttachmentImageDescriptor; import org.xmind.ui.viewers.ImageListViewer; public class ImageInspectorSection2 extends InspectorSection implements ICoreEventListener { private static final String FILE_PROTOCOL = "file"; //$NON-NLS-1$ private ICoreEventRegister register; private ImageListViewer list; List<ITopic> topicsWithImage; private List<ITopic> allTopics; public ImageInspectorSection2() { setTitle(NLS.bind(Messages.ImageInspectorSection_title, 0)); } @Override protected Composite createContent(Composite parent) { Composite composite = super.createContent(parent); list = new ImageListViewer(composite, SWT.RESIZE); list.setContentProvider(new InspectorContentProvider()); list.setLabelProvider(new InspectorLabelProvider()); list.getControl().addListener(SWT.FocusOut, new Listener() { public void handleEvent(Event event) { list.setSelection(StructuredSelection.EMPTY); } }); return composite; } @Override protected void refreshImageList() { if (list == null || list.getControl() == null) return; if (list.getInput() != getContributingViewer()) list.setInput(getContributingViewer()); list.refresh(); if (topicsWithImage != null) setTitle(NLS.bind(Messages.ImageInspectorSection_title, topicsWithImage.size())); else setTitle(NLS.bind(Messages.ImageInspectorSection_title, 0)); reflow(); } protected Object[] getAllPropertyContents(IGraphicalViewer viewer) { List<ITopic> topicsWithImage = null; List<ITopic> allTopics = null; ISheet sheet = (ISheet) viewer.getAdapter(ISheet.class); if (sheet != null) { allTopics = getAllTopics(); topicsWithImage = getTopicsWithImage(allTopics); } setLabelRef(topicsWithImage, allTopics); if (topicsWithImage != null) return topicsWithImage.toArray(); return new Object[0]; } private void setLabelRef(List<ITopic> topicsWithImage, List<ITopic> allTopics) { if (topicsWithImage == this.topicsWithImage && allTopics == this.allTopics) return; if (register != null) { register.unregisterAll(); register = null; } this.topicsWithImage = topicsWithImage; this.allTopics = allTopics; if (allTopics != null) { register = new CoreEventRegister(getCurrentWorkbook(), this); register.register(Core.ModifyTime); } } private List<ITopic> getTopicsWithImage(List<ITopic> all) { List<ITopic> topics = null; for (ITopic topic : all) { if (hasImage(topic)) { if (topics == null) topics = new ArrayList<ITopic>(); topics.add(topic); } } return topics; } private boolean hasImage(ITopic topic) { return topic.getImage().getSource() != null; } @Override protected String getPropertyInspectorText(Object element) { return super.getPropertyInspectorText(element); } protected Image getPropertyInspectorImage(Object element) { if (element instanceof ITopic) { String source = ((ITopic) element).getImage().getSource(); if (source != null) { return getImage(((ITopic) element), source); } } return null; } private Image getImage(ITopic topic, String source) { ImageDescriptor imageDescriptor = null; if (HyperlinkUtils.isAttachmentURL(source)) { String path = HyperlinkUtils.toAttachmentPath(source); imageDescriptor = AttachmentImageDescriptor.createFromEntryPath( topic.getOwnedWorkbook(), path); } else { URL url = checkFileURL(source); if (url != null) imageDescriptor = ImageDescriptor.createFromURL(url); } if (imageDescriptor != null) return imageDescriptor.createImage(); return null; } private URL checkFileURL(String source) { try { URL url = new URL(source); if (FILE_PROTOCOL.equalsIgnoreCase(url.getProtocol())) return url; } catch (MalformedURLException e) { } return null; } public void handleCoreEvent(CoreEvent event) { Control c = getControl(); if (c == null || c.isDisposed()) return; c.getDisplay().syncExec(new Runnable() { public void run() { refresh(); } }); } @Override protected void handleDispose() { if (register != null) { register.unregisterAll(); register = null; } } }