blob: 45b4fa7bab4e7f436c445b6af01778a41f746dba [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2011 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.search;
import java.util.ArrayList;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.internal.ui.util.SWTUtil;
public class MatchLocations {
public static class MatchLocationSelectionDialog extends TrayDialog {
private final ArrayList<Button> fButtons;
private final int fSearchFor;
private int fCurrentSelection;
public MatchLocationSelectionDialog(Shell parent, int initialSelection, int searchFor) {
super(parent);
fSearchFor= searchFor;
fButtons= new ArrayList<Button>();
fCurrentSelection= initialSelection;
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(SearchMessages.MatchLocations_dialog_title);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#isResizable()
*/
@Override
protected boolean isResizable() {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite contents= (Composite) super.createDialogArea(parent);
GridLayout layout= (GridLayout) contents.getLayout();
layout.numColumns= 2;
layout.makeColumnsEqualWidth= true;
Label label= new Label(contents, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
label.setText(SearchMessages.MatchLocations_dialog_description);
if (fSearchFor == IJavaSearchConstants.TYPE) {
createTypeMatchLocationsControls(contents);
} else {
createMethodFieldMatchLocationsControls(contents);
}
Composite buttonComposite= new Composite(contents, SWT.NONE);
buttonComposite.setLayoutData(new GridData(SWT.LEFT, SWT.BEGINNING, true, true, 2, 1));
GridLayout blayout= new GridLayout(2, false);
blayout.marginWidth= 0;
blayout.marginHeight= 0;
buttonComposite.setLayout(blayout);
Button selectAllButton= new Button(buttonComposite, SWT.PUSH);
selectAllButton.setLayoutData(new GridData());
selectAllButton.setText(SearchMessages.MatchLocations_select_all_button_label);
selectAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
performSelectAction(true);
}
@Override
public void widgetSelected(SelectionEvent e) {
performSelectAction(true);
}
});
SWTUtil.setButtonDimensionHint(selectAllButton);
Button deselectAllButton= new Button(buttonComposite, SWT.PUSH);
deselectAllButton.setLayoutData(new GridData());
deselectAllButton.setText(SearchMessages.MatchLocations_deselect_all_button_label);
deselectAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
performSelectAction(false);
}
@Override
public void widgetSelected(SelectionEvent e) {
performSelectAction(false);
}
});
SWTUtil.setButtonDimensionHint(deselectAllButton);
Dialog.applyDialogFont(contents);
return contents;
}
private void createMethodFieldMatchLocationsControls(Composite contents) {
Composite composite= new Composite(contents, SWT.NONE);
GridData gd= new GridData(SWT.LEFT, SWT.BEGINNING, true, true, 2, 1);
gd.minimumWidth= convertHorizontalDLUsToPixels(200);
composite.setLayoutData(gd);
GridLayout blayout= new GridLayout(1, false);
blayout.marginWidth= 0;
blayout.marginHeight= 0;
composite.setLayout(blayout);
createButton(composite, SearchMessages.MatchLocations_this_label, IJavaSearchConstants.THIS_REFERENCE);
createButton(composite, SearchMessages.MatchLocations_implicit_this_label, IJavaSearchConstants.IMPLICIT_THIS_REFERENCE);
createButton(composite, SearchMessages.MatchLocations_super_label, IJavaSearchConstants.SUPER_REFERENCE);
createButton(composite, SearchMessages.MatchLocations_qualified_label, IJavaSearchConstants.QUALIFIED_REFERENCE);
}
private void createTypeMatchLocationsControls(Composite contents) {
Group group= new Group(contents, SWT.NONE);
group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 2));
group.setLayout(new GridLayout(1, false));
group.setText(SearchMessages.MatchLocations_declaration_group_label);
createButton(group, SearchMessages.MatchLocations_imports_label, IJavaSearchConstants.IMPORT_DECLARATION_TYPE_REFERENCE);
createButton(group, SearchMessages.MatchLocations_super_types_label, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE);
addSeparator(group);
createButton(group, SearchMessages.MatchLocations_annotations_label , IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE);
addSeparator(group);
createButton(group, SearchMessages.MatchLocations_field_types_label, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE);
createButton(group, SearchMessages.MatchLocations_local_types_label, IJavaSearchConstants.LOCAL_VARIABLE_DECLARATION_TYPE_REFERENCE);
addSeparator(group);
createButton(group, SearchMessages.MatchLocations_method_types_label, IJavaSearchConstants.RETURN_TYPE_REFERENCE);
createButton(group, SearchMessages.MatchLocations_parameter_types_label, IJavaSearchConstants.PARAMETER_DECLARATION_TYPE_REFERENCE);
createButton(group, SearchMessages.MatchLocations_thrown_exceptions_label, IJavaSearchConstants.THROWS_CLAUSE_TYPE_REFERENCE);
Group ptGroup= new Group(contents, SWT.NONE);
ptGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
ptGroup.setLayout(new GridLayout(1, false));
ptGroup.setText(SearchMessages.MatchLocations_in_parameterized_types_group_label);
createButton(ptGroup, SearchMessages.MatchLocations_type_parameter_bounds_label, IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE);
createButton(ptGroup, SearchMessages.MatchLocations_wildcard_bounds_label, IJavaSearchConstants.WILDCARD_BOUND_TYPE_REFERENCE);
createButton(ptGroup, SearchMessages.MatchLocations_type_arguments_label, IJavaSearchConstants.TYPE_ARGUMENT_TYPE_REFERENCE);
Group statementGroup= new Group(contents, SWT.NONE);
statementGroup.setLayoutData(new GridData(SWT.FILL, SWT.END, true, false));
statementGroup.setLayout(new GridLayout(1, false));
statementGroup.setText(SearchMessages.MatchLocations_expression_group_label);
createButton(statementGroup, SearchMessages.MatchLocations_casts_label, IJavaSearchConstants.CAST_TYPE_REFERENCE);
createButton(statementGroup, SearchMessages.MatchLocations_catch_clauses_label, IJavaSearchConstants.CATCH_TYPE_REFERENCE);
addSeparator(statementGroup);
createButton(statementGroup, SearchMessages.MatchLocations_class_instance_label, IJavaSearchConstants.CLASS_INSTANCE_CREATION_TYPE_REFERENCE);
createButton(statementGroup, SearchMessages.MatchLocations_instanceof_label, IJavaSearchConstants.INSTANCEOF_TYPE_REFERENCE);
}
protected final void performSelectAction(boolean selectAll) {
for (int i= 0; i < fButtons.size(); i++) {
Button button= fButtons.get(i);
button.setSelection(selectAll);
}
validateSettings();
}
private void addSeparator(Composite parent) {
Label label= new Label(parent, SWT.NONE);
GridData data= new GridData();
data.heightHint= 4;
label.setLayoutData(data);
}
private Button createButton(Composite parent, String text, int data) {
boolean isSelected= (fCurrentSelection & data) != 0;
Button button= new Button(parent, SWT.CHECK);
button.setText(text);
button.setData(new Integer(data));
button.setLayoutData(new GridData());
button.setSelection(isSelected);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
performOptionChanged();
}
@Override
public void widgetSelected(SelectionEvent e) {
widgetDefaultSelected(e);
}
});
fButtons.add(button);
return button;
}
private int getIntValue(Button button) {
Integer bData= (Integer) button.getData();
if (bData != null) {
return bData.intValue();
}
return 0;
}
protected final void performOptionChanged() {
validateSettings();
}
private void validateSettings() {
int selected= 0;
for (int i= 0; i < fButtons.size(); i++) {
Button button= fButtons.get(i);
if (button.getSelection()) {
selected |= getIntValue(button);
}
}
fCurrentSelection= selected;
getButton(IDialogConstants.OK_ID).setEnabled(selected != 0);
}
public int getCurrentSelection() {
return fCurrentSelection;
}
}
public static String getMatchLocationDescription(int locations, int entryLimit) {
int nOptions= getNumberOfSelectedSettings(locations, entryLimit);
if (nOptions > entryLimit) {
return SearchMessages.MatchLocations_match_locations_description;
}
ArrayList<String> args= new ArrayList<String>(3);
if (isSet(locations, IJavaSearchConstants.IMPORT_DECLARATION_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_imports_description);
}
if (isSet(locations, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_super_types_description);
}
if (isSet(locations, IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_annotations_description);
}
if (isSet(locations, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_field_types_description);
}
if (isSet(locations, IJavaSearchConstants.LOCAL_VARIABLE_DECLARATION_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_local_types_description);
}
if (isSet(locations, IJavaSearchConstants.RETURN_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_method_types_description);
}
if (isSet(locations, IJavaSearchConstants.PARAMETER_DECLARATION_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_parameter_types_description);
}
if (isSet(locations, IJavaSearchConstants.THROWS_CLAUSE_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_thrown_exceptions_description);
}
if (isSet(locations, IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_type_parameter_bounds_description);
}
if (isSet(locations, IJavaSearchConstants.WILDCARD_BOUND_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_wildcard_bounds_description);
}
if (isSet(locations, IJavaSearchConstants.INSTANCEOF_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_instanceof_description);
}
if (isSet(locations, IJavaSearchConstants.TYPE_ARGUMENT_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_type_arguments_description);
}
if (isSet(locations, IJavaSearchConstants.CAST_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_casts_description);
}
if (isSet(locations, IJavaSearchConstants.CATCH_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_catch_clauses_description);
}
if (isSet(locations, IJavaSearchConstants.CLASS_INSTANCE_CREATION_TYPE_REFERENCE)) {
args.add(SearchMessages.MatchLocations_class_instance_description);
}
if (isSet(locations, IJavaSearchConstants.SUPER_REFERENCE)) {
args.add(SearchMessages.MatchLocations_super_description);
}
if (isSet(locations, IJavaSearchConstants.QUALIFIED_REFERENCE)) {
args.add(SearchMessages.MatchLocations_qualified_description);
}
if (isSet(locations, IJavaSearchConstants.THIS_REFERENCE)) {
args.add(SearchMessages.MatchLocations_this_description);
}
if (isSet(locations, IJavaSearchConstants.IMPLICIT_THIS_REFERENCE)) {
args.add(SearchMessages.MatchLocations_implicit_this_description);
}
if (args.size() == 1) {
return args.get(0);
}
StringBuffer buf= new StringBuffer();
for (int i= 0; i < args.size(); i++) {
if (i > 0) {
buf.append(JavaElementLabels.COMMA_STRING);
}
buf.append(args.get(i));
}
return buf.toString();
}
private static boolean isSet(int flags, int flag) {
return (flags & flag) != 0;
}
public static int getTotalNumberOfSettings(int searchFor) {
if (searchFor == IJavaSearchConstants.TYPE) {
return 15;
} else if (searchFor == IJavaSearchConstants.METHOD || searchFor == IJavaSearchConstants.FIELD) {
return 4;
}
return 0;
}
public static int getNumberOfSelectedSettings(int locations, int searchFor) {
int count= 0;
if (searchFor == IJavaSearchConstants.TYPE) {
if (isSet(locations, IJavaSearchConstants.IMPORT_DECLARATION_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.FIELD_DECLARATION_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.LOCAL_VARIABLE_DECLARATION_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.RETURN_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.PARAMETER_DECLARATION_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.THROWS_CLAUSE_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.TYPE_VARIABLE_BOUND_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.WILDCARD_BOUND_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.INSTANCEOF_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.TYPE_ARGUMENT_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.CAST_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.CATCH_TYPE_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.CLASS_INSTANCE_CREATION_TYPE_REFERENCE)) {
count++;
}
} else if (searchFor == IJavaSearchConstants.METHOD || searchFor == IJavaSearchConstants.FIELD) {
if (isSet(locations, IJavaSearchConstants.SUPER_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.QUALIFIED_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.THIS_REFERENCE)) {
count++;
}
if (isSet(locations, IJavaSearchConstants.IMPLICIT_THIS_REFERENCE)) {
count++;
}
}
return count;
}
}