/*******************************************************************************
* Copyright (c) 2006-2007, 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
*
*******************************************************************************/
package ch.medshare.mediport;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Vector;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.data.Mandant;
import ch.elexis.data.Query;
import ch.elexis.tarmedprefs.TarmedRequirements;
import ch.elexis.core.ui.util.Log;
import ch.elexis.core.ui.util.SWTHelper;
import ch.medshare.awt.Desktop;
import ch.medshare.mediport.config.Client;
import ch.medshare.mediport.config.ClientParam;
import ch.medshare.mediport.config.ConfigKeys;
import ch.medshare.mediport.config.MPCProperties;
import ch.medshare.mediport.util.MediPortHelper;
import ch.medshare.swt.widgets.DirectoryText;
import ch.medshare.swt.widgets.FileText;
import ch.rgw.tools.ExHandler;
public class MediportClientSetsPrefPage extends MediPortAbstractPrefPage {
String prefsKey;
Combo cbMandant;
// Client Felder
Group clientComp;
Combo cbMKey;
Text txtSenderEan;
Button cxWieMandant;
DirectoryText txtSendDir;
DirectoryText txtReceiveDir;
DirectoryText txtReceiveTestDir;
DirectoryText txtErrorDir;
DirectoryText txtDocStatDir;
FileText txtPartnerFile;
// Param Felder
Group paramComp;
Combo cbNKey;
Text txtName;
DirectoryText txtClientDir;
Combo cbDocAttr;
Combo cbDocPrinted;
Combo cbDistType;
Combo cbPrintLanguage;
Text txtTrustCenterEAN;
Integer currentClientNum;
Integer currentParamNum;
Map<String, Mandant> mandantMap = new Hashtable<String, Mandant>();
private Client mapClientValues(Client mappedClient){
if (mappedClient == null) {
return null;
}
mappedClient.setEan(txtSenderEan.getText());
mappedClient.setSend_dir(txtSendDir.getText());
mappedClient.setReceive_dir(txtReceiveDir.getText());
mappedClient.setReceivetest_dir(txtReceiveTestDir.getText());
mappedClient.setError_dir(txtErrorDir.getText());
mappedClient.setPartner_file(txtPartnerFile.getText());
mappedClient.setDocstat_dir(txtDocStatDir.getText());
return mappedClient;
}
private ClientParam mapParamValues(ClientParam mappedParam){
if (mappedParam == null) {
return null;
}
mappedParam.setName(txtName.getText());
mappedParam.setDir(txtClientDir.getText());
String selDocAttr = cbDocAttr.getItem(cbDocAttr.getSelectionIndex());
mappedParam.setDocattr(selDocAttr);
String selDocPrinted = cbDocPrinted.getItem(cbDocPrinted.getSelectionIndex());
if (LBL_DOC_PRINT_COPY.equals(selDocPrinted)) {
mappedParam.setDocprinted(ConfigKeys.FALSE);
} else {
mappedParam.setDocprinted(ConfigKeys.TRUE);
}
String selDistType = cbDistType.getItem(cbDistType.getSelectionIndex());
if (LBL_DIST_TYPE_A.equals(selDistType)) {
mappedParam.setDisttype("1"); //$NON-NLS-1$
} else {
mappedParam.setDisttype("0"); //$NON-NLS-1$
}
String selLanguage = cbPrintLanguage.getItem(cbPrintLanguage.getSelectionIndex());
if (LBL_LANGUAGE_F.equals(selLanguage)) {
mappedParam.setPrintlanguage(ConfigKeys.FRENCH);
} else if (LBL_LANGUAGE_I.equals(selLanguage)) {
mappedParam.setPrintlanguage(ConfigKeys.ITALIAN);
} else {
mappedParam.setPrintlanguage(ConfigKeys.GERMAN);
}
mappedParam.setTrustcenterean(txtTrustCenterEAN.getText());
return mappedParam;
}
private Mandant getSelectedMandant(){
return this.mandantMap.get(cbMandant.getText());
}
private Integer getSelectedNum(Combo cbKey){
Integer key = null;
String keyStr = cbKey.getText();
if (keyStr != null && keyStr.length() > 0) {
if (!LBL_NEW_KEY.equals(keyStr)) {
try {
key = Integer.parseInt(cbKey.getText());
} catch (NumberFormatException e) {
Log.get(getClass().getName()).log(e.getMessage(), Log.WARNINGS);
}
}
}
return key;
}
private Integer getSelectedClientNum(){
return getSelectedNum(cbMKey);
}
private Integer getSelectedParamNum(){
return getSelectedNum(cbNKey);
}
private void fillMKey(Integer clientNum){
String clientNumStr = null;
if (clientNum != null) {
Client client = props.getClient(clientNum);
if (client != null) {
clientNumStr = clientNum.toString();
} else {
clientNum = null;
}
}
cbMKey.removeAll();
cbMKey.add(LBL_NEW_KEY);
for (String key : getFreeClientKeys(props, getSelectedMandant(), mandantMap.values())) {
cbMKey.add(key);
if (key.equals(clientNumStr)) {
clientNumStr = null;
}
}
if (clientNum != null) {
if (clientNumStr != null) {
cbMKey.add(clientNumStr);
}
cbMKey.setText(clientNum.toString());
} else {
cbMKey.setText(LBL_NEW_KEY);
}
this.currentClientNum = getSelectedClientNum();
}
private void fillNKey(Client client, Integer paramNum){
String paramNumStr = null;
if (paramNum != null) {
paramNumStr = paramNum.toString();
}
cbNKey.removeAll();
cbNKey.add(LBL_NEW_KEY);
if (client != null) {
for (Integer key : client.getParamKeys()) {
cbNKey.add(key.toString());
if (key.toString().equals(paramNumStr)) {
paramNumStr = null;
}
}
}
if (paramNum == null) {
cbNKey.select(0);
} else {
if (paramNumStr != null) {
cbNKey.add(paramNumStr);
}
cbNKey.setText(paramNum.toString());
}
this.currentParamNum = getSelectedParamNum();
}
private void fillClient(Mandant mandant, Integer clientNum){
Client client = props.getClient(clientNum);
if (client == null) {
client = new Client(getPrefString(MediPortAbstractPrefPage.MPC_INSTALL_DIR));
}
if ((client.getEan() == null || client.getEan().length() == 0) && mandant != null) {
client.setEan(TarmedRequirements.getEAN(mandant));
}
fillMKey(clientNum);
String mandantEan = TarmedRequirements.getEAN(mandant);
String senderEan = client.getEan();
if (senderEan == null && mandantEan != null) {
senderEan = mandantEan;
}
txtSenderEan.setText(senderEan);
cxWieMandant.setSelection((mandantEan == null && senderEan == null)
|| (senderEan!=null) && senderEan.equals(mandantEan));
txtSenderEan.setEnabled(!cxWieMandant.getSelection());
txtSendDir.setText(client.getSend_dir());
txtReceiveDir.setText(client.getReceive_dir());
txtReceiveTestDir.setText(client.getReceivetest_dir());
txtErrorDir.setText(client.getError_dir());
txtDocStatDir.setText(client.getDocstat_dir());
txtPartnerFile.setText(client.getPartner_file());
Integer firstParamKey = null;
if (client.getParamKeys().size() > 0) {
firstParamKey = client.getParamKeys().get(0);
}
fillParam(clientNum, firstParamKey);
}
private void fillParam(Integer clientNum, Integer paramNum){
Client client = props.getClient(clientNum);
ClientParam param =
new ClientParam(Messages.getString("MediportClientSetsPrefPage.default.paramName")); //$NON-NLS-1$
if (client != null && paramNum != null) {
param = client.getParam(paramNum);
}
fillNKey(client, paramNum);
txtName.setText(param.getName());
txtClientDir.setText(param.getDir());
cbDocAttr.setText(param.getDocattr());
if (ConfigKeys.TRUE.equals(param.getDocprinted())) {
cbDocPrinted.select(0);
} else {
cbDocPrinted.select(1);
}
if ("0".equals(param.getDisttype())) { // B-Post //$NON-NLS-1$
cbDistType.select(0);
} else {
cbDistType.select(1);
}
if (ConfigKeys.FRENCH.equals(param.getPrintlanguage())) {
cbPrintLanguage.select(1);
} else if (ConfigKeys.ITALIAN.equals(param.getPrintlanguage())) {
cbPrintLanguage.select(2);
} else {
cbPrintLanguage.select(0);
}
txtTrustCenterEAN.setText(param.getTrustcenterean());
}
private void writeClient(){
Integer clientNum = this.currentClientNum;
Client client = null;
if (clientNum != null) {
client = props.getClient(clientNum);
}
if (client == null) {
client = new Client(getPrefString(MediPortAbstractPrefPage.MPC_INSTALL_DIR));
clientNum = props.addNewClient(client);
fillMKey(clientNum);
}
mapClientValues(client);
putPrefString(prefsKey, String.valueOf(clientNum));
storePrefs();
}
private void writeParam(){
Integer clientNum = this.currentClientNum;
ClientParam param = new ClientParam(""); //$NON-NLS-1$
if (clientNum != null) {
Client client = props.getClient(clientNum);
Integer paramNum = this.currentParamNum;
if (paramNum != null) {
param = client.getParam(paramNum);
} else {
paramNum = client.addNewParam(param);
fillNKey(client, paramNum);
}
}
mapParamValues(param);
}
private boolean storeParam(){
writeParam();
try {
props.store();
} catch (IOException ex) {
ExHandler.handle(ex);
MessageDialog.openError(getShell(), Messages
.getString("MediportClientSetsPrefPage.error.title.saveConfig"), ex //$NON-NLS-1$
.getMessage());
return false;
}
return true;
}
protected boolean storeAll(){
if (props != null) {
writeClient();
return storeParam();
}
return true;
}
private void clientChanged(){
// Zuerst aktuelle Werte speichern
if (this.currentClientNum != null) {
Client client = props.getClient(this.currentClientNum);
client = mapClientValues(client);
if (client != null && client.hasChanged()) {
storeAll();
}
}
Integer clientNum = getSelectedClientNum();
Mandant mandant = getSelectedMandant();
prefsKey = MediPortHelper.getMandantPrefix(mandant.getLabel());
String numString = getPrefString(prefsKey);
if (numString != null && numString.length() > 0) {
clientNum = Integer.parseInt(numString);
}
fillClient(mandant, clientNum);
}
private void mKeyChanged(){
// Zuerst aktuelle Werte speichern
if (this.currentClientNum != null) {
Client client = props.getClient(this.currentClientNum);
client = mapClientValues(client);
if (client != null && client.hasChanged()) {
storeAll();
}
}
this.currentClientNum = getSelectedClientNum();
fillClient(getSelectedMandant(), this.currentClientNum);
}
private void nKeyChanged(){
// Zuerst aktuelle Werte speichern
Integer clientNum = getSelectedClientNum();
if (clientNum != null && this.currentParamNum != null) {
Client client = props.getClient(clientNum);
ClientParam param = client.getParam(this.currentParamNum);
param = mapParamValues(param);
if (param != null && param.hasChanged()) {
storeAll();
}
}
this.currentParamNum = getSelectedParamNum();
fillParam(clientNum, this.currentParamNum);
}
private List<String> getFreeClientKeys(MPCProperties props, Mandant currentMandant,
Collection<Mandant> mandanten){
// Zugeordnete Mandanten lesen
List<String> allocatedKeyList = new Vector<String>();
for (Mandant m : mandanten) {
if (!m.equals(currentMandant)) {
String key = getPrefString(MediPortHelper.getMandantPrefix(m.getLabel()));
if (key != null && key.length() > 0) {
allocatedKeyList.add(key);
}
}
}
List<String> retList = new Vector<String>();
for (Integer key : props.getClientKeys()) {
String keyStr = key.toString();
if (!allocatedKeyList.contains(keyStr)) {
retList.add(keyStr);
}
}
return retList;
}
@Override
protected Control createContents(Composite parent){
if (props != null) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(2, false));
cbMandant = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.FILL);
cbMandant.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
// Client
clientComp = new Group(comp, SWT.NONE);
clientComp.setText(Messages.getString("MediportClientSetsPrefPage.lbl.title.config")); //$NON-NLS-1$
clientComp.setLayout(new GridLayout(3, false));
clientComp.setLayoutData(SWTHelper.getFillGridData(3, true, 1, true));
Label lblMKey = new Label(clientComp, SWT.NONE);
lblMKey.setText(Messages.getString("MediportClientSetsPrefPage.lbl.mKey")); //$NON-NLS-1$
cbMKey = new Combo(clientComp, SWT.DROP_DOWN | SWT.READ_ONLY);
cbMKey.setLayoutData(SWTHelper.getFillGridData(2, false, 1, false));
Label lblEan = new Label(clientComp, SWT.NONE);
lblEan.setText(Messages.getString("MediportClientSetsPrefPage.lbl.SenderEAN")); //$NON-NLS-1$
txtSenderEan = new Text(clientComp, SWT.BORDER);
txtSenderEan.setEnabled(false);
txtSenderEan.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
cxWieMandant = new Button(clientComp, SWT.CHECK);
cxWieMandant.setText(Messages.getString("MediportClientSetsPrefPage.lbl.WieMandant")); //$NON-NLS-1$
Label lblSendDir = new Label(clientComp, SWT.NONE);
lblSendDir.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.Sendeverzeichnis")); //$NON-NLS-1$
txtSendDir = new DirectoryText(clientComp, SWT.BORDER);
txtSendDir.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Label lblReceiveDir = new Label(clientComp, SWT.NONE);
lblReceiveDir.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.Empfangsverzeichnis")); //$NON-NLS-1$
txtReceiveDir = new DirectoryText(clientComp, SWT.BORDER);
txtReceiveDir.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Label lblReceiveTestDir = new Label(clientComp, SWT.NONE);
lblReceiveTestDir.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.EmpfangsverzeichnisTest")); //$NON-NLS-1$
txtReceiveTestDir = new DirectoryText(clientComp, SWT.BORDER);
txtReceiveTestDir.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Label lblErrorDir = new Label(clientComp, SWT.NONE);
lblErrorDir.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.Fehlerverzeichnis")); //$NON-NLS-1$
txtErrorDir = new DirectoryText(clientComp, SWT.BORDER);
txtErrorDir.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Label lblDocStatDir = new Label(clientComp, SWT.NONE);
lblDocStatDir.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.DokumentstatusVerzeichnis")); //$NON-NLS-1$
txtDocStatDir = new DirectoryText(clientComp, SWT.BORDER);
txtDocStatDir.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Label lblPartnerFile = new Label(clientComp, SWT.NONE);
lblPartnerFile
.setText(Messages.getString("MediportClientSetsPrefPage.lbl.Partnerfile")); //$NON-NLS-1$
txtPartnerFile = new FileText(clientComp, SWT.BORDER);
txtPartnerFile.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Button btnPartnerFile = new Button(clientComp, SWT.PUSH);
btnPartnerFile.setText(Messages
.getString("MediportClientSetsPrefPage.btn.PartnerinfoAnzeigen")); //$NON-NLS-1$
btnPartnerFile.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
// Parameter-Set
paramComp = new Group(clientComp, SWT.NONE);
paramComp.setText(Messages.getString("MediportClientSetsPrefPage.lbl.title.Parameter")); //$NON-NLS-1$
paramComp.setLayout(new GridLayout(3, false));
paramComp.setLayoutData(SWTHelper.getFillGridData(3, true, 1, true));
Label lblNKey = new Label(paramComp, SWT.NONE);
lblNKey.setText(Messages.getString("MediportClientSetsPrefPage.lbl.nKey")); //$NON-NLS-1$
cbNKey = new Combo(paramComp, SWT.DROP_DOWN | SWT.READ_ONLY);
cbNKey.setLayoutData(SWTHelper.getFillGridData(2, false, 1, false));
Label lblParam = new Label(paramComp, SWT.NONE);
lblParam.setText(Messages.getString("MediportClientSetsPrefPage.lbl.Bezeichnung")); //$NON-NLS-1$
txtName = new Text(paramComp, SWT.BORDER);
txtName.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
Label lblClientDir = new Label(paramComp, SWT.NONE);
lblClientDir.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.Ausgabeverzeichnis")); //$NON-NLS-1$
txtClientDir = new DirectoryText(paramComp, SWT.BORDER);
txtClientDir.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Label lblDocAttr = new Label(paramComp, SWT.NONE);
lblDocAttr.setText(Messages.getString("MediportClientSetsPrefPage.lbl.Workflow")); //$NON-NLS-1$
cbDocAttr = new Combo(paramComp, SWT.BORDER | SWT.READ_ONLY);
cbDocAttr.add(TIER_PAYANT);
cbDocAttr.add(TIER_GARANT_MANUELL);
cbDocAttr.add(TIER_GARANT_DIRECT);
cbDocAttr.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
Label lblDocPrinted = new Label(paramComp, SWT.NONE);
lblDocPrinted.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.Rechnungskopie")); //$NON-NLS-1$
cbDocPrinted = new Combo(paramComp, SWT.BORDER | SWT.READ_ONLY);
cbDocPrinted.add(LBL_DOC_NO_PRINT);
cbDocPrinted.add(LBL_DOC_PRINT_COPY);
cbDocPrinted.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
Label lblDistType = new Label(paramComp, SWT.NONE);
lblDistType.setText(Messages.getString("MediportClientSetsPrefPage.lbl.Versandart")); //$NON-NLS-1$
cbDistType = new Combo(paramComp, SWT.BORDER | SWT.READ_ONLY);
cbDistType.add(LBL_DIST_TYPE_B);
cbDistType.add(LBL_DIST_TYPE_A);
cbDistType.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
Label lblPrintLanguage = new Label(paramComp, SWT.NONE);
lblPrintLanguage.setText(Messages
.getString("MediportClientSetsPrefPage.lbl.Drucksprache")); //$NON-NLS-1$
cbPrintLanguage = new Combo(paramComp, SWT.BORDER | SWT.READ_ONLY);
cbPrintLanguage.add(LBL_LANGUAGE_D);
cbPrintLanguage.add(LBL_LANGUAGE_F);
cbPrintLanguage.add(LBL_LANGUAGE_I);
cbPrintLanguage.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
Label lblTrustEan = new Label(paramComp, SWT.NONE);
lblTrustEan
.setText(Messages.getString("MediportClientSetsPrefPage.lbl.TrustcenterEAN")); //$NON-NLS-1$
txtTrustCenterEAN = new Text(paramComp, SWT.BORDER);
txtTrustCenterEAN.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// Events
cbMandant.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
clientChanged();
}
});
cbMKey.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
mKeyChanged();
}
});
cxWieMandant.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
txtSenderEan.setEnabled(!cxWieMandant.getSelection());
txtSenderEan.setText(TarmedRequirements.getEAN(getSelectedMandant()));
}
});
cbNKey.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
nKeyChanged();
}
});
btnPartnerFile.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
try {
File partnerFile = new File(txtPartnerFile.getText());
Desktop.open(partnerFile);
} catch (Exception ex) {
ExHandler.handle(ex);
MessageDialog
.openError(
getShell(),
Messages
.getString("MediportClientSetsPrefPage.error.msg.PartnerdateiOeffnen"), ex.getMessage()); //$NON-NLS-1$
}
}
});
// Data
Query<Mandant> qbe = new Query<Mandant>(Mandant.class);
List<Mandant> list = qbe.execute();
for (Mandant m : list) {
cbMandant.add(m.getLabel());
mandantMap.put(m.getLabel(), m);
}
final String actMandantLabel = CoreHub.actMandant.getLabel();
cbMandant.setText(actMandantLabel);
cxWieMandant.setSelection(true);
cbDocAttr.select(0);
cbDocPrinted.select(0);
cbDistType.select(0);
String defaultLang = Locale.getDefault().getLanguage();
if (Locale.FRENCH.getLanguage().equals(defaultLang)) {
cbPrintLanguage.select(1);
} else if (Locale.ITALIAN.getLanguage().equals(defaultLang)) {
cbPrintLanguage.select(2);
} else {
cbPrintLanguage.select(0);
}
clientChanged();
return comp;
} else {
Composite form = new Composite(parent, SWT.NONE);
form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
form.setLayout(new FillLayout());
new Label(form, SWT.WRAP).setText(Messages
.getString("MediportClientSetsPrefPage.error.msg.missingConfiguration")); //$NON-NLS-1$
return form;
}
}
@Override
protected void showReloadInfo(){
if (props != null) {
MessageDialog.openInformation(getShell(), Messages
.getString("MediportClientSetsPrefPage.info.title.MediPortCommunicator"), //$NON-NLS-1$
Messages.getString("MediportClientSetsPrefPage.info.reloadInfo1") //$NON-NLS-1$
+ Messages.getString("MediportClientSetsPrefPage.info.reloadInfo2")); //$NON-NLS-1$
}
}
public void init(IWorkbench workbench){
setMessage(Messages.getString("MediportClientSetsPrefPage.message")); //$NON-NLS-1$
}
}