/* ******************************************************************************
* 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 java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
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.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.widgets.Composite;
import org.xmind.core.Core;
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.event.ICoreEventSupport;
import org.xmind.core.style.IStyle;
import org.xmind.core.style.IStyleSheet;
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.util.Properties;
import org.xmind.ui.gallery.CategorizedGalleryViewer;
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.internal.MindMapMessages;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.texteditor.FloatingTextEditor;
import org.xmind.ui.viewers.ICategorizedContentProvider;
public class StylesViewer extends CategorizedGalleryViewer implements
ICoreEventListener {
private class StyleContentProvider implements ICategorizedContentProvider {
public Object getCategory(Object element) {
if (element instanceof IStyle) {
IStyle style = (IStyle) element;
return style.getType();
}
return null;
}
public Object[] getElements(Object inputElement) {
List<Object> list = new ArrayList<Object>();
if (inputElement instanceof IStyleSheet[]) {
for (IStyleSheet sheet : (IStyleSheet[]) inputElement) {
addStyles(sheet, list);
}
} else if (inputElement instanceof IStyleSheet) {
addStyles((IStyleSheet) inputElement, list);
}
return list.toArray();
}
private void addStyles(IStyleSheet sheet, List<Object> list) {
if (sheet == MindMapUI.getResourceManager().getSystemStyleSheet()) {
list.addAll(sheet.getStyles(IStyleSheet.AUTOMATIC_STYLES));
} else {
list.addAll(sheet.getAllStyles());
}
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class StyleLabelProvider extends LabelProvider {
public String getText(Object element) {
if (element instanceof IStyle) {
return ((IStyle) element).getName();
} else if (element instanceof String) {
String type = (String) element;
if (IStyle.TOPIC.equalsIgnoreCase(type))
return MindMapMessages.StylesViewer_Topic_label;
if (IStyle.BOUNDARY.equalsIgnoreCase(type))
return MindMapMessages.StylesViewer_Boundary_label;
if (IStyle.RELATIONSHIP.equalsIgnoreCase(type))
return MindMapMessages.StylesViewer_Relationship_label;
if (IStyle.SUMMARY.equalsIgnoreCase(type))
return MindMapMessages.StylesViewer_Summary_label;
if (IStyle.MAP.equalsIgnoreCase(type))
return MindMapMessages.StylesViewer_Map_label;
}
return super.getText(element);
}
}
private static class StylePart extends GraphicalEditPart {
public StylePart(Object model) {
setModel(model);
}
public IStyle getStyle() {
return (IStyle) super.getModel();
}
protected IFigure createFigure() {
return new StyleFigure();
}
protected void updateView() {
super.updateView();
((StyleFigure) getFigure()).setStyle(getStyle());
Properties properties = ((GalleryViewer) getSite().getViewer())
.getProperties();
Dimension size = (Dimension) properties
.get(GalleryViewer.FrameContentSize);
if (size != null) {
getFigure().setPreferredSize(size);
}
}
}
private static class StylePartFactory implements IPartFactory {
private IPartFactory factory;
public StylePartFactory(IPartFactory factory) {
this.factory = factory;
}
public IPart createPart(IPart context, Object model) {
if (context instanceof FramePart && model instanceof IStyle) {
return new StylePart(model);
}
return factory.createPart(context, model);
}
}
private static class StyleSelectTool extends GallerySelectTool {
protected boolean isTitleEditable(IPart p) {
return super.isTitleEditable(p)
&& ((IStyle) p.getModel()).getOwnedStyleSheet() != MindMapUI
.getResourceManager().getSystemStyleSheet();
}
}
private static class StyleNameEditTool 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().saveUserStyleSheet();
}
protected void hookEditor(FloatingTextEditor editor) {
super.hookEditor(editor);
getHelper().setPrefWidth(70);
}
}
private ICoreEventRegister register;
public StylesViewer(Composite parent) {
setContentProvider(new StyleContentProvider());
setLabelProvider(new StyleLabelProvider());
createControl(parent, SWT.NO_REDRAW_RESIZE);
}
protected void configureNestedViewer(GalleryViewer viewer) {
Properties properties = getProperties();
properties.set(GalleryViewer.Horizontal, Boolean.TRUE);
properties.set(GalleryViewer.Wrap, Boolean.TRUE);
properties.set(GalleryViewer.FlatFrames, Boolean.TRUE);
properties.set(GalleryViewer.Layout, new GalleryLayout(
GalleryLayout.ALIGN_TOPLEFT, GalleryLayout.ALIGN_FILL, 1, 1,
new Insets(5)));
properties.set(GalleryViewer.FrameContentSize, new Dimension(64, 64));
properties.set(GalleryViewer.TitlePlacement, GalleryViewer.TITLE_TOP);
properties.set(GalleryViewer.SingleClickToOpen, Boolean.FALSE);
super.configureNestedViewer(viewer);
viewer.setPartFactory(new StylePartFactory(viewer.getPartFactory()));
EditDomain editDomain = new EditDomain();
editDomain.installTool(GEF.TOOL_SELECT, new StyleSelectTool());
editDomain.installTool(GEF.TOOL_EDIT, new StyleNameEditTool());
viewer.setEditDomain(editDomain);
}
protected void inputChanged(Object input, Object oldInput) {
super.inputChanged(input, oldInput);
if (register != null) {
register.unregisterAll();
} else {
register = new CoreEventRegister(this);
}
if (input instanceof IStyleSheet) {
hookSheet((IStyleSheet) input);
} else if (input instanceof IStyleSheet[]) {
for (IStyleSheet sheet : (IStyleSheet[]) input) {
hookSheet(sheet);
}
}
}
@Override
protected void handleDispose(DisposeEvent event) {
if (register != null) {
register.unregisterAll();
}
super.handleDispose(event);
}
private void hookSheet(IStyleSheet sheet) {
ICoreEventSupport support = (ICoreEventSupport) sheet
.getAdapter(ICoreEventSupport.class);
if (support != null) {
register.setNextSupport(support);
register.register(Core.StyleAdd);
register.register(Core.StyleRemove);
register.register(Core.Name);
}
}
public void handleCoreEvent(CoreEvent event) {
if (Core.Name.equals(event.getType())) {
if (event.getSource() instanceof IStyle) {
update(event.getSource(), null);
}
} else {
setInput(getInput());
}
}
public void setSelection(ISelection selection) {
super.setSelection(selection, true);
}
}