@Override
  public MUIElement cloneElement(MUIElement element, MSnippetContainer snippetContainer) {
    EObject eObj = (EObject) element;
    MUIElement clone = (MUIElement) EcoreUtil.copy(eObj);

    // null out all the references
    List<MPlaceholder> phList = findElements(clone, null, MPlaceholder.class, null);
    for (MPlaceholder ph : phList) {
      // Skip placeholders in the sharedArea
      int location = getElementLocation(ph);
      if ((location & IN_SHARED_AREA) != 0) {
        continue;
      }

      ph.setRef(null);
    }

    if (snippetContainer != null) {
      MUIElement snippet = findSnippet(snippetContainer, element.getElementId());
      if (snippet != null) {
        snippetContainer.getSnippets().remove(snippet);
      }
      snippetContainer.getSnippets().add(clone);
    }

    // Cache the original element in the clone's transientData
    clone.getTransientData().put(CLONED_FROM_KEY, element);

    return clone;
  }
  @Override
  public MUIElement cloneSnippet(
      MSnippetContainer snippetContainer, String snippetId, MWindow refWin) {
    if (snippetContainer == null || snippetId == null || snippetId.length() == 0) {
      return null;
    }

    MApplicationElement elementToClone = null;
    for (MApplicationElement snippet : snippetContainer.getSnippets()) {
      if (snippetId.equals(snippet.getElementId())) {
        elementToClone = snippet;
        break;
      }
    }
    if (elementToClone == null) {
      return null;
    }

    EObject eObj = (EObject) elementToClone;
    MUIElement element = (MUIElement) EcoreUtil.copy(eObj);

    MUIElement appElement = refWin == null ? null : refWin.getParent();
    if (appElement instanceof MApplication) {
      handleNullRefPlaceHolders(element, refWin, true);
    }

    return element;
  }
  @Override
  public MUIElement findSnippet(MSnippetContainer snippetContainer, String id) {
    if (snippetContainer == null || id == null || id.length() == 0) {
      return null;
    }

    List<MUIElement> snippets = snippetContainer.getSnippets();
    for (MUIElement snippet : snippets) {
      if (id.equals(snippet.getElementId())) {
        return snippet;
      }
    }

    return null;
  }