public int[] moveWidget(
      final int oldContainerOffset,
      final int oldContainerLength,
      final int oldContainerIndex,
      final int newContainerOffset,
      final int newContainerLength,
      final int newContainerIndex) {
    try {
      IEGLFile modelFile = (IEGLFile) EGLCore.create(currentFile);
      IEGLFile sharedWorkingCopy =
          (IEGLFile) modelFile.getSharedWorkingCopy(null, EGLUI.getBufferFactory(), null);
      sharedWorkingCopy.open(null);
      sharedWorkingCopy.reconcile(false, null);

      try {
        final Node oldContainer =
            DocumentUtil.getWidgetNode(currentDocument, oldContainerOffset, oldContainerLength);
        final Node newContainer =
            DocumentUtil.getWidgetNode(currentDocument, newContainerOffset, newContainerLength);
        final int newIndex =
            calculateNewIndex(oldContainer, newContainer, oldContainerIndex, newContainerIndex);
        oldContainer.accept(
            new DefaultASTVisitor() {
              public boolean visit(Handler handler) {
                // Assume this is a RUIHandler
                EGLRUIHandlerLocatorStrategy strategy = new EGLRUIHandlerLocatorStrategy(handler);
                final Node nodeToMove = strategy.locateIndex(oldContainerIndex);
                MoveNodeOperation moveOp =
                    new MoveNodeOperation(
                        oldContainerOffset,
                        oldContainerLength,
                        oldContainerIndex,
                        newContainerOffset,
                        newContainerIndex,
                        newIndex);
                nodeToMove.accept(moveOp);
                return false;
              }

              public boolean visit(final NewExpression newExpression) {
                EGLContainerLocatorStrategy strategy =
                    new EGLContainerLocatorStrategy(oldContainer);
                final Node nodeToMove = strategy.locateIndex(oldContainerIndex);
                MoveNodeOperation moveOp =
                    new MoveNodeOperation(
                        oldContainerOffset,
                        oldContainerLength,
                        oldContainerIndex,
                        newContainerOffset,
                        newContainerIndex,
                        newIndex);
                nodeToMove.accept(moveOp);
                return false;
              }

              public boolean visit(final SimpleName simpleName) {
                EGLContainerLocatorStrategy strategy =
                    new EGLContainerLocatorStrategy(oldContainer);
                final Node nodeToMove = strategy.locateIndex(oldContainerIndex);
                MoveNodeOperation moveOp =
                    new MoveNodeOperation(
                        oldContainerOffset,
                        oldContainerLength,
                        oldContainerIndex,
                        newContainerOffset,
                        newContainerIndex,
                        newIndex);
                nodeToMove.accept(moveOp);
                return false;
              }
            });
      } catch (Exception e) {
        Activator.getDefault()
            .getLog()
            .log(
                new Status(
                    Status.ERROR,
                    Activator.PLUGIN_ID,
                    "Move Widget Reference: Error moving reference",
                    e));
      } finally {
        sharedWorkingCopy.destroy();
      }
    } catch (EGLModelException e) {
      Activator.getDefault()
          .getLog()
          .log(
              new Status(
                  Status.ERROR,
                  Activator.PLUGIN_ID,
                  "Move Widget Reference: Error creating working copy",
                  e));
    }
    return charactersChanged;
  }