blob: 1f567af4164595fce1d9317e1489d89c398a2664 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
package org.eclipse.dltk.internal.ui.callhierarchy;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.internal.corext.callhierarchy.CallHierarchy;
import org.eclipse.dltk.ui.dialogs.StatusInfo;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
class FiltersDialog extends StatusDialog {
private Label fNamesHelpText;
private Button fFilterOnNames;
private Text fNames;
private Text fMaxCallDepth;
/**
* @param parentShell
*/
protected FiltersDialog(Shell parentShell) {
super(parentShell);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(CallHierarchyMessages.FiltersDialog_filter);
// PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, IJavaHelpContextIds.CALL_HIERARCHY_FILTERS_DIALOG);
if (DLTKCore.DEBUG) {
System.err.println("Add help support here..."); //$NON-NLS-1$
}
}
@Override
protected Control createDialogArea(Composite parent) {
Composite superComposite = (Composite) super.createDialogArea(parent);
Composite composite = new Composite(superComposite, SWT.NONE);
composite.setFont(superComposite.getFont());
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout layout = new GridLayout();
layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
createNamesArea(composite);
new Label(composite, SWT.NONE); // Filler
createMaxCallDepthArea(composite);
updateUIFromFilter();
return composite;
}
private void createMaxCallDepthArea(Composite parent) {
Composite composite= new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout layout = new GridLayout();
layout.numColumns = 2;
composite.setLayout(layout);
Label label= new Label(composite, SWT.NONE);
label.setFont(composite.getFont());
label.setText(CallHierarchyMessages.FiltersDialog_maxCallDepth);
fMaxCallDepth = new Text(composite, SWT.SINGLE | SWT.BORDER);
fMaxCallDepth.setFont(composite.getFont());
fMaxCallDepth.setTextLimit(6);
fMaxCallDepth.addModifyListener(e -> validateInput());
GridData gridData = new GridData();
gridData.widthHint = convertWidthInCharsToPixels(10);
fMaxCallDepth.setLayoutData(gridData);
}
private void createNamesArea(Composite parent) {
fFilterOnNames = createCheckbox(parent,
CallHierarchyMessages.FiltersDialog_filterOnNames, true);
fNames= new Text(parent, SWT.SINGLE | SWT.BORDER);
fNames.setFont(parent.getFont());
fNames.addModifyListener(e -> validateInput());
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
gridData.widthHint = convertWidthInCharsToPixels(60);
fNames.setLayoutData(gridData);
fNamesHelpText= new Label(parent, SWT.LEFT);
fNamesHelpText.setFont(parent.getFont());
fNamesHelpText.setText(CallHierarchyMessages.FiltersDialog_filterOnNamesSubCaption);
}
/**
* Creates a check box button with the given parent and text.
*
* @param parent the parent composite
* @param text the text for the check box
* @param grabRow <code>true</code>to grab the remaining horizontal space,
* <code>false</code> otherwise
*
* @return the check box button
*/
private Button createCheckbox(Composite parent, String text, boolean grabRow) {
Button button = new Button(parent, SWT.CHECK);
button.setFont(parent.getFont());
if (grabRow) {
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
button.setLayoutData(gridData);
}
button.setText(text);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
validateInput();
updateEnabledState();
}
});
return button;
}
/**
* Updates the enabled state of the widgetry.
*/
private void updateEnabledState() {
fNames.setEnabled(fFilterOnNames.getSelection());
fNamesHelpText.setEnabled(fFilterOnNames.getSelection());
}
/**
* Updates the given filter from the UI state.
*/
private void updateFilterFromUI() {
int maxCallDepth = Integer.parseInt(this.fMaxCallDepth.getText());
CallHierarchyUI.getDefault().setMaxCallDepth(maxCallDepth);
CallHierarchy.getDefault().setFilters(fNames.getText());
CallHierarchy.getDefault().setFilterEnabled(fFilterOnNames.getSelection());
}
/**
* Updates the UI state from the given filter.
*/
private void updateUIFromFilter() {
fMaxCallDepth.setText(String.valueOf(CallHierarchyUI.getDefault().getMaxCallDepth()));
fNames.setText(CallHierarchy.getDefault().getFilters());
fFilterOnNames.setSelection(CallHierarchy.getDefault().isFilterEnabled());
updateEnabledState();
}
/**
* Updates the filter from the UI state.
* Must be done here rather than by extending open()
* because after super.open() is called, the widgetry is disposed.
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
if (!isMaxCallDepthValid()) {
if (fMaxCallDepth.forceFocus()) {
fMaxCallDepth.setSelection(0, fMaxCallDepth.getCharCount());
fMaxCallDepth.showSelection();
}
}
updateFilterFromUI();
super.okPressed();
}
private boolean isMaxCallDepthValid() {
String text= fMaxCallDepth.getText();
if (text.length() == 0)
return false;
try {
int maxCallDepth= Integer.parseInt(text);
return (maxCallDepth >= 1 && maxCallDepth <= 99);
} catch (NumberFormatException e) {
return false;
}
}
private void validateInput() {
StatusInfo status= new StatusInfo();
if (!isMaxCallDepthValid()) {
status.setError(CallHierarchyMessages.FiltersDialog_messageMaxCallDepthInvalid);
}
updateStatus(status);
}
}