package ch.elexis.core.ui.laboratory.controls; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.TreeViewerFocusCellManager; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.window.ToolTip; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.model.ILabItem; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.laboratory.actions.LaborResultDeleteAction; import ch.elexis.core.ui.laboratory.actions.LaborResultEditDetailAction; import ch.elexis.core.ui.laboratory.actions.TogglePathologicAction; import ch.elexis.core.ui.laboratory.controls.model.LaborItemResults; import ch.elexis.core.ui.laboratory.controls.util.ChangeNewDateSelection; import ch.elexis.core.ui.laboratory.controls.util.ChangeResultsDateSelection; import ch.elexis.core.ui.laboratory.controls.util.DisplayDoubleClickListener; import ch.elexis.core.ui.laboratory.controls.util.LabResultEditingSupport; import ch.elexis.core.ui.laboratory.controls.util.LaborResultsLabelProvider; import ch.elexis.data.LabItem; import ch.elexis.data.LabResult; import ch.elexis.data.Patient; import ch.elexis.data.Person; import ch.rgw.tools.TimeTool; public class LaborResultsComposite extends Composite { private static Logger logger = LoggerFactory.getLogger(LaborResultsComposite.class); //$NON-NLS-1$ private final FormToolkit tk = UiDesk.getToolkit(); private Form form; private Patient actPatient; private TreeViewer viewer; private TreeViewerFocusCellManager focusCell; private TreeViewerColumn newColumn; private int newColumnIndex; public final static String COLUMN_DATE_KEY = "labresult.date"; //$NON-NLS-1$ private List<TreeViewerColumn> resultColumns = new ArrayList<TreeViewerColumn>(); private LaborResultsContentProvider contentProvider = new LaborResultsContentProvider(); private int columnOffset = 0; private boolean reloadPending; private static final int COLUMNS_PER_PAGE = 7; public LaborResultsComposite(Composite parent, int style){ super(parent, style); createContent(); } public int getColumnOffset(){ return columnOffset; } public void setColumnOffset(int newOffset){ List<TimeTool> dates = contentProvider.getDates(); if (dates.size() <= COLUMNS_PER_PAGE) { columnOffset = 0; } else { if ((newOffset + COLUMNS_PER_PAGE <= dates.size()) && (newOffset >= 0)) { columnOffset = newOffset; } } } private void setInitialColumnOffset(){ List<TimeTool> dates = contentProvider.getDates(); int offset = dates.size() - COLUMNS_PER_PAGE; if (offset > 0) { setColumnOffset(offset); } else { setColumnOffset(0); } } private void createContent(){ setLayout(new GridLayout()); form = tk.createForm(this); form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite body = form.getBody(); body.setLayout(new GridLayout()); viewer = new TreeViewer(body, SWT.FULL_SELECTION | SWT.LEFT | SWT.V_SCROLL | SWT.H_SCROLL); viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); viewer.getTree().setHeaderVisible(true); viewer.getTree().setLinesVisible(true); viewer.setContentProvider(contentProvider); ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE); focusCell = new TreeViewerFocusCellManager(viewer, new FocusCellOwnerDrawHighlighter(viewer)); viewer.addDoubleClickListener(new DisplayDoubleClickListener(this)); final MenuManager mgr = new MenuManager(); mgr.setRemoveAllWhenShown(true); mgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager){ List<LabResult> results = getSelectedResults(); if (results != null) { mgr.add(new TogglePathologicAction(results, viewer)); } if (results != null) { mgr.add(new LaborResultEditDetailAction(results, viewer)); } if (results != null) { mgr.add(new LaborResultDeleteAction(results, viewer)); } } }); viewer.getControl().setMenu(mgr.createContextMenu(viewer.getControl())); TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.NONE); column.getColumn().setWidth(200); column.getColumn().setText(Messages.LaborResultsComposite_columnParameter); column.setLabelProvider(new ColumnLabelProvider() { private StringBuilder sb = new StringBuilder(); @Override public String getText(Object element){ if (element instanceof String) { String groupName = (String) element; if ((groupName.length() > 2) && groupName.charAt(1) == ' ') { groupName = groupName.substring(2); } return groupName; } else if (element instanceof LaborItemResults) { sb.setLength(0); ILabItem item = ((LaborItemResults) element).getFirstResult().getItem(); sb.append(item.getKuerzel()).append(" - ").append(item.getName()).append(" [") //$NON-NLS-1$ //$NON-NLS-2$ .append(item.getUnit()).append("]"); //$NON-NLS-1$ return sb.toString(); } return ""; //$NON-NLS-1$ } }); column = new TreeViewerColumn(viewer, SWT.NONE); column.getColumn().setWidth(100); column.getColumn().setText(Messages.LaborResultsComposite_columnReference); column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element){ if (element instanceof LaborItemResults) { if (actPatient.getGeschlecht().equals(Person.MALE)) { return ((LaborItemResults) element).getFirstResult().getRefMale(); } else { return ((LaborItemResults) element).getFirstResult().getRefFemale(); } } return ""; //$NON-NLS-1$ } }); newColumn = new TreeViewerColumn(viewer, SWT.NONE); newColumn.getColumn().setWidth(5); TimeTool now = new TimeTool(); newColumn.getColumn().setText("Neu (" + now.toString(TimeTool.DATE_GER) + ")"); newColumn.getColumn().setData(COLUMN_DATE_KEY, now); newColumn.getColumn().addSelectionListener(new ChangeNewDateSelection(newColumn, this)); newColumn.setLabelProvider(new LaborResultsLabelProvider(newColumn)); newColumn.setEditingSupport(new LabResultEditingSupport(this, viewer, newColumn)); newColumnIndex = 2; for (int i = 0; i < COLUMNS_PER_PAGE; i++) { column = new TreeViewerColumn(viewer, SWT.NONE); column.getColumn().setWidth(75); column.getColumn().setText(""); //$NON-NLS-1$ column.setLabelProvider(new LaborResultsLabelProvider(column)); column.getColumn().addSelectionListener(new ChangeResultsDateSelection(column, this)); resultColumns.add(column); } } public List<LabResult> getSelectedResults(){ ViewerCell cell = focusCell.getFocusCell(); return getSelectedResults(cell); } private List<LabResult> getSelectedResults(ViewerCell cell){ if (cell != null && cell.getColumnIndex() > 2) { TreeViewerColumn column = resultColumns.get(cell.getColumnIndex() - 3); TimeTool time = (TimeTool) column.getColumn().getData(COLUMN_DATE_KEY); if ((time != null) && (cell.getElement() instanceof LaborItemResults)) { LaborItemResults results = (LaborItemResults) cell.getElement(); return results.getResult(time.toString(TimeTool.DATE_COMPACT)); } } return null; } public String[] getPrintHeaders(){ ArrayList<String> ret = new ArrayList<String>(); TreeColumn[] columns = viewer.getTree().getColumns(); for (TreeColumn treeColumn : columns) { if (treeColumn != newColumn.getColumn()) { ret.add(treeColumn.getText()); } } return ret.toArray(new String[ret.size()]); } public TreeItem[] getPrintRows(){ ArrayList<TreeItem> ret = new ArrayList<TreeItem>(); getAllItems(viewer.getTree(), ret); return ret.toArray(new TreeItem[ret.size()]); } private void getAllItems(Tree tree, List<TreeItem> allItems){ for (TreeItem item : tree.getItems()) { getAllItems(item, allItems); } } private void getAllItems(TreeItem currentItem, List<TreeItem> allItems){ TreeItem[] children = currentItem.getItems(); for (int i = 0; i < children.length; i++) { allItems.add(children[i]); getAllItems(children[i], allItems); } } /** * Reload all content and update the Viewer */ public void reload(){ viewer.getContentProvider().inputChanged(viewer, null, LabResult.getGrouped(actPatient)); for (int i = 0; i < resultColumns.size(); i++) { resultColumns.get(i).getColumn().setData(COLUMN_DATE_KEY, null); resultColumns.get(i).getColumn().setText(""); //$NON-NLS-1$ } List<TimeTool> dates = contentProvider.getDates(); for (int i = 0; i < dates.size() && i < resultColumns.size() && ((i + columnOffset) < dates.size()); i++) { resultColumns.get(i).getColumn() .setText(dates.get(i + columnOffset).toString(TimeTool.DATE_GER)); resultColumns.get(i).getColumn().setData(COLUMN_DATE_KEY, dates.get(i + columnOffset)); } viewer.refresh(); } /** * Reload all content and update the Viewer with the data of the Patient. */ public void selectPatient(Patient patient){ actPatient = patient; if (!isVisible()) { reloadPending = true; return; } setRedraw(false); viewer.setInput(LabResult.getGrouped(actPatient)); TimeTool now = new TimeTool(); newColumn.getColumn().setData(COLUMN_DATE_KEY, now); newColumn.getColumn().setText("Neu (" + now.toString(TimeTool.DATE_GER) + ")"); setInitialColumnOffset(); for (int i = 0; i < resultColumns.size(); i++) { resultColumns.get(i).getColumn().setData(COLUMN_DATE_KEY, null); resultColumns.get(i).getColumn().setText(""); //$NON-NLS-1$ } List<TimeTool> dates = contentProvider.getDates(); for (int i = 0; i < dates.size() && i < resultColumns.size(); i++) { resultColumns.get(i).getColumn() .setText(dates.get(i + columnOffset).toString(TimeTool.DATE_GER)); resultColumns.get(i).getColumn().setData(COLUMN_DATE_KEY, dates.get(i + columnOffset)); } viewer.expandAll(); setRedraw(true); } @Override public boolean setFocus(){ if (reloadPending) { selectPatient(actPatient); reloadPending = false; } return super.setFocus(); } public Patient getPatient(){ return actPatient; } public void expandAll(){ if (viewer != null && !viewer.getControl().isDisposed()) { viewer.expandAll(); } } public void collapseAll(){ if (viewer != null && !viewer.getControl().isDisposed()) { viewer.collapseAll(); } } public void toggleNewColumn(){ if ((newColumn.getColumn().getWidth() > 10)) { newColumn.getColumn().setWidth(5); } else { newColumn.getColumn().setWidth(100); } viewer.refresh(); } public int[] getSkipIndex(){ int[] ret = new int[1]; ret[0] = newColumnIndex; return ret; } }