/******************************************************************************* * Copyright (c) 2011-2016 Medevit OG, Medelexis AG * 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: * Marco Descher, initial API and implementaion * Lucia Amman, bug fixes and improvements * Sponsors: M. + P. Richter *******************************************************************************/ package at.medevit.elexis.gdt.ui; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.part.ViewPart; import org.eclipse.wb.swt.ResourceManager; import at.medevit.elexis.gdt.data.GDTProtokoll; import at.medevit.elexis.gdt.ui.table.util.ColumnBuilder; import at.medevit.elexis.gdt.ui.table.util.ColumnBuilder.ICellFormatter; import at.medevit.elexis.gdt.ui.table.util.IValue; import at.medevit.elexis.gdt.ui.table.util.IValueFormatter; import at.medevit.elexis.gdt.ui.table.util.SortColumnComparator; import ch.elexis.core.data.events.ElexisEvent; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.events.ElexisEventListenerImpl; import ch.elexis.core.ui.events.ElexisUiEventListenerImpl; import ch.elexis.data.Patient; import ch.rgw.tools.TimeTool; public class GDTProtokollView extends ViewPart { public static final String ID = "at.medevit.elexis.gdt.ui.GDTProtokollView"; private TableViewer tableViewer; private Table table; private ElexisEventListenerImpl eeli_pat; public GDTProtokollView(){ eeli_pat = new ElexisUiEventListenerImpl(Patient.class) { @Override public void runInUi(ElexisEvent ev){ reload(); } }; ElexisEventDispatcher.getInstance().addListeners(eeli_pat); } public void reload(){ if(!table.isVisible()) return; Patient pat = ElexisEventDispatcher.getSelectedPatient(); if (pat != null) tableViewer.setInput(GDTProtokoll.getEntriesForPatient(pat)); } @Override public void createPartControl(Composite parent){ initTableViewer(parent);// new TableViewerBuilder(parent); ColumnBuilder messageDirection = createColumn(""); messageDirection.bindToProperty("messageDirection"); messageDirection.format(new ICellFormatter() { @Override public void formatCell(ViewerCell cell, Object value){ String direction = (String) value; cell.setText(""); if (direction.equalsIgnoreCase(GDTProtokoll.MESSAGE_DIRECTION_IN)) { cell.setImage(ResourceManager.getPluginImage("at.medevit.elexis.gdt", "rsc/icons/incoming.png")); } else if (direction.equalsIgnoreCase(GDTProtokoll.MESSAGE_DIRECTION_OUT)) { cell.setImage(ResourceManager.getPluginImage("at.medevit.elexis.gdt", "rsc/icons/outgoing.png")); } } }); messageDirection.setPixelWidth(23); messageDirection.build(); ColumnBuilder entryTime = createColumn("Datum/Uhrzeit"); entryTime.bindToProperty("entryTime"); entryTime.format(new IValueFormatter<TimeTool, String>() { @Override public String format(TimeTool obj){ return obj.toString(TimeTool.FULL_GER); } @Override public TimeTool parse(String obj){ return new TimeTool(obj); } }); entryTime.setPercentWidth(15); entryTime.useAsDefaultSortColumn(); entryTime.build(); ColumnBuilder gdtSatz = createColumn("Satzart"); gdtSatz.bindToValue(new BaseValue<GDTProtokoll>() { @Override public Object get(GDTProtokoll entry){ return entry.get(GDTProtokoll.FLD_MESSAGE_TYPE); } }); gdtSatz.setPercentWidth(5); gdtSatz.build(); ColumnBuilder bezeichnung = createColumn("Bezeichnung"); bezeichnung.bindToProperty("bezeichnung"); bezeichnung.makeEditable(); bezeichnung.setPercentWidth(25); bezeichnung.build(); ColumnBuilder bemerkungen = createColumn("Bemerkungen"); bemerkungen.bindToProperty("bemerkungen"); bemerkungen.makeEditable(); bemerkungen.setPercentWidth(25); bemerkungen.build(); ColumnBuilder patient = createColumn("Patient"); patient.bindToProperty("entryRelatedPatient"); patient.format(new IValueFormatter<Patient, String>() { @Override public String format(Patient obj){ return obj.getLabel(); } @Override public Patient parse(String obj){ return null; } }); patient.setPercentWidth(10); patient.build(); ColumnBuilder gegenstelle = createColumn("Gegenstelle"); gegenstelle.bindToProperty("gegenstelle"); gegenstelle.setPercentWidth(15); gegenstelle.build(); tableViewer.setContentProvider(ArrayContentProvider.getInstance()); tableViewer.setInput(null); MenuManager menuManager = new MenuManager(); menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); table.setMenu(menuManager.createContextMenu(table)); getSite().registerContextMenu(menuManager, tableViewer); getSite().setSelectionProvider(tableViewer); } private void initTableViewer(Composite parent){ // check parent if (parent.getChildren().length > 0) { throw new RuntimeException( "The parent composite for the table needs to be empty for TableColumnLayout."); } this.tableViewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); this.table = tableViewer.getTable(); // set TableColumnLayout to table parent this.table.getParent().setLayout(new TableColumnLayout()); // headers / lines visible by default this.table.setHeaderVisible(true); this.table.setLinesVisible(true); // sorting tableViewer.setComparator(new SortColumnComparator()); } @Override public void setFocus(){ reload(); } /** * Creates a new ColumnBuilder that can be used to configure the table column. When you have * finished configuring the column, call build() on the ColumnBuilder to create the actual * column. */ public ColumnBuilder createColumn(String columnHeaderText){ return new ColumnBuilder(tableViewer, columnHeaderText); } /** * Base class for IValue. This is for values you implement yourself. The generic argument T * refers the type of the element this value can be used on. Implementing set is optional. * * @author Ralf Ebert <info@ralfebert.de> */ public abstract class BaseValue<T> implements IValue { @SuppressWarnings("unchecked") public final Object getValue(Object element){ return get((T) element); } @SuppressWarnings("unchecked") public void setValue(Object element, Object value){ set((T) element, value); } public abstract Object get(T element); public Object set(T element, Object value){ throw new UnsupportedOperationException("Overwrite value.set() to set values!"); } } @Override public void dispose(){ ElexisEventDispatcher.getInstance().removeListeners(eeli_pat); super.dispose(); } }