Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 374727

Summary: no result displayed before click after viewerfilter filter text changed!
Product: [RT] RAP Reporter: David Song <micromms>
Component: JFaceAssignee: 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 CLA 2012-03-20 03:01:30 EDT
Build Identifier: Version: Indigo Service Release 2 Build id: 20120216-1857

Hi,
When I changed the filter text value, and the tableviewer display blank rows , After I click the blank row , the result rows displayed.

Reproducible: Always
Comment 1 Ivan Furnadjiev CLA 2012-03-20 04:16:20 EDT
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?
Comment 2 Ivan Furnadjiev CLA 2012-04-03 04:09:36 EDT
Song, any progress on the snippet to reproduce the issue?
Comment 3 David Song CLA 2012-04-03 11:51:28 EDT
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();
				}
			}
		});
Comment 4 Ivan Furnadjiev CLA 2012-04-03 12:11:59 EDT
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?
Comment 5 David Song CLA 2012-04-03 22:29:18 EDT
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;
		}
		
	}
	
}
Comment 6 Ivan Furnadjiev CLA 2012-04-04 02:59:15 EDT
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?
Comment 7 Ivan Furnadjiev CLA 2012-04-04 04:54:33 EDT
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.