Java tutorial
/******************************************************************************* * Copyright (c) 2007-2010, G. Weirich and Elexis * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * G. Weirich - initial implementation * *******************************************************************************/ package ch.elexis.notes; import java.util.HashMap; import java.util.List; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ImageHyperlink; import ch.elexis.core.ui.actions.GlobalEventDispatcher; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.viewers.DefaultLabelProvider; /** * The left side of the notes View: Listing of all Notes and Search field * * @author gerry * */ public class NotesList extends Composite { TreeViewer tv; Composite parent; Text tFilter; String filterExpr; NotesFilter notesFilter = new NotesFilter(); HashMap<Note, String> matches = new HashMap<Note, String>(); NotesList(Composite parent) { super(parent, SWT.NONE); setLayout(new GridLayout()); this.parent = parent; Composite cFilter = new Composite(this, SWT.NONE); cFilter.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); cFilter.setLayout(new GridLayout(3, false)); ImageHyperlink clearSearchFieldHyperlink = new ImageHyperlink(cFilter, SWT.NONE); clearSearchFieldHyperlink.setImage(Images.IMG_CLEAR.getImage()); clearSearchFieldHyperlink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { tFilter.setText(""); //$NON-NLS-1$ filterExpr = ""; //$NON-NLS-1$ matches.clear(); tv.collapseAll(); tv.removeFilter(notesFilter); } }); new Label(cFilter, SWT.NONE).setText(Messages.NotesList_searchLabel); tFilter = new Text(cFilter, SWT.SINGLE); tFilter.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); tFilter.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { filterExpr = tFilter.getText().toLowerCase(); matches.clear(); if (filterExpr.length() == 0) { tv.removeFilter(notesFilter); tv.collapseAll(); } else { tv.addFilter(notesFilter); tv.expandAll(); } } }); tv = new TreeViewer(this, SWT.NONE); tv.getControl().setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); tv.setContentProvider(new NotesContentProvider()); tv.setLabelProvider(new DefaultLabelProvider()); tv.setUseHashlookup(true); tv.setInput(parent); tv.addSelectionChangedListener(GlobalEventDispatcher.getInstance().getDefaultListener()); } public void dispose() { tv.removeSelectionChangedListener(GlobalEventDispatcher.getInstance().getDefaultListener()); } class NotesFilter extends ViewerFilter { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (filterExpr.length() == 0) { return true; } boolean bMatch = isMatch((Note) element, filterExpr); if (bMatch) { Note parent = (Note) element; while ((parent = parent.getParent()) != null) { matches.put(parent, filterExpr); } } return bMatch; } private boolean isMatch(Note n, String t) { if (matches.get(n) != null) { return true; } String lbl = n.getLabel().toLowerCase(); if (lbl.startsWith(t) || n.getKeywords().contains(t)) { matches.put(n, t); return true; } List<Note> l = n.getChildren(); for (Note note : l) { if (isMatch(note, t)) { matches.put(n, t); return true; } } return false; } } }