[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.newcomer] TreeViewer Refresh issues

Hopefully this isn't double posted.  Didn't seem to post the first time around.  I'm writing a small application @ work and we decided to use the Eclipse RCP framework to build on.  It's been a bit of a learning curve for me, but I'm really starting to like it :)

My TreeViewer is only refreshing when my primary list of models creates or removes a top level element.  Not when I add child elements.  I'm new to using java.beans, and I'm guessing that I have them configured wrong with the ObservableListTreeContent/LabelProviders. I'm using java.beans.PropertyChangeListener and PropertyChangeSupport as my base for all of my models.


/** * All models inherit from this base class */ abstract class ModelObject { private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

 public final void addPropertyChangeListener(PropertyChangeListener listener)
 {
   propertyChangeSupport.addPropertyChangeListener(listener);
 }

 public final void addPropertyChangeListener(String propertyName,
     PropertyChangeListener listener)
 {
   propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
 }

 public final void removePropertyChangeListener(PropertyChangeListener listener)
 {
   propertyChangeSupport.removePropertyChangeListener(listener);
 }

 public final void removePropertyChangeListener(String propertyName,
     PropertyChangeListener listener)
 {
   propertyChangeSupport.removePropertyChangeListener(propertyName, listener);
 }

final void firePropertyChange(String propertyName, Object oldValue,
Object newValue)
{
propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
/**
* A helper function for ContentProviders. Override in implementing classes.
* @return
*/
public Object[] toObjectArray()
{
if(true)
{
throw new RuntimeException("Not Completed yet");
}
return new Object[0];
}


}



In the example code below, my controller holds a list of EventModels inheriting from ModelObject. I can add and remove EventModels and the TreeViewer is refreshed - BUT - when I add or remove Designators the TreeViewer doesn't refresh.  I have to close and reopen the tree to see them (the content provider and label provider work correctly since they render on forced refresh).  I based my code off the EclipseCon 2009 Mail 2.0 example: http://max-server.myftp.org/rcp-mail/download/rcpmail-downloads.html



/**
* Abbreviated Controller code
*/
public class Controller extends ModelObject
{
private List<EventModel> models;
public void createSIGINTEvent()
{
EventModelImpl sem = new EventModelImpl();
models.add( sem );
firePropertyChange("models", null, null);
}
public void removeSIGINTEvent()
{
if( models.size() > 0 )
{
models.remove(0);
firePropertyChange("models", null, null);
}
}


public void addDesignator( EventModelImpl model, String name )
{
model.addDesignator( name );
firePropertyChange("models", null, null);
//firePropertyChange("designators", null, null);
}


public void removeDesignator( Designator desig )
{
((EventModelImpl)desig.getOwner()).removeDesignator(desig);
firePropertyChange("models", null, null);
//firePropertyChange("designators", null, null);
}


 public List<EventModel> getModels()
 {
   return models;
 }
}


public class EventModelDBContentProvider extends ObservableListTreeContentProvider { public EventModelDBContentProvider() { //super( getObservableListFactory(), getTreeStructureAdvisor() ); super( getObservableListFactory(), null ); }

// This factory returns an observable list of children for the given parent.
private static IObservableFactory getObservableListFactory()
{
return new IObservableFactory()
{
public IObservable createObservable(Object parent)
{
if( parent instanceof Controller )
{
return BeanProperties.list("models").observe( parent );
}
if( parent instanceof EventModelImpl )
{
return BeanProperties.list("designators").observe( parent );
}
return null;
}
};
}


// The following is optional, you can pass null as the advisor, but then
// setSelection() will not find elements that have not been expanded.
private static TreeStructureAdvisor getTreeStructureAdvisor()
{
return new TreeStructureAdvisor()
{
public Object getParent(Object element)
{
if( element instanceof Designator )
{
return ((Designator)element).getOwner(); // returns event model
}
return super.getParent(element);
}
}
@Override
public Object[] getChildren(Object parentElement)
{
...
}


 @Override
 public Object getParent(Object element)
 {
   ...
 }

@Override
public boolean hasChildren(Object element)
{
...
}
}


public final class EventModelDBLabelProvider extends ObservableMapLabelProvider
{
public EventModelDBLabelProvider( IObservableSet knownElements )
{
// We pass an array of properties so that appropriate listeners
// are added automatically to each element displayed in the viewer.
super(Properties.observeEach(knownElements, BeanProperties
.values(new String[] { "name", "designators"})));
}
public Image getImage(Object element)
{
...
}
public String getText(Object element)
{
...
} }


public class AddDesignator implements IHandler
{

 @Override
 public void addHandlerListener(IHandlerListener handlerListener)
 {
 }

 @Override
 public void dispose()
 {
 }

@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
if(selection != null & selection instanceof IStructuredSelection )
{
IStructuredSelection strucSelection = (IStructuredSelection)selection;
for( Iterator<Object> itr = strucSelection.iterator(); itr.hasNext(); )
{
Object element = itr.next();
if( element instanceof EventModelImpl )
{
EventModelImpl sem = (EventModelImpl)element;
InputDialog dlg = ...
if( dlg.open() == Window.OK )
{
Controller.getInstance().addDesignator(sem, dlg.getValue());
}
}
}
}
return null;
}


 @Override
 public boolean isEnabled()
 {
   return true;
 }

 @Override
 public boolean isHandled()
 {
   return true;
 }

 @Override
 public void removeHandlerListener(IHandlerListener handlerListener)
 {
 }

}



I know this is a lot, and hopefully it makes sense.  Please, any help is greatly appreciated.

Thank you :)