blob: 54ca2d019296702847ded012a18e50dedbf16b41 [file] [log] [blame]
package org.eclipse.ui.internal.dialogs;
/************************************************************************
Copyright (c) 2000, 2002 IBM Corporation and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
Contributors:
IBM - Initial implementation
************************************************************************/
import java.text.MessageFormat;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.ui.internal.IHelpContextIds;
import org.eclipse.ui.internal.WorkbenchMessages;
/**
* The FileStatesPage is the page used to set the file states sizes for the workbench.
*/
public class FileStatesPage
extends PreferencePage
implements IWorkbenchPreferencePage, Listener {
private static final String LONGEVITY_TITLE = WorkbenchMessages.getString("FileHistory.longevity"); //$NON-NLS-1$
private static final String MAX_FILE_STATES_TITLE = WorkbenchMessages.getString("FileHistory.entries"); //$NON-NLS-1$
private static final String MAX_FILE_STATE_SIZE_TITLE = WorkbenchMessages.getString("FileHistory.diskSpace"); //$NON-NLS-1$
private static final String POSITIVE_MESSAGE = WorkbenchMessages.getString("FileHistory.mustBePositive"); //$NON-NLS-1$
private static final String INVALID_VALUE_MESSAGE = WorkbenchMessages.getString("FileHistory.invalid"); //$NON-NLS-1$
private static final String SAVE_ERROR_MESSAGE = WorkbenchMessages.getString("FileHistory.exceptionSaving"); //$NON-NLS-1$
private static final String NOTE_MESSAGE = WorkbenchMessages.getString("FileHistory.restartNote"); //$NON-NLS-1$
private static final String NOTE_LABEL = WorkbenchMessages.getString("Preference.note"); //$NON-NLS-1$
private static final int FAILED_VALUE = -1;
//Set the length of the day as we have to convert back and forth
private static final long DAY_LENGTH = 86400000;
private static final long MEGABYTES = 1024 * 1024;
private Text longevityText;
private Text maxStatesText;
private Text maxStateSizeText;
//Choose a maximum to prevent OutOfMemoryErrors
private int FILE_STATES_MAXIMUM = 10000;
private long STATE_SIZE_MAXIMUM = 100;
/**
* This method takes the string for the title of a text field and the value for the
* text of the field.
* @return org.eclipse.swt.widgets.Text
* @param labelString java.lang.String
* @param textValue java.lang.String
* @param parent Composite
*/
private Text addLabelAndText(
String labelString,
String textValue,
Composite parent) {
Label label = new Label(parent, SWT.LEFT);
label.setText(labelString);
label.setFont(parent.getFont());
Text text = new Text(parent, SWT.LEFT | SWT.BORDER);
GridData data = new GridData();
text.addListener(SWT.Modify, this);
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
data.verticalAlignment = GridData.CENTER;
data.grabExcessVerticalSpace = false;
text.setLayoutData(data);
text.setText(textValue);
text.setFont(parent.getFont());
return text;
}
/**
* Recomputes the page's error state by validating all
* the fields.
*/
private void checkState() {
// Assume invalid if the controls not created yet
if (longevityText == null
|| maxStatesText == null
|| maxStateSizeText == null) {
setValid(false);
return;
}
if (validateLongTextEntry(longevityText) == FAILED_VALUE) {
setValid(false);
return;
}
if (validateMaxFileStates() == FAILED_VALUE) {
setValid(false);
return;
}
if (validateMaxFileStateSize() == FAILED_VALUE) {
setValid(false);
return;
}
setValid(true);
setErrorMessage(null);
}
/*
* Create the contents control for the workspace file states.
* @returns Control
* @param parent Composite
*/
protected Control createContents(Composite parent) {
WorkbenchHelp.setHelp(
parent,
IHelpContextIds.FILE_STATES_PREFERENCE_PAGE);
// button group
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
composite.setLayout(layout);
composite.setFont(parent.getFont());
IWorkspaceDescription description = getWorkspaceDescription();
//Get the current value and make sure we get at least one day out of it.
long days = description.getFileStateLongevity() / DAY_LENGTH;
if (days < 1)
days = 1;
long megabytes = description.getMaxFileStateSize() / MEGABYTES;
if (megabytes < 1)
megabytes = 1;
this.longevityText =
addLabelAndText(LONGEVITY_TITLE, String.valueOf(days), composite);
this.maxStatesText =
addLabelAndText(
MAX_FILE_STATES_TITLE,
String.valueOf(description.getMaxFileStates()),
composite);
this.maxStateSizeText =
addLabelAndText(
MAX_FILE_STATE_SIZE_TITLE,
String.valueOf(megabytes),
composite);
checkState();
//Create a spacing label to breakup the note from the fields
Label spacer = new Label(composite, SWT.NONE);
GridData spacerData = new GridData();
spacerData.horizontalSpan = 2;
spacer.setLayoutData(spacerData);
Composite noteComposite =
createNoteComposite(
parent.getFont(),
composite,
NOTE_LABEL,
NOTE_MESSAGE);
GridData noteData = new GridData();
noteData.horizontalSpan = 2;
noteComposite.setLayoutData(noteData);
return composite;
}
/**
* Get the Workspace this page is operating on.
* @return org.eclipse.core.internal.resources.IWorkspace
*/
private IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
/**
* Get the Workspace Description this page is operating on.
* @return org.eclipse.core.resources.IWorkspaceDescription
*/
private IWorkspaceDescription getWorkspaceDescription() {
return ResourcesPlugin.getWorkspace().getDescription();
}
/**
* Sent when an event that the receiver has registered for occurs.
*
* @param event the event which occurred
*/
public void handleEvent(Event event) {
checkState();
}
/**
* 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(org.eclipse.ui.IWorkbench workbench) {
}
/**
* Performs special processing when this page's Defaults button has been pressed.
* Reset the entries to thier default values.
*/
protected void performDefaults() {
super.performDefaults();
Preferences prefs = ResourcesPlugin.getPlugin().getPluginPreferences();
long days =
prefs.getDefaultLong(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY)
/ DAY_LENGTH;
long megabytes =
prefs.getDefaultLong(ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE)
/ MEGABYTES;
this.longevityText.setText(String.valueOf(days));
this.maxStatesText.setText(
prefs.getDefaultString(ResourcesPlugin.PREF_MAX_FILE_STATES));
this.maxStateSizeText.setText(String.valueOf(megabytes));
checkState();
}
/**
* Perform the result of the OK from the receiver.
*/
public boolean performOk() {
long longevityValue = validateLongTextEntry(longevityText);
int maxFileStates = validateMaxFileStates();
long maxStateSize = validateMaxFileStateSize();
if (longevityValue == FAILED_VALUE
|| maxFileStates == FAILED_VALUE
|| maxStateSize == FAILED_VALUE)
return false;
IWorkspaceDescription description = getWorkspaceDescription();
description.setFileStateLongevity(longevityValue * DAY_LENGTH);
description.setMaxFileStates(maxFileStates);
description.setMaxFileStateSize(maxStateSize * MEGABYTES);
try {
//As it is only a copy save it back in
ResourcesPlugin.getWorkspace().setDescription(description);
} catch (CoreException exception) {
ErrorDialog.openError(
getShell(),
SAVE_ERROR_MESSAGE,
exception.getMessage(),
exception.getStatus());
return false;
}
return true;
}
/**
* Validate a text entry for an integer field. Return the result if there are
* no errors, otherwise return -1 and set the entry field error.
* @return int
*/
private int validateIntegerTextEntry(Text text) {
int value;
try {
value = Integer.parseInt(text.getText());
} catch (NumberFormatException exception) {
setErrorMessage(
MessageFormat.format(
INVALID_VALUE_MESSAGE,
new Object[] { exception.getLocalizedMessage()}));
return FAILED_VALUE;
}
//Be sure all values are non zero and positive
if (value <= 0) {
setErrorMessage(POSITIVE_MESSAGE);
return FAILED_VALUE;
}
return value;
}
/**
* Validate a text entry for a long field. Return the result if there are
* no errors, otherwise return -1 and set the entry field error.
* @return long
*/
private long validateLongTextEntry(Text text) {
long value;
try {
value = Long.parseLong(text.getText());
} catch (NumberFormatException exception) {
setErrorMessage(
MessageFormat.format(
INVALID_VALUE_MESSAGE,
new Object[] { exception.getLocalizedMessage()}));
return FAILED_VALUE;
}
//Be sure all values are non zero and positive
if (value <= 0) {
setErrorMessage(POSITIVE_MESSAGE);
return FAILED_VALUE;
}
return value;
}
/**
* Validate the maximum file states.
* Return the value if successful, otherwise
* return FAILED_VALUE.
* Set the error message if it fails.
* @return int
*/
private int validateMaxFileStates() {
int maxFileStates = validateIntegerTextEntry(this.maxStatesText);
if (maxFileStates == FAILED_VALUE)
return maxFileStates;
if (maxFileStates > FILE_STATES_MAXIMUM) {
setErrorMessage(
WorkbenchMessages.format(
"FileHistory.aboveMaxEntries",
new String[] { String.valueOf(FILE_STATES_MAXIMUM)}));
return FAILED_VALUE;
}
return maxFileStates;
}
/**
* Validate the maximum file state size.
* Return the value if successful, otherwise
* return FAILED_VALUE.
* Set the error message if it fails.
* @return long
*/
private long validateMaxFileStateSize() {
long maxFileStateSize = validateLongTextEntry(this.maxStateSizeText);
if (maxFileStateSize == FAILED_VALUE)
return maxFileStateSize;
if (maxFileStateSize > STATE_SIZE_MAXIMUM) {
setErrorMessage(
WorkbenchMessages.format(
"FileHistory.aboveMaxFileSize",
new String[] { String.valueOf(STATE_SIZE_MAXIMUM)}));
return FAILED_VALUE;
}
return maxFileStateSize;
}
}