/******************************************************************************* * Copyright (c) 2007-2013, D. Lutz 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: * D. Lutz - initial API and implementation * * Sponsors: * Dr. Peter Schönbucher, Luzern ******************************************************************************/ package org.iatrix.dialogs; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Shell; import org.iatrix.widgets.EnhancedTextFieldRO; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Konsultation; import ch.rgw.tools.VersionedResource; import ch.rgw.tools.VersionedResource.ResourceItem; public class ChooseKonsRevisionDialog extends TitleAreaDialog { /** * Version value indicatinig that no version has been chosen or the choice has been cancelled. */ public static final int NONE = -1; private int selectedVersion = NONE; private List<WidgetRow> widgetRows = new ArrayList<>(); private Konsultation konsultation; public ChooseKonsRevisionDialog(final Shell parent, final Konsultation konsultation){ super(parent); this.konsultation = konsultation; } @Override protected Control createDialogArea(final Composite parent){ // parent has GridLayout with 1 column ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL); scrolledComposite.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); Composite mainArea = new Composite(scrolledComposite, SWT.NONE); scrolledComposite.setContent(mainArea); GridLayout gridLayout = new GridLayout(1, false); gridLayout.verticalSpacing = 10; mainArea.setLayout(gridLayout); /* * createViewer(mainArea); */ createWidgetRows(mainArea); // 1) // mainArea.setSize(mainArea.computeSize(SWT.DEFAULT, SWT.DEFAULT)); // 2) scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); scrolledComposite.setMinSize(mainArea.computeSize(SWT.DEFAULT, SWT.DEFAULT)); return scrolledComposite; } /** * Selection listener handling single selection of radio buttons. SWT only handles mutal * selection if all radio buttons have the same parent. This is not the case in your layout. */ class RadioGroupListener implements SelectionListener { List<Button> buttons = new ArrayList<>(); @Override public void widgetSelected(SelectionEvent e){ // deselect other radio buttons for (Button other : buttons) { if (!other.equals(e.widget)) { other.setSelection(false); } } } @Override public void widgetDefaultSelected(SelectionEvent e){ widgetSelected(e); } /** * Add a radio button to this group listener. The methods registers ourselves as a * SelectionListener to the button. * * @param button */ public void addButton(Button button){ buttons.add(button); button.addSelectionListener(this); } }; private void createWidgetRows(Composite parent){ if (konsultation != null) { RadioGroupListener radioGroupListener = new RadioGroupListener(); VersionedResource vr = konsultation.getEintrag(); int last = vr.getHeadVersion(); for (int i = last; i >= 0; i--) { ResourceItem ri = vr.getVersion(i); int version = i; String label = ri.getLabel(); String data = ri.data; String labelText = "Rev " + version + ": " + label; Composite rowComposite = new Composite(parent, SWT.NONE); rowComposite.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); GridLayout gridLayout = new GridLayout(1, false); gridLayout.verticalSpacing = 0; rowComposite.setLayout(gridLayout); Button radioButton = new Button(rowComposite, SWT.RADIO); GridData gd = SWTHelper.getFillGridData(1, true, 1, false); gd.verticalAlignment = GridData.BEGINNING; radioButton.setLayoutData(gd); radioButton.setText(labelText); radioGroupListener.addButton(radioButton); /* * Label labelWidget = new Label(rowComposite, SWT.LEFT); * labelWidget.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); * labelWidget.setText(labelText); */ /* * Composite filler = new Composite(rowComposite, SWT.NONE); gd = * SWTHelper.getFillGridData(1, false, 1, false); gd.widthHint = 0; gd.heightHint = * 0; filler.setLayoutData(gd); */ EnhancedTextFieldRO text = new EnhancedTextFieldRO(rowComposite); text.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); text.setText(data); WidgetRow widgetRow = new WidgetRow(radioButton, version); widgetRows.add(widgetRow); } // check the first radio button if (widgetRows.size() > 0) { widgetRows.get(0).radio.setSelection(true); } } } @Override public void create(){ super.create(); setMessage("Text-Version wählen"); setTitle("Wählen Sie die gewünschte Version aus."); getShell().setText("Text-Version wählen"); setTitleImage(Images.IMG_LOGO.getImage()); //$NON-NLS-1$ } @Override protected void okPressed(){ selectedVersion = NONE; // find the selected version for (WidgetRow widgetRow : widgetRows) { if (widgetRow.radio.getSelection()) { selectedVersion = widgetRow.version; break; } } super.okPressed(); } /** * Return the selected version, or ChooseKonsRevisionDialog.NONE if no version has been * selected. This value is only valid after OK has been pressed. * * @return */ public int getSelectedVersion(){ return selectedVersion; } class WidgetRow { Button radio; int version; WidgetRow(Button radio, int version){ this.radio = radio; this.version = version; } } }