package ch.elexis.core.ui.views.controls;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
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.core.runtime.IStatus;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.model.prescription.EntryType;
import ch.elexis.core.ui.dialogs.ArticleDefaultSignatureTitleAreaDialog;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.util.CreatePrescriptionHelper;
import ch.elexis.data.ArticleDefaultSignature;
import ch.elexis.data.ArticleDefaultSignature.ArticleSignature;
import ch.elexis.data.Artikel;
public class ArticleDefaultSignatureComposite extends Composite {
private WritableValue signatureItem = new WritableValue(null, ArticleSignature.class);
private DataBindingContext databindingContext;
private ToolBarManager toolbarManager;
private Text txtSignatureMorning;
private Text txtSignatureNoon;
private Text txtSignatureEvening;
private Text txtSignatureNight;
private Text txtSignatureComment;
private Composite medicationType;
private Button btnSymtomatic;
private Button btnReserve;
private Button btnFix;
private Composite disposalType;
private Button btnNoDisposal;
private Button btnDispensation;
private Composite signatureType;
private Button btnRadioOnAtcCode;
private Button btnRadioOnArticle;
private Artikel article;
private StackLayout stackLayoutDosage;
private Composite compositeDayTimeDosage;
private Text txtFreeTextDosage;
private Composite compositeFreeTextDosage;
private Composite stackCompositeDosage;
private List<SavingTargetToModelStrategy> targetToModelStrategies;
/**
* Create the composite.
*
* @param this
* @param style
*/
public ArticleDefaultSignatureComposite(Composite parent, int style){
super(parent, style);
setLayout(new GridLayout(7, false));
signatureType = new Composite(this, SWT.NONE);
signatureType.setLayout(new RowLayout());
signatureType.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 6, 1));
btnRadioOnAtcCode = new Button(signatureType, SWT.RADIO);
btnRadioOnAtcCode.setText(Messages.ArticleDefaultSignatureComposite_onAtc);
btnRadioOnAtcCode.addSelectionListener(new SavingSelectionAdapter());
btnRadioOnArticle = new Button(signatureType, SWT.RADIO);
btnRadioOnArticle.setText(Messages.ArticleDefaultSignatureComposite_onArticle);
btnRadioOnArticle.addSelectionListener(new SavingSelectionAdapter());
toolbarManager = new ToolBarManager();
toolbarManager.add(new AddDefaultSignatureAction());
toolbarManager.add(new RemoveDefaultSignatureAction());
ToolBar toolbar = toolbarManager.createControl(this);
toolbar.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
stackCompositeDosage = new Composite(this, SWT.NONE);
stackCompositeDosage.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 6, 1));
stackLayoutDosage = new StackLayout();
stackCompositeDosage.setLayout(stackLayoutDosage);
compositeDayTimeDosage = new Composite(stackCompositeDosage, SWT.NONE);
GridLayout layout = new GridLayout(7, false);
layout.horizontalSpacing = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 0;
layout.marginHeight = 0;
compositeDayTimeDosage.setLayout(layout);
txtSignatureMorning = new Text(compositeDayTimeDosage, SWT.BORDER);
txtSignatureMorning.setMessage(Messages.ArticleDefaultSignatureComposite_morning);
txtSignatureMorning.setToolTipText(""); //$NON-NLS-1$
txtSignatureMorning.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label label = new Label(compositeDayTimeDosage, SWT.None);
label.setText("-"); //$NON-NLS-1$
txtSignatureNoon = new Text(compositeDayTimeDosage, SWT.BORDER);
txtSignatureNoon.setMessage(Messages.ArticleDefaultSignatureComposite_noon);
txtSignatureNoon.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
label = new Label(compositeDayTimeDosage, SWT.None);
label.setText("-"); //$NON-NLS-1$
txtSignatureEvening = new Text(compositeDayTimeDosage, SWT.BORDER);
txtSignatureEvening.setMessage(Messages.ArticleDefaultSignatureComposite_evening);
txtSignatureEvening.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
label = new Label(compositeDayTimeDosage, SWT.None);
label.setText("-"); //$NON-NLS-1$
txtSignatureNight = new Text(compositeDayTimeDosage, SWT.BORDER);
txtSignatureNight.setMessage(Messages.ArticleDefaultSignatureComposite_night);
txtSignatureNight.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
compositeFreeTextDosage = new Composite(stackCompositeDosage, SWT.NONE);
layout = new GridLayout(1, false);
layout.horizontalSpacing = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 0;
layout.marginHeight = 0;
compositeFreeTextDosage.setLayout(layout);
txtFreeTextDosage = new Text(compositeFreeTextDosage, SWT.BORDER);
txtFreeTextDosage.setMessage(Messages.ArticleDefaultSignatureComposite_dosage);
txtFreeTextDosage.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
// set initial control to day time dosage
stackLayoutDosage.topControl = compositeDayTimeDosage;
Button btnDoseSwitch = new Button(this, SWT.NONE);
btnDoseSwitch.setImage(Images.IMG_SYNC.getImage());
btnDoseSwitch.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
if (stackLayoutDosage.topControl == compositeDayTimeDosage) {
stackLayoutDosage.topControl = compositeFreeTextDosage;
} else {
stackLayoutDosage.topControl = compositeDayTimeDosage;
txtFreeTextDosage.setText(""); //$NON-NLS-1$
}
stackCompositeDosage.layout();
};
});
txtSignatureComment = new Text(this, SWT.BORDER);
txtSignatureComment.setMessage(Messages.ArticleDefaultSignatureComposite_applicationInstruction);
txtSignatureComment.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 7, 1));
medicationType = new Composite(this, SWT.NONE);
medicationType.setLayout(new RowLayout());
medicationType.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 7, 1));
btnSymtomatic = new Button(medicationType, SWT.RADIO);
btnSymtomatic.setText(Messages.ArticleDefaultSignatureComposite_sympomatic);
btnSymtomatic.addSelectionListener(new SavingSelectionAdapter());
btnReserve = new Button(medicationType, SWT.RADIO);
btnReserve.setText(Messages.ArticleDefaultSignatureComposite_reserve);
btnReserve.addSelectionListener(new SavingSelectionAdapter());
btnFix = new Button(medicationType, SWT.RADIO);
btnFix.setText(Messages.ArticleDefaultSignatureComposite_fix);
btnFix.addSelectionListener(new SavingSelectionAdapter());
disposalType = new Composite(this, SWT.NONE);
disposalType.setLayout(new RowLayout());
disposalType.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 7, 1));
btnNoDisposal = new Button(disposalType, SWT.RADIO);
btnNoDisposal.setText(Messages.ArticleDefaultSignatureComposite_recipe);
btnNoDisposal.addSelectionListener(new SavingSelectionAdapter());
btnDispensation = new Button(disposalType, SWT.RADIO);
btnDispensation.setText(Messages.ArticleDefaultSignatureComposite_dispensation);
btnDispensation.addSelectionListener(new SavingSelectionAdapter());
}
public void setToolbarVisible(boolean value){
ToolBar toolbar = toolbarManager.getControl();
if (toolbar != null && !toolbar.isDisposed()) {
toolbar.setVisible(value);
}
}
public void setOnLocationEnabled(boolean value){
btnRadioOnArticle.setEnabled(value);
btnRadioOnAtcCode.setEnabled(value);
}
public void setMedicationTypeFix(){
medicationType.setVisible(false);
btnFix.setSelection(true);
btnSymtomatic.setSelection(false);
btnReserve.setSelection(false);
medicationType.getParent().layout();
}
public DataBindingContext initDataBindings(DataBindingContext dbc){
if (dbc == null) {
databindingContext = new DataBindingContext();
} else {
databindingContext = dbc;
}
targetToModelStrategies = new ArrayList<>();
IObservableValue observeTextTextSignatureMorningObserveWidget =
WidgetProperties.text(new int[] {
SWT.Modify, SWT.FocusOut
}).observeDelayed(100, txtSignatureMorning);
IObservableValue itemSignatureMorningObserveDetailValue =
PojoProperties.value(ArticleSignature.class, "morning", String.class) //$NON-NLS-1$
.observeDetail(signatureItem);
SavingTargetToModelStrategy targetToModelStrategy = new SavingTargetToModelStrategy(this);
targetToModelStrategies.add(targetToModelStrategy);
databindingContext.bindValue(observeTextTextSignatureMorningObserveWidget,
itemSignatureMorningObserveDetailValue, targetToModelStrategy, null);
IObservableValue observeTextTextSignatureNoonObserveWidget =
WidgetProperties.text(new int[] {
SWT.Modify, SWT.FocusOut
}).observeDelayed(100, txtSignatureNoon);
IObservableValue itemSignatureNoonObserveDetailValue =
PojoProperties.value(ArticleSignature.class, "noon", String.class) //$NON-NLS-1$
.observeDetail(signatureItem);
targetToModelStrategy = new SavingTargetToModelStrategy(this);
targetToModelStrategies.add(targetToModelStrategy);
databindingContext.bindValue(observeTextTextSignatureNoonObserveWidget,
itemSignatureNoonObserveDetailValue, targetToModelStrategy, null);
IObservableValue observeTextTextSignatureEveningObserveWidget =
WidgetProperties.text(new int[] {
SWT.Modify, SWT.FocusOut
}).observeDelayed(100, txtSignatureEvening);
IObservableValue itemSignatureEveningObserveDetailValue =
PojoProperties.value(ArticleSignature.class, "evening", String.class) //$NON-NLS-1$
.observeDetail(signatureItem);
targetToModelStrategy = new SavingTargetToModelStrategy(this);
targetToModelStrategies.add(targetToModelStrategy);
databindingContext.bindValue(observeTextTextSignatureEveningObserveWidget,
itemSignatureEveningObserveDetailValue, targetToModelStrategy, null);
IObservableValue observeTextTextSignatureNightObserveWidget =
WidgetProperties.text(new int[] {
SWT.Modify, SWT.FocusOut
}).observeDelayed(100, txtSignatureNight);
IObservableValue itemSignatureNightObserveDetailValue =
PojoProperties.value(ArticleSignature.class, "night", String.class) //$NON-NLS-1$
.observeDetail(signatureItem);
targetToModelStrategy = new SavingTargetToModelStrategy(this);
targetToModelStrategies.add(targetToModelStrategy);
databindingContext.bindValue(observeTextTextSignatureNightObserveWidget,
itemSignatureNightObserveDetailValue, targetToModelStrategy, null);
IObservableValue observeTextFreeTextDosageObserveWidget =
WidgetProperties.text(new int[] {
SWT.Modify, SWT.FocusOut
}).observeDelayed(100, txtFreeTextDosage);
IObservableValue itemSignatureFreeTextDosageObserveDetailValue = PojoProperties
.value(ArticleSignature.class, "freeText", String.class).observeDetail(signatureItem); //$NON-NLS-1$
targetToModelStrategy = new SavingTargetToModelStrategy(this);
targetToModelStrategies.add(targetToModelStrategy);
databindingContext.bindValue(observeTextFreeTextDosageObserveWidget,
itemSignatureFreeTextDosageObserveDetailValue, targetToModelStrategy, null);
IObservableValue observeTextTextSignatureCommentObserveWidget =
WidgetProperties.text(new int[] {
SWT.Modify, SWT.FocusOut
}).observeDelayed(100, txtSignatureComment);
IObservableValue itemSignatureCommentObserveDetailValue =
PojoProperties.value(ArticleSignature.class, "comment", String.class) //$NON-NLS-1$
.observeDetail(signatureItem);
targetToModelStrategy = new SavingTargetToModelStrategy(this);
targetToModelStrategies.add(targetToModelStrategy);
databindingContext.bindValue(observeTextTextSignatureCommentObserveWidget,
itemSignatureCommentObserveDetailValue, targetToModelStrategy, null);
return databindingContext;
}
@Override
protected void checkSubclass(){
// Disable the check that prevents subclassing of SWT components
}
public void setArticleToBind(Artikel article, boolean lookup){
if (!isDisposed()) {
ArticleSignature signature = getSignature();
if (signature != null && signature.isPersistent()) {
signature.toDefault();
}
// update with new article signature
this.article = article;
if (lookup) {
ArticleDefaultSignature defSignature =
ArticleDefaultSignature.getDefaultsignatureForArticle(article);
if (defSignature != null) {
signatureItem.setValue(ArticleSignature.fromDefault(defSignature));
} else {
signatureItem.setValue(new ArticleSignature(article, null));
}
} else {
signatureItem.setValue(new ArticleSignature(article, null));
}
updateTargetNonDatabinding();
// update the toolbar
for (IContributionItem item : toolbarManager.getItems()) {
item.update();
}
}
}
public void setArticleToBind(Artikel article){
setArticleToBind(article, true);
}
public ArticleSignature getSignature(){
Object value = signatureItem.getValue();
if (value instanceof ArticleSignature) {
return (ArticleSignature) value;
}
return null;
}
public void updateModelNonDatabinding(){
ArticleSignature signature = getSignature();
if (signature != null) {
if (btnRadioOnAtcCode.getSelection()) {
signature.setAtcCode(article.getATC_code());
} else if (btnRadioOnArticle.getSelection()) {
signature.setAtcCode(null);
signature.setArticle(article);
}
if (btnSymtomatic.getSelection()) {
signature.setMedicationType(EntryType.SYMPTOMATIC_MEDICATION);
} else if (btnReserve.getSelection()) {
signature.setMedicationType(EntryType.RESERVE_MEDICATION);
} else if (btnFix.getSelection()) {
signature.setMedicationType(EntryType.FIXED_MEDICATION);
}
if (btnNoDisposal.getSelection()) {
signature.setDisposalType(EntryType.RECIPE);
} else if (btnDispensation.getSelection()) {
signature.setDisposalType(EntryType.SELF_DISPENSED);
}
}
}
public void updateTargetNonDatabinding(){
ArticleSignature signature = getSignature();
String freeText = signature.getFreeText();
if (freeText != null && !freeText.isEmpty()) {
stackLayoutDosage.topControl = compositeFreeTextDosage;
} else {
stackLayoutDosage.topControl = compositeDayTimeDosage;
}
stackCompositeDosage.layout();
btnFix.setSelection(false);
btnReserve.setSelection(false);
btnSymtomatic.setSelection(false);
btnNoDisposal.setSelection(false);
btnDispensation.setSelection(false);
btnRadioOnArticle.setSelection(false);
btnRadioOnAtcCode.setSelection(false);
if (signature != null) {
EntryType modelMedicationType = signature.getMedicationType();
if (modelMedicationType == EntryType.FIXED_MEDICATION) {
btnFix.setSelection(true);
} else if (modelMedicationType == EntryType.RESERVE_MEDICATION) {
btnReserve.setSelection(true);
} else if (modelMedicationType == EntryType.SYMPTOMATIC_MEDICATION) {
btnSymtomatic.setSelection(true);
} else {
// default
btnSymtomatic.setSelection(true);
}
EntryType modelDisposalType = signature.getDisposalType();
if (modelDisposalType == EntryType.RECIPE) {
btnNoDisposal.setSelection(true);
} else if (modelDisposalType == EntryType.SELF_DISPENSED) {
btnDispensation.setSelection(true);
} else {
if(CoreHub.userCfg
.get(CreatePrescriptionHelper.MEDICATION_SETTINGS_SIGNATURE_STD_DISPENSATION, false)) {
btnDispensation.setSelection(true);
} else {
btnNoDisposal.setSelection(true);
}
}
if (signature.isAtc()) {
btnRadioOnAtcCode.setSelection(true);
} else {
btnRadioOnArticle.setSelection(true);
}
}
}
public void safeToDefault(){
ArticleSignature signature = getSignature();
// dont save if no medication type is selected
if (!btnFix.getSelection() && !btnReserve.getSelection() && !btnSymtomatic.getSelection()) {
return;
}
if (signature != null) {
signature.toDefault();
}
}
public void createPersistent(){
ArticleSignature signature = getSignature();
if (!signature.isPersistent()) {
signature.createPersistent();
}
}
public String getSignatureMorning(){
return txtSignatureMorning.getText();
}
public void setSignatureMorning(String signatureMorning){
txtSignatureMorning.setText(signatureMorning);
}
public String getSignatureNoon(){
return txtSignatureNoon.getText();
}
public void setSignatureNoon(String signatureNoon){
txtSignatureNoon.setText(signatureNoon);
}
public String getSignatureEvening(){
return txtSignatureEvening.getText();
}
public void setSignatureEvening(String signatureEvening){
txtSignatureEvening.setText(signatureEvening);
}
public String getSignatureNight(){
return txtSignatureNight.getText();
}
public void setSignatureNight(String signatureNight){
txtSignatureNight.setText(signatureNight);
}
public String getSignatureComment(){
return txtSignatureComment.getText();
}
public void setSignatureComment(String signatureComment){
txtSignatureComment.setText(signatureComment);
}
public void setSignature(ArticleSignature signature){
signatureItem.setValue(signature);
updateTargetNonDatabinding();
}
private class SavingSelectionAdapter extends SelectionAdapter {
@Override
public void widgetSelected(SelectionEvent e){
updateModelNonDatabinding();
safeToDefault();
}
}
private class AddDefaultSignatureAction extends Action {
@Override
public ImageDescriptor getImageDescriptor(){
return Images.IMG_NEW.getImageDescriptor();
}
@Override
public void run(){
ArticleDefaultSignatureTitleAreaDialog dialog =
new ArticleDefaultSignatureTitleAreaDialog(getShell(), article);
dialog.open();
// update the content
setArticleToBind(article);
}
@Override
public boolean isEnabled(){
ArticleSignature signature = getSignature();
// not enabled if already signature on article
if (signature != null && signature.isPersistent() && !signature.isAtc()) {
return false;
}
return true;
}
}
private class RemoveDefaultSignatureAction extends Action {
@Override
public ImageDescriptor getImageDescriptor(){
return Images.IMG_DELETE.getImageDescriptor();
}
@Override
public void run(){
ArticleSignature signature = getSignature();
if (signature != null && signature.isPersistent()) {
signature.delete();
}
// update the content
setArticleToBind(article);
}
@Override
public boolean isEnabled(){
ArticleSignature signature = getSignature();
if (signature == null || !signature.isPersistent()) {
return false;
}
return true;
}
}
public void setAutoSave(boolean value){
if (targetToModelStrategies != null) {
for (SavingTargetToModelStrategy savingTargetToModelStrategy : targetToModelStrategies) {
savingTargetToModelStrategy.setAutoSave(value);
}
}
}
private static class SavingTargetToModelStrategy extends UpdateValueStrategy {
private boolean autoSave;
private ArticleDefaultSignatureComposite composite;
public SavingTargetToModelStrategy(ArticleDefaultSignatureComposite composite){
this.composite = composite;
}
public void setAutoSave(boolean value){
autoSave = value;
}
@Override
protected IStatus doSet(IObservableValue observableValue, Object value){
IStatus ret = super.doSet(observableValue, value);
if (autoSave) {
composite.safeToDefault();
}
return ret;
}
}
}