package net.sourceforge.phpeclipse.resourcesview;

import net.sourceforge.phpeclipse.PHPeclipsePlugin;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.eclipse.ui.part.ViewPart;

public class PHPResourcesView extends ViewPart implements ISetSelectionTarget, IMenuListener {
  protected TreeViewer viewer;
  protected MainActionGroup mainActionGroup;

  public PHPResourcesView() {

  }

  public void createPartControl(Composite parent) {
    this.setViewer(new TreeViewer(parent));

    this.getViewer().addFilter(new PHPViewerFilter());
    this.getViewer().setContentProvider(new WorkbenchContentProvider());
    this.getViewer().setLabelProvider(new WorkbenchLabelProvider());
    this.getViewer().setInput(getInitialInput());

    this.getViewer().addOpenListener(new IOpenListener() {
      public void open(OpenEvent event) {
        getMainActionGroup().runDefaultAction((IStructuredSelection) event.getSelection());
      }
    });

    MenuManager menuMgr = new MenuManager("net.sourceforge.phpeclipse.PHPPopupMenu"); //$NON-NLS-1$
    menuMgr.setRemoveAllWhenShown(true);
    menuMgr.addMenuListener(this);

    Menu fContextMenu = menuMgr.createContextMenu(this.getViewer().getTree());
    this.getViewer().getTree().setMenu(fContextMenu);

    // Register viewer with site. This must be done before making the actions.
    IWorkbenchPartSite site = getSite();
    site.registerContextMenu(menuMgr, viewer);
  }

  public void selectReveal(ISelection selection) {
    viewer.setSelection(selection, true);
  }

  protected IContainer getInitialInput() {
    IAdaptable input = getSite().getPage().getInput();
    IResource resource = null;
    if (input instanceof IResource) {
      resource = (IResource) input;
    } else {
      resource = (IResource) input.getAdapter(IResource.class);
    }
    if (resource != null) {
      switch (resource.getType()) {
        case IResource.FILE :
          return resource.getParent();
        case IResource.FOLDER :
        case IResource.PROJECT :
        case IResource.ROOT :
          return (IContainer) resource;
        default :
          break;
      }
    }
    return PHPeclipsePlugin.getWorkspace().getRoot();
  }

  public void setFocus() {
    this.getViewer().getControl().setFocus();
  }

  public void menuAboutToShow(IMenuManager manager) {
    IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
    this.getMainActionGroup().setContext(new ActionContext(selection));
    this.getMainActionGroup().fillContextMenu(manager);
    this.getMainActionGroup().setContext(null);
  }

  public MainActionGroup getMainActionGroup() {
    if (mainActionGroup == null) {
      // lazy initialization, because this.getSite() delivers null in constructor
      mainActionGroup = new MainActionGroup(this);
    }
    return mainActionGroup;
  }

  public void setMainActionGroup(MainActionGroup mainActionGroup) {
    this.mainActionGroup = mainActionGroup;
  }

  public TreeViewer getViewer() {
    return viewer;
  }

  protected void setViewer(TreeViewer viewer) {
    this.viewer = viewer;
  }

}