package games.strategy.engine.framework.ui; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import games.strategy.engine.data.properties.IEditableProperty; import games.strategy.engine.data.properties.PropertiesUI; import games.strategy.ui.SwingAction; /** * Wrapper for properties selection window. */ public class PropertiesSelector { /** * @param parent * parent component * @param properties * properties that will get displayed * @param buttonOptions * button options. They will be displayed in a row on the bottom * @return pressed button */ public static Object getButton(final JComponent parent, final String title, final List<IEditableProperty> properties, final Object... buttonOptions) { if (!SwingUtilities.isEventDispatchThread()) { // throw new IllegalStateException("Must run from EventDispatchThread"); final AtomicReference<Object> rVal = new AtomicReference<>(); SwingAction.invokeAndWait(() -> rVal.set(showDialog(parent, title, properties, buttonOptions))); return rVal.get(); } else { return showDialog(parent, title, properties, buttonOptions); } } private static Object showDialog(final JComponent parent, final String title, final List<IEditableProperty> properties, final Object... buttonOptions) { final PropertiesUI panel = new PropertiesUI(properties, true); final JScrollPane scroll = new JScrollPane(panel); scroll.setBorder(null); scroll.getViewport().setBorder(null); final JOptionPane pane = new JOptionPane(scroll, JOptionPane.PLAIN_MESSAGE); pane.setOptions(buttonOptions); final JDialog window = pane.createDialog(JOptionPane.getFrameForComponent(parent), title); window.setVisible(true); return pane.getValue(); } }