Java tutorial
/******************************************************************************* * Copyright (c) 2007-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.agenda.views; import java.time.LocalDate; import java.util.Arrays; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ITableColorProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import ch.elexis.actions.Activator; import ch.elexis.agenda.BereichSelectionHandler; import ch.elexis.agenda.Messages; import ch.elexis.agenda.data.IPlannable; import ch.elexis.agenda.data.TagesNachricht; import ch.elexis.agenda.data.Termin; import ch.elexis.agenda.preferences.PreferenceConstants; import ch.elexis.agenda.series.SerienTermin; import ch.elexis.agenda.util.Plannables; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.Kontakt; import ch.elexis.data.Patient; import ch.rgw.tools.ExHandler; import ch.rgw.tools.StringTool; import ch.rgw.tools.TimeSpan; import ch.rgw.tools.TimeTool; /** * A larger view for the agenda with more features than the compact "TagesView" * * @author gerry * */ public class AgendaGross extends BaseAgendaView { public static final String ID = "ch.elexis.agenda.largeview"; //$NON-NLS-1$ public static final String CFG_VERTRELATION = "vertrelation"; //$NON-NLS-1$ private static final String SEPARATOR = ","; private static final int[] DEFAULT_COLUMN_WIDTHS = { 60, 60, 105, 80, 300, 200 }; DateTime calendar; Composite cButtons; Text dayMessage; Text terminDetail; Label lbDetails; Label lbDayString; private int[] sashWeights = null; private SashForm sash; private static Button[] bChange; private static final String[] columnTitles = { "von", "bis", "Typ", "Status", "Personalien", "Grund" }; public AgendaGross() { BereichSelectionHandler.addBereichSelectionListener(this); } @Override public void create(Composite parent) { parent.setLayout(new GridLayout()); cButtons = new Composite(parent, SWT.BORDER); RowLayout rl = new RowLayout(); cButtons.setLayout(rl); cButtons.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); sash = new SashForm(parent, SWT.HORIZONTAL); sash.setLayout(new GridLayout()); sash.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); String[] bereiche = CoreHub.globalCfg.get(PreferenceConstants.AG_BEREICHE, Messages.TagesView_14) .split(","); //$NON-NLS-1$ ChangeBereichAdapter chb = new ChangeBereichAdapter(); bChange = new Button[bereiche.length]; for (int i = 0; i < bereiche.length; i++) { bChange[i] = new Button(cButtons, SWT.RADIO); bChange[i].setText(bereiche[i]); bChange[i].addSelectionListener(chb); if (bereiche[i].equals(agenda.getActResource())) { bChange[i].setSelection(true); } } Composite ret = new Composite(sash, SWT.NONE); Composite right = new Composite(sash, SWT.BORDER); ret.setLayout(new GridLayout()); right.setLayout(new GridLayout()); right.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); tv = new TableViewer(ret, SWT.FULL_SELECTION | SWT.SINGLE); tv.getControl().setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); calendar = new DateTime(right, SWT.CALENDAR); calendar.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); calendar.setDate(agenda.getActDate().get(TimeTool.YEAR), agenda.getActDate().get(TimeTool.MONTH), agenda.getActDate().get(TimeTool.DAY_OF_MONTH)); Button bToday = new Button(right, SWT.PUSH); bToday.setText(Messages.AgendaGross_today); bToday.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); bToday.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { TimeTool dat = new TimeTool(); agenda.setActDate(dat); calendar.setDate(dat.get(TimeTool.YEAR), dat.get(TimeTool.MONTH), dat.get(TimeTool.DAY_OF_MONTH)); updateDate(); } }); dayMessage = SWTHelper.createText(right, 4, SWT.V_SCROLL); // set text field's maximum width to the width of the calendar GridData gd = (GridData) dayMessage.getLayoutData(); gd.widthHint = calendar.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; dayMessage.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent arg0) { String tx = dayMessage.getText(); TagesNachricht tn = TagesNachricht.load(agenda.getActDate()); if (tn.exists()) { tn.setLangtext(tx); } else { tn = new TagesNachricht(agenda.getActDate(), " - ", tx); //$NON-NLS-1$ } } }); terminDetail = SWTHelper.createText(right, 5, SWT.NONE); terminDetail.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); lbDetails = new Label(right, SWT.WRAP); lbDetails.setText("-"); //$NON-NLS-1$ lbDetails.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); lbDayString = new Label(ret, SWT.NONE); tv.setLabelProvider(new AgendaLabelProvider()); Table table = tv.getTable(); int[] columnWidths = loadColumnWidths(); for (int i = 0; i < columnTitles.length; i++) { TableColumn tc = new TableColumn(table, SWT.NONE); tc.setText(columnTitles[i]); tc.setWidth(columnWidths[i]); } table.setHeaderVisible(true); makePrivateActions(); calendar.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent arg0) { LocalDate localDate = LocalDate.of(calendar.getYear(), calendar.getMonth() + 1, calendar.getDay()); agenda.setActDate(new TimeTool(localDate)); updateDate(); } }); sash.setWeights(sashWeights == null ? new int[] { 70, 30 } : sashWeights); // set initial widget values initialize(); } /* * Intialize dayMessage field */ protected void initialize() { setDayMessage(); } protected void setDayMessage() { TagesNachricht tn = TagesNachricht.load(agenda.getActDate()); lbDayString.setText(""); //$NON-NLS-1$ dayMessage.setText(""); //$NON-NLS-1$ if (tn.exists()) { lbDayString.setText(tn.getZeile()); dayMessage.setText(tn.getLangtext()); } } protected void updateDate() { setDayMessage(); /* * if (pinger != null) { pinger.doSync(); } */ tv.refresh(); tv.getTable().getColumn(0).pack(); } @Override public void setFocus() { tv.getControl().setFocus(); } @Override public void activation(boolean mode) { super.activation(mode); if (!mode) { saveColumnSizes(); } } private void saveColumnSizes() { if (CoreHub.userCfg.get(PreferenceConstants.AG_BIG_SAVE_COLUMNWIDTH, true)) { StringBuilder sb = new StringBuilder(); TableColumn[] columns = tv.getTable().getColumns(); for (TableColumn tc : columns) { sb.append(tc.getWidth()); sb.append(SEPARATOR); } CoreHub.userCfg.set(PreferenceConstants.AG_BIG_COLUMNWIDTH, sb.toString()); } } private int[] loadColumnWidths() { int colWidth[] = DEFAULT_COLUMN_WIDTHS; // load user preferences if settings require it if (CoreHub.userCfg.get(PreferenceConstants.AG_BIG_SAVE_COLUMNWIDTH, true)) { String defaultColWidths = Arrays.toString(DEFAULT_COLUMN_WIDTHS).replace("[", "").replace("]", ""); String userColWidths = CoreHub.userCfg.get(PreferenceConstants.AG_BIG_COLUMNWIDTH, defaultColWidths); String[] widthStrings = userColWidths.split(SEPARATOR); for (int i = 0; i < widthStrings.length; i++) { colWidth[i] = Integer.parseInt(widthStrings[i].trim()); } } return colWidth; } private class AgendaLabelProvider extends LabelProvider implements ITableColorProvider, ITableLabelProvider { public Color getBackground(Object element, int columnIndex) { if (element instanceof IPlannable) { IPlannable p = (IPlannable) element; if (columnIndex == 3) { return Plannables.getStatusColor(p); } else { return Plannables.getTypColor(p); } } return null; } public Color getForeground(Object element, int columnIndex) { if (element instanceof IPlannable) { IPlannable p = (IPlannable) element; if (columnIndex == 3) { return SWTHelper.getContrast(Plannables.getStatusColor(p)); } else { return SWTHelper.getContrast(Plannables.getTypColor(p)); } } return null; } public Image getColumnImage(Object element, int columnIndex) { if (columnIndex != 4) return null; if (element instanceof IPlannable) { IPlannable ip = (IPlannable) element; if (ip.isRecurringDate()) return UiDesk.getImage(Activator.IMG_RECURRING_DATE); } return null; } public String getColumnText(Object element, int columnIndex) { if (element instanceof IPlannable) { IPlannable ip = (IPlannable) element; switch (columnIndex) { case 0: return Plannables.getStartTimeAsString(ip); case 1: return Plannables.getEndTimeAsString(ip); case 2: return ip.getType(); case 3: return ip.getStatus(); case 4: return ip.isRecurringDate() ? new SerienTermin(ip).getRootTermin().getTitle() : ip.getTitle(); case 5: if (ip instanceof Termin) { Termin termin = (Termin) ip; String grund = termin.getGrund(); if (grund != null) { String[] tokens = grund.split("[\r\n]+"); //$NON-NLS-1$ if (tokens.length > 0) { grund = tokens[0]; } } return grund == null ? "" : grund; //$NON-NLS-1$ } else { return ""; //$NON-NLS-1$ } } } return "?"; //$NON-NLS-1$ } } private class ChangeBereichAdapter extends SelectionAdapter { @Override public void widgetSelected(SelectionEvent ev) { Button source = (Button) ev.getSource(); String bereich = source.getText(); setBereich(bereich); /* * if (pinger != null) { pinger.doSync(); } */ tv.refresh(); } } @Override public void setTermin(Termin t) { Kontakt pat = t.getKontakt(); StringBuilder sb = new StringBuilder(200); TimeSpan ts = t.getTimeSpan(); sb.append(ts.from.toString(TimeTool.TIME_SMALL)).append("-").append(ts.until.toString(TimeTool.TIME_SMALL)) //$NON-NLS-1$ .append(" "); if (t.isRecurringDate()) { sb.append(new SerienTermin(t).getRootTermin().getPersonalia()); } else { sb.append(t.getPersonalia()); } sb.append("\n(") //$NON-NLS-1$ //$NON-NLS-2$ .append(t.getType()).append(",").append(t.getStatus()).append(")\n--------\n").append(t.getGrund()); //$NON-NLS-1$ //$NON-NLS-2$ terminDetail.setText(sb.toString()); sb.setLength(0); sb.append(StringTool.unNull(t.get(Termin.FLD_CREATOR))).append("/") .append(t.getCreateTime().toString(TimeTool.FULL_GER)); lbDetails.setText(sb.toString()); ElexisEventDispatcher.fireSelectionEvent(t); if (pat != null) { ElexisEventDispatcher.fireSelectionEvent(pat); if (pat instanceof Patient) { Konsultation kons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); String sVgl = agenda.getActDate().toString(TimeTool.DATE_COMPACT); if ((kons == null) || // Falls nicht die richtige Kons // selektiert ist, passende // Kons fr heute suchen !(kons.getFall().getPatient().getId().equals(pat.getId())) || !(new TimeTool(kons.getDatum()).toString(TimeTool.DATE_COMPACT).equals(sVgl))) { Fall[] faelle = ((Patient) pat).getFaelle(); TimeTool ttVgl = new TimeTool(); for (Fall f : faelle) { Konsultation[] konsen = f.getBehandlungen(true); for (Konsultation k : konsen) { ttVgl.set(k.getDatum()); if (ttVgl.toString(TimeTool.DATE_COMPACT).equals(sVgl)) { ElexisEventDispatcher.fireSelectionEvent(k); return; } } } } } } } private void makePrivateActions() { newViewAction = new Action(Messages.AgendaGross_newWindow) { @Override public void run() { try { getViewSite().getPage().showView(ID, StringTool.unique("Agenda"), //$NON-NLS-1$ IWorkbenchPage.VIEW_VISIBLE); } catch (PartInitException e) { ExHandler.handle(e); } } }; } @Override public void bereichSelectionEvent(String bereich) { super.bereichSelectionEvent(bereich); for (Button b : bChange) { if (!b.isDisposed()) { if (b.getText().equalsIgnoreCase(bereich)) { b.setSelection(true); } else { b.setSelection(false); } } } } @Override public void saveState(IMemento memento) { int[] w = sash.getWeights(); memento.putString(CFG_VERTRELATION, Integer.toString(w[0]) + StringConstants.COMMA + Integer.toString(w[1])); super.saveState(memento); } @Override public void init(IViewSite site, IMemento memento) throws PartInitException { if (memento == null) { sashWeights = new int[] { 70, 30 }; } else { String state = memento.getString(CFG_VERTRELATION); if (state == null) { state = "70,30"; //$NON-NLS-1$ } String[] sw = state.split(StringConstants.COMMA); sashWeights = new int[] { Integer.parseInt(sw[0]), Integer.parseInt(sw[1]) }; } super.init(site, memento); } }