/*******************************************************************************
* Copyright (c) 2008-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
*
*******************************************************************************/
package ch.elexis.core.ui.contacts.preferences;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
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.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.ViewerCell;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
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.TableItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.types.LocalizeUtil;
import ch.elexis.core.types.RelationshipType;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.contacts.dialogs.BezugsKontaktAuswahl;
import ch.elexis.core.ui.contacts.views.Patientenblatt2;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.preferences.SettingsPreferenceStore;
import ch.elexis.core.ui.views.Messages;
import ch.elexis.data.BezugsKontaktRelation;
public class BezugsKontaktSettings extends PreferencePage implements IWorkbenchPreferencePage {
private TableViewer tableViewer;
private Table tableBezugsKontaktRelations;
private Set<String> updateExistingEntriesIds = new HashSet<>();
private List<BezugsKontaktRelation> initalValues = new ArrayList<>();
private final boolean allowEditing;
public BezugsKontaktSettings(){
noDefaultAndApplyButton();
setTitle(Messages.Bezugskontakt_Title);
this.allowEditing = CoreHub.acl.request(AccessControlDefaults.ADMIN);
}
@Override
protected Control createContents(Composite parent){
updateExistingEntriesIds.clear();
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.Bezugskontakt_Definition);
Composite composite = new Composite(group, SWT.NONE);
GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_composite.heightHint = 300;
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());
tableBezugsKontaktRelations = tableViewer.getTable();
tableBezugsKontaktRelations.setHeaderVisible(true);
tableBezugsKontaktRelations.setLinesVisible(true);
if (allowEditing) {
Menu menu = new Menu(tableBezugsKontaktRelations);
tableBezugsKontaktRelations.setMenu(menu);
MenuItem mntmAddBezugsKontaktRelation = new MenuItem(menu, SWT.NONE);
mntmAddBezugsKontaktRelation.setText(Messages.Bezugskontakt_Add);
mntmAddBezugsKontaktRelation.setImage(Images.IMG_NEW.getImage());
mntmAddBezugsKontaktRelation.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
BezugsKontaktRelation bezugsKontaktRelation = new BezugsKontaktRelation("",
RelationshipType.AGENERIC, RelationshipType.AGENERIC);
tableViewer.add(bezugsKontaktRelation);
tableViewer.setSelection(new StructuredSelection(bezugsKontaktRelation));
}
});
MenuItem mntmRemoveBezugsKontaktRelation = new MenuItem(menu, SWT.NONE);
mntmRemoveBezugsKontaktRelation.setText(Messages.Bezugskontakt_Delete);
mntmRemoveBezugsKontaktRelation.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
int selectionsIdx = tableViewer.getTable().getSelectionIndex();
if (selectionsIdx != -1) {
boolean ret = MessageDialog.openQuestion(UiDesk.getTopShell(),
Messages.Bezugskontakt_ConfirmDelete,
Messages.Bezugskontakt_ConfirmDeleteText);
if (ret) {
tableViewer.getTable().remove(selectionsIdx);
}
}
}
});
}
TableViewerColumn viewCol = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn col = viewCol.getColumn();
tcl_composite.setColumnData(col, new ColumnWeightData(1, 140));
col.setText(Messages.BezugsKonktat_Reference);
col.setToolTipText(Messages.Bezugskontakt_ReferenceTooltip);
viewCol.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell){
BezugsKontaktRelation s = (BezugsKontaktRelation) cell.getElement();
if (s == null)
return;
cell.setText(s.getName());
}
});
viewCol.setEditingSupport(new EditingSupport(tableViewer) {
@Override
protected void setValue(Object element, Object value){
if (element instanceof BezugsKontaktRelation) {
String newName = String.valueOf(value);
BezugsKontaktRelation tableData = null;
for (TableItem tableItem : tableViewer.getTable().getItems()) {
tableData = (BezugsKontaktRelation) tableItem.getData();
if (tableData != null && !tableData.equals(element)
&& !tableData.getName().isEmpty()
&& newName.equalsIgnoreCase(tableData.getName())) {
MessageDialog.openError(UiDesk.getTopShell(), "",
Messages.Bezugskontakt_NameMustBeUnique);
return;
}
}
BezugsKontaktRelation bezugsKontaktRelation = (BezugsKontaktRelation) element;
if (!bezugsKontaktRelation.getName().equals(newName)) {
bezugsKontaktRelation.setName(newName);
getViewer().update(bezugsKontaktRelation, null);
openConfirmUpdateExistingData(bezugsKontaktRelation);
}
}
}
@Override
protected Object getValue(Object element){
if (element instanceof BezugsKontaktRelation) {
return ((BezugsKontaktRelation) element).getName();
}
return null;
}
@Override
protected CellEditor getCellEditor(Object element){
return new TextCellEditor(tableViewer.getTable());
}
@Override
protected boolean canEdit(Object element){
return allowEditing;
}
});
viewCol = new TableViewerColumn(tableViewer, SWT.NONE);
col = viewCol.getColumn();
tcl_composite.setColumnData(col, new ColumnWeightData(0, 140));
col.setText(Messages.Bezugskontakt_RelationFrom);
viewCol.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell){
BezugsKontaktRelation s = (BezugsKontaktRelation) cell.getElement();
if (s == null)
return;
cell.setText(LocalizeUtil.getLocaleText(s.getDestRelationType()));
}
});
viewCol.setEditingSupport(new EditingSupport(tableViewer) {
@Override
protected void setValue(Object element, Object value){
if (element instanceof BezugsKontaktRelation && value instanceof Integer) {
BezugsKontaktRelation bezugsKontaktRelation = (BezugsKontaktRelation) element;
RelationshipType[] allRelationshipTypes = RelationshipType.values();
if ((int) value != -1 && !bezugsKontaktRelation.getDestRelationType()
.equals(allRelationshipTypes[(int) value])) {
bezugsKontaktRelation
.setDestRelationType(allRelationshipTypes[(int) value]);
getViewer().update(bezugsKontaktRelation, null);
openConfirmUpdateExistingData(bezugsKontaktRelation);
}
}
}
@Override
protected Object getValue(Object element){
if (element instanceof BezugsKontaktRelation) {
BezugsKontaktRelation bezugsKontaktRelation = (BezugsKontaktRelation) element;
RelationshipType relationshipType = bezugsKontaktRelation.getDestRelationType();
if (relationshipType != null) {
return relationshipType.getValue();
}
}
return 0;
}
@Override
protected CellEditor getCellEditor(Object element){
return new ComboBoxCellEditor(tableViewer.getTable(),
BezugsKontaktAuswahl.getBezugKontaktTypes(), SWT.NONE);
}
@Override
protected boolean canEdit(Object element){
return allowEditing;
}
});
viewCol = new TableViewerColumn(tableViewer, SWT.NONE);
col = viewCol.getColumn();
tcl_composite.setColumnData(col, new ColumnWeightData(0, 140));
col.setText(Messages.Bezugskontakt_RelationTo);
viewCol.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell){
BezugsKontaktRelation s = (BezugsKontaktRelation) cell.getElement();
if (s == null)
return;
cell.setText(LocalizeUtil.getLocaleText(s.getSrcRelationType()));
}
});
viewCol.setEditingSupport(new EditingSupport(tableViewer) {
@Override
protected void setValue(Object element, Object value){
if (element instanceof BezugsKontaktRelation && value instanceof Integer) {
BezugsKontaktRelation bezugsKontaktRelation = (BezugsKontaktRelation) element;
RelationshipType[] allRelationshipTypes = RelationshipType.values();
if ((int) value != -1 && !bezugsKontaktRelation.getSrcRelationType()
.equals(allRelationshipTypes[(int) value])) {
bezugsKontaktRelation.setSrcRelationType(allRelationshipTypes[(int) value]);
getViewer().update(bezugsKontaktRelation, null);
openConfirmUpdateExistingData(bezugsKontaktRelation);
}
}
}
@Override
protected Object getValue(Object element){
if (element instanceof BezugsKontaktRelation) {
BezugsKontaktRelation bezugsKontaktRelation = (BezugsKontaktRelation) element;
RelationshipType relationshipType = bezugsKontaktRelation.getSrcRelationType();
if (relationshipType != null) {
return relationshipType.getValue();
}
}
return 0;
}
@Override
protected CellEditor getCellEditor(Object element){
return new ComboBoxCellEditor(tableViewer.getTable(),
BezugsKontaktAuswahl.getBezugKontaktTypes(), SWT.NONE);
}
@Override
protected boolean canEdit(Object element){
return allowEditing;
}
});
;
tableViewer.setInput(loadBezugKonkaktTypes(
CoreHub.globalCfg.get(Patientenblatt2.CFG_BEZUGSKONTAKTTYPEN, "")));
return container;
}
private List<BezugsKontaktRelation> loadBezugKonkaktTypes(String cfgBezugKonktaks){
List<BezugsKontaktRelation> bezugsKontaktRelations = new ArrayList<>();
initalValues.clear();
for (String cfgPart : cfgBezugKonktaks.split(Patientenblatt2.SPLITTER)) {
BezugsKontaktRelation bezugsKontaktRelation = new BezugsKontaktRelation();
bezugsKontaktRelation.loadValuesByCfg(cfgPart);
initalValues.add(bezugsKontaktRelation);
bezugsKontaktRelations.add(new BezugsKontaktRelation(bezugsKontaktRelation));
}
return bezugsKontaktRelations;
}
@Override
public void init(IWorkbench workbench){
setPreferenceStore(new SettingsPreferenceStore(CoreHub.globalCfg));
}
@Override
protected void performApply(){
setErrorMessage(null);
super.performApply();
}
@Override
public boolean performOk(){
if (allowEditing) {
StringBuffer cfg = new StringBuffer();
BezugsKontaktRelation bezugsKontaktRelation = null;
boolean firstElement = true;
for (TableItem tableItem : tableViewer.getTable().getItems()) {
bezugsKontaktRelation = (BezugsKontaktRelation) tableItem.getData();
if (bezugsKontaktRelation != null) {
if (firstElement) {
firstElement = false;
} else {
cfg.append(Patientenblatt2.SPLITTER);
}
cfg.append(bezugsKontaktRelation.getCfgString());
if (updateExistingEntriesIds.contains(bezugsKontaktRelation.getId())) {
updateExistingEntries(bezugsKontaktRelation);
}
}
}
CoreHub.globalCfg.set(Patientenblatt2.CFG_BEZUGSKONTAKTTYPEN, cfg.toString());
}
return super.performOk();
}
private void updateExistingEntries(BezugsKontaktRelation newBezugsKontaktRelation){
BezugsKontaktRelation initalBezugKonktaktRelation =
getInitalBezugKontakt(newBezugsKontaktRelation.getId());
if (initalBezugKonktaktRelation != null) {
initalBezugKonktaktRelation.updateToNewBezugKontakt(newBezugsKontaktRelation);
}
}
private BezugsKontaktRelation getInitalBezugKontakt(String id){
for (BezugsKontaktRelation initalBezugKonktaktRelation : initalValues) {
if (initalBezugKonktaktRelation.getId().equals(id)) {
return initalBezugKonktaktRelation;
}
}
return null;
}
private void openConfirmUpdateExistingData(BezugsKontaktRelation bezugsKontaktRelation){
if (!updateExistingEntriesIds.contains(bezugsKontaktRelation.getId())) {
BezugsKontaktRelation initalBezugKonktaktRelation =
getInitalBezugKontakt(bezugsKontaktRelation.getId());
if (initalBezugKonktaktRelation != null) {
boolean ret = MessageDialog.openQuestion(UiDesk.getTopShell(), "",
Messages.Bezugskontakt_ConfirmUpdateExisting);
if (ret) {
updateExistingEntriesIds.add(bezugsKontaktRelation.getId());
}
}
}
}
}