/******************************************************************************* * 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 contributions *******************************************************************************/ package ch.elexis.core.ui.views.codesystems; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.PojoProperties; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.statushandlers.StatusManager; import ch.elexis.core.constants.Preferences; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.interfaces.IVerrechenbar; import ch.elexis.core.data.status.ElexisStatus; import ch.elexis.core.model.ICodeElement; import ch.elexis.core.ui.Hub; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.commands.CreateEigenleistungUi; import ch.elexis.core.ui.commands.EditEigenleistungUi; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.ViewMenus; import ch.elexis.core.ui.views.IDetailDisplay; import ch.elexis.data.Eigenleistung; import ch.elexis.data.Leistungsblock; import ch.elexis.data.Mandant; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; import ch.rgw.tools.StringTool; public class BlockDetailDisplay implements IDetailDisplay { private ScrolledForm form; private FormToolkit tk; private Text tName; private Text tMacro; private Combo cbMandant; private TableViewer lLst; private Button bNew, bEigen, bDiag; private List<Mandant> lMandanten; private DataBindingContext dbc = new DataBindingContext(); private WritableValue master = new WritableValue(null, Leistungsblock.class); private Action removeLeistung, moveUpAction, moveDownAction, editAction; public Composite createDisplay(final Composite parent, final IViewSite site){ tk = UiDesk.getToolkit(); form = tk.createScrolledForm(parent); form.setData("TEST_COMP_NAME", "blkd_form"); //$NON-NLS-1$ Composite body = form.getBody(); body.setData("TEST_COMP_NAME", "blkd_body"); //$NON-NLS-1$ body.setBackground(parent.getBackground()); body.setLayout(new GridLayout(2, false)); tk.createLabel(body, Messages.BlockDetailDisplay_name) .setBackground(parent.getBackground()); tName = tk.createText(body, StringConstants.EMPTY, SWT.BORDER); tName.setData("TEST_COMP_NAME", "blkd_Name_lst"); //$NON-NLS-1$ tName.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); IObservableValue txtNameObservableUi = WidgetProperties.text(SWT.Modify).observeDelayed(100, tName); IObservableValue txtNameObservable = PojoProperties.value("name", String.class).observeDetail(master); dbc.bindValue(txtNameObservableUi, txtNameObservable); tk.createLabel(body, Messages.BlockDetailDisplay_macro).setBackground( parent.getBackground()); tMacro = tk.createText(body, StringConstants.EMPTY, SWT.BORDER); tMacro.setData("TEST_COMP_NAME", "blkd_Makro_lst"); //$NON-NLS-1$ tMacro.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); IObservableValue txtMacroObservableUi = WidgetProperties.text(SWT.Modify).observeDelayed(100, tMacro); IObservableValue txtMacroObservable = PojoProperties.value("macro", String.class).observeDetail(master); dbc.bindValue(txtMacroObservableUi, txtMacroObservable); tk.createLabel(body, StringConstants.MANDATOR).setBackground(parent.getBackground()); cbMandant = new Combo(body, SWT.NONE); cbMandant.setData("TEST_COMP_NAME", "blkd_Mandant_cb"); //$NON-NLS-1$ cbMandant.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); tk.adapt(cbMandant); Query<Mandant> qm = new Query<Mandant>(Mandant.class); lMandanten = qm.execute(); cbMandant.add(Messages.BlockDetailDisplay_all); for (PersistentObject m : lMandanten) { cbMandant.add(m.getLabel()); } cbMandant.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e){ int idx = cbMandant.getSelectionIndex(); Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class); if (idx > 0) { PersistentObject m = lMandanten.get(idx - 1); lb.set(Leistungsblock.FLD_MANDANT_ID, m.getId()); } else { lb.set(Leistungsblock.FLD_MANDANT_ID, StringConstants.EMPTY); } } }); Group gList = new Group(body, SWT.BORDER); gList.setText(Messages.BlockDetailDisplay_services); //$NON-NLS-1$ gList.setLayoutData(SWTHelper.getFillGridData(2, true, 1, true)); gList.setLayout(new FillLayout()); tk.adapt(gList); lLst = new TableViewer(gList, SWT.NONE); lLst.setData("TEST_COMP_NAME", "blkd_Leistung_Lst"); //$NON-NLS-1$ tk.adapt(lLst.getControl(), true, true); lLst.setContentProvider(new IStructuredContentProvider() { public void dispose(){} public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput){} public Object[] getElements(final Object inputElement){ Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class); if (lb == null) { return new Object[0]; } List<ICodeElement> lst = lb.getElements(); if (lst == null) { return new Object[0]; } return lst.toArray(); } }); lLst.setLabelProvider(new ColorizedLabelProvider()); final TextTransfer textTransfer = TextTransfer.getInstance(); Transfer[] types = new Transfer[] { textTransfer }; lLst.addDropSupport(DND.DROP_COPY, types, new DropTargetListener() { public void dragEnter(final DropTargetEvent event){ event.detail = DND.DROP_COPY; } public void dragLeave(final DropTargetEvent event){} public void dragOperationChanged(final DropTargetEvent event){} public void dragOver(final DropTargetEvent event){} public void drop(final DropTargetEvent event){ String drp = (String) event.data; String[] dl = drp.split(","); //$NON-NLS-1$ for (String obj : dl) { PersistentObject dropped = CoreHub.poFactory.createFromString(obj); if (dropped instanceof ICodeElement) { Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher .getSelected(Leistungsblock.class); if (lb != null) { lb.addElement((ICodeElement) dropped); lLst.refresh(); ElexisEventDispatcher.reload(Leistungsblock.class); } } } } public void dropAccept(final DropTargetEvent event){ // TODO Automatisch erstellter Methoden-Stub } }); bNew = tk.createButton(body, Messages.BlockDetailDisplay_addPredefinedServices, SWT.PUSH); //$NON-NLS-1$ bNew.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); bNew.setData("TEST_COMP_NAME", "blkd_addPredefinedServices_btn"); //$NON-NLS-1$ bNew.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e){ try { site.getPage().showView(LeistungenView.ID); } catch (Exception ex) { ElexisStatus status = new ElexisStatus(ElexisStatus.ERROR, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE, "Fehler beim Starten des Leistungscodes " + ex.getMessage(), ex, ElexisStatus.LOG_ERRORS); StatusManager.getManager().handle(status, StatusManager.SHOW); } } }); bEigen = tk.createButton(body, Messages.BlockDetailDisplay_addSelfDefinedServices, SWT.PUSH); //$NON-NLS-1$ bEigen.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); bEigen.setData("TEST_COMP_NAME", "blkd_createPredefinedServices_btn"); //$NON-NLS-1$ bEigen.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e){ try { // execute the command IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getService(IHandlerService.class); handlerService.executeCommand(CreateEigenleistungUi.COMMANDID, null); } catch (Exception ex) { throw new RuntimeException(CreateEigenleistungUi.COMMANDID, ex); } lLst.refresh(); } }); bDiag = tk.createButton(body, "Diagnose hinzufügen", SWT.PUSH); //$NON-NLS-1$ bDiag.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); bDiag.setData("TEST_COMP_NAME", "btn_addDiagnosis_btn"); //$NON-NLS-1$ bDiag.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e){ try { site.getPage().showView(DiagnosenView.ID); } catch (Exception ex) { ElexisStatus status = new ElexisStatus(ElexisStatus.ERROR, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE, "Fehler beim Starten des Diagnosecodes " + ex.getMessage(), ex, ElexisStatus.LOG_ERRORS); StatusManager.getManager().handle(status, StatusManager.SHOW); } } }); makeActions(); ViewMenus menus = new ViewMenus(site); menus.createControlContextMenu(lLst.getControl(), new ViewMenus.IMenuPopulator() { public IAction[] fillMenu(){ IVerrechenbar iv = (IVerrechenbar) ((IStructuredSelection) lLst.getSelection()).getFirstElement(); if (iv instanceof Eigenleistung) { return new IAction[] { moveUpAction, moveDownAction, null, removeLeistung, editAction }; } else { return new IAction[] { moveUpAction, moveDownAction, null, removeLeistung }; } } }); // menus.createViewerContextMenu(lLst,moveUpAction,moveDownAction,null,removeLeistung,editAction); lLst.setInput(site); return body; } public Class<? extends PersistentObject> getElementClass(){ return Leistungsblock.class; } public void display(final Object obj){ Leistungsblock lb = (Leistungsblock) obj; master.setValue(lb); if (obj == null) { bNew.setEnabled(false); cbMandant.select(0); } else { String mId = lb.get(Leistungsblock.FLD_MANDANT_ID); int sel = 0; if (!StringTool.isNothing(mId)) { String[] items = cbMandant.getItems(); sel = StringTool.getIndex(items, Mandant.load(mId).getLabel()); } cbMandant.select(sel); bNew.setEnabled(true); } lLst.refresh(true); } public String getTitle(){ return Messages.BlockDetailDisplay_blocks; //$NON-NLS-1$ } private void makeActions(){ removeLeistung = new Action(Messages.BlockDetailDisplay_remove) { //$NON-NLS-1$ @Override public void run(){ Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class); if (lb != null) { IStructuredSelection sel = (IStructuredSelection) lLst.getSelection(); Object o = sel.getFirstElement(); if (o != null) { lb.removeElement((ICodeElement) o); lLst.refresh(); } } } }; moveUpAction = new Action(Messages.BlockDetailDisplay_moveUp) { //$NON-NLS-1$ @Override public void run(){ moveElement(-1); } }; moveDownAction = new Action(Messages.BlockDetailDisplay_moveDown) { //$NON-NLS-1$ @Override public void run(){ moveElement(1); } }; editAction = new Action(Messages.BlockDetailDisplay_changeAction) { //$NON-NLS-1$ { setImageDescriptor(Images.IMG_EDIT.getImageDescriptor()); setToolTipText(Messages.BlockDetailDisplay_changeActionTooltip); //$NON-NLS-1$ } @Override public void run(){ IStructuredSelection sel = (IStructuredSelection) lLst.getSelection(); PersistentObject parameter = (PersistentObject) sel.getFirstElement(); EditEigenleistungUi.executeWithParams(parameter); } }; } private class ColorizedLabelProvider extends LabelProvider implements IColorProvider { @Override public String getText(final Object element){ ICodeElement v = (ICodeElement) element; return v.getCode() + StringConstants.SPACE + v.getText(); } @Override public Color getForeground(Object element){ return null; } @Override public Color getBackground(Object element){ ICodeElement v = (ICodeElement) element; String codeSystemName = v.getCodeSystemName(); if (codeSystemName != null) { String rgbColor = CoreHub.globalCfg.get(Preferences.LEISTUNGSCODES_COLOR + codeSystemName, "ffffff"); return UiDesk.getColorFromRGB(rgbColor); } return null; } } private void moveElement(final int off){ Leistungsblock lb = (Leistungsblock) ElexisEventDispatcher.getSelected(Leistungsblock.class); if (lb != null) { IStructuredSelection sel = (IStructuredSelection) lLst.getSelection(); Object o = sel.getFirstElement(); if (o != null) { lb.moveElement((ICodeElement) o, off); lLst.refresh(); } } } }