package at.medevit.ch.artikelstamm.medcalendar.ui; import java.util.ArrayList; import java.util.List; 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.resource.ImageDescriptor; 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.graphics.Image; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.PlatformUI; import org.eclipse.wb.swt.ResourceManager; import at.medevit.ch.artikelstamm.IArtikelstammItem; import at.medevit.ch.artikelstamm.elexis.common.ui.ArtikelstammDetailDialog; import at.medevit.ch.artikelstamm.elexis.common.ui.cv.ArtikelstammCodeSelectorFactory; import at.medevit.ch.artikelstamm.elexis.common.ui.cv.VATMenuContributionItem; import at.medevit.ch.artikelstamm.elexis.common.ui.provider.LagerhaltungArtikelstammLabelProvider; import at.medevit.ch.artikelstamm.medcalendar.action.MephaPrefferedProviderSorterAction; import at.medevit.ch.artikelstamm.medcalendar.ui.provider.MedCalArtikelstammFlatDataLoader; import at.medevit.ch.artikelstamm.medcalendar.ui.provider.MedCalDecoratingLabelProvider; import ch.artikelstamm.elexis.common.ArtikelstammItem; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.UiDesk; 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.data.Query; public class MedCalArtikelstammCodeSelectorFactory extends ArtikelstammCodeSelectorFactory { private SelectorPanelProvider slp; private int eventType = SWT.KeyDown; private ToggleVerrechenbarFavoriteAction tvfa = new ToggleVerrechenbarFavoriteAction(); 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>("Artikel oder Wirkstoff", 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); Query<ArtikelstammItem> qbe = new Query<ArtikelstammItem>(ArtikelstammItem.class); MedCalArtikelstammFlatDataLoader fdl = new MedCalArtikelstammFlatDataLoader(cv, qbe, slp); MephaPrefferedProviderSorterAction mppsa = new MephaPrefferedProviderSorterAction(fdl); mppsa.setChecked(CoreHub.globalCfg.get(MephaPrefferedProviderSorterAction.CFG_PREFER_MEPHA, false)); List<IAction> actionList = new ArrayList<>(); actionList.add(mppsa); 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(); MedCalDecoratingLabelProvider mcdlp = new MedCalDecoratingLabelProvider(new LagerhaltungArtikelstammLabelProvider(), decorator); ViewerConfigurer vc = new ViewerConfigurer(fdl, mcdlp, 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(); } }); Image medCalIcon = ResourceManager.getPluginImage("at.medevit.ch.artikelstamm.medcalendar", "icons/medcal.png"); MenuManager subMenu = new MenuManager("MedKalender Gruppen-Selektion", ImageDescriptor.createFromImage(medCalIcon), 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 MedCalMenuContribution(cov, fdl)); menu.add(subMenu); menu.add(tvfa); menu.add(new Separator()); menu.add(new VATMenuContributionItem(cov)); cv.setContextMenu(menu); return vc; } }