/******************************************************************************* * Copyright (c) 2013-2014 MEDEVIT. * 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: * MEDEVIT <office@medevit.at> - initial API and implementation ******************************************************************************/ package at.medevit.ch.artikelstamm.elexis.common.ui.cv; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IViewReference; import org.eclipse.ui.PlatformUI; import at.medevit.atc_codes.ATCCodeLanguageConstants; import at.medevit.ch.artikelstamm.ArtikelstammConstants; import at.medevit.ch.artikelstamm.IArtikelstammItem; import at.medevit.ch.artikelstamm.elexis.common.preference.PreferenceConstants; import at.medevit.ch.artikelstamm.elexis.common.ui.ArtikelstammDetailDialog; import at.medevit.ch.artikelstamm.elexis.common.ui.provider.ATCArtikelstammDecoratingLabelProvider; import at.medevit.ch.artikelstamm.elexis.common.ui.provider.LagerhaltungArtikelstammLabelProvider; import ch.artikelstamm.elexis.common.ArtikelstammItem; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.ui.UiDesk; //import ch.elexis.core.ui.actions.AddVerrechenbarContributionItem; import ch.elexis.core.ui.actions.FlatDataLoader; import ch.elexis.core.ui.actions.ScannerEvents; import ch.elexis.core.ui.actions.ToggleVerrechenbarFavoriteAction; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.selectors.FieldDescriptor; import ch.elexis.core.ui.selectors.FieldDescriptor.Typ; import ch.elexis.core.ui.util.viewers.CommonViewer; import ch.elexis.core.ui.util.viewers.SelectorPanelProvider; import ch.elexis.core.ui.util.viewers.SimpleWidgetProvider; import ch.elexis.core.ui.util.viewers.ViewerConfigurer; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldListener; import ch.elexis.core.ui.views.KonsDetailView; import ch.elexis.core.ui.views.codesystems.CodeSelectorFactory; import ch.elexis.data.Konsultation; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; public class ArtikelstammCodeSelectorFactory extends CodeSelectorFactory { private SelectorPanelProvider slp; private int eventType = SWT.KeyDown; private ToggleVerrechenbarFavoriteAction tvfa = new ToggleVerrechenbarFavoriteAction(); private static final String DISP_NAME = "Artikel oder Wirkstoff"; private ISelectionChangedListener selChange = new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event){ TableViewer tv = (TableViewer) event.getSource(); StructuredSelection ss = (StructuredSelection) tv.getSelection(); tvfa.updateSelection(ss.isEmpty() ? null : ss.getFirstElement()); } }; @Override public ViewerConfigurer createViewerConfigurer(CommonViewer cv){ final CommonViewer cov = cv; cov.setSelectionChangedListener(selChange); FieldDescriptor<?>[] fields = { new FieldDescriptor<ArtikelstammItem>(DISP_NAME, ArtikelstammItem.FLD_DSCR, Typ.STRING, null), }; // add keyListener to search field Listener keyListener = new Listener() { @Override public void handleEvent(Event event){ if (event.type == eventType) { if (event.keyCode == SWT.CR || event.keyCode == SWT.KEYPAD_CR) { slp.fireChangedEvent(); } } } }; for (FieldDescriptor<?> fd : fields) { fd.setAssignedListener(eventType, keyListener); } slp = new SelectorPanelProvider(fields, true); slp.addChangeListener(new AControlFieldListener(slp)); Query<ArtikelstammItem> qbe = new Query<ArtikelstammItem>(ArtikelstammItem.class); ArtikelstammFlatDataLoader fdl = new ArtikelstammFlatDataLoader(cv, qbe, slp); MephaPrefferedProviderSorterAction mppsa = new MephaPrefferedProviderSorterAction(fdl); mppsa.setChecked( CoreHub.globalCfg.get(MephaPrefferedProviderSorterAction.CFG_PREFER_MEPHA, false)); SupportedATCFilteringAction safa = new SupportedATCFilteringAction(fdl); List<IAction> actionList = new ArrayList<>(); actionList.add(mppsa); actionList.add(safa); populateSelectorPanel(slp, fdl, actionList); slp.addActions(actionList.toArray(new IAction[actionList.size()])); SimpleWidgetProvider swp = new SimpleWidgetProvider(SimpleWidgetProvider.TYPE_LAZYLIST, SWT.NONE, null); ILabelDecorator decorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(); String atcLang = CoreHub.globalCfg.get(PreferenceConstants.PREF_ATC_CODE_LANGUAGE, ATCCodeLanguageConstants.ATC_LANGUAGE_VAL_GERMAN); ATCArtikelstammDecoratingLabelProvider adlp = new ATCArtikelstammDecoratingLabelProvider( new LagerhaltungArtikelstammLabelProvider(), decorator, atcLang); ViewerConfigurer vc = new ViewerConfigurer(fdl, adlp, // new MedINDEXArticleControlFieldProvider(cv), slp, new ViewerConfigurer.DefaultButtonProvider(), swp, fdl); // the dropdown menu on the viewer MenuManager menu = new MenuManager(); menu.add(new Action( ch.elexis.core.ui.views.artikel.Messages.ArtikelContextMenu_propertiesAction) { { setImageDescriptor(Images.IMG_EDIT.getImageDescriptor()); setToolTipText( ch.elexis.core.ui.views.artikel.Messages.ArtikelContextMenu_propertiesTooltip); } @Override public void run(){ StructuredSelection structuredSelection = new StructuredSelection(cov.getSelection()); Object element = structuredSelection.getFirstElement(); ArtikelstammDetailDialog dd = new ArtikelstammDetailDialog(UiDesk.getTopShell(), (IArtikelstammItem) element); dd.open(); } }); // menu.add(new AddVerrechenbarContributionItem(cov)); MenuManager subMenu = new MenuManager("ATC Gruppen-Selektion", Images.IMG_CATEGORY_GROUP.getImageDescriptor(), null) { @Override public boolean isDynamic(){ return true; } @Override public boolean isVisible(){ StructuredSelection structuredSelection = new StructuredSelection(cov.getSelection()); Object element = structuredSelection.getFirstElement(); if (element instanceof ArtikelstammItem) { ArtikelstammItem ai = (ArtikelstammItem) element; return (ai.getATCCode() != null && ai.getATCCode().length() > 0); } return false; } }; subMenu.add(new ATCMenuContributionItem(cov, fdl)); menu.add(subMenu); menu.add(tvfa); menu.add(new Separator()); menu.add(new VATMenuContributionItem(cov)); cv.setContextMenu(menu); return vc; } @Override public Class<? extends PersistentObject> getElementClass(){ return ArtikelstammItem.class; } @Override public void dispose(){ // TODO Auto-generated method stub } @Override public String getCodeSystemName(){ return ArtikelstammConstants.CODESYSTEM_NAME; } /** * Overwrite to add actions to the selector panel * * @param actionList * * @param slp2 */ public void populateSelectorPanel(SelectorPanelProvider slp, FlatDataLoader fdl, List<IAction> actionList){} private class AControlFieldListener implements ControlFieldListener { private SelectorPanelProvider slp; public AControlFieldListener(SelectorPanelProvider slp){ this.slp = slp; } @Override public void changed(HashMap<String, String> values){ String val = values.get(DISP_NAME); if (val != null && val.length() == 13 && StringUtils.isNumeric(val)) { List<ArtikelstammItem> result = new Query<ArtikelstammItem>(ArtikelstammItem.class, ArtikelstammItem.FLD_GTIN, val).execute(); if (result != null && result.size() == 1) { KonsDetailView detailView = getKonsDetailView(); Konsultation kons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); if (detailView != null && kons != null) { detailView.addToVerechnung(result.get(0)); slp.clearValues(); } else { ScannerEvents.beep(); } } } } private KonsDetailView getKonsDetailView(){ IViewReference[] viewReferences = PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getActivePage().getViewReferences(); for (IViewReference viewRef : viewReferences) { if (KonsDetailView.ID.equals(viewRef.getId())) { return (KonsDetailView) viewRef.getPart(false); } } return null; } @Override public void reorder(String field){} @Override public void selected(){} } }