package edu.stanford.rsl.conrad.phantom.electrondensity; import ij.gui.GenericDialog; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.AbstractButton; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.LayoutStyle; import javax.swing.text.JTextComponent; import edu.stanford.rsl.conrad.physics.materials.database.MaterialsDB; import edu.stanford.rsl.conrad.utils.Configuration; import edu.stanford.rsl.conrad.utils.RegKeys; /** * Temporary GUI * @author Rotimi X Ojo * */ public class CrisEDPhantomGUI extends JPanel implements ActionListener,ItemListener{ private static final long serialVersionUID = 8752339017895320468L; private GenericDialog gd; // private JPanel innerRing; private JPanel innerRingHolder; private JPanel outerRing; private JRadioButton [] innerBut; private JRadioButton [] outterBut; private JTextComponent insertNameField; private JTextField materialField; private JTextField densityField; //private JTextField bufferedDiameterField;// define the diameter of buffer insert private AbstractButton innerDiskActivator; private AbstractButton outerDiskActivator; private JLabel insertNameLabel; private JLabel materialLabel; private JLabel densityLabel; private JLabel instructionLabel; private JCheckBox bufferedMaterial; private JLabel bufferedMaterialLabel; //private JLabel bufferedDiameterLabel; // define the diameter of buffer insert private JButton okButton; private JRadioButton currButton; private CrisEDPhantomM062 data; public CrisEDPhantomGUI (CrisEDPhantomM062 data) { this.data = data; gd = new GenericDialog("Configure Phantom"); initComponents(); createLayout(); gd.add(this); gd.showDialog(); } private void initComponents() { innerBut = new JRadioButton[9]; outterBut = new JRadioButton[8]; initButtons(innerBut, "I",0); initButtons(outterBut, "O",0); // outerRing = new JPanel(); outerRing.setBackground(Color.BLACK); outerRing.setName("OutterRing"); // innerRing = new JPanel(); innerRingHolder = new JPanel(); innerRing.setBackground(Color.BLACK); innerRing.setName("Inner Ring"); innerRingHolder.setBackground(Color.BLACK); // instructionLabel = new JLabel("Click on slot to add or remove insert."); instructionLabel.setName("instructionLabel"); // insertNameLabel = new JLabel("Insert: "); insertNameLabel.setName("insertNameLabel"); insertNameField = new JTextField("NULL"); insertNameField.setEditable(false); insertNameField.setName("insertNameField"); // materialLabel = new JLabel("Material: "); materialLabel.setName("materialLabel"); densityLabel = new JLabel("Density: "); densityLabel.setName("densityLabel"); materialField = new JTextField("air"); materialField.setName("materialField"); materialField.setMinimumSize(new Dimension(100,10)); densityField = new JTextField("1.0"); densityField.setName("densityField"); densityField.setMinimumSize(new Dimension(100,10)); // innerDiskActivator = new JRadioButton("Add Inner Disk"); innerDiskActivator.setSelected(true); innerDiskActivator.setToolTipText("Adds or Remove Inner Disk"); innerDiskActivator.setName("innerDiskActivator"); innerDiskActivator.addItemListener(this); outerDiskActivator = new JRadioButton("Add outer Disk"); outerDiskActivator.setSelected(true); outerDiskActivator.setToolTipText("Adds or Remove outer Disk"); outerDiskActivator.setName("outerDiskActivator"); outerDiskActivator.addItemListener(this); // bufferedMaterialLabel = new JLabel(" Water Buffered:"); bufferedMaterialLabel.setToolTipText("Check if material is buffered with water"); bufferedMaterial = new JCheckBox(); bufferedMaterial.setToolTipText("Check if material is buffered with water"); /*bufferedDiameterLabel = new JLabel("Diameter of buffer insert: "); bufferedDiameterLabel.setName("bufferedDiameterLabel"); bufferedDiameterField = new JTextField("5"); bufferedDiameterField.setName("materialField"); bufferedDiameterField.setMinimumSize(new Dimension(100,10));*/ // okButton = new JButton("OK"); okButton.setName("okButton"); okButton.addActionListener(this); } private void initButtons(JRadioButton[] buts, String prefix, int offset) { for(int i = 0; i < buts.length; i++){ buts[i] = getNewRadioButton(prefix + "-" + (i+offset)); } } private void createLayout() { GroupLayout jPanel7Layout = new GroupLayout(innerRing); innerRing.setLayout(jPanel7Layout); jPanel7Layout.setHorizontalGroup( jPanel7Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(jPanel7Layout.createSequentialGroup() .addGap(15, 15, 15) .addComponent(innerBut[3]) .addComponent(innerBut[2]) .addComponent(innerBut[1])) .addGroup(jPanel7Layout.createSequentialGroup() .addGap(6, 6, 6) .addComponent(innerBut[4]) .addGap(10, 10, 10) .addComponent(innerBut[8]) .addGap(8, 8, 8) .addComponent(innerBut[0])) .addGroup(jPanel7Layout.createSequentialGroup() .addGap(15, 15, 15) .addComponent(innerBut[5]) .addComponent(innerBut[6]) .addComponent(innerBut[7])) ); jPanel7Layout.setVerticalGroup( jPanel7Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(jPanel7Layout.createSequentialGroup() .addGroup(jPanel7Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(jPanel7Layout.createSequentialGroup() .addGap(7, 7, 7) .addComponent(innerBut[3])) .addComponent(innerBut[2]) .addGroup(jPanel7Layout.createSequentialGroup() .addGap(7, 7, 7) .addComponent(innerBut[1]))) .addGroup(jPanel7Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(innerBut[4]) .addComponent(innerBut[8]) .addComponent(innerBut[0])) .addGroup(jPanel7Layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(innerBut[5]) .addGroup(jPanel7Layout.createSequentialGroup() .addGap(7, 7, 7) .addComponent(innerBut[6])) .addComponent(innerBut[7]))) ); innerRingHolder.setSize(innerRing.getPreferredSize()); innerRingHolder.add(innerRing); JPanel toAdd= innerRingHolder; if (outerRing.isVisible()) { GroupLayout OutterRingLayout = new GroupLayout(outerRing); outerRing.setLayout(OutterRingLayout); OutterRingLayout.setHorizontalGroup( OutterRingLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(31, 31, 31) .addComponent(outterBut[4]) .addGap(2, 2, 2) .addGroup(OutterRingLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(outterBut[3]) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(3, 3, 3) .addComponent(outterBut[5]))) .addGroup(OutterRingLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(36, 36, 36) .addComponent(outterBut[2])) .addComponent(innerRingHolder, GroupLayout.PREFERRED_SIZE, 85, GroupLayout.PREFERRED_SIZE) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(35, 35, 35) .addComponent(outterBut[6]))) .addGroup(OutterRingLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(2, 2, 2) .addComponent(outterBut[1])) .addComponent(outterBut[7])) .addGap(3, 3, 3) .addComponent(outterBut[0])) ); OutterRingLayout.setVerticalGroup( OutterRingLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(87, 87, 87) .addComponent(outterBut[4])) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(39, 39, 39) .addComponent(outterBut[3]) .addGap(76, 76, 76) .addComponent(outterBut[5])) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(21, 21, 21) .addComponent(outterBut[2]) .addGap(16, 16, 16) .addComponent(innerRingHolder, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE) .addGap(17, 17, 17) .addComponent(outterBut[6])) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(39, 39, 39) .addComponent(outterBut[1]) .addGap(76, 76, 76) .addComponent(outterBut[7])) .addGroup(OutterRingLayout.createSequentialGroup() .addGap(89, 89, 89) .addComponent(outterBut[0])) ); toAdd=outerRing; } GroupLayout mainPanelLayout = new GroupLayout(this); this.setLayout(mainPanelLayout); mainPanelLayout.setHorizontalGroup( mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(mainPanelLayout.createSequentialGroup() .addGap(172, 172, 172) .addComponent(okButton, GroupLayout.PREFERRED_SIZE, 71, GroupLayout.PREFERRED_SIZE) .addContainerGap(206, Short.MAX_VALUE)) .addGroup(mainPanelLayout.createSequentialGroup() .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addGroup(mainPanelLayout.createSequentialGroup() .addGap(26, 26, 26) .addComponent(toAdd, GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE)) .addGroup(GroupLayout.Alignment.LEADING, mainPanelLayout.createSequentialGroup() .addGap(107, 107, 107) .addComponent(instructionLabel))) .addGap(39, 39, 39) .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(mainPanelLayout.createSequentialGroup() .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(insertNameLabel) .addComponent(materialLabel) .addComponent(densityLabel) //.addComponent(bufferedDiameterLabel) .addComponent(bufferedMaterialLabel)) .addGap(18, 18, 18) .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(materialField) .addComponent(densityField) .addComponent(insertNameField) .addComponent(bufferedMaterial))) .addComponent(innerDiskActivator) .addComponent(outerDiskActivator)) .addGap(22, 22, 22)) ); mainPanelLayout.setVerticalGroup( mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(instructionLabel) .addGap(18, 18, 18) .addComponent(toAdd, GroupLayout.PREFERRED_SIZE, 199, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(okButton) .addContainerGap()) .addGroup(mainPanelLayout.createSequentialGroup() .addGap(60, 60, 60) .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(insertNameLabel) .addComponent(insertNameField)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(materialLabel) .addComponent(materialField)).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(densityLabel) .addComponent(densityField)).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(bufferedMaterialLabel) .addComponent(bufferedMaterial)) .addGap(30, 30, 30) .addComponent(innerDiskActivator) //.addContainerGap(81, Short.MAX_VALUE) //.addGap(67, 67, 67) .addComponent(outerDiskActivator) .addContainerGap(81, Short.MAX_VALUE)) ); } private JRadioButton getNewRadioButton(String name){ JRadioButton button = new JRadioButton(); button.setBackground(Color.BLACK); button.setForeground(Color.GREEN); button.setToolTipText("0.0"); button.setName(name); button.addItemListener(this); return button; } @Override public void actionPerformed(ActionEvent e) { if(e.getSource().equals(okButton)){ setInsertMaterial(currButton,materialField.getText(), Double.parseDouble(densityField.getText()), bufferedMaterial.isSelected()? Insert.BUFFERED_INSERT:Insert.UNBUFFERED_INSERT); gd.setVisible(false); } } private String getInsertMaterialName(JRadioButton but) { if(but==null){ return "air"; } String name = but.getName().trim(); String ring = name.substring(0, name.indexOf("-")); int index = new Integer(name.substring(name.indexOf("-")+1)); if(ring.equals("I")){ return data.getInsertValue(CrisEDPhantomM062.INNER_RING, index); }else{ return data.getInsertValue(CrisEDPhantomM062.OUTER_RING, index); } } private int getInsertMaterialBufferState(JRadioButton but) { if(but==null){ return Insert.UNBUFFERED_INSERT; } String name = but.getName().trim(); String ring = name.substring(0, name.indexOf("-")); int index = new Integer(name.substring(name.indexOf("-")+1)); if(ring.equals("I")){ return data.getInsertBufferState(CrisEDPhantomM062.INNER_RING, index); }else{ return data.getInsertBufferState(CrisEDPhantomM062.OUTER_RING, index); } } private void setInsertMaterial(JRadioButton but, String material, double density, int buffered) { if(but == null){ return; } String name = but.getName().trim(); String ring = name.substring(0, name.indexOf("-")); Insert ins; int index = new Integer(name.substring(name.indexOf("-")+1)); if (index == 8){ double centralInsertDiameter = Double.parseDouble(Configuration.getGlobalConfiguration().getRegistryEntry(RegKeys.ED_PHANTOM_CENTERAL_BUFFER_DIAMETER)); ins = new Insert(MaterialsDB.getMaterial(material), buffered, centralInsertDiameter); } //special modification for determining the buffer diameter of Insert1 to adapt Jang@Stanford's EDPhantom else if (index == 1){ double insertOneDiameter = Double.parseDouble(Configuration.getGlobalConfiguration().getRegistryEntry(RegKeys.ED_PHANTOM_INSERT_1_BUFFER_DIAMETER)); ins = new Insert(MaterialsDB.getMaterial(material), buffered, insertOneDiameter); } else { ins = new Insert(MaterialsDB.getMaterial(material), buffered); } if(ring.equals("I")){ data.setInsert(CrisEDPhantomM062.INNER_RING, index, ins); }else{ data.setInsert(CrisEDPhantomM062.OUTER_RING, index, ins); } but.setToolTipText(material+ ""); } @Override public void itemStateChanged(ItemEvent e) { JRadioButton but = (JRadioButton) e.getSource(); String name = but.getName().trim(); if (name.equals("innerDiskActivator")) { if (but.isSelected()) { innerRing.setVisible(true); data.setRingState(CrisEDPhantomM062.INNER_RING, true); } else { innerRing.setVisible(false); data.setRingState(CrisEDPhantomM062.INNER_RING, false); } }else if(name.equals("outerDiskActivator")){ if (but.isSelected()) { outerRing.setVisible(true); data.setRingState(CrisEDPhantomM062.OUTER_RING, true); } else { outerRing.setVisible(false); data.setRingState(CrisEDPhantomM062.OUTER_RING, false); } }else { insertNameField.setText(but.getName()); if (but.isSelected()) { setInsertMaterial(currButton,materialField.getText(), Double.parseDouble(densityField.getText()),bufferedMaterial.isSelected()? Insert.BUFFERED_INSERT:Insert.UNBUFFERED_INSERT); materialField.setText(getInsertMaterialName(but)); bufferedMaterial.setSelected(getInsertMaterialBufferState(but)== Insert.BUFFERED_INSERT); currButton = but; } else { setInsertMaterial(currButton,materialField.getText(), Double.parseDouble(densityField.getText()),bufferedMaterial.isSelected()? Insert.BUFFERED_INSERT:Insert.UNBUFFERED_INSERT); materialField.setText(getInsertMaterialName(currButton)); bufferedMaterial.setSelected(getInsertMaterialBufferState(currButton)== Insert.BUFFERED_INSERT); setInsertMaterial(but, "air", 0.0,Insert.UNBUFFERED_INSERT); } } this.removeAll(); this.createLayout(); } } /* * Copyright (C) 2010-2014 Rotimi X Ojo * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */