package org.xmind.cathy.internal.dashboard;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.sql.Date;
import java.text.DateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.xmind.cathy.internal.CathyPlugin;
import org.xmind.cathy.internal.WorkbenchMessages;
import org.xmind.gef.draw2d.SizeableImageFigure;
import org.xmind.ui.editor.IEditorHistory;
import org.xmind.ui.editor.IEditorHistoryItem;
import org.xmind.ui.gallery.GalleryViewer;
import org.xmind.ui.gallery.IDecorationContext;
import org.xmind.ui.gallery.ILabelDecorator;
import org.xmind.ui.mindmap.IMindMapImages;
import org.xmind.ui.mindmap.MindMapUI;
public class RecentFilesLabelProvider extends LabelProvider
implements ILabelDecorator {
Image pinImage;
protected static class RecentFrameContentLayout
extends RecentContainerLayout {
private IDecorationContext context;
public RecentFrameContentLayout(IDecorationContext context) {
this.context = context;
}
@Override
protected Dimension calculatePreferredSize(IFigure figure, int wHint,
int hHint) {
if (context != null) {
Insets insets = figure.getInsets();
Dimension contentSize = (Dimension) context
.getProperty(GalleryViewer.FrameContentSize, null);
if (contentSize != null)
return new Dimension(contentSize.width + insets.getWidth(),
contentSize.height + insets.getHeight());
}
return super.calculatePreferredSize(figure, wHint, hHint);
}
}
protected static final String COLOR_NONEXISTING_WORKBOOK_COVER = "#DDDDDD"; //$NON-NLS-1$
protected static final String COLOR_NONEXISTING_WORKBOOK_TEXT = "#CCCCCC"; //$NON-NLS-1$
private LocalResourceManager resources;
private IEditorHistory editorHistory;
private Map<Object, Image> images;
public RecentFilesLabelProvider(Composite parent) {
this.images = new HashMap<Object, Image>();
resources = new LocalResourceManager(JFaceResources.getResources(),
parent);
editorHistory = PlatformUI.getWorkbench()
.getService(IEditorHistory.class);
}
public void clear() {
Object[] imageArray = images.values().toArray();
images.clear();
for (Object image : imageArray) {
((Image) image).dispose();
}
}
@Override
public void dispose() {
resources.dispose();
clear();
super.dispose();
}
@Override
public String getText(Object element) {
if (!(element instanceof URI))
return super.getText(element);
URI uri = (URI) element;
IEditorHistoryItem item = editorHistory.getItem(uri);
if (item != null) {
String name = item.getName();
Assert.isTrue(name != null);
StringBuffer buf = new StringBuffer();
if (name.length() > 20)
name = name.substring(0, 20) + "..."; //$NON-NLS-1$
buf.append(name);
if (uri.getScheme().equalsIgnoreCase("seawind")) { //$NON-NLS-1$
buf.append(" "); //$NON-NLS-1$
buf.append(
WorkbenchMessages.RecentFilesLabelProvider_Cloud_text);
}
return buf.toString();
}
return uri.toString();
}
@Override
public Image getImage(Object element) {
if (element instanceof URI) {
URI uri = (URI) element;
Image image = images.get(uri);
if (image != null && !image.isDisposed())
return image;
image = getImageByThumb(uri);
if (image != null && !image.isDisposed()) {
images.put(uri, image);
}
return image;
}
return resources.createImage(
MindMapUI.getImages().get(IMindMapImages.THUMBNAIL_LOST, true));
}
private Image getImageByThumb(URI uri) {
InputStream thumbnailData = null;
try {
thumbnailData = editorHistory.loadThumbnailData(uri);
if (thumbnailData != null) {
return new Image(resources.getDevice(), thumbnailData);
}
} catch (IOException e) {
CathyPlugin.log(e, String.format(
"Failed to load preview image for recent page uri == %s", //$NON-NLS-1$
uri));
} catch (SWTException e) {
CathyPlugin.log(e, String.format(
"Failed to load preview image for recent page uri == %s", //$NON-NLS-1$
uri));
} finally {
try {
if (thumbnailData != null)
thumbnailData.close();
} catch (IOException e) {
}
}
return resources.createImage(
MindMapUI.getImages().get(IMindMapImages.THUMBNAIL_LOST, true));
}
public IFigure decorateFigure(IFigure figure, Object element,
IDecorationContext context) {
if (!(element instanceof URI))
return figure;
return decorateFrameFigure(figure, (URI) element, context);
}
protected IFigure decorateFrameFigure(IFigure contentPane, URI uri,
IDecorationContext context) {
SizeableImageFigure thumbnailFigure;
SizeableImageFigure pinIcon;
List figures = contentPane.getChildren();
boolean needInitFigureContent = figures.isEmpty();
if (needInitFigureContent) {
contentPane.setLayoutManager(new RecentFrameContentLayout(context));
thumbnailFigure = new SizeableImageFigure(getImage(uri));
pinIcon = new SizeableImageFigure(getPinImage(uri));
contentPane.add(thumbnailFigure);
contentPane.add(pinIcon, Integer
.valueOf(PositionConstants.LEFT | PositionConstants.TOP));
if (context != null) {
boolean imageConstrained = Boolean.TRUE.equals(context
.getProperty(GalleryViewer.ImageConstrained, false));
boolean imageStretched = Boolean.TRUE.equals(context
.getProperty(GalleryViewer.ImageStretched, false));
thumbnailFigure.setConstrained(imageConstrained);
thumbnailFigure.setStretched(imageStretched);
}
} else {
thumbnailFigure = (SizeableImageFigure) figures.get(0);
pinIcon = (SizeableImageFigure) figures.get(1);
}
thumbnailFigure.setImage(getImage(uri));
pinIcon.setImage(getPinImage(uri));
return contentPane;
}
private Image getPinImage(URI uri) {
boolean isPin = editorHistory.isPinned(uri);
return isPin ? getPinImage() : null;
}
private Image getPinImage() {
if (pinImage == null) {
ImageDescriptor desc = MindMapUI.getImages().get(IMindMapImages.PIN,
true);
if (desc != null) {
try {
pinImage = resources.createImage(desc);
} catch (Throwable e) {
//e.printStackTrace();
}
}
}
return pinImage;
}
public String getSubtitle(Object element) {
if (element instanceof URI) {
IEditorHistoryItem item = editorHistory.getItem((URI) element);
long t = item.getOpenedTime();
Date date = new Date(t);
return DateFormat
.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
.format(date);
}
Date newDate = new Date(System.currentTimeMillis());
return DateFormat
.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
.format(newDate);
}
}