Java tutorial
/******************************************************************************* * Copyright (c) 2005-2006, Daniel Lutz 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: * Daniel Lutz - initial implementation * G. Weirich - small changes to follow API changes * *******************************************************************************/ package ch.elexis.extdoc.dialogs; import java.io.File; import java.io.FilenameFilter; import java.text.DateFormat; import java.util.Calendar; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.actions.BackgroundJob; import ch.elexis.core.ui.actions.JobPool; import ch.elexis.core.ui.actions.BackgroundJob.BackgroundJobListener; import ch.elexis.core.ui.icons.Images; import ch.elexis.data.Patient; import ch.elexis.extdoc.Messages; import ch.elexis.extdoc.preferences.PreferenceConstants; import ch.elexis.extdoc.util.ListFiles; import ch.elexis.extdoc.util.MatchPatientToPath; import ch.elexis.core.ui.util.SWTHelper; import ch.rgw.tools.StringTool; import ch.elexis.extdoc.util.*; public class VerifierDialog extends TitleAreaDialog { private Patient actPatient; TableViewer viewer; // work-around to get the job // TODO cleaner design BackgroundJob globalJob; class DataLoader extends BackgroundJob { public DataLoader(String jobName) { super(jobName); } public IStatus execute(IProgressMonitor monitor) { List<File> list; String[] paths = PreferenceConstants.getActiveBasePaths(); if (actPatient != null) { result = MatchPatientToPath.getFilesForPatient(actPatient, null); } else { result = Messages.ExterneDokumente_no_patient_found; } return Status.OK_STATUS; } public int getSize() { return 1; } } class VerifierContentProvider implements IStructuredContentProvider, BackgroundJobListener { private String BASE_JOBNAME = Messages.VerifierDialog_verify_job_name; BackgroundJob job; public VerifierContentProvider() { // TODO remove job from JobPool when it has finished. // for now, we just use unique names. String jobName = BASE_JOBNAME + " " + StringTool.unique(BASE_JOBNAME); //$NON-NLS-1$ job = new DataLoader(jobName); globalJob = job; if (JobPool.getJobPool().getJob(job.getJobname()) == null) { JobPool.getJobPool().addJob(job); } job.addListener(this); } public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { job.removeListener(this); // JobPool.getJobPool(). } @SuppressWarnings("unchecked") public Object[] getElements(Object parent) { Object result = job.getData(); if (result == null) { JobPool.getJobPool().activate(job.getJobname(), Job.LONG); return new String[] { Messages.ExterneDokumente_loading }; } else { if (result instanceof List) { return ((List) result).toArray(); } else if (result instanceof String) { return new Object[] { result }; } else { return null; } } } public void jobFinished(BackgroundJob j) { viewer.refresh(true); } } class VerifierLabelProvider extends LabelProvider implements ITableLabelProvider { private static final int STATUS_COLUMN = 0; private static final int DATE_COLUMN = 1; private static final int NAME_COLUMN = 2; public String getColumnText(Object obj, int index) { switch (index) { case DATE_COLUMN: return getDate(obj); case NAME_COLUMN: return getText(obj); } return ""; //$NON-NLS-1$ } public String getText(Object obj) { if (obj instanceof File) { File file = (File) obj; return file.getName(); } else if (obj instanceof String) { return obj.toString(); } else { return ""; //$NON-NLS-1$ } } public String getDate(Object obj) { if (obj instanceof File) { File file = (File) obj; long modified = file.lastModified(); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(modified); String modifiedTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT) .format(cal.getTime()); return modifiedTime; } else { return ""; //$NON-NLS-1$ } } public Image getColumnImage(Object obj, int index) { switch (index) { case STATUS_COLUMN: return Images.IMG_FEHLER.getImage(); case NAME_COLUMN: return getImage(obj); } return null; } public Image getImage(Object obj) { if (!(obj instanceof File)) { return null; } File file = (File) obj; if (file.isDirectory()) { return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); } else { return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE); } } } class TimestampComparator extends ViewerComparator { public int compare(Viewer viewer, Object e1, Object e2) { if (e1 == null) { return 1; } if (e2 == null) { return -1; } File file1 = (File) e1; File file2 = (File) e2; long modified1 = file1.lastModified(); long modified2 = file2.lastModified(); if (modified1 < modified2) { return -1; } else if (modified1 > modified2) { return 1; } else { return 0; } } } public VerifierDialog(Shell parent, Patient patient) { super(parent); actPatient = patient; } @Override protected Control createDialogArea(Composite parent) { parent.setLayout(new GridLayout()); Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); composite.setLayout(new GridLayout()); viewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); Table table = viewer.getTable(); table.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); table.setHeaderVisible(true); table.setLinesVisible(false); TableColumn tc; tc = new TableColumn(table, SWT.LEFT); tc.setText(""); //$NON-NLS-1$ tc.setWidth(40); tc = new TableColumn(table, SWT.LEFT); tc.setText(Messages.ExterneDokumente_file_date); tc.setWidth(120); tc.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { // TODO sort by Datum // http://www.vogella.de/articles/EclipseJFaceTable/article.html#sortcolumns } }); tc = new TableColumn(table, SWT.LEFT); tc.setText(Messages.VerifierDialog_name); tc.setWidth(200); tc.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { // TODO sort by Nummer } }); viewer.setContentProvider(new VerifierContentProvider()); viewer.setLabelProvider(new VerifierLabelProvider()); viewer.setComparator(new TimestampComparator()); viewer.setInput(this); // edit file properties at if double clicked viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { StructuredSelection selection = (StructuredSelection) viewer.getSelection(); if (selection != null) { Object element = selection.getFirstElement(); if (element instanceof File) { openFileEditorDialog((File) element); } } } }); return composite; } private void openFileEditorDialog(File file) { FileEditDialog fed = new FileEditDialog(getShell(), file); fed.open(); refresh(); } private void refresh() { globalJob.invalidate(); viewer.refresh(true); } @Override public void create() { super.create(); setMessage(Messages.ExterneDokumente_verify_files_Belong_to_patient); setTitle(Messages.ExterneDokumente_verify_files); getShell().setText(Messages.ExterneDokumente_verify_files); setTitleImage(Images.IMG_LOGO.getImage()); } }