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.SelectionAdapter;
00008 import org.eclipse.swt.events.SelectionEvent;
00009 import org.eclipse.swt.graphics.Color;
00010 import org.eclipse.swt.graphics.Font;
00011 import org.eclipse.swt.graphics.FontData;
00012 import org.eclipse.swt.graphics.RGB;
00013 import org.eclipse.swt.layout.GridData;
00014 import org.eclipse.swt.layout.GridLayout;
00015 import org.eclipse.swt.widgets.Button;
00016 import org.eclipse.swt.widgets.Composite;
00017 import org.eclipse.swt.widgets.Display;
00018 import org.eclipse.swt.widgets.Event;
00019 import org.eclipse.swt.widgets.Label;
00020 import org.eclipse.swt.widgets.Spinner;
00021 import org.swtchart.Constants;
00022 import org.swtchart.IAxis;
00023 import org.swtchart.IDisposeListener;
00024 import org.swtchart.IAxis.Direction;
00025 import org.swtchart.ext.InteractiveChart;
00026
00030 public class AxisTickPage extends AbstractSelectorPage {
00031
00033 private static final String AXIS_TICK_FONT = "org.swtchart.axistick.font";
00034
00036 private static final String AXIS_TICK_FOREGROUND = "org.swtchart.axistick.foreground";
00037
00039 private IAxis[] axes;
00040
00042 protected Button showTickButton;
00043
00045 private Label fontSizeLabel;
00046
00048 protected Spinner fontSizeSpinner;
00049
00051 private Label foregroundLabel;
00052
00054 protected ColorSelector foregroundButton;
00055
00057 protected boolean[] visibilityStates;
00058
00060 protected int[] fontSizes;
00061
00063 protected RGB[] foregroundColors;
00064
00077 public AxisTickPage(InteractiveChart chart, PropertiesResources resources,
00078 Direction direction, String title) {
00079 super(chart, resources, title, "Axes:");
00080 if (direction == Direction.X) {
00081 this.axes = chart.getAxisSet().getXAxes();
00082 } else if (direction == Direction.Y) {
00083 this.axes = chart.getAxisSet().getYAxes();
00084 }
00085
00086 visibilityStates = new boolean[axes.length];
00087 fontSizes = new int[axes.length];
00088 foregroundColors = new RGB[axes.length];
00089 }
00090
00091
00092
00093
00094 @Override
00095 protected String[] getListItems() {
00096 String[] items = new String[axes.length];
00097 for (int i = 0; i < items.length; i++) {
00098 items[i] = String.valueOf(axes[i].getId());
00099 }
00100 return items;
00101 }
00102
00103
00104
00105
00106 @Override
00107 protected void selectInitialValues() {
00108 for (int i = 0; i < axes.length; i++) {
00109 visibilityStates[i] = axes[i].getTick().isVisible();
00110 fontSizes[i] = axes[i].getTick().getFont().getFontData()[0]
00111 .getHeight();
00112 foregroundColors[i] = axes[i].getTick().getForeground().getRGB();
00113 }
00114 }
00115
00116
00117
00118
00119 @Override
00120 protected void updateControlSelections() {
00121 showTickButton.setSelection(visibilityStates[selectedIndex]);
00122 setControlsEnable(visibilityStates[selectedIndex]);
00123 fontSizeSpinner.setSelection(fontSizes[selectedIndex]);
00124 foregroundButton.setColorValue(foregroundColors[selectedIndex]);
00125 }
00126
00127
00128
00129
00130 @Override
00131 protected void addRightPanelContents(Composite parent) {
00132 addTickPanel(parent);
00133 }
00134
00141 private void addTickPanel(Composite parent) {
00142 Composite group = new Composite(parent, SWT.NONE);
00143 GridData gridData = new GridData();
00144 gridData.horizontalSpan = 2;
00145 group.setLayoutData(gridData);
00146 group.setLayout(new GridLayout(2, false));
00147
00148 showTickButton = createCheckBoxControl(group, "Show tick");
00149 showTickButton.addSelectionListener(new SelectionAdapter() {
00150 @Override
00151 public void widgetSelected(SelectionEvent e) {
00152 boolean visible = showTickButton.getSelection();
00153 visibilityStates[selectedIndex] = visible;
00154 setControlsEnable(visible);
00155 }
00156 });
00157
00158 fontSizeLabel = createLabelControl(group, "Font size:");
00159 fontSizeSpinner = createSpinnerControl(group, 8, 30);
00160 fontSizeSpinner.addSelectionListener(new SelectionAdapter() {
00161 @Override
00162 public void widgetSelected(SelectionEvent e) {
00163 fontSizes[selectedIndex] = fontSizeSpinner.getSelection();
00164 }
00165 });
00166
00167 foregroundLabel = createLabelControl(group, "Color:");
00168 foregroundButton = createColorButtonControl(group);
00169 foregroundButton.addListener(new IPropertyChangeListener() {
00170 public void propertyChange(PropertyChangeEvent event) {
00171 foregroundColors[selectedIndex] = foregroundButton
00172 .getColorValue();
00173 }
00174 });
00175 }
00176
00183 protected void setControlsEnable(boolean enabled) {
00184 fontSizeLabel.setEnabled(enabled);
00185 fontSizeSpinner.setEnabled(enabled);
00186 foregroundLabel.setEnabled(enabled);
00187 foregroundButton.setEnabled(enabled);
00188 }
00189
00190
00191
00192
00193 @Override
00194 public void apply() {
00195 for (int i = 0; i < axes.length; i++) {
00196 axes[i].getTick().setVisible(visibilityStates[i]);
00197
00198 FontData fontData = axes[i].getTick().getFont().getFontData()[0];
00199 fontData.setHeight(fontSizes[i]);
00200 Font font = new Font(Display.getDefault(), fontData);
00201 axes[i].getTick().setFont(font);
00202 final String fontKey = AXIS_TICK_FONT + axes[i].getDirection()
00203 + axes[i].getId();
00204 if (resources.getFont(fontKey) == null) {
00205 axes[i].addDisposeListener(new IDisposeListener() {
00206 public void disposed(Event e) {
00207 resources.removeFont(fontKey);
00208 }
00209 });
00210 }
00211 resources.put(fontKey, font);
00212
00213 Color color = new Color(Display.getDefault(), foregroundColors[i]);
00214 axes[i].getTick().setForeground(color);
00215 final String colorKey = AXIS_TICK_FOREGROUND
00216 + axes[i].getDirection() + axes[i].getId();
00217 if (resources.getColor(colorKey) == null) {
00218 axes[i].addDisposeListener(new IDisposeListener() {
00219 public void disposed(Event e) {
00220 resources.removeColor(colorKey);
00221 }
00222 });
00223 }
00224 resources.put(colorKey, color);
00225 }
00226 }
00227
00228
00229
00230
00231 @Override
00232 protected void performDefaults() {
00233 visibilityStates[selectedIndex] = true;
00234 fontSizes[selectedIndex] = Constants.SMALL_FONT_SIZE;
00235 foregroundColors[selectedIndex] = Display.getDefault().getSystemColor(
00236 SWT.COLOR_BLUE).getRGB();
00237
00238 updateControlSelections();
00239
00240 super.performDefaults();
00241 }
00242 }