/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.views;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.xmind.core.style.IStyle;
import org.xmind.gef.EditDomain;
import org.xmind.gef.GEF;
import org.xmind.gef.part.GraphicalEditPart;
import org.xmind.gef.part.IPart;
import org.xmind.gef.part.IPartFactory;
import org.xmind.gef.tool.ITool;
import org.xmind.gef.util.Properties;
import org.xmind.ui.gallery.FramePart;
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.mindmap.IMindMapImages;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.texteditor.FloatingTextEditor;
public class ThemesViewer extends GalleryViewer {
private static class ThemeLabelProvider extends LabelProvider {
public String getText(Object element) {
if (element instanceof IStyle) {
IStyle style = (IStyle) element;
return style.getName();
}
return super.getText(element);
}
}
private static class ThemePart extends GraphicalEditPart {
public ThemePart(IStyle style) {
setModel(style);
}
public IStyle getStyle() {
return (IStyle) super.getModel();
}
protected IFigure createFigure() {
return new ThemeFigure();
}
protected void updateView() {
super.updateView();
((ThemeFigure) getFigure()).setTheme(getStyle());
((ThemeFigure) getFigure()).setDefaultImage(getDefaultImage());
Properties properties = ((GalleryViewer) getSite().getViewer())
.getProperties();
Dimension size = (Dimension) properties
.get(GalleryViewer.FrameContentSize);
if (size != null) {
getFigure().setPreferredSize(size);
}
}
protected void register() {
registerModel(getStyle().getId());
super.register();
}
@Override
protected void unregister() {
super.unregister();
unregisterModel(getStyle().getId());
}
private Image getDefaultImage() {
return ((ThemesViewer) getSite().getViewer())
.getDefaultImage(getStyle());
}
}
private static class ThemePartFactory implements IPartFactory {
private IPartFactory factory;
public ThemePartFactory(IPartFactory factory) {
this.factory = factory;
}
public IPart createPart(IPart context, Object model) {
if (context instanceof FramePart && model instanceof IStyle)
return new ThemePart((IStyle) model);
return factory.createPart(context, model);
}
}
private static class ThemeSelectTool extends GallerySelectTool {
protected boolean isTitleEditable(IPart p) {
if (!super.isTitleEditable(p))
return false;
IStyle theme = (IStyle) p.getModel();
return theme != MindMapUI.getResourceManager().getBlankTheme()
&& theme.getOwnedStyleSheet() != MindMapUI
.getResourceManager().getSystemThemeSheet();
}
}
private static class ThemeNameEditTool extends GalleryEditTool {
protected IDocument getTextContents(IPart source) {
return new Document(((IStyle) source.getModel()).getName());
}
protected void handleTextModified(IPart source, IDocument document) {
((IStyle) source.getModel()).setName(document.get());
MindMapUI.getResourceManager().saveUserThemeSheet();
}
protected void hookEditor(FloatingTextEditor editor) {
super.hookEditor(editor);
getHelper().setPrefWidth(130);
}
}
private IStyle defaultTheme = null;
private Image defaultImage = null;
public ThemesViewer(Composite parent) {
super();
init();
createControl(parent);
final Display display = parent.getDisplay();
getControl().setBackground(
display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
getControl().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (defaultImage != null) {
defaultImage.dispose();
defaultImage = null;
}
}
});
}
protected void init() {
setPartFactory(new ThemePartFactory(getPartFactory()));
setLabelProvider(new ThemeLabelProvider());
EditDomain editDomain = new EditDomain();
editDomain.installTool(GEF.TOOL_SELECT, new ThemeSelectTool());
editDomain.installTool(GEF.TOOL_EDIT, new ThemeNameEditTool());
setEditDomain(editDomain);
Properties properties = getProperties();
properties.set(GalleryViewer.Horizontal, Boolean.TRUE);
properties.set(GalleryViewer.Wrap, Boolean.TRUE);
properties.set(GalleryViewer.Layout, new GalleryLayout(
GalleryLayout.ALIGN_CENTER, GalleryLayout.ALIGN_FILL, 1, 1,
new Insets(5)));
properties.set(GalleryViewer.FrameContentSize, new Dimension(128, 64));
properties.set(GalleryViewer.TitlePlacement, GalleryViewer.TITLE_TOP);
properties.set(GalleryViewer.SingleClickToOpen, Boolean.FALSE);
}
public void setSelection(ISelection selection) {
super.setSelection(selection, true);
}
public IStyle getDefaultTheme() {
return defaultTheme;
}
public void setDefaultTheme(IStyle defaultTheme) {
IStyle oldTheme = this.defaultTheme;
this.defaultTheme = defaultTheme;
updateThemePart(oldTheme);
updateThemePart(defaultTheme);
}
private Image getDefaultImage(IStyle theme) {
return (theme == this.defaultTheme) ? getDefaultImage() : null;
}
private Image getDefaultImage() {
if (defaultImage == null) {
ImageDescriptor desc = MindMapUI.getImages().get(
IMindMapImages.STAR, true);
if (desc != null) {
try {
defaultImage = desc.createImage(false, getControl()
.getDisplay());
} catch (Throwable e) {
//e.printStackTrace();
}
}
}
return defaultImage;
}
private void updateThemePart(IStyle theme) {
ThemePart part = findThemePart(theme);
if (part != null)
part.update();
}
private ThemePart findThemePart(IStyle style) {
if (style == null)
return null;
return (ThemePart) getPartRegistry().getPartByModel(style.getId());
}
public void startEditing(IStyle theme) {
EditDomain domain = getEditDomain();
ITool tool = domain.getDefaultTool();
((GallerySelectTool) tool).getStatus().setStatus(GEF.ST_ACTIVE, true);
domain.handleRequest(GEF.REQ_EDIT, this);
}
}