blob: 0607c39165646edde67895de717bd01c99e5f77b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.sse.ui.internal.preferences.ui;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
public abstract class AbstractColorPage extends org.eclipse.jface.preference.PreferencePage implements org.eclipse.ui.IWorkbenchPreferencePage {
protected OverlayPreferenceStore fOverlayStore;
protected StyledTextColorPicker fPicker = null;
/**
* Creates the coloring group used in createContents This method can be
* overwritten to set the text of the group or provide an infopop
*/
protected Composite createColoringComposite(Composite parent) {
Composite coloringComposite = createComposite(parent, 1);
return coloringComposite;
}
/**
* Creates composite control and sets the default layout data.
*/
protected Composite createComposite(Composite parent, int numColumns) {
Composite composite = new Composite(parent, SWT.NULL);
//GridLayout
GridLayout layout = new GridLayout();
layout.numColumns = numColumns;
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
//GridData
GridData data = new GridData(GridData.FILL);
data.verticalAlignment = GridData.FILL;
data.horizontalAlignment = GridData.FILL;
composite.setLayoutData(data);
return composite;
}
protected Control createContents(Composite parent) {
// create scrollbars for this preference page when needed
final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite pageComponent = createComposite(sc1, 1);
sc1.setContent(pageComponent);
Label descLabel = createDescriptionLabel(pageComponent, SSEUIMessages.AbstractColorPageDescription); //$NON-NLS-1$
Composite coloringComposite = createColoringComposite(pageComponent);
createContentsForPicker(coloringComposite);
GridData gd = (GridData) descLabel.getLayoutData();
gd.widthHint = (coloringComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)).x;
setSize(pageComponent);
return pageComponent;
}
/**
* Creates the StyledTextColorPicker used in createContents This method
* can be overwritten to set up StyledTextColorPicker differently
*/
protected void createContentsForPicker(Composite parent) {
// create the color picker
fPicker = new StyledTextColorPicker(parent, SWT.NULL);
GridData data = new GridData(GridData.FILL_BOTH);
fPicker.setLayoutData(data);
fPicker.setPreferenceStore(fOverlayStore);
setupPicker(fPicker);
fPicker.setText(getSampleText());
}
/**
* Create description label displayed at top of preference page. This
* method/label is used instead of PreferencePage's description label
* because the ScrolledComposite contained in this page will not fully
* work (horizontal scrolling) with PreferencePage's description label.
*/
protected Label createDescriptionLabel(Composite parent, String description) {
Label label = new Label(parent, SWT.LEFT | SWT.WRAP);
label.setText(description);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.grabExcessHorizontalSpace = true;
label.setLayoutData(data);
return label;
}
/**
* Creates composite control and sets the default layout data.
*/
protected Group createGroup(Composite parent, int numColumns) {
Group group = new Group(parent, SWT.NULL);
//GridLayout
GridLayout layout = new GridLayout();
layout.numColumns = numColumns;
group.setLayout(layout);
//GridData
GridData data = new GridData(GridData.FILL);
data.verticalAlignment = GridData.FILL;
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
group.setLayoutData(data);
return group;
}
/**
* Utility method that creates a label instance and sets the default
* layout data.
*/
protected Label createLabel(Composite parent, String text) {
Label label = new Label(parent, SWT.LEFT);
label.setText(text);
GridData data = new GridData(GridData.FILL);
data.horizontalAlignment = GridData.FILL;
label.setLayoutData(data);
return label;
}
protected OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
return null;
}
protected Button createPushButton(Composite parent, String label) {
Button button = new Button(parent, SWT.PUSH);
button.setText(label);
GridData data = new GridData(GridData.FILL);
data.horizontalAlignment = GridData.FILL;
button.setLayoutData(data);
return button;
}
/**
* Utility method that creates a text instance and sets the default layout
* data.
*/
protected Text createTextField(Composite parent, String text) {
Text textfield = new Text(parent, SWT.LEFT);
textfield.setText(text);
GridData data = new GridData(GridData.FILL);
data.horizontalAlignment = GridData.FILL;
textfield.setLayoutData(data);
return textfield;
}
public void dispose() {
super.dispose();
if (fPicker != null && !fPicker.isDisposed())
fPicker.releasePickerResources();
if (fOverlayStore != null) {
fOverlayStore.stop();
}
}
public StyledTextColorPicker getPicker() {
return fPicker;
}
public abstract String getSampleText();
/**
* Initializes this preference page for the given workbench.
* <p>
* This method is called automatically as the preference page is being
* created and initialized. Clients must not call this method.
* </p>
*
* @param workbench
* the workbench
*/
public void init(IWorkbench workbench) {
fOverlayStore = new OverlayPreferenceStore(getPreferenceStore(), createOverlayStoreKeys());
fOverlayStore.load();
fOverlayStore.start();
}
/**
* Initializes states of the controls using default values in the
* preference store.
*/
protected void performDefaults() {
fOverlayStore.loadDefaults();
fPicker.refresh();
}
public boolean performOk() {
fOverlayStore.propagate();
savePreferences();
return true;
}
protected void savePreferences() {
// save plugin preferences here
}
/**
* Sets the size of composite to the default value
*/
protected void setSize(Composite composite) {
if (composite != null) {
Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
composite.setSize(minSize);
// set scrollbar composite's min size so page is expandable but
// has scrollbars when needed
if (composite.getParent() instanceof ScrolledComposite) {
ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
sc1.setMinSize(minSize);
sc1.setExpandHorizontal(true);
sc1.setExpandVertical(true);
}
}
}
protected abstract void setupPicker(StyledTextColorPicker picker);
public void setVisible(boolean visible) {
boolean doShrink = false;
// limiter, for the really huge fonts
if (visible) {
getPicker().refresh();
int x = Math.min(getControl().getShell().getSize().x, getControl().getDisplay().getClientArea().width * 9 / 10);
int y = Math.min(getControl().getShell().getSize().y, getControl().getDisplay().getClientArea().height * 9 / 10);
boolean shrinkWidth = (x != getControl().getShell().getSize().x);
boolean shrinkHeight = (y != getControl().getShell().getSize().y);
doShrink = shrinkWidth || shrinkHeight;
if (doShrink) {
// modify just the height
if (shrinkHeight && !shrinkWidth)
getShell().setBounds(getShell().getLocation().x, 0, getShell().getSize().x, getControl().getDisplay().getClientArea().height);
// modify just the width
else if (!shrinkHeight && shrinkWidth)
getShell().setBounds(0, getShell().getLocation().y, getControl().getDisplay().getClientArea().width, getShell().getSize().y);
// change the entire shell size to only fill the display, and
// move it to the origin
else
getShell().setBounds(0, 0, getControl().getDisplay().getClientArea().width, getControl().getDisplay().getClientArea().height);
}
}
super.setVisible(visible);
if (doShrink) {
getControl().getShell().redraw();
getControl().getShell().update();
}
}
}