예제 #1
0
  public static void createParts(
      MApplication application, EModelService service, EPartService partService) {
    // Sometimes, when switching windows at startup, the active context
    // is null or doesn't have a window, and the part instantiation fails.
    // Ensure that a child context with a window is activated:
    IEclipseContext activeChild = application.getContext().getActiveChild();
    if (activeChild == null || activeChild.get(MTrimmedWindow.class) == null) {
      boolean activated = false;
      if (application.getContext() instanceof EclipseContext) {
        for (IEclipseContext child : ((EclipseContext) application.getContext()).getChildren()) {
          MTrimmedWindow window = child.get(MTrimmedWindow.class);
          if (window != null) {
            child.activate();
            activated = true;
            break;
          }
        }
      }
      if (!activated) {
        logger.error("Could not activate window for part instantiation"); // $NON-NLS-1$
        return;
      }
    }

    List<MPart> ontops = new ArrayList<MPart>();
    for (MPartDescriptor descriptor : application.getDescriptors()) {
      if (!(descriptor.getPersistedState().containsKey(VISIBLE_ID)
          && Boolean.toString(true)
              .equalsIgnoreCase(descriptor.getPersistedState().get(VISIBLE_ID)))) {
        continue;
      }
      List<MPart> existingParts =
          service.findElements(application, descriptor.getElementId(), MPart.class, null);
      if (!existingParts.isEmpty()) {
        // part is already instantiated
        continue;
      }
      MPart part = partService.createPart(descriptor.getElementId());
      if (part == null) {
        continue;
      }
      addPartToAppropriateContainer(part, descriptor, application, service);
      partService.activate(part);
      if (descriptor.getPersistedState().containsKey(ONTOP_ID)
          && Boolean.toString(true)
              .equalsIgnoreCase(descriptor.getPersistedState().get(ONTOP_ID))) {
        ontops.add(part);
      }
    }

    // reactivate ontop parts to ensure they are on-top
    for (MPart ontop : ontops) {
      partService.activate(ontop);
    }
  }
  @Override
  public MPartDescriptor getPartDescriptor(String id) {
    MApplication application = appContext.get(MApplication.class);

    // If the id contains a ':' use the part before it as the descriptor id
    int colonIndex = id == null ? -1 : id.indexOf(':');
    String descId = colonIndex == -1 ? id : id.substring(0, colonIndex);

    for (MPartDescriptor descriptor : application.getDescriptors()) {
      if (descriptor.getElementId().equals(descId)) {
        return descriptor;
      }
    }
    return null;
  }
예제 #3
0
 public static void addPartToAppropriateContainer(
     MPart part, MPartDescriptor descriptor, MApplication application, EModelService service) {
   // first try and find the container specified by the id in the "parent" persisted state
   MElementContainer<MUIElement> container = null;
   String parentId = descriptor.getPersistedState().get(PARENT_ID);
   if (parentId != null) {
     @SuppressWarnings("rawtypes")
     List<MElementContainer> containers =
         service.findElements(application, parentId, MElementContainer.class, null);
     if (!containers.isEmpty()) {
       @SuppressWarnings("unchecked")
       MElementContainer<MUIElement> uncheckedContainer = containers.get(0);
       container = uncheckedContainer;
     }
   }
   // next try and find a sibling, and use the sibling's container
   if (container == null) {
     List<MPart> siblings =
         service.findElements(application, descriptor.getElementId(), MPart.class, null);
     for (MPart sibling : siblings) {
       if (sibling == part) {
         continue;
       }
       container = sibling.getParent();
       if (sibling.isToBeRendered()) {
         // prefer visible siblings
         break;
       }
     }
   }
   if (container != null) {
     String position = descriptor.getPersistedState().get(POSITION_ID);
     int index = getPositionIndex(position, container);
     if (index < 0 || index > container.getChildren().size()) {
       container.getChildren().add(part);
     } else {
       container.getChildren().add(index, part);
     }
   }
 }
 private MPart createPart(MPartDescriptor descriptor) {
   if (descriptor == null) {
     return null;
   }
   MPart part = modelService.createModelElement(MPart.class);
   part.setElementId(descriptor.getElementId());
   part.getMenus().addAll(EcoreUtil.copyAll(descriptor.getMenus()));
   if (descriptor.getToolbar() != null) {
     part.setToolbar((MToolBar) EcoreUtil.copy((EObject) descriptor.getToolbar()));
   }
   part.setContributorURI(descriptor.getContributorURI());
   part.setCloseable(descriptor.isCloseable());
   part.setContributionURI(descriptor.getContributionURI());
   part.setLabel(descriptor.getLabel());
   part.setIconURI(descriptor.getIconURI());
   part.setTooltip(descriptor.getTooltip());
   part.getHandlers().addAll(EcoreUtil.copyAll(descriptor.getHandlers()));
   part.getTags().addAll(descriptor.getTags());
   part.getPersistedState().putAll(descriptor.getPersistedState());
   part.getBindingContexts().addAll(descriptor.getBindingContexts());
   return part;
 }
예제 #5
0
 protected void doOkPressed(MPartDescriptor[] selection) {
   for (MPartDescriptor d : selection) {
     PartUtils.openPart(d.getElementId(), true);
   }
 }