/******************************************************************************* * 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.codesystems; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISaveablePart2; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.statushandlers.StatusManager; import ch.elexis.core.constants.Preferences; 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.ElexisEventListenerImpl; import ch.elexis.core.data.status.ElexisStatus; import ch.elexis.core.data.util.Extensions; import ch.elexis.core.ui.Hub; import ch.elexis.core.ui.actions.GlobalActions; import ch.elexis.core.ui.actions.GlobalEventDispatcher; import ch.elexis.core.ui.actions.IActivationListener; import ch.elexis.core.ui.constants.ExtensionPointConstantsUi; import ch.elexis.core.ui.events.ElexisUiEventListenerImpl; import ch.elexis.core.ui.util.DelegatingSelectionProvider; import ch.elexis.core.ui.util.ImporterPage; import ch.elexis.core.ui.util.ViewMenus; import ch.elexis.core.ui.util.viewers.CommonViewer; import ch.elexis.core.ui.util.viewers.ViewerConfigurer; import ch.elexis.core.ui.views.FavoritenCTabItem; import ch.elexis.core.ui.views.IDetailDisplay; public class CodeDetailView extends ViewPart implements IActivationListener, ISaveablePart2 { public final static String ID = "ch.elexis.codedetailview"; //$NON-NLS-1$ private CTabFolder ctab; private IAction importAction; private ViewMenus viewmenus; private Hashtable<String, ImporterPage> importers; private DelegatingSelectionProvider delegatingSelectionProvider; @Override public void createPartControl(Composite parent){ parent.setLayout(new FillLayout()); ctab = new CTabFolder(parent, SWT.NONE); importers = new Hashtable<String, ImporterPage>(); addAllPages(); if (ctab.getItemCount() > 0) { ctab.setSelection(0); } ctab.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ CTabItem selected = ctab.getSelection(); if (selected != null) { if (selected.getControl() instanceof MasterDetailsPage) { MasterDetailsPage page = (MasterDetailsPage) selected.getControl(); if (page.getCodeSelectorFactory().hasContextMenu()) { page.getCodeSelectorFactory().activateContextMenu(getSite(), delegatingSelectionProvider, ID); } } } if (selected instanceof FavoritenCTabItem) return; if (selected != null) { String t = selected.getText(); importAction.setEnabled(importers.get(t) != null); MasterDetailsPage page = (MasterDetailsPage) selected.getControl(); ViewerConfigurer vc = page.cv.getConfigurer(); vc.getControlFieldProvider().setFocus(); } } }); makeActions(); viewmenus = new ViewMenus(getViewSite()); viewmenus.createMenu(importAction /* ,deleteAction */); GlobalEventDispatcher.addActivationListener(this, this); delegatingSelectionProvider = new DelegatingSelectionProvider(); getSite().setSelectionProvider(delegatingSelectionProvider); } private void makeActions(){ importAction = new Action(Messages.CodeDetailView_importActionTitle) { //$NON-NLS-1$ @Override public void run(){ CTabItem it = ctab.getSelection(); if (it != null) { ImporterPage top = importers.get(it.getText()); if (top != null) { ImportDialog dlg = new ImportDialog(getViewSite().getShell(), top); dlg.create(); dlg.setTitle(top.getTitle()); dlg.setMessage(top.getDescription()); dlg.getShell().setText(Messages.CodeDetailView_importerCaption); //$NON-NLS-1$ if (dlg.open() == Dialog.OK) { top.run(false); } } } } }; } private class ImportDialog extends TitleAreaDialog { ImporterPage importer; public ImportDialog(Shell parentShell, ImporterPage i){ super(parentShell); importer = i; } @Override protected Control createDialogArea(Composite parent){ return importer.createPage(parent); } } private void addAllPages(){ String settings = CoreHub.userCfg.get(Preferences.USR_SERVICES_DIAGNOSES_CODES, null); if (settings == null) { new FavoritenCTabItem(ctab, SWT.None); addPagesFor(ExtensionPointConstantsUi.DIAGNOSECODE); addPagesFor(ExtensionPointConstantsUi.VERRECHNUNGSCODE); addPagesFor(ExtensionPointConstantsUi.GENERICCODE); } else { addUserSpecifiedPages(settings); } } private void addUserSpecifiedPages(String settings){ String[] userSettings = settings.split(","); Map<Integer, IConfigurationElement> iceMap = new TreeMap<Integer, IConfigurationElement>(); iceMap = collectNeededPages(ExtensionPointConstantsUi.DIAGNOSECODE, userSettings, iceMap); iceMap = collectNeededPages(ExtensionPointConstantsUi.VERRECHNUNGSCODE, userSettings, iceMap); iceMap = collectNeededPages(ExtensionPointConstantsUi.GENERICCODE, userSettings, iceMap); // add favorites tab if settings desire it for (int i = 0; i < userSettings.length; i++) { if (userSettings[i].equals("Favoriten")) { iceMap.put(i, null); } } for (Integer key : iceMap.keySet()) { IConfigurationElement ce = iceMap.get(key); if (ce == null) { new FavoritenCTabItem(ctab, SWT.None); continue; } try { IDetailDisplay d = (IDetailDisplay) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CDD); CodeSelectorFactory cs = (CodeSelectorFactory) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CSF); String a = ce.getAttribute(ExtensionPointConstantsUi.VERRECHNUNGSCODE_IMPC); ImporterPage ip = null; if (a != null) { ip = (ImporterPage) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_IMPC); if (ip != null) { importers.put(d.getTitle(), ip); } } MasterDetailsPage page = new MasterDetailsPage(ctab, cs, d); CTabItem ct = new CTabItem(ctab, SWT.NONE); ct.setText(d.getTitle()); ct.setControl(page); ct.setData(d); } catch (Exception ex) { ElexisStatus status = new ElexisStatus(ElexisStatus.WARNING, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE, "Fehler beim Initialisieren von " + ce.getName(), ex, ElexisStatus.LOG_WARNINGS); StatusManager.getManager().handle(status, StatusManager.SHOW); } } } private Map<Integer, IConfigurationElement> collectNeededPages(String point, String[] userSettings, Map<Integer, IConfigurationElement> iceMap){ List<IConfigurationElement> list = Extensions.getExtensions(point); for (IConfigurationElement ce : list) { try { if ("Artikel".equals(ce.getName())) { //$NON-NLS-1$ continue; } IDetailDisplay d = (IDetailDisplay) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CDD); for (int i = 0; i < userSettings.length; i++) { if (userSettings[i].equals(d.getTitle().trim())) { iceMap.put(i, ce); } } } catch (Exception ex) { ElexisStatus status = new ElexisStatus(ElexisStatus.WARNING, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE, "Fehler beim Initialisieren von " + ce.getName(), ex, ElexisStatus.LOG_WARNINGS); StatusManager.getManager().handle(status, StatusManager.SHOW); } } return iceMap; } private void addPagesFor(String point){ List<IConfigurationElement> list = Extensions.getExtensions(point); for (IConfigurationElement ce : list) { try { if ("Artikel".equals(ce.getName())) { //$NON-NLS-1$ continue; } IDetailDisplay d = (IDetailDisplay) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CDD); CodeSelectorFactory cs = (CodeSelectorFactory) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CSF); String a = ce.getAttribute(ExtensionPointConstantsUi.VERRECHNUNGSCODE_IMPC); ImporterPage ip = null; if (a != null) { ip = (ImporterPage) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_IMPC); if (ip != null) { importers.put(d.getTitle(), ip); } } MasterDetailsPage page = new MasterDetailsPage(ctab, cs, d); CTabItem ct = new CTabItem(ctab, SWT.NONE); ct.setText(d.getTitle()); ct.setControl(page); ct.setData(d); } catch (Exception ex) { ElexisStatus status = new ElexisStatus(ElexisStatus.WARNING, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE, "Fehler beim Initialisieren von " + ce.getName(), ex, ElexisStatus.LOG_WARNINGS); StatusManager.getManager().handle(status, StatusManager.SHOW); } } } @Override public void setFocus(){ if (ctab.getItemCount() > 0) { ctab.setFocus(); } } private class MasterDetailsPage extends Composite { private SashForm sash; private CommonViewer cv; private CodeSelectorFactory master; private IDetailDisplay detail; private ElexisEventListenerImpl eeli_div; public MasterDetailsPage(Composite parent, CodeSelectorFactory codeSelectorFactory, IDetailDisplay displayDetail){ super(parent, SWT.NONE); this.detail = displayDetail; this.master = codeSelectorFactory; eeli_div = new ElexisUiEventListenerImpl(detail.getElementClass(), ElexisEvent.EVENT_SELECTED) { @Override public void runInUi(ElexisEvent ev){ detail.display(ev.getObject()); } }; setLayout(new FillLayout()); sash = new SashForm(this, SWT.NONE); cv = new CommonViewer(); cv.setViewName(master.getCodeSystemName()); cv.create(master.createViewerConfigurer(cv), sash, SWT.NONE, getViewSite()); detail.createDisplay(sash, getViewSite()); cv.getConfigurer().getContentProvider().startListening(); ElexisEventDispatcher.getInstance().addListeners(eeli_div); } public CodeSelectorFactory getCodeSelectorFactory(){ return master; } public void dispose(){ ElexisEventDispatcher.getInstance().removeListeners(eeli_div); } } @Override public void dispose(){ GlobalEventDispatcher.removeActivationListener(this, this); if ((ctab != null) && (!ctab.isDisposed())) { for (CTabItem ct : ctab.getItems()) { MasterDetailsPage page = (MasterDetailsPage) ct.getControl(); // page.cv.getViewerWidget().removeSelectionChangedListener( // GlobalEventDispatcher.getInstance().getDefaultListener()); page.cv.getConfigurer().getContentProvider().stopListening(); page.dispose(); } } } /** Vom ActivationListener */ public void activation(boolean mode){ CTabItem selected = ctab.getSelection(); if (selected instanceof FavoritenCTabItem) return; if (selected != null) { MasterDetailsPage page = (MasterDetailsPage) selected.getControl(); ViewerConfigurer vc = page.cv.getConfigurer(); if (mode == true) { vc.getControlFieldProvider().setFocus(); } else { vc.getControlFieldProvider().clearValues(); } } } public void visible(boolean mode){ } /* * Die folgenden 6 Methoden implementieren das Interface ISaveablePart2 Wir benötigen das * Interface nur, um das Schliessen einer View zu verhindern, wenn die Perspektive fixiert ist. * Gibt es da keine einfachere Methode? */ public int promptToSaveOnClose(){ return GlobalActions.fixLayoutAction.isChecked() ? ISaveablePart2.CANCEL : ISaveablePart2.NO; } public void doSave(IProgressMonitor monitor){ /* leer */ } public void doSaveAs(){ /* leer */ } public boolean isDirty(){ return true; } public boolean isSaveAsAllowed(){ return false; } public boolean isSaveOnCloseNeeded(){ return true; } }