blob: abbb0fa64922eed6c50680a568cf3bf7be36cfc0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2019 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchMatch;
import org.eclipse.jdt.core.search.SearchParticipant;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.SearchRequestor;
import org.eclipse.jdt.internal.debug.core.logicalstructures.JavaLogicalStructure;
import org.eclipse.jdt.internal.debug.ui.contentassist.DynamicTypeContext;
import org.eclipse.jdt.internal.debug.ui.contentassist.DynamicTypeContext.ITypeProvider;
import org.eclipse.jdt.internal.debug.ui.contentassist.JavaDebugContentAssistProcessor;
import org.eclipse.jdt.internal.debug.ui.display.DisplayViewerConfiguration;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.text.IJavaPartitions;
import org.eclipse.jdt.ui.text.JavaTextTools;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
/**
* A dialog that allows users to create/edit logical structures.
*/
public class EditLogicalStructureDialog extends StatusDialog implements Listener, ISelectionChangedListener, IDocumentListener, ITypeProvider {
public class AttributesContentProvider implements IStructuredContentProvider {
private final List<String[]> fVariables;
public AttributesContentProvider(String[][] variables) {
fVariables= new ArrayList<>();
for (String[] v : variables) {
String[] variable= new String[2];
variable[0] = v[0];
variable[1] = v[1];
fVariables.add(variable);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements(Object inputElement) {
return getElements();
}
/**
* Returns the attributes.
* @return the elements
*/
public String[][] getElements() {
return fVariables.toArray(new String[fVariables.size()][]);
}
/**
* Adds the given attributes.
* @param newAttribute the new attribute
*/
public void add(String[] newAttribute) {
fVariables.add(newAttribute);
}
/**
* Remove the given attributes
* @param list the list
*/
public void remove(List<String[]> list) {
fVariables.removeAll(list);
}
/**
* Moves the given attributes up in the list.
* @param list the list
*/
public void up(List<String[]> list) {
for (String[] variable : list) {
int index= fVariables.indexOf(variable);
fVariables.remove(variable);
fVariables.add(index - 1, variable);
}
}
/**
* Moves the given attributes down int the list.
* @param list the list
*/
public void down(List<String[]> list) {
for (String[] variable : list) {
int index= fVariables.indexOf(variable);
fVariables.remove(variable);
fVariables.add(index + 1, variable);
}
}
}
public class AttributesLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
return ((String[])element)[0];
}
}
private final JavaLogicalStructure fLogicalStructure;
private Text fQualifiedTypeNameText;
private Text fDescriptionText;
private TableViewer fAttributeListViewer;
private Button fSubTypeButton;
private Button fValueButton;
private Button fVariablesButton;
private Button fAttributeUpButton;
private Button fAttributeDownButton;
private JDISourceViewer fSnippetViewer;
private Document fSnippetDocument;
private Button fBrowseTypeButton;
private Button fAttributeAddButton;
private Button fAttributeRemoveButton;
private Text fAttributeNameText;
private Composite fAttributesContainer;
private Group fCodeGroup;
private Composite fParentComposite;
private AttributesContentProvider fAttributesContentProvider;
private String fValueTmp;
private IStructuredSelection fCurrentAttributeSelection;
private IType fType;
private boolean fTypeSearched= false;
private DisplayViewerConfiguration fViewerConfiguration;
private IHandlerActivation fHandlerActivation;
public EditLogicalStructureDialog(Shell parentShell, JavaLogicalStructure logicalStructure) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.MAX | SWT.RESIZE);
if (logicalStructure.getQualifiedTypeName().length() == 0) {
setTitle(DebugUIMessages.EditLogicalStructureDialog_32);
} else {
setTitle(DebugUIMessages.EditLogicalStructureDialog_31);
}
fLogicalStructure= logicalStructure;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getHelpSystem().setHelp(
parent,
IJavaDebugHelpContextIds.EDIT_LOGICAL_STRUCTURE_DIALOG);
fParentComposite= parent;
IHandler handler = new AbstractHandler() {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
if(fSnippetViewer.canDoOperation(ISourceViewer.CONTENTASSIST_PROPOSALS) && fSnippetViewer.getControl().isFocusControl()){
findCorrespondingType();
fSnippetViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
}
return null;
}
};
IHandlerService handlerService = workbench.getAdapter(IHandlerService.class);
fHandlerActivation = handlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, handler);
Composite container = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH);
Composite typeNameDescriptionContainer = SWTFactory.createComposite(container, container.getFont(), 2, 1, GridData.FILL_HORIZONTAL);
SWTFactory.createLabel(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_0, 2);
fQualifiedTypeNameText = SWTFactory.createSingleText(typeNameDescriptionContainer, 1);
fQualifiedTypeNameText.addListener(SWT.Modify, this);
fBrowseTypeButton = SWTFactory.createPushButton(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_1, DebugUIMessages.EditLogicalStructureDialog_25, null);
fBrowseTypeButton.addListener(SWT.Selection, this);
SWTFactory.createLabel(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_2, 2);
fDescriptionText = SWTFactory.createSingleText(typeNameDescriptionContainer, 2);
fDescriptionText.addListener(SWT.Modify, this);
fSubTypeButton = SWTFactory.createCheckButton(typeNameDescriptionContainer, DebugUIMessages.EditLogicalStructureDialog_3, null, false, 1);
fSubTypeButton.setToolTipText(DebugUIMessages.EditLogicalStructureDialog_26);
Group radioContainer= SWTFactory.createGroup(container, DebugUIMessages.EditLogicalStructureDialog_33, 1, 1, GridData.FILL_HORIZONTAL);
fValueButton = SWTFactory.createRadioButton(radioContainer, DebugUIMessages.EditLogicalStructureDialog_4);
fValueButton.addListener(SWT.Selection, this);
fVariablesButton = SWTFactory.createRadioButton(radioContainer, DebugUIMessages.EditLogicalStructureDialog_5);
fAttributesContainer = SWTFactory.createComposite(container, container.getFont(), 2, 1, GridData.FILL_HORIZONTAL);
boolean isValue = fLogicalStructure.getValue() != null;
if (!isValue) {
// creates the attribute list if needed
createAttributeListWidgets();
}
fCodeGroup = SWTFactory.createGroup(container, "", 1, 1, GridData.FILL_BOTH); //$NON-NLS-1$
createCodeGroupWidgets(isValue);
applyDialogFont(container);
initializeData();
return container;
}
/**
* Create the widgets it the code snippet editor group
* @param isValue if it is a snippet value
*/
private void createCodeGroupWidgets(boolean isValue) {
if (isValue) {
fCodeGroup.setText(DebugUIMessages.EditLogicalStructureDialog_9);
} else {
fCodeGroup.setText(DebugUIMessages.EditLogicalStructureDialog_7);
Composite attributeNameContainer = SWTFactory.createComposite(fCodeGroup, fCodeGroup.getFont(), 2, 1, GridData.FILL_HORIZONTAL);
((GridLayout)attributeNameContainer.getLayout()).marginWidth = 0;
SWTFactory.createLabel(attributeNameContainer, DebugUIMessages.EditLogicalStructureDialog_8, 1);
fAttributeNameText = SWTFactory.createSingleText(attributeNameContainer, 1);
fAttributeNameText.addListener(SWT.Modify, this);
SWTFactory.createLabel(fCodeGroup, DebugUIMessages.EditLogicalStructureDialog_9, 1);
}
// snippet viewer
fSnippetViewer= new JDISourceViewer(fCodeGroup, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
fSnippetViewer.setInput(this);
JavaTextTools tools= JDIDebugUIPlugin.getDefault().getJavaTextTools();
if (fSnippetDocument == null) {
fSnippetDocument= new Document();
fSnippetDocument.addDocumentListener(this);
}
tools.setupJavaDocumentPartitioner(fSnippetDocument, IJavaPartitions.JAVA_PARTITIONING);
if (fViewerConfiguration == null) {
fViewerConfiguration= new DisplayViewerConfiguration() {
@Override
public IContentAssistProcessor getContentAssistantProcessor() {
return new JavaDebugContentAssistProcessor(new DynamicTypeContext(EditLogicalStructureDialog.this));
}
};
}
fSnippetViewer.configure(fViewerConfiguration);
fSnippetViewer.setEditable(true);
fSnippetViewer.setDocument(fSnippetDocument);
Control control= fSnippetViewer.getControl();
GridData gd= new GridData(SWT.FILL, SWT.FILL, true, true);
gd.heightHint= convertHeightInCharsToPixels(isValue ? 20 : 10);
gd.widthHint= convertWidthInCharsToPixels(80);
control.setLayoutData(gd);
}
/**
* Create the widgets for the attribute list
*/
private void createAttributeListWidgets() {
fAttributeListViewer = new TableViewer(fAttributesContainer, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
Table table = (Table)fAttributeListViewer.getControl();
GridData gd= new GridData(SWT.FILL, SWT.FILL, true, false);
gd.heightHint= convertHeightInCharsToPixels(5);
gd.widthHint= convertWidthInCharsToPixels(10);
table.setLayoutData(gd);
table.setFont(fAttributesContainer.getFont());
if (fAttributesContentProvider == null) {
fAttributesContentProvider= new AttributesContentProvider(fLogicalStructure.getVariables());
}
fAttributeListViewer.setContentProvider(fAttributesContentProvider);
fAttributeListViewer.setLabelProvider(new AttributesLabelProvider());
fAttributeListViewer.setInput(this);
fAttributeListViewer.addSelectionChangedListener(this);
Composite attributeListButtonsCotnainer = SWTFactory.createComposite(fAttributesContainer, fAttributesContainer.getFont(), 1, 1, SWT.NONE);
fAttributeAddButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_10, DebugUIMessages.EditLogicalStructureDialog_27, null);
fAttributeAddButton.addListener(SWT.Selection, this);
fAttributeRemoveButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_11, DebugUIMessages.EditLogicalStructureDialog_28, null);
fAttributeRemoveButton.addListener(SWT.Selection, this);
fAttributeUpButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_12, DebugUIMessages.EditLogicalStructureDialog_29, null);
fAttributeUpButton.addListener(SWT.Selection, this);
fAttributeDownButton = SWTFactory.createPushButton(attributeListButtonsCotnainer, DebugUIMessages.EditLogicalStructureDialog_13, DebugUIMessages.EditLogicalStructureDialog_30, null);
fAttributeDownButton.addListener(SWT.Selection, this);
}
private void initializeData() {
fQualifiedTypeNameText.setText(fLogicalStructure.getQualifiedTypeName());
fDescriptionText.setText(fLogicalStructure.getDescription());
fSubTypeButton.setSelection(fLogicalStructure.isSubtypes());
fValueTmp= fLogicalStructure.getValue();
if (fValueTmp == null) {
fValueTmp= ""; //$NON-NLS-1$
fVariablesButton.setSelection(true);
setAttributesData(false);
} else {
fValueButton.setSelection(true);
setAttributesData(true);
}
checkValues();
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
@Override
public void handleEvent(Event event) {
Widget source= event.widget;
switch (event.type) {
case SWT.Selection:
if (source == fValueButton) {
toggleAttributesWidgets(fValueButton.getSelection());
checkValues();
} else if (source == fBrowseTypeButton) {
selectType();
} else if (source == fAttributeAddButton) {
addAttribute();
} else if (source == fAttributeRemoveButton) {
removeAttribute();
} else if (source == fAttributeUpButton) {
attributeUp();
} else if (source == fAttributeDownButton) {
attributeDown();
}
break;
case SWT.Modify:
if (source == fAttributeNameText) {
saveNewAttributeName();
checkValues();
} else if (source == fQualifiedTypeNameText) {
checkValues();
fTypeSearched= false;
} else if (source == fDescriptionText) {
checkValues();
}
break;
}
}
// code for add attribute button
private void addAttribute() {
String[] newAttribute= new String[] {DebugUIMessages.EditLogicalStructureDialog_14, DebugUIMessages.EditLogicalStructureDialog_15}; //
fAttributesContentProvider.add(newAttribute);
fAttributeListViewer.refresh();
fAttributeListViewer.setSelection(new StructuredSelection((Object)newAttribute));
}
// code for remove attribute button
private void removeAttribute() {
IStructuredSelection selection= (IStructuredSelection)fAttributeListViewer.getSelection();
if (selection.size() > 0) {
List<String[]> selectedElements= selection.toList();
Object newSelectedElement= null;
for (Object element : fAttributesContentProvider.getElements()) {
if (!selectedElements.contains(element)) {
newSelectedElement = element;
} else {
break;
}
}
fAttributesContentProvider.remove(selectedElements);
fAttributeListViewer.refresh();
if (newSelectedElement == null) {
Object[] newElements= fAttributesContentProvider.getElements();
if (newElements.length > 0) {
fAttributeListViewer.setSelection(new StructuredSelection(newElements[0]));
}
} else {
fAttributeListViewer.setSelection(new StructuredSelection(newSelectedElement));
}
}
}
// code for attribute up button
private void attributeUp() {
IStructuredSelection selection= (IStructuredSelection)fAttributeListViewer.getSelection();
if (selection.size() > 0) {
fAttributesContentProvider.up(selection.toList());
fAttributeListViewer.refresh();
fAttributeListViewer.setSelection(selection);
}
}
// code for attribute down button
private void attributeDown() {
IStructuredSelection selection= (IStructuredSelection)fAttributeListViewer.getSelection();
if (selection.size() > 0) {
fAttributesContentProvider.down(selection.toList());
fAttributeListViewer.refresh();
fAttributeListViewer.setSelection(selection);
}
}
// save the new attribute name typed by the user
private void saveNewAttributeName() {
if (fCurrentAttributeSelection.size() == 1) {
String[] variable= (String[])fCurrentAttributeSelection.getFirstElement();
variable[0]= fAttributeNameText.getText();
fAttributeListViewer.refresh(variable);
}
}
/*
* Display or hide the widgets specific to a logical structure with
* variables.
*/
private void toggleAttributesWidgets(boolean isValue) {
if (!isValue) {
// recreate the attribute list
fValueTmp= fSnippetDocument.get();
createAttributeListWidgets();
} else if (isValue) {
// dispose the attribute list
saveAttributeValue();
for (Control child : fAttributesContainer.getChildren()) {
child.dispose();
}
}
// dispose and recreate the code snippet editor group
for (Control child : fCodeGroup.getChildren()) {
child.dispose();
}
fSnippetViewer.dispose();
createCodeGroupWidgets(isValue);
setAttributesData(isValue);
fParentComposite.layout(true, true);
}
/**
* Set the data in the attributes and code widgets
* @param isValue if it is a snippet value
*/
private void setAttributesData(boolean isValue) {
if (isValue) {
fSnippetDocument.set(fValueTmp);
} else {
Object[] elements= fAttributesContentProvider.getElements(null);
fCurrentAttributeSelection= new StructuredSelection();
if (elements.length > 0) {
IStructuredSelection newSelection= new StructuredSelection(elements[0]);
fAttributeListViewer.setSelection(newSelection);
} else {
fAttributeListViewer.setSelection(fCurrentAttributeSelection);
}
}
}
// save the code to the current attribute.
private void saveAttributeValue() {
if (fCurrentAttributeSelection.size() == 1) {
((String[])fCurrentAttributeSelection.getFirstElement())[1]= fSnippetDocument.get();
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
saveAttributeValue();
fCurrentAttributeSelection= (IStructuredSelection) event.getSelection();
boolean sizeone = fCurrentAttributeSelection.size() == 1;
//update viewers
fAttributeNameText.setEnabled(sizeone);
fSnippetViewer.setEditable(sizeone);
if (sizeone) {
String[] variable = (String[]) fCurrentAttributeSelection.getFirstElement();
fAttributeNameText.setText(variable[0]);
fSnippetDocument.set(variable[1]);
fAttributeNameText.setSelection(0, variable[0].length());
fAttributeNameText.setFocus();
} else {
fAttributeNameText.setText(""); //$NON-NLS-1$
fSnippetDocument.set(""); //$NON-NLS-1$
}
//update buttons
fAttributeRemoveButton.setEnabled(fCurrentAttributeSelection.size() > 0);
int index = fAttributeListViewer.getTable().getSelectionIndex();
fAttributeUpButton.setEnabled(sizeone && (index != 0));
fAttributeDownButton.setEnabled(sizeone && (index != fAttributeListViewer.getTable().getItemCount()-1));
}
/**
* Check the values in the widgets.
*/
public void checkValues() {
StatusInfo status= new StatusInfo();
if (fQualifiedTypeNameText.getText().trim().length() == 0) {
status.setError(DebugUIMessages.EditLogicalStructureDialog_16);
} else if (fDescriptionText.getText().trim().length() == 0) {
status.setError(DebugUIMessages.EditLogicalStructureDialog_17);
} else if (fValueButton.getSelection() && fSnippetDocument.get().length() == 0) {
status.setError(DebugUIMessages.EditLogicalStructureDialog_18);
} else if (fVariablesButton.getSelection()) {
Object[] elements= fAttributesContentProvider.getElements(null);
boolean oneElementSelected= fCurrentAttributeSelection.size() == 1;
if (elements.length == 0) {
status.setError(DebugUIMessages.EditLogicalStructureDialog_19);
} else if (oneElementSelected && fAttributeNameText.getText().trim().length() == 0) {
status.setError(DebugUIMessages.EditLogicalStructureDialog_20);
} else if (oneElementSelected && fSnippetDocument.get().trim().length() == 0) {
status.setError(DebugUIMessages.EditLogicalStructureDialog_21);
} else {
for (Object element : elements) {
String[] variable = (String[]) element;
if (variable[0].trim().length() == 0) {
status.setError(DebugUIMessages.EditLogicalStructureDialog_22);
break;
}
if (variable[1].trim().length() == 0) {
if (!oneElementSelected || fCurrentAttributeSelection.getFirstElement() != variable) {
status.setError(NLS.bind(DebugUIMessages.EditLogicalStructureDialog_23, new String[] {variable[0]}));
break;
}
}
}
}
}
if (!status.isError()) {
if (fType == null && fTypeSearched) {
status.setWarning(DebugUIMessages.EditLogicalStructureDialog_24);
}
}
updateStatus(status);
}
/**
* Open the 'select type' dialog, and set the user choice into the formatter.
*/
private void selectType() {
Shell shell = getShell();
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
if (projects.length == 0) {
MessageDialog.openInformation(shell, DebugUIMessages.DetailFormatterDialog_Select_type_9, DebugUIMessages.DetailFormatterDialog_Select_type_10);
return;
}
boolean allClosed = true;
for (IProject iProject : projects) {
if (iProject.isOpen()) {
allClosed = false;
break;
}
}
if (allClosed) {
MessageDialog.openInformation(shell, DebugUIMessages.DetailFormatterDialog_Select_type_9, DebugUIMessages.DetailFormatterDialog_Select_type_10);
return;
}
SelectionDialog dialog= null;
try {
dialog= JavaUI.createTypeDialog(shell, PlatformUI.getWorkbench().getProgressService(),
SearchEngine.createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_ALL_TYPES,
false, fQualifiedTypeNameText.getText());
} catch (JavaModelException jme) {
String title= DebugUIMessages.DetailFormatterDialog_Select_type_6;
String message= DebugUIMessages.DetailFormatterDialog_Could_not_open_type_selection_dialog_for_detail_formatters_7;
ExceptionHandler.handle(jme, title, message);
return;
}
dialog.setTitle(DebugUIMessages.DetailFormatterDialog_Select_type_8);
dialog.setMessage(DebugUIMessages.DetailFormatterDialog_Select_a_type_to_format_when_displaying_its_detail_9);
if (dialog.open() == IDialogConstants.CANCEL_ID) {
return;
}
Object[] types= dialog.getResult();
if (types != null && types.length > 0) {
fType = (IType)types[0];
fQualifiedTypeNameText.setText(fType.getFullyQualifiedName());
fTypeSearched = true;
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
*/
@Override
public void documentAboutToBeChanged(DocumentEvent event) {
// nothing to do
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
*/
@Override
public void documentChanged(DocumentEvent event) {
checkValues();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
// save the new data in the logical structure
fLogicalStructure.setType(fQualifiedTypeNameText.getText().trim());
fLogicalStructure.setDescription(fDescriptionText.getText().trim());
fLogicalStructure.setSubtypes(fSubTypeButton.getSelection());
if (fValueButton.getSelection()) {
fLogicalStructure.setValue(fSnippetDocument.get());
} else {
saveAttributeValue();
fLogicalStructure.setValue(null);
}
if (fAttributesContentProvider != null) {
fLogicalStructure.setVariables(fAttributesContentProvider.getElements());
}
super.okPressed();
}
/**
* Use the Java search engine to find the type which corresponds
* to the given name.
*/
private void findCorrespondingType() {
if (fTypeSearched) {
return;
}
fType= null;
fTypeSearched= true;
final String pattern= fQualifiedTypeNameText.getText().trim().replace('$', '.');
if (pattern == null || "".equals(pattern)) { //$NON-NLS-1$
return;
}
final IProgressMonitor monitor = new NullProgressMonitor();
final SearchRequestor collector = new SearchRequestor() {
private boolean fFirst= true;
@Override
public void endReporting() {
checkValues();
}
@Override
public void acceptSearchMatch(SearchMatch match) throws CoreException {
Object enclosingElement = match.getElement();
if (!fFirst) {
return;
}
fFirst= false;
if (enclosingElement instanceof IType) {
fType= (IType) enclosingElement;
}
// stop after we find one
monitor.setCanceled(true);
}
};
SearchEngine engine= new SearchEngine(JavaCore.getWorkingCopies(null));
SearchPattern searchPattern = SearchPattern.createPattern(pattern, IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE);
IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
SearchParticipant[] participants = new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()};
try {
engine.search(searchPattern, participants, scope, collector, monitor);
} catch (CoreException e) {
JDIDebugUIPlugin.log(e);
} catch (OperationCanceledException e){
}
}
/**
* Return the type object which corresponds to the given name.
* @return the {@link IType}
*/
@Override
public IType getType() {
if (!fTypeSearched) {
findCorrespondingType();
}
return fType;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#close()
*/
@Override
public boolean close() {
IWorkbench workbench = PlatformUI.getWorkbench();
IHandlerService handlerService = workbench.getAdapter(IHandlerService.class);
handlerService.deactivateHandler(fHandlerActivation);
fSnippetViewer.dispose();
return super.close();
}
}