ch.elexis.extdoc.dialogs.VerifierDialog.java Source code

Java tutorial

Introduction

Here is the source code for ch.elexis.extdoc.dialogs.VerifierDialog.java

Source

/*******************************************************************************
 * 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());
    }
}