package org.xmind.ui.internal.e4handlers;
import java.util.Arrays;
import java.util.List;
import javax.inject.Named;
import org.eclipse.e4.core.di.annotations.CanExecute;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.core.di.annotations.Optional;
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.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.xmind.ui.internal.e4models.IModelConstants;
public class ModelPartHandler {
@Execute
public void run(EPartService partService,
@Named(IModelConstants.KEY_MODEL_PART_COMMAND_PARAMETER_PART_ID) String partId,
@Optional @Named(IModelConstants.KEY_MODEL_PART_COMMAND_PARAMETER_PAGE_ID) String pageId,
@Optional @Named(IModelConstants.KEY_MODEL_PART_COMMAND_PARAMETER_PARTSTACK_ID) String partStackId,
MApplication appli, EModelService modelService) {
if (partId == null)
return;
MPartDescriptor partDescriptor = null;
for (MPartDescriptor mp : appli.getDescriptors()) {
if (partId.equals(mp.getElementId())) {
partDescriptor = mp;
break;
}
}
if (partDescriptor == null)
return;
List<MPartStack> partStacks = modelService.findElements(appli,
partStackId, MPartStack.class, null);
boolean partStackExisted = !partStacks.isEmpty();
MPartStack partStack = partStackExisted ? partStacks.get(0)
: createPartStack(modelService, partStackId);
MPart p = partService.findPart(partId);
if (p == null) {
p = partService.createPart(partId);
partStack.getChildren().add(p);
partStack.setSelectedElement(p);
}
if (pageId != null) {
p.getPersistedState().put(
IModelConstants.KEY_MODEL_PART_CURRENT_PAGE_ID, pageId);
}
appli.getContext().set(IModelConstants.KEY_LAST_OPENED_MODEL_PART_ID,
partId);
if (!partStackExisted) {
appli.getChildren().get(0).getChildren().add(p);
}
p.setVisible(true);
modelService.bringToTop(p);
partService.activate(p, true);
}
private MPartStack createPartStack(EModelService modelService,
String partStackId) {
MPartStack partStack = modelService
.createModelElement(MPartStack.class);
partStack.setElementId(partStackId);
partStack.setVisible(true);
return partStack;
}
@CanExecute
public boolean canExecute(MApplication app, EModelService modelService) {
List<MPart> editors = modelService.findElements(app, null, MPart.class,
Arrays.asList(IModelConstants.TAG_EDITOR));
if (!editors.isEmpty()) {
return true;
}
return false;
}
}