@Override
  public void removePerspectiveModel(MPerspective persp, MWindow window) {
    // pick a new perspective to become active (if any)
    MUIElement psElement = persp.getParent();
    MPerspectiveStack ps = (MPerspectiveStack) psElement;
    boolean foundNewSelection = false;
    if (ps.getSelectedElement() == persp) {
      for (MPerspective p : ps.getChildren()) {
        if (p != persp && p.isToBeRendered()) {
          ps.setSelectedElement(p);
          foundNewSelection = true;
          break;
        }
      }

      if (!foundNewSelection) {
        ps.setSelectedElement(null);
      }
    }

    // Remove transient elements (minimized stacks, detached windows)
    resetPerspectiveModel(persp, window, false);

    // unrender the perspective and remove it
    persp.setToBeRendered(false);
    ps.getChildren().remove(persp);
  }
Пример #2
0
  @Override
  public void processContents(MElementContainer<MUIElement> element) {
    if (element.getChildren().isEmpty()) return;

    MPerspectiveStack perspectiveStack = (MPerspectiveStack) (MElementContainer<?>) element;
    MPerspective selectedPerspective = perspectiveStack.getSelectedElement();

    if (selectedPerspective == null) {
      selectedPerspective = (MPerspective) findFirstRenderableAndVisibleElement(perspectiveStack);
      if (selectedPerspective != null) switchPerspective(selectedPerspective);
    } else if (!selectedPerspective.isToBeRendered() || !selectedPerspective.isVisible()) {
      selectedPerspective = (MPerspective) findFirstRenderableAndVisibleElement(perspectiveStack);
      if (selectedPerspective != null) switchPerspective(selectedPerspective);
      else perspectiveStack.setSelectedElement(null);
    } else {
      // reset selected element (set selected element handler will work)
      perspectiveStack.setSelectedElement(null);
      switchPerspective(selectedPerspective);
    }

    refreshPerspectiveStackVisibility(perspectiveStack);
  }
  @Override
  public void doProcessContent(MPerspectiveStack element) {
    WPerspectiveStack<N, I, IC> stack = getWidget(element);
    List<WStackItem<I, IC>> items = new ArrayList<WStackItem<I, IC>>();
    WStackItem<I, IC> initalItem = null;

    for (MPerspective e : element.getChildren()) {
      // Precreate the rendering context for the subitem
      AbstractRenderer<MPerspective, ?> renderer = factory.getRenderer(e);
      if (renderer != null && e.isToBeRendered() && e.isVisible()) {
        WStackItem<I, IC> item = createStackItem(stack, e, renderer);
        items.add(item);

        if (e == element.getSelectedElement()) {
          initalItem = item;
        }
      }
    }

    if (!items.isEmpty()) {
      if (initalItem == null || items.size() == 1 || items.get(0) == initalItem) {
        stack.addItems(items);
      } else {
        stack.addItem(initalItem);
        if (items.get(items.size() - 1) == initalItem) {
          stack.addItems(0, items.subList(0, items.size() - 1));
        } else {
          int idx = items.indexOf(initalItem);
          stack.addItems(0, items.subList(0, idx));
          stack.addItems(items.subList(idx + 1, items.size()));
        }
      }
    }

    if (element.getSelectedElement() != null) {
      handleSelectedElement(element, null, element.getSelectedElement());
    } else if (!element.getChildren().isEmpty()) {
      // TODO Should this be done through the part service????
      element.setSelectedElement(element.getChildren().get(0));
    }
  }