/*******************************************************************************
* Copyright (c) 2009-2011, 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.core.ui.util.viewers;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.widgets.Composite;
import ch.elexis.core.ui.selectors.ActiveControl;
import ch.elexis.core.ui.selectors.ActiveControlListener;
import ch.elexis.core.ui.selectors.ComboField;
import ch.elexis.core.ui.selectors.DateField;
import ch.elexis.core.ui.selectors.FieldDescriptor;
import ch.elexis.core.ui.selectors.IntegerField;
import ch.elexis.core.ui.selectors.MoneyField;
import ch.elexis.core.ui.selectors.SelectorPanel;
import ch.elexis.core.ui.selectors.TextField;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldListener;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldProvider;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.rgw.tools.IFilter;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.Tree;
/**
* A ControlFieldProvider that creates a SelectorPanel
*
* @author Gerry Weirich
*
*/
public class SelectorPanelProvider implements ControlFieldProvider {
private LinkedList<ControlFieldListener> listeners = new LinkedList<ControlFieldListener>();
private SelectorPanel panel;
private FieldDescriptor<? extends PersistentObject>[] fields;
private boolean bExclusive = false;
private IAction[] actions = null;;
public SelectorPanelProvider(FieldDescriptor<? extends PersistentObject>[] fields,
boolean bExlusive){
this.fields = fields;
this.bExclusive = bExlusive;
}
public void addActions(IAction... actions){
this.actions = actions;
}
public void addChangeListener(ControlFieldListener cl){
listeners.add(cl);
}
public void clearValues(){
if (panel != null) {
panel.clearValues();
}
}
public Composite createControl(Composite parent){
if (actions == null) {
panel = new SelectorPanel(parent);
} else {
panel = new SelectorPanel(parent, actions);
}
for (FieldDescriptor<? extends PersistentObject> field : fields) {
ActiveControl ac = null;
switch (field.getFieldType()) {
case HYPERLINK:
case STRING:
ac =
new TextField(panel.getFieldParent(), 0, field.getLabel(),
field.getAssignedListenerEventType(), field.getAssignedListener());
break;
case CURRENCY:
ac = new MoneyField(panel.getFieldParent(), 0, field.getLabel());
break;
case DATE:
ac = new DateField(panel.getFieldParent(), 0, field.getLabel());
break;
case COMBO:
ac =
new ComboField(panel.getFieldParent(), 0, field.getLabel(),
(String[]) field.getExtension());
break;
case INT:
ac = new IntegerField(panel.getFieldParent(), 0, field.getLabel());
}
if(ac!=null) {
ac.setData(ActiveControl.PROP_FIELDNAME, field.getFieldname());
ac.setData(ActiveControl.PROP_HASHNAME, field.getHashname());
panel.addField(ac);
}
}
/*
* if (actions != null) { panel.addActions(actions); }
*/
panel.setExclusive(bExclusive);
panel.addSelectorListener(new ActiveControlListener() {
public void contentsChanged(ActiveControl field){
fireChangedEvent();
}
public void titleClicked(ActiveControl field){
fireClickedEvent(field.getLabelText());
}
public void invalidContents(ActiveControl field){
// TODO Auto-generated method stub
}
});
return panel;
}
public IFilter createFilter(){
return new DefaultFilter(panel);
}
public void fireClickedEvent(final String fieldname){
for (ControlFieldListener cl : listeners) {
cl.reorder(fieldname);
}
}
public void fireChangedEvent(){
HashMap<String, String> hv = panel.getValues();
for (ControlFieldListener cl : listeners) {
cl.changed(hv);
}
}
public void fireSortEvent(String text){
for (ControlFieldListener cl : listeners) {
cl.reorder(text);
}
}
public String[] getValues(){
HashMap<String, String> vals = panel.getValues();
String[] ret = new String[fields.length];
for (int i = 0; i < ret.length; i++) {
ret[i] = vals.get(fields[i].getLabel());
}
return ret;
}
public boolean isEmpty(){
HashMap<String, String> vals = panel.getValues();
for (FieldDescriptor<? extends PersistentObject> fd : fields) {
if (vals.get(fd.getLabel()).length() > 0) {
return false;
}
}
return true;
}
public void removeChangeListener(ControlFieldListener cl){
listeners.remove(cl);
}
public void setFocus(){
List<ActiveControl> controls = panel.getControls();
if (controls != null && !controls.isEmpty()) {
// if available set the focus on the first control
controls.get(0).getCtl().setFocus();
} else {
panel.setFocus();
}
}
public void setQuery(final Query<? extends PersistentObject> q){
HashMap<String, String> vals = panel.getValues();
for (FieldDescriptor<? extends PersistentObject> field : fields) {
String name = field.getFieldname();
String value = vals.get(name);
if (!StringTool.isNothing(value)) {
q.add(name, Query.LIKE, value + "%", true);
}
}
}
public SelectorPanel getPanel(){
return panel;
}
static class DefaultFilter extends ViewerFilter implements IFilter {
SelectorPanel slp;
/**
* @param fields
*/
/**
* @param fields
*/
public DefaultFilter(SelectorPanel panel){
slp = panel;
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element){
return select(element);
}
public boolean select(Object element){
PersistentObject po = null;
if (element instanceof Tree) {
po = (PersistentObject) ((Tree) element).contents;
} else if (element instanceof PersistentObject) {
po = (PersistentObject) element;
} else {
return false;
}
HashMap<String, String> vals = slp.getValues();
if (po.isMatching(vals, PersistentObject.MATCH_START, true)) {
return true;
} else {
if (element instanceof Tree) {
Tree p = ((Tree) element).getParent();
if (p == null) {
return false;
}
return select(p);
} else {
return false;
}
}
}
}
}