/******************************************************************************* * Copyright (c) 2006-2015, 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 * M. Descher - several modifications *******************************************************************************/ package ch.elexis.core.ui.views.artikel; import java.util.Hashtable; import java.util.List; 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.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISaveablePart2; import org.eclipse.ui.part.ViewPart; 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.util.Extensions; 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.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; import ch.elexis.core.ui.views.codesystems.CodeSelectorFactory; import ch.rgw.tools.ExHandler; public class ArtikelView extends ViewPart implements IActivationListener, ISaveablePart2 { private static final String KEY_CE = "ce"; //$NON-NLS-1$ private static final String KEY_DETAIL = "detail"; //$NON-NLS-1$ public static final String ID = "ch.elexis.artikelview"; //$NON-NLS-1$ private CTabFolder ctab; private IAction importAction /* ,deleteAction */; private ViewMenus viewmenus; private Hashtable<String, ImporterPage> importers; @Override public void createPartControl(Composite parent){ parent.setLayout(new FillLayout()); ctab = new CTabFolder(parent, SWT.NONE); importers = new Hashtable<String, ImporterPage>(); new FavoritenCTabItem(ctab, SWT.None); addPagesFor(ExtensionPointConstantsUi.VERRECHNUNGSCODE); if (ctab.getItemCount() > 0) { ctab.setSelection(0); } ctab.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ CTabItem selected = ctab.getSelection(); if (selected instanceof FavoritenCTabItem) return; if (selected != null) { String t = selected.getText(); MasterDetailsPage page = (MasterDetailsPage) selected.getControl(); if (page == null) { try { IDetailDisplay det = (IDetailDisplay) selected.getData(KEY_DETAIL); IConfigurationElement ce = (IConfigurationElement) selected.getData(KEY_CE); 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(det.getTitle(), ip); } } page = new MasterDetailsPage(ctab, cs, det); selected.setControl(page); selected.setData(det); } catch (Exception ex) { ExHandler.handle(ex); return; } } importAction.setEnabled(importers.get(t) != null); ViewerConfigurer vc = page.cv.getConfigurer(); vc.getControlFieldProvider().setFocus(); } } }); makeActions(); viewmenus = new ViewMenus(getViewSite()); viewmenus.createMenu(importAction /* ,deleteAction */); GlobalEventDispatcher.addActivationListener(this, this); } private void makeActions(){ importAction = new Action(Messages.ArtikelView_importAction) { @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.ArtikelView_importCaption); 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); } @Override protected void okPressed(){ importer.collect(); super.okPressed(); } } private void addPagesFor(String point){ List<IConfigurationElement> list = Extensions.getExtensions(point); IDetailDisplay d; boolean headerDone = false; for (int i = 0; i < list.size(); i++) { IConfigurationElement ce = list.get(i); try { if (!"Artikel".equals(ce.getName())) continue; // The first page initializes the screen if (!headerDone) { d = (IDetailDisplay) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CDD); 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); } } CodeSelectorFactory csf = (CodeSelectorFactory) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CSF); MasterDetailsPage page = new MasterDetailsPage(ctab, csf, d); CTabItem ct = new CTabItem(ctab, SWT.None); ct.setText(d.getTitle()); ct.setControl(page); ct.setData(d); page.sash.setWeights(new int[] { 30, 70 }); headerDone = true; continue; } d = (IDetailDisplay) ce.createExecutableExtension(ExtensionPointConstantsUi.VERRECHNUNGSCODE_CDD); CTabItem ct = new CTabItem(ctab, SWT.NONE); ct.setText(d.getTitle()); ct.setData(KEY_CE, ce); ct.setData(KEY_DETAIL, d); } catch (Exception ex) { MessageBox mb = new MessageBox(getViewSite().getShell(), SWT.ICON_ERROR | SWT.OK); mb.setText(Messages.ArtikelView_errorCaption); mb.setMessage(Messages.ArtikelView_errorText + ce.getName() + ":\n" //$NON-NLS-1$ + ex.getLocalizedMessage()); mb.open(); } } } @Override public void setFocus(){ if (ctab.getItemCount() > 0) { ctab.setFocus(); } } /* * public void selectionEvent(PersistentObject obj){ CTabItem top = ctab.getSelection(); if (top * != null) { IDetailDisplay ids = (IDetailDisplay) top.getData(); Class cl = * ids.getElementClass(); String o1 = obj.getClass().getName(); String o2 = cl.getName(); if * (o1.equals(o2)) { ids.display(obj); } } * * } */ class MasterDetailsPage extends Composite { SashForm sash; CommonViewer cv; IDetailDisplay detailDisplay; ElexisEventListenerImpl eeli_div; MasterDetailsPage(Composite parent, CodeSelectorFactory master, IDetailDisplay detail){ super(parent, SWT.NONE); eeli_div = new ElexisUiEventListenerImpl(detail.getElementClass(), ElexisEvent.EVENT_SELECTED) { @Override public void runInUi(ElexisEvent ev){ detailDisplay.display(ev.getObject()); } }; setLayout(new FillLayout()); sash = new SashForm(this, SWT.NONE); cv = new CommonViewer(); cv.create(master.createViewerConfigurer(cv), sash, SWT.NONE, getViewSite()); // cv.getViewerWidget().addSelectionChangedListener( // GlobalEventDispatcher.getInstance().getDefaultListener()); /* Composite page= */detail.createDisplay(sash, getViewSite()); cv.getConfigurer().getContentProvider().startListening(); detailDisplay = detail; ElexisEventDispatcher.getInstance().addListeners(eeli_div); } 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(); // ((MasterDetailsPage) ct.getControl()).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){ System.out.println(this.getClass().getName()+" visible "+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; } }