[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 :)