package org.xmind.ui.internal.e4models;
import java.util.List;
import java.util.Map;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.descriptor.basic.MPartDescriptor;
import org.eclipse.e4.ui.model.application.ui.basic.MDialog;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.osgi.framework.FrameworkUtil;
public class ProgressProcessor {
private static final String DIALOG_PREFIX = "DIALOG:"; //$NON-NLS-1$
private static final String CUSTOM_LOCATION_KEY = "customLocation"; //$NON-NLS-1$
private static final int DEFAULT_DIALOG_Y = 0;
private static final int DEFAULT_DIALOG_X = 0;
private static final int DEFAULT_DIALOG_WIDTH = 600;
private static final int DEFAULT_DIALOG_HEIGHT = 700;
@Execute
public void execute(EModelService modelService, MApplication application) {
String partId = "org.eclipse.ui.views.ProgressView"; //$NON-NLS-1$
String partStackId = "progress"; //$NON-NLS-1$
//create dialog model
MPartDescriptor partDescriptor = null;
for (MPartDescriptor mp : application.getDescriptors()) {
if (partId.equals(mp.getElementId())) {
partDescriptor = mp;
break;
}
}
if (partDescriptor == null) {
return;
}
List<MDialog> existingDialogs = modelService.findElements(application,
DIALOG_PREFIX + partId, MDialog.class, null);
boolean dialogExisted = !existingDialogs.isEmpty();
MDialog dialogModel = dialogExisted ? existingDialogs.get(0)
: createDialog(modelService, partDescriptor, partId);
dialogModel.setToBeRendered(false);
if (!dialogExisted) {
application.getChildren().get(0).getWindows().add(dialogModel);
}
//create part stack
List<MPartStack> partStacks = modelService.findElements(dialogModel,
partStackId, MPartStack.class, null);
boolean partStackExisted = !partStacks.isEmpty();
MPartStack partStack = partStackExisted ? partStacks.get(0)
: createPartStack(modelService, partStackId);
if (!partStackExisted) {
dialogModel.getChildren().add(partStack);
}
//create part
List<MPart> parts = modelService.findElements(partStack, partId,
MPart.class, null);
boolean partExisted = !parts.isEmpty();
MPart part = partExisted ? parts.get(0) : null;
if (part == null) {
part = modelService.createModelElement(MPart.class);
part.setElementId(partId);
part.setContributionURI(partDescriptor.getContributionURI());
partStack.getChildren().add(part);
partStack.setSelectedElement(part);
}
}
private MDialog createDialog(EModelService modelService,
MPartDescriptor partDescriptor, String partId) {
String contributorURI = "platform:/plugin/" //$NON-NLS-1$
+ FrameworkUtil.getBundle(getClass()).getSymbolicName();
MDialog dialogModel = modelService.createModelElement(MDialog.class);
dialogModel.setElementId(DIALOG_PREFIX + partId);
dialogModel.setLabel(partDescriptor.getLabel());
dialogModel.setContributorURI(contributorURI);
String dialogStyle = partDescriptor.getPersistedState()
.get(IPresentationEngine.STYLE_OVERRIDE_KEY);
dialogModel.getPersistedState()
.put(IPresentationEngine.STYLE_OVERRIDE_KEY, dialogStyle);
configDialog(dialogModel, partDescriptor);
return dialogModel;
}
private void configDialog(MDialog dialogModel,
MPartDescriptor partDescriptor) {
Map<String, String> ps = partDescriptor.getPersistedState();
String location = ps.get(CUSTOM_LOCATION_KEY);
String[] locations = location.split(","); //$NON-NLS-1$
if (locations.length < 4) {
String[] tempLocations = new String[4];
for (int i = 0; i < locations.length; i++)
tempLocations[i] = locations[i];
locations = tempLocations;
}
int dialogX = getDigitalValue(locations[0], DEFAULT_DIALOG_X);
int dialogY = getDigitalValue(locations[1], DEFAULT_DIALOG_Y);
int dialogW = getDigitalValue(locations[2], DEFAULT_DIALOG_WIDTH);
int dialogH = getDigitalValue(locations[3], DEFAULT_DIALOG_HEIGHT);
dialogModel.setX(dialogX);
dialogModel.setY(dialogY);
dialogModel.setWidth(dialogW);
dialogModel.setHeight(dialogH);
dialogModel.getPersistedState().put(CUSTOM_LOCATION_KEY, location);
}
private int getDigitalValue(String value, int defaultValue) {
return isNone(value) ? defaultValue : Integer.valueOf(value);
}
private boolean isNone(String value) {
return value == null || "".equals(value); //$NON-NLS-1$
}
private MPartStack createPartStack(EModelService modelService,
String partStackId) {
MPartStack partStack = modelService
.createModelElement(MPartStack.class);
partStack.setElementId(partStackId);
partStack.setVisible(true);
return partStack;
}
}