package org.xmind.ui.internal.resourcemanager;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
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.ICoreEventSupport;
import org.xmind.core.style.IStyle;
import org.xmind.core.style.IStyleSheet;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.internal.e4models.IContextRunnable;
import org.xmind.ui.internal.e4models.IModelConstants;
import org.xmind.ui.internal.utils.ResourceUtils;
import org.xmind.ui.mindmap.MindMapUI;
public class StyleResourceManagerPage extends ResourceManagerDialogPage
implements ICoreEventListener {
private final static int editStyleButtonID = IDialogConstants.CLIENT_ID + 1;
private CoreEventRegister coreEventRegister;
private Button editStyleButton;
private StyleResourceManagerViewer viewer;
@Override
protected ResourceManagerViewer createViewer() {
viewer = new StyleResourceManagerViewer();
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) selection;
Object obj = sel.getFirstElement();
if (obj != null && obj instanceof IStyle) {
editStyleButton.setEnabled(true);
return;
}
}
editStyleButton.setEnabled(false);
}
});
registerCoreEvent();
return viewer;
}
@Override
protected void createButtonsForButtonBar(Composite buttonBar) {
editStyleButton = createButton(buttonBar, editStyleButtonID,
MindMapMessages.StyleResourceManager_Editor_button, false);
editStyleButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
StyleResourceManagerViewer styleViewer = (StyleResourceManagerViewer) viewer;
styleViewer.editStyle();
}
});
editStyleButton.setEnabled(false);
}
private void registerCoreEvent() {
ICoreEventSupport ces = (ICoreEventSupport) MindMapUI
.getResourceManager().getUserStyleSheet()
.getAdapter(ICoreEventSupport.class);
if (ces != null) {
coreEventRegister = new CoreEventRegister(this);
coreEventRegister.setNextSupport(ces);
coreEventRegister.register(Core.StyleAdd);
coreEventRegister.register(Core.StyleRemove);
coreEventRegister.register(Core.TitleText);
coreEventRegister.register(Core.Name);
}
}
@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() {
viewer.refresh();
viewer.setSelection(new StructuredSelection(event.getSource()),
true);
}
});
}
@Override
public void dispose() {
if (coreEventRegister != null)
coreEventRegister.unregisterAll();
super.dispose();
}
@Override
protected void registerRunnable(IEclipseContext eclipseContext) {
super.registerRunnable(eclipseContext);
eclipseContext.set(
getId() + "/" + IModelConstants.KEY_MODEL_PART_RENAME, //$NON-NLS-1$
new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
List<IStyle> styles = getSelectedStyles();
if (styles.size() == 1)
viewer.startEditing(styles.get(0));
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
return isOneUserStyleSelected();
}
});
eclipseContext.set(
getId() + "/" + IModelConstants.KEY_MODEL_PART_DUPLICATE, //$NON-NLS-1$
new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
List<IStyle> styles = getSelectedStyles();
if (!styles.isEmpty()) {
List<IStyle> newStyles = ResourceUtils
.duplicateStyles(styles);
viewer.setSelection(
new StructuredSelection(newStyles));
}
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
List<IStyle> styles = getSelectedStyles();
boolean canExecute = !styles.isEmpty();
return canExecute;
}
});
eclipseContext.set(
getId() + "/" + IModelConstants.KEY_MODEL_PART_DELETE, //$NON-NLS-1$
new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
List<IStyle> styles = getSelectedStyles();
if (!styles.isEmpty()
&& ResourceUtils.confirmToDeleteStyles(
viewer.getControl().getShell(),
styles)) {
ResourceUtils.deleteStyles(styles);
}
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
return isAllUserStyles();
}
});
eclipseContext.set(getId() + "/" + IModelConstants.KEY_MODEL_PART_EDIT, //$NON-NLS-1$
new IContextRunnable() {
@Override
public void run() {
StyleResourceManagerViewer styleViewer = (StyleResourceManagerViewer) viewer;
styleViewer.editStyle();
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
List<IStyle> selected = getSelectedStyles();
return selected != null && !selected.isEmpty();
}
});
}
private List<IStyle> getSelectedStyles() {
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;
}
@Override
protected String getContextMenuId() {
return IModelConstants.POPUPMENU_ID_RESOURCEMANAGER_STYLE;
}
@Override
public String getModelPageId() {
return IModelConstants.PAGE_ID_RESOURCE_MANAGER_STYLE;
}
@Override
public String getModelPageTitle() {
return null;
}
private boolean isAllUserStyles() {
List<IStyle> styles = getSelectedStyles();
Set<IStyle> userStyles = MindMapUI.getResourceManager()
.getUserStyleSheet().getAllStyles();
boolean canExecute = !styles.isEmpty();
for (IStyle style : styles) {
canExecute = canExecute && userStyles.contains(style);
}
return canExecute;
}
private boolean isOneUserStyleSelected() {
List<IStyle> styles = getSelectedStyles();
IStyleSheet userStyleSheet = MindMapUI.getResourceManager()
.getUserStyleSheet();
Set<IStyle> userStyles = userStyleSheet.getAllStyles();
boolean canExecute = styles.size() == 1;
for (IStyle style : styles) {
canExecute = canExecute && userStyles.contains(style);
}
return canExecute;
}
}