package edu.neu.ccs.eclipse.LoDChecker;
import org.eclipse.jface.viewers.*;
import java.util.Observer;
import java.util.Observable;
import java.util.Vector;

/* Provides viewer with information on how to transform domain object 
 * into a visible viewer item.
 * Also listens for domain model changes and updates viewer correspondingly
 */

public class JFContentProvider implements IStructuredContentProvider,Observer {
 private ListViewer viewer;


 //Subscribes as listener for model change events...
 public void inputChanged(Viewer viewer,Object oldInput,Object newInput) {
   this.viewer=(ListViewer)viewer;
   if (oldInput!=null) {
     ((Observable)oldInput).deleteObserver(this);
   }
   if (newInput!=null) {
     ((Observable)newInput).addObserver(this);
   }
 }

 /**This method is called by viewer whenever 
  * viewer's setInput methos was called.
  * Converts inputElement into object array.
  * After calling this method viewer will call pass
  * array returned to getText() & getImage() methods
  * of its ILabelProvider object.
  */
 public Object[] getElements(Object inputElement) {
   if (inputElement instanceof ViewerInput) 
    return ((ViewerInput)inputElement).getElements();
   else 
    return null;
 }

 public void dispose() {
 }

 /**
  * Called whenever we change domain model objects 
  * (change selection in the workbench).
  * Keeps viewer in sync with domain model contain.
  */
 public void update(Observable o, Object arg) {
  Vector elements;
  if (arg instanceof elementsEvent) 
    elements=((elementsEvent)arg).getElements();
  else 
    return;

  if (elements!=null) {
    if (arg instanceof removeElementsEvent) {
      viewer.remove(elements.toArray());
    }

    if (arg instanceof insertElementsEvent) {
      viewer.add(elements.toArray());     
    } 
  }
 }

}