/*******************************************************************************
* Copyright (c) 2006-2011, 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
* H. Marlovits - added more field types (multiple lines text, styled text, combos, checkboxes, lists)
* added optional and unused/deleted fields editor
*******************************************************************************/
package ch.elexis.core.ui.preferences;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.constants.Preferences;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.constants.ExtensionPointConstantsData;
import ch.elexis.core.data.util.Extensions;
import ch.elexis.core.data.util.MultiplikatorList;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.constants.ExtensionPointConstantsUi;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.preferences.inputs.MultiplikatorEditor;
import ch.elexis.core.ui.util.ListDisplay;
import ch.elexis.core.ui.util.Log;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.Fall;
import ch.elexis.data.PersistentObject;
import ch.rgw.tools.JdbcLink;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
public class Leistungscodes extends PreferencePage implements IWorkbenchPreferencePage {
private static final String DEFINITIONSDELIMITER = ";"; //$NON-NLS-1$
private static final String ARGUMENTSSDELIMITER = ":"; //$NON-NLS-1$
private static final String ITEMDELIMITER = "\t"; //$NON-NLS-1$
private static final String FOURLINESPLACEHOLDER = "\n\n\n\nd"; //$NON-NLS-1$
List<IConfigurationElement> lo = Extensions
.getExtensions(ExtensionPointConstantsData.RECHNUNGS_MANAGER); //$NON-NLS-1$
List<IConfigurationElement> ll = Extensions
.getExtensions(ExtensionPointConstantsUi.VERRECHNUNGSCODE); //$NON-NLS-1$
String[] systeme = CoreHub.globalCfg.nodes(Preferences.LEISTUNGSCODES_CFG_KEY);
Table table;
String[] tableCols = {
Messages.Leistungscodes_nameOfBillingSystem, Messages.Leistungscodes_billingSystem,
Messages.Leistungscodes_defaultOutput, Messages.Leistungscodes_multiplier
};
int[] tableWidths = {
60, 120, 120, 70
};
Button bCheckZero;
Button bStrictCheck;
@Override
protected Control createContents(final Composite parent){
Composite ret = new Composite(parent, SWT.NONE);
ret.setLayout(new GridLayout(2, false));
// *** set label on top
Label l1 = new Label(ret, SWT.NONE);
l1.setText(Messages.Leistungscodes_billingSystems);
l1.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// *** hyperlinks new and delete
SWTHelper.createHyperlink(ret, Messages.Leistungscodes_new, new HyperlinkAdapter() {
@Override
public void linkActivated(final HyperlinkEvent e){
AbrechnungsTypDialog at = new AbrechnungsTypDialog(getShell(), null);
if (at.open() == Dialog.OK) {
String[] result = at.getResult();
String key = Preferences.LEISTUNGSCODES_CFG_KEY + "/" + result[0]; //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/name", result[0]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/leistungscodes", result[1]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/standardausgabe", result[2]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/bedingungen", result[3]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/fakultativ", result[4]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/unused", result[5]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/disabled", result[6]); //$NON-NLS-1$
systeme = CoreHub.globalCfg.nodes(Preferences.LEISTUNGSCODES_CFG_KEY);
reload();
}
}
});
SWTHelper.createHyperlink(ret, Messages.Leistungscodes_delete, new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e){
TableItem sel = table.getSelection()[0];
String bName = sel.getText(0);
if (SWTHelper.askYesNo(
MessageFormat.format(Messages.Leistungscodes_reallyDelete, bName),
Messages.Leistungscodes_notUndoable)) {
Fall.removeAbrechnungssystem(bName);
systeme = CoreHub.globalCfg.nodes(Preferences.LEISTUNGSCODES_CFG_KEY);
reload();
}
}
});
// *** table with definitions of systems
table = new Table(ret, SWT.FULL_SELECTION | SWT.SINGLE);
for (int i = 0; i < tableCols.length; i++) {
TableColumn tc = new TableColumn(table, SWT.NONE);
tc.setText(tableCols[i]);
tc.setWidth(tableWidths[i]);
}
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(final MouseEvent e){
int idx = table.getSelectionIndex();
if (idx != -1) {
TableItem sel = table.getItem(idx);
String ssel = sel.getText(0);
for (String s1 : systeme) {
if (s1.equals(ssel)) {
String[] pre = new String[7];
pre[0] = s1;
pre[1] = Fall.getCodeSystem(s1);
pre[2] = Fall.getDefaultPrintSystem(s1);
pre[3] = Fall.getRequirements(s1);
pre[4] = Fall.getOptionals(s1);
pre[5] = Fall.getUnused(s1);
pre[6] = "" + isBillingSystemDisabled(s1); //$NON-NLS-1$
AbrechnungsTypDialog at = new AbrechnungsTypDialog(getShell(), pre);
if (at.open() == Dialog.OK) {
String[] result = at.getResult();
String key = Preferences.LEISTUNGSCODES_CFG_KEY + "/" + result[0]; //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/name", result[0]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/leistungscodes", result[1]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/standardausgabe", result[2]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/bedingungen", result[3]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/fakultativ", result[4]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/unused", result[5]); //$NON-NLS-1$
CoreHub.globalCfg.set(key + "/disabled", result[6]); //$NON-NLS-1$
systeme =
CoreHub.globalCfg.nodes(Preferences.LEISTUNGSCODES_CFG_KEY);
reload();
}
}
}
}
}
});
table.setLayoutData(SWTHelper.getFillGridData(2, true, 1, true));
// *** checkboxes check zero, strict check and optify check
bCheckZero = new Button(ret, SWT.CHECK);
bCheckZero.setText(Messages.Leistungscodes_checkZero);
bCheckZero.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
CoreHub.userCfg.set(Preferences.LEISTUNGSCODES_BILLING_ZERO_CHECK,
bCheckZero.getSelection());
}
});
bCheckZero.setSelection(CoreHub.userCfg.get(Preferences.LEISTUNGSCODES_BILLING_ZERO_CHECK,
false));
bCheckZero.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
bStrictCheck = new Button(ret, SWT.CHECK);
bStrictCheck.setText(Messages.Leistungscodes_strictValidityCheck);
bStrictCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
CoreHub.userCfg.set(Preferences.LEISTUNGSCODES_BILLING_STRICT,
bStrictCheck.getSelection());
}
});
bStrictCheck.setSelection(CoreHub.userCfg.get(Preferences.LEISTUNGSCODES_BILLING_STRICT,
true));
bStrictCheck.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
final Button bOptify = new Button(ret, SWT.CHECK);
bOptify.setText(Messages.Leistungscodes_checkPositions);
bOptify.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
CoreHub.userCfg.set(Preferences.LEISTUNGSCODES_OPTIFY, bOptify.getSelection());
}
});
bOptify.setSelection(CoreHub.userCfg.get(Preferences.LEISTUNGSCODES_OPTIFY, true));
bOptify.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// *** checkbox for enforcing separate Fall for obligations and non obligations
final Button bObligation = new Button(ret, SWT.CHECK);
bObligation.setText("Pflichtleistungen und Nichtpflichtleistungen trennen");
bObligation.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
CoreHub.userCfg.set(Preferences.LEISTUNGSCODES_OBLIGATION,
bObligation.getSelection());
}
});
bObligation.setSelection(CoreHub.userCfg.get(Preferences.LEISTUNGSCODES_OBLIGATION, false));
bObligation.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// *** populate the table with items
reload();
return ret;
}
/**
* returns true if the billing system specified by the param is DISabled else returns false
*
* @param billingSystem
* String, the name of the billing system to be tested
*/
public static boolean isBillingSystemDisabled(final String billingSystem){
String ret = CoreHub.globalCfg.get(Preferences.LEISTUNGSCODES_CFG_KEY + "/" //$NON-NLS-1$
+ billingSystem + "/disabled", "0"); //$NON-NLS-1$ //$NON-NLS-2$
if (ret.equalsIgnoreCase("0")) //$NON-NLS-1$
return false;
else
return true;
}
/**
* (re)build the table for the billing systems, populate the table with items
*/
public void reload(){
// *** remove all items first
table.removeAll();
// *** and rebuild the table contents
if (systeme != null) {
for (String s : systeme) {
String cfgkey = Preferences.LEISTUNGSCODES_CFG_KEY + "/" + s + "/"; //$NON-NLS-1$ //$NON-NLS-2$
TableItem it = new TableItem(table, SWT.NONE);
String name = CoreHub.globalCfg.get(cfgkey + "name", "default"); //$NON-NLS-1$ //$NON-NLS-2$
it.setText(0, name);
it.setText(1, CoreHub.globalCfg.get(cfgkey + "leistungscodes", "?")); //$NON-NLS-1$ //$NON-NLS-2$
it.setText(2, CoreHub.globalCfg.get(cfgkey + "standardausgabe", "?")); //$NON-NLS-1$ //$NON-NLS-2$
StringBuilder sql = new StringBuilder();
TimeTool actdat = new TimeTool();
MultiplikatorList multis = new MultiplikatorList("VK_PREISE", name); //$NON-NLS-1$
String tp = Double.toString(multis.getMultiplikator(actdat));
if (StringTool.isNothing(tp)) {
if (CoreHub.getSystemLogLevel() > Log.INFOS) {
SWTHelper.alert(Messages.Leistungscodes_didNotFindMulitplier,
Messages.Leistungscodes_query + sql.toString());
}
tp = "1.0"; //$NON-NLS-1$
}
it.setText(3, tp);
}
}
}
public void init(final IWorkbench workbench){
// *** at the moment do just nothing
}
/**
* show an input dialog for entering the name for the new case-field, <br>
* additionally different options to specify: <br>
* <br>
* <b> for text: </b>
* <ul>
* <li>
* checkbox for multiline text input</li>
* <li>
* checkbox for styled text input</li>
* </ul>
* <b> for date: </b>
* <ul>
* <li>
* simple text input</li>
* </ul>
* <b> for combo, list, radiogroup: </b>
* <ul>
* <li>
* field displayed for entering item values</li>
* <li>
* checkbox for saving as numeric value</li>
* </ul>
* <b> for checkboxes: </b>
* <ul>
* <li>
* field displayed for entering item values</li>
* </ul>
* <br>
*
* @author Harald Marlovits
*
*/
class AbrechnungsTypDialog_InputDialog extends Dialog {
String cDialogTitle;
String cDialogMessage;
ListDisplay<String>[] cNoDuplicatesList;
Text tName = null; // *** text field for field name
String cInitialValue;
Text tTextEditor = null; // *** text field for entering item values
boolean cHasTextEditor;
String cTextEditorValue; // *** initial value for this text field
boolean cTextNeeded;
Button chNumeric = null; // *** checkbox numeric
boolean cHasNumericCheckbox;
boolean cIsNumericChecked;
Button chMultiline = null; // *** checkbox multiline
boolean cHasStyledCheckbox;
boolean cIsStyledChecked;
Button chStyled = null; // *** checkbox styled text
boolean cHasMultilineCheckbox;
boolean cIsMultilineChecked;
String[] result = null; // *** String Array for result
Combo changeCombo;
String[] cChangeTypeItems;
String cCurrentFieldType;
String cBilllingSystemDisabled;
/**
*
* @param parentShell
* Shell, the parentShell...
* @param dialogTitle
* String, the text displayed in the window bar
* @param dialogMessage
* String, the message displayed at the top of the window
* @param initialValue
* String, the value displayed for the name of the field
* @param noDuplicatesList
* ListDisplay<String>[], array of ListDisplay's containing item names which
* should not be duplicated
* @param text
* String, the initial text value for the text editor field (for the item values)
* @param isNumericChecked
* Boolean, should the checkbox be checked
* @param isStyledChecked
* Boolean, should the checkbox be checked
* @param isMultilineChecked
* Boolean, should the checkbox be checked
* @param changeTypeItems
* String[], list of types to which this field can be changed to - if null, then
* display no combo
*/
public AbrechnungsTypDialog_InputDialog(Shell parentShell, final String dialogTitle,
final String dialogMessage, final String initialValue,
ListDisplay<String>[] noDuplicatesList, String text, boolean isNumericChecked,
boolean isStyledChecked, boolean isMultilineChecked, String[] changeTypeItems){
super(parentShell);
cCurrentFieldType = dialogTitle.replaceAll("\\.\\.\\..*", StringTool.leer) + "..."; //$NON-NLS-1$ //$NON-NLS-2$;
cDialogTitle = dialogTitle.replaceAll("\\.\\.\\.", StringTool.leer); //$NON-NLS-1$
cDialogMessage = dialogMessage;
cInitialValue = initialValue;
cNoDuplicatesList = noDuplicatesList;
cTextEditorValue = text;
cIsNumericChecked = isNumericChecked;
cIsStyledChecked = isStyledChecked;
cIsMultilineChecked = isMultilineChecked;
if (changeTypeItems != null) {
for (int i = 0; i < changeTypeItems.length; i++) {
changeTypeItems[i] =
changeTypeItems[i].replaceAll("\\.\\.\\.", StringTool.leer); //$NON-NLS-1$
}
}
cChangeTypeItems = changeTypeItems;
calcFieldPresence();
}
protected void calcFieldPresence(){
cHasTextEditor = false;
cTextNeeded = true;
cHasNumericCheckbox = false;
cHasStyledCheckbox = false;
cHasMultilineCheckbox = false;
if (cCurrentFieldType.equalsIgnoreCase(Messages.Leistungscodes_contactHL)) {} else if (cCurrentFieldType
.equalsIgnoreCase(Messages.Leistungscodes_textHL)) {
cHasStyledCheckbox = true;
cHasMultilineCheckbox = true;
} else if (cCurrentFieldType.equalsIgnoreCase(Messages.Leistungscodes_dateHL)) {} else if (cCurrentFieldType
.equalsIgnoreCase(Messages.Leistungscodes_comboHL)) {
cHasTextEditor = true;
cHasNumericCheckbox = true;
} else if (cCurrentFieldType.equalsIgnoreCase(Messages.Leistungscodes_listHL)) {
cHasTextEditor = true;
cHasNumericCheckbox = true;
} else if (cCurrentFieldType.equalsIgnoreCase(Messages.Leistungscodes_checkboxHL)) {
cHasTextEditor = true;
cTextNeeded = false;
} else if (cCurrentFieldType.equalsIgnoreCase(Messages.Leistungscodes_radioHL)) {
cHasTextEditor = true;
cHasNumericCheckbox = true;
}
}
/**
* @parentShell the parent shell, or null to create a top-level shell
* @dialogTitle the dialog title, or null if none
* @dialogMessage the dialog message, or null if none
* @initialValue the initial input value, or null if none (equivalent to the empty string)
*/
protected Control createDialogArea(final Composite parent){
// *** remove any existing controls - used if refreshing for
// changing field type
Control[] controls = parent.getChildren();
for (Control c : controls) {
c.dispose();
}
// *** create top composite
Composite ret = new Composite(parent, SWT.NONE);
ret.setLayoutData(SWTHelper.getFillGridData(1, false, 1, true));
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = 5;
gridLayout.marginTop = 7;
gridLayout.marginBottom = 5;
gridLayout.marginLeft = 5;
gridLayout.marginRight = 5;
ret.setLayout(gridLayout);
// *** message on top of the window
Label label = new Label(ret, SWT.NONE);
label.setText(cDialogMessage);
label.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// *** field for entering field name
tName = new Text(ret, SWT.BORDER);
tName.setText(cInitialValue);
tName.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// *** spacer...
Label spacer = new Label(ret, SWT.NONE);
spacer.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// *** display text editor if needed
if (cHasTextEditor) {
Label teLabel = new Label(ret, SWT.NONE);
teLabel.setText(Messages.Leistungscodes_EnterItems);
teLabel.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
tTextEditor = new Text(ret, SWT.BORDER + SWT.MULTI + SWT.V_SCROLL);
tTextEditor.setLayoutData(SWTHelper.getFillGridData(2, true, 1, true));
tTextEditor.setText(FOURLINESPLACEHOLDER); // force 4 lines
// size...
tTextEditor.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
}
// *** display checkbox for numeric/multiline/styled
if (cHasNumericCheckbox) {
chNumeric = new Button(ret, SWT.CHECK);
chNumeric.setText(Messages.Leistungscodes_SaveAsNumeric);
chNumeric.setSelection(cIsNumericChecked);
chNumeric.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
}
if (cHasMultilineCheckbox) {
chMultiline = new Button(ret, SWT.CHECK);
chMultiline.setText(Messages.Leistungscodes_SaveAsMultiplelinesText);
chMultiline.setSelection(cIsMultilineChecked);
chMultiline.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
}
// *** +++++ styled text not yet ok - just for testing now
if (cHasStyledCheckbox & (CoreHub.actUser.getLabel().equalsIgnoreCase("a"))) { //$NON-NLS-1$
chStyled = new Button(ret, SWT.CHECK);
chStyled.setText(Messages.Leistungscodes_SaveAsStyledText);
chStyled.setSelection(cIsStyledChecked);
chStyled.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
}
// *** add change fieldType combo
if (cChangeTypeItems != null) {
// *** placeholder
new Label(ret, SWT.SEPARATOR | SWT.HORIZONTAL).setLayoutData(SWTHelper
.getFillGridData(2, true, 1, false));
Label currentTypeLabel = new Label(ret, SWT.NONE);
currentTypeLabel.setText("Aktueller Feldtyp: "); //$NON-NLS-1$);
Label currentType = new Label(ret, SWT.NONE);
currentType.setText(cCurrentFieldType.replaceAll("\\.\\.\\.", StringTool.leer)); //$NON-NLS-1$);
Label changeLabel = new Label(ret, SWT.NONE);
changeLabel.setText(Messages.Leistungscodes_changeFieldTypeTo);
changeCombo = new Combo(ret, SWT.NONE);
changeCombo.setItems(cChangeTypeItems);
changeCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e){
Combo selCombo = (Combo) e.widget;
String selectedFieldType = selCombo.getText();
cCurrentFieldType = selectedFieldType + "..."; //$NON-NLS-1$
cDialogTitle = cCurrentFieldType.replaceAll("\\.\\.\\.", StringTool.leer); //$NON-NLS-1$
calcFieldPresence();
createDialogArea(parent); // *** create the dialog area
// again
createButtonBar(parent); // *** draw the button bar
// again
parent.layout(true); // *** force layout
initializeBounds(); // *** recalc and set size of window
if (tTextEditor != null)
tTextEditor.setText(cTextEditorValue); // force 4
// lines
// end..
}
@Override
public void widgetDefaultSelected(SelectionEvent e){}
});
}
return ret;
}
@Override
public void create(){
super.create();
getShell().setText(cDialogTitle);
if (tTextEditor != null)
tTextEditor.setText(cTextEditorValue); // force 4 lines end...
}
/**
* validate input if not ok then display error message and return false, <br>
* else create result as String[] containing:
* <ul>
* <li>
* [0] fieldName</li>
* <li>
* [1] options for combo/list/checkboxes/radiogroup</li>
* <li>
* [2] boolean numeric</li>
* <li>
* [3] boolean multiline</li>
* <li>
* [4] boolean styled text</li>
* <li>
* [5] String new field type</li>
* <li>
* [6] boolean billing system disabled</li>
*/
@Override
protected void okPressed(){
// *** build result String Array
result = new String[7];
result[0] = tName.getText();
result[1] =
(tTextEditor == null || tTextEditor.isDisposed()) ? StringTool.leer : tTextEditor
.getText();
result[2] =
(chNumeric == null || chNumeric.isDisposed()) ? "0" : ((chNumeric.getSelection()) ? "1" : "0"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
result[3] =
(chMultiline == null || chMultiline.isDisposed()) ? "0" : ((chMultiline.getSelection()) ? "1" : "0"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
result[4] =
(chStyled == null || chStyled.isDisposed()) ? "0" : ((chStyled.getSelection()) ? "1" : "0"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
result[5] = cCurrentFieldType;
result[6] = cBilllingSystemDisabled;
// *** do some validation: needs a name, some characters are not
// allowed, no duplicates are allowed
String errorString = StringTool.leer;
if (result[0].isEmpty()) {
errorString = errorString + Messages.Leistungscodes_ErrorNameMissing;
}
if ((result[0].indexOf(ARGUMENTSSDELIMITER) >= 0)
|| (result[0].indexOf(DEFINITIONSDELIMITER) >= 0)
|| (result[0].indexOf(ITEMDELIMITER) >= 0)) {
errorString = errorString + Messages.Leistungscodes_ErrorNameNoSpecialChars;
}
if ((!cInitialValue.equalsIgnoreCase(result[0]))
&& (fieldExistsAlready(result[0], cNoDuplicatesList))) {
errorString = errorString + Messages.Leistungscodes_ErrorFieldAlreadyExists;
}
if (cHasTextEditor) {
if (cTextNeeded) {
if ((result[1].length() > 4)
&& (result[1].substring(0, 4).equalsIgnoreCase("SQL:"))) { //$NON-NLS-1$
// *** SQL-variant, is directly passed through
} else if ((result[1].length() > 7)
&& (result[1].substring(0, 7).equalsIgnoreCase("SCRIPT:"))) { //$NON-NLS-1$
// *** SCRIPT-variant, is directly passed through
} else {
// *** simple listing, line by line
String tmp = result[1].replaceAll("\r\n", DEFINITIONSDELIMITER); //$NON-NLS-1$
tmp = tmp.replaceAll("\n", DEFINITIONSDELIMITER); //$NON-NLS-1$
tmp = tmp.replaceAll("\r", DEFINITIONSDELIMITER); //$NON-NLS-1$
if ((tmp.isEmpty()) || (tmp.split(DEFINITIONSDELIMITER).length < 2)) {
errorString = errorString + Messages.Leistungscodes_ErrorAtLeast2Items;
}
if (!tmp.isEmpty()) {
if ((tmp.substring(0, 1).equalsIgnoreCase(DEFINITIONSDELIMITER))
|| (tmp.indexOf(DEFINITIONSDELIMITER + DEFINITIONSDELIMITER) >= 0)) {
errorString =
errorString + Messages.Leistungscodes_ErrorNoEmptyItemsAllowed;
}
}
if ((result[1].indexOf(ARGUMENTSSDELIMITER) >= 0)
|| (result[1].indexOf(DEFINITIONSDELIMITER) >= 0)
|| (result[1].indexOf(ITEMDELIMITER) >= 0)) {
errorString =
errorString + Messages.Leistungscodes_ErrorItemsNoSpecialChars;
}
}
}
}
// *** return if ok, else stay open
if (errorString.isEmpty()) {
super.okPressed();
} else {
SWTHelper.alert(Messages.Leistungscodes_ErrorMessageTitlebar, errorString);
}
}
public String[] getResult(){
return result;
}
}
/**
* class for entering billing systems
*
* @author G. Weirich / Harald Marlovits
*
*/
class AbrechnungsTypDialog extends TitleAreaDialog {
Text tName;
Combo cbLstg;
Combo cbRechn;
Button cbDisabled;
Label lbTaxp;
String[] result;
MultiplikatorEditor mke;
ListDisplay<String> ldConstants;
ListDisplay<String> ldRequirements;
ListDisplay<String> ldOptional;
ListDisplay<String> ldUnused;
/**
* the constructor,
*
* @param shell
* @param abrdef
* String, the name of the billing system
*/
AbrechnungsTypDialog(final Shell shell, final String[] abrdef){
super(shell);
result = abrdef;
}
@SuppressWarnings("unchecked")
@Override
protected Control createDialogArea(final Composite parent){
ScrolledComposite scroller = new ScrolledComposite(parent, SWT.V_SCROLL);
Composite ret = new Composite(scroller, SWT.NONE);
ret.setLayoutData(SWTHelper.getFillGridData(1, false, 1, true));
ret.setLayout(new GridLayout(1, false));
// ****** upper part: three combos and a checkbox, has separator below
Composite upperPartComp = new Composite(ret, SWT.NONE);
upperPartComp.setLayoutData(SWTHelper.getFillGridData(1, false, 1, false));
upperPartComp.setLayout(new GridLayout(2, false));
// *** label/text field for LeistungsSystem name
new Label(upperPartComp, SWT.NONE).setText(Messages.Leistungscodes_nameLabel);
tName = new Text(upperPartComp, SWT.BORDER);
tName.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tName.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(final FocusEvent e){
mke.reload(tName.getText());
super.focusLost(e);
}
});
// *** label/combo for billingcode system
new Label(upperPartComp, SWT.NONE).setText(Messages.Leistungscodes_billingSystemLabel);
cbLstg = new Combo(upperPartComp, SWT.READ_ONLY);
cbLstg.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
for (IConfigurationElement ic : ll) {
cbLstg.add(ic.getAttribute("name")); //$NON-NLS-1$
}
// *** label/combo for default output for bills
new Label(upperPartComp, SWT.NONE).setText(Messages.Leistungscodes_defaultOutputLabel);
cbRechn = new Combo(upperPartComp, SWT.READ_ONLY);
cbRechn.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
for (IConfigurationElement ic : lo) {
cbRechn.add(ic.getAttribute("name")); //$NON-NLS-1$
}
// *** checkbox if system is disabled
new Label(upperPartComp, SWT.NONE).setText(""); //$NON-NLS-1$
cbDisabled = new Button(upperPartComp, SWT.CHECK);
cbDisabled.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
cbDisabled.setText(Messages.Leistungscodes_systemDisabled);
// *** separator
new Label(ret, SWT.SEPARATOR | SWT.HORIZONTAL).setLayoutData(SWTHelper.getFillGridData(
2, true, 1, false));
// *** setting the values
String name = "default"; //$NON-NLS-1$
if (result != null) {
tName.setText(result[0]);
cbLstg.setText(result[1]);
cbRechn.setText(result[2]);
boolean checked = true;
if ((result[6] == null) || (result[6].isEmpty())
|| (result[6].equalsIgnoreCase("0")) || (result[6].equalsIgnoreCase("false"))) //$NON-NLS-1$ //$NON-NLS-2$
checked = false;
cbDisabled.setSelection(checked);
name = result[0];
}
GridLayout grid1 = new GridLayout(1, false);
grid1.marginWidth = 0;
grid1.marginTop = 0;
grid1.marginBottom = 0;
grid1.marginRight = 5;
// ****** middle part: multiplyer in left column, case constants in
// right column
Composite middlePartComp = new Composite(ret, SWT.NONE);
middlePartComp.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
middlePartComp.setLayout(new GridLayout(2, true));
Composite leftMiddlePart = new Composite(middlePartComp, SWT.NONE);
leftMiddlePart.setLayout(grid1);
leftMiddlePart.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
Composite rightMiddlePart = new Composite(middlePartComp, SWT.NONE);
rightMiddlePart.setLayout(grid1);
rightMiddlePart.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
// *** label/editor field/button for multiplyer
lbTaxp = new Label(leftMiddlePart, SWT.NONE);
lbTaxp.setText(Messages.Leistungscodes_multiplierLabel);
mke = new MultiplikatorEditor(leftMiddlePart, name);
mke.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
// *** label/editor for case constants
new Label(rightMiddlePart, SWT.NONE).setText(Messages.Leistungscodes_caseConstants);
ldConstants =
new ListDisplay<String>(rightMiddlePart, SWT.NONE, new ListDisplay.LDListener() {
public String getLabel(Object o){
return (String) o;
}
public void hyperlinkActivated(String l){
String msg = Messages.Leistungscodes_pleaseEnterNameAndValue;
InputDialog inp =
new InputDialog(getShell(), l + Messages.Leistungscodes_add, msg,
StringTool.leer, null); //$NON-NLS-1$
if (inp.open() == Dialog.OK) {
String[] req = inp.getValue().split("="); //$NON-NLS-1$
if (req.length != 2) {
SWTHelper.showError(Messages.Leistungscodes_badEntry,
Messages.Leistungscodes_explainEntry);
} else {
ldConstants.add(inp.getValue());
String bs = result[0];
if (bs == null) {
bs = tName.getText();
}
if (StringTool.isNothing(bs)) {
SWTHelper.showError(Messages.Leistungscodes_badEntryCaptiob,
Messages.Leistungscodes_badEntryText);
} else {
Fall.addBillingSystemConstant(bs, inp.getValue());
}
}
}
}
});
ldConstants.addHyperlinks(Messages.Leistungscodes_constantHL);
if (result != null) {
for (String con : Fall.getBillingSystemConstants(result[0])) {
ldConstants.add(con);
}
}
ldConstants.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
Menu menu2 = new Menu(ldConstants);
MenuItem del2 = new MenuItem(menu2, SWT.NONE);
del2.setText(Messages.Leistungscodes_delText);
del2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
String sel = ldConstants.getSelection();
ldConstants.remove(sel);
Fall.removeBillingSystemConstant(result[0], sel);
}
});
ldConstants.setMenu(menu2);
// *** separator
Label separator = new Label(middlePartComp, SWT.SEPARATOR | SWT.HORIZONTAL);
separator.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// ****** lower part: required, optional and unused fields
Composite lowerPartComp = new Composite(ret, SWT.NONE);
lowerPartComp.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
lowerPartComp.setLayout(new GridLayout(2, false));
// *** label/editor field for required fields
String[] data = null;
if ((result != null) && (result.length > 3) && (result[3] != null))
data = result[3].split(DEFINITIONSDELIMITER);
FieldDefsDisplay fdReq = new FieldDefsDisplay(lowerPartComp, SWT.BORDER, data);
fdReq.setLabel(Messages.Leistungscodes_necessaryData);
ldRequirements = fdReq.getListDisplay();
// *** label/editor field for optional fields
data = null;
if ((result != null) && (result.length > 4) && (result[4] != null))
data = result[4].split(DEFINITIONSDELIMITER);
FieldDefsDisplay fdOpt = new FieldDefsDisplay(lowerPartComp, SWT.BORDER, data);
fdOpt.setLabel(Messages.Leistungscodes_optionalData);
ldOptional = fdOpt.getListDisplay();
// *** label/editor field for unused fields
if (CoreHub.acl.request(AccessControlDefaults.CASE_DEFINE_SPECIALS) == true) {
data = null;
if ((result != null) && (result.length > 5) && (result[5] != null))
data = result[5].split(DEFINITIONSDELIMITER);
FieldDefsDisplay fdUnused = new FieldDefsDisplay(lowerPartComp, SWT.BORDER, data);
fdUnused.setLabel(Messages.Leistungscodes_unusedData);
ldUnused = fdUnused.getListDisplay();
// *** adding action items for unused fields list
fdUnused.addMoveToAction(ldRequirements,
Messages.Leistungscodes_moveItemToRequiredData,
Images.IMG_MOVETOUPPERLIST.getImageDescriptor(), true);
fdUnused.addMoveToAction(ldOptional,
Messages.Leistungscodes_moveItemToOptionalData,
Images.IMG_MOVETOLOWERLIST.getImageDescriptor(), true);
fdUnused.setNoDuplicatesList(ldRequirements, ldOptional);
fdUnused.setNoDuplicatesCreateList(ldRequirements, ldOptional);
}
// *** adding action items for required fields list
fdReq.addMoveToAction(ldRequirements, Messages.Leistungscodes_moveItemToRequiredData,
Images.IMG_MOVETOUPPERLIST.getImageDescriptor(), false);
fdReq.addMoveToAction(ldOptional, Messages.Leistungscodes_moveItemToOptionalData,
Images.IMG_MOVETOLOWERLIST.getImageDescriptor(), true);
fdReq.setDeletedList(ldUnused);
fdReq.setNoDuplicatesList(ldOptional);
fdReq.setNoDuplicatesCreateList(ldRequirements, ldOptional);
// *** adding action items for optional fields list
fdOpt.addMoveToAction(ldRequirements, Messages.Leistungscodes_moveItemToRequiredData,
Images.IMG_MOVETOUPPERLIST.getImageDescriptor(), true);
fdOpt.addMoveToAction(ldOptional, Messages.Leistungscodes_moveItemToOptionalData,
Images.IMG_MOVETOLOWERLIST.getImageDescriptor(), false);
fdOpt.setDeletedList(ldUnused);
fdOpt.setNoDuplicatesList(ldRequirements);
fdOpt.setNoDuplicatesCreateList(ldRequirements, ldOptional);
// *** calc size of full-height-composite, make it correctly scroll
Point retSize = ret.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
ret.setSize(retSize.x, retSize.y);
scroller.setContent(ret);
scroller.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
ScrollBar sbY = scroller.getVerticalBar();
if (sbY != null) {
sbY.setPageIncrement(ret.getSize().y);
sbY.setIncrement(20);
}
// *** return composite
return scroller;
}
@Override
public void create(){
super.create();
setTitle(Messages.Leistungscodes_defineBillingSystem);
setMessage(Messages.Leistungscodes_pleaseEnterDataForBillingSystem);
getShell().setText(Messages.Leistungscodes_billingSystemCaption);
}
/**
* create the result String array
*/
@Override
protected void okPressed(){
result = new String[7];
result[0] = tName.getText();
result[1] = cbLstg.getText();
result[2] = cbRechn.getText();
result[3] = StringTool.join(ldRequirements.getAll(), DEFINITIONSDELIMITER);
result[4] = StringTool.join(ldOptional.getAll(), DEFINITIONSDELIMITER);
if (ldUnused != null) {
result[5] = StringTool.join(ldUnused.getAll(), DEFINITIONSDELIMITER);
}
result[6] = (cbDisabled.getSelection() == true) ? "1" : "0"; //$NON-NLS-1$ //$NON-NLS-2$
super.okPressed();
}
public String[] getResult(){
return result;
}
}
/**
* test if a field already exists in the database table (faelle) or in any existing field
* definitions
*
* @param fieldName
* @param ldNoDuplicates
* @return
*/
private boolean fieldExistsAlready(final String fieldName,
ListDisplay<String>... ldNoDuplicates){
final String tempCaseID = "marlovits-14x@8w1"; //$NON-NLS-1$
JdbcLink j = PersistentObject.getConnection();
String minID = ""; //$NON-NLS-1$
try {
// *** get just any case
minID = j.queryString("select id from faelle limit 1"); //$NON-NLS-1$
Fall fall = Fall.load(minID);
if (!fall.exists()) {
// *** there is no case yet created -> create temp dummy case
j.exec("insert into faelle (id) values(" + JdbcLink.wrap(tempCaseID) + ")"); //$NON-NLS-1$ //$NON-NLS-2$
minID = tempCaseID;
fall = Fall.load(minID);
}
// *** try to find a field in the db or in the mapping
// (case-sensitive!!!)
String mapped = fall.map(fieldName);
if (mapped.equalsIgnoreCase(fieldName)) {
return true;
}
if (!mapped.substring(0, 8).equalsIgnoreCase("**ERROR:")) { //$NON-NLS-1$
return true;
}
// *** try to find in existing lists
for (ListDisplay<String> ld : ldNoDuplicates) {
for (String str : ld.getAll()) {
if (str.split(ARGUMENTSSDELIMITER)[0].equalsIgnoreCase(fieldName)) {
return true;
}
}
}
} finally {
// *** clean up: delete any created dummy case before leaving
if (minID.equalsIgnoreCase(tempCaseID))
j.exec("delete from faelle where id = " + JdbcLink.wrap(tempCaseID)); //$NON-NLS-1$
}
return false;
}
/**
* creates a composite with a label on the top, <br>
* below there is a ListDisplay on the left side and a navigator on the right side. <br>
* in the navigator there are some items preconfigured: <br>
* moveItemUp, moveItemDown, editItem
*
* @author Harald Marlovits
*
*/
class FieldDefsDisplay extends Composite {
final static int MOVEITEMUP = 0;
final static int MOVEITEMDOWN = 1;
final static int DELETEITEM = 3;
final static int EDITITEM = 4;
final static int LASTFIXEDITEM = 5;
Label label; // *** Label on top of this list
ListDisplay<String> listDisplay; // *** the ListDisplay
org.eclipse.swt.widgets.List list; // *** the List of the ListDisplay
ToolBar toolBar; // *** the navigator on the right side
ListDisplay<String> deletedList = null; // *** if items are deleted,
// they are moved to this list
ListDisplay<String>[] noDuplicatesList = null; // *** for move to other
// list, this contains
// the Lists containing
// items not to be
// duplicated
ListDisplay<String>[] noDuplicatesListCreate = null; // *** for creating
// new fields,
// this contains
// the Lists
// containing
// items not to
// be duplicated
// *** additional action items for toolbar and popupmenu
Short additionalItemsCount = 0;
List<ListDisplay<String>> moveTo_DestinationLists = new ArrayList<ListDisplay<String>>(30);
IAction[] actions = new IAction[LASTFIXEDITEM + 1];
/**
* set the noDuplicatesList value, which contains the Lists containing items not to be
* duplicated for the "move to other list action"
*
* @param listArray
*/
public void setNoDuplicatesList(ListDisplay<String>... listArray){
noDuplicatesList = listArray;
}
/**
* set the noDuplicatesList value, which contains the Lists containing items not to be
* duplicated for the "create new field action"
*
* @param listArray
*/
public void setNoDuplicatesCreateList(ListDisplay<String>... listArray){
noDuplicatesListCreate = listArray;
}
/**
* sets the label on top of this List
*
* @param labelText
*/
public void setLabel(String labelText){
label.setText(labelText);
}
/**
* returns the ListDisplay of this composite
*
* @return
*/
public ListDisplay<String> getListDisplay(){
return listDisplay;
}
/**
* sets the list to which items should be moved to when deleted
*
* @param unusedList
*/
public void setDeletedList(ListDisplay<String> unusedList){
deletedList = unusedList;
}
/**
* adds an item at the bottom of the popupmenu and the toolbar
*
* @param destinationList
* @param toolTipText
* @param imageDescriptor
*/
public void addMoveToAction(ListDisplay<String> destinationList, String toolTipText,
ImageDescriptor imageDescriptor, boolean enabled){
if (toolBar != null) {
Short newItemIx = (short) (LASTFIXEDITEM + additionalItemsCount + 1);
moveTo_DestinationLists.add(destinationList);
addToolItem(toolBar, imageDescriptor.createImage(), toolTipText, newItemIx, enabled);
ListPopUpMenuAction newAction =
new ListPopUpMenuAction(toolTipText, imageDescriptor, toolTipText, newItemIx,
destinationList, enabled);
IAction[] extended = new IAction[LASTFIXEDITEM + additionalItemsCount + 1 + 1];
System.arraycopy(actions, 0, extended, 0, LASTFIXEDITEM + additionalItemsCount + 1);
extended[LASTFIXEDITEM + additionalItemsCount + 1] = newAction;
actions = extended;
listDisplay.setMenu(actions);
additionalItemsCount++;
}
}
public FieldDefsDisplay(Composite parent, int style, String[] listItems){
super(parent, SWT.NONE);
this.setLayoutData(SWTHelper.getFillGridData(2, true, 1, true));
GridLayout navGridMain = new GridLayout(2, false);
navGridMain.marginWidth = 0;
navGridMain.marginHeight = 0;
this.setLayout(navGridMain);
// ****** create the label on top
label = new Label(this, SWT.NONE);
label.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false));
// ****** create the ListDisplay
listDisplay = new ListDisplay<String>(this, SWT.NONE, new ListDisplay.LDListener() {
public void hyperlinkActivated(final String l){
_FieldsHyperlinkActivated(l, StringTool.leer);
}
public String getLabel(final Object o){
return _FieldsGetLabel(o);
}
});
// *** add/fill hyperlinks on top
listDisplay.addHyperlinks(Messages.Leistungscodes_contactHL,
Messages.Leistungscodes_textHL, Messages.Leistungscodes_dateHL,
Messages.Leistungscodes_comboHL, Messages.Leistungscodes_listHL,
Messages.Leistungscodes_checkboxHL, Messages.Leistungscodes_radioHL);
listDisplay.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
// *** add data
if (listItems != null) {
for (String item : listItems) {
listDisplay.add(item);
}
}
// ****** create toolbar on the right side
Composite navigator = new Composite(this, SWT.NONE);
GridLayout navGrid = new GridLayout(1, false);
navGrid.marginWidth = 0;
navGrid.marginHeight = 0;
navGrid.marginTop = 0;
navigator.setLayout(navGrid);
navigator.setLayoutData(SWTHelper.getFillGridData(1, false, 1, true));
toolBar = new ToolBar(navigator, SWT.BORDER | SWT.FLAT | SWT.VERTICAL);
// toolBar = new ToolBar(navigator, SWT.BORDER | SWT.FLAT |
// SWT.VERTICAL);
toolBar.setData("listDisplay", listDisplay); //$NON-NLS-1$
listDisplay.setData("toolbar", toolBar); //$NON-NLS-1$
addToolItem(toolBar, Images.IMG_ARROWUP.getImage(), Messages.Leistungscodes_moveItemUp,
MOVEITEMUP, true);
addToolItem(toolBar, Images.IMG_ARROWDOWN.getImage(),
Messages.Leistungscodes_moveItemDown, MOVEITEMDOWN, true);
addToolItem(toolBar, null, Messages.Leistungscodes_moveItemDown, -1, false);
addToolItem(toolBar, Images.IMG_REMOVEITEM.getImage(),
Messages.Leistungscodes_deleteItem, DELETEITEM, true);
addToolItem(toolBar, Images.IMG_EDIT.getImage(), Messages.Leistungscodes_editItem,
EDITITEM, true);
addToolItem(toolBar, null, Messages.Leistungscodes_moveItemDown, -1, false);
// ****** create popupmenu for this list (same actions)
ListPopUpMenuAction moveItemUpAction =
new ListPopUpMenuAction(Messages.Leistungscodes_moveItemUp,
Images.IMG_ARROWUP.getImageDescriptor(), Messages.Leistungscodes_moveItemUp,
MOVEITEMUP, listDisplay, true);
ListPopUpMenuAction moveItemDownAction =
new ListPopUpMenuAction(Messages.Leistungscodes_moveItemDown,
Images.IMG_ARROWDOWN.getImageDescriptor(),
Messages.Leistungscodes_moveItemDown, MOVEITEMDOWN, listDisplay, true);
ListPopUpMenuAction delItemAction =
new ListPopUpMenuAction(Messages.Leistungscodes_deleteAction,
Images.IMG_REMOVEITEM.getImageDescriptor(),
Messages.Leistungscodes_removeConstraintTT, DELETEITEM, listDisplay, true);
ListPopUpMenuAction changeItemAction =
new ListPopUpMenuAction(Messages.Leistungscodes_editItem,
Images.IMG_EDIT.getImageDescriptor(), Messages.Leistungscodes_editItem,
EDITITEM, listDisplay, true);
actions[MOVEITEMUP] = moveItemUpAction;
actions[MOVEITEMDOWN] = moveItemDownAction;
actions[2] = null;
actions[DELETEITEM] = delItemAction;
actions[EDITITEM] = changeItemAction;
actions[LASTFIXEDITEM] = null;
listDisplay.setMenu(actions);
enableDisableItems();
// ****** handling clicks inside list
final org.eclipse.swt.widgets.List child = getListPart(listDisplay);
if (child != null) {
child.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e){
// *** enable or disable items
enableDisableItems();
}
@Override
public void widgetDefaultSelected(SelectionEvent e){}
});
child.addMouseListener(new MouseListener() {
@Override
// *** double click opens the change dialog
public void mouseDoubleClick(MouseEvent e){
String sel = listDisplay.getSelection();
_FieldsHyperlinkActivated(StringTool.leer, sel);
}
@Override
public void mouseDown(MouseEvent e){
// *** mouse down right button selects item
if (e.button != 1) {
int itemIx = e.y / child.getItemHeight() + child.getTopIndex();
if (itemIx >= child.getItemCount() - 1)
itemIx = child.getItemCount() - 1;
child.setSelection(itemIx);
}
// *** enable or disable items
enableDisableItems();
}
@Override
public void mouseUp(MouseEvent e){}
});
}
}
/**
* adds a button/toolItem to the bottom of the navigator
*
* @param parent
* the toolBar/navigator
* @param image
* the image to be used
* @param toolTipText
* the tooltip to be shown
* @param actionType
* the action type (MOVEITEMUP, MOVEITEMDOWN, DELETEITEM, EDITITEM,
* LASTFIXEDITEM, ...)
* @param enabled
* enabled or disabled...
* @since 3.0.0
*/
private void addToolItem(ToolBar parent, Image image, String toolTipText, int actionType,
boolean enabled){
if (actionType == -1) {
ToolItem toolItem = new ToolItem(parent, SWT.SEPARATOR);
toolItem.setEnabled(false);
} else {
ImageRegistry imageRegistry = UiDesk.getImageRegistry();
ToolItem toolItem = new ToolItem(parent, SWT.PUSH);
toolItem.setToolTipText(toolTipText);
toolItem.setImage(image);
toolItem.setData("type", actionType); //$NON-NLS-1$
toolItem.addSelectionListener(new toolBarSelectionListener());
toolItem.setEnabled(enabled);
}
}
/**
* enable or disable the items in the toolbar and in the popupmenu
*
* @param listDisplayToBeChanged
*/
private void enableDisableItems(){
ToolBar toolBar = (ToolBar) listDisplay.getData("toolbar"); //$NON-NLS-1$
org.eclipse.swt.widgets.List list = getListPart(listDisplay);
Menu menu = list.getMenu();
boolean menuHasItems = menu.getItems().length > 0;
int selIx = list.getSelectionIndex();
int maxIx = list.getItemCount();
// *** move up item
boolean enabled = false;
if (selIx > 0)
enabled = true;
toolBar.getItem(MOVEITEMUP).setEnabled(enabled);
if (menuHasItems)
menu.getItem(MOVEITEMUP).setEnabled(enabled);
// *** move down item
enabled = false;
if (selIx < (maxIx - 1))
enabled = true;
if (selIx == -1)
enabled = false;
toolBar.getItem(MOVEITEMDOWN).setEnabled(enabled);
if (menuHasItems)
menu.getItem(MOVEITEMDOWN).setEnabled(enabled);
// *** delete and edit item
enabled = true;
if (selIx == -1)
enabled = false;
toolBar.getItem(DELETEITEM).setEnabled(enabled);
toolBar.getItem(EDITITEM).setEnabled(enabled);
if (menuHasItems)
menu.getItem(DELETEITEM).setEnabled(enabled);
if (menuHasItems)
menu.getItem(EDITITEM).setEnabled(enabled);
}
/**
* find the list of ListDisplay composite - ugly but working find...
*
* @param listDisplay
* @return
*/
private org.eclipse.swt.widgets.List getListPart(ListDisplay<String> listDisplay){
Control[] children = listDisplay.getChildren();
for (int li = 0; li < children.length; li++) {
Control child = children[li];
if (child.getClass().toString()
.equalsIgnoreCase("class org.eclipse.swt.widgets.List")) { //$NON-NLS-1$
return (org.eclipse.swt.widgets.List) child;
}
}
return null;
}
/**
* change the type of an item
*/
public void changeItemType(){
if (listDisplay.getSelection() == null) {
SWTHelper.alert(StringTool.leer, Messages.Leistungscodes_mustSelectALine);
} else {}
}
/**
* move an item up or down in the list
*
* @param step
* positive for moving down, negative for moving up
*/
public void moveListItem(int step){
if (listDisplay.getSelection() == null) {
SWTHelper.alert(StringTool.leer, Messages.Leistungscodes_mustSelectALine);
} else {
if (step == 0)
return;
String sel = listDisplay.getSelection();
List<String> allRequirements = listDisplay.getAll();
int selIx = allRequirements.indexOf(sel);
int listSize = allRequirements.size();
boolean conditionOk = false;
if (step < 0) {
if (selIx > (-step) - 1)
conditionOk = true;
}
if (step > 0) {
if (selIx <= listSize - step)
conditionOk = true;
}
if (conditionOk) {
allRequirements.set(selIx, allRequirements.get(selIx + step));
allRequirements.set(selIx + step, sel);
Object[] tmp = allRequirements.toArray();
for (int i = 0; i < listSize; i++) {
listDisplay.remove(allRequirements.get(0));
}
for (int i = 0; i < tmp.length; i++) {
listDisplay.add((String) tmp[i]);
}
listDisplay.setSelection(selIx + step);
}
}
}
/**
* delete an item from the list, move to deletedList. <br>
* if this IS the deletedList, then delete definitively
*/
public void deleteListItem(){
String sel = listDisplay.getSelection();
if (sel == null) {
SWTHelper.alert(StringTool.leer, Messages.Leistungscodes_mustSelectALine);
} else {
if (SWTHelper.askYesNo(StringTool.leer,
Messages.Leistungscodes_reallyWantToDeleteItem)) {
if ((deletedList != null) && (!deletedList.equals(listDisplay))) {
deletedList.add(sel);
}
listDisplay.remove(sel);
}
}
}
/**
* selection listener for the toolbar/navigator
*
* @author Harald Marlovits
*
*/
class toolBarSelectionListener implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent e){
int type = (Integer) (((ToolItem) (e.getSource())).getData("type")); //$NON-NLS-1$
switch (type) {
case MOVEITEMUP:
moveListItem(-1);
break;
case MOVEITEMDOWN:
moveListItem(+1);
break;
case DELETEITEM:
deleteListItem();
break;
case EDITITEM:
String sel = listDisplay.getSelection();
_FieldsHyperlinkActivated(StringTool.leer, sel);
break;
default:
if (type > LASTFIXEDITEM) {
moveItemToOtherList(listDisplay,
moveTo_DestinationLists.get(type - LASTFIXEDITEM - 1), noDuplicatesList);
}
break;
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e){}
}
/**
* selection listener for the popupmenu
*
* @author Harald Marlovits
*
*/
class ListPopUpMenuAction extends Action {
int actionType = 0;
/**
*
* @param actionName
* @param imageDescriptor
* @param toolTipText
* @param actionType
* @param listDisplay
* @param enabled
* @since 3.0.0 constructor signature changed to ImageDescriptor
*/
public ListPopUpMenuAction(String actionName, ImageDescriptor imageDescriptor,
String toolTipText, int actionType, ListDisplay<String> listDisplay, boolean enabled){
super(actionName);
this.actionType = actionType;
setImageDescriptor(imageDescriptor);
setToolTipText(toolTipText);
this.setEnabled(enabled);
}
@Override
public void run(){
// this.setEnabled(false);
switch (actionType) {
case MOVEITEMUP:
moveListItem(-1);
break;
case MOVEITEMDOWN:
moveListItem(+1);
break;
case DELETEITEM:
deleteListItem();
break;
case EDITITEM:
String sel = listDisplay.getSelection();
_FieldsHyperlinkActivated(StringTool.leer, sel);
break;
default:
if (actionType > LASTFIXEDITEM) {
moveItemToOtherList(listDisplay,
moveTo_DestinationLists.get(actionType - LASTFIXEDITEM - 1),
noDuplicatesList);
}
break;
}
}
};
/**
* return the label for the supplied object <br>
* the object is the String in the form <fieldName>:<fieldType>:<itemsList>
*
* @param o
* @return
*/
public String _FieldsGetLabel(final Object o){
String[] l = ((String) o).split(ARGUMENTSSDELIMITER); //$NON-NLS-1$
if (l.length > 1) {
String type = Messages.Leistungscodes_date;
if (l[1].equals("T")) { //$NON-NLS-1$
type = Messages.Leistungscodes_text;
} else if (l[1].equals("K")) { //$NON-NLS-1$
type = Messages.Leistungscodes_contact;
} else if (l[1].equals("D")) { //$NON-NLS-1$
type = Messages.Leistungscodes_date;
} else if (l[1].equals("TM")) { //$NON-NLS-1$
type = Messages.Leistungscodes_textMultipleLines;
} else if (l[1].equals("TS")) { //$NON-NLS-1$
type = Messages.Leistungscodes_textStyled;
} else if (l[1].equals("CS")) { //$NON-NLS-1$
type = Messages.Leistungscodes_combo;
} else if (l[1].equals("CN")) { //$NON-NLS-1$
type = Messages.Leistungscodes_comboNumeric;
} else if (l[1].equals("LS")) { //$NON-NLS-1$
type = Messages.Leistungscodes_list;
} else if (l[1].equals("LN")) { //$NON-NLS-1$
type = Messages.Leistungscodes_ListNumeric;
} else if (l[1].equals("X")) { //$NON-NLS-1$
type = Messages.Leistungscodes_checkbox;
} else if (l[1].equals("RS")) { //$NON-NLS-1$
type = Messages.Leistungscodes_radiogroup;
} else if (l[1].equals("RN")) { //$NON-NLS-1$
type = Messages.Leistungscodes_radiogroupNumeric;
}
String opt =
(l.length >= 3) ? " (" + l[2].replaceAll(ITEMDELIMITER, "; ") + ")" : StringTool.leer; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (opt.trim().equalsIgnoreCase("(SQL)")) { //$NON-NLS-1$
opt =
(l.length >= 4) ? " (SQL: " + l[3].replaceAll(ITEMDELIMITER, "; ") + ")" : StringTool.leer; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return type + " " + l[0] + opt; //$NON-NLS-1$
} else {
return type + " " + l[0] + opt; //$NON-NLS-1$
}
} else {
String opt =
(l.length >= 3) ? " (" + l[2].replaceAll(ITEMDELIMITER, "; ") + ")" : StringTool.leer; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return "? " + " " + l[0] + opt; //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
*
* @param l
* if creating a field, then this contains the field type name
* @param fieldToBeChanged
* if changing a field, then this contains the full definition for the field to
* be changed [fieldName]:[fieldType]:[itemsList]
*/
public void _FieldsHyperlinkActivated(final String l, String fieldToBeChanged){
String ll = l;
boolean isChanging = false;
String fieldName = StringTool.leer;
String fieldType = StringTool.leer;
String optionsIn = StringTool.leer;
boolean isNumericChecked = false;
boolean isStyledChecked = false;
boolean isMultilineChecked = false;
if (ll.isEmpty()) {
isChanging = true;
String[] fields = fieldToBeChanged.split(ARGUMENTSSDELIMITER);
fieldName = fields[0];
fieldType = fields[1];
optionsIn = fields.length > 2 ? fields[2] : StringTool.leer;
optionsIn = optionsIn.replaceAll(ITEMDELIMITER, "\n"); //$NON-NLS-1$
if (fieldType.equalsIgnoreCase("K")) { //$NON-NLS-1$
ll = Messages.Leistungscodes_contactHL;
} else if (fieldType.substring(0, 1).equalsIgnoreCase("T")) { //$NON-NLS-1$
ll = Messages.Leistungscodes_textHL;
} else if (fieldType.substring(0, 1).equalsIgnoreCase("D")) { //$NON-NLS-1$
ll = Messages.Leistungscodes_dateHL;
} else if (fieldType.substring(0, 1).equalsIgnoreCase("C")) { //$NON-NLS-1$
ll = Messages.Leistungscodes_comboHL;
} else if (fieldType.substring(0, 1).equalsIgnoreCase("L")) { //$NON-NLS-1$
ll = Messages.Leistungscodes_listHL;
} else if (fieldType.substring(0, 1).equalsIgnoreCase("X")) { //$NON-NLS-1$
ll = Messages.Leistungscodes_checkboxHL;
} else if (fieldType.substring(0, 1).equalsIgnoreCase("R")) { //$NON-NLS-1$
ll = Messages.Leistungscodes_radioHL;
}
if (fieldType.length() >= 2) {
if (fieldType.equalsIgnoreCase("TM")) { //$NON-NLS-1$
isMultilineChecked = true;
} else if (fieldType.equalsIgnoreCase("TS")) { //$NON-NLS-1$
isStyledChecked = true;
} else if (fieldType.substring(1, 2).equalsIgnoreCase("N")) { //$NON-NLS-1$
isNumericChecked = true;
}
}
}
String msg = Messages.Leistungscodes_pleaseEnterName;
String[] changeItems =
{
Messages.Leistungscodes_contactHL, Messages.Leistungscodes_textHL,
Messages.Leistungscodes_dateHL, Messages.Leistungscodes_comboHL,
Messages.Leistungscodes_listHL, Messages.Leistungscodes_checkboxHL,
Messages.Leistungscodes_radioHL
};
AbrechnungsTypDialog_InputDialog inputDlg =
new AbrechnungsTypDialog_InputDialog(getShell(), ll
+ (isChanging ? Messages.Leistungscodes_changeTextInTitleBar
: Messages.Leistungscodes_add), msg, fieldName, noDuplicatesListCreate,
optionsIn, isNumericChecked, isStyledChecked, isMultilineChecked,
isChanging ? changeItems : null);
if (inputDlg.open() == Dialog.OK) {
String[] result = inputDlg.getResult();
String req = result[0];
String options = result[1];
ll = result[5];
// *** if options contains an sql-statement, then read from db
if ((options.length() > 4) && (options.substring(0, 4).equalsIgnoreCase("SQL:"))) { //$NON-NLS-1$
// *** this is calculated on the fly in the view
// FallDetailBlatt2
}
if ((options.length() > 4) && (options.substring(0, 4).equalsIgnoreCase("SCRIPT:"))) { //$NON-NLS-1$
// *** this is calculated on the fly in the view
// FallDetailBlatt2
}
boolean hasNumeric = result[2].equalsIgnoreCase("0") ? false : true; //$NON-NLS-1$
boolean hasMultiline = result[3].equalsIgnoreCase("0") ? false : true; //$NON-NLS-1$
boolean hasStyled = result[4].equalsIgnoreCase("0") ? false : true; //$NON-NLS-1$
if (ll.equalsIgnoreCase(Messages.Leistungscodes_contactHL)) {
req += ":K"; // Kontakt //$NON-NLS-1$
} else if (ll.equalsIgnoreCase(Messages.Leistungscodes_textHL)) {
if (hasStyled) {
req += ":TS"; // Styled Text //$NON-NLS-1$
} else if (hasMultiline) {
req += ":TM"; // Multiline Text //$NON-NLS-1$
} else {
req += ":T"; // normal Text //$NON-NLS-1$
}
} else if (ll.equalsIgnoreCase(Messages.Leistungscodes_dateHL)) {
req += ":D"; // Date //$NON-NLS-1$
} else if (ll.equalsIgnoreCase(Messages.Leistungscodes_comboHL)) {
if (hasNumeric) {
req += ":CN"; // Combo numeric //$NON-NLS-1$
} else {
req += ":CS"; // Combo //$NON-NLS-1$
}
} else if (ll.equalsIgnoreCase(Messages.Leistungscodes_listHL)) {
if (hasNumeric) {
req += ":LN"; // List numeric //$NON-NLS-1$
} else {
req += ":LS"; // List //$NON-NLS-1$
}
} else if (ll.equalsIgnoreCase(Messages.Leistungscodes_checkboxHL)) {
req += ":X"; // Checkboxes //$NON-NLS-1$
} else if (ll.equalsIgnoreCase(Messages.Leistungscodes_radioHL)) {
if (hasNumeric) {
req += ":RN"; // Radiobuttons numeric //$NON-NLS-1$
} else {
req += ":RS"; // Radiobuttons //$NON-NLS-1$
}
}
// *** append options as ;-delimited list
options = options.replaceAll("\r\n", ITEMDELIMITER); //$NON-NLS-1$
options = (options.replaceAll("\n", ITEMDELIMITER)).replaceAll("\r", ITEMDELIMITER); //$NON-NLS-1$ //$NON-NLS-2$
req = req + ARGUMENTSSDELIMITER + options;
// *** return result
if (isChanging) {
List<String> allRequirements = listDisplay.getAll();
int selIx = allRequirements.indexOf(fieldToBeChanged);
if (selIx >= 0) {
Object[] tmp = allRequirements.toArray();
int listSize = allRequirements.size();
List<String> currRequirements = listDisplay.getAll();
for (int i = 0; i < listSize; i++) {
listDisplay.remove(currRequirements.get(0));
}
for (int i = 0; i < tmp.length; i++) {
String toBeAdded = (String) tmp[i];
if (i == selIx)
toBeAdded = req;
listDisplay.add(toBeAdded);
}
}
} else {
listDisplay.add(req);
}
}
}
/**
* moving items from one list to another list the moved item MUST NOT be in the destination
* list - will not be allowed the moved item MUST NOT be in one of the noDuplicatesDisplays
* list - will not be allowed
*
* @param listDisplay
* the current list from which the item should be moved away
* @param destDisplay
* the destination list to which the item should be moved to
* @param noDuplicatesDisplays
* an array of ListDisplay's which contain the values which should not be
* duplicated
*/
@SuppressWarnings("unchecked")
public void moveItemToOtherList(ListDisplay<String> listDisplay,
ListDisplay<String> destDisplay, ListDisplay<String>... noDuplicatesDisplays){
// no duplicates allowed for destination list
String sel = listDisplay.getSelection();
if (sel.isEmpty())
return;
java.util.ArrayList<String> allItems =
(ArrayList<String>) ((ArrayList<String>) destDisplay.getAll()).clone();
for (int li = 0; li < allItems.size(); li++) {
allItems.set(li, allItems.get(li).split(ARGUMENTSSDELIMITER)[0]);
}
if (allItems.contains(sel.split(ARGUMENTSSDELIMITER)[0])) {
SWTHelper.alert(StringTool.leer,
Messages.Leistungscodes_definitionAlreadyExistsInDestination);
return;
}
// *** no duplicates in noDuplicatesDisplays
for (ListDisplay<String> noDuplicatesList : noDuplicatesDisplays) {
java.util.ArrayList<String> allItems2 =
(ArrayList<String>) ((ArrayList<String>) noDuplicatesList.getAll()).clone();
for (int li = 0; li < allItems2.size(); li++) {
allItems2.set(li, allItems2.get(li).split(ARGUMENTSSDELIMITER)[0]);
}
if (allItems2.contains(sel.split(ARGUMENTSSDELIMITER)[0])) {
SWTHelper.alert(StringTool.leer,
Messages.Leistungscodes_definitionAlreadyExistsSomewhere);
return;
}
}
// *** moving is ok
destDisplay.add(sel);
listDisplay.remove(sel);
}
}
}