Package org.eclipse.php.internal.ui.actions

Source Code of org.eclipse.php.internal.ui.actions.ReorgMoveAction

/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*     Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.actions;

import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ltk.core.refactoring.CheckConditionsOperation;
import org.eclipse.ltk.core.refactoring.CreateChangeOperation;
import org.eclipse.ltk.core.refactoring.PerformChangeOperation;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring;
import org.eclipse.ltk.internal.core.refactoring.resource.MoveResourcesProcessor;
import org.eclipse.php.internal.core.PHPCorePlugin;
import org.eclipse.php.internal.core.documentModel.dom.ElementImplForPhp;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.MoveResourceAction;
import org.eclipse.ui.actions.SelectionListenerAction;

@SuppressWarnings("restriction")
public class ReorgMoveAction extends AbstractMoveDelegator {

  private static final String MOVE_ELEMENT_ACTION_ID = "org.eclipse.php.ui.actions.Move"; //$NON-NLS-1$
  private IStructuredSelection selectedResources;
  private Shell fShell;
  private AbstractMoveDelegator moveActionDelegate;
  private IContainer target;

  public void run(IStructuredSelection selection) {
    if (ActionUtils.containsOnlyProjects(selection.toList())) {
      createWorkbenchAction(selection).run();
      return;
    }
    if (selectedResources != null && !selectedResources.isEmpty()) {
      SelectionListenerAction action = createWorkbenchAction(selectedResources);
      if (action != null) {
        action.run();
      }
    }
  }

  private SelectionListenerAction createWorkbenchAction(
      IStructuredSelection selection) {
    List<?> list = selection.toList();
    SelectionListenerAction action = null;
    if (fShell == null) {
      fShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
          .getShell();
    }

    if (list.size() == 0
        || list.get(0) instanceof IProject
        || (list.get(0) instanceof IAdaptable && ((IAdaptable) list
            .get(0)).getAdapter(IResource.class) instanceof IProject)) {
      action = new PHPMoveProjectAction(fShell);
      action.selectionChanged(selection);
    } else if (selectedResources != null) {
      action = new MoveResourceAction(fShell);
      if (list.size() == 1) {
        Object object = list.get(0);
        if (object instanceof ElementImplForPhp
            && ((ElementImplForPhp) object).getModelElement() != null) {
          IResource resource = ((ElementImplForPhp) object)
              .getModelElement().getResource();
          if (resource != null) {
            selection = new StructuredSelection(resource);
          }
        }
      }

      // don't open the move dialog, resource could be moved directly
      // using the drop target
      if (target != null && directMove(selection) == true) {
        return null;
      }

      action.selectionChanged(selection);

    }
    return action;
  }

  /**
   * Move the resources contained in the selection to the target folder
   * directly without opening the dialog.
   *
   * The CheckConditionsOperation will ensure no files are overwritten in the
   * target folder.
   *
   * @param selection
   * @return true if move operation was successfull, false otherwise.
   */
  protected boolean directMove(IStructuredSelection selection) {

    IResource[] resources = new IResource[selection.size()];
    Iterator<?> iterator = selection.iterator();
    int i = 0;
    while (iterator.hasNext()) {
      resources[i++] = (IResource) iterator.next();

    }

    MoveResourcesProcessor processor = new MoveResourcesProcessor(resources);
    processor.setDestination(target);

    ProcessorBasedRefactoring refactoring = new ProcessorBasedRefactoring(
        processor);
    CheckConditionsOperation checkOp = new CheckConditionsOperation(
        refactoring, CheckConditionsOperation.ALL_CONDITIONS);
    CreateChangeOperation operation = new CreateChangeOperation(checkOp,
        RefactoringStatus.WARNING);
    PerformChangeOperation perform = new PerformChangeOperation(operation);

    try {
      ResourcesPlugin.getWorkspace().run(perform,
          new NullProgressMonitor());
    } catch (CoreException e) {
      PHPCorePlugin.log(e.getStatus());
      return false;
    }

    RefactoringStatus status = perform.getValidationStatus();

    if (status == null) {
      RefactoringStatus refactoringStatus = checkOp.getStatus();

      if (refactoringStatus != null && !refactoringStatus.isOK()) {
        MessageDialog
            .openError(fShell, Messages.ReorgMoveAction_0,
                Messages.ReorgMoveAction_1);
      }
      return false;
    }

    return true;
  }

  public void setActiveEditor(IAction action, IEditorPart targetEditor) {
    if (targetEditor != null) {
      if (moveActionDelegate == null) {
        init(targetEditor.getSite().getWorkbenchWindow());
      }

      if (moveActionDelegate != null
          && !(moveActionDelegate instanceof ReorgMoveAction)) {
        moveActionDelegate.setActiveEditor(action, targetEditor);
      } else {
        IEditorInput editorInput = targetEditor.getEditorInput();
        if (editorInput instanceof IFileEditorInput) {
          IFileEditorInput input = (IFileEditorInput) editorInput;
          IFile file = input.getFile();
          selectedResources = new StructuredSelection(file);
        }
      }

    }
  }

  public void run(IAction action) {
    if (moveActionDelegate != null) {
      if (target != null) {
        moveActionDelegate.setTarget(target);
      }
      moveActionDelegate.run(action);
    } else {
      run(selectedResources);
    }
  }

  public void selectionChanged(IAction action, ISelection selection) {
    if (moveActionDelegate != null) {
      moveActionDelegate.selectionChanged(action, selection);
    } else {
      if (selection instanceof IStructuredSelection) {
        selectedResources = (IStructuredSelection) selection;
      }
    }
  }

  public void dispose() {

  }

  public void setTarget(IContainer target) {
    this.target = target;
  }

  public void init(IWorkbenchWindow window) {
    fShell = window.getShell();

    IPHPActionDelegator action = PHPActionDelegatorRegistry
        .getActionDelegator(MOVE_ELEMENT_ACTION_ID);

    if (action instanceof AbstractMoveDelegator) {
      moveActionDelegate = (AbstractMoveDelegator) action;
    }
  }

}
TOP

Related Classes of org.eclipse.php.internal.ui.actions.ReorgMoveAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.