/******************************************************************************* * Copyright (c) 2007-2010, 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.notes; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEvent; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.events.ElexisEventListener; import ch.elexis.core.data.services.GlobalServiceDescriptors; import ch.elexis.core.data.util.Extensions; import ch.elexis.core.text.model.Samdas; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.actions.GlobalEventDispatcher; import ch.elexis.core.ui.actions.IActivationListener; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.text.ExternalLink; import ch.elexis.core.ui.util.SWTHelper; import ch.rgw.compress.CompEx; import ch.rgw.tools.ExHandler; import ch.rgw.tools.Result; /** * The eclipse View for the notes. Contains a master-Part (NotesList) and a details-part * (NotesDetail) * * @author gerry * */ public class NotesView extends ViewPart implements IActivationListener, ElexisEventListener { static final String ID = "ch.elexis.notes.view"; //$NON-NLS-1$ ScrolledForm fMaster; NotesList master; NotesDetail detail; boolean hasScanner = false; private IAction newCategoryAction, newNoteAction, delNoteAction, scanAction; FormToolkit tk = UiDesk.getToolkit(); @Override public void createPartControl(Composite parent){ SashForm sash = new SashForm(parent, SWT.HORIZONTAL); fMaster = tk.createScrolledForm(sash); fMaster.getBody().setLayout(new GridLayout()); master = new NotesList(fMaster.getBody()); master.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); detail = new NotesDetail(sash); // detail.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); makeActions(); fMaster.setText(Messages.NotesView_categories); if (hasScanner) { fMaster.getToolBarManager().add(scanAction); fMaster.getToolBarManager().add(new Separator()); } fMaster.getToolBarManager().add(newCategoryAction); fMaster.getToolBarManager().add(newNoteAction); fMaster.getToolBarManager().add(delNoteAction); fMaster.getToolBarManager().add(new Separator()); newNoteAction.setEnabled(false); detail.setEnabled(false); GlobalEventDispatcher.addActivationListener(this, getViewSite().getPart()); fMaster.updateToolBar(); sash.setWeights(new int[] { 3, 7 }); // fDetail.updateToolBar(); // fDetail.reflow(true); } public void dispose(){ GlobalEventDispatcher.removeActivationListener(this, getViewSite().getPart()); } @Override public void setFocus(){ // TODO Auto-generated method stub } public void activation(boolean mode){} public void visible(boolean mode){ if (mode) { ElexisEventDispatcher.getInstance().addListeners(this); } else { ElexisEventDispatcher.getInstance().removeListeners(this); } } private void makeActions(){ newCategoryAction = new Action(Messages.NotesView_newCategory) { { setToolTipText(Messages.NotesView_createMainCategoryTootltip); setImageDescriptor(Images.IMG_NEW.getImageDescriptor()); } public void run(){ InputDialog id = new InputDialog(getViewSite().getShell(), Messages.NotesView_createMainCategoryDlgTitle, Messages.NotesView_createMainCategoryDlgMessage, "", null); //$NON-NLS-1$ if (id.open() == Dialog.OK) { /* Note note= */new Note(null, id.getValue(), ""); //$NON-NLS-1$ master.tv.refresh(); } } }; newNoteAction = new Action(Messages.NotesView_newNoteCaption) { { setToolTipText(Messages.NotesView_newNoteTooltip); setImageDescriptor(Images.IMG_ADDITEM.getImageDescriptor()); } public void run(){ Note act = (Note) ElexisEventDispatcher.getSelected(Note.class); if (act != null) { InputDialog id = new InputDialog(getViewSite().getShell(), Messages.NotesView_newNoteDlgTitle, Messages.NotesView_newNoteDlgMessage, "", null); //$NON-NLS-1$ if (id.open() == Dialog.OK) { /* Note note= */new Note(act, id.getValue(), ""); //$NON-NLS-1$ master.tv.refresh(); } } } }; delNoteAction = new Action(Messages.NotesView_deleteActionCaption) { { setToolTipText(Messages.NotesView_deleteActionTooltip); setImageDescriptor(Images.IMG_DELETE.getImageDescriptor()); } public void run(){ Note act = (Note) ElexisEventDispatcher.getSelected(Note.class); if (act != null) { if (SWTHelper.askYesNo(Messages.NotesView_deleteConfirmDlgTitle, Messages.NotesView_deleteConfirmDlgMessage)) { act.delete(); master.tv.refresh(); } } } }; // Check if there is a scanner service available and if so, create a // "Scan" button if (Extensions.isServiceAvailable(GlobalServiceDescriptors.SCAN_TO_PDF)) { hasScanner = true; scanAction = new Action(Messages.NotesView_scabCaption) { { setToolTipText(Messages.NotesView_scanTooltip); ImageDescriptor imgScanner = AbstractUIPlugin.imageDescriptorFromPlugin("ch.elexis.notes", //$NON-NLS-1$ "icons" + File.separator + "scanner.ico"); //$NON-NLS-1$ //$NON-NLS-2$ setImageDescriptor(imgScanner); } public void run(){ try { Object scanner = Extensions.findBestService(GlobalServiceDescriptors.SCAN_TO_PDF); if (scanner != null) { Result<byte[]> res = (Result<byte[]>) Extensions.executeService(scanner, "acquire", //$NON-NLS-1$ new Class[0], new Object[0]); if (res.isOK()) { Note act = (Note) ElexisEventDispatcher.getSelected(Note.class); byte[] pdf = res.get(); InputDialog id = new InputDialog(getViewSite().getShell(), Messages.NotesView_importDocuDlgTitle, Messages.NotesView_importDocDlgMessage, "", null); //$NON-NLS-1$ if (id.open() == Dialog.OK) { String name = id.getValue(); String basedir = CoreHub.localCfg.get(Preferences.CFGTREE, null); if (basedir == null) { SWTHelper.alert(Messages.NotesView_badBaseDirectoryTitle, Messages.NotesView_badBaseDirectoryMessage); return; } File file = new File(basedir, name.replaceAll("\\s", "_") //$NON-NLS-1$ //$NON-NLS-2$ + ".pdf"); //$NON-NLS-1$ if (!file.createNewFile()) { SWTHelper.alert(Messages.NotesView_importErrorTitle, "Kann Datei " + file.getAbsolutePath() + " nicht schreiben"); return; } FileOutputStream fout = new FileOutputStream(file); BufferedOutputStream bout = new BufferedOutputStream(fout); bout.write(pdf); bout.close(); Samdas samdas = new Samdas(name); Samdas.Record record = samdas.getRecord(); Samdas.XRef xref = new Samdas.XRef(ExternalLink.ID, file.getAbsolutePath(), 0, name.length()); record.add(xref); XMLOutputter xo = new XMLOutputter(Format.getRawFormat()); String cnt = xo.outputString(samdas.getDocument()); byte[] nb = CompEx.Compress(cnt.getBytes("utf-8"), CompEx.ZIP); //$NON-NLS-1$ /* Note note= */new Note(act, name, nb, "text/xml"); //$NON-NLS-1$ master.tv.refresh(); } } } } catch (Exception ex) { ExHandler.handle(ex); SWTHelper .showError(Messages.NotesView_importErrorDlgTitle, ex.getMessage()); } } }; } } public void catchElexisEvent(final ElexisEvent ev){ UiDesk.asyncExec(new Runnable() { public void run(){ if (ev.getType() == ElexisEvent.EVENT_SELECTED) { Note note = (Note) ev.getObject(); detail.setEnabled(true); detail.setNote(note); newNoteAction.setEnabled(true); } else if (ev.getType() == ElexisEvent.EVENT_DESELECTED) { newNoteAction.setEnabled(false); } } }); } private final ElexisEvent eetmpl = new ElexisEvent(null, Note.class, ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_DESELECTED); public ElexisEvent getElexisEventFilter(){ return eetmpl; } }