package org.atdl4j.ui.swing.app.impl; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextField; import org.apache.log4j.Logger; import org.atdl4j.config.Atdl4jConfig; import org.atdl4j.config.Atdl4jOptions; import org.atdl4j.data.exception.ValidationException; import org.atdl4j.ui.Atdl4jWidget; import org.atdl4j.ui.AtdlWidgetListener; import org.atdl4j.ui.app.Atdl4jCompositePanel; import org.atdl4j.ui.app.StrategySelectionEvent; import org.atdl4j.ui.app.impl.AbstractAtdl4jTesterPanel; /** * Represents the Swing-specific "TesterApp" core GUI component (without a main() line). * Contains a Atdl4jCompositePanel. * * @see org.atdl4j.ui.app.Atdl4jCompositePanel for AbstractAtdl4jTesterApp->AbstractAtdl4jTesterPanel->AbstractAtdl4jCompositePanel layering structure. * * */ public class SwingAtdl4jTesterPanel extends AbstractAtdl4jTesterPanel { public final Logger logger = Logger.getLogger(SwingAtdl4jTesterPanel.class); private JFrame parentComposite; private JPanel inputAndFilterDataAndLoadMessageComposite; private JPanel validateOutputSection; private JCheckBoxMenuItem showFileSelectionMenuItem; private JCheckBoxMenuItem showValidateOutputMenuItem; private JPanel okCancelButtonSection; private JTextField outputFixMessageText; public Object buildAtdl4jTesterPanel(Object aParentOrShell, Atdl4jOptions aAtdl4jOptions) { return buildAtdl4jTesterPanel( (JFrame) aParentOrShell, aAtdl4jOptions ); } public JFrame buildAtdl4jTesterPanel(JFrame frame, Atdl4jOptions aAtdl4jOptions) { JPanel mainPanel = new JPanel(new BorderLayout()); frame.getContentPane().add(mainPanel); parentComposite = frame; parentComposite.setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.gridx = 0; gc.fill = GridBagConstraints.BOTH; gc.weightx = 0; gc.weighty = 0; // -- Delegate back to AbstractAtdl4jTesterPanel -- init( parentComposite, aAtdl4jOptions ); inputAndFilterDataAndLoadMessageComposite = new JPanel(new BorderLayout()); inputAndFilterDataAndLoadMessageComposite.setBorder(BorderFactory.createTitledBorder("Testing Input")); // -- Build the Swing.JPanel from Atdl4jInputAndFilterDataSelectionPanel ("Input Data/Filter Criteria" button) -- Atdl4jCompositePanel atdl4jCompositePanel = getAtdl4jCompositePanel(); JPanel inpPanel = (JPanel)getAtdl4jInputAndFilterDataSelectionPanel().buildAtdl4jInputAndFilterDataSelectionPanel( inputAndFilterDataAndLoadMessageComposite, getAtdl4jOptions(), atdl4jCompositePanel.getAtdl4jUserMessageHandler() ); if (inpPanel != null) { inputAndFilterDataAndLoadMessageComposite.add(inpPanel, BorderLayout.WEST); } // -- Build the Swing.JPanel from FixMsgLoadPanel ("Load FIX Message" button) -- JPanel loadPanel = (JPanel)getFixMsgLoadPanel().buildFixMsgLoadPanel( inputAndFilterDataAndLoadMessageComposite, getAtdl4jOptions() ); inputAndFilterDataAndLoadMessageComposite.add(loadPanel, BorderLayout.CENTER); parentComposite.add(inputAndFilterDataAndLoadMessageComposite, gc); parentComposite.add(getEnableDisablePanel(atdl4jCompositePanel), gc); JPanel internalPanel = new JPanel(new BorderLayout()); // -- Build the Swing.JPanel from FixatdlFileSelectionPanel (filename / file dialog) -- JPanel loadFilePanel = (JPanel)getFixatdlFileSelectionPanel().buildFixatdlFileSelectionPanel( parentComposite, getAtdl4jOptions() ); internalPanel.add(loadFilePanel, BorderLayout.NORTH); // -- Build the Swing.JPanel from Atdl4jCompositePanel -- JPanel strategyParamsPanel = (JPanel)atdl4jCompositePanel.buildAtdl4jCompositePanel( parentComposite, aAtdl4jOptions ); internalPanel.add(new JScrollPane(strategyParamsPanel), BorderLayout.CENTER); // -- Build the Swing.JPanel containing "Validate Output" button and outputFixMessageText -- JPanel validatePanel = createValidateOutputSection(); internalPanel.add(validatePanel, BorderLayout.SOUTH); gc.weightx = 1; gc.weighty = 1; parentComposite.add(internalPanel, gc); // -- Build the Swing.JPanel containing "OK" and "Cancel" buttons -- JPanel buttonsPanel = createOkCancelButtonSection(); gc.weightx = 0; gc.weighty = 0; parentComposite.add(buttonsPanel, gc); // -- Build the Swing JMenuItems -- createPopupMenuForPanel(internalPanel); addListeners(atdl4jCompositePanel); return parentComposite; } private Component getEnableDisablePanel(final Atdl4jCompositePanel atdl4jCompositePanel) { JPanel panel = new JPanel(new GridBagLayout()); JCheckBox enableCheckbox = new JCheckBox("Enable/disable"); enableCheckbox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { atdl4jCompositePanel.setEditable(e.getStateChange() != ItemEvent.SELECTED); } }); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.HORIZONTAL; gc.weightx = 1; panel.add(enableCheckbox, gc); return panel; } private void addListeners(Atdl4jCompositePanel atdl4jCompositePanel) { atdl4jCompositePanel.getStrategiesUI().addWidgetListener(new AtdlWidgetListener() { @Override public void widgetChanged(Atdl4jWidget widget) { if (logger.isDebugEnabled()) { logger.debug("Widget changed notification :" + widget); } } }); } public void closePanel() { if ( parentComposite != null ) { parentComposite.dispose(); } } public void setVisibleFileSelectionSection( boolean aVisible ) { if ( getFixatdlFileSelectionPanel() != null ) { getFixatdlFileSelectionPanel().setVisible( aVisible ); if ( showFileSelectionMenuItem != null ) { showFileSelectionMenuItem.setSelected( aVisible ); } } } protected void createPopupMenuForPanel(JPanel _panel) { final JPopupMenu menu = new JPopupMenu(); // -- "Show File Selection" -- setVisibleFileSelectionSection( Atdl4jConfig.getConfig().isShowFileSelectionSection() ); showFileSelectionMenuItem = new JCheckBoxMenuItem("Show File Selection" ); showFileSelectionMenuItem.setSelected( Atdl4jConfig.getConfig().isShowFileSelectionSection() ); showFileSelectionMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisibleFileSelectionSection( showFileSelectionMenuItem.isSelected() ); } }); // -- "Show Validate Output" -- setVisibleValidateOutputSection( Atdl4jConfig.getConfig().isShowValidateOutputSection() ); showValidateOutputMenuItem = new JCheckBoxMenuItem("Show Validate Output" ); showValidateOutputMenuItem.setSelected( Atdl4jConfig.getConfig().isShowValidateOutputSection() ); showValidateOutputMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisibleValidateOutputSection( showValidateOutputMenuItem.isSelected() ); } }); menu.add(showFileSelectionMenuItem); menu.add(showValidateOutputMenuItem); _panel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { menu.show(e.getComponent(), e.getX(), e.getY()); } } }); } protected JPanel createValidateOutputSection() { validateOutputSection = new JPanel(new BorderLayout()); validateOutputSection.setBorder(BorderFactory.createTitledBorder("Validation")); // validate button JButton validateButton = new JButton("Validate Output"); validateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { validateButtonSelected(); } catch (ValidationException ex) { logger.info("Validation Exception:", ex); getAtdl4jUserMessageHandler().displayException( "Validation Exception", "", ex); } } }); validateOutputSection.add(validateButton, BorderLayout.WEST); outputFixMessageText = new JTextField(20); validateOutputSection.add(outputFixMessageText, BorderLayout.CENTER); return validateOutputSection; } public void setVisibleValidateOutputSection( boolean aVisible ) { if ( validateOutputSection != null ) { validateOutputSection.setVisible( aVisible ); if ( showValidateOutputMenuItem != null ) { showValidateOutputMenuItem.setSelected( aVisible ); } } } public void setVisibleTestingInputSection( boolean aVisible ) { /* if ( ( inputAndFilterDataAndLoadMessageComposite != null ) && ( ! inputAndFilterDataAndLoadMessageComposite.isDisposed() ) ) { inputAndFilterDataAndLoadMessageComposite.setVisible( aVisible ); if ( inputAndFilterDataAndLoadMessageComposite.getLayoutData() instanceof GridData ) { ((GridData) inputAndFilterDataAndLoadMessageComposite.getLayoutData()).exclude = !aVisible; } packLayout(); } */ } protected JPanel createOkCancelButtonSection() { okCancelButtonSection = new JPanel(); // OK button JButton okButton = new JButton("OK"); okButton.setToolTipText( "Validate and accept the specified strategy and parameters" ); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { okButtonSelected(); } }); // Cancel button JButton cancelButton = new JButton("Cancel"); cancelButton.setToolTipText( "Cancel ignoring any specified changes" ); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cancelButtonSelected(); } }); okCancelButtonSection.add(okButton); okCancelButtonSection.add(cancelButton); setVisibleOkCancelButtonSection( Atdl4jConfig.getConfig().isShowTesterPanelOkCancelButtonSection() ); return okCancelButtonSection; } public void setVisibleOkCancelButtonSection( boolean aVisible ) { if ( okCancelButtonSection != null ) { okCancelButtonSection.setVisible( aVisible ); } } protected void packLayout() { getShell().pack(); } /** * Returns getParentComposite().getShell(). * @return the shell */ private JFrame getShell() { if ( getParentComposite() != null ) { return (JFrame)getParentComposite().getParent(); } else { return null; } } /** * @return the parentComposite */ private JFrame getParentComposite() { return this.parentComposite; } protected void setValidateOutputText(String aText) { if ( ( Atdl4jConfig.getConfig().isShowValidateOutputSection() ) ) { if ( aText != null ) { outputFixMessageText.setText( aText.replace( '\n', ' ' ) ); } else { outputFixMessageText.setText( "" ); } } else { outputFixMessageText.setText( aText.replace( '\n', ' ' ) ); } } @Override public void beforeStrategyIsSelected(StrategySelectionEvent event) { } }