package org.swtchart.ext.internal.properties; import org.eclipse.jface.preference.ColorSelector; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Text; import org.swtchart.IBarSeries; import org.swtchart.IDisposeListener; import org.swtchart.ILineSeries; import org.swtchart.ISeries; import org.swtchart.LineStyle; import org.swtchart.ILineSeries.PlotSymbolType; import org.swtchart.ext.InteractiveChart; /** * The series page on properties dialog. */ public class SeriesPage extends AbstractSelectorPage { /** the key for series line color */ private static final String SERIES_LINE_COLOR = "org.swtchart.series.line.color"; /** the key for series symbol color */ private static final String SERIES_SYMBOL_COLOR = "org.swtchart.series.symbol.color"; /** the key for series bar color */ private static final String SERIES_BAR_COLOR = "org.swtchart.series.bar.color"; /** the button for visibility */ protected Button visibleButton; /** the button for stack state */ protected Button stackedButton; /** the x axis id combo */ protected Combo xAxisIdCombo; /** the y axis id combo */ protected Combo yAxisIdCombo; /** the line color button */ protected ColorSelector lineColorButton; /** the line style combo */ protected Combo lineStyleCombo; /** the color selector for symbol */ protected ColorSelector symbolColorButton; /** the symbol type combo */ protected Combo symbolTypeCombo; /** the symbol size spinner */ protected Spinner symbolSizeSpinner; /** the bar color button */ protected ColorSelector barColorButton; /** the padding size spinner */ protected Spinner paddingSizeSpinner; /** the series array */ private ISeries[] series; /** the items for x axis id combo */ private int[] xAxisIdItems; /** the items for y axis id combo */ private int[] yAxisIdItems; /** the states indicating the visibility of series */ protected boolean[] visibleStates; /** the states indicating the series is stacked */ protected boolean[] stackedStates; /** the x axis ids */ protected int[] xAxisIds; /** the y axis ids */ protected int[] yAxisIds; /** the line colors */ protected RGB[] lineColors; /** the line styles */ protected LineStyle[] lineStyles; /** the symbol colors */ protected RGB[] symbolColors; /** the symbol types */ protected PlotSymbolType[] symbolTypes; /** the symbol sizes */ protected int[] symbolSizes; /** the bar colors */ protected RGB[] barColors; /** the paddings */ protected int[] paddings; /** the stack panel */ private Composite stackPanel; /** the stack layout */ private StackLayout stackLayout; /** the line series group */ private Composite lineSeriesGroup; /** the bar series group */ private Composite barSeriesGroup; /** * Constructor. * * @param chart * the chart * @param resources * the properties resources * @param title * the title */ public SeriesPage(InteractiveChart chart, PropertiesResources resources, String title) { super(chart, resources, title, "Series:"); series = chart.getSeriesSet().getSeries(); xAxisIdItems = chart.getAxisSet().getXAxisIds(); yAxisIdItems = chart.getAxisSet().getYAxisIds(); visibleStates = new boolean[series.length]; stackedStates = new boolean[series.length]; xAxisIds = new int[series.length]; yAxisIds = new int[series.length]; lineColors = new RGB[series.length]; lineStyles = new LineStyle[series.length]; symbolColors = new RGB[series.length]; symbolTypes = new PlotSymbolType[series.length]; symbolSizes = new int[series.length]; barColors = new RGB[series.length]; paddings = new int[series.length]; } /* * (non-Javadoc) * * @see * org.swtchart.ext.internal.properties.AbstractSelectorPage#getListItems() */ @Override protected String[] getListItems() { String[] items = new String[series.length]; for (int i = 0; i < items.length; i++) { items[i] = String.valueOf(series[i].getId()); } return items; } /* * @see AbstractSelectorPage#selectInitialValuess() */ @Override protected void selectInitialValues() { for (int i = 0; i < series.length; i++) { visibleStates[i] = series[i].isVisible(); stackedStates[i] = series[i].isStackEnabled(); if (series[i] instanceof ILineSeries) { lineColors[i] = ((ILineSeries) series[i]).getLineColor() .getRGB(); lineStyles[i] = ((ILineSeries) series[i]).getLineStyle(); symbolColors[i] = ((ILineSeries) series[i]).getSymbolColor() .getRGB(); symbolTypes[i] = ((ILineSeries) series[i]).getSymbolType(); symbolSizes[i] = ((ILineSeries) series[i]).getSymbolSize(); } else if (series[i] instanceof IBarSeries) { barColors[i] = ((IBarSeries) series[i]).getBarColor().getRGB(); paddings[i] = ((IBarSeries) series[i]).getBarPadding(); } xAxisIds[i] = series[i].getXAxisId(); yAxisIds[i] = series[i].getYAxisId(); } updateStackPanel(); } /* * @see AbstractSelectorPage#updateControlSelections() */ @Override protected void updateControlSelections() { visibleButton.setSelection(visibleStates[selectedIndex]); stackedButton.setSelection(stackedStates[selectedIndex]); if (xAxisIdCombo != null) { xAxisIdCombo.setText("" + xAxisIds[selectedIndex]); } if (yAxisIdCombo != null) { yAxisIdCombo.setText("" + yAxisIds[selectedIndex]); } if (series[selectedIndex] instanceof ILineSeries) { lineStyleCombo.setText(lineStyles[selectedIndex].label); lineStyleCombo.setEnabled(true); lineColorButton.setColorValue(lineColors[selectedIndex]); symbolColorButton.setColorValue(symbolColors[selectedIndex]); symbolTypeCombo.setText(symbolTypes[selectedIndex].label); symbolSizeSpinner.setSelection(symbolSizes[selectedIndex]); } else if (series[selectedIndex] instanceof IBarSeries) { barColorButton.setColorValue(barColors[selectedIndex]); paddingSizeSpinner.setSelection(paddings[selectedIndex]); } setControlsEnable(series[selectedIndex].isVisible()); updateStackPanel(); } /** * Updates the stack panel. */ private void updateStackPanel() { if (series[selectedIndex] instanceof ILineSeries) { stackLayout.topControl = lineSeriesGroup; } else if (series[selectedIndex] instanceof IBarSeries) { stackLayout.topControl = barSeriesGroup; } stackPanel.layout(); } /* * @see AbstractSelectorPage#addRightPanelContents(Composite) */ @Override protected void addRightPanelContents(Composite parent) { addSeriesGroup(parent); stackPanel = new Composite(parent, SWT.NONE); stackLayout = new StackLayout(); stackPanel.setLayout(stackLayout); GridData gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 1; stackPanel.setLayoutData(gridData); addLineSeriesGroup(stackPanel); addBarSeriesGroup(stackPanel); } /** * Adds the series panel. * * @param parent * the parent to add the series panel */ private void addSeriesGroup(Composite parent) { Composite group = new Composite(parent, SWT.NONE); group.setLayout(new GridLayout(2, true)); visibleButton = createCheckBoxControl(group, "Show plot"); visibleButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean visible = visibleButton.getSelection(); visibleStates[selectedIndex] = visible; setControlsEnable(visible); } }); stackedButton = createCheckBoxControl(group, "Stacked series"); stackedButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { stackedStates[selectedIndex] = stackedButton.getSelection(); } }); if (xAxisIdItems.length > 1) { createLabelControl(group, "X Axis:"); String[] items = new String[xAxisIdItems.length]; for (int i = 0; i < items.length; i++) { items[i] = "" + xAxisIdItems[i]; } xAxisIdCombo = createComboControl(group, items); xAxisIdCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { xAxisIds[selectedIndex] = Integer.parseInt(xAxisIdCombo .getText()); } }); } if (yAxisIdItems.length > 1) { createLabelControl(group, "Y Axis:"); String[] items = new String[yAxisIdItems.length]; for (int i = 0; i < items.length; i++) { items[i] = "" + yAxisIdItems[i]; } yAxisIdCombo = createComboControl(group, items); yAxisIdCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { yAxisIds[selectedIndex] = Integer.parseInt(yAxisIdCombo .getText()); } }); } } /** * Adds the line series group. * * @param parent * the parent to add the line series group */ private void addLineSeriesGroup(Composite parent) { lineSeriesGroup = createGroupControl(parent, "Line series:", true); stackLayout.topControl = lineSeriesGroup; createLabelControl(lineSeriesGroup, "Line color:"); lineColorButton = createColorButtonControl(lineSeriesGroup); lineColorButton.addListener(new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { lineColors[selectedIndex] = lineColorButton.getColorValue(); } }); createLabelControl(lineSeriesGroup, "Line style:"); LineStyle[] styles = LineStyle.values(); String[] labels = new String[styles.length]; for (int i = 0; i < styles.length; i++) { labels[i] = styles[i].label; } lineStyleCombo = createComboControl(lineSeriesGroup, labels); lineStyleCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String value = lineStyleCombo.getText(); LineStyle selectedStyle = LineStyle.NONE; for (LineStyle style : LineStyle.values()) { if (style.label.equals(value)) { selectedStyle = style; } } lineStyles[selectedIndex] = selectedStyle; } }); createLabelControl(lineSeriesGroup, "Symbol color:"); symbolColorButton = createColorButtonControl(lineSeriesGroup); symbolColorButton.addListener(new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { symbolColors[selectedIndex] = symbolColorButton.getColorValue(); } }); createLabelControl(lineSeriesGroup, "Symbol type:"); PlotSymbolType[] types = PlotSymbolType.values(); labels = new String[types.length]; for (int i = 0; i < types.length; i++) { labels[i] = types[i].label; } symbolTypeCombo = createComboControl(lineSeriesGroup, labels); symbolTypeCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String value = symbolTypeCombo.getText(); PlotSymbolType selectedType = PlotSymbolType.CIRCLE; for (PlotSymbolType type : PlotSymbolType.values()) { if (type.label.equals(value)) { selectedType = type; } } symbolTypes[selectedIndex] = selectedType; } }); createLabelControl(lineSeriesGroup, "Symbol size:"); symbolSizeSpinner = createSpinnerControl(lineSeriesGroup, 1, 10); symbolSizeSpinner.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { symbolSizes[selectedIndex] = symbolSizeSpinner.getSelection(); } }); } /** * Adds the bar series group. * * @param parent * the parent to add the bar series group */ private void addBarSeriesGroup(Composite parent) { barSeriesGroup = new Composite(parent, SWT.NONE); new Text(parent, SWT.NONE); barSeriesGroup.setLayout(new GridLayout(1, true)); barSeriesGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Group group = createGroupControl(barSeriesGroup, "Bar series:", true); createLabelControl(group, "Color:"); barColorButton = createColorButtonControl(group); barColorButton.addListener(new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { barColors[selectedIndex] = barColorButton.getColorValue(); } }); createLabelControl(group, "Padding size:"); paddingSizeSpinner = createSpinnerControl(group, 0, 100); paddingSizeSpinner.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { paddings[selectedIndex] = paddingSizeSpinner.getSelection(); } }); } /** * Sets the enable state of controls. * * @param enabled * true if controls are enabled */ protected void setControlsEnable(boolean enabled) { lineColorButton.setEnabled(enabled); lineStyleCombo.setEnabled(enabled); stackedButton.setEnabled(enabled); if (xAxisIdCombo != null) { xAxisIdCombo.setEnabled(enabled); } if (yAxisIdCombo != null) { yAxisIdCombo.setEnabled(enabled); } barColorButton.setEnabled(enabled); paddingSizeSpinner.setEnabled(enabled); } /* * @see AbstractPreferencePage#apply() */ @Override public void apply() { for (int i = 0; i < series.length; i++) { series[i].setVisible(visibleStates[i]); if (series[i] instanceof ILineSeries) { Color lineColor = new Color(Display.getDefault(), lineColors[i]); ((ILineSeries) series[i]).setLineColor(lineColor); final String lineColorKey = SERIES_LINE_COLOR + series[i].getId(); if (resources.getColor(lineColorKey) == null) { series[i].addDisposeListener(new IDisposeListener() { public void disposed(Event e) { resources.removeColor(lineColorKey); } }); } resources.put(lineColorKey, lineColor); Color symbolColor = new Color(Display.getDefault(), symbolColors[i]); ((ILineSeries) series[i]).setSymbolColor(symbolColor); final String symbolColorKey = SERIES_SYMBOL_COLOR + series[i].getId(); if (resources.getColor(symbolColorKey) == null) { series[i].addDisposeListener(new IDisposeListener() { public void disposed(Event e) { resources.removeColor(symbolColorKey); } }); } resources.put(symbolColorKey, symbolColor); ((ILineSeries) series[i]).setLineStyle(lineStyles[i]); ((ILineSeries) series[i]).setSymbolType(symbolTypes[i]); ((ILineSeries) series[i]).setSymbolSize(symbolSizes[i]); } else if (series[i] instanceof IBarSeries) { Color barColor = new Color(Display.getDefault(), barColors[i]); ((IBarSeries) series[i]).setBarColor(barColor); final String barColorKey = SERIES_BAR_COLOR + series[i].getId(); if (resources.getColor(barColorKey) == null) { series[i].addDisposeListener(new IDisposeListener() { public void disposed(Event e) { resources.removeColor(barColorKey); } }); } resources.put(barColorKey, barColor); ((IBarSeries) series[i]).setBarPadding(paddings[i]); } try { series[i].enableStack(stackedStates[i]); } catch (IllegalArgumentException e) { stackedStates[i] = false; stackedButton.setSelection(false); } series[i].setXAxisId(xAxisIds[i]); series[i].setYAxisId(yAxisIds[i]); } } /* * @see PreferencePage#performDefaults() */ @Override protected void performDefaults() { visibleStates[selectedIndex] = true; stackedStates[selectedIndex] = false; if (xAxisIdCombo != null) { xAxisIds[selectedIndex] = 0; } if (yAxisIdCombo != null) { yAxisIds[selectedIndex] = 0; } if (series[selectedIndex] instanceof ILineSeries) { lineStyles[selectedIndex] = LineStyle.SOLID; lineColors[selectedIndex] = Display.getDefault().getSystemColor( SWT.COLOR_BLUE).getRGB(); symbolColors[selectedIndex] = Display.getDefault().getSystemColor( SWT.COLOR_DARK_GRAY).getRGB(); symbolTypes[selectedIndex] = PlotSymbolType.CIRCLE; symbolSizes[selectedIndex] = 4; } else if (series[selectedIndex] instanceof IBarSeries) { barColors[selectedIndex] = Display.getDefault().getSystemColor( SWT.COLOR_BLUE).getRGB(); paddings[selectedIndex] = 20; } updateControlSelections(); super.performDefaults(); } }