package org.xmind.ui.internal.resourcemanager;
import java.util.List;
import java.util.Set;
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.StructuredSelection;
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.style.IStyle;
import org.xmind.core.style.IStyleSheet;
import org.xmind.gef.EditDomain;
import org.xmind.gef.GEF;
import org.xmind.gef.IViewer;
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.internal.views.ThemeGroupCore;
import org.xmind.ui.internal.views.ThemeGroupCore.CategorizedThemeGroup;
import org.xmind.ui.internal.views.ThemeLabelProvider;
import org.xmind.ui.mindmap.IResourceManager;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.texteditor.FloatingTextEditor;
public class ThemeResourceManagerViewer extends ResourceManagerViewer {
private static final int FRAME_HEIGHT = 72;
private static final int FRAME_WIDTH = 132;
private class ThemeGalleryViewer extends GalleryViewer {
protected boolean isTitleEditable(IPart p) {
IStyleSheet styleSheet = MindMapUI.getResourceManager()
.getUserThemeSheet();
return styleSheet == null ? false
: styleSheet.getAllStyles().contains(p.getModel());
}
}
private class ThemeCategorizedContentProvider
implements ITreeContentProvider {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
public Object[] getElements(Object inputElement) {
return ((ThemeGroupCore) inputElement).getThemeGroups().toArray();
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof CategorizedThemeGroup) {
return ((CategorizedThemeGroup) parentElement).getItems()
.toArray();
}
return null;
}
public Object getParent(Object element) {
if (element instanceof CategorizedThemeGroup) {
return ThemeGroupCore.getInstance();
} else if (element instanceof IStyle) {
List<CategorizedThemeGroup> themeGroups = ThemeGroupCore
.getInstance().getThemeGroups();
for (CategorizedThemeGroup themeGroup : themeGroups) {
List<IStyle> styles = themeGroup.getItems();
if (styles.contains(element)) {
return themeGroup;
}
}
}
return null;
}
public boolean hasChildren(Object element) {
return element instanceof ThemeGroupCore
|| element instanceof CategorizedThemeGroup;
}
}
private class ThemeCategorizedLabelProvider extends ThemeLabelProvider
implements IFontProvider {
public String getText(Object element) {
if (element instanceof CategorizedThemeGroup) {
return ((CategorizedThemeGroup) element).getName();
} else if (element instanceof IStyle
&& IStyle.THEME.equals(((IStyle) element).getType())) {
return ((IStyle) element).getName();
}
return super.getText(element);
}
@Override
public Font getFont(Object element) {
FontData data = getContainer().getFont().getFontData()[0];
if (Util.isMac()) {
data.setHeight(12);
} else {
data.setHeight(9);
}
data.setStyle(SWT.NONE);
FontDescriptor fontDescriptor = FontDescriptor.createFrom(data);
return getResourceManager().createFont(fontDescriptor);
}
}
class ThemeNestedGalleryViewer extends GalleryViewer {
protected boolean isTitleEditable(IPart p) {
if (p.getModel() instanceof IStyle) {
IStyle style = (IStyle) p.getModel();
final IResourceManager rm = MindMapUI.getResourceManager();
Set<IStyle> systemThemeSets = rm.getUserThemeSheet()
.getStyles(IStyleSheet.MASTER_STYLES);
return systemThemeSets.contains(style);
}
return false;
}
}
private class ThemeNestedViewerNameEditTool extends GalleryEditTool {
protected IDocument getTextContents(IPart source) {
return new org.eclipse.jface.text.Document(
((IStyle) source.getModel()).getName());
}
protected void handleTextModified(IPart source, IDocument document) {
((IStyle) source.getModel()).setName(document.get());
MindMapUI.getResourceManager().saveUserThemeSheet();
ThemeResourceManagerViewer.this.refresh();
}
protected void hookEditor(FloatingTextEditor editor) {
super.hookEditor(editor);
getHelper().setPrefWidth(
FRAME_WIDTH + DEFAULT_FLOATING_TEXT_EDITOR_WIDTH_EXPAND);
}
}
@Override
public void createControl(Composite container) {
super.createControl(container);
setContentProvider(new ThemeCategorizedContentProvider());
setLabelProvider(new ThemeCategorizedLabelProvider());
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(ThemeGroupCore.getInstance());
}
@Override
protected void initNestedGalleryViewer(GalleryViewer galleryViewerer) {
super.initNestedGalleryViewer(galleryViewerer);
galleryViewerer.getEditDomain().installTool(GEF.TOOL_EDIT,
new ThemeNestedViewerNameEditTool());
}
@Override
protected void initProperties() {
super.initProperties();
Properties properties = getProperties();
properties.set(GalleryViewer.FrameContentSize,
new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
}
protected ITool createNestedViewerEditTool() {
return new ThemeNestedViewerNameEditTool();
}
public void update(Object[] elements) {
Object[] themeGroupList = ((ThemeCategorizedContentProvider) getContentProvider())
.getElements(getInput());
for (Object tg : themeGroupList) {
CategorizedThemeGroup themeGroup = (CategorizedThemeGroup) tg;
GalleryViewer galleryViewer = getNestedViewer(themeGroup);
galleryViewer.update(elements);
}
}
public void startEditing(IStyle theme) {
List<CategorizedThemeGroup> themeGroups = ThemeGroupCore.getInstance()
.getThemeGroups();
for (CategorizedThemeGroup themeGroup : themeGroups) {
List<IStyle> styles = themeGroup.getItems();
if (styles.contains(theme)) {
GalleryViewer galleryViewer = getNestedViewer(themeGroup);
EditDomain domain = galleryViewer.getEditDomain();
ITool tool = domain.getDefaultTool();
((GallerySelectTool) tool).getStatus().setStatus(GEF.ST_ACTIVE,
true);
domain.handleRequest(GEF.REQ_EDIT, (IViewer) galleryViewer);
break;
}
}
}
public void selectDefault() {
List<Object> categories = getCategories();
if (categories == null || categories.isEmpty()
|| !(categories.get(0) instanceof CategorizedThemeGroup)) {
return;
}
Object defaultCategory = null;
for (Object category : getCategories()) {
if ("default".equals(((CategorizedThemeGroup) category).getId())) { //$NON-NLS-1$
defaultCategory = category;
setSelectionToCategory(category, new StructuredSelection(
MindMapUI.getResourceManager().getDefaultTheme()),
true);
} else {
setSelectionToCategory(category, StructuredSelection.EMPTY,
false);
}
}
reveal(defaultCategory);
}
protected GalleryViewer createNestedViewer() {
return new ThemeGalleryViewer();
}
}