| Summary: | no result displayed before click after viewerfilter filter text changed! | ||
|---|---|---|---|
| Product: | [RT] RAP | Reporter: | David Song <micromms> |
| Component: | JFace | Assignee: | Project Inbox <rap-inbox> |
| Status: | RESOLVED WORKSFORME | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | ||
| Version: | unspecified | ||
| Target Milestone: | --- | ||
| Hardware: | PC | ||
| OS: | Windows 7 | ||
| Whiteboard: | |||
|
Description
David Song
Song, we have an example of ViewerFilter usage in our Controls Demo (TableViewerTab) that works form me. Could you provide a simple self-running snippet that demonstrate the issue? Song, any progress on the snippet to reproduce the issue? I implement the filter below:
public boolean select(Viewer viewer, Object parentElement,
Object element) {
boolean result = true;
Teacher teacher = (Teacher) element;
if (filterWord != null && filterWord.length() > 0) {
// String lowerCaseText = filterWord.toLowerCase();
// String elementName = teacher.name.toLowerCase();
result = teacher.getRealName().indexOf(filterWord) != -1;
if (!result) {
String name = teacher.getRealName();
result = name.indexOf(filterWord) != -1;
}
if(!result){
String departName = teacher.getDepartment().getTitle();
result = departName.indexOf(filterWord) != -1;
}
if(!result){
String teacherType = teacher.getTeacherType().getTitle();
result = teacherType.indexOf(filterWord) != -1;
}
if( !result ) {
if(teacher.getJobNumber() != null){
String elementSeries = teacher.getJobNumber();
result = elementSeries.indexOf( filterWord ) != -1;
}
}
}
return result;
}
//and use the text to filter
text.addModifyListener(new ModifyListener() {
private static final long serialVersionUID = 8500680599583004777L;
@Override
public void modifyText(ModifyEvent event) {
if(text.getText() !=null && text.getText().length() != 0){
teacherFilter.setText(text.getText());
viewer.refresh();
}else {
teacherFilter.setText(null);
viewer.refresh();
}
}
});
Song, thanks for the snippet. Our implementation in the Controls Demo -> TableViewer tab is almost the same. In order to easy run and debug your snippet could you provide the complete code (project/entry point) than can be used (run) out of the box? Hi Ivan, I wrote a full litte snippet below.
I tested it in all the polular browsers several times, it occurs when the app runs first time, but after I close the viewer or just the browser and open it again, everything is expectant. and the code is as below.
package test;
import java.util.ArrayList;
public class View extends ViewPart {
public View() {
}
public static final String ID = "test.view";
private TableViewer viewer;
private EmployeeFilter filter = new EmployeeFilter();
private Text keyText;
class ViewContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object parent) {
return generateModel().toArray();
}
}
class ViewLabelProvider extends LabelProvider implements
ITableLabelProvider {
public String getColumnText(Object obj, int index) {
if(obj instanceof Employee){
Employee em = (Employee)obj;
switch (index) {
case 0:
return String.valueOf(em.getId());
case 1:
return em.getDepartment().getTitle();
case 2:
return em.getFirstName();
case 3:
return em.getLashName();
case 4:
return em.getEmail();
}
}
return getText(obj);
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
public void createPartControl(Composite parent) {
int style = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL;
parent.setLayout(new GridLayout(1, false));
keyText = new Text(parent, SWT.BORDER);
keyText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
filter.setText(keyText.getText());
viewer.refresh();
}
});
keyText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
viewer = new TableViewer(parent, style);
Table table = viewer.getTable();
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
table.setLinesVisible(true);
table.setHeaderVisible(true);
viewer.addFilter(filter);
TableColumn tblclmnId = new TableColumn(table, SWT.NONE);
tblclmnId.setWidth(50);
tblclmnId.setText("ID");
TableColumn tblclmnDepartment = new TableColumn(table, SWT.NONE);
tblclmnDepartment.setWidth(100);
tblclmnDepartment.setText("Department");
TableColumn tblclmnFirstname = new TableColumn(table, SWT.NONE);
tblclmnFirstname.setWidth(80);
tblclmnFirstname.setText("FirstName");
TableColumn tblclmnLastname = new TableColumn(table, SWT.NONE);
tblclmnLastname.setWidth(80);
tblclmnLastname.setText("LastName");
TableColumn tblclmnEmail = new TableColumn(table, SWT.NONE);
tblclmnEmail.setWidth(150);
tblclmnEmail.setText("Email");
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setInput(getViewSite());
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
class EmployeeFilter extends ViewerFilter {
private String filterWord;
public void setText(String string) {
this.filterWord = string;
}
@Override
public boolean select(Viewer viewer, Object parentElement,
Object element) {
boolean result = true;
Employee emp = (Employee) element;
if (filterWord != null && filterWord.length() > 0) {
result = emp.getFirstName().indexOf(filterWord) != -1;
if (!result) {
String name = emp.getLashName();
result = name.indexOf(filterWord) != -1;
}
if(!result){
String departName = emp.getDepartment().getTitle();
result = departName.indexOf(filterWord) != -1;
}
if(!result){
String teacherType = emp.getEmail();
result = teacherType.indexOf(filterWord) != -1;
}
}
return result;
}
}
public List<Employee> generateModel(){
List<Employee> emps = new ArrayList<Employee>();
Department depart1 = new Department();
depart1.setId(1);
depart1.setTitle("market");
Department depart2 = new Department();
depart2.setId(2);
depart2.setTitle("Tech");
Employee emp1 = new Employee();
emp1.setId(1);
emp1.setFirstName("David");
emp1.setLashName("Smith");
emp1.setEmail("davidsmith@gmail.com");
emp1.setDepartment(depart1);
emps.add(emp1);
emp1 = new Employee();
emp1.setId(2);
emp1.setFirstName("Tom");
emp1.setLashName("Green");
emp1.setEmail("tomgreen@gmail.com");
emp1.setDepartment(depart2);
emps.add(emp1);
return emps;
}
class Department{
private int id;
private String title;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
class Employee{
private int id;
private Department department;
private String firstName;
private String lashName;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLashName() {
return lashName;
}
public void setLashName(String lashName) {
this.lashName = lashName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
}
Song, thanks for the complete snippet. I've tested your snippet with current CVS HEAD (1.5M6) and it's working fine in all browsers - Firefox 11, Chome 18, Safari 5.1.5 and IE9. Which version of RAP are you using? Could you give 1.5M6 a try? Song, as I can't reproduce it against 1.5M6 ( Controls Demo and your snippet ) I will close it as WORKSFORME. Please reopen the bug if the issue is reproducible for you with 1.5M6. |