Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » ObservableMapLabelProvider construction problem.
ObservableMapLabelProvider construction problem. [message #527926] Fri, 16 April 2010 22:43 Go to next message
Mauro Condarelli is currently offline Mauro CondarelliFriend
Messages: 428
Registered: September 2009
Senior Member
The following code actually works, but I think I'm forcing the
interfaces to do something they're not designed for (see the end for
comments).

I am setting up a TreeViewer to display the contents of a model:

//========================================================== =========
tree = toolkit.createTree(composite, SWT.BORDER);
...
tViewer = new TreeViewer(tree);
...
WorldObservableProvider wop = new WorldObservableProvider();
tViewer.setContentProvider(wop.getContentProvider());
tViewer.setLabelProvider(wop.getLabelProvider());
Resource r = model.getResource();
IObservableList iol = EMFObservables.observeResourceContents(r);
tViewer.setInput(iol);
//========================================================== =========

I packaged IObservableFactory, ObservableMapLabelProvider,
ObservableListTreeContentProvider and TreeStructureAdvisor in a single
class to keep them together,, but that has nothing to do with my
problem. I send the whole class in case it might be significant.

//========================================================== =========
public class WorldObservableProvider implements IObservableFactory {
private ObservableMapLabelProvider omlp = null;
private ObservableListTreeContentProvider oltcp = null;
private TreeStructureAdvisor tsa = null;

private IEMFListProperty wMulti =
EMFProperties.multiList(WorldPackage.Literals.WORLD__ACTOR,
WorldPackage.Literals.WORLD__LOCATION,
WorldPackage.Literals.WORLD__BOOK);
private IEMFListProperty bMulti =
EMFProperties.multiList(WorldPackage.Literals.BOOK__ACTOR,
WorldPackage.Literals.BOOK__LOCATION,
WorldPackage.Literals.BOOK__CHAPTER, WorldPackage.Literals.BOOK__ITEM);
private IEMFListProperty cMulti =
EMFProperties.multiList(WorldPackage.Literals.CHAPTER__ACTOR ,
WorldPackage.Literals.CHAPTER__SCENE);

private IObservableMap[] maps;

public WorldObservableProvider() {
tsa = new TreeStructureAdvisor() {
@Override
public Object getParent(Object element) {
if (element instanceof World) {
return null;
} else if (element instanceof Actor) {
return ((Actor)element).eContainingFeature();
} else if (element instanceof Book) {
return ((Book)element).getWorld();
} else if (element instanceof Chapter) {
return ((Chapter)element).getBook();
} else if (element instanceof Location) {
return ((Location)element).eContainingFeature();
} else if (element instanceof Item) {
return ((Item)element).eContainingFeature();
} else if (element instanceof Scene) {
return ((Scene)element).getChapter();
}

return null;
}

@Override
public Boolean hasChildren(Object element) {
if (element instanceof World) {
World w = (World)element;
if (w.getActor().size() > 0)
return true;
if (w.getBook().size() > 0)
return true;
if (w.getLocation().size() > 0)
return true;
return false;
} else if (element instanceof Actor) {
return false;
} else if (element instanceof Book) {
Book b = (Book)element;
if (b.getActor().size() > 0)
return true;
if (b.getChapter().size() > 0)
return true;
if (b.getLocation().size() > 0)
return true;
return false;
} else if (element instanceof Chapter) {
Chapter b = (Chapter)element;
if (b.getActor().size() > 0)
return true;
if (b.getScene().size() > 0)
return true;
return false;
} else if (element instanceof Location) {
return false;
} else if (element instanceof Item) {
return false;
} else if (element instanceof Scene) {
return false;
}
return super.hasChildren(element);
}
};
oltcp = new ObservableListTreeContentProvider(this, tsa);
IObservableSet set = oltcp.getKnownElements();

//======= This is the part I do not like ====================
maps = new IObservableMap[2];
maps[0] =
EMFProperties.value(Literals.IBASE__TITLE).observeDetail(set );
maps[1] =
EMFProperties.value(Literals.ACTOR__NAME).observeDetail(set) ;

//========================================================== =

omlp = new ObservableMapLabelProvider(maps) {

@Override
public Image getImage(Object element) {
if (element instanceof Scene)
return ResourceManager.getImage("PaperTrail", 16);
if (element instanceof Chapter)
return ResourceManager.getImage("CleanDocuments", 16);
if (element instanceof Book)
return ResourceManager.getImage("GreenBook", 16);
if (element instanceof Actor)
return ResourceManager.getImage("Actor", 16);
if (element instanceof Item)
return ResourceManager.getImage("Things", 16);
if (element instanceof Location)
return ResourceManager.getImage("Compass", 16);
if (element instanceof World)
return ResourceManager.getImage("World", 16);

return null;
}

@Override
public String getColumnText(Object element, int columnIndex) {
if (columnIndex == 0) {
//======= Together with this (see below) ==============
if (element instanceof IBase) {
Object o = maps[0].get(element);
return (o != null) ? o.toString() : "(null)";
}
if (element instanceof Actor) {
Object o = maps[1].get(element);
return (o != null) ? o.toString() : "(null)";
}
//=====================================================
}
return super.getColumnText(element, columnIndex);
}
};

}

@Override
public IObservable createObservable(Object target) {
if (target instanceof IObservableList) {
return (IObservable) target;
} else if (target instanceof World) {
return wMulti.observe(target);
} else if (target instanceof Book) {
return bMulti.observe(target);
} else if (target instanceof Chapter) {
return cMulti.observe(target);
}
return null;
}

public ILabelProvider getLabelProvider() {
return omlp;
}

public IContentProvider getContentProvider() {
return oltcp;
}
}

//========================================================== =========

In the getColumnText() method I need to access two different Interfaces:
most of the possible "element" are actually subinterfaces of IBase and
thus I should access IBASE__TITLE, while for the Actor interface (not
subinterface of IBase) I need to access ACTOR__NAME.
In order to do that I found no other way than use multiple maps (only
two for now) and use the index.
If I understand correctly the multiple maps are there to support
multiple columns in the tree (which I *will* need later on!).

How do I make a single map comprising IBASE__TITLE and ACTOR__NAME??

TiA
Mauro
Re: ObservableMapLabelProvider construction problem. [message #527962 is a reply to message #527926] Sat, 17 April 2010 13:41 Go to previous message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
There's nothing wrong with this code though you are right that
ObservableMapLabelProvider is designed for use with multiple columns.

If you want you can use
org.eclipse.jface.databinding.viewers.ObservableMapCellLabel Provider
which works on per column basis. You then have to implement the

-----------8<-----------
public void update(ViewerCell cell) {
// cell.setText();
// cell.setImage();
}
-----------8<-----------

your own.

Tom

Am 17.04.10 00:43, schrieb Mauro Condarelli:
> The following code actually works, but I think I'm forcing the
> interfaces to do something they're not designed for (see the end for
> comments).
>
> I am setting up a TreeViewer to display the contents of a model:
>
> //========================================================== =========
> tree = toolkit.createTree(composite, SWT.BORDER);
> ...
> tViewer = new TreeViewer(tree);
> ...
> WorldObservableProvider wop = new WorldObservableProvider();
> tViewer.setContentProvider(wop.getContentProvider());
> tViewer.setLabelProvider(wop.getLabelProvider());
> Resource r = model.getResource();
> IObservableList iol = EMFObservables.observeResourceContents(r);
> tViewer.setInput(iol);
> //========================================================== =========
>
> I packaged IObservableFactory, ObservableMapLabelProvider,
> ObservableListTreeContentProvider and TreeStructureAdvisor in a single
> class to keep them together,, but that has nothing to do with my
> problem. I send the whole class in case it might be significant.
>
> //========================================================== =========
> public class WorldObservableProvider implements IObservableFactory {
> private ObservableMapLabelProvider omlp = null;
> private ObservableListTreeContentProvider oltcp = null;
> private TreeStructureAdvisor tsa = null;
>
> private IEMFListProperty wMulti =
> EMFProperties.multiList(WorldPackage.Literals.WORLD__ACTOR,
> WorldPackage.Literals.WORLD__LOCATION,
> WorldPackage.Literals.WORLD__BOOK);
> private IEMFListProperty bMulti =
> EMFProperties.multiList(WorldPackage.Literals.BOOK__ACTOR,
> WorldPackage.Literals.BOOK__LOCATION,
> WorldPackage.Literals.BOOK__CHAPTER, WorldPackage.Literals.BOOK__ITEM);
> private IEMFListProperty cMulti =
> EMFProperties.multiList(WorldPackage.Literals.CHAPTER__ACTOR ,
> WorldPackage.Literals.CHAPTER__SCENE);
>
> private IObservableMap[] maps;
>
> public WorldObservableProvider() {
> tsa = new TreeStructureAdvisor() {
> @Override
> public Object getParent(Object element) {
> if (element instanceof World) {
> return null;
> } else if (element instanceof Actor) {
> return ((Actor)element).eContainingFeature();
> } else if (element instanceof Book) {
> return ((Book)element).getWorld();
> } else if (element instanceof Chapter) {
> return ((Chapter)element).getBook();
> } else if (element instanceof Location) {
> return ((Location)element).eContainingFeature();
> } else if (element instanceof Item) {
> return ((Item)element).eContainingFeature();
> } else if (element instanceof Scene) {
> return ((Scene)element).getChapter();
> }
>
> return null;
> }
>
> @Override
> public Boolean hasChildren(Object element) {
> if (element instanceof World) {
> World w = (World)element;
> if (w.getActor().size() > 0)
> return true;
> if (w.getBook().size() > 0)
> return true;
> if (w.getLocation().size() > 0)
> return true;
> return false;
> } else if (element instanceof Actor) {
> return false;
> } else if (element instanceof Book) {
> Book b = (Book)element;
> if (b.getActor().size() > 0)
> return true;
> if (b.getChapter().size() > 0)
> return true;
> if (b.getLocation().size() > 0)
> return true;
> return false;
> } else if (element instanceof Chapter) {
> Chapter b = (Chapter)element;
> if (b.getActor().size() > 0)
> return true;
> if (b.getScene().size() > 0)
> return true;
> return false;
> } else if (element instanceof Location) {
> return false;
> } else if (element instanceof Item) {
> return false;
> } else if (element instanceof Scene) {
> return false;
> }
> return super.hasChildren(element);
> }
> };
> oltcp = new ObservableListTreeContentProvider(this, tsa);
> IObservableSet set = oltcp.getKnownElements();
>
> //======= This is the part I do not like ====================
> maps = new IObservableMap[2];
> maps[0] =
> EMFProperties.value(Literals.IBASE__TITLE).observeDetail(set );
> maps[1] =
> EMFProperties.value(Literals.ACTOR__NAME).observeDetail(set) ;
>
> //========================================================== =
>
> omlp = new ObservableMapLabelProvider(maps) {
>
> @Override
> public Image getImage(Object element) {
> if (element instanceof Scene)
> return ResourceManager.getImage("PaperTrail", 16);
> if (element instanceof Chapter)
> return ResourceManager.getImage("CleanDocuments", 16);
> if (element instanceof Book)
> return ResourceManager.getImage("GreenBook", 16);
> if (element instanceof Actor)
> return ResourceManager.getImage("Actor", 16);
> if (element instanceof Item)
> return ResourceManager.getImage("Things", 16);
> if (element instanceof Location)
> return ResourceManager.getImage("Compass", 16);
> if (element instanceof World)
> return ResourceManager.getImage("World", 16);
>
> return null;
> }
>
> @Override
> public String getColumnText(Object element, int columnIndex) {
> if (columnIndex == 0) {
> //======= Together with this (see below) ==============
> if (element instanceof IBase) {
> Object o = maps[0].get(element);
> return (o != null) ? o.toString() : "(null)";
> }
> if (element instanceof Actor) {
> Object o = maps[1].get(element);
> return (o != null) ? o.toString() : "(null)";
> }
> //=====================================================
> }
> return super.getColumnText(element, columnIndex);
> }
> };
>
> }
>
> @Override
> public IObservable createObservable(Object target) {
> if (target instanceof IObservableList) {
> return (IObservable) target;
> } else if (target instanceof World) {
> return wMulti.observe(target);
> } else if (target instanceof Book) {
> return bMulti.observe(target);
> } else if (target instanceof Chapter) {
> return cMulti.observe(target);
> }
> return null;
> }
>
> public ILabelProvider getLabelProvider() {
> return omlp;
> }
>
> public IContentProvider getContentProvider() {
> return oltcp;
> }
> }
>
> //========================================================== =========
>
> In the getColumnText() method I need to access two different Interfaces:
> most of the possible "element" are actually subinterfaces of IBase and
> thus I should access IBASE__TITLE, while for the Actor interface (not
> subinterface of IBase) I need to access ACTOR__NAME.
> In order to do that I found no other way than use multiple maps (only
> two for now) and use the index.
> If I understand correctly the multiple maps are there to support
> multiple columns in the tree (which I *will* need later on!).
>
> How do I make a single map comprising IBASE__TITLE and ACTOR__NAME??
>
> TiA
> Mauro
>
Previous Topic:No new child option in model editor
Next Topic:Emf + Teneo + Web services support (JAX-WS)
Goto Forum:
  


Current Time: Sat Apr 20 02:53:35 GMT 2024

Powered by FUDForum. Page generated in 0.02244 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top