package ch.elexis.core.ui.medication.handlers;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.actions.CodeSelectorHandler;
import ch.elexis.core.ui.medication.views.MedicationTableViewerItem;
import ch.elexis.core.ui.medication.views.MedicationView;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.views.codesystems.LeistungenView;
import ch.elexis.data.Artikel;
import ch.elexis.data.Prescription;
import ch.rgw.tools.StringTool;
public class SwitchMedicationHandler extends AbstractHandler {
private static final Logger log = LoggerFactory.getLogger(SwitchMedicationHandler.class);
private static final String UPCASES_DASH_NR_PATTERN = "[A-Z-0-9]+";
private static final String SPACE = "\\s";
private static final String NUMBERS = "[0-9]+";
private static MedicationView medicationView;
private LeistungenView leistungenView;
private Prescription originalPresc;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException{
ISelection selection =
HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();
if (selection != null) {
IStructuredSelection strucSelection = (IStructuredSelection) selection;
Object firstElement = strucSelection.getFirstElement();
if (firstElement instanceof MedicationTableViewerItem) {
MedicationTableViewerItem mtvItem = (MedicationTableViewerItem) firstElement;
Prescription p = mtvItem.getPrescription();
if (p != null) {
originalPresc = p;
copyShortArticleNameToClipboard();
openLeistungsView();
}
}
}
return null;
}
/**
* Uses first parts of an article name and copies it to the clipboard. <br>
* Usually including everything from the start that is UPPER-CASE (including UPPER-CASE with
* DASH or NUMBER mixtures). In case article name does not fulfill common structure at least the
* first 2 parts (words) are included.
*
*/
private void copyShortArticleNameToClipboard(){
Artikel article = originalPresc.getArtikel();
if (article == null)
return;
String fullName = article.getName();
String[] nameParts = fullName.split(SPACE);
StringBuilder sbFilterName = new StringBuilder();
for (int i = 0; i < nameParts.length; i++) {
String s = nameParts[i];
if (i > 0) {
sbFilterName.append(" ");
}
// matches upper cases, dash an probably number but not only numbers
if (s.matches(UPCASES_DASH_NR_PATTERN) && !s.matches(NUMBERS)) {
sbFilterName.append(s);
} else {
// at least first two parts of name are included
if (i < 2) {
sbFilterName.append(s);
} else {
break;
}
}
}
// copy text to clipboard
Clipboard cb = new Clipboard(UiDesk.getDisplay());
TextTransfer textTransfer = TextTransfer.getInstance();
cb.setContents(new String[] {
sbFilterName.toString()
}, new Transfer[] {
textTransfer
});
}
private void openLeistungsView(){
medicationView = (MedicationView) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().findView(MedicationView.PART_ID);
// open the LeistungenView
try {
if (StringTool.isNothing(LeistungenView.ID)) {
log.debug("LeistungenView.ID empty or not found");
SWTHelper.alert("Fehler", "LeistungenView.ID");
}
medicationView.getViewSite().getPage().showView(LeistungenView.ID);
leistungenView = (LeistungenView) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().showView(LeistungenView.ID);
CodeSelectorHandler csHandler = CodeSelectorHandler.getInstance();
csHandler
.setCodeSelectorTarget(medicationView.getMedicationComposite().getDropTarget());
csHandler.getCodeSelectorTarget().registered(false);
medicationView.getMedicationComposite().setDropChangePrescription(originalPresc);
for (CTabItem cti : leistungenView.ctab.getItems()) {
if (cti.getText().equalsIgnoreCase("Artikelstamm")) {
leistungenView.setSelected(cti);
leistungenView.setFocus();
leistungenView.ctab.setSelection(cti);
}
}
} catch (Exception e) {
log.error(
"Could not open LeistungenView from the MedicationView in order to switch medication",
e);
}
}
}