package org.xmind.ui.internal.e4models;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.xmind.core.Core;
import org.xmind.core.ISheet;
import org.xmind.core.ITopic;
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.ui.editor.IGraphicalEditor;
import org.xmind.gef.ui.editor.IGraphicalEditorPage;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.internal.editor.MindMapEditor;
import org.xmind.ui.internal.utils.ResourceUtils;
import org.xmind.ui.internal.views.CategorizedThemeViewer;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.resources.ColorUtils;
public class ThemesPart extends ViewModelPart
implements ICoreEventListener, IPageChangedListener {
private CategorizedThemeViewer viewer;
private ICoreEventRegister register = null;
private IGraphicalEditor sourceEditor;
private ICoreEventRegister topicRegister = null;
private ITopic rootTopic;
@Override
protected Control doCreateContent(Composite parent) {
MindMapUIPlugin.getDefault().getUsageDataCollector()
.increase("ShowThemeCount"); //$NON-NLS-1$
Composite container = new Composite(parent, SWT.NONE);
container.setBackground(
(Color) resources.get(ColorUtils.toDescriptor("#ffffff"))); //$NON-NLS-1$
GridLayout layout = new GridLayout(1, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.verticalSpacing = 0;
layout.horizontalSpacing = 0;
container.setLayout(layout);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
this.registerContextMenu(container,
IModelConstants.POPUPMENU_ID_RESOURCEMANAGER_THEME);
viewer = new CategorizedThemeViewer(container);
viewer.getControl()
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
this.setSelectionProvider(viewer);
ICoreEventSupport ces = (ICoreEventSupport) MindMapUI
.getResourceManager().getUserThemeSheet()
.getAdapter(ICoreEventSupport.class);
register = new CoreEventRegister(this);
register.setNextSupport(ces);
register.register(Core.StyleAdd);
register.register(Core.StyleRemove);
register.register(Core.Name);
return container;
}
@Override
public void handleCoreEvent(final CoreEvent event) {
if (viewer == null)
return;
Control c = viewer.getControl();
if (c == null || c.isDisposed())
return;
c.getDisplay().syncExec(new Runnable() {
public void run() {
if (Core.ThemeId.equals(event.getType())) {
} else if (Core.Name.equals(event.getType())) {
viewer.update(new Object[] { event.getSource() });
} else if (Core.StyleAdd.equals(event.getType())) {
viewer.refresh();
Object target = event.getTarget();
viewer.setSelection(
target == null ? StructuredSelection.EMPTY
: new StructuredSelection(target),
true);
} else if (Core.StyleRemove.equals(event.getType())) {
viewer.setInput(viewer.getInput());
} else if (Core.StructureClass.endsWith(event.getType())) {
viewer.refresh(true);
}
}
});
}
@Override
public void dispose() {
if (register != null) {
register.unregisterAll();
register = null;
}
if (topicRegister != null) {
topicRegister.unregisterAll();
topicRegister = null;
}
if (sourceEditor != null) {
sourceEditor.removePageChangedListener(this);
sourceEditor = null;
}
super.dispose();
viewer = null;
}
@Override
public void init() {
super.init();
registerRunnables();
this.registerViewMenu(IModelConstants.VIEWMENU_ID_THEME);
}
private void registerRunnables() {
IEclipseContext ec = getAdapter(MPart.class).getContext();
ec.set(IModelConstants.KEY_MODEL_PART_REFRESH_PAGE,
new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
viewer.refresh();
}
}
});
ec.set(IModelConstants.KEY_MODEL_PART_RENAME, new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
List<IStyle> themes = getSelectedThemes();
if (themes.size() == 1)
viewer.startEditing(themes.get(0));
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
List<IStyle> themes = getSelectedThemes();
Set<IStyle> systemThemeSets = MindMapUI.getResourceManager()
.getSystemThemeSheet()
.getStyles(IStyleSheet.MASTER_STYLES);
boolean canExecute = themes.size() == 1;
for (IStyle theme : themes) {
canExecute = canExecute && !systemThemeSets.contains(theme);
}
return canExecute;
}
});
ec.set(IModelConstants.KEY_MODEL_PART_DUPLICATE,
new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
List<IStyle> themes = getSelectedThemes();
if (!themes.isEmpty()) {
ResourceUtils.duplicateThemes(themes);
}
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
List<IStyle> themes = getSelectedThemes();
boolean canExecute = !themes.isEmpty();
return canExecute;
}
});
ec.set(IModelConstants.KEY_MODEL_PART_DELETE, new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
List<IStyle> themes = getSelectedThemes();
if (!themes.isEmpty()
&& ResourceUtils.confirmToDeleteStyles(
viewer.getControl().getShell(), themes)) {
ResourceUtils.deleteStyles(themes);
}
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
List<IStyle> themes = getSelectedThemes();
Set<IStyle> systemThemeSets = MindMapUI.getResourceManager()
.getSystemThemeSheet()
.getStyles(IStyleSheet.MASTER_STYLES);
boolean canExecute = !themes.isEmpty();
for (IStyle theme : themes) {
canExecute = canExecute && !systemThemeSets.contains(theme);
}
return canExecute;
}
});
}
private List<IStyle> getSelectedThemes() {
List<IStyle> styles = new ArrayList<IStyle>();
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
ISelection selection = viewer.getStructuredSelection();
if (selection instanceof IStructuredSelection) {
for (Object element : ((IStructuredSelection) selection)
.toList()) {
styles.add((IStyle) element);
}
}
}
return styles;
}
private ITopic findRootTopic(IGraphicalEditorPage page) {
ISheet sheet = page.getAdapter(ISheet.class);
if (sheet != null)
return sheet.getRootTopic();
return null;
}
private void setRootTopic(ITopic topic) {
if (topic == rootTopic)
return;
if (topicRegister == null)
topicRegister = new CoreEventRegister(this);
if (rootTopic != null)
topicRegister.unregisterAll();
if (topic != null) {
if (viewer != null)
viewer.refresh(true);
topicRegister.setNextSourceFrom(topic);
topicRegister.register(Core.StructureClass);
}
}
private void setEditor(IGraphicalEditor editor) {
if (editor == this.sourceEditor)
return;
if (this.sourceEditor != null) {
this.sourceEditor.removePageChangedListener(this);
}
this.sourceEditor = editor;
if (this.sourceEditor != null) {
this.sourceEditor.addPageChangedListener(this);
IGraphicalEditorPage page = sourceEditor.getActivePageInstance();
if (page != null)
setRootTopic(findRootTopic(page));
}
}
@Override
protected void handlePartActivated(MPart part) {
super.handlePartActivated(part);
final IEditorPart editorPart = part.getContext().get(IEditorPart.class);
if (editorPart instanceof MindMapEditor) {
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
setEditor((MindMapEditor) editorPart);
}
});
}
}
public void pageChanged(PageChangedEvent event) {
final IGraphicalEditorPage page = (IGraphicalEditorPage) event
.getSelectedPage();
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
if (page.isDisposed() || page.getControl() == null
|| page.getControl().isDisposed())
return;
setRootTopic(findRootTopic(page));
}
});
}
}