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.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; 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.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.RGB; 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.Label; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Text; import org.swtchart.Constants; import org.swtchart.IAxis; import org.swtchart.IDisposeListener; import org.swtchart.Range; import org.swtchart.IAxis.Direction; import org.swtchart.IAxis.Position; import org.swtchart.ext.InteractiveChart; /** * The axis page on properties dialog. */ public class AxisPage extends AbstractSelectorPage { /** the key for axis title font */ private static final String AXIS_TITLE_FONT = "org.swtchart.axis.title.font"; /** the key for axis title foreground */ private static final String AXIS_TITLE_FOREGROUND = "org.swtchart.axis.title.foreground"; /** the axes */ private IAxis[] axes; /** the axis direction */ private Direction direction; /** the show title button */ protected Button showTitleButton; /** the label for title */ private Label titleLabel; /** the title text */ protected Text titleText; /** the label for font size */ private Label fontSizeLabel; /** the spinner for font size */ protected Spinner fontSizeSpinner; /** the label for title color */ private Label titleColorLabel; /** the color selector button */ protected ColorSelector titleColorButton; /** the minimum range text */ protected Text minRangeText; /** the maximum range text */ protected Text maxRangeText; /** the position combo box */ protected Combo positionCombo; /** the category button */ protected Button categoryButton; /** the log scale button */ protected Button logScaleButton; /** the states indicating id title is visible */ protected boolean[] titleVisibleStates; /** the title texts */ protected String[] titleTexts; /** the title font sizes */ protected int[] titleFontSizes; /** the title colors */ protected RGB[] titleColors; /** the minimum ranges */ protected double[] minRanges; /** the maximum ranges */ protected double[] maxRanges; /** the positions */ protected Position[] positions; /** the states indicating if category is enabled */ protected boolean[] categoryStates; /** the states indicating if log scale is enabled */ protected boolean[] logScaleStates; /** * Constructor. * * @param chart * the chart * @param resources * the properties resources * @param direction * the direction * @param title * the title */ public AxisPage(InteractiveChart chart, PropertiesResources resources, Direction direction, String title) { super(chart, resources, title, "Axes:"); this.direction = direction; if (direction == Direction.X) { this.axes = chart.getAxisSet().getXAxes(); } else if (direction == Direction.Y) { this.axes = chart.getAxisSet().getYAxes(); } titleVisibleStates = new boolean[axes.length]; titleTexts = new String[axes.length]; titleFontSizes = new int[axes.length]; titleColors = new RGB[axes.length]; minRanges = new double[axes.length]; maxRanges = new double[axes.length]; positions = new Position[axes.length]; if (direction == Direction.X) { categoryStates = new boolean[axes.length]; } logScaleStates = new boolean[axes.length]; } /* * @see AbstractSelectorPage#getListItems() */ @Override protected String[] getListItems() { String[] items = new String[axes.length]; for (int i = 0; i < items.length; i++) { items[i] = String.valueOf(axes[i].getId()); } return items; } /* * @see AbstractSelectorPage#selectInitialValues() */ @Override protected void selectInitialValues() { for (int i = 0; i < axes.length; i++) { titleVisibleStates[i] = axes[i].getTitle().isVisible(); titleTexts[i] = axes[i].getTitle().getText(); titleFontSizes[i] = axes[i].getTitle().getFont().getFontData()[0] .getHeight(); titleColors[i] = axes[i].getTitle().getForeground().getRGB(); minRanges[i] = axes[i].getRange().lower; maxRanges[i] = axes[i].getRange().upper; positions[i] = axes[i].getPosition(); if (direction == Direction.X) { categoryStates[i] = axes[i].isCategoryEnabled(); } logScaleStates[i] = axes[i].isLogScaleEnabled(); } } /* * @see AbstractSelectorPage#updateControlSelections() */ @Override protected void updateControlSelections() { showTitleButton.setSelection(titleVisibleStates[selectedIndex]); setControlsEnable(titleVisibleStates[selectedIndex]); titleText.setText(titleTexts[selectedIndex]); fontSizeSpinner.setSelection(titleFontSizes[selectedIndex]); titleColorButton.setColorValue(titleColors[selectedIndex]); minRangeText.setText(String.valueOf(minRanges[selectedIndex])); maxRangeText.setText(String.valueOf(maxRanges[selectedIndex])); positionCombo.setText(String.valueOf(positions[selectedIndex])); logScaleButton.setSelection(logScaleStates[selectedIndex]); if (direction == Direction.X) { categoryButton.setSelection(categoryStates[selectedIndex]); } } /* * @see AbstractSelectorPage#addRightPanelContents(Composite) */ @Override protected void addRightPanelContents(Composite parent) { addAxisPanel(parent); addTitleGroup(parent); } /** * Adds axis panel. * * @param parent * the parent to add the axis panel */ private void addAxisPanel(Composite parent) { Composite group = new Composite(parent, SWT.NONE); group.setLayout(new GridLayout(2, true)); createLabelControl(group, "Minimum range value:"); minRangeText = createTextControl(group); minRangeText.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { minRanges[selectedIndex] = Double.valueOf(minRangeText .getText()); } }); createLabelControl(group, "Maximum range value:"); maxRangeText = createTextControl(group); maxRangeText.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { maxRanges[selectedIndex] = Double.valueOf(maxRangeText .getText()); } }); createLabelControl(group, "Position:"); String[] items = new String[] { Position.Primary.name(), Position.Secondary.name() }; positionCombo = createComboControl(group, items); positionCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { positions[selectedIndex] = Position.valueOf(positionCombo .getText()); } }); logScaleButton = createCheckBoxControl(group, "Enable log scale"); logScaleButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { logScaleStates[selectedIndex] = logScaleButton.getSelection(); } }); if (direction == Direction.X) { categoryButton = createCheckBoxControl(group, "Enable category"); categoryButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { categoryStates[selectedIndex] = categoryButton .getSelection(); } }); } } /** * Adds title group. * * @param parent * the parent to add the title group */ private void addTitleGroup(Composite parent) { Group group = createGroupControl(parent, "Title:", false); showTitleButton = createCheckBoxControl(group, "Show title"); showTitleButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean visible = showTitleButton.getSelection(); titleVisibleStates[selectedIndex] = visible; setControlsEnable(visible); } }); titleLabel = createLabelControl(group, "Text:"); titleText = createTextControl(group); titleText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { titleTexts[selectedIndex] = titleText.getText(); } }); fontSizeLabel = createLabelControl(group, "Font size:"); fontSizeSpinner = createSpinnerControl(group, 8, 30); fontSizeSpinner.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { titleFontSizes[selectedIndex] = fontSizeSpinner.getSelection(); } }); titleColorLabel = createLabelControl(group, "Color:"); titleColorButton = createColorButtonControl(group); titleColorButton.addListener(new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { titleColors[selectedIndex] = titleColorButton.getColorValue(); } }); } /** * Sets the enable state of controls. * * @param enabled * true if controls are enabled */ protected void setControlsEnable(boolean enabled) { titleLabel.setEnabled(enabled); titleText.setEnabled(enabled); fontSizeLabel.setEnabled(enabled); fontSizeSpinner.setEnabled(enabled); titleColorLabel.setEnabled(enabled); titleColorButton.setEnabled(enabled); } /* * @see AbstractPreferencePage#apply() */ @Override public void apply() { for (int i = 0; i < axes.length; i++) { axes[i].getTitle().setVisible(titleVisibleStates[i]); axes[i].getTitle().setText(titleTexts[i]); FontData fontData = axes[i].getTitle().getFont().getFontData()[0]; fontData.setHeight(titleFontSizes[i]); Font font = new Font(Display.getDefault(), fontData); axes[i].getTitle().setFont(font); final String fontKey = AXIS_TITLE_FONT + axes[i].getDirection() + axes[i].getId(); if (resources.getFont(fontKey) == null) { axes[i].addDisposeListener(new IDisposeListener() { public void disposed(Event e) { resources.removeFont(fontKey); } }); } resources.put(fontKey, font); Color color = new Color(Display.getDefault(), titleColors[i]); axes[i].getTitle().setForeground(color); final String colorKey = AXIS_TITLE_FOREGROUND + axes[i].getDirection() + axes[i].getId(); if (resources.getColor(colorKey) == null) { axes[i].addDisposeListener(new IDisposeListener() { public void disposed(Event e) { resources.removeColor(colorKey); } }); } resources.put(colorKey, color); axes[i].setRange(new Range(minRanges[i], maxRanges[i])); axes[i].setPosition(positions[i]); try { axes[i].enableLogScale(logScaleStates[i]); } catch (IllegalStateException e) { axes[i].enableLogScale(false); logScaleButton.setSelection(false); } if (direction == Direction.X) { axes[i].enableCategory(categoryStates[i]); } } } /* * @see PreferencePage#performDefaults() */ @Override protected void performDefaults() { titleVisibleStates[selectedIndex] = true; if (direction == Direction.X) { titleTexts[selectedIndex] = "X Axis"; categoryStates[selectedIndex] = false; } else if (direction == Direction.Y) { titleTexts[selectedIndex] = "Y Axis"; } positions[selectedIndex] = Position.Primary; titleFontSizes[selectedIndex] = Constants.MEDIUM_FONT_SIZE; titleColors[selectedIndex] = Display.getDefault().getSystemColor( SWT.COLOR_BLUE).getRGB(); minRanges[selectedIndex] = 0.0; maxRanges[selectedIndex] = 1.0; logScaleStates[selectedIndex] = false; updateControlSelections(); super.performDefaults(); } }