/******************************************************************************* * Copyright (c) 2006-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.core.ui.views; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Collections; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.NotEnabledException; import org.eclipse.core.commands.NotHandledException; import org.eclipse.core.commands.common.NotDefinedException; import org.eclipse.core.expressions.EvaluationContext; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.ui.ISources; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.part.ViewPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.admin.AccessControlDefaults; import ch.elexis.core.constants.Preferences; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.lock.types.LockResponse; 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.dialogs.DocumentSelectDialog; import ch.elexis.core.ui.dialogs.SelectFallDialog; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.locks.LockResponseHelper; import ch.elexis.core.ui.text.ITextPlugin; import ch.elexis.core.ui.text.ITextPlugin.Parameter; import ch.elexis.core.ui.text.TextContainer; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.ViewMenus; import ch.elexis.data.Brief; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.Kontakt; import ch.elexis.data.Patient; import ch.elexis.data.Person; import ch.rgw.io.FileTool; import ch.rgw.tools.ExHandler; import ch.rgw.tools.MimeTool; public class TextView extends ViewPart implements IActivationListener { public final static String ID = "ch.elexis.TextView"; //$NON-NLS-1$ TextContainer txt; // CommonViewer cv; Composite textContainer = null; private Brief actBrief; private Logger log = LoggerFactory.getLogger("TextView");//$NON-NLS-1$ private IAction briefLadenAction, loadTemplateAction, loadSysTemplateAction, saveTemplateAction, showMenuAction, showToolbarAction, importAction, newDocAction, exportAction; private ViewMenus menus; public TextView(){} @Override public void createPartControl(Composite parent){ txt = new TextContainer(getViewSite()); textContainer = txt.getPlugin().createContainer(parent, new SaveHandler()); if (textContainer == null) { SWTHelper.showError(Messages.TextView_couldNotCreateTextView, Messages.TextView_couldNotLoadTextPlugin); //$NON-NLS-1$ //$NON-NLS-2$ } else { makeActions(); menus = new ViewMenus(getViewSite()); // menus.createToolbar(briefNeuAction); menus.createMenu(newDocAction, briefLadenAction, loadTemplateAction, loadSysTemplateAction, saveTemplateAction, null, showMenuAction, showToolbarAction, null, importAction, exportAction); GlobalEventDispatcher.addActivationListener(this, this); setName(); } } @Override public void setFocus(){ if (textContainer != null) { textContainer.setFocus(); } } public TextContainer getTextContainer(){ return txt; } @Override public void dispose(){ if (actBrief != null) { CoreHub.getLocalLockService().releaseLock(actBrief); } GlobalEventDispatcher.removeActivationListener(this, this); actBrief = null; super.dispose(); } public boolean openDocument(Brief doc){ if (actBrief != null) { CoreHub.getLocalLockService().releaseLock(actBrief); actBrief.save(txt.getPlugin().storeToByteArray(), txt.getPlugin().getMimeType()); } if (doc == null) { return false; } else { // test lock and set read only before opening the Brief LockResponse result = CoreHub.getLocalLockService().acquireLock(doc); if (result.isOk()) { txt.getPlugin().setParameter(null); } else { LockResponseHelper.showInfo(result, doc, log); txt.getPlugin().setParameter(Parameter.READ_ONLY); } } if (txt.open(doc) == true) { log.debug("TextView.openDocument: "); //$NON-NLS-1$ actBrief = doc; setName(); return true; } else { actBrief = null; CoreHub.getLocalLockService().releaseLock(doc); if (CoreHub.localCfg.get(Preferences.P_TEXT_SUPPORT_LEGACY, false) == true) { setName(); String ext = MimeTool.getExtension(doc.getMimeType()); if (ext.length() == 0) { log.warn("TextView.openDocument no extension found for mime type: " + doc.getMimeType()); //$NON-NLS-1$ ext = "odt"; //$NON-NLS-1$ } try { File tmp = File.createTempFile("elexis", "brief." + ext); //$NON-NLS-1$ //$NON-NLS-2$ log.debug("TextView.openDocument createTempFile: " + tmp.getAbsolutePath() + " mime " + doc.getMimeType()); //$NON-NLS-1$ //$NON-NLS-2$ tmp.deleteOnExit(); byte[] buffer = doc.loadBinary(); if (buffer == null) { return false; } ByteArrayInputStream bais = new ByteArrayInputStream(buffer); FileOutputStream fos = new FileOutputStream(tmp); FileTool.copyStreams(bais, fos); File file = new File(tmp.getAbsolutePath()); file.setReadable(true); file.setExecutable(false); file.setWritable(false); return Program.launch(tmp.getAbsolutePath()); } catch (IOException e) { ExHandler.handle(e); } return false; } else { log.warn("TextView.openDocument: Preferences do not allow alternative method of documents created with legacy text-plugins"); //$NON-NLS-1$ // Do not show a message box, as this happens often when you load a document // with an invalid content. Eg. with demoDB and Rezept of Absolut Erfunden return false; } } } /** * Ein Document von Vorlage erstellen. * * @param template * die Vorlage * @param subject * Titel, kann null sein * @return true bei erfolg */ public boolean createDocument(Brief template, String subject){ log.debug("TextView.createDocument: " + subject); //$NON-NLS-1$ if (template == null) { SWTHelper.showError(Messages.TextView_noTemplateSelected, Messages.TextView_pleaseSelectTemplate); //$NON-NLS-1$ //$NON-NLS-2$ return false; } actBrief = txt.createFromTemplate(Konsultation.getAktuelleKons(), template, Brief.UNKNOWN, null, subject); setName(); if (actBrief == null) { return false; } return true; } /** * Ein Document von Vorlage erstellen. Adressat kann hier angegeben werden * * @param template * die Vorlage * @param subject * Titel, kann null sein * @param adressat * der Adressat, der im Dokument angezeigt werden soll * @return true bei erfolg */ public boolean createDocument(Brief template, String subject, Kontakt adressat){ log.debug("TextView.createDocument: " + subject + " Kontakt"); //$NON-NLS-1$ //$NON-NLS-2$ if (template == null) { SWTHelper.showError(Messages.TextView_noTemplateSelected, Messages.TextView_pleaseSelectTemplate); //$NON-NLS-1$ //$NON-NLS-2$ return false; } actBrief = txt.createFromTemplate(Konsultation.getAktuelleKons(), template, Brief.UNKNOWN, adressat, subject); if (CoreHub.localCfg.get(Preferences.P_TEXT_EDIT_LOCAL, false)) { // open for editing ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class); Command command = commandService.getCommand("ch.elexis.core.ui.command.startEditLocalDocument"); //$NON-NLS-1$ EvaluationContext appContext = new EvaluationContext(null, Collections.EMPTY_LIST); appContext.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, new StructuredSelection(actBrief)); ExecutionEvent event = new ExecutionEvent(command, Collections.EMPTY_MAP, this, appContext); try { command.executeWithChecks(event); } catch (ExecutionException | NotDefinedException | NotEnabledException | NotHandledException e) { MessageDialog.openError(getSite().getShell(), Messages.TextView_errortitle, Messages.TextView_errorlocaleditmessage); } getViewSite().getPage().hideView(this); } setName(); if (actBrief == null) { return false; } return true; } private void makeActions(){ briefLadenAction = new Action(Messages.TextView_openLetter) { //$NON-NLS-1$ @Override public void run(){ Patient actPatient = (Patient) ElexisEventDispatcher.getSelected(Patient.class); DocumentSelectDialog bs = new DocumentSelectDialog(getViewSite().getShell(), actPatient, DocumentSelectDialog.TYPE_LOAD_DOCUMENT); if (bs.open() == Dialog.OK) { openDocument(bs.getSelectedDocument()); } } }; loadSysTemplateAction = new Action(Messages.TextView_openSysTemplate) { //$NON-NLS-1$ @Override public void run(){ DocumentSelectDialog bs = new DocumentSelectDialog(getViewSite().getShell(), CoreHub.actMandant, DocumentSelectDialog.TYPE_LOAD_SYSTEMPLATE); if (bs.open() == Dialog.OK) { openDocument(bs.getSelectedDocument()); } } }; loadTemplateAction = new Action(Messages.TextView_openTemplate) { //$NON-NLS-1$ @Override public void run(){ DocumentSelectDialog bs = new DocumentSelectDialog(getViewSite().getShell(), CoreHub.actMandant, DocumentSelectDialog.TYPE_LOAD_TEMPLATE); if (bs.open() == Dialog.OK) { openDocument(bs.getSelectedDocument()); } } }; saveTemplateAction = new Action(Messages.TextView_saveAsTemplate) { //$NON-NLS-1$ @Override public void run(){ if (actBrief != null) { txt.saveTemplate(actBrief.get(Messages.TextView_Subject)); //$NON-NLS-1$ } else { txt.saveTemplate(null); } } }; showMenuAction = new Action(Messages.TextView_showMenu, Action.AS_CHECK_BOX) { //$NON-NLS-1$ public void run(){ txt.getPlugin().showMenu(isChecked()); } }; showToolbarAction = new Action(Messages.TextView_Toolbar, Action.AS_CHECK_BOX) { //$NON-NLS-1$ public void run(){ txt.getPlugin().showToolbar(isChecked()); } }; importAction = new Action(Messages.TextView_importText) { //$NON-NLS-1$ @Override public void run(){ try { FileDialog fdl = new FileDialog(getViewSite().getShell()); String filename = fdl.open(); if (filename != null) { File file = new File(filename); if (file.exists()) { actBrief = null; setPartName(filename); FileInputStream fis = new FileInputStream(file); txt.getPlugin().loadFromStream(fis, false); } } } catch (Throwable ex) { ExHandler.handle(ex); } } }; exportAction = new Action(Messages.TextView_exportText) { //$NON-NLS-1$ @Override public void run(){ try { if (actBrief == null) { SWTHelper.alert("Fehler", //$NON-NLS-1$ "Es ist kein Dokument zum exportieren geladen"); //$NON-NLS-1$ } else { FileDialog fdl = new FileDialog(getViewSite().getShell(), SWT.SAVE); fdl.setFilterExtensions(new String[] { "*.odt", "*.xml", "*.*" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ }); fdl.setFilterNames(new String[] { "OpenOffice.org Text", "XML File", "All files" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ }); String filename = fdl.open(); if (filename != null) { if (FileTool.getExtension(filename).equals("")) { //$NON-NLS-1$ filename += ".odt"; //$NON-NLS-1$ } File file = new File(filename); byte[] contents = actBrief.loadBinary(); ByteArrayInputStream bais = new ByteArrayInputStream(contents); FileOutputStream fos = new FileOutputStream(file); FileTool.copyStreams(bais, fos); fos.close(); bais.close(); } } } catch (Throwable ex) { ExHandler.handle(ex); } } }; newDocAction = new Action(Messages.TextView_newDocument) { //$NON-NLS-1$ { setImageDescriptor(Images.IMG_NEW.getImageDescriptor()); } public void run(){ Patient pat = ElexisEventDispatcher.getSelectedPatient(); if (pat != null) { Fall selectedFall = (Fall) ElexisEventDispatcher.getSelected(Fall.class); if (selectedFall == null) { SelectFallDialog sfd = new SelectFallDialog(UiDesk.getTopShell()); sfd.open(); if (sfd.result != null) { ElexisEventDispatcher.fireSelectionEvent(sfd.result); } else { MessageDialog.openInformation(UiDesk.getTopShell(), Messages.TextView_NoCaseSelected, //$NON-NLS-1$ Messages.TextView_SaveNotPossibleNoCaseAndKonsSelected); //$NON-NLS-1$ return; } } Konsultation selectedKonsultation = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); if (selectedKonsultation == null) { Konsultation k = pat.getLetzteKons(false); if (k == null) { k = ((Fall) ElexisEventDispatcher.getSelected(Fall.class)) .neueKonsultation(); k.setMandant(CoreHub.actMandant); } ElexisEventDispatcher.fireSelectionEvent(k); } actBrief = null; setName(); txt.getPlugin().createEmptyDocument(); } else { MessageDialog.openInformation(UiDesk.getTopShell(), Messages.BriefAuswahlNoPatientSelected, //$NON-NLS-1$ Messages.BriefAuswahlNoPatientSelected); //$NON-NLS-1$ } } }; briefLadenAction.setImageDescriptor(Images.IMG_MAIL.getImageDescriptor()); briefLadenAction.setToolTipText("Brief zum Bearbeiten öffnen"); //$NON-NLS-1$ // briefNeuAction.setImageDescriptor(Hub.getImageDescriptor("rsc/schreiben.gif")); // briefNeuAction.setToolTipText("Einen neuen Brief erstellen"); showMenuAction.setToolTipText(Messages.TextView_showMenuBar); //$NON-NLS-1$ showMenuAction.setImageDescriptor(Images.IMG_MENUBAR.getImageDescriptor()); showMenuAction.setChecked(true); showToolbarAction.setImageDescriptor(Images.IMG_TOOLBAR.getImageDescriptor()); showToolbarAction.setToolTipText(Messages.TextView_showToolbar); //$NON-NLS-1$ showToolbarAction.setChecked(true); } class SaveHandler implements ITextPlugin.ICallback { public void save(){ log.debug("TextView.save"); //$NON-NLS-1$ if (actBrief != null) { actBrief.save(txt.getPlugin().storeToByteArray(), txt.getPlugin().getMimeType()); } } public boolean saveAs(){ log.debug("TextView.saveAs"); //$NON-NLS-1$ InputDialog il = new InputDialog(getViewSite().getShell(), Messages.TextView_saveText, Messages.TextView_enterTitle, "", null); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if (il.open() == Dialog.OK) { actBrief.setBetreff(il.getValue()); return actBrief.save(txt.getPlugin().storeToByteArray(), txt.getPlugin() .getMimeType()); } return false; } } public void activation(boolean mode){ if (mode == false) { if (actBrief != null) { actBrief.save(txt.getPlugin().storeToByteArray(), txt.getPlugin().getMimeType()); } // txt.getPlugin().clear(); } else { loadSysTemplateAction.setEnabled(CoreHub.acl .request(AccessControlDefaults.DOCUMENT_SYSTEMPLATE)); saveTemplateAction.setEnabled(CoreHub.acl .request(AccessControlDefaults.DOCUMENT_TEMPLATE)); } } public void visible(boolean mode){ } void setName(){ String n = ""; //$NON-NLS-1$ if (actBrief == null) { setPartName(Messages.TextView_noLetterSelected); //$NON-NLS-1$ } else { Person pat = actBrief.getPatient(); if (pat != null) { n = pat.getLabel() + ": "; //$NON-NLS-1$ } n += actBrief.getBetreff(); setPartName(n); } log.debug("TextView.setName: " + getPartName()); //$NON-NLS-1$ } }