/*
* Copyright (c) 2012 European Synchrotron Radiation Facility,
* Diamond Light Source Ltd.
*
* 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
*/
/**
*
*/
package fable.framework.ui.dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
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.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import fable.framework.internal.ICrystalSymmetryVarKeys;
import fable.framework.ui.internal.IVarKeys;
import fable.framework.ui.rcp.Activator;
/**
* @author david This class creates a dialog box to get space group number if
* user knows crystal symbol based on IUCr table.
*/
public class CrystalSymmetryDialog extends Dialog {
private Combo spaceGroupSymbolCombo;
private Shell shell;
private Spinner spaceGroupSpinner;
private static final int COMBO_BOX_WIDTH = 50;
private Text spaceSystemText;
private int spaceGroup = 1, spaceGroupSystem = 0;
public CrystalSymmetryDialog(Shell parentShell, int spgr) {
this(parentShell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL, spgr);
}
public CrystalSymmetryDialog(Shell parentShell, int style, int spgr) {
super(parentShell, style);
setText("Space Group");
spaceGroup = spgr;
}
public int open() {
shell = new Shell(getParent(), getStyle());
shell.setText(getText());
shell.setLayout(new GridLayout(2, true));
createContents(shell);
shell.pack();
shell.open();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return spaceGroup;
}
protected Control createContents(Composite container) {
//int numColInGroup = 2;
/*Group group = LookAndFeel.getGroup(container, "", 2,
numColInGroup);
group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
group.setToolTipText(IVarKeys.spaceGroupDesc);*/
Composite composite = new Composite(container, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true,
false).applyTo(composite);
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
composite.setLayout(gridLayout);
new Label(composite, SWT.NONE).setText("Symbol");
spaceGroupSymbolCombo = new Combo(composite, SWT.READ_ONLY | SWT.RESIZE
| SWT.DROP_DOWN);
spaceGroupSymbolCombo.setLayoutData(new GridData(SWT.FILL, SWT.RESIZE,
true, false));
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true,
false).hint(COMBO_BOX_WIDTH, SWT.DEFAULT).applyTo(
spaceGroupSymbolCombo);
spaceGroupSymbolCombo.setToolTipText(IVarKeys.spaceGroupDesc);
for (int i = 0; i < ICrystalSymmetryVarKeys.MAX_SPACEGROUP_VALUE; i++) {
spaceGroupSymbolCombo
.add(ICrystalSymmetryVarKeys.SPACE_GROUP_SYMBOLS[i]);
}
spaceGroupSymbolCombo.select(0);
spaceGroupSymbolCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// The number is 1 more than the index
spaceGroup = spaceGroupSymbolCombo.getSelectionIndex() + 1;
setSpaceGroup(spaceGroup);
}
});
// Number
composite = new Composite(container, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true,
false).applyTo(composite);
gridLayout = new GridLayout(2, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
composite.setLayout(gridLayout);
new Label(composite, SWT.NONE).setText("Number");
spaceGroupSpinner = new Spinner(composite, SWT.SINGLE | SWT.BORDER
| SWT.FILL | SWT.RESIZE);
spaceGroupSpinner.setToolTipText(IVarKeys.spaceGroupDesc);
spaceGroupSpinner.setLayoutData(new GridData(SWT.LEFT, SWT.RESIZE,
true, false));
spaceGroupSpinner
.setMinimum(ICrystalSymmetryVarKeys.MIN_SPACEGROUP_VALUE);
spaceGroupSpinner
.setMaximum(ICrystalSymmetryVarKeys.MAX_SPACEGROUP_VALUE);
spaceGroupSpinner.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
spaceGroup = spaceGroupSpinner.getSelection();
setSpaceGroup(spaceGroup);
}
});
// System
composite = new Composite(container, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true,
false).span(2, 1).applyTo(composite);
gridLayout = new GridLayout(2, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
composite.setLayout(gridLayout);
new Label(composite, SWT.NONE).setText("Crystal System:");
spaceSystemText = new Text(composite, SWT.NONE);
spaceSystemText.setEditable(false);
GridDataFactory.fillDefaults().grab(true, false).applyTo(
spaceSystemText);
spaceSystemText
.setText(ICrystalSymmetryVarKeys.SPACE_GROUP_TYPES[spaceGroupSystem]);
spaceSystemText.setToolTipText(IVarKeys.crystalSystemDesc);
createButtons();
setSpaceGroup(spaceGroup);
return container;
}
private void createButtons() {
Composite composite = new Composite(shell, SWT.NONE);
GridLayout gridLayout = new GridLayout(2, true);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
composite.setLayout(gridLayout);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
Button ok = new Button(composite, SWT.PUSH | SWT.RESIZE);
ok.setText("Ok");
ImageDescriptor descriptor = Activator
.getImageDescriptor("images/add.gif");
if (descriptor != null) {
Image image = descriptor.createImage();
if (image != null) {
ok.setImage(image);
}
}
ok.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
ok.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
shell.close();
}
});
// Create the cancel button and add a handler
// so that pressing it will set input to null
Button cancel = new Button(composite, SWT.PUSH | SWT.RESIZE);
cancel.setText("Cancel");
descriptor = Activator.getImageDescriptor("images/delete.gif");
if (descriptor != null) {
Image image = descriptor.createImage();
if (image != null) {
cancel.setImage(image);
}
}
cancel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
cancel.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
spaceGroup = 0;
shell.close();
}
});
// Set the OK button as the default, so
// user can type input and press Enter
// to dismiss
shell.setDefaultButton(ok);
}
/**
* set the space group and update the space group type and associated combo
* boxes
*
* @param _spaceGroup
* - space group (1 to 230)
*/
public void setSpaceGroup(int spaceGroup) {
this.spaceGroup = spaceGroup;
// Set the controls
if (spaceGroupSymbolCombo.getSelectionIndex() != spaceGroup - 1) {
spaceGroupSymbolCombo.select(spaceGroup - 1);
}
if (spaceGroupSpinner.getSelection() != spaceGroup) {
spaceGroupSpinner.setSelection(spaceGroup);
}
// Determine space group system
int newspaceGroupSystem = 0;
for (int i = 0; i < ICrystalSymmetryVarKeys.SPACE_GROUP_MAXIMUM.length; i++) {
if (spaceGroup <= ICrystalSymmetryVarKeys.SPACE_GROUP_MAXIMUM[i]) {
newspaceGroupSystem = i;
break;
}
}
spaceGroupSystem = newspaceGroupSystem;
spaceSystemText
.setText(ICrystalSymmetryVarKeys.SPACE_GROUP_TYPES[spaceGroupSystem]);
}
}