Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Eclipse Platform » Does jface databinding support treeviewer?
Does jface databinding support treeviewer? [message #328406] Sat, 24 May 2008 04:18 Go to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
Hi,

Does jface databinding support treeviewer? If it does, could you please
show me an example?

thanks
hao
Re: Does jface databinding support treeviewer? [message #328413 is a reply to message #328406] Sat, 24 May 2008 07:27 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
hao schrieb:
> Hi,
>
> Does jface databinding support treeviewer? If it does, could you please
> show me an example?
>
> thanks
> hao
>

yes in 3.4 with an official api and in 3.3 with an in official.

Tom

--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: Does jface databinding support treeviewer? [message #328427 is a reply to message #328413] Sat, 24 May 2008 12:28 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
Hi,

What are the corresponding API for 3.4? What's the in-offical way for 3.3?
Could you please provide some sample code?

thanks!
hao
Re: Does jface databinding support treeviewer? [message #328431 is a reply to message #328427] Sat, 24 May 2008 12:37 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.e xamples.databinding/src/org/eclipse/jface/examples/databindi ng/snippets/

Tom
hao schrieb:
> Hi,
>
> What are the corresponding API for 3.4? What's the in-offical way for
> 3.3? Could you please provide some sample code?
>
> thanks!
> hao
>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: Does jface databinding support treeviewer? [message #328439 is a reply to message #328431] Sun, 25 May 2008 01:36 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
The jface databinding example is too sample. Basically, the nodes on a
tree may contain different objects. The BeansObservables.listFactory() is
not good enough for that kind of situation. I would like find some butter
examples which use real tree structure.
Re: Does jface databinding support treeviewer? [message #328441 is a reply to message #328439] Sun, 25 May 2008 09:29 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Good luck. You'll to study the code yourself, you are welcome to provide
one after having found out how to do it.

Tom

hao schrieb:
> The jface databinding example is too sample. Basically, the nodes on a
> tree may contain different objects. The BeansObservables.listFactory()
> is not good enough for that kind of situation. I would like find some
> butter examples which use real tree structure.
>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: Does jface databinding support treeviewer? [message #328491 is a reply to message #328439] Mon, 26 May 2008 16:21 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
In this case you will want to write an IObservableFactory which
delegates to the correct factory on a case-by-case basis:

IObservableFactory listFactory = new IObservableFactory() {
IObservableFactory workspaceProjects = ...;
IObservableFactory projectFiles = ...;
IObservableFactory folderFiles = ...;

public IObservable createObservable(Object target) {
if (target instanceof IWorkspace)
return workspaceProjects.createObservable(target);
if (target instanceof IProject)
return projectFiles.createObservable(target);
if (target instanceof IFolder)
return folderFiles.createObservable(target);
return null;
}
};

Does this help?

Matthew

hao wrote:
> The jface databinding example is too sample. Basically, the nodes on a
> tree may contain different objects. The BeansObservables.listFactory()
> is not good enough for that kind of situation. I would like find some
> butter examples which use real tree structure.
Re: Does jface databinding support treeviewer? [message #328502 is a reply to message #328491] Mon, 26 May 2008 18:48 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
HI,

I already did that but still get error. Please see the source code on my
post of treeviewer databinding error. I think the problem is that the
label provider is not generated correctly. Do you have any idea on how to
create the label provider?

thanks!
Re: Does jface databinding support treeviewer? [message #328547 is a reply to message #328502] Tue, 27 May 2008 16:16 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
> HI,
>
> I already did that but still get error. Please see the source code on my
> post of treeviewer databinding error. I think the problem is that the
> label provider is not generated correctly. Do you have any idea on how
> to create the label provider?
>
> thanks!
>

hao,

I've looked back through this thread but didn't see the code you're
talking about. Could you repost?

Matthew
Re: Does jface databinding support treeviewer? [message #328549 is a reply to message #328547] Tue, 27 May 2008 15:22 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Matt its part of the "treeviewer databinding error" thread.

Tom

Matthew Hall schrieb:
> hao wrote:
>> HI,
>>
>> I already did that but still get error. Please see the source code on
>> my post of treeviewer databinding error. I think the problem is that
>> the label provider is not generated correctly. Do you have any idea on
>> how to create the label provider?
>>
>> thanks!
>>
>
> hao,
>
> I've looked back through this thread but didn't see the code you're
> talking about. Could you repost?
>
> Matthew


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: Does jface databinding support treeviewer? [message #328562 is a reply to message #328549] Tue, 27 May 2008 16:42 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
Here's the code.

package com.discover.plugin.phonebook.treeviewer.v34;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import
org.eclipse.core.databinding.observable.masterdetail.IObserv ableFactory;
import org.eclipse.core.databinding.observable.value.IObservableVal ue;
import org.eclipse.core.internal.databinding.beans.JavaBeanObservab leMap;
import
org.eclipse.core.internal.databinding.observable.EmptyObserv ableList;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.SWTObservables;
import
org.eclipse.jface.databinding.viewers.ObservableListTreeCont entProvider;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProv ider;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;

/**
*
* @author hchen
* The code is not a good solution
* Always get error: org.eclipse.core.databinding.BindingException: Could
not find property with name email in class class
com.discover.plugin.model.PersonGroup
*/
public class PhoneBookUsingTreeViewerEx {

class AbstractModelObject {
private final PropertyChangeSupport propertyChangeSupport = new
PropertyChangeSupport(
this);

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

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

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

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

protected void firePropertyChange(String propertyName, Object oldValue,
Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue,
newValue);
}
}

class PersonPhone extends AbstractModelObject{
private String m_name = "";
private String m_email = "";
private String m_phone = "";
private String m_mobilePhone1 = "";
private String m_mobilePhone2 = "";

public PersonPhone() {
}

public PersonPhone(String name, String email, String phone, String
phone1,
String phone2) {
m_name = name;
m_email = email;
m_phone = phone;
m_mobilePhone1 = phone1;
m_mobilePhone2 = phone2;
}

public String getName() {
return m_name;
}

public void setName(String name) {
String oldValue = m_name;
m_name = name;
firePropertyChange("name", oldValue, m_name);
}

public String getEmail() {
return m_email;
}

public void setEmail(String email) {
String oldValue = m_email;
m_email = email;
firePropertyChange("email", oldValue, m_email);
}

public String getPhone() {
return m_phone;
}

public void setPhone(String phone) {
String oldValue = m_phone;
m_phone = phone;
firePropertyChange("phone", oldValue, m_phone);
}

public String getMobilePhone1() {
return m_mobilePhone1;
}

public void setMobilePhone1(String phone1) {
String oldValue = m_mobilePhone1;
m_mobilePhone1 = phone1;
firePropertyChange("mobilePhone1", oldValue, m_mobilePhone1);
}

public String getMobilePhone2() {
return m_mobilePhone2;
}

public void setMobilePhone2(String phone2) {
String oldValue = m_mobilePhone2;
m_mobilePhone2 = phone2;
firePropertyChange("mobilePhone2", oldValue, m_mobilePhone2);
}

@Override
public String toString() {
StringBuilder strBuf = new StringBuilder();
strBuf.append("name=");
strBuf.append(m_name);
strBuf.append(";");
strBuf.append("email=");
strBuf.append(m_email);
strBuf.append(";");
strBuf.append("phone=");
strBuf.append(m_phone);
strBuf.append(";");
strBuf.append("mobilePhone1=");
strBuf.append(m_mobilePhone1);
strBuf.append(";");
strBuf.append("mobilePhone2=");
strBuf.append(m_mobilePhone2);
return strBuf.toString();
}
}

class PersonPhoneGroup extends AbstractModelObject{
private final List m_persons = new ArrayList();
private String m_name;

public PersonPhoneGroup() {
}

public PersonPhoneGroup(String name) {
m_name = name;
}

public String getName() {
return m_name;
}

public void setName(String name) {
String oldValue = m_name;
m_name = name;
firePropertyChange("name", oldValue, m_name);
}

public void addPersonPhone(PersonPhone person) {
m_persons.add(person);
firePropertyChange("persons", null, m_persons);
}

public void removePersonPhone(PersonPhone person) {
m_persons.remove(person);
firePropertyChange("persons", null, m_persons);
}

public List getPersons() {
return m_persons;
}

public String getEmail() {
return "";
}

public void setEmail(String email) {
}

public String getPhone() {
return "";
}

public void setPhone(String phone) {
}

public String getMobilePhone1() {
return "";
}

public void setMobilePhone1(String phone1) {
}

public String getMobilePhone2() {
return "";
}

public void setMobilePhone2(String phone2) {
}


@Override
public String toString() {
String RL = System.getProperty("line.separator");
StringBuilder strBuf = new StringBuilder();
strBuf.append("Person Group - ");
strBuf.append(m_name);
strBuf.append(RL);
for(Iterator it= m_persons.iterator(); it.hasNext(); ){
strBuf.append(it.next());
strBuf.append(RL);
}
return strBuf.toString();
}
}

class PersonPhoneGroups extends AbstractModelObject {
private List m_groups;

public PersonPhoneGroups(){
m_groups = new ArrayList();
}

public void addGroup(PersonPhoneGroup group) {
m_groups.add(group);
firePropertyChange("groups", null, m_groups);
}

public void removeGroup(PersonPhoneGroup group) {
m_groups.remove(group);
firePropertyChange("groups", null, m_groups);
}

public List getGroups() {
return m_groups;
}

@Override
public String toString() {
String RL = System.getProperty("line.separator");
StringBuilder strBuf = new StringBuilder();
strBuf.append("Person Groups");
strBuf.append(RL);
for(Iterator it= m_groups.iterator(); it.hasNext(); ){
strBuf.append(it.next());
strBuf.append(RL);
}
return strBuf.toString();
}

public String getName() {
return "";
}

public void setName(String name) {
}

public String getEmail() {
return "";
}

public void setEmail(String email) {
}

public String getPhone() {
return "";
}

public void setPhone(String phone) {
}

public String getMobilePhone1() {
return "";
}

public void setMobilePhone1(String phone1) {
}

public String getMobilePhone2() {
return "";
}

public void setMobilePhone2(String phone2) {
}

}
public class PersonPhoneObservableFactory implements IObservableFactory{

public PersonPhoneObservableFactory() {
super();
}

public IObservable createObservable(Object target) {
if( target instanceof PersonPhoneGroups ){
return BeansObservables.observeList(Realm.getDefault(), target,
"groups", PersonPhoneGroup.class);
}else if( target instanceof PersonPhoneGroup ){
return BeansObservables.observeList(Realm.getDefault(), target,
"persons", PersonPhone.class);
}else{
return new EmptyObservableList(Realm.getDefault(), null);
}
}

}

private DataBindingContext m_bindingContext;
private TreeColumn newColumnTreeColumn_4;
private TreeColumn newColumnTreeColumn_3;
private TreeColumn newColumnTreeColumn_2;
private TreeColumn newColumnTreeColumn_1;
private TreeColumn newColumnTreeColumn;
private Tree tree;
private TreeViewer m_personViewer;

private PersonPhoneGroups m_groups = new PersonPhoneGroups();
private Text m_mobile2Text;
private Text m_mobile1Text;
private Text m_phoneText;
private Text m_emailText;
private Text m_nameText;
protected Shell shell;

class TreeLabelProvider implements ITableLabelProvider {
public String getColumnText(Object element, int columnIndex) {
if (columnIndex == 0) {
if (element instanceof PersonPhoneGroup) {
return ((PersonPhoneGroup)element).getName();
} else if (element instanceof PersonPhone) {
return ((PersonPhone)element).getName();
}
} else if (element instanceof PersonPhone) {
PersonPhone person = (PersonPhone) element;
switch (columnIndex) {
case 1:
return person.getEmail();
case 2:
return person.getPhone();
case 3:
return person.getMobilePhone1();
case 4:
return person.getMobilePhone2();
default:
return "";
}
}
return "";
}

public Image getColumnImage(Object element, int columnIndex) {
// TODO Auto-generated method stub
return null;
}

public void addListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub

}

public void dispose() {
// TODO Auto-generated method stub

}

public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
}

public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub

}
}

private void setDefaultValues() {
PersonPhoneGroup group1 = new PersonPhoneGroup("Developer Team");
m_groups.addGroup(group1);
//
PersonPhoneGroup group2 = new PersonPhoneGroup("Management Team");
m_groups.addGroup(group2);
//
PersonPhoneGroup group3 = new PersonPhoneGroup("Support Team");
m_groups.addGroup(group3);

group1.addPersonPhone(new PersonPhone("Konstantin Scheglov",
"kosta@nospam.com",
"1234567890", "", ""));
group1.addPersonPhone(new PersonPhone("Alexander Mitin",
"mitin@nospam.com", "",
"0987654321", ""));
group1.addPersonPhone(new PersonPhone("Alexander Lobas",
"lobas@nospam.com", "",
"", "111-222-333-00"));

group2.addPersonPhone(new PersonPhone("Mike Taylor",
"taylor@instantiations.com",
"503-598-4900", "", ""));
group2.addPersonPhone(new PersonPhone("Eric Clayberg",
"clayberg@instantiations.com", "+1 (503) 598-4900", "", ""));
group2.addPersonPhone(new PersonPhone("Dan Rubel",
"dan@instantiations.com",
"503-598-4900", "", ""));

group3.addPersonPhone(new PersonPhone("Gina Nebling",
"support@instantiations.com", "800-808-3737", "", ""));

}

public static void main(String[] args) {
Display display = new Display();
Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
public void run() {

try {
PhoneBookUsingTreeViewerEx window = new PhoneBookUsingTreeViewerEx();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Open the window
*/
public void open() {
final Display display = Display.getDefault();
setDefaultValues();
createContents();
initDataBindings0();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}

/**
* Create contents of the window
*/
protected void createContents() {
shell = new Shell();
shell.setLayout(new FillLayout());
shell.setSize(789, 517);
shell.setText("Phone Book");

final SashForm sashForm = new SashForm(shell, SWT.VERTICAL);

m_personViewer = new TreeViewer(sashForm, SWT.FULL_SELECTION);
//m_personViewer.setLabelProvider(new TreeLabelProvider());
tree = m_personViewer.getTree();
tree.setLinesVisible(true);
tree.setHeaderVisible(true);

/**
newColumnTreeColumn = new TreeColumn(tree, SWT.NONE);
newColumnTreeColumn.setWidth(148);
newColumnTreeColumn.setText("Name");

newColumnTreeColumn_1 = new TreeColumn(tree, SWT.NONE);
newColumnTreeColumn_1.setWidth(168);
newColumnTreeColumn_1.setText("E-mail");

newColumnTreeColumn_2 = new TreeColumn(tree, SWT.NONE);
newColumnTreeColumn_2.setWidth(119);
newColumnTreeColumn_2.setText("Phone");

newColumnTreeColumn_3 = new TreeColumn(tree, SWT.NONE);
newColumnTreeColumn_3.setWidth(100);
newColumnTreeColumn_3.setText("Mobile Phone 1");

newColumnTreeColumn_4 = new TreeColumn(tree, SWT.NONE);
newColumnTreeColumn_4.setWidth(100);
newColumnTreeColumn_4.setText("Mobile Phone 2");
**/

final Composite detailComposite = new Composite(sashForm, SWT.BORDER);
final GridLayout gridLayout_2 = new GridLayout();
gridLayout_2.numColumns = 2;
detailComposite.setLayout(gridLayout_2);

final Label descriptionLabel = new Label(detailComposite, SWT.NONE);
descriptionLabel.setText("Description:");
new Label(detailComposite, SWT.NONE);

final Label label = new Label(detailComposite, SWT.NONE);
label.setText("Name:");

m_nameText = new Text(detailComposite, SWT.BORDER);
final GridData gd_m_nameText = new GridData(SWT.FILL, SWT.CENTER, true,
false);
m_nameText.setLayoutData(gd_m_nameText);

final Label emailLabel = new Label(detailComposite, SWT.NONE);
emailLabel.setText("E-mail:");

m_emailText = new Text(detailComposite, SWT.BORDER);
final GridData gd_m_emailText = new GridData(SWT.FILL, SWT.CENTER,
true, false);
m_emailText.setLayoutData(gd_m_emailText);

final Label phoneLabel = new Label(detailComposite, SWT.NONE);
phoneLabel.setText("Phone:");

m_phoneText = new Text(detailComposite, SWT.BORDER);
final GridData gd_m_phoneText = new GridData(SWT.FILL, SWT.CENTER,
true, false);
m_phoneText.setLayoutData(gd_m_phoneText);

final Label mobilePhone1Label = new Label(detailComposite, SWT.NONE);
mobilePhone1Label.setText("Mobile Phone 1:");

m_mobile1Text = new Text(detailComposite, SWT.BORDER);
final GridData gd_m_mobile1Text = new GridData(SWT.FILL, SWT.CENTER,
true, false);
m_mobile1Text.setLayoutData(gd_m_mobile1Text);

final Label mobilePhone2Label = new Label(detailComposite, SWT.NONE);
mobilePhone2Label.setText("Mobile Phone 2:");

m_mobile2Text = new Text(detailComposite, SWT.BORDER);
final GridData gd_m_mobile2Text = new GridData(SWT.FILL, SWT.CENTER,
true, false);
m_mobile2Text.setLayoutData(gd_m_mobile2Text);
sashForm.setWeights(new int[] {218, 262 });
m_bindingContext = initDataBindings();
//m_bindingContext = initDataBindings();
//
}

class PersonViewerUpdateValueStrategy extends UpdateValueStrategy {
protected IStatus doSet(IObservableValue observableValue, Object value) {
Realm.getDefault().asyncExec(new Runnable() {
public void run() {
m_personViewer.refresh();
}
});
return super.doSet(observableValue, value);
}
}
protected DataBindingContext initDataBindings() {

ObservableListTreeContentProvider contentProvider =
new ObservableListTreeContentProvider((IObservableFactory)new
PersonPhoneObservableFactory(), null);
m_personViewer.setContentProvider(contentProvider);

IObservableMap[] personViewerLabelProviderMaps00 =
BeansObservables.observeMaps(contentProvider.getKnownElement s(),
PersonPhoneGroups.class, new String[]{"name", "email", "phone",
"mobilePhone1", "mobilePhone2"});
IObservableMap[] personViewerLabelProviderMaps0 =
BeansObservables.observeMaps(contentProvider.getKnownElement s(),
PersonPhoneGroup.class, new String[]{"name", "email", "phone",
"mobilePhone1", "mobilePhone2"});
IObservableMap[] personViewerLabelProviderMaps1 =
BeansObservables.observeMaps(contentProvider.getKnownElement s(),
PersonPhone.class, new String[]{"name", "email", "phone", "mobilePhone1",
"mobilePhone2"});
IObservableMap[] personViewerLabelProviderMaps = new
IObservableMap[personViewerLabelProviderMaps00.length+person ViewerLabelProviderMaps0.length+personViewerLabelProviderMap s1.length];
int count=0;
for(int i=0; i<personViewerLabelProviderMaps00.length; i++){
personViewerLabelProviderMaps[count++] =
personViewerLabelProviderMaps00[i];
}
for(int i=0; i<personViewerLabelProviderMaps0.length; i++){
personViewerLabelProviderMaps[count++] =
personViewerLabelProviderMaps0[i];
}
for(int i=0; i<personViewerLabelProviderMaps1.length; i++){
personViewerLabelProviderMaps[count++] =
personViewerLabelProviderMaps1[i];
}

/**
int mapLength = personViewerLabelProviderMaps.length;
System.out.println(mapLength);
for(int i=0; i<mapLength; i++){
IObservableMap map = personViewerLabelProviderMaps[i];
Set mapKeySet = map.keySet();
Iterator it = mapKeySet.iterator();
boolean go = it.hasNext();
while(go){
Object mapKey = it.next();
Object value = map.get(mapKey);
System.out.println(mapKey+","+value);
go = it.hasNext();
}
if( map instanceof JavaBeanObservableMap ){
JavaBeanObservableMap javaBmap = (JavaBeanObservableMap)map;
}
**/
m_personViewer.setLabelProvider(new
ObservableMapLabelProvider(personViewerLabelProviderMaps));

/**
IObservableMap map =
BeansObservables.observeMap(contentProvider.getKnownElements (),
PersonPhoneGroup.class, "name");
Set mapKeySet = map.keySet();
Iterator it = mapKeySet.iterator();
boolean go = it.hasNext();
while(go){
Object mapKey = it.next();
Object value = map.get(mapKey);
System.out.println(mapKey+","+value);
go = it.hasNext();
}
m_personViewer.setLabelProvider(new ObservableMapLabelProvider(map));
**/
//IObservableMap[] m_personViewerLabelProviderMaps =
BeansObservables.observeMaps(contentProvider.getKnownElement s(),
PersonPhoneGroup.class, new String[]{"persons"});
//m_personViewer.setLabelProvider(new
ObservableMapLabelProvider(m_personViewerLabelProviderMaps)) ;

m_personViewer.setInput(m_groups);

//
DataBindingContext bindingContext = new DataBindingContext();
//
//
return bindingContext;
}

public Image getColumnImage(Object element, int columnIndex) {
// TODO Auto-generated method stub
return null;
}

public void addListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub

}

public void dispose() {
// TODO Auto-generated method stub

}

public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
}

public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub

}

protected DataBindingContext initDataBindings0() {
IObservableValue m_mobile2TextTextObserveWidget =
SWTObservables.observeText(m_mobile2Text, SWT.Modify);
IObservableValue m_mobile1TextTextObserveWidget =
SWTObservables.observeText(m_mobile1Text, SWT.Modify);
IObservableValue m_personViewerSelectionObserveSelection =
ViewersObservables.observeSingleSelection(m_personViewer);
IObservableValue m_personViewerSelectionObserveSelection_1 =
ViewersObservables.observeSingleSelection(m_personViewer);
IObservableValue m_emailTextTextObserveWidget =
SWTObservables.observeText(m_emailText, SWT.Modify);
IObservableValue m_nameTextTextObserveWidget =
SWTObservables.observeText(m_nameText, SWT.Modify);
IObservableValue m_personViewerSelectionObserveSelection_1_1 =
ViewersObservables.observeSingleSelection(m_personViewer);
IObservableValue m_phoneTextTextObserveWidget =
SWTObservables.observeText(m_phoneText, SWT.Modify);
IObservableValue m_personViewerSelectionObserveSelection_1_1_1 =
ViewersObservables.observeSingleSelection(m_personViewer);
IObservableValue m_personViewerSelectionObserveSelection_1_1_1_1 =
ViewersObservables.observeSingleSelection(m_personViewer);
IObservableValue m_personViewerMobilePhone2ObserveDetailValue =
BeansObservables.observeDetailValue(Realm.getDefault(),
m_personViewerSelectionObserveSelection_1, "mobilePhone2",
java.lang.String.class);
IObservableValue m_personViewerMobilePhone1ObserveDetailValue =
BeansObservables.observeDetailValue(Realm.getDefault(),
m_personViewerSelectionObserveSelection_1_1, "mobilePhone1",
java.lang.String.class);
IObservableValue m_personViewerEmailObserveDetailValue =
BeansObservables.observeDetailValue(Realm.getDefault(),
m_personViewerSelectionObserveSelection_1_1_1, "email",
java.lang.String.class);
IObservableValue m_personViewerNameObserveDetailValue =
BeansObservables.observeDetailValue(Realm.getDefault(),
m_personViewerSelectionObserveSelection_1_1_1_1, "name",
java.lang.String.class);
IObservableValue m_personViewerPhoneObserveDetailValue =
BeansObservables.observeDetailValue(Realm.getDefault(),
m_personViewerSelectionObserveSelection, "phone", java.lang.String.class);
//
//
//DataBindingContext bindingContext = new DataBindingContext();
DataBindingContext bindingContext = m_bindingContext;
//
bindingContext.bindValue(m_personViewerNameObserveDetailValu e,
m_nameTextTextObserveWidget, null, new PersonViewerUpdateValueStrategy());
bindingContext.bindValue(m_personViewerEmailObserveDetailVal ue,
m_emailTextTextObserveWidget, null, new PersonViewerUpdateValueStrategy());
bindingContext.bindValue(m_personViewerPhoneObserveDetailVal ue,
m_phoneTextTextObserveWidget, null, new PersonViewerUpdateValueStrategy());
bindingContext.bindValue(m_personViewerMobilePhone1ObserveDe tailValue,
m_mobile1TextTextObserveWidget, null, new
PersonViewerUpdateValueStrategy());
bindingContext.bindValue(m_personViewerMobilePhone2ObserveDe tailValue,
m_mobile2TextTextObserveWidget, null, new
PersonViewerUpdateValueStrategy());
//
return bindingContext;
}

}
Re: Does jface databinding support treeviewer? [message #328567 is a reply to message #328502] Tue, 27 May 2008 18:08 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
> HI,
>
> I already did that but still get error. Please see the source code on my
> post of treeviewer databinding error. I think the problem is that the
> label provider is not generated correctly. Do you have any idea on how
> to create the label provider?
>
> thanks!

I see the problem. In the code that sets up the label providers, you
are using BeansObservables.observeMaps() and specifying
PersonPhone.class as the bean class. However PersonPhoneGroup instances
are not instanceof PersonPhone. Bean properties are not duck-typed so
there has to be common superclass for them.

You can subclass ListeningLabelProvider to accommodate viewers where
elements do not have properties in common. I suggest writing your own
subclass of ListeningLabelProvider which delegates to another label
provider based on the runtime type of the element:

class PersonGroupLabelProvider extends ListeningLabelProvider
implements ITableLabelProvider {
boolean initialized;

IObservableSet personPhoneKnownElements;
IObservableSet personGroupKnownElements;

ObservableMapLabelProvider personPhoneLabelProvider;
ObservableMapLabelProvider personPhoneGroupLabelProvider;

PersonGroupLabelProvider(IObservableSet knownElements) {
super(knownElements);
// Cannot init in the constructor because superconstructor calls
// addListenerTo. That aspect should probably be changed...
}

private void init() {
if (!initialized) {
personPhoneKnownElements = new WritableSet();
IObservableMap[] maps = BeansObservables.observeMaps(
personPhoneKnownElements,
PersonPhone.class,
new String[] { "name", "email", "phone", "mobilePhone1",
"mobilePhone2" } );
personPhoneLabelProvider = new ObservableMapLabelProvider(maps)

personPhoneGroupKnownElements = new WritableSet();
maps = BeansObservables.observeMaps(
personPhoneGroupKnownElements,
PersonPhoneGroup,
new String[] { "name" } );
personPhoneGroupLabelProvider =
new ObservableMapLabelProvider(maps);

initialized = true;
}
}

protected void addListenerTo(Object element) {
init();
if (element instanceof PersonPhone)
personPhoneKnownElements.add(element);
if (element instanceof PersonPhoneGroup)
personPhoneGroupKnownElements.add(element);
}

protected void removeListenerFrom(Object element) {
init();
if (element instanceof PersonPhone)
personPhoneKnownElements.remove(element);
if (element instanceof PersonPhoneGroup)
personPhoneGroupKnownElements.remove(element);
}

public void addListener(ILabelProviderListener listener) {
init();
personPhoneLabelProvider.addListener(listener);
personPhoneGroupLabelProvider.addListener(listener);
}

public void removeListener(ILabelProviderListener listener) {
init();
personPhoneLabelProvider.removeListener(listener);
personPhoneGroupLabelProvider.removeListener(listener);
}

// Implement the ITableLabelProvider methods so they delegate
// to personPhoneLabelProvider if the element is an instance of
// PersonPhone, or to personPhoneGroupLabelProvider if the element is
// an instanceof PersonPhoneGroup.
}

I also noticed that PersonPhoneGroup has several of the PersonPhone
properties, but they are not used. With the above changes you could
eliminate those.

Or you could just go the easy route and extract a common interface
between the two classes, then change the call to
BeansObservables.observeMaps() so it passes the extracted interface
instead of PersonPhone.class:

interface IPersonPhone {
public void setName(String name);
public String getName();

public void setEmail(String email);
// etc
}

Let us know what you decide to do, and how it goes.

Matthew
Re: Does jface databinding support treeviewer? [message #328575 is a reply to message #328567] Tue, 27 May 2008 19:04 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
Hi,

It looks like you found the problem. Before I go ahead to decide what
change I would like to make, I would like to confirm what's the constrains
on using BeansObservables.observeMap() method:

In order to use BeansObservables.observeMap, the model object which
represents the tree must define a common interface for all of the nodes of
the tree even if the nodes of the tree may hold different information or
data. Is the statement right?

thanks a lot.

hao
Re: Does jface databinding support treeviewer? [message #328577 is a reply to message #328575] Tue, 27 May 2008 21:03 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
> Hi,
>
> It looks like you found the problem. Before I go ahead to decide what
> change I would like to make, I would like to confirm what's the
> constrains on using BeansObservables.observeMap() method:
>
> In order to use BeansObservables.observeMap, the model object which
> represents the tree must define a common interface for all of the nodes
> of the tree even if the nodes of the tree may hold different information
> or data. Is the statement right?
>
> thanks a lot.
>
> hao
>

Correct. This constraint is inherited from BeanDescriptor in the JDK.

Matthew
Re: Does jface databinding support treeviewer? [message #328582 is a reply to message #328567] Tue, 27 May 2008 21:43 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
Hi,

I have some questions regarding PersonGroupLabelProvider class
implmentations:

1. For its constructor - PersonGroupLabelProvider(IObservableSet
knownElements), what's the input - knownElements and how could I set it
up? can it be a null. It looks like the class does not use it at all.

2. What does the following call of method BeansObservables.observeMaps()
do to the argument - personPhoneKnownElements? I am trying to understand
why we need to pass a new instance of WritableSet(). I guess it should be
some kind of wrapper of the business model object - PersonPhoneGroups
clas. Actually, it is not. Why?
personPhoneKnownElements = new WritableSet();
IObservableMap[] maps = BeansObservables.observeMaps(
personPhoneKnownElements,
PersonPhone.class,
new String[] { "name", "email", "phone", "mobilePhone1",
"mobilePhone2" }
);

3. I have already implemented ITableLableProvider. Why do I need to
implement PersonGroupLabelProvider instead, just use my original
ITableLableProvider?

Using PersonGroupLabelProvider works for this test case. I just try
convince myself that's the way I must do.

Thanks a lot for your help.
Re: Does jface databinding support treeviewer? [message #328588 is a reply to message #328582] Tue, 27 May 2008 23:58 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
> Hi,
>
> I have some questions regarding PersonGroupLabelProvider class
> implmentations:
>
> 1. For its constructor - PersonGroupLabelProvider(IObservableSet
> knownElements), what's the input - knownElements and how could I set it
> up? can it be a null. It looks like the class does not use it at all.

The input is contentProvider.getKnownElements(), just like with
ObservableMapLabelProvider

> 2. What does the following call of method BeansObservables.observeMaps()
> do to the argument - personPhoneKnownElements? I am trying to understand
> why we need to pass a new instance of WritableSet(). I guess it should
> be some kind of wrapper of the business model object - PersonPhoneGroups
> clas. Actually, it is not. Why? personPhoneKnownElements = new
> WritableSet();
> IObservableMap[] maps = BeansObservables.observeMaps(
> personPhoneKnownElements,
> PersonPhone.class,
> new String[] { "name", "email", "phone", "mobilePhone1",
> "mobilePhone2" } );

personPhoneKnownElements becomes the keySet of the maps in the returned
IObservableMap array. In each map, the value associated with each key
is the value of the named property.

Thus, given a set of users:
{ dave = ["Dave", "dave@example.com", "123-456-7890", null, null],
george = ["George", "george@nonexistent.org", "800-555-5555", null,
null] }

maps[0] == { dave : "Dave", george : "George" }
maps[1] == { dave : "dave@example.com", george : "george@nonexistent.org" }
etc

Thus, when you add or remove an element from the known elements set,
this automatically adds/removes the entry with that key from the
associated IObservableMaps.

The problem in your case is that you have two different types of objects
in your tree: PersonPhone and PersonPhoneGroup. However
BeansObservables.observeMaps(knownElementsSet, PersonPhone.class,
propertyArray) expects knownElementsSet to only contain instances of
PersonPhone. The original known elements set violates this constraint
by containing both types.

The solution I advocated separates the original known elements set into
two separate sets: personPhoneKnownElements (for PersonPhone instances)
and personPhoneGroupKnownElements (for PersonPhoneGroup instances).
These observable sets only contain instances of the correct types, so
they can be safely passed to BeansObservables.observeMaps().

The final part of the solution lies in the behavior of
ListeneingLabelProvider. ListeningLabelProvider calls the
addListenerTo(element) method for every element in the set at the time
of construction. It also registers an ISetChangeListener on the set,
and calls addListenerTo(element) and removeListenerFrom(element)
whenever elements are added to / removed from the set. We implement
these methods in PersonGroupLabelProvider and use instanceof to
determine which observable set the belong to.

> 3. I have already implemented ITableLableProvider. Why do I need to
> implement PersonGroupLabelProvider instead, just use my original
> ITableLableProvider?
>
> Using PersonGroupLabelProvider works for this test case. I just try
> convince myself that's the way I must do.

You need to implement ITableLabelProvider so that the tree viewer will
recognize that your label provider supports columns. It should not be
very involved, you just need to delegate each call to
personPhoneLabelProvider or personPhoneGroupLabelProvider depending on
the runtime type of the element.

Hope this helps.

Matthew
Re: Does jface databinding support treeviewer? [message #328605 is a reply to message #328588] Wed, 28 May 2008 10:22 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
>The input is contentProvider.getKnownElements().
I do not see the elements returned by contentProvider.getKnownElements()
are used in the implementation of PersonGroupLabelProvider. It looks like
the PersonGroupLabelProvider has not relation with the content provider at
all.

>You need to implement ITableLabelProvider so that the tree viewer will
recognize that your label provider supports columns.
Why does PersonGroupLabelProvider need to extends ListeneingLabelProvider?
Is only implementing ITableLabelProvider enough?

Your explanation is very helpful. Thanks a lot.

Hao
Re: Does jface databinding support treeviewer? [message #328616 is a reply to message #328605] Wed, 28 May 2008 17:54 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
>> The input is contentProvider.getKnownElements().
> I do not see the elements returned by contentProvider.getKnownElements()
> are used in the implementation of PersonGroupLabelProvider. It looks
> like the PersonGroupLabelProvider has not relation with the content
> provider at all.

contentProvider.getKnownElements is passed to the ListeningLabelProvider
constructor. If you look at the code in that constructor, you will see
that it is calling addListenerTo for each element in the set. It also
adds an ISetChangeListener to the set so that future additions /
removals in the set will result in a call to addListenerTo() /
removeListenerFrom(), respectively.

This is useful because the set of known elements tells the label
provider exactly what elements are in the viewer. The label provider in
turn adds property change listeners (in the case of beans) to every
element in the set, so that when those properties change it can update
the labels in the viewer. This is the point of the known elements set.

>> You need to implement ITableLabelProvider so that the tree viewer will
> recognize that your label provider supports columns.
> Why does PersonGroupLabelProvider need to extends
> ListeneingLabelProvider? Is only implementing ITableLabelProvider enough?
>
> Your explanation is very helpful. Thanks a lot.
>
> Hao
>

The DataBinding label providers automatically take care of updating
labels in the viewer when the underlying model changes. You could
certainly implement ITableLabelProvider directly, but then you have to
take care of all these details manually. In this case, subclassing
ListeningLabelProvider is convenient because there is already API for
monitoring the known elements set and there is a clear way to be
notified of added and removed elements (addListenerTo / removeListenerFrom).

Matthew
Re: Does jface databinding support treeviewer? [message #328618 is a reply to message #328616] Wed, 28 May 2008 17:32 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
>contentProvider.getKnownElements is passed to the ListeningLabelProvider
constructor....

I am sorry but still confusing about the contectprovider's
getKnowElements(). Let's start with steps of setting those providers:
1. Creat content provider,
2. Set content provider,
3. Create label provider,
4. Set label provider,
5. Set input.

Before the input is set (at step 5), I believe the ObservableSet returned
by contentProvider.getKnownElements() is a empty set. The
PersonGroupLabelProvider implementation actually use another 2 sets of
ObservableSet - personPhoneKnownElements & personPhoneGroupKnownElements.
Only when addListenerTo() method is called the elements are added into the
2 sets of ObservableSet - personPhoneKnownElements &
personPhoneGroupKnownElements. From the implementation of
PersonGroupLabelProvider, I do not see the super class addListenerTo'
addListenerTo() method is got called even when the treeviewer input is set.

Thanks!
hao
Re: Does jface databinding support treeviewer? [message #328621 is a reply to message #328618] Wed, 28 May 2008 20:45 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
>> contentProvider.getKnownElements is passed to the ListeningLabelProvider
> constructor....
>
> I am sorry but still confusing about the contectprovider's
> getKnowElements(). Let's start with steps of setting those providers:
> 1. Creat content provider,
> 2. Set content provider,
> 3. Create label provider,
> 4. Set label provider,
> 5. Set input.
>
> Before the input is set (at step 5), I believe the ObservableSet
> returned by contentProvider.getKnownElements() is a empty set. The
> PersonGroupLabelProvider implementation actually use another 2 sets of
> ObservableSet - personPhoneKnownElements &
> personPhoneGroupKnownElements. Only when addListenerTo() method is
> called the elements are added into the 2 sets of ObservableSet -
> personPhoneKnownElements & personPhoneGroupKnownElements. From the
> implementation of PersonGroupLabelProvider, I do not see the super class
> addListenerTo' addListenerTo() method is got called even when the
> treeviewer input is set.
>
> Thanks!
> hao
>

The known elements set is populated by the content provider when the
viewer elements are first discovered (after you set the input). After
that initial step, the content provider watches the input for additions
/ removals in the collection, and adds / removes elements from the known
elements set accordingly.

Matthew
Re: Does jface databinding support treeviewer? [message #328622 is a reply to message #328616] Wed, 28 May 2008 20:01 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
Another confusion to me, I found that the addListenerTo() method of
PersonGroupLabelProvider which extends ListeningLabelProvider is never got
called by the application. How is the model's elment added into
personPhoneKnownElements and personPhoneGroupKnownElements ObservableSets
and how does the element's change got listened? What's the purpose of
addListenerTo(). I could not find any document and comment on what the
method does. From its name, looks like it adding listner to the element
such that the element's change can be notified. But I went through the
source code and did not find that.

thanks!
hao
Re: Does jface databinding support treeviewer? [message #328623 is a reply to message #328621] Wed, 28 May 2008 20:06 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
If the viewer's elements got into content provider's ObservableSet, how
does the personPhoneKnownElements & personPhoneGroupKnownElements
ObservableSet of label provider got to be populated?
Re: Does jface databinding support treeviewer? [message #328625 is a reply to message #328622] Wed, 28 May 2008 22:55 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
> Another confusion to me, I found that the addListenerTo() method of
> PersonGroupLabelProvider which extends ListeningLabelProvider is never
> got called by the application. How is the model's elment added into
> personPhoneKnownElements and personPhoneGroupKnownElements
> ObservableSets and how does the element's change got listened? What's
> the purpose of addListenerTo(). I could not find any document and
> comment on what the method does. From its name, looks like it adding
> listner to the element such that the element's change can be notified.
> But I went through the source code and did not find that.
>
> thanks!
> hao

Those methods should be getting called. Could you send another
standalone snippet with all your latest changes rolled in?

Matthew
Re: Does jface databinding support treeviewer? [message #328626 is a reply to message #328623] Wed, 28 May 2008 23:04 Go to previous messageGo to next message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
> If the viewer's elements got into content provider's ObservableSet, how
> does the personPhoneKnownElements & personPhoneGroupKnownElements
> ObservableSet of label provider got to be populated?

They are populated in response to a SetChangeEvent on the known elements
set. See ListeningLabelProvider constructor: it adds an
ISetChangeListener that calls addListenerTo() when an element is added,
and calls removeListenerFrom() when an element is removed.

We receive these messages in PersonGroupLabelProvider's addListenerTo()
and removeListenerFrom() methods, and manually add them to / remove them
from either personPhoneKnownElements or personPhonGroupKnownElements,
depending on type.

Matthew
Re: Does jface databinding support treeviewer? [message #328629 is a reply to message #328625] Wed, 28 May 2008 23:45 Go to previous messageGo to next message
Hao Missing name is currently offline Hao Missing nameFriend
Messages: 115
Registered: July 2009
Senior Member
The addListenerTo() of the label provider does get called if I set the
label provider's constructor input as contentprovider.getKnownElements().
Could you please briefly describe what the addListenerTo() of the
listeninglabelprovider does.


Thanks a lot! I hope it is my last question for the post.
Re: Does jface databinding support treeviewer? [message #328649 is a reply to message #328629] Fri, 30 May 2008 05:37 Go to previous message
Matthew Hall is currently offline Matthew HallFriend
Messages: 368
Registered: July 2009
Senior Member
hao wrote:
> The addListenerTo() of the label provider does get called if I set the
> label provider's constructor input as
> contentprovider.getKnownElements(). Could you please briefly describe
> what the addListenerTo() of the listeninglabelprovider does.

The content provider adds and remove elements from the known elements
set as they are added to and removed from the viewer. addListenerTo()
is called for every element as it is first added to the viewer, and
removeListenerFrom() is called for every element as the last instance of
it is removed from the viewer.

The idea is that you should add a listener to the element, and fire a
LabelProviderChangedEvent whenever elements change and should be updated
in the viewer.

Matthew
Previous Topic:fastview position
Next Topic:Extension PopupMenu : Add icon to category menu
Goto Forum:
  


Current Time: Tue Jul 16 15:59:41 GMT 2024

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

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

Back to the top