@Override
  public MPart showPart(MPart part, PartState partState) {
    Assert.isNotNull(part);
    Assert.isNotNull(partState);

    MPart addedPart = addPart(part);
    MPlaceholder localPlaceholder = getLocalPlaceholder(addedPart);
    // correct the placeholder setting if necessary
    if (localPlaceholder != null && addedPart.getCurSharedRef() != localPlaceholder) {
      addedPart.setCurSharedRef(localPlaceholder);
    }

    switch (partState) {
      case ACTIVATE:
        activate(addedPart);
        return addedPart;
      case VISIBLE:
        MPart activePart = getActivePart();
        if (activePart == null
            || (activePart != addedPart && getParent(activePart) == getParent(addedPart))) {
          delegateBringToTop(addedPart);
          activate(addedPart);
        } else {
          bringToTop(addedPart);
        }
        return addedPart;
      case CREATE:
        createElement(addedPart);
        return addedPart;
    }
    return addedPart;
  }
 private void adjustPlaceholder(MPart part) {
   if (isShared(part)) {
     MPlaceholder placeholder = part.getCurSharedRef();
     // if this part doesn't have any placeholders, we need to make one
     if (placeholder == null
         // alternatively, if it has one but it's not in the current container, then we
         // need to spawn another one as we don't want to reuse the same one and end up
         // shifting that placeholder to the current container during the add operation
         || (placeholder.getParent() != null && !isInContainer(placeholder))) {
       placeholder = createSharedPart(part);
       part.setCurSharedRef(placeholder);
     }
   }
 }