blob: 6bafb40db9a80ca7b7d372a7ae2227186b62e52a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Dmitry Kozlov (CodeSourcery) - Build error highlighting and navigation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.preferences;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ColorFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
public class BuildConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
private static final String PREF_CLEAR_CONSOLE = "clearConsole"; //$NON-NLS-1$
private static final String PREF_CONSOLE_ON_TOP = "consoleOnTop"; //$NON-NLS-1$
private static final String PREF_AUTO_OPEN_CONSOLE = "autoOpenConsole"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_WRAP_LINES = "buildConsoleWrapLines"; //$NON-NLS-1$
/**
* Maximum number of lines for which the wrap lines is enabled in the build console
*/
public static final String PREF_BUILDCONSOLE_WRAP_LINES_MAX = "buildConsoleWrapLinesMax"; //$NON-NLS-1$
// In font registry
public static final String PREF_BUILDCONSOLE_FONT = "org.eclipse.cdt.ui.buildconsole.ConsoleFont"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_TAB_WIDTH = "buildConsoleTabWith"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_LINES = "buildConsoleLines"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_UPDATE_DELAY_MS = "buildConsoleUpdateDelayMs"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_INFO_COLOR = "buildConsoleInfoStreamColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_OUTPUT_COLOR = "buildConsoleOutputStreamColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_ERROR_COLOR = "buildConsoleErrorStreamColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_BACKGROUND_COLOR = "buildConsoleBackgroundColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_PROBLEM_BACKGROUND_COLOR = "buildConsoleProblemBackgroundColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_PROBLEM_WARNING_BACKGROUND_COLOR = "buildConsoleProblemWarningBackgroundColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_PROBLEM_INFO_BACKGROUND_COLOR = "buildConsoleProblemInfoBackgroundColor"; //$NON-NLS-1$
public static final String PREF_BUILDCONSOLE_PROBLEM_HIGHLIGHTED_COLOR = "buildConsoleProblemHighlightedColor"; //$NON-NLS-1$
/**
* Update the UI after a short delay. The reason for a short delay is to try
* and reduce the "frame rate" of the build console updates, this reduces
* the total load on the main thread. User's won't be able to tell that
* there is an extra delay.
*
* A too short time has little effect and a too long time starts to be
* visible to the user. With my experiments to get under 50% CPU utilization
* on the main thread requires at least 35 msec delay between updates. 250
* msec leads to visible delay to user and ~20% utilization. And finally the
* chosen value, 75 msec leads to ~35% utilization and no user visible
* delay.
*/
public static final int DEFAULT_BUILDCONSOLE_UPDATE_DELAY_MS = 75;
private BooleanFieldEditor2 consoleWrapLines;
private IntegerFieldEditor buildCount;
private IntegerFieldEditor wrapLinesMax;
public BuildConsolePreferencePage() {
super(GRID);
setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ICHelpContextIds.BUILD_CONSOLE_PREFERENCE_PAGE);
}
@Override
protected void createFieldEditors() {
Composite parent = getFieldEditorParent();
BooleanFieldEditor clearConsole = new BooleanFieldEditor(PREF_CLEAR_CONSOLE,
CUIPlugin.getResourceString("ConsolePreferencePage.clearConsole.label"), parent); //$NON-NLS-1$
addField(clearConsole);
BooleanFieldEditor autoOpenConsole = new BooleanFieldEditor(PREF_AUTO_OPEN_CONSOLE,
CUIPlugin.getResourceString("ConsolePreferencePage.autoOpenConsole.label"), parent); //$NON-NLS-1$
addField(autoOpenConsole);
BooleanFieldEditor consoleOnTop = new BooleanFieldEditor(PREF_CONSOLE_ON_TOP,
CUIPlugin.getResourceString("ConsolePreferencePage.consoleOnTop.label"), parent); //$NON-NLS-1$
addField(consoleOnTop);
consoleWrapLines = new BooleanFieldEditor2(PREF_BUILDCONSOLE_WRAP_LINES,
CUIPlugin.getResourceString("ConsolePreferencePage.consoleWrapLines.label"), parent); //$NON-NLS-1$
addField(consoleWrapLines);
setWrapLinesEnablement();
buildCount = new IntegerFieldEditor(PREF_BUILDCONSOLE_LINES,
CUIPlugin.getResourceString("ConsolePreferencePage.consoleLines.label"), parent); //$NON-NLS-1$
buildCount.getLabelControl(parent)
.setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.consoleLines.tooltip")); //$NON-NLS-1$
buildCount.getTextControl(parent)
.setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.consoleLines.tooltip")); //$NON-NLS-1$
buildCount.setErrorMessage(CUIPlugin.getResourceString("ConsolePreferencePage.consoleLines.errorMessage")); //$NON-NLS-1$
buildCount.setValidRange(10, Integer.MAX_VALUE);
addField(buildCount);
IntegerFieldEditor updateDelay = new IntegerFieldEditor(PREF_BUILDCONSOLE_UPDATE_DELAY_MS,
CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.label"), parent); //$NON-NLS-1$
updateDelay.getLabelControl(parent)
.setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.tooltip")); //$NON-NLS-1$
updateDelay.getTextControl(parent)
.setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.tooltip")); //$NON-NLS-1$
updateDelay
.setErrorMessage(CUIPlugin.getResourceString("ConsolePreferencePage.consoleUpdateDelay.errorMessage")); //$NON-NLS-1$
updateDelay.setValidRange(0, Integer.MAX_VALUE);
addField(updateDelay);
wrapLinesMax = new IntegerFieldEditor(PREF_BUILDCONSOLE_WRAP_LINES_MAX,
CUIPlugin.getResourceString("ConsolePreferencePage.wrapLinesMax.label"), parent); //$NON-NLS-1$
wrapLinesMax.getLabelControl(parent)
.setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.wrapLinesMax.tooltip")); //$NON-NLS-1$
wrapLinesMax.getTextControl(parent)
.setToolTipText(CUIPlugin.getResourceString("ConsolePreferencePage.wrapLinesMax.tooltip")); //$NON-NLS-1$
wrapLinesMax.setErrorMessage(CUIPlugin.getResourceString("ConsolePreferencePage.wrapLinesMax.errorMessage")); //$NON-NLS-1$
wrapLinesMax.setValidRange(0, Integer.MAX_VALUE);
addField(wrapLinesMax);
IntegerFieldEditor tabSize = new IntegerFieldEditor(PREF_BUILDCONSOLE_TAB_WIDTH,
CUIPlugin.getResourceString("ConsolePreferencePage.tabWidth.label"), parent); //$NON-NLS-1$
addField(tabSize);
tabSize.setValidRange(1, 100);
tabSize.setErrorMessage(CUIPlugin.getResourceString("ConsolePreferencePage.tabWidth.errorMessage")); //$NON-NLS-1$
createLabel(parent, CUIPlugin.getResourceString("ConsolePreferencePage.colorSettings.label")); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_OUTPUT_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.outputColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_INFO_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.infoColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_ERROR_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.errorColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_BACKGROUND_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.backgroundColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_PROBLEM_BACKGROUND_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.problemBackgroundColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_PROBLEM_WARNING_BACKGROUND_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.problemWarningBackgroundColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_PROBLEM_INFO_BACKGROUND_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.problemInfoBackgroundColor.label"), parent)); //$NON-NLS-1$
addField(createColorFieldEditor(PREF_BUILDCONSOLE_PROBLEM_HIGHLIGHTED_COLOR,
CUIPlugin.getResourceString("ConsolePreferencePage.problemHighlightedColor.label"), parent)); //$NON-NLS-1$
}
/**
* @see #isConsoleWrapLinesAllowed()
*/
private void setWrapLinesEnablement() {
if ((buildCount == null || buildCount.isValid()) && (wrapLinesMax == null || wrapLinesMax.isValid())) {
int lineCount = buildCount != null ? buildCount.getIntValue() : buildConsoleLines();
int maxCount = wrapLinesMax != null ? wrapLinesMax.getIntValue() : wrapLinesMax();
boolean enabled = lineCount <= maxCount;
if (consoleWrapLines != null) {
consoleWrapLines.setEnabled(enabled, getFieldEditorParent());
if (!enabled) {
consoleWrapLines.getChangeControl(getFieldEditorParent()).setSelection(false);
}
}
}
}
@Override
public void propertyChange(PropertyChangeEvent event) {
setWrapLinesEnablement();
super.propertyChange(event);
}
private Label createLabel(Composite parent, String text) {
Label label = new Label(parent, SWT.LEFT);
label.setText(text);
GridData data = new GridData();
data.horizontalSpan = 2;
data.horizontalAlignment = GridData.FILL;
label.setLayoutData(data);
return label;
}
/**
* Creates a new color field editor.
*/
private ColorFieldEditor createColorFieldEditor(String preferenceName, String label, Composite parent) {
ColorFieldEditor editor = new ColorFieldEditor(preferenceName, label, parent);
editor.setPage(this);
editor.setPreferenceStore(getPreferenceStore());
return editor;
}
/**
* Returns the current preference setting if the build console should be
* cleared before each build.
*/
public static boolean isClearBuildConsole() {
return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PREF_CLEAR_CONSOLE);
}
public static boolean isAutoOpenConsole() {
return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PREF_AUTO_OPEN_CONSOLE);
}
public static boolean isConsoleOnTop() {
return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PREF_CONSOLE_ON_TOP);
}
public static boolean isConsoleWrapLines() {
return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PREF_BUILDCONSOLE_WRAP_LINES);
}
/**
* Bug 407405: This is a workaround for Bug 168557 in which wrapping is too slow to make it usable
* for the build console unless there are not many lines.
*/
public static boolean isConsoleWrapLinesAllowed() {
return buildConsoleLines() <= wrapLinesMax();
}
public static int wrapLinesMax() {
return CUIPlugin.getDefault().getPreferenceStore().getInt(PREF_BUILDCONSOLE_WRAP_LINES_MAX);
}
public static int buildConsoleLines() {
return CUIPlugin.getDefault().getPreferenceStore().getInt(PREF_BUILDCONSOLE_LINES);
}
public static int buildConsoleUpdateDelayMs() {
return CUIPlugin.getDefault().getPreferenceStore().getInt(PREF_BUILDCONSOLE_UPDATE_DELAY_MS);
}
@Override
public void init(IWorkbench workbench) {
}
public static void initDefaults(IPreferenceStore prefs, boolean unconditionally) {
if (unconditionally || !prefs.contains(PREF_CLEAR_CONSOLE))
prefs.setDefault(PREF_CLEAR_CONSOLE, true);
if (unconditionally || !prefs.contains(PREF_AUTO_OPEN_CONSOLE))
prefs.setDefault(PREF_AUTO_OPEN_CONSOLE, true);
if (unconditionally || !prefs.contains(PREF_CONSOLE_ON_TOP))
prefs.setDefault(PREF_CONSOLE_ON_TOP, true);
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_WRAP_LINES))
prefs.setDefault(PREF_BUILDCONSOLE_WRAP_LINES, false);
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_LINES))
prefs.setDefault(PREF_BUILDCONSOLE_LINES, 500);
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_WRAP_LINES_MAX))
prefs.setDefault(PREF_BUILDCONSOLE_WRAP_LINES_MAX, 5000);
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_UPDATE_DELAY_MS))
prefs.setDefault(PREF_BUILDCONSOLE_UPDATE_DELAY_MS, DEFAULT_BUILDCONSOLE_UPDATE_DELAY_MS);
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_TAB_WIDTH))
prefs.setDefault(PREF_BUILDCONSOLE_TAB_WIDTH, 4);
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_OUTPUT_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_OUTPUT_COLOR, new RGB(0, 0, 0));
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_INFO_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_INFO_COLOR, new RGB(0, 0, 255));
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_ERROR_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_ERROR_COLOR, new RGB(255, 0, 0));
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_BACKGROUND_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_BACKGROUND_COLOR, new RGB(255, 255, 255));
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_PROBLEM_BACKGROUND_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_PROBLEM_BACKGROUND_COLOR, new RGB(254, 231, 224));
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_PROBLEM_WARNING_BACKGROUND_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_PROBLEM_WARNING_BACKGROUND_COLOR,
new RGB(254, 243, 218));
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_PROBLEM_INFO_BACKGROUND_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_PROBLEM_INFO_BACKGROUND_COLOR,
new RGB(244, 247, 254));
if (unconditionally || !prefs.contains(PREF_BUILDCONSOLE_PROBLEM_HIGHLIGHTED_COLOR))
PreferenceConverter.setDefault(prefs, PREF_BUILDCONSOLE_PROBLEM_HIGHLIGHTED_COLOR, new RGB(255, 0, 0));
}
}