package org.atdl4j.ui.swing.impl; import java.awt.Window; import java.awt.event.ActionEvent; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.DocumentEvent; import javax.swing.event.ListSelectionEvent; import org.atdl4j.config.Atdl4jOptions; import org.atdl4j.data.Atdl4jHelper; import org.atdl4j.data.ValidationRule; import org.atdl4j.data.exception.FIXatdlFormatException; import org.atdl4j.data.validation.ValidationRuleFactory; import org.atdl4j.fixatdl.core.StrategiesT; import org.atdl4j.fixatdl.core.StrategyT; import org.atdl4j.fixatdl.validation.EditT; import org.atdl4j.ui.Atdl4jWidget; import org.atdl4j.ui.StrategyUI; import org.atdl4j.ui.app.Atdl4jUserMessageHandler; import org.atdl4j.ui.impl.AbstractStrategiesUI; import org.atdl4j.ui.swing.SwingListener; import org.atdl4j.ui.swing.SwingWidget; public class SwingStrategiesUI extends AbstractStrategiesUI { private Window parentFrame; private JPanel strategiesPanel; private Map<String, SwingWidgetListener> swingWidgetListeners; private int pendingNotifications; /* * Call init() after invoking the no arg constructor */ public SwingStrategiesUI() { this.swingWidgetListeners = new HashMap<String, SwingWidgetListener>(); } public SwingStrategiesUI(Atdl4jOptions aAtdl4jOptions) { init(aAtdl4jOptions); } public void init(Atdl4jOptions aAtdl4jOptions) { setAtdl4jOptions( aAtdl4jOptions ); } public Object buildStrategiesPanel(Object parentOrShell, Atdl4jOptions atdl4jOptions, Atdl4jUserMessageHandler aAtdl4jUserMessageHandler) { return buildStrategiesPanel( (Window) parentOrShell, atdl4jOptions, aAtdl4jUserMessageHandler ); } public JPanel buildStrategiesPanel(Window aParentComposite, Atdl4jOptions atdl4jOptions, Atdl4jUserMessageHandler aAtdl4jUserMessageHandler) { parentFrame = aParentComposite; setAtdl4jOptions( atdl4jOptions ); setAtdl4jUserMessageHandler( aAtdl4jUserMessageHandler ); // Main strategies panel strategiesPanel = new JPanel(); return strategiesPanel; } public void removeAllStrategyPanels() { strategiesPanel.removeAll(); } public void createStrategyPanels(StrategiesT aStrategies, List<StrategyT> aFilteredStrategyList) throws FIXatdlFormatException { // -- Check to see if StrategiesT has changed (eg new file loaded) -- if ( ( getStrategies() == null ) || ( ! getStrategies().equals( aStrategies ) ) ) { setStrategies( aStrategies ); setStrategiesRules( new HashMap<String, ValidationRule>() ); for (EditT edit : getStrategies().getEdit()) { String id = edit.getId(); if (id != null) { ValidationRule rule = ValidationRuleFactory.createRule(edit, getStrategiesRules(), getStrategies()); getStrategiesRules().put(id, rule); } else { throw new IllegalArgumentException("Strategies-scoped edit without id"); } } } setPreCached( false ); setCurrentlyDisplayedStrategyUI( null ); if (getAtdl4jOptions().isPreloadPanels()) { for (StrategyT strategy : aFilteredStrategyList) { removeAllStrategyPanels(); StrategyUI ui = SwingStrategyUIFactory .createStrategyUIAndContainer(this, strategy); setCurrentlyDisplayedStrategyUI(ui); } setPreCached(true); } } public void adjustLayoutForSelectedStrategy( StrategyT aStrategy ) { muteWidgetNotification(); if ( strategiesPanel != null ) { // -- (aReinitPanelFlag=true) -- StrategyUI tempStrategyUI = getStrategyUI( aStrategy, true ); if ( tempStrategyUI == null ) { logger.info("ERROR: Strategy name: " + aStrategy.getName() + " was not found. (aStrategy: " + aStrategy + ")" ); return; } logger.debug( "Invoking tempStrategyUI.reinitStrategyPanel() for: " + Atdl4jHelper.getStrategyUiRepOrName( tempStrategyUI.getStrategy() ) ); tempStrategyUI.reinitStrategyPanel(); } allowWidgetNotification(); } private void muteWidgetNotification() { pendingNotifications++; } private void allowWidgetNotification() { pendingNotifications--; } /* * (non-Javadoc) * @see org.atdl4j.ui.app.StrategiesPanel#setVisible(boolean) */ @Override public void setVisible(boolean aVisible) { if ( strategiesPanel != null ) { strategiesPanel.setVisible( aVisible ); } } // 12/15/2010 Scott Atwell public StrategyUI getStrategyUI( StrategyT aStrategy ) public StrategyUI getStrategyUI( StrategyT aStrategy, boolean aReinitPanelFlag ) { if ( aStrategy.equals( getCurrentlyDisplayedStrategy() ) ) { logger.debug("Strategy name: " + aStrategy.getName() + " is currently being displayed. Returning getCurrentlyDisplayedStrategyUI()" ); // 12/15/2010 Scott Atwell return getCurrentlyDisplayedStrategyUI(); if ( aReinitPanelFlag ) { getCurrentlyDisplayedStrategyUI().reinitStrategyPanel(); setWidgetListeners(getCurrentlyDisplayedStrategyUI()); } return getCurrentlyDisplayedStrategyUI(); } else { logger.debug("Strategy name: " + aStrategy.getName() + " is not currently displayed. Invoking removeAllStrategyPanels() and returning createStrategyPanel()" ); removeAllStrategyPanels(); StrategyUI tempStrategyUI = SwingStrategyUIFactory.createStrategyUIAndContainer( this, aStrategy ); setCurrentlyDisplayedStrategyUI( tempStrategyUI ); logger.debug("Invoking relayoutCollapsibleStrategyPanels() for: " + aStrategy.getName() ); tempStrategyUI.relayoutCollapsibleStrategyPanels(); setWidgetListeners(getCurrentlyDisplayedStrategyUI()); return tempStrategyUI; } } private void setWidgetListeners(StrategyUI strategyUI) { for (SwingWidgetListener l : swingWidgetListeners.values()) { l.dispose(); } swingWidgetListeners.clear(); for (Atdl4jWidget< ? > widget : strategyUI.getAtdl4jWidgetMap().values()) { // some widgets don't have a parameter reference, they are for control only (eg. radio buttons) if (widget.getParameter() != null) { if (logger.isDebugEnabled()) { logger.debug("Adding listener on " + strategyUI.getStrategy().getName() + " " + widget.getParameter().getName() + " widget " + widget); } swingWidgetListeners.put(widget.getParameter().getName(), new SwingWidgetListener((SwingWidget) widget)); } } } /** * @return the strategiesPanel */ protected JPanel getStrategiesPanel() { return this.strategiesPanel; } /** * @param aStrategiesPanel the strategiesPanel to set */ protected void setStrategiesPanel(JPanel aStrategiesPanel) { this.strategiesPanel = aStrategiesPanel; } private boolean isWidgetNotificationsAllowed() { return pendingNotifications == 0; } public class SwingWidgetListener implements SwingListener { private String paramName; private final SwingWidget swingWidget; public SwingWidgetListener(SwingWidget swingWidget) { super(); this.swingWidget = swingWidget; paramName = swingWidget.getParameter().getName(); swingWidget.addListener(this); } public void dispose() { swingWidget.removeListener(this); } @Override public void actionPerformed(ActionEvent e) { fireWidgetChangedEvent(paramName); } @Override public void stateChanged(ChangeEvent e) { fireWidgetChangedEvent(paramName); } private void fireWidgetChangedEvent(String aParamName) { if (logger.isDebugEnabled()) { logger.debug("Widget changed :" + aParamName); } if (isWidgetNotificationsAllowed()) { fireWidgetChanged(swingWidget); } } @Override public void valueChanged(ListSelectionEvent e) { fireWidgetChangedEvent(paramName); } @Override public void handleEvent() { fireWidgetChangedEvent(paramName); } @Override public SwingWidget< ? > getAffectedWidget() { return swingWidget; } @Override public ValidationRule getRule() { return null; } @Override public void setCxlReplaceMode(boolean flag) { // } @Override public void handleLoadFixMessageEvent() { fireWidgetChangedEvent(paramName); } @Override public void insertUpdate(DocumentEvent e) { fireWidgetChangedEvent(paramName); } @Override public void removeUpdate(DocumentEvent e) { fireWidgetChangedEvent(paramName); } @Override public void changedUpdate(DocumentEvent e) { fireWidgetChangedEvent(paramName); } } }