package net.sourceforge.phpeclipse.preferences;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.resourcesview.PHPProject;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;

public class PHPProjectLibraryPage {
  protected PHPProject workingProject;

  protected PHPProjectLibraryPage(PHPProject theWorkingProject) {
    super();
    workingProject = theWorkingProject;
  }

  protected Control getControl(Composite parent) {
    Composite composite = new Composite(parent, SWT.NONE);
    composite.setLayout(new FillLayout());

    Table projectsTable = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
    projectsTable.setHeaderVisible(false);
    projectsTable.setLinesVisible(false);
    projectsTable.computeSize(SWT.DEFAULT, SWT.DEFAULT);

    TableColumn tableColumn = new TableColumn(projectsTable, SWT.NONE);
    tableColumn.setWidth(200);
    tableColumn.setText(PHPPreferencesMessages.getString("PHPProjectLibraryPage.project")); //$NON-NLS-1$

    CheckboxTableViewer projectsTableViewer = new CheckboxTableViewer(projectsTable);
    projectsTableViewer.addCheckStateListener(new ICheckStateListener() {
      public void checkStateChanged(CheckStateChangedEvent event) {
        projectCheckedUnchecked(event);
      }
    });

    projectsTableViewer.setContentProvider(getContentProvider());
    projectsTableViewer.setLabelProvider(getLabelProvider());

    projectsTableViewer.setInput(getWorkspaceProjects());
    projectsTableViewer.setCheckedElements(workingProject.getReferencedProjects().toArray());

    return composite;
  }

  protected void projectCheckedUnchecked(CheckStateChangedEvent event) {
    IProject checkEventProject = (IProject) event.getElement();
    if (event.getChecked())
      getWorkingProject().addLoadPathEntry(checkEventProject);
    else
      getWorkingProject().removeLoadPathEntry(checkEventProject);
  }

  protected PHPProject getWorkingProject() {
    return workingProject;
  }

  protected List getWorkspaceProjects() {
    IWorkspaceRoot root = PHPeclipsePlugin.getWorkspace().getRoot();
    return Arrays.asList(root.getProjects());
  }

  protected ITableLabelProvider getLabelProvider() {
    ITableLabelProvider labelProvider = new ITableLabelProvider() {
      public Image getColumnImage(Object element, int columnIndex) {
        IWorkbench workbench = PHPeclipsePlugin.getDefault().getWorkbench();
        return workbench.getSharedImages().getImage(ISharedImages.IMG_OBJ_PROJECT);
      }

      public String getColumnText(Object element, int columnIndex) {
        if (element instanceof IProject)
          return ((IProject) element).getName();

        return PHPPreferencesMessages.getString("PHPProjectLibraryPage.elementNotIProject"); //$NON-NLS-1$
      }

      public void addListener(ILabelProviderListener listener) {
      }

      public void dispose() {
      }

      public boolean isLabelProperty(Object element, String property) {
        return false;
      }

      public void removeListener(ILabelProviderListener listener) {
      }
    };

    return labelProvider;
  }

  protected IContentProvider getContentProvider() {
    IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
      protected List phpProjects;

      public Object[] getElements(Object inputElement) {
        return phpProjects.toArray();
      }

      public void dispose() {
      }

      public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        phpProjects = new ArrayList();

        if (!(newInput instanceof List))
          return;

        Iterator workspaceProjectsIterator = ((List) newInput).iterator();
        while (workspaceProjectsIterator.hasNext()) {
          Object anObject = workspaceProjectsIterator.next();
          if (anObject instanceof IProject) {
            IProject project = (IProject) anObject;
            if (project.getName() != workingProject.getProject().getName()) {
              try {
                if (project.hasNature(PHPeclipsePlugin.PHP_NATURE_ID))
                  phpProjects.add(project);
              } catch (CoreException e) {
              }
            }
          }
        }
      }
    };

    return contentProvider;
  }
}