Java tutorial
/******************************************************************************* * Copyright (c) 2015, Daniel Ludin * 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: * Daniel Ludin (ludin@hispeed.ch) - initial implementation *******************************************************************************/ package ch.gpb.elexis.cst.view.profileeditor; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableFontProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.ui.Hub; import ch.elexis.core.ui.views.TextView; import ch.elexis.data.Brief; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.elexis.omnivore.data.DocHandle; import ch.gpb.elexis.cst.data.CstProfile; import ch.gpb.elexis.cst.preferences.CstPreference; import ch.gpb.elexis.cst.preferences.Messages; import ch.rgw.tools.ExHandler; // TODO: the handling of the omnivore documents is done quick and dirty. There is an API to use these documents, // see i.e. in Labor View, and that should be used here for CST Documents // public class CstDocumentsComposite extends CstComposite { CstProfile aProfile; private Table tableOmnivore; TableViewer tableViewerOmnivore; private Table tableBrief; TableViewer tableViewerBrief; private Action doubleClickAction; private Action briefLadenAction; IViewSite viewsite; private int sortColumn = 0; private boolean sortReverse = false; String sIdentBriefe; String sIdentOmnivore; public CstDocumentsComposite(Composite parent, IViewSite viewsite) { super(parent, SWT.NONE); this.viewsite = viewsite; sIdentBriefe = CoreHub.userCfg.get(CstPreference.CST_IDENTIFIER_BRIEFE, "CST"); sIdentOmnivore = CoreHub.userCfg.get(CstPreference.CST_IDENTIFIER_OMNIVORE, "CST"); GridLayout gridLayout = new GridLayout(1, true); setLayout(gridLayout); Label lblOmnivoreDocs = new Label(this, SWT.NONE); lblOmnivoreDocs.setText(Messages.Cst_Text_cst_documents_tooltip); // Table Omnivore Documents tableViewerOmnivore = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION); tableOmnivore = tableViewerOmnivore.getTable(); tableOmnivore.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); Label lblBriefe = new Label(this, SWT.NONE); lblBriefe.setText(Messages.Cst_Text_cst_documents_tooltip_omnivore); tableViewerOmnivore.setContentProvider(new DocumentsContentProvider()); tableViewerOmnivore.setLabelProvider(new DocumentsLabelProvider()); String[] colLabels = getCategoryColumnLabels(); int columnWidth[] = getCategoryColumnWidth(); CstDocumentsSortListener categorySortListener = new CstDocumentsSortListener(); TableColumn[] cols = new TableColumn[colLabels.length]; for (int i = 0; i < colLabels.length; i++) { cols[i] = new TableColumn(tableOmnivore, SWT.NONE); cols[i].setWidth(columnWidth[i]); cols[i].setText(colLabels[i]); cols[i].setData(new Integer(i)); cols[i].addSelectionListener(categorySortListener); } tableOmnivore.setHeaderVisible(true); tableOmnivore.setLinesVisible(true); tableViewerOmnivore.setInput(this); tableViewerOmnivore.setSorter(new CstDocumentsSorter()); tableOmnivore.setSize(600, 150); GridData gdCstDoc = new GridData(); gdCstDoc.heightHint = 150; gdCstDoc.widthHint = 600; tableOmnivore.setLayoutData(gdCstDoc); // TAble Briefe tableViewerBrief = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION); tableBrief = tableViewerBrief.getTable(); tableBrief.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); tableViewerBrief.setContentProvider(new BriefeContentProvider()); tableViewerBrief.setLabelProvider(new BriefeLabelProvider()); String[] colLabelsBrief = getCategoryColumnLabelsBrief(); int columnWidthBrief[] = getCategoryColumnWidthBrief(); CstBriefeSortListener briefeListener = new CstBriefeSortListener(); TableColumn[] colsBrief = new TableColumn[colLabelsBrief.length]; for (int i = 0; i < colLabelsBrief.length; i++) { colsBrief[i] = new TableColumn(tableBrief, SWT.NONE); colsBrief[i].setWidth(columnWidthBrief[i]); colsBrief[i].setText(colLabelsBrief[i]); colsBrief[i].setData(new Integer(i)); colsBrief[i].addSelectionListener(briefeListener); } tableBrief.setHeaderVisible(true); tableBrief.setLinesVisible(true); tableViewerBrief.setInput(this); tableViewerBrief.setSorter(new CstBriefeSorter()); tableBrief.setSize(600, 150); GridData gdBrief = new GridData(); gdBrief.heightHint = 150; gdBrief.widthHint = 600; tableBrief.setLayoutData(gdBrief); createLayout(this); makeActions(); hookDoubleClickAction(); } // dynamic Layout elements private void createLayout(Composite parent) { } /** * Get the selections from the gui * @param mAuswahl the existing Befunde Auswahl map * @return the updated Befunde map */ public void getSelection(Map<Object, Object> mAuswahl) { } /** * Set the buttons selected according to the map passed as parameter * @param mapAuswahl */ public void setSelection(Map<String, Object> mapAuswahl) { } private void hookDoubleClickAction() { tableViewerOmnivore.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { doubleClickAction.run(); } }); tableViewerBrief.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { briefLadenAction.run(); } }); } private void makeActions() { doubleClickAction = new Action() { public void run() { ISelection selection = tableViewerOmnivore.getSelection(); Object obj = ((IStructuredSelection) selection).getFirstElement(); DocHandle dh = (DocHandle) obj; dh.execute(); } }; briefLadenAction = new Action() { //$NON-NLS-1$ @Override public void run() { ISelection selection = tableViewerBrief.getSelection(); Object obj = ((IStructuredSelection) selection).getFirstElement(); Brief brief = (Brief) obj; /* try { TextView tv = (TextView) viewsite.getPage().showView(TextView.ID); CommonViewer cv = new CommonViewer(); if (brief != null) { if (tv.openDocument(brief) == false) { SWTHelper.alert("Messages.BriefAuswahlErrorHeading", //$NON-NLS-1$ "Messages.BriefAuswahlCouldNotLoadText"); //$NON-NLS-1$ } } else { tv.createDocument(null, null); } cv.notify(CommonViewer.Message.update); } catch (PartInitException e) { ExHandler.handle(e); }*/ try { TextView tv = (TextView) Hub.plugin.getWorkbench().getActiveWorkbenchWindow().getActivePage() .showView(TextView.ID); boolean opened = tv.openDocument(Brief.load(brief.getId())); } catch (PartInitException e) { ExHandler.handle(e); } catch (Exception e) { log.error("cannot open letter: " + e.getMessage()); } } }; } public void clear() { tableViewerOmnivore.getTable().clearAll(); tableViewerOmnivore.refresh(); tableViewerBrief.refresh(); } /** * letters are searched for a configurable String in their concern, typically "CST" * * @return a list of CST related letter */ private List<Brief> loadCstBriefe() { Patient actPat = (Patient) ElexisEventDispatcher.getSelected(Patient.class); if (actPat != null) { sIdentBriefe = CoreHub.userCfg.get(CstPreference.CST_IDENTIFIER_BRIEFE, "CST"); Query<Brief> qbe = new Query<Brief>(Brief.class); qbe.add(Brief.FLD_PATIENT_ID, Query.EQUALS, actPat.getId()); List<Brief> listResult = new ArrayList<>(); List<Brief> list = qbe.execute(); for (Brief brief : list) { // TODO: this must be configurable (Preferences) if (brief.getBetreff().toLowerCase().indexOf(sIdentBriefe.toLowerCase()) > -1) { listResult.add(brief); } } return listResult; } return new ArrayList<Brief>(); } /** * Omnivore documents are searched for a configurable category, typically "CST" * * @return a list of CST related Omnivore documents */ private List<DocHandle> loadCstdocsOmnivore() { sIdentOmnivore = CoreHub.userCfg.get(CstPreference.CST_IDENTIFIER_OMNIVORE, "CST"); Patient pat = ElexisEventDispatcher.getSelectedPatient(); if (pat == null) { ArrayList<DocHandle> emptyList = new ArrayList<DocHandle>(); return emptyList; } List<DocHandle> ret = new LinkedList<DocHandle>(); String cat = sIdentOmnivore; Query<DocHandle> qbe = new Query<DocHandle>(DocHandle.class); qbe.add(DocHandle.FLD_PATID, Query.EQUALS, pat.getId()); qbe.add(DocHandle.FLD_CAT, Query.EQUALS, cat); List<DocHandle> root = qbe.execute(); ret.addAll(root); return ret; } private String[] getCategoryColumnLabels() { String columnLabels[] = { "Category", "Date", "Titel", "MIME Type" }; return columnLabels; } private String[] getCategoryColumnLabelsBrief() { String columnLabels[] = { "Date", "Betreff", "MIME Type", "Typ" }; return columnLabels; } class BriefeContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { List<Brief> result = loadCstBriefe(); return result.toArray(); } } class BriefeLabelProvider extends LabelProvider implements ITableLabelProvider, ITableFontProvider, IColorProvider { public String getColumnText(Object obj, int index) { Brief docHandle = (Brief) obj; switch (index) { case 0: return docHandle.getDatum(); case 1: return docHandle.getBetreff(); case 2: return docHandle.getTyp(); case 3: return docHandle.getMimeType(); default: return ""; } } public Image getColumnImage(Object obj, int index) { return null; } public Font getFont(Object element, int columnIndex) { Font font = null; return font; } @Override public Color getForeground(Object element) { return null; } @Override public Color getBackground(Object element) { return null; } } private int[] getCategoryColumnWidth() { int columnWidth[] = { 80, 200, 100, 100 }; return columnWidth; } private int[] getCategoryColumnWidthBrief() { int columnWidth[] = { 80, 200, 100, 100 }; return columnWidth; } class DocumentsContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { List<DocHandle> result = loadCstdocsOmnivore(); return result.toArray(); } } class DocumentsLabelProvider extends LabelProvider implements ITableLabelProvider, ITableFontProvider, IColorProvider { public String getColumnText(Object obj, int index) { DocHandle docHandle = (DocHandle) obj; switch (index) { case 0: return docHandle.getCategoryName(); case 1: return docHandle.getDate(); case 2: return docHandle.getTitle(); case 3: return docHandle.getMimetype(); default: return ""; } } public Image getColumnImage(Object obj, int index) { return null; } public Font getFont(Object element, int columnIndex) { Font font = null; return font; } @Override public Color getForeground(Object element) { return null; } @Override public Color getBackground(Object element) { return null; } } class CstDocumentsSortListener extends SelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { TableColumn col = (TableColumn) e.getSource(); Integer colNo = (Integer) col.getData(); if (colNo != null) { if (colNo == sortColumn) { sortReverse = !sortReverse; } else { sortReverse = false; sortColumn = colNo; } tableViewerOmnivore.refresh(); } } } class CstDocumentsSorter extends ViewerSorter { @Override public int compare(Viewer viewer, Object e1, Object e2) { if ((e1 instanceof DocHandle) && (e2 instanceof DocHandle)) { DocHandle d1 = (DocHandle) e1; DocHandle d2 = (DocHandle) e2; String c1 = ""; String c2 = ""; switch (sortColumn) { case 1: c1 = d1.getDate(); c2 = d2.getDate(); break; case 2: c1 = d1.getTitle(); c2 = d2.getTitle(); break; case 3: c1 = d1.getMimetype(); c2 = d2.getMimetype(); break; } if (sortReverse) { return c1.compareTo(c2); } else { return c2.compareTo(c1); } } return 0; } } class CstBriefeSortListener extends SelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { TableColumn col = (TableColumn) e.getSource(); Integer colNo = (Integer) col.getData(); if (colNo != null) { if (colNo == sortColumn) { sortReverse = !sortReverse; } else { sortReverse = false; sortColumn = colNo; } tableViewerBrief.refresh(); } } } class CstBriefeSorter extends ViewerSorter { @Override public int compare(Viewer viewer, Object e1, Object e2) { if ((e1 instanceof Brief) && (e2 instanceof Brief)) { Brief d1 = (Brief) e1; Brief d2 = (Brief) e2; String c1 = ""; String c2 = ""; switch (sortColumn) { case 0: c1 = d1.getDatum(); c2 = d2.getDatum(); break; case 1: c1 = d1.getBetreff(); c2 = d2.getBetreff(); break; case 2: c1 = d1.getTyp(); c2 = d2.getTyp(); case 3: c1 = d1.getMimeType(); c2 = d2.getMimeType(); break; } if (sortReverse) { return c1.compareTo(c2); } else { return c2.compareTo(c1); } } return 0; } } }