package org.atdl4j.ui.swt.impl;
import java.util.HashMap;
import java.util.List;
import org.apache.log4j.Logger;
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.StrategyUI;
import org.atdl4j.ui.app.Atdl4jUserMessageHandler;
import org.atdl4j.ui.impl.AbstractStrategiesUI;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class SWTStrategiesUI
extends AbstractStrategiesUI
{
private final Logger logger = Logger.getLogger( SWTStrategiesUI.class );
private Composite strategiesPanel;
/*
* Call init() after invoking the no arg constructor
*/
public SWTStrategiesUI()
{
}
public SWTStrategiesUI(Atdl4jOptions aAtdl4jOptions)
{
init(aAtdl4jOptions);
}
public void init(Atdl4jOptions aAtdl4jOptions)
{
setAtdl4jOptions( aAtdl4jOptions );
}
public Object buildStrategiesPanel(Object parentOrShell, Atdl4jOptions atdl4jOptions, Atdl4jUserMessageHandler aAtdl4jUserMessageHandler)
{
return buildStrategiesPanel( (Composite) parentOrShell, atdl4jOptions, aAtdl4jUserMessageHandler );
}
public Composite buildStrategiesPanel(Composite aParentComposite, Atdl4jOptions atdl4jOptions, Atdl4jUserMessageHandler aAtdl4jUserMessageHandler)
{
setAtdl4jOptions( atdl4jOptions );
setAtdl4jUserMessageHandler( aAtdl4jUserMessageHandler );
// Main strategies panel
strategiesPanel = new Composite( aParentComposite, SWT.NONE );
FillLayout strategiesLayout = new FillLayout( SWT.VERTICAL );
strategiesPanel.setLayout( strategiesLayout );
return strategiesPanel;
}
public void removeAllStrategyPanels()
{
// remove all strategy panels
for ( Control control : strategiesPanel.getChildren() )
control.dispose();
}
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 );
for ( StrategyT strategy : aFilteredStrategyList )
{
/********************************************************************************************
* 6/23/2010 Scott Atwell
* Note that we are creating the StrategyUI for each Strategy in the file, however, we are
* disposing/discarding the previously built StrategyUI instances.
* SWTStrategiesPanel will have at most only one StrategyUI that has not been disposed.
* This is required to avoid very large FIXatdl instance files (or multiple instances of SWTAtdl4jCompositePanel with own file)
* consuming tons of Windows USER Objects and generating "org.eclipse.swt.SWTError: No more handles"
*********************************************************************************************/
removeAllStrategyPanels();
StrategyUI ui = SWTStrategyUIFactory.createStrategyUIAndContainer( this, strategy );
setCurrentlyDisplayedStrategyUI( ui );
if ( ui == null )
{
// skip to next strategy
continue;
}
}
setPreCached( true );
}
public void adjustLayoutForSelectedStrategy( StrategyT aStrategy )
{
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();
strategiesPanel.layout();
}
}
/*
* Doesn't really work for SWT.
* (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();
}
return getCurrentlyDisplayedStrategyUI();
}
else
{
logger.debug("Strategy name: " + aStrategy.getName() + " is not currently displayed. Invoking removeAllStrategyPanels() and returning createStrategyPanel()" );
removeAllStrategyPanels();
StrategyUI tempStrategyUI = SWTStrategyUIFactory.createStrategyUIAndContainer( this, aStrategy );
setCurrentlyDisplayedStrategyUI( tempStrategyUI );
logger.debug("Invoking relayoutCollapsibleStrategyPanels() for: " + aStrategy.getName() );
tempStrategyUI.relayoutCollapsibleStrategyPanels();
return tempStrategyUI;
}
}
/**
* @return the strategiesPanel
*/
protected Composite getStrategiesPanel()
{
return this.strategiesPanel;
}
/**
* @param aStrategiesPanel the strategiesPanel to set
*/
protected void setStrategiesPanel(Composite aStrategiesPanel)
{
this.strategiesPanel = aStrategiesPanel;
}
}