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.events.ModifyEvent;
00008 import org.eclipse.swt.events.ModifyListener;
00009 import org.eclipse.swt.events.SelectionAdapter;
00010 import org.eclipse.swt.events.SelectionEvent;
00011 import org.eclipse.swt.graphics.Color;
00012 import org.eclipse.swt.graphics.Font;
00013 import org.eclipse.swt.graphics.FontData;
00014 import org.eclipse.swt.graphics.RGB;
00015 import org.eclipse.swt.layout.GridLayout;
00016 import org.eclipse.swt.widgets.Button;
00017 import org.eclipse.swt.widgets.Composite;
00018 import org.eclipse.swt.widgets.Display;
00019 import org.eclipse.swt.widgets.Event;
00020 import org.eclipse.swt.widgets.Label;
00021 import org.eclipse.swt.widgets.Spinner;
00022 import org.swtchart.Constants;
00023 import org.swtchart.IDisposeListener;
00024 import org.swtchart.ISeries;
00025 import org.swtchart.ext.InteractiveChart;
00026
00030 public class SeriesLabelPage extends AbstractSelectorPage {
00031
00033 private static final String SERIES_LABEL_FOREGROUND = "org.swtchart.series.foreground";
00034
00036 private static final String SERIES_LABEL_FONT = "org.swtchart.series.font";
00037
00039 private ISeries[] series;
00040
00042 protected Button showLabelButton;
00043
00045 private Label colorLabel;
00046
00048 protected ColorSelector colorButton;
00049
00051 private Label fontSizeLabel;
00052
00054 protected Spinner fontSizeSpinner;
00055
00057 protected boolean[] visibleStates;
00058
00060 protected RGB[] colors;
00061
00063 protected int[] fontSizes;
00064
00075 public SeriesLabelPage(InteractiveChart chart,
00076 PropertiesResources resources, String title) {
00077 super(chart, resources, title, "Series:");
00078
00079 series = chart.getSeriesSet().getSeries();
00080
00081 visibleStates = new boolean[series.length];
00082 colors = new RGB[series.length];
00083 fontSizes = new int[series.length];
00084 }
00085
00086
00087
00088
00089 @Override
00090 protected String[] getListItems() {
00091 String[] items = new String[series.length];
00092 for (int i = 0; i < items.length; i++) {
00093 items[i] = String.valueOf(series[i].getId());
00094 }
00095 return items;
00096 }
00097
00098
00099
00100
00101 @Override
00102 protected void selectInitialValues() {
00103 for (int i = 0; i < series.length; i++) {
00104 visibleStates[i] = series[i].getLabel().isVisible();
00105 colors[i] = series[i].getLabel().getForeground().getRGB();
00106 fontSizes[i] = series[i].getLabel().getFont().getFontData()[0]
00107 .getHeight();
00108 }
00109 }
00110
00111
00112
00113
00114 @Override
00115 protected void updateControlSelections() {
00116 showLabelButton.setSelection(visibleStates[selectedIndex]);
00117 setControlsEnable(visibleStates[selectedIndex]);
00118 colorButton.setColorValue(colors[selectedIndex]);
00119 fontSizeSpinner.setSelection(fontSizes[selectedIndex]);
00120 }
00121
00122
00123
00124
00125 @Override
00126 protected void addRightPanelContents(Composite parent) {
00127 addSeriesLabelPanel(parent);
00128 }
00129
00136 private void addSeriesLabelPanel(Composite parent) {
00137 Composite group = new Composite(parent, SWT.NONE);
00138 group.setLayout(new GridLayout(2, false));
00139
00140 showLabelButton = createCheckBoxControl(group, "Show label");
00141 showLabelButton.addSelectionListener(new SelectionAdapter() {
00142 @Override
00143 public void widgetSelected(SelectionEvent e) {
00144 boolean visible = showLabelButton.getSelection();
00145 visibleStates[selectedIndex] = visible;
00146 setControlsEnable(visible);
00147 }
00148 });
00149
00150 colorLabel = createLabelControl(group, "Color:");
00151 colorButton = createColorButtonControl(group);
00152 colorButton.addListener(new IPropertyChangeListener() {
00153 public void propertyChange(PropertyChangeEvent event) {
00154 colors[selectedIndex] = colorButton.getColorValue();
00155 }
00156 });
00157
00158 fontSizeLabel = createLabelControl(group, "Font size:");
00159 fontSizeSpinner = createSpinnerControl(group, 8, 30);
00160 fontSizeSpinner.addModifyListener(new ModifyListener() {
00161 public void modifyText(ModifyEvent e) {
00162 fontSizes[selectedIndex] = fontSizeSpinner.getSelection();
00163 }
00164 });
00165 }
00166
00173 protected void setControlsEnable(boolean enabled) {
00174 colorLabel.setEnabled(enabled);
00175 colorButton.setEnabled(enabled);
00176 fontSizeLabel.setEnabled(enabled);
00177 fontSizeSpinner.setEnabled(enabled);
00178 }
00179
00180
00181
00182
00183 @Override
00184 public void apply() {
00185 for (int i = 0; i < series.length; i++) {
00186 series[i].getLabel().setVisible(visibleStates[i]);
00187
00188 Color color = new Color(Display.getDefault(), colors[i]);
00189 series[i].getLabel().setForeground(color);
00190 final String colorKey = SERIES_LABEL_FOREGROUND + series[i].getId();
00191 if (resources.getColor(colorKey) == null) {
00192 series[i].addDisposeListener(new IDisposeListener() {
00193 public void disposed(Event e) {
00194 resources.removeColor(colorKey);
00195 }
00196 });
00197 }
00198 resources.put(colorKey, color);
00199
00200 FontData fontData = series[i].getLabel().getFont().getFontData()[0];
00201 fontData.setHeight(fontSizes[i]);
00202 Font font = new Font(Display.getDefault(), fontData);
00203 series[i].getLabel().setFont(font);
00204 final String fontKey = SERIES_LABEL_FONT + series[i].getId();
00205 if (resources.getFont(fontKey) == null) {
00206 series[i].addDisposeListener(new IDisposeListener() {
00207 public void disposed(Event e) {
00208 resources.removeFont(fontKey);
00209 }
00210 });
00211 }
00212 resources.put(fontKey, font);
00213 }
00214 }
00215
00216
00217
00218
00219 @Override
00220 protected void performDefaults() {
00221 visibleStates[selectedIndex] = false;
00222 colors[selectedIndex] = Display.getDefault().getSystemColor(
00223 SWT.COLOR_BLACK).getRGB();
00224 fontSizes[selectedIndex] = Constants.SMALL_FONT_SIZE;
00225
00226 updateControlSelections();
00227
00228 super.performDefaults();
00229 }
00230 }