package ch.elexis.core.ui.preferences;
import java.util.List;
import java.util.UUID;
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.databinding.swt.WidgetProperties;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.dialogs.ListDialog;
import ch.elexis.core.constants.Preferences;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.dialogs.KontaktSelektor;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Mandant;
import ch.elexis.data.Query;
import ch.elexis.data.Stock;
public class StockManagementPreferencePage extends PreferencePage
implements IWorkbenchPreferencePage {
private DataBindingContext m_bindingContext;
private Table tableStocks;
private Text txtCode;
private Text txtDescription;
private Text txtLocation;
private Text txtPrio;
private Label lblOwnerText;
private Label lblResponsibleText;
private Button btnChkStoreInvalidNumbers;
private WritableValue stockDetail = new WritableValue(null, Stock.class);
private TableViewer tableViewer;
private Text txtMachineConfig;
private Label lblMachineuuid;
private Label lblDefaultArticleProvider;
/**
* Create the preference page.
*/
public StockManagementPreferencePage(){
setTitle(Messages.LagerverwaltungPrefs_storageManagement);
}
/**
* Create contents of the preference page.
*
* @param parent
*/
@Override
public Control createContents(Composite parent){
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(new GridLayout(1, false));
Group group = new Group(container, SWT.NONE);
group.setLayout(new GridLayout(1, false));
group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
group.setText(Messages.StockManagementPreferencePage_group_text);
Composite composite = new Composite(group, SWT.NONE);
GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_composite.heightHint = 150;
composite.setLayoutData(gd_composite);
TableColumnLayout tcl_composite = new TableColumnLayout();
composite.setLayout(tcl_composite);
tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION);
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
tableViewer.setSorter(new ViewerSorter() {
@Override
public int compare(Viewer viewer, Object e1, Object e2){
Stock s1 = (Stock) e1;
int s1I = (s1.getPriority() != null) ? s1.getPriority() : Integer.MAX_VALUE;
Stock s2 = (Stock) e2;
int s2I = (s2.getPriority() != null) ? s2.getPriority() : Integer.MAX_VALUE;
return Integer.compare(s1I, s2I);
}
});
tableViewer.addSelectionChangedListener(e -> {
StructuredSelection ss = (StructuredSelection) e.getSelection();
if (ss.isEmpty()) {
stockDetail.setValue(null);
} else {
stockDetail.setValue((Stock) ss.getFirstElement());
}
});
tableStocks = tableViewer.getTable();
tableStocks.setHeaderVisible(true);
tableStocks.setLinesVisible(true);
Menu menu = new Menu(tableStocks);
tableStocks.setMenu(menu);
MenuItem mntmAddStock = new MenuItem(menu, SWT.NONE);
mntmAddStock.setText(Messages.StockManagementPreferencePage_mntmNewItem_text);
mntmAddStock.setImage(Images.IMG_NEW.getImage());
mntmAddStock.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
Stock stock = new Stock("", Integer.MAX_VALUE);
tableViewer.add(stock);
tableViewer.setSelection(new StructuredSelection(stock));
}
});
MenuItem mntmRemoveStock = new MenuItem(menu, SWT.NONE);
mntmRemoveStock.setText(Messages.StockManagementPreferencePage_mntmNewItem_text_1);
mntmRemoveStock.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
Stock stock = (Stock) stockDetail.getValue();
if (stock != null) {
boolean ret = MessageDialog.openQuestion(UiDesk.getTopShell(), "Lager löschen",
"Das Löschen dieses Lagers löscht alle darauf verzeichneten Lagerbestände. Sind Sie sicher?");
if (ret) {
stock.removeFromDatabase();
tableViewer.remove(stock);
}
}
}
});
TableViewerColumn tvcPriority = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tblclmPriority = tvcPriority.getColumn();
tcl_composite.setColumnData(tblclmPriority, new ColumnPixelData(30, true, true));
tblclmPriority.setText(Messages.StockManagementPreferencePage_tblclmnNewColumn_text);
tvcPriority.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell){
Stock s = (Stock) cell.getElement();
if (s == null)
return;
cell.setText(Integer.toString(s.getPriority()));
}
});
TableViewerColumn tvcCode = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tblclmnCode = tvcCode.getColumn();
tcl_composite.setColumnData(tblclmnCode, new ColumnPixelData(40));
tblclmnCode.setText(Messages.StockManagementPreferencePage_tblclmnNewColumn_text_1);
tvcCode.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell){
Stock s = (Stock) cell.getElement();
if (s == null)
return;
cell.setText(s.getCode());
}
});
TableViewerColumn tvcDescription = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tblclmnDescription = tvcDescription.getColumn();
tcl_composite.setColumnData(tblclmnDescription, new ColumnWeightData(50));
tblclmnDescription.setText(Messages.StockManagementPreferencePage_tblclmnNewColumn_text_3);
tvcDescription.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell){
Stock s = (Stock) cell.getElement();
if (s == null)
return;
cell.setText(s.getDescription());
}
});
TableViewerColumn tvcOwner = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tblclmnOwner = tvcOwner.getColumn();
tcl_composite.setColumnData(tblclmnOwner, new ColumnWeightData(40));
tblclmnOwner.setText(Messages.StockManagementPreferencePage_tblclmnNewColumn_text_2);
tvcOwner.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell){
Stock s = (Stock) cell.getElement();
if (s != null) {
Mandant owner = s.getOwner();
if (owner != null) {
cell.setText(owner.getLabel());
}
}
}
});
Composite compositeDetail = new Composite(group, SWT.NONE);
compositeDetail.setLayout(new GridLayout(4, false));
compositeDetail.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1));
Label lblPrio = new Label(compositeDetail, SWT.NONE);
lblPrio.setText(Messages.StockManagementPreferencePage_lblPrio_text);
txtPrio = new Text(compositeDetail, SWT.BORDER);
GridData gd_txtPrio = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gd_txtPrio.widthHint = 150;
txtPrio.setLayoutData(gd_txtPrio);
Label lblCode = new Label(compositeDetail, SWT.NONE);
lblCode.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblCode.setToolTipText(Messages.StockManagementPreferencePage_lblCode_toolTipText);
lblCode.setText(Messages.StockManagementPreferencePage_lblCode_text);
txtCode = new Text(compositeDetail, SWT.BORDER);
GridData gd_txtCode = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gd_txtCode.widthHint = 100;
txtCode.setLayoutData(gd_txtCode);
txtCode.setTextLimit(3);
Label lblDescription = new Label(compositeDetail, SWT.NONE);
lblDescription.setText(Messages.StockManagementPreferencePage_lblDescription_text);
txtDescription = new Text(compositeDetail, SWT.BORDER);
txtDescription.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblLocation = new Label(compositeDetail, SWT.NONE);
lblLocation.setToolTipText(Messages.StockManagementPreferencePage_lblLocation_toolTipText);
lblLocation.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblLocation.setText(Messages.StockManagementPreferencePage_lblLocation_text);
txtLocation = new Text(compositeDetail, SWT.BORDER);
txtLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Link lblOwner = new Link(compositeDetail, SWT.NONE);
lblOwner.setToolTipText(Messages.StockManagementPreferencePage_lblOwner_toolTipText);
lblOwner.setText(Messages.StockManagementPreferencePage_lblOwner_text);
lblOwner.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
Stock s = (Stock) stockDetail.getValue();
if (s == null)
return;
KontaktSelektor ks = new KontaktSelektor(UiDesk.getTopShell(), Mandant.class,
"Mandant auswählen", "Bitte selektieren Sie den Eigentümer", new String[] {});
int ret = ks.open();
if (ret == Window.OK) {
Mandant p = (Mandant) ks.getSelection();
s.setOwner(p);
String label = (p != null) ? p.getLabel() : "";
lblOwnerText.setText(label);
} else {
s.setOwner(null);
lblOwnerText.setText(StringConstants.EMPTY);
}
tableViewer.update(s, null);
}
});
lblOwnerText = new Label(compositeDetail, SWT.NONE);
lblOwnerText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
Link lblResponsible = new Link(compositeDetail, SWT.NONE);
lblResponsible
.setToolTipText(Messages.StockManagementPreferencePage_lblResponsible_toolTipText);
lblResponsible.setText(Messages.StockManagementPreferencePage_lblResonsible_text);
lblResponsible.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
Stock s = (Stock) stockDetail.getValue();
if (s == null)
return;
KontaktSelektor ks = new KontaktSelektor(UiDesk.getTopShell(), Kontakt.class,
"Lagerverantwortlichen auswählen",
"Bitte selektieren Sie den Lagerverantwortlichen", new String[] {});
int ret = ks.open();
if (ret == Window.OK) {
Kontakt p = (Kontakt) ks.getSelection();
s.setResponsible(p);
String label = (p != null) ? p.getLabel() : "";
lblResponsibleText.setText(label);
} else {
s.setResponsible(null);
lblResponsibleText.setText("");
}
}
});
lblResponsibleText = new Label(compositeDetail, SWT.NONE);
lblResponsibleText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
Label lblNewLabel = new Label(compositeDetail, SWT.SEPARATOR | SWT.HORIZONTAL);
lblNewLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1));
lblNewLabel.setText(Messages.StockManagementPreferencePage_lblNewLabel_text);
Link lblMachine = new Link(compositeDetail, SWT.NONE);
lblMachine.setToolTipText(Messages.StockManagementPreferencePage_lblMachine_toolTipText);
lblMachine.setText(Messages.StockManagementPreferencePage_lblMachine_text);
lblMachine.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
Stock s = (Stock) stockDetail.getValue();
if (s == null) {
return;
}
List<UUID> allDrivers =
CoreHub.getStockCommissioningSystemService().listAllAvailableDrivers();
if (allDrivers.size() == 0) {
MessageDialog.openInformation(UiDesk.getTopShell(), "No drivers found",
"There are no stock commissioning system drivers available.");
return;
}
ListDialog ld = new ListDialog(UiDesk.getTopShell());
ld.setTitle("Driver selection");
ld.setMessage("Please select a commissioning system driver");
ld.setContentProvider(ArrayContentProvider.getInstance());
ld.setAddCancelButton(true);
ld.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element){
return CoreHub.getStockCommissioningSystemService()
.getInfoStringForDriver((UUID) element, true);
}
});
ld.setInput(allDrivers);
ld.setWidthInChars(80);
ld.setHeightInChars(5);
int retVal = ld.open();
UUID ics = null;
if (Dialog.OK == retVal) {
Object[] result = ld.getResult();
if (result.length > 0) {
ics = (UUID) result[0];
}
} else if (Dialog.CANCEL == retVal) {
ics = null;
}
if (ics != null) {
s.setDriverUuid(ics.toString());
lblMachineuuid.setText(CoreHub.getStockCommissioningSystemService()
.getInfoStringForDriver(ics, false));
} else {
s.setDriverUuid(null);
lblMachineuuid.setText(StringConstants.EMPTY);
}
}
});
lblMachineuuid = new Label(compositeDetail, SWT.NONE);
lblMachineuuid.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
Label lblMachineConfig = new Label(compositeDetail, SWT.NONE);
lblMachineConfig.setText(Messages.StockManagementPreferencePage_lblMachineConfig_text);
txtMachineConfig = new Text(compositeDetail, SWT.BORDER);
txtMachineConfig.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
btnChkStoreInvalidNumbers = new Button(container, SWT.CHECK);
btnChkStoreInvalidNumbers.setText(Messages.LagerverwaltungPrefs_checkForInvalid);
Composite compDefaultProvider = new Composite(container, SWT.NONE);
compDefaultProvider.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
GridLayout gl_compDefaultProvider = new GridLayout(3, false);
gl_compDefaultProvider.marginWidth = 0;
gl_compDefaultProvider.marginHeight = 0;
compDefaultProvider.setLayout(gl_compDefaultProvider);
Link linkDefaultArticleProvider = new Link(compDefaultProvider, SWT.NONE);
linkDefaultArticleProvider.setToolTipText(
Messages.StockManagementPreferencePage_linkDefaultArticleProvider_toolTipText);
linkDefaultArticleProvider
.setText(Messages.StockManagementPreferencePage_linkDefaultArticleProvider_text);
linkDefaultArticleProvider.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
KontaktSelektor ks = new KontaktSelektor(UiDesk.getTopShell(), Kontakt.class,
"Standard-Lieferant auswählen",
"Bitte selektieren Sie den Standard-Lieferanten", new String[] {});
int ret = ks.open();
if (ret == Window.OK) {
Kontakt p = (Kontakt) ks.getSelection();
if (p != null) {
CoreHub.globalCfg.set(Preferences.INVENTORY_DEFAULT_ARTICLE_PROVIDER,
p.getId());
lblDefaultArticleProvider.setText(p.getLabel());
}
} else {
CoreHub.globalCfg.remove(Preferences.INVENTORY_DEFAULT_ARTICLE_PROVIDER);
lblDefaultArticleProvider.setText("");
}
}
});
lblDefaultArticleProvider = new Label(compDefaultProvider, SWT.NONE);
lblDefaultArticleProvider
.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
String id = CoreHub.globalCfg.get(Preferences.INVENTORY_DEFAULT_ARTICLE_PROVIDER, null);
lblDefaultArticleProvider.setText("");
new Label(compDefaultProvider, SWT.NONE);
if (id != null) {
Kontakt load = Kontakt.load(id);
if (load.exists()) {
lblDefaultArticleProvider.setText(load.getLabel());
}
}
tableViewer.setInput(new Query<Stock>(Stock.class).execute());
m_bindingContext = initDataBindings();
stockDetail.addChangeListener(e -> {
Stock stock = (Stock) stockDetail.getValue();
if (stock != null) {
Mandant owner = stock.getOwner();
if (owner != null) {
lblOwnerText.setText(owner.getLabel());
} else {
lblOwnerText.setText("");
}
Kontakt responsible = stock.getResponsible();
if (responsible != null) {
lblResponsibleText.setText(responsible.getLabel());
} else {
lblResponsibleText.setText("");
}
String machineUuid = stock.getDriverUuid();
if (machineUuid != null && !machineUuid.isEmpty()) {
String info = CoreHub.getStockCommissioningSystemService()
.getInfoStringForDriver(UUID.fromString(machineUuid), false);
lblMachineuuid.setText(info);
} else {
lblMachineuuid.setText("");
}
} else {
lblOwnerText.setText("");
lblResponsibleText.setText("");
}
});
return container;
}
/**
* Initialize the preference page.
*/
public void init(IWorkbench workbench){
setPreferenceStore(new SettingsPreferenceStore(CoreHub.globalCfg));
getPreferenceStore().setDefault(Preferences.INVENTORY_CHECK_ILLEGAL_VALUES,
Preferences.INVENTORY_CHECK_ILLEGAL_VALUES_DEFAULT);
}
@Override
protected void performApply(){
tableViewer.setInput(new Query<Stock>(Stock.class).execute());
setErrorMessage(null);
super.performApply();
}
@Override
public boolean performOk(){
getPreferenceStore().setValue(Preferences.INVENTORY_CHECK_ILLEGAL_VALUES,
btnChkStoreInvalidNumbers.getSelection());
((SettingsPreferenceStore) getPreferenceStore()).flush();
return super.performOk();
}
protected DataBindingContext initDataBindings(){
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue observeTextTxtCodeObserveWidget =
WidgetProperties.text(SWT.Modify).observe(txtCode);
IObservableValue stockDetailCodeObserveDetailValue =
PojoProperties.value(Stock.class, "code", String.class).observeDetail(stockDetail);
bindingContext.bindValue(observeTextTxtCodeObserveWidget, stockDetailCodeObserveDetailValue,
null, null);
//
IObservableValue observeTextTxtDescriptionObserveWidget =
WidgetProperties.text(SWT.Modify).observe(txtDescription);
IObservableValue stockDetailDescriptionObserveDetailValue = PojoProperties
.value(Stock.class, "description", String.class).observeDetail(stockDetail);
bindingContext.bindValue(observeTextTxtDescriptionObserveWidget,
stockDetailDescriptionObserveDetailValue, null, null);
//
IObservableValue observeTextTxtLocationObserveWidget =
WidgetProperties.text(SWT.Modify).observe(txtLocation);
IObservableValue stockDetailLocationObserveDetailValue =
PojoProperties.value(Stock.class, "location", String.class).observeDetail(stockDetail);
bindingContext.bindValue(observeTextTxtLocationObserveWidget,
stockDetailLocationObserveDetailValue, null, null);
//
IObservableValue observeTextTxtPrioObserveWidget =
WidgetProperties.text(SWT.Modify).observe(txtPrio);
IObservableValue stockDetailGlobalPreferenceObserveDetailValue =
PojoProperties.value(Stock.class, "priority", Integer.class).observeDetail(stockDetail);
bindingContext.bindValue(observeTextTxtPrioObserveWidget,
stockDetailGlobalPreferenceObserveDetailValue, null, null);
//
IObservableValue observeTextTxtMachineConfigObserveWidget =
WidgetProperties.text(SWT.Modify).observe(txtMachineConfig);
IObservableValue stockDetailMachineConfigObserveDetailValue = PojoProperties
.value(Stock.class, "driverConfig", String.class).observeDetail(stockDetail);
bindingContext.bindValue(observeTextTxtMachineConfigObserveWidget,
stockDetailMachineConfigObserveDetailValue, null, null);
//
return bindingContext;
}
}