package org.xmind.ui.internal.resourcemanager;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.util.Util;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.xmind.core.util.FileUtils;
import org.xmind.gef.EditDomain;
import org.xmind.gef.GEF;
import org.xmind.gef.IViewer;
import org.xmind.gef.draw2d.SizeableImageFigure;
import org.xmind.gef.part.IPart;
import org.xmind.gef.tool.ITool;
import org.xmind.gef.util.Properties;
import org.xmind.ui.gallery.GalleryEditTool;
import org.xmind.ui.gallery.GallerySelectTool;
import org.xmind.ui.gallery.GalleryViewer;
import org.xmind.ui.gallery.IDecorationContext;
import org.xmind.ui.gallery.ILabelDecorator;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.internal.TemplateGroup;
import org.xmind.ui.internal.wizards.TemplateLabelProvider;
import org.xmind.ui.mindmap.IResourceManager;
import org.xmind.ui.mindmap.ITemplate;
import org.xmind.ui.mindmap.ITemplateGroup;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.texteditor.FloatingTextEditor;
public class TemplateResourceManagerViewer extends ResourceManagerViewer {
private static final int FRAME_WIDTH = 132;
private static final int FRAME_HEIGHT = 72;
private class TemplateGalleryViewer extends GalleryViewer {
protected boolean isTitleEditable(IPart p) {
List<ITemplate> userTemplates = MindMapUI.getResourceManager()
.getUserTemplates();
return userTemplates.contains(p.getModel());
}
}
static class TemplateGalleryCore {
static final String SYSTEM_GROUP_NAME = MindMapMessages.TemplateResourceManagerViewer_SystemGroup_name;
static final String USER_GROUP_NAME = MindMapMessages.TemplateResourceManagerViewer_UserGroup_name;
private static TemplateGalleryCore instance = new TemplateGalleryCore();
List<ITemplateGroup> groups = new ArrayList<ITemplateGroup>();
public static TemplateGalleryCore getInstance() {
return instance;
}
private TemplateGalleryCore() {
}
public List<ITemplateGroup> getElements() {
groups.clear();
IResourceManager resourceManager = MindMapUI.getResourceManager();
groups.addAll(resourceManager.getSystemTemplateGroups());
ITemplateGroup userGroup = new TemplateGroup(USER_GROUP_NAME,
resourceManager.getUserTemplates());
if (!(userGroup.getTemplates().isEmpty()))
groups.add(userGroup);
return groups;
}
public ITemplateGroup getGroupByName(String name) {
for (ITemplateGroup group : groups)
if (group.getName().equals(name))
return group;
return null;
}
}
private static class TemplateCategorizedContentProvider
implements ITreeContentProvider {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof TemplateGalleryCore)
return ((TemplateGalleryCore) inputElement).getElements()
.toArray();
else
return null;
}
@SuppressWarnings("unchecked")
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof TemplateGalleryCore)
return ((TemplateGalleryCore) parentElement).getElements()
.toArray();
else if (parentElement instanceof ITemplateGroup)
return ((ITemplateGroup) parentElement).getTemplates()
.toArray();
else
return null;
}
public Object getParent(Object element) {
TemplateGalleryCore templatesGalleryCore = TemplateGalleryCore
.getInstance();
if (element instanceof ITemplate) {
for (ITemplateGroup group : templatesGalleryCore
.getElements()) {
if (group.getTemplates().contains(element))
return group;
}
} else if (element instanceof List)
return TemplateGalleryCore.getInstance();
return null;
}
public boolean hasChildren(Object element) {
return element instanceof List
|| element instanceof TemplateGalleryCore;
}
}
private class TemplateCategorizedLabelProvider extends TemplateLabelProvider
implements ILabelDecorator, IFontProvider {
@Override
public String getText(Object element) {
if (element instanceof ITemplateGroup)
return ((ITemplateGroup) element).getName();
else
return super.getText(element);
}
@Override
public IFigure decorateFigure(IFigure figure, Object element,
IDecorationContext context) {
@SuppressWarnings("rawtypes")
List children = figure.getChildren();
boolean needInitFigureContent = children.isEmpty();
if (needInitFigureContent) {
SizeableImageFigure contentFigure = new SizeableImageFigure(
getImage(element));
figure.add(contentFigure);
if (context != null) {
figure.setLayoutManager(new Layout(context));
boolean imageConstrained = Boolean.TRUE.equals(
context.getProperty(GalleryViewer.ImageConstrained,
false));
boolean imageStretched = Boolean.TRUE.equals(context
.getProperty(GalleryViewer.ImageStretched, false));
contentFigure.setConstrained(imageConstrained);
contentFigure.setStretched(imageStretched);
}
}
return figure;
}
@Override
protected void fireLabelProviderChanged(
LabelProviderChangedEvent event) {
super.fireLabelProviderChanged(event);
TemplateResourceManagerViewer.this.refresh();
}
@Override
public Font getFont(Object element) {
FontData fontData = TemplateResourceManagerViewer.this.font
.getFontData()[0];
if (Util.isMac()) {
fontData.setHeight(12);
} else {
fontData.setHeight(9);
}
FontDescriptor fontDescriptor = FontDescriptor.createFrom(fontData);
return getResourceManager().createFont(fontDescriptor);
}
}
private class TemplateNameEditTool extends GalleryEditTool {
protected IDocument getTextContents(IPart source) {
return new org.eclipse.jface.text.Document(
((ITemplate) source.getModel()).getName());
}
protected void handleTextModified(IPart source, IDocument document) {
ITemplate template = (ITemplate) source.getModel();
if (template != null) {
modifyTemplateName(template, document.get());
}
}
protected void hookEditor(FloatingTextEditor editor) {
super.hookEditor(editor);
getHelper().setPrefWidth(FRAME_WIDTH);
}
}
private Font font;
public TemplateResourceManagerViewer() {
super();
}
@Override
public void createControl(Composite container) {
super.createControl(container);
this.font = container.getFont();
setContentProvider(new TemplateCategorizedContentProvider());
setLabelProvider(new TemplateCategorizedLabelProvider());
EditDomain domain = new EditDomain();
domain.installTool(GEF.TOOL_SELECT,
new ResourceCategorizedSelectTool());
setEditDomain(domain);
initProperties();
createControl(container, SWT.WRAP);
getControl()
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
setInput(TemplateGalleryCore.getInstance());
}
@Override
protected void initProperties() {
super.initProperties();
Properties properties = getProperties();
properties.set(GalleryViewer.FrameContentSize,
new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
}
@Override
protected void initNestedGalleryViewer(GalleryViewer galleryViewerer) {
super.initNestedGalleryViewer(galleryViewerer);
galleryViewerer.getEditDomain().installTool(GEF.TOOL_EDIT,
new TemplateNameEditTool());
}
public void startEditing(ITemplate template) {
Object input = getInput();
if (input instanceof TemplateGalleryCore) {
List<ITemplateGroup> groups = ((TemplateGalleryCore) input)
.getElements();
for (ITemplateGroup group : groups) {
if (group.getTemplates().contains(template)) {
GalleryViewer galleryViewer = getNestedViewer(group);
EditDomain domain = galleryViewer.getEditDomain();
ITool tool = domain.getDefaultTool();
((GallerySelectTool) tool).getStatus()
.setStatus(GEF.ST_ACTIVE, true);
domain.handleRequest(GEF.REQ_EDIT, (IViewer) galleryViewer);
break;
}
}
}
}
private boolean modifyTemplateName(ITemplate template, String newName) {
if (template == null || newName == null || newName.equals("") //$NON-NLS-1$
|| newName.equals(template.getName())) {
return false;
}
//if this name has already exist.
List<ITemplate> userTemplates = MindMapUI.getResourceManager()
.getUserTemplates();
for (ITemplate t : userTemplates) {
if (newName.equals(t.getName())) {
return false;
}
}
// delete old file, and create a new.
URI uri = template.getSourceWorkbookURI();
File sourceFile = URIUtil.toFile(uri);
String newPath = sourceFile.getParent()
+ System.getProperty("file.separator") + newName //$NON-NLS-1$
+ FileUtils.getExtension(sourceFile.getAbsolutePath());
sourceFile.renameTo(new File(newPath));
((TemplateCategorizedLabelProvider) getLabelProvider())
.fireLabelProviderChanged(new LabelProviderChangedEvent(
getLabelProvider(), template));
return true;
}
protected GalleryViewer createNestedViewer() {
return new TemplateGalleryViewer();
}
}