blob: e5bfcdadb973f14798db8b3fa22b639014ca9bec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 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
*******************************************************************************/
package org.eclipse.ui.internal.ide;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
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.Group;
import org.osgi.service.prefs.BackingStoreException;
/**
* A class to handle editing of the Line delimiter preferences in core.
*
* @since 3.1
*/
public class LineDelimiterEditor {
private Button defaultButton;
private Button otherButton;
private Combo choiceCombo;
/*
* The project whose preferences should be set. In some cases this class
* will be used to edit project preferences.
*/
private IProject project;
/**
* Creates a new encoding field editor with the given preference name, label
* and parent.
*
* @param composite
* the parent of the field editor's control
*/
public LineDelimiterEditor(Composite composite) {
this(composite, null);
}
/**
* Creates a new encoding field editor with the given preference name, label
* and parent.
*
* @param composite
* the parent of the field editor's control
* @param project
* the project to set preferences on
*
*/
public LineDelimiterEditor(Composite composite, IProject project) {
this.project = project;
createControl(composite);
}
/**
* Creates this field editor's main control containing all of its basic
* controls.
*
* @param parent
* the parent control
*/
protected void createControl(Composite parent) {
Font font = parent.getFont();
Group group = new Group(parent, SWT.NONE);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
group.setLayoutData(data);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
group.setLayout(layout);
group.setText(IDEWorkbenchMessages.IDEWorkspacePreference_fileLineDelimiter);
group.setFont(font);
SelectionAdapter buttonListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (e.widget.equals(defaultButton))
updateState(true);
else
updateState(false);
}
};
defaultButton = new Button(group, SWT.RADIO);
if (project == null)
defaultButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_defaultLineDelim);
else
defaultButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_defaultLineDelimProj);
data = new GridData();
data.horizontalSpan = 2;
defaultButton.setLayoutData(data);
defaultButton.addSelectionListener(buttonListener);
defaultButton.setFont(font);
otherButton = new Button(group, SWT.RADIO);
otherButton
.setText(IDEWorkbenchMessages.IDEWorkspacePreference_otherLineDelim);
otherButton.addSelectionListener(buttonListener);
otherButton.setFont(font);
choiceCombo = new Combo(group, SWT.NONE | SWT.READ_ONLY);
data = new GridData();
choiceCombo.setFont(font);
choiceCombo.setLayoutData(data);
populateChoiceCombo(getChoices());
}
/**
* Load the list items from core and update the state of the buttons to
* match what the preference is currently set to.
*/
public void doLoad() {
if (choiceCombo != null) {
populateChoiceCombo(getChoices());
String resourcePreference = getStoredValue();
updateState(resourcePreference == null);
}
}
/**
* Initializes this field editor with the preference value from the
* preference store.
*/
public void loadDefault() {
doLoad();
}
/**
* Returns the value that is currently stored for the encoding.
*
* @return the currently stored encoding
*/
public String getStoredValue() {
IScopeContext[] scopeContext = new IScopeContext[] { getScopeContext() };
IEclipsePreferences node = scopeContext[0].getNode(Platform.PI_RUNTIME);
return node.get(Platform.PREF_LINE_SEPARATOR, null);
}
/**
* Answer the <code>IScopeContext</code> for the receiver, this will be a
* project scope if the receiver is editing project preferences, otherwise
* instance scope.
*
* @return the scope context
*/
private IScopeContext getScopeContext() {
if (project != null)
return new ProjectScope(project);
return new InstanceScope();
}
/**
* Returns the default setting for the object being shown.
*
* @return the default setting for the object being shown
*/
protected String[] getChoices() {
Set keys = Platform.knownPlatformLineSeparators().keySet();
String[] keyArray = new String[keys.size()];
keys.toArray(keyArray);
return keyArray;
}
/**
* Populates the list of choices combo.
*/
private void populateChoiceCombo(String[] items) {
choiceCombo.setItems(items);
if (getStoredValue() == null) {
choiceCombo.setText(""); //$NON-NLS-1$
} else {
selectChoice();
}
}
private void updateState(boolean useDefault) {
if (useDefault) {
defaultButton.setSelection(true);
otherButton.setSelection(false);
choiceCombo.setEnabled(false);
} else {
defaultButton.setSelection(false);
otherButton.setSelection(true);
choiceCombo.setEnabled(true);
selectChoice();
}
}
/**
* Select the item in the combo that matches the current preferences
* setting. NOTE: not handling the case where two platform line separators
* are defined with the same value. Assumption is that they are unique and
* the key will be modified to represent that. E.g. a key might be Mac OS
* 10/Linux if the same value is required for two platforms.
*/
private void selectChoice() {
String selection = null;
Map knownValues = Platform.knownPlatformLineSeparators();
Set keys = knownValues.keySet();
String current = getStoredValue();
if (current != null) {
for (Iterator iter = keys.iterator(); iter.hasNext();) {
String element = (String) iter.next();
if (knownValues.get(element).equals(current)) {
selection = element;
break;
}
}
}
String[] items = choiceCombo.getItems();
for (int i = 0; i < items.length; i++) {
String item = items[i];
if (item.equals(selection)) {
choiceCombo.select(i);
break;
}
}
}
/**
* Store the currently selected line delimiter value in the preference
* store.
*/
public void store() {
String val;
if (defaultButton.getSelection() || choiceCombo.getText().equals("")) //$NON-NLS-1$
val = null;
else {
Map lineSeparators = Platform.knownPlatformLineSeparators();
val = (String) lineSeparators.get(choiceCombo.getText());
}
IEclipsePreferences node = getScopeContext().getNode(
Platform.PI_RUNTIME);
if (val == null)
node.remove(Platform.PREF_LINE_SEPARATOR);
else
node.put(Platform.PREF_LINE_SEPARATOR, val);
try {
node.flush();
} catch (BackingStoreException e) {
IDEWorkbenchPlugin.log(e.getMessage(), e);
}
}
}