Package no.hal.confluence.ui.actions.util

Source Code of no.hal.confluence.ui.actions.util.PasteSourceIntoPackageExplorerHelper

package no.hal.confluence.ui.actions.util;

import java.util.ArrayList;
import java.util.Collection;

import no.hal.confluence.ui.actions.PostActionHook;
import no.hal.confluence.ui.views.BrowserView;

import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IElementChangedListener;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaElementDelta;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.refactoring.reorg.PasteAction;
import org.eclipse.jdt.ui.actions.SelectionDispatchAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;

public class PasteSourceIntoPackageExplorerHelper implements IElementChangedListener, IWorkspaceRunnable {

  private PostActionHook<IJavaElement> postActionHook;
  private BrowserView browserView;
  private String sourceFolderPath;
  private String defaultSourceFolderName;
 
  protected Display getDisplay() {
    return browserView.getControl().getDisplay();
  }
 
  protected Collection<IJavaElement> pastedJavaElements = null;

  public PasteSourceIntoPackageExplorerHelper(String sourceFolderPath, String defaultSourceFolderName, PostActionHook<IJavaElement> postActionHook, BrowserView browserView) {
    this.sourceFolderPath = sourceFolderPath;
    this.defaultSourceFolderName = defaultSourceFolderName;
    this.postActionHook = postActionHook;
    this.browserView = browserView;
  }

  private IProgressMonitor progressMonitor;
 
  public void run(IProgressMonitor progressMonitor) {
    this.progressMonitor = progressMonitor;

    StructuredSelection selection = null;
    try {
      IJavaElement srcFolder = getSourceFolder(sourceFolderPath, defaultSourceFolderName);
      if (srcFolder != null) {
        selection = new StructuredSelection(srcFolder);
      } else {
        String message = "Couldn't find source folder named " + sourceFolderPath + " or " + defaultSourceFolderName + ". Perhaps the Programming Wiki preferences are wrong or a source folder is missing in your project?";
        MessageDialog.openError(browserView.getControl().getShell(), "Missing source folder", message);
      }
    } catch (JavaModelException e) {
    }
    if (selection == null) {
      throw new RuntimeException("Didn't find place to paste source");
    }
    try {
      pastedJavaElements = new ArrayList<IJavaElement>();
      JavaCore.addElementChangedListener(this);
      SelectionDispatchAction pasteAction = getPasteAction();
      if (pasteAction == null) {
        throw new RuntimeException("Didn't find package explorer's paste action");
      }
      if (progressMonitor != null) {
        progressMonitor.subTask("Pasting test source");
      }
//      System.out.println("Pasting into " + selection + " (" + selection.size() + ")");
      pasteAction.run(selection);
      if (progressMonitor != null) {
        progressMonitor.worked(1);
      }
    } finally {
      getDisplay().asyncExec(new Runnable() {
        @Override
        public void run() {
          JavaCore.removeElementChangedListener(PasteSourceIntoPackageExplorerHelper.this);
        }
      });
    }
  }
 
  public void elementChanged(ElementChangedEvent elementChangedEvent) {
    int changeType = elementChangedEvent.getType();
    boolean wasEmpty = pastedJavaElements.size() == 0;
    if (changeType == IJavaElementDelta.ADDED || changeType == IJavaElementDelta.CHANGED) {
      IJavaElement element = elementChangedEvent.getDelta().getElement();
      if (element instanceof ICompilationUnit) {
        pastedJavaElements.add(element);
//        System.out.println("Pasted " + element.getElementName());
      }
    }
    if (wasEmpty && pastedJavaElements.size() > 0 && postActionHook != null) {
      getDisplay().asyncExec(new Runnable() {
        @Override
        public void run() {
          postActionHook.postActionHook(pastedJavaElements);
        }
      });
    }
    if (progressMonitor != null) {
      progressMonitor.done();
    }
  }

  public static IViewPart showView(String viewId, boolean bringToTop) {
    IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    try {
      IViewPart view = activePage.showView(viewId);
      if (view != null && bringToTop) {
        activePage.bringToTop(view);
      }
      return view;
    } catch (PartInitException e) {
    }
    return null;
  }
 
  protected IJavaElement getSourceFolder(String sourceFolderPath, String defaultSourceFolderName) throws JavaModelException {
    IJavaModel javaModel = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
    String[] pathElements = sourceFolderPath.split("/");
    IJavaElement sourceFolder = javaModel;
    for (int i = 0; i < pathElements.length; i++) {
      String pathElement = pathElements[i];
      if (pathElement == null || pathElement.trim().length() == 0) {
        continue;
      }
      if (sourceFolder instanceof IJavaModel) {
        sourceFolder = ((IJavaModel) sourceFolder).getJavaProject(pathElement);
      } else if (sourceFolder instanceof IJavaProject) {
        IPackageFragmentRoot[] packageFragmentRoots = ((IJavaProject) sourceFolder).getPackageFragmentRoots();
        sourceFolder = findSourceFolder(pathElement, packageFragmentRoots);
      } else if (sourceFolder instanceof IPackageFragmentRoot) {
        break;
      }
    }
    if (sourceFolder instanceof IJavaProject) {
      IPackageFragmentRoot[] packageFragmentRoots = ((IJavaProject) sourceFolder).getPackageFragmentRoots();
      sourceFolder = findSourceFolder(defaultSourceFolderName, packageFragmentRoots);
      if (sourceFolder == null) {
        sourceFolder = findSourceFolder(null, packageFragmentRoots);
      }
    }
    return (sourceFolder instanceof IPackageFragmentRoot ? sourceFolder : null);
  }

  private IJavaElement findSourceFolder(String folderName, IPackageFragmentRoot[] packageFragmentRoots) {
    for (int i = 0; i < packageFragmentRoots.length; i++) {
      IPackageFragmentRoot packageFragmentRoot = packageFragmentRoots[i];
      if (folderName == null || (folderName.equals(packageFragmentRoot.getElementName()) && packageFragmentRoot.getResource() != null)) {
        return packageFragmentRoot;
      }
    }
    return null;
  }

//  private static final String PACKAGE_EXPLORER_VIEW_ID = "org.eclipse.jdt.ui.PackageExplorer";
  private PasteAction pasteAction = null;
 
  public SelectionDispatchAction getPasteAction() {
    if (pasteAction == null) {
      pasteAction = new PasteAction(browserView.getSite());
    }
    return pasteAction;
//    IViewPart javaView = showView(PACKAGE_EXPLORER_VIEW_ID, true);
//    if (javaView != null) {
//      IActionBars actionBars = javaView.getViewSite().getActionBars();
//      return (SelectionDispatchAction) actionBars.getGlobalActionHandler("paste");
//    }
//    return null;
  }
}
TOP

Related Classes of no.hal.confluence.ui.actions.util.PasteSourceIntoPackageExplorerHelper

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.