package edu.neu.ccs.eclipse.LoDChecker;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.core.resources.IFile;
import java.util.Iterator;
import java.util.Vector;
import java.util.Observable;

/*
 * Input for the viewer.
 */                                                       
public class ViewerInput extends Observable implements ISelectionListener{

  Vector elements=new Vector();
  
  public ViewerInput(ISelection selection) {
    if (selection!=null && selection instanceof IStructuredSelection) 
     setSelection((IStructuredSelection)selection);
  }
  
  public Object[] getElements() {
    return elements.toArray();
  }


 /** Executes whenever we make new selection in the Workbench
   */
  public void selectionChanged(IWorkbenchPart part, ISelection selection) {
    if (selection!=null && selection instanceof IStructuredSelection) {
     IStructuredSelection sel=(IStructuredSelection)selection;
     setSelection((IStructuredSelection)selection);
    }
  } 


 /** Convert selection into model objects and notifys listeners if
   */
  protected void setSelection(IStructuredSelection selection) {
    Vector newElements=new Vector();
    Vector removed=new Vector();
    Vector inserted=new Vector();
    Iterator iter=selection.iterator();

    while (iter.hasNext()) {
      Object el=iter.next();
      if (el instanceof IFile && 
          ((IFile)el).getFileExtension()!=null &&
          ((IFile)el).getFileExtension().equals("java")
       ) {
        if (!elements.contains(el)) 
          inserted.add(el);
        newElements.add(el);
      }
    }     

    for (int i=0;i<elements.size();i++) {
      Object el=elements.get(i);
      if (!newElements.contains(el)) removed.add(el);
    }      
                
    if (removed.size()>0) {
      setChanged();
      notifyObservers(new removeElementsEvent(removed));
      clearChanged();       
    }
    if (inserted.size()>0) {
      setChanged();
      notifyObservers(new insertElementsEvent(inserted));
      clearChanged();       
    }

    elements=newElements;
  }

}


//Event classes
class elementsEvent {
   private Vector elements;

   public elementsEvent(Vector elements)  {
    this.elements=elements;
   }
   public Vector getElements() {return elements;}
}

class insertElementsEvent extends elementsEvent {
   public insertElementsEvent(Vector elements)  {
    super(elements);
   }

}

class removeElementsEvent extends elementsEvent {
   public removeElementsEvent(Vector elements)  {
    super(elements);
   }
}

