package org.xmind.cathy.internal.dashboard;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.xmind.cathy.internal.ICathyConstants;
import org.xmind.cathy.internal.WorkbenchMessages;
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.event.KeyEvent;
import org.xmind.gef.part.IPart;
import org.xmind.gef.tool.ITool;
import org.xmind.gef.ui.internal.SpaceCollaborativeEngine;
import org.xmind.gef.util.Properties;
import org.xmind.ui.gallery.CategorizedGalleryViewer;
import org.xmind.ui.gallery.GalleryEditTool;
import org.xmind.ui.gallery.GalleryLayout;
import org.xmind.ui.gallery.GallerySelectTool;
import org.xmind.ui.gallery.GalleryViewer;
import org.xmind.ui.internal.ClonedTemplate;
import org.xmind.ui.internal.TemplateGroup;
import org.xmind.ui.internal.wizards.TemplateLabelProvider;
import org.xmind.ui.mindmap.ITemplate;
import org.xmind.ui.mindmap.ITemplateGroup;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.resources.ColorUtils;
import org.xmind.ui.texteditor.FloatingTextEditor;
@SuppressWarnings("restriction")
public class CategorizedTemplateViewer extends CategorizedGalleryViewer
implements IAdaptable {
private static final int FRAME_WIDTH = 215;
private static final int FRAME_HEIGHT = 130;
private class CategorizedTemplateContentProvider
implements ITreeContentProvider {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof ITemplateGroup[]) {
return (ITemplateGroup[]) inputElement;
}
return null;
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof ITemplateGroup) {
return ((ITemplateGroup) parentElement).getTemplates()
.toArray();
}
return null;
}
public Object getParent(Object element) {
if (element instanceof ITemplate) {
Object input = getInput();
if (input instanceof ITemplateGroup[]) {
ITemplateGroup[] groups = (ITemplateGroup[]) input;
for (ITemplateGroup group : groups) {
for (ITemplate template : group.getTemplates()) {
if (template.equals(element)) {
return group;
}
}
}
}
}
return null;
}
public boolean hasChildren(Object element) {
return (element instanceof ITemplateGroup
&& ((ITemplateGroup) element).getTemplates().size() > 0);
}
}
private static class CategorizedTemplateLabelProvider
extends TemplateLabelProvider {
public String getText(Object element) {
if (element instanceof ITemplateGroup) {
return ((ITemplateGroup) element).getName();
} else if (element instanceof ITemplate) {
return ((ITemplate) element).getName();
}
return super.getText(element);
}
}
private class TemplateGallerySelectTool extends GallerySelectTool {
@Override
protected boolean handleKeyUp(KeyEvent ke) {
int state = ke.getState();
int key = ke.keyCode;
if (state == 0 && key == SWT.DEL) {
ISelection selection = getSelection();
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) selection)
.getFirstElement();
if (element instanceof ITemplate) {
ITemplate template = (ITemplate) element;
if (MindMapUI.getResourceManager()
.isUserTemplate(template)) {
if (MessageDialog.openConfirm(
getControl().getShell(),
WorkbenchMessages.ConfirmDeleteTemplateDialog_title,
NLS.bind(
WorkbenchMessages.ConfirmDeleteTemplateDialog_message_withTemplateName,
template.getName()))) {
MindMapUI.getResourceManager()
.removeUserTemplate(template);
}
}
}
}
}
return super.handleKeyUp(ke);
}
}
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(130);
}
}
private List<ITemplateGroup> sysTemplateGroups;
private ResourceManager localResourceManager;
public CategorizedTemplateViewer(Composite container) {
super();
setSectionStyle(Section.COMPACT | Section.TWISTIE | Section.EXPANDED
| Section.NO_TITLE_FOCUS_BOX);
create(container);
}
private void create(Composite parent) {
localResourceManager = new LocalResourceManager(
JFaceResources.getResources(), parent);
setContentProvider(new CategorizedTemplateContentProvider());
setLabelProvider(new CategorizedTemplateLabelProvider());
EditDomain domain = new EditDomain();
domain.installTool(GEF.TOOL_SELECT, new TemplateGallerySelectTool());
domain.installTool(GEF.TOOL_EDIT, new TemplateNameEditTool());
setEditDomain(domain);
initProperties();
createControl(parent, SWT.WRAP);
setInput(getViewerInput());
registerHelper(parent.getShell());
}
private void initProperties() {
Properties properties = getProperties();
properties.set(GalleryViewer.Horizontal, Boolean.TRUE);
properties.set(GalleryViewer.Wrap, Boolean.TRUE);
properties.set(GalleryViewer.TitlePlacement,
GalleryViewer.TITLE_BOTTOM);
properties.set(GalleryViewer.SingleClickToOpen, Boolean.TRUE);
properties.set(GalleryViewer.SolidFrames, true);
properties.set(GalleryViewer.FlatFrames, true);
properties.set(GalleryViewer.ImageConstrained, true);
properties.set(GalleryViewer.ImageStretched, true);
properties.set(GalleryViewer.Layout,
new GalleryLayout(GalleryLayout.ALIGN_TOPLEFT,
GalleryLayout.ALIGN_TOPLEFT, 30, 0,
new Insets(10, 0, 20, 65)));
properties.set(GalleryViewer.ContentPaneBorderWidth, 1);
properties.set(GalleryViewer.ContentPaneBorderColor,
(Color) localResourceManager
.get(ColorUtils.toDescriptor("#cccccc"))); //$NON-NLS-1$
properties.set(GalleryViewer.FrameContentSize,
new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
properties.set(GalleryViewer.ContentPaneSpaceCollaborativeEngine,
new SpaceCollaborativeEngine());
}
@Override
protected void configureContainer(ScrolledForm container) {
super.configureContainer(container);
container.setBackground(container.getParent().getBackground());
}
private Object[] getViewerInput() {
List<ITemplateGroup> groups = new ArrayList<ITemplateGroup>();
if (sysTemplateGroups == null || sysTemplateGroups.isEmpty())
sysTemplateGroups = MindMapUI.getResourceManager()
.getSystemTemplateGroups();
groups.addAll(sysTemplateGroups);
List<ITemplate> userTemplates = MindMapUI.getResourceManager()
.getUserTemplates();
if (userTemplates.size() != 0) {
ITemplateGroup userGroup = new TemplateGroup(
WorkbenchMessages.TemplateViewer_UserGroup_title,
userTemplates);
groups.add(userGroup);
}
return groups.toArray(new ITemplateGroup[groups.size()]);
}
@Override
protected Control createSectionContent(Composite parent, Object category) {
parent.setBackground(parent.getParent().getBackground());
getWidgetFactory().setBackground(parent.getBackground());
return super.createSectionContent(parent, category);
}
protected GalleryViewer createNestedViewer() {
return new GalleryViewer();
}
private void registerHelper(Shell shell) {
shell.setData(ICathyConstants.HELPER_TEMPLATE_RENAME, new Runnable() {
public void run() {
ISelection selection = getSelection();
if (selection instanceof IStructuredSelection) {
Object obj = ((IStructuredSelection) selection)
.getFirstElement();
if (obj instanceof ITemplate) {
ITemplate template = (ITemplate) obj;
startEditing(template);
}
}
}
});
}
public void userTemplateAdded(ITemplate template) {
if (template == null || getControl() == null
|| getControl().isDisposed()) {
return;
}
setInput(getViewerInput());
refresh();
reveal(new ClonedTemplate(template.getSourceWorkbookURI(), null));
}
public void userTemplateRemoved(ITemplate template) {
if (template == null || getControl() == null
|| getControl().isDisposed()) {
return;
}
setInput(getViewerInput());
}
private void startEditing(ITemplate template) {
Object input = getInput();
if (input instanceof ITemplateGroup[]) {
ITemplateGroup[] groups = (ITemplateGroup[]) input;
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;
}
List<ITemplate> userTemplates = MindMapUI.getResourceManager()
.getUserTemplates();
for (ITemplate t : userTemplates) {
if (newName.equals(t.getName())) {
return false;
}
}
URI uri = template.getSourceWorkbookURI();
File sourceFile = URIUtil.toFile(uri);
File targetFile = new File(sourceFile.getParent(),
newName + FileUtils.getExtension(sourceFile.getAbsolutePath()));
boolean renameSuccess = sourceFile.renameTo(targetFile);
if (!renameSuccess) {
//TODO
}
Object[] input = getViewerInput();
setInput(input);
setSelection(new StructuredSelection(
new ClonedTemplate(targetFile.toURI(), null)), true);
return true;
}
public <T> T getAdapter(Class<T> adapter) {
if (ISelectionProvider.class.equals(adapter)) {
return adapter.cast(this);
}
return null;
}
@Override
protected void unmapAllElements() {
}
}