/*******************************************************************************
* Copyright (c) 2011, 2016 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.internal.cdt.ui.preferences;
import java.util.Set;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.*;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.tcf.internal.cdt.ui.Activator;
import org.eclipse.tcf.internal.cdt.ui.breakpoints.Messages;
import org.eclipse.tcf.internal.cdt.ui.breakpoints.TCFThreadFilterEditor;
import org.eclipse.tcf.internal.cdt.ui.breakpoints.TCFToggleBreakpointsTargetFactory;
public class BreakpointPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
public static final String PLUGIN_ID="org.eclipse.tcf.cdt.ui.preferences.BreakpointPreferencePage";
private BooleanFieldEditor context_enabled;
private ComboFieldEditor context_expression;
private BooleanFieldEditor offset_enabled;
private IntegerFieldEditor offset_limit;
public BreakpointPreferencePage() {
super(GRID);
setPreferenceStore(Activator.getDefault().getPreferenceStore());
setDescription(Messages.TCFBreakpointPreferencesDescription);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
super.propertyChange(event);
Object source = event.getSource();
if (source == context_enabled) {
context_expression.setEnabled(
context_enabled.getBooleanValue(),
getFieldEditorParent());
}
if (source == offset_enabled) {
offset_limit.setEnabled(
offset_enabled.getBooleanValue(),
getFieldEditorParent());
}
}
public void createFieldEditors() {
context_enabled = new BooleanFieldEditor(
PreferenceConstants.PREF_DEFAULT_TRIGGER_SCOPE_ENABLED,
Messages.TCFBreakpointPreferencesEnableDefaultTriggerScope,
getFieldEditorParent());
addField(context_enabled);
String [] expressions = getTriggerExpressions();
context_expression = new ComboFieldEditor(
PreferenceConstants.PREF_DEFAULT_TRIGGER_SCOPE,
Messages.TCFBreakpointPreferencesTriggerScopeExpression,
joinToArray2D(expressions,expressions),
getFieldEditorParent());
addField(context_expression);
offset_enabled = new BooleanFieldEditor(
PreferenceConstants.PREF_LINE_OFFSET_LIMIT_ENABLED,
Messages.TCFBreakpointPreferencesEnableLineOffsetLimit,
getFieldEditorParent());
addField(offset_enabled);
offset_limit = new IntegerFieldEditor(
PreferenceConstants.PREF_LINE_OFFSET_LIMIT,
Messages.TCFBreakpointPreferencesLineOffsetLimit,
getFieldEditorParent());
addField(offset_limit);
if (!checkTCFToggleBreakpointAdapter()) {
context_enabled.setEnabled(false, getFieldEditorParent());
context_expression.setEnabled(false, getFieldEditorParent());
offset_enabled.setEnabled(false, getFieldEditorParent());
offset_limit.setEnabled(false, getFieldEditorParent());
setMessage(Messages.TCFBreakpointPrefrencesError, WARNING);
setValid(false);
}
else {
setErrorMessage(null);
setValid(true);
}
}
protected void checkState() {
context_expression.setEnabled(
context_enabled.getBooleanValue(),
getFieldEditorParent());
offset_limit.setEnabled(
offset_enabled.getBooleanValue(),
getFieldEditorParent());
super.checkState();
}
public void init(IWorkbench workbench) {
}
private String[] getTriggerExpressions() {
IDialogSettings dialogSettings = getBreakpointScopeDialogSettings();
if (dialogSettings == null) return new String[0];
String[] returnList = null;
String[] expressionList = null;
int index = 0;
expressionList = dialogSettings.getArray(Messages.TCFThreadFilterQueryExpressionStore);
// Find if there is a null entry.
if ( expressionList != null ) {
for(index = 0; index < expressionList.length; index++) {
String member = expressionList[index];
if (member == null || member.length() == 0) {
break;
}
}
}
returnList = new String[index + 1];
returnList[0] = "";
for (int loop = 0; loop < index; loop++) {
returnList[loop+1] = expressionList[loop];
}
return returnList;
}
private IDialogSettings getBreakpointScopeDialogSettings() {
String component = TCFThreadFilterEditor.PLUGIN_ID;
IDialogSettings settings = Activator.getDefault().getDialogSettings();
return settings.getSection(component);
}
private String[][] joinToArray2D(String[] labels, String[] values) {
String[][] array2d = new String[labels.length][];
for (int i = 0; i < labels.length; i++) {
array2d[i] = new String[2];
array2d[i][0] = labels[i];
array2d[i][1] = values[i];
}
return array2d;
}
private boolean checkTCFToggleBreakpointAdapter() {
IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if (part == null) {
part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
}
if (part != null) {
ISelectionProvider provider = part.getSite().getSelectionProvider();
if (provider != null) {
ISelection selection = provider.getSelection();
Set<?> enablers = DebugUITools.getToggleBreakpointsTargetManager().getEnabledToggleBreakpointsTargetIDs(part, selection);
if (enablers != null &&
!enablers.contains(TCFToggleBreakpointsTargetFactory.ID_TCF_BREAKPOINT_TOGGLE_TARGET)) {
return true;
}
String preferred = DebugUITools.getToggleBreakpointsTargetManager().getPreferredToggleBreakpointsTargetID(part, selection);
if (preferred != null &&
!preferred.equals(TCFToggleBreakpointsTargetFactory.ID_TCF_BREAKPOINT_TOGGLE_TARGET)) {
return false;
}
}
}
return true;
}
}