/*******************************************************************************
* Copyright (c) 2008 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
* QNX Software Systems - Catchpoints support https://bugs.eclipse.org/bugs/show_bug.cgi?id=226689
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.dialogs;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.model.ICBreakpointType;
import org.eclipse.cdt.debug.core.model.ICEventBreakpoint;
import org.eclipse.cdt.debug.internal.core.breakpoints.CEventBreakpoint;
import org.eclipse.cdt.debug.internal.ui.propertypages.CBreakpointPreferenceStore;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.breakpoints.CBreakpointUIContributionFactory;
import org.eclipse.cdt.debug.ui.breakpoints.ICBreakpointsUIContribution;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Shell;
/**
* The "Add Catchpoint" dialog of the "Add catchpoint" action.
*/
public class AddEventBreakpointDialog extends Dialog implements ModifyListener, SelectionListener {
private Combo fEventTypeInput;
private String fEventType;
private String fEventArgument;
private Composite fEventArgumentControl;
private HashMap<String, String> fIdLabelMap = new LinkedHashMap<String, String>();
private FieldEditorPreferencePage page;
private CBreakpointUIContributionFactory factory;
private String debugModelId;
static class ContributedFields extends FieldEditorPreferencePage {
private String modelId;
private String eventType;
ContributedFields(String modelId, String eventType) {
this.modelId = modelId;
this.eventType = eventType;
noDefaultAndApplyButton();
setPreferenceStore(new CBreakpointPreferenceStore() {
@Override
public String getDefaultString(String name) {
return ""; //$NON-NLS-1$
}
});
}
@Override
protected void createFieldEditors() {
Composite parent = getFieldEditorParent();
try {
Map map = new HashMap();
map.put(ICEventBreakpoint.EVENT_TYPE_ID, eventType);
ICBreakpointsUIContribution cons[] = CBreakpointUIContributionFactory.getInstance()
.getBreakpointUIContributions(modelId, CEventBreakpoint.getMarkerType(), map);
for (ICBreakpointsUIContribution con : cons) {
if (con.getId().equals(ICEventBreakpoint.EVENT_TYPE_ID)) continue;
if (con.getId().equals(ICBreakpointType.TYPE)) continue;
FieldEditor fieldEditor = con.getFieldEditor(con.getId(), con.getLabel(),
parent);
getPreferenceStore().setValue(con.getId(),""); //$NON-NLS-1$
if (fieldEditor != null)
addField(fieldEditor);
}
} catch (Exception ce) {
CDebugUIPlugin.log(ce);
}
}
}
/**
* Constructor
*
* @param parentShell
*/
public AddEventBreakpointDialog(Shell parentShell) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
factory = CBreakpointUIContributionFactory.getInstance();
debugModelId = getDebugModelId();
// Load events
loadEventTypes();
}
protected String getDebugModelId() {
return CDIDebugModel.getPluginIdentifier();
}
private void loadEventTypes() {
ICBreakpointsUIContribution[] cons = factory.getBreakpointUIContributions(debugModelId,
CEventBreakpoint.getMarkerType(), null);
for (int i = 0; i < cons.length; i++) {
ICBreakpointsUIContribution con = cons[i];
if (con.getId().equals(ICEventBreakpoint.EVENT_TYPE_ID)) {
String[] possibleValues = con.getPossibleValues();
for (String value : possibleValues) {
fIdLabelMap.put(value, con.getLabelForValue(value));
}
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
// The button bar will work better if we make the parent composite
// a single column grid layout. For the widgets we add, we want a
// a two-column grid, so we just create a sub composite for that.
GridLayout gridLayout = new GridLayout();
parent.setLayout(gridLayout);
Composite composite = new Composite(parent, SWT.None);
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.heightHint=100;
composite.setLayoutData(layoutData);
composite.setLayout(new GridLayout(1, false));
// Create the controls
createEventTypeControl(composite);
createEventArgumentControl(composite);
fEventTypeInput.setFocus();
if (fEventTypeInput.getItemCount() > 0)
fEventTypeInput.select(0);
updateUI();
return parent;
}
protected void createEventTypeControl(Composite parent) {
fEventTypeInput = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
fEventTypeInput.setLayoutData(gridData);
for (String id : fIdLabelMap.keySet()) {
addEventType(id, fIdLabelMap.get(id));
}
fEventTypeInput.addSelectionListener(this);
fEventTypeInput.select(0);
}
protected void addEventType(String id, String label) {
int index = fEventTypeInput.getItemCount();
fEventTypeInput.add(label, index);
fEventTypeInput.setData(getIdDataKey(index), id);
}
private String getIdDataKey(int index) {
return "index." + index; //$NON-NLS-1$
}
protected void createEventArgumentControl(Composite parent) {
fEventArgumentControl = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
//layout.marginHeight = 0;
//layout.marginWidth = 0;
fEventArgumentControl.setLayout(layout);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
fEventArgumentControl.setLayoutData(gridData);
updateEventType();
if (fEventType != null) {
createArgumentSpecificControl();
}
}
private void createArgumentSpecificControl() {
page = new ContributedFields(getDebugModelId(), fEventType);
page.createControl(fEventArgumentControl);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
page.getControl().setLayoutData(gridData);
}
private void updateArgumentsControl() {
updateEventType();
if (fEventTypeInput != null) {
if (page != null) {
Control control = page.getControl();
control.dispose();
page.dispose();
page = null;
}
createArgumentSpecificControl();
fEventArgumentControl.layout(true);
// resize dialog to fit new fields
getShell().pack();
}
}
public boolean isActive(){
return fIdLabelMap.size()>0;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(DialogMessages.getString("AddEventBreakpointDialog.2")); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
if (fEventTypeInput != null) {
updateEventType();
}
if (page != null) {
page.performOk();
IPreferenceStore preferenceStore = page.getPreferenceStore();
if (preferenceStore != null) {
fEventArgument = preferenceStore.getString(ICEventBreakpoint.EVENT_ARG);
}
else
fEventArgument = null;
}
super.okPressed();
}
private void updateEventType() {
int index = fEventTypeInput.indexOf(fEventTypeInput.getText());
if (index == -1) {
fEventType = null;
return;
}
Object data = fEventTypeInput.getData(getIdDataKey(index));
fEventType = (String) data;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
public void modifyText(ModifyEvent e) {
if (e.getSource() == fEventTypeInput) {
updateArgumentsControl();
}
updateUI();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
protected Control createButtonBar(Composite parent) {
return super.createButtonBar(parent);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent e) {
// ignore
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
if (e.getSource() == fEventTypeInput) {
updateArgumentsControl();
}
updateUI();
}
private void updateUI() {
Button b = getButton(IDialogConstants.OK_ID);
if (b == null) {
return;
}
b.setEnabled(okayEnabled());
}
private boolean okayEnabled() {
// validate fields here
String text = fEventTypeInput.getText();
int index = fEventTypeInput.indexOf(text);
if (index == -1) {
return false;
}
return true;
}
protected void createButtonsForButtonBar(Composite parent) {
// override so we can change the initial okay enabled state
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true).setEnabled(
okayEnabled());
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
public String getEventTypeId() {
return fEventType;
}
public String getEventArgument() {
return fEventArgument;
}
}