/*******************************************************************************
* Copyright (c) 2009 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
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.preferences;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.php.internal.ui.Logger;
import org.eclipse.php.internal.ui.PHPUiPlugin;
import org.eclipse.php.internal.ui.util.IStringValidator;
import org.eclipse.php.internal.ui.util.ValidationStatus;
import org.eclipse.php.internal.ui.util.ValuedCombo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.osgi.service.prefs.BackingStoreException;
public class AbstractPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
protected List<Button> buttons = new ArrayList<>();
protected List<Text> textBoxes = new ArrayList<>();
protected List<Label> labels = new ArrayList<>();
protected List<ValuedCombo> combos = new ArrayList<>();
/**
* Add this control to the list of controls
*/
protected void add(Button button) {
buttons.add(button);
}
protected void add(Text text) {
textBoxes.add(text);
}
protected void add(Label label) {
labels.add(label);
}
protected void add(ValuedCombo valuedCombo) {
combos.add(valuedCombo);
}
protected void restoreDefaultValues() {
restoreDefaultButtonValues();
restoreDefaultTextValues();
restoreDefaultComboTextValues();
}
protected void restoreDefaultComboTextValues() {
for (Iterator<ValuedCombo> comboIterator = this.combos.iterator(); comboIterator.hasNext();) {
ValuedCombo valuedCombo = comboIterator.next();
Object data = valuedCombo.getData();
if (data != null) {
valuedCombo.selectValue(getPreferenceStore().getDefaultString((String) data));
}
}
}
protected void restoreDefaultTextValues() {
Object[] controlsArray = textBoxes.toArray();
for (int i = 0; i < controlsArray.length; i++) {
Text text = (Text) controlsArray[i];
Object data = text.getData();
if (data != null) {
text.setText(getPreferenceStore().getDefaultString((String) data));
}
}
}
protected void restoreDefaultButtonValues() {
Object[] controlsArray = buttons.toArray();
for (int i = 0; i < controlsArray.length; i++) {
Button button = (Button) controlsArray[i];
Object data = button.getData();
if (data != null) {
button.setSelection(getPreferenceStore().getDefaultBoolean((String) data));
}
}
}
/**
* Initialize values with values from preference store
*/
protected void initializeValues() {
initializeButtonsValues();
initializeTextValues();
initializeComboValues();
}
protected void initializeComboValues() {
for (Iterator<ValuedCombo> comboIterator = this.combos.iterator(); comboIterator.hasNext();) {
ValuedCombo valuedCombo = comboIterator.next();
Object data = valuedCombo.getData();
if (data != null) {
valuedCombo.selectValue(getPreferenceStore().getString((String) data));
}
}
}
protected void initializeTextValues() {
Object[] controlsArray = textBoxes.toArray();
for (int i = 0; i < controlsArray.length; i++) {
Text text = (Text) controlsArray[i];
Object data = text.getData();
if (data != null) {
text.setText(getPreferenceStore().getString((String) data));
}
}
}
protected void initializeButtonsValues() {
Object[] controlsArray = buttons.toArray();
for (int i = 0; i < controlsArray.length; i++) {
Button button = (Button) controlsArray[i];
Object data = button.getData();
if (data != null) {
button.setSelection(getPreferenceStore().getBoolean((String) data));
}
}
}
/**
* Store field values back to the preference store
*/
protected void storeValues() {
storeButtonsValues();
storeTextValues();
storeCombosValues();
}
protected void storeCombosValues() {
for (Iterator<ValuedCombo> comboIterator = this.combos.iterator(); comboIterator.hasNext();) {
ValuedCombo valuedCombo = comboIterator.next();
Object data = valuedCombo.getData();
if (data != null) {
getPreferenceStore().setValue((String) data, valuedCombo.getSelectionValue());
}
}
}
protected void storeTextValues() {
Object[] controlsArray = textBoxes.toArray();
for (int i = 0; i < controlsArray.length; i++) {
Text text = (Text) controlsArray[i];
Object data = text.getData();
if (data != null) {
getPreferenceStore().setValue((String) data, text.getText());
}
}
}
protected void storeButtonsValues() {
Object[] controlsArray = buttons.toArray();
for (int i = 0; i < controlsArray.length; i++) {
Button button = (Button) controlsArray[i];
Object data = button.getData();
if (data != null) {
getPreferenceStore().setValue((String) data, button.getSelection());
}
}
}
/**
* Sets controls with specified key data to be active/not active
*/
protected void setControlsEnabled(String key, boolean enabled) {
setControlsEnabled(buttons, key, enabled);
setControlsEnabled(textBoxes, key, enabled);
setControlsEnabled(labels, key, enabled);
setControlsEnabled(combos, key, enabled);
}
private void setControlsEnabled(List<? extends Control> controls, String key, boolean enabled) {
for (Iterator<? extends Control> controlIterator = controls.iterator(); controlIterator.hasNext();) {
Control control = controlIterator.next();
Object data = control.getData();
if (data != null && ((String) data).equals(key)) {
control.setEnabled(enabled);
}
}
}
/**
* Creates font metrics
*/
protected FontMetrics getFontMetrics(Control control) {
GC gc = new GC(control);
gc.setFont(control.getFont());
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
return fontMetrics;
}
/**
* Creates sub-section group with title
*/
protected Composite createSubsection(Composite parent, String label) {
Group group = new Group(parent, SWT.SHADOW_NONE);
group.setText(label);
GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);
group.setLayoutData(data);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
group.setLayout(layout);
return group;
}
/**
* Create new checkbox and associate a preference key with it
*/
protected Button addCheckBox(Composite parent, String label, String prefKey, int horizontalIndent) {
Button checkBox = new Button(parent, SWT.CHECK);
checkBox.setText(label);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalIndent = horizontalIndent;
gd.horizontalSpan = 3;
checkBox.setLayoutData(gd);
checkBox.setData(prefKey);
add(checkBox);
return checkBox;
}
class TextFieldValidateListener implements ModifyListener {
private IStringValidator stringValidator;
public TextFieldValidateListener(IStringValidator stringValidator) {
this.stringValidator = stringValidator;
}
@Override
public void modifyText(ModifyEvent e) {
ValidationStatus status = stringValidator.validate(((Text) e.widget).getText());
if (!status.isOK()) {
setErrorMessage(status.getError());
setValid(false);
} else {
setErrorMessage(null);
setValid(true);
}
}
}
/**
* Add text box with label with input validator
*/
protected Text addLabelledTextField(Composite parent, String label, String key, int textlimit, int horizontalIndent,
IStringValidator stringValidator) {
Label labelControl = new Label(parent, SWT.WRAP);
labelControl.setText(label);
labelControl.setData(key);
GridData data = new GridData();
data.horizontalIndent = horizontalIndent;
labelControl.setLayoutData(data);
add(labelControl);
Text textBox = new Text(parent, SWT.BORDER | SWT.SINGLE);
textBox.setData(key);
data = new GridData();
if (textlimit != 0) {
textBox.setTextLimit(textlimit);
data.widthHint = Dialog.convertWidthInCharsToPixels(getFontMetrics(parent), textlimit + 1);
}
data.horizontalSpan = 2;
textBox.setLayoutData(data);
if (stringValidator != null) {
textBox.addModifyListener(new TextFieldValidateListener(stringValidator));
}
add(textBox);
return textBox;
}
/**
* Add text box with label
*/
protected Text addLabelledTextField(Composite parent, String label, String key, int textlimit,
int horizontalIndent) {
return addLabelledTextField(parent, label, key, textlimit, horizontalIndent, null);
}
@Override
protected Control createContents(Composite parent) {
return new Composite(parent, SWT.NONE);
}
@Override
public void init(IWorkbench workbench) {
}
@Override
protected IPreferenceStore doGetPreferenceStore() {
return PreferenceConstants.getPreferenceStore();
}
@Override
protected void performDefaults() {
super.performDefaults();
restoreDefaultValues();
}
@Override
public boolean performOk() {
storeValues();
try {
InstanceScope.INSTANCE.getNode(PHPUiPlugin.ID).flush();
} catch (BackingStoreException e) {
Logger.logException(e);
}
return super.performOk();
}
}