00001 package org.swtchart.ext.internal.properties;
00002
00003 import org.eclipse.jface.preference.ColorSelector;
00004 import org.eclipse.jface.util.IPropertyChangeListener;
00005 import org.eclipse.jface.util.PropertyChangeEvent;
00006 import org.eclipse.swt.SWT;
00007 import org.eclipse.swt.custom.StackLayout;
00008 import org.eclipse.swt.events.ModifyEvent;
00009 import org.eclipse.swt.events.ModifyListener;
00010 import org.eclipse.swt.events.SelectionAdapter;
00011 import org.eclipse.swt.events.SelectionEvent;
00012 import org.eclipse.swt.graphics.Color;
00013 import org.eclipse.swt.graphics.RGB;
00014 import org.eclipse.swt.layout.GridData;
00015 import org.eclipse.swt.layout.GridLayout;
00016 import org.eclipse.swt.widgets.Button;
00017 import org.eclipse.swt.widgets.Combo;
00018 import org.eclipse.swt.widgets.Composite;
00019 import org.eclipse.swt.widgets.Display;
00020 import org.eclipse.swt.widgets.Event;
00021 import org.eclipse.swt.widgets.Group;
00022 import org.eclipse.swt.widgets.Spinner;
00023 import org.swtchart.IBarSeries;
00024 import org.swtchart.IDisposeListener;
00025 import org.swtchart.ILineSeries;
00026 import org.swtchart.ILineSeries.PlotSymbolType;
00027 import org.swtchart.ISeries;
00028 import org.swtchart.LineStyle;
00029 import org.swtchart.ext.InteractiveChart;
00030
00034 public class SeriesPage extends AbstractSelectorPage {
00035
00037 private static final String SERIES_LINE_COLOR = "org.swtchart.series.line.color";
00038
00040 private static final String SERIES_SYMBOL_COLOR = "org.swtchart.series.symbol.color";
00041
00043 private static final String SERIES_BAR_COLOR = "org.swtchart.series.bar.color";
00044
00046 protected Button visibleButton;
00047
00049 protected Button stackedButton;
00050
00052 protected Combo xAxisIdCombo;
00053
00055 protected Combo yAxisIdCombo;
00056
00058 protected ColorSelector lineColorButton;
00059
00061 protected Combo lineStyleCombo;
00062
00064 protected ColorSelector symbolColorButton;
00065
00067 protected Combo symbolTypeCombo;
00068
00070 protected Spinner symbolSizeSpinner;
00071
00073 protected ColorSelector barColorButton;
00074
00076 protected Spinner paddingSizeSpinner;
00077
00079 private ISeries[] series;
00080
00082 private int[] xAxisIdItems;
00083
00085 private int[] yAxisIdItems;
00086
00088 protected boolean[] visibleStates;
00089
00091 protected boolean[] stackedStates;
00092
00094 protected int[] xAxisIds;
00095
00097 protected int[] yAxisIds;
00098
00100 protected RGB[] lineColors;
00101
00103 protected LineStyle[] lineStyles;
00104
00106 protected RGB[] symbolColors;
00107
00109 protected PlotSymbolType[] symbolTypes;
00110
00112 protected int[] symbolSizes;
00113
00115 protected RGB[] barColors;
00116
00118 protected int[] paddings;
00119
00121 private Composite stackPanel;
00122
00124 private StackLayout stackLayout;
00125
00127 private Composite lineSeriesGroup;
00128
00130 private Composite barSeriesGroup;
00131
00142 public SeriesPage(InteractiveChart chart, PropertiesResources resources,
00143 String title) {
00144 super(chart, resources, title, "Series:");
00145
00146 series = chart.getSeriesSet().getSeries();
00147 xAxisIdItems = chart.getAxisSet().getXAxisIds();
00148 yAxisIdItems = chart.getAxisSet().getYAxisIds();
00149
00150 visibleStates = new boolean[series.length];
00151 stackedStates = new boolean[series.length];
00152 xAxisIds = new int[series.length];
00153 yAxisIds = new int[series.length];
00154 lineColors = new RGB[series.length];
00155 lineStyles = new LineStyle[series.length];
00156 symbolColors = new RGB[series.length];
00157 symbolTypes = new PlotSymbolType[series.length];
00158 symbolSizes = new int[series.length];
00159 barColors = new RGB[series.length];
00160 paddings = new int[series.length];
00161 }
00162
00163
00164
00165
00166
00167
00168
00169 @Override
00170 protected String[] getListItems() {
00171 String[] items = new String[series.length];
00172 for (int i = 0; i < items.length; i++) {
00173 items[i] = String.valueOf(series[i].getId());
00174 }
00175 return items;
00176 }
00177
00178
00179
00180
00181 @Override
00182 protected void selectInitialValues() {
00183 for (int i = 0; i < series.length; i++) {
00184 visibleStates[i] = series[i].isVisible();
00185 stackedStates[i] = series[i].isStackEnabled();
00186 if (series[i] instanceof ILineSeries) {
00187 lineColors[i] = ((ILineSeries) series[i]).getLineColor()
00188 .getRGB();
00189 lineStyles[i] = ((ILineSeries) series[i]).getLineStyle();
00190 symbolColors[i] = ((ILineSeries) series[i]).getSymbolColor()
00191 .getRGB();
00192 symbolTypes[i] = ((ILineSeries) series[i]).getSymbolType();
00193 symbolSizes[i] = ((ILineSeries) series[i]).getSymbolSize();
00194 } else if (series[i] instanceof IBarSeries) {
00195 barColors[i] = ((IBarSeries) series[i]).getBarColor().getRGB();
00196 paddings[i] = ((IBarSeries) series[i]).getBarPadding();
00197 }
00198 xAxisIds[i] = series[i].getXAxisId();
00199 yAxisIds[i] = series[i].getYAxisId();
00200 }
00201
00202 updateStackPanel();
00203 }
00204
00205
00206
00207
00208 @Override
00209 protected void updateControlSelections() {
00210 visibleButton.setSelection(visibleStates[selectedIndex]);
00211 stackedButton.setSelection(stackedStates[selectedIndex]);
00212 if (xAxisIdCombo != null) {
00213 xAxisIdCombo.setText("" + xAxisIds[selectedIndex]);
00214 }
00215 if (yAxisIdCombo != null) {
00216 yAxisIdCombo.setText("" + yAxisIds[selectedIndex]);
00217 }
00218 if (series[selectedIndex] instanceof ILineSeries) {
00219 lineStyleCombo.setText(lineStyles[selectedIndex].label);
00220 lineStyleCombo.setEnabled(true);
00221 lineColorButton.setColorValue(lineColors[selectedIndex]);
00222 symbolColorButton.setColorValue(symbolColors[selectedIndex]);
00223 symbolTypeCombo.setText(symbolTypes[selectedIndex].label);
00224 symbolSizeSpinner.setSelection(symbolSizes[selectedIndex]);
00225 } else if (series[selectedIndex] instanceof IBarSeries) {
00226 barColorButton.setColorValue(barColors[selectedIndex]);
00227 paddingSizeSpinner.setSelection(paddings[selectedIndex]);
00228 }
00229
00230 setControlsEnable(series[selectedIndex].isVisible());
00231 updateStackPanel();
00232 }
00233
00237 private void updateStackPanel() {
00238 if (series[selectedIndex] instanceof ILineSeries) {
00239 stackLayout.topControl = lineSeriesGroup;
00240 } else if (series[selectedIndex] instanceof IBarSeries) {
00241 stackLayout.topControl = barSeriesGroup;
00242 }
00243 stackPanel.layout();
00244 }
00245
00246
00247
00248
00249 @Override
00250 protected void addRightPanelContents(Composite parent) {
00251 addSeriesGroup(parent);
00252
00253 stackPanel = new Composite(parent, SWT.NONE);
00254 stackLayout = new StackLayout();
00255 stackPanel.setLayout(stackLayout);
00256 GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
00257 gridData.horizontalSpan = 1;
00258 stackPanel.setLayoutData(gridData);
00259
00260 addLineSeriesGroup(stackPanel);
00261 addBarSeriesGroup(stackPanel);
00262 }
00263
00270 private void addSeriesGroup(Composite parent) {
00271 Composite group = new Composite(parent, SWT.NONE);
00272 group.setLayout(new GridLayout(2, true));
00273
00274 visibleButton = createCheckBoxControl(group, "Show plot");
00275 visibleButton.addSelectionListener(new SelectionAdapter() {
00276 @Override
00277 public void widgetSelected(SelectionEvent e) {
00278 boolean visible = visibleButton.getSelection();
00279 visibleStates[selectedIndex] = visible;
00280 setControlsEnable(visible);
00281 }
00282 });
00283
00284 stackedButton = createCheckBoxControl(group, "Stacked series");
00285 stackedButton.addSelectionListener(new SelectionAdapter() {
00286 @Override
00287 public void widgetSelected(SelectionEvent e) {
00288 stackedStates[selectedIndex] = stackedButton.getSelection();
00289 }
00290 });
00291
00292 if (xAxisIdItems.length > 1) {
00293 createLabelControl(group, "X Axis:");
00294 String[] items = new String[xAxisIdItems.length];
00295 for (int i = 0; i < items.length; i++) {
00296 items[i] = "" + xAxisIdItems[i];
00297 }
00298 xAxisIdCombo = createComboControl(group, items);
00299 xAxisIdCombo.addSelectionListener(new SelectionAdapter() {
00300 @Override
00301 public void widgetSelected(SelectionEvent e) {
00302 xAxisIds[selectedIndex] = Integer.parseInt(xAxisIdCombo
00303 .getText());
00304 }
00305 });
00306 }
00307
00308 if (yAxisIdItems.length > 1) {
00309 createLabelControl(group, "Y Axis:");
00310 String[] items = new String[yAxisIdItems.length];
00311 for (int i = 0; i < items.length; i++) {
00312 items[i] = "" + yAxisIdItems[i];
00313 }
00314 yAxisIdCombo = createComboControl(group, items);
00315 yAxisIdCombo.addSelectionListener(new SelectionAdapter() {
00316 @Override
00317 public void widgetSelected(SelectionEvent e) {
00318 yAxisIds[selectedIndex] = Integer.parseInt(yAxisIdCombo
00319 .getText());
00320 }
00321 });
00322 }
00323 }
00324
00331 private void addLineSeriesGroup(Composite parent) {
00332 lineSeriesGroup = createGroupControl(parent, "Line series:", true);
00333 stackLayout.topControl = lineSeriesGroup;
00334
00335 createLabelControl(lineSeriesGroup, "Line color:");
00336 lineColorButton = createColorButtonControl(lineSeriesGroup);
00337 lineColorButton.addListener(new IPropertyChangeListener() {
00338 public void propertyChange(PropertyChangeEvent event) {
00339 lineColors[selectedIndex] = lineColorButton.getColorValue();
00340 }
00341 });
00342
00343 createLabelControl(lineSeriesGroup, "Line style:");
00344 LineStyle[] styles = LineStyle.values();
00345 String[] labels = new String[styles.length];
00346 for (int i = 0; i < styles.length; i++) {
00347 labels[i] = styles[i].label;
00348 }
00349 lineStyleCombo = createComboControl(lineSeriesGroup, labels);
00350 lineStyleCombo.addSelectionListener(new SelectionAdapter() {
00351 @Override
00352 public void widgetSelected(SelectionEvent e) {
00353 String value = lineStyleCombo.getText();
00354 LineStyle selectedStyle = LineStyle.NONE;
00355 for (LineStyle style : LineStyle.values()) {
00356 if (style.label.equals(value)) {
00357 selectedStyle = style;
00358 }
00359 }
00360 lineStyles[selectedIndex] = selectedStyle;
00361 }
00362 });
00363
00364 createLabelControl(lineSeriesGroup, "Symbol color:");
00365 symbolColorButton = createColorButtonControl(lineSeriesGroup);
00366 symbolColorButton.addListener(new IPropertyChangeListener() {
00367 public void propertyChange(PropertyChangeEvent event) {
00368 symbolColors[selectedIndex] = symbolColorButton.getColorValue();
00369 }
00370 });
00371
00372 createLabelControl(lineSeriesGroup, "Symbol type:");
00373 PlotSymbolType[] types = PlotSymbolType.values();
00374 labels = new String[types.length];
00375 for (int i = 0; i < types.length; i++) {
00376 labels[i] = types[i].label;
00377 }
00378 symbolTypeCombo = createComboControl(lineSeriesGroup, labels);
00379 symbolTypeCombo.addSelectionListener(new SelectionAdapter() {
00380 @Override
00381 public void widgetSelected(SelectionEvent e) {
00382 String value = symbolTypeCombo.getText();
00383 PlotSymbolType selectedType = PlotSymbolType.CIRCLE;
00384 for (PlotSymbolType type : PlotSymbolType.values()) {
00385 if (type.label.equals(value)) {
00386 selectedType = type;
00387 }
00388 }
00389 symbolTypes[selectedIndex] = selectedType;
00390 }
00391 });
00392
00393 createLabelControl(lineSeriesGroup, "Symbol size:");
00394 symbolSizeSpinner = createSpinnerControl(lineSeriesGroup, 1, 10);
00395 symbolSizeSpinner.addModifyListener(new ModifyListener() {
00396 public void modifyText(ModifyEvent e) {
00397 symbolSizes[selectedIndex] = symbolSizeSpinner.getSelection();
00398 }
00399 });
00400 }
00401
00408 private void addBarSeriesGroup(Composite parent) {
00409 barSeriesGroup = new Composite(parent, SWT.NONE);
00410 barSeriesGroup.setLayout(new GridLayout(1, true));
00411 barSeriesGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
00412
00413 Group group = createGroupControl(barSeriesGroup, "Bar series:", true);
00414
00415 createLabelControl(group, "Color:");
00416 barColorButton = createColorButtonControl(group);
00417 barColorButton.addListener(new IPropertyChangeListener() {
00418 public void propertyChange(PropertyChangeEvent event) {
00419 barColors[selectedIndex] = barColorButton.getColorValue();
00420 }
00421 });
00422
00423 createLabelControl(group, "Padding size:");
00424 paddingSizeSpinner = createSpinnerControl(group, 0, 100);
00425 paddingSizeSpinner.addModifyListener(new ModifyListener() {
00426 public void modifyText(ModifyEvent e) {
00427 paddings[selectedIndex] = paddingSizeSpinner.getSelection();
00428 }
00429 });
00430 }
00431
00438 protected void setControlsEnable(boolean enabled) {
00439 lineColorButton.setEnabled(enabled);
00440 lineStyleCombo.setEnabled(enabled);
00441 stackedButton.setEnabled(enabled);
00442 if (xAxisIdCombo != null) {
00443 xAxisIdCombo.setEnabled(enabled);
00444 }
00445 if (yAxisIdCombo != null) {
00446 yAxisIdCombo.setEnabled(enabled);
00447 }
00448 barColorButton.setEnabled(enabled);
00449 paddingSizeSpinner.setEnabled(enabled);
00450 }
00451
00452
00453
00454
00455 @Override
00456 public void apply() {
00457 for (int i = 0; i < series.length; i++) {
00458 series[i].setVisible(visibleStates[i]);
00459 if (series[i] instanceof ILineSeries) {
00460 Color lineColor = new Color(Display.getDefault(), lineColors[i]);
00461 ((ILineSeries) series[i]).setLineColor(lineColor);
00462 final String lineColorKey = SERIES_LINE_COLOR
00463 + series[i].getId();
00464 if (resources.getColor(lineColorKey) == null) {
00465 series[i].addDisposeListener(new IDisposeListener() {
00466 public void disposed(Event e) {
00467 resources.removeColor(lineColorKey);
00468 }
00469 });
00470 }
00471 resources.put(lineColorKey, lineColor);
00472
00473 Color symbolColor = new Color(Display.getDefault(),
00474 symbolColors[i]);
00475 ((ILineSeries) series[i]).setSymbolColor(symbolColor);
00476 final String symbolColorKey = SERIES_SYMBOL_COLOR
00477 + series[i].getId();
00478 if (resources.getColor(symbolColorKey) == null) {
00479 series[i].addDisposeListener(new IDisposeListener() {
00480 public void disposed(Event e) {
00481 resources.removeColor(symbolColorKey);
00482 }
00483 });
00484 }
00485 resources.put(symbolColorKey, symbolColor);
00486
00487 ((ILineSeries) series[i]).setLineStyle(lineStyles[i]);
00488 ((ILineSeries) series[i]).setSymbolType(symbolTypes[i]);
00489 ((ILineSeries) series[i]).setSymbolSize(symbolSizes[i]);
00490 } else if (series[i] instanceof IBarSeries) {
00491 Color barColor = new Color(Display.getDefault(), barColors[i]);
00492 ((IBarSeries) series[i]).setBarColor(barColor);
00493 final String barColorKey = SERIES_BAR_COLOR + series[i].getId();
00494 if (resources.getColor(barColorKey) == null) {
00495 series[i].addDisposeListener(new IDisposeListener() {
00496 public void disposed(Event e) {
00497 resources.removeColor(barColorKey);
00498 }
00499 });
00500 }
00501 resources.put(barColorKey, barColor);
00502
00503 ((IBarSeries) series[i]).setBarPadding(paddings[i]);
00504 }
00505 try {
00506 series[i].enableStack(stackedStates[i]);
00507 } catch (IllegalArgumentException e) {
00508 stackedStates[i] = false;
00509 stackedButton.setSelection(false);
00510 }
00511 series[i].setXAxisId(xAxisIds[i]);
00512 series[i].setYAxisId(yAxisIds[i]);
00513 }
00514 }
00515
00516
00517
00518
00519 @Override
00520 protected void performDefaults() {
00521 visibleStates[selectedIndex] = true;
00522 stackedStates[selectedIndex] = false;
00523 if (xAxisIdCombo != null) {
00524 xAxisIds[selectedIndex] = 0;
00525 }
00526 if (yAxisIdCombo != null) {
00527 yAxisIds[selectedIndex] = 0;
00528 }
00529 if (series[selectedIndex] instanceof ILineSeries) {
00530 lineStyles[selectedIndex] = LineStyle.SOLID;
00531 lineColors[selectedIndex] = Display.getDefault().getSystemColor(
00532 SWT.COLOR_BLUE).getRGB();
00533 symbolColors[selectedIndex] = Display.getDefault().getSystemColor(
00534 SWT.COLOR_DARK_GRAY).getRGB();
00535 symbolTypes[selectedIndex] = PlotSymbolType.CIRCLE;
00536 symbolSizes[selectedIndex] = 4;
00537 } else if (series[selectedIndex] instanceof IBarSeries) {
00538 barColors[selectedIndex] = Display.getDefault().getSystemColor(
00539 SWT.COLOR_BLUE).getRGB();
00540 paddings[selectedIndex] = 20;
00541 }
00542
00543 updateControlSelections();
00544
00545 super.performDefaults();
00546 }
00547 }