package org.xmind.ui.internal.resourcemanager;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
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.marker.IMarker;
import org.xmind.core.marker.IMarkerGroup;
import org.xmind.core.marker.IMarkerSheet;
import org.xmind.ui.internal.MindMapUIPlugin;
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 MarkerResourceManagerPage extends ResourceManagerDialogPage
implements ICoreEventListener {
private final static int ADD_GROUP_BUTTON_ID = IDialogConstants.CLIENT_ID
+ 1;
private CoreEventRegister coreEventRegister;
private MarkerResourceManagerViewer viewer;
static final String USER_MARKER_PATH = "markers/markerSheet.xml"; //$NON-NLS-1$
private static final String USER_GROUP_PREFIX = "User Group "; //$NON-NLS-1$
@Override
protected ResourceManagerViewer createViewer() {
viewer = new MarkerResourceManagerViewer();
registerCoreEvent();
return viewer;
}
private void registerCoreEvent() {
ICoreEventSupport ces = (ICoreEventSupport) MindMapUI
.getResourceManager().getUserMarkerSheet()
.getAdapter(ICoreEventSupport.class);
if (ces != null) {
coreEventRegister = new CoreEventRegister(this);
coreEventRegister.setNextSupport(ces);
coreEventRegister.register(Core.MarkerAdd);
coreEventRegister.register(Core.MarkerGroupAdd);
coreEventRegister.register(Core.MarkerRefAdd);
coreEventRegister.register(Core.TitleText);
coreEventRegister.register(Core.MarkerRemove);
coreEventRegister.register(Core.MarkerGroupRemove);
coreEventRegister.register(Core.MarkerRefRemove);
coreEventRegister.register(Core.Name);
}
}
@Override
protected void createButtonsForButtonBar(Composite buttonBar) {
Button button = createButton(buttonBar, ADD_GROUP_BUTTON_ID,
"Add Group", false); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
MindMapUIPlugin.getDefault().getUsageDataCollector()
.increase("UserMarkerCount"); //$NON-NLS-1$
IMarkerSheet markerSheet = MindMapUI.getResourceManager()
.getUserMarkerSheet();
int groupNo = getNewGroupNo(markerSheet);
IMarkerGroup group = MindMapUI.getResourceManager()
.getUserMarkerSheet().createMarkerGroup(true);
group.setName(USER_GROUP_PREFIX + groupNo);
markerSheet.addMarkerGroup(group);
try {
MindMapUI.getResourceManager().saveUserMarkerSheet();
} catch (Exception ex) {
// TODO: handle exception
;
}
viewer.updateInput();
viewer.activateGroup(group);
viewer.reveal(group);
viewer.renameMarkerGroup();
}
});
}
@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_DELETE, //$NON-NLS-1$
new IContextRunnable() {
@Override
public void run() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
if (viewer.canEditMarkerGroup()) {
viewer.deleteMarkerGroup();
}
List<IMarker> markers = getSelectedMarker();
if (!markers.isEmpty()) {
ResourceUtils.deleteMarkers(markers);
}
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
if (viewer.canEditMarkerGroup())
return true;
}
List<IMarker> markers = getSelectedMarker();
boolean canExecute = !markers.isEmpty();
IMarkerSheet userMarkerSheet = MindMapUI
.getResourceManager().getUserMarkerSheet();
for (IMarker marker : markers) {
canExecute = canExecute && userMarkerSheet
.getMarker(marker.getId()) != null;
}
return canExecute;
}
});
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()) {
viewer.renameMarkerGroup();
}
}
@Override
public boolean canExecute(IEclipseContext context,
String contextKey) {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
return viewer.canEditMarkerGroup();
}
return false;
}
});
}
private List<IMarker> getSelectedMarker() {
List<IMarker> markers = new ArrayList<IMarker>();
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
ISelection selection = viewer.getStructuredSelection();
if (selection instanceof IStructuredSelection) {
for (Object element : ((IStructuredSelection) selection)
.toList()) {
markers.add((IMarker) element);
}
}
}
return markers;
}
@Override
protected String getContextMenuId() {
return IModelConstants.POPUPMENU_ID_RESOURCEMANAGER_MARKER;
}
@Override
public String getModelPageId() {
return IModelConstants.PAGE_ID_RESOURCE_MANAGER_MARKER;
}
@Override
public String getModelPageTitle() {
return null;
}
private int getNewGroupNo(IMarkerSheet sheet) {
List<IMarkerGroup> markerGroups = sheet.getMarkerGroups();
int i = 0;
for (IMarkerGroup group : markerGroups) {
String groupName = group.getName();
if (groupName.startsWith(USER_GROUP_PREFIX)) {
try {
Integer toCompare = Integer.valueOf(groupName
.substring(groupName.lastIndexOf(' ') + 1));
if (toCompare > i) {
i = toCompare;
}
} catch (Exception e) {
;//nothing
}
}
}
return i + 1;
}
}