/*******************************************************************************
* Copyright (c) 2016 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;
import java.util.Date;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.conversion.NumberToStringConverter;
import org.eclipse.core.databinding.conversion.StringToNumberConverter;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IViewSite;
import at.medevit.atc_codes.ATCCodeLanguageConstants;
import at.medevit.ch.artikelstamm.ArtikelstammConstants;
import at.medevit.ch.artikelstamm.ArtikelstammHelper;
import at.medevit.ch.artikelstamm.elexis.common.preference.PreferenceConstants;
import at.medevit.ch.artikelstamm.ui.DetailComposite;
import ch.artikelstamm.elexis.common.ArtikelstammItem;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.ui.views.IDetailDisplay;
import ch.elexis.core.ui.views.controls.StockDetailComposite;
import ch.elexis.data.PersistentObject;
public class DetailDisplay implements IDetailDisplay {
private UpdateValueStrategy integerToString =
new UpdateValueStrategy().setConverter(NumberToStringConverter.fromInteger(true));
private UpdateValueStrategy stringToInteger =
new UpdateValueStrategy().setConverter(StringToNumberConverter.toInteger(true));
protected WritableValue item = new WritableValue(null, ArtikelstammItem.class);
private DetailComposite dc = null;
private StockDetailComposite sdc;
private Text txtStkProPack, txtStkProAbgabe;
@Override
public Class<? extends PersistentObject> getElementClass(){
return ArtikelstammItem.class;
}
@Override
public void display(Object obj){
ArtikelstammItem ai = (ArtikelstammItem) obj;
item.setValue(ai);
if (dc != null) {
dc.setItem(ai);
}
if (sdc != null) {
sdc.setArticle(ai);
}
txtStkProAbgabe.setEnabled(!ai.isProduct());
txtStkProPack.setEnabled(!ai.isProduct());
}
@Override
public String getTitle(){
return ArtikelstammConstants.CODESYSTEM_NAME;
}
@Override
public Composite createDisplay(Composite parent, IViewSite site){
if (dc == null) {
String atcLang = CoreHub.globalCfg.get(PreferenceConstants.PREF_ATC_CODE_LANGUAGE,
ATCCodeLanguageConstants.ATC_LANGUAGE_VAL_GERMAN);
dc = new DetailComposite(parent, SWT.None, atcLang);
addLagerhaltungGroupToComposite(dc);
addAdditionalInformation(dc);
addDataSetStateLabelToComposite(dc);
}
return dc;
}
public void addAdditionalInformation(DetailComposite dc){
// Overwritten by subclasses
}
private void addDataSetStateLabelToComposite(DetailComposite dc){
Composite ret = new Composite(dc, SWT.None);
ret.setLayout(new GridLayout(2, false));
ret.setLayoutData(new GridData(SWT.FILL, SWT.VERTICAL, true, false));
Label label = new Label(ret, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.LEFT, true, false, 1, 1));
StringBuilder sb = new StringBuilder();
int version = ArtikelstammItem.getCurrentVersion();
if (version != 99999) {
sb.append(" v" + version);
}
Date creationDate = ArtikelstammItem.getImportSetCreationDate();
if (creationDate != null) {
sb.append(" / " + ArtikelstammHelper.monthAndYearWritten.format(creationDate));
}
label.setText("Datensatz-Basis: " + sb.toString());
addUpdateLabelToBottom(ret);
}
/**
* Hook to allow adding a label calling update
*
* @param dc
*/
public void addUpdateLabelToBottom(Composite dc){
// Overwritten by subclasses
}
private String dataQualityToString(int dq){
switch (dq) {
case 1:
return "v1";
case 2:
return "v1b";
case 3:
return "v2";
default:
return "unknown";
}
}
/**
* This method adds the Elexis v2.1 aspect of stock to the detail display. As this functionality
* is specific to Elexis v2.1 it is not included in the base {@link DetailComposite}
*
* @param dc
* the {@link DetailComposite} of {@link ArtikelstammItem}
*/
private void addLagerhaltungGroupToComposite(final DetailComposite dc){
DataBindingContext bindingContext = new DataBindingContext();
Group grpLagerhaltung = new Group(dc, SWT.NONE);
grpLagerhaltung.setText("Lagerhaltung");
grpLagerhaltung.setLayout(new GridLayout(4, false));
grpLagerhaltung.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
sdc = new StockDetailComposite(grpLagerhaltung, SWT.NONE);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, false, true, 4, 1);
gridData.heightHint = 100;
sdc.setLayoutData(gridData);
// Stk. pro Pkg.
Label lblStkProPack = new Label(grpLagerhaltung, SWT.NONE);
lblStkProPack.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblStkProPack.setText("Stk. pro Pckg.");
txtStkProPack = new Text(grpLagerhaltung, SWT.BORDER);
txtStkProPack.setTextLimit(4);
GridData gd_txtStkProPack = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gd_txtStkProPack.widthHint = 40;
txtStkProPack.setLayoutData(gd_txtStkProPack);
IObservableValue propertyStkProPack = PojoProperties
.value(ArtikelstammItem.class, "verpackungseinheit", Integer.class).observeDetail(item);
IObservableValue targetStkProPack =
WidgetProperties.text(SWT.Modify).observe(txtStkProPack);
bindingContext.bindValue(targetStkProPack, propertyStkProPack, stringToInteger,
integerToString);
// Stk. pro Abgabe
Label lblStkProAbgabe = new Label(grpLagerhaltung, SWT.NONE);
lblStkProAbgabe.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblStkProAbgabe.setText("Stk. pro Abgabe");
final String tooltip = "Für Komplettpackung bitte 0 Stk. angeben.";
lblStkProAbgabe.setToolTipText(tooltip);
txtStkProAbgabe = new Text(grpLagerhaltung, SWT.BORDER);
txtStkProAbgabe.setTextLimit(4);
GridData gd_txtStkProAbgabe = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gd_txtStkProAbgabe.widthHint = 40;
txtStkProAbgabe.setLayoutData(gd_txtStkProAbgabe);
txtStkProAbgabe.setToolTipText(tooltip);
IObservableValue propertyStkProAbgabe = PojoProperties
.value(ArtikelstammItem.class, "verkaufseinheit", Integer.class).observeDetail(item);
IObservableValue targetStkProAbgabe =
WidgetProperties.text(SWT.Modify).observe(txtStkProAbgabe);
bindingContext.bindValue(targetStkProAbgabe, propertyStkProAbgabe, stringToInteger,
integerToString);
}
}