mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 06:05:24 +02:00
Fix for 182294: Open Type should allow to open functions and variables
This commit is contained in:
parent
30322c916c
commit
1f5832d033
10 changed files with 579 additions and 225 deletions
|
@ -0,0 +1,333 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 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:
|
||||||
|
* Anton Leherbauer (Wind River Systems) - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.internal.ui.browser.opentype;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
|
||||||
|
import org.eclipse.core.runtime.jobs.ISchedulingRule;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
|
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
|
||||||
|
import org.eclipse.jface.wizard.ProgressMonitorPart;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Event;
|
||||||
|
import org.eclipse.swt.widgets.Listener;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
import org.eclipse.ui.dialogs.FilteredList;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.browser.ITypeInfo;
|
||||||
|
import org.eclipse.cdt.core.browser.IndexTypeInfo;
|
||||||
|
import org.eclipse.cdt.core.browser.QualifiedTypeName;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||||
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
|
import org.eclipse.cdt.core.index.IndexFilter;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoMessages;
|
||||||
|
import org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.core.browser.util.IndexModelUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A dialog to select a element from a filterable list of elements.
|
||||||
|
*
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public class ElementSelectionDialog extends TypeSelectionDialog {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Job to update the element list in the background.
|
||||||
|
*/
|
||||||
|
private class UpdateElementsJob extends Job {
|
||||||
|
|
||||||
|
public UpdateElementsJob(String name) {
|
||||||
|
super(name);
|
||||||
|
setSystem(true);
|
||||||
|
setUser(false);
|
||||||
|
setPriority(Job.LONG);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IStatus run(final IProgressMonitor monitor) {
|
||||||
|
monitor.beginTask(TypeInfoMessages.OpenSymbolDialog_UpdateSymbolsJob_inProgress, IProgressMonitor.UNKNOWN);
|
||||||
|
final ITypeInfo[] elements= getElementsByPrefix(fCurrentPrefix, monitor);
|
||||||
|
if (elements != null && !monitor.isCanceled()) {
|
||||||
|
final Shell shell= getShell();
|
||||||
|
if (shell != null && !shell.isDisposed()) {
|
||||||
|
Runnable update= new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if (!shell.isDisposed() && !monitor.isCanceled()) {
|
||||||
|
setListElements(elements);
|
||||||
|
done(Status.OK_STATUS);
|
||||||
|
updateOkState();
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
shell.getDisplay().asyncExec(update);
|
||||||
|
monitor.done();
|
||||||
|
return Job.ASYNC_FINISH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Status.CANCEL_STATUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A job listener for simple job status reporting.
|
||||||
|
*/
|
||||||
|
private final class UpdateJobListener extends JobChangeAdapter {
|
||||||
|
|
||||||
|
boolean fDone;
|
||||||
|
private IProgressMonitor fMonitor;
|
||||||
|
|
||||||
|
private UpdateJobListener(IProgressMonitor monitor) {
|
||||||
|
fMonitor= monitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done(IJobChangeEvent event) {
|
||||||
|
fDone= true;
|
||||||
|
final Shell shell= getShell();
|
||||||
|
if (shell != null && !shell.isDisposed()) {
|
||||||
|
Runnable update= new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if (!shell.isDisposed() && fDone) {
|
||||||
|
fMonitor.done();
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
shell.getDisplay().asyncExec(update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void running(final IJobChangeEvent event) {
|
||||||
|
fDone= false;
|
||||||
|
final Shell shell= getShell();
|
||||||
|
if (shell != null && !shell.isDisposed()) {
|
||||||
|
Runnable update= new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if (!shell.isDisposed() && !fDone) {
|
||||||
|
fMonitor.beginTask(TypeInfoMessages.OpenSymbolDialog_UpdateSymbolsJob_inProgress, IProgressMonitor.UNKNOWN);
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
shell.getDisplay().asyncExec(update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final ISchedulingRule SINGLE_INSTANCE_RULE = new ISchedulingRule() {
|
||||||
|
public boolean contains(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}
|
||||||
|
public boolean isConflicting(ISchedulingRule rule) {
|
||||||
|
return rule == this;
|
||||||
|
}};
|
||||||
|
|
||||||
|
private char[] fCurrentPrefix= {};
|
||||||
|
private Job fUpdateJob;
|
||||||
|
private boolean fAllowEmptyPrefix;
|
||||||
|
private ProgressMonitorPart fProgressMonitorPart;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs an instance of <code>OpenTypeDialog</code>.
|
||||||
|
* @param parent the parent shell.
|
||||||
|
*/
|
||||||
|
public ElementSelectionDialog(Shell parent) {
|
||||||
|
super(parent);
|
||||||
|
fUpdateJob= new UpdateElementsJob(TypeInfoMessages.OpenSymbolDialog_UpdateSymbolsJob_name);
|
||||||
|
fUpdateJob.setRule(SINGLE_INSTANCE_RULE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog#create()
|
||||||
|
*/
|
||||||
|
public void create() {
|
||||||
|
super.create();
|
||||||
|
// trigger initial query
|
||||||
|
scheduleUpdate(getFilter());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog#close()
|
||||||
|
*/
|
||||||
|
public boolean close() {
|
||||||
|
fUpdateJob.cancel();
|
||||||
|
return super.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.dialogs.AbstractElementListSelectionDialog#setMatchEmptyString(boolean)
|
||||||
|
*/
|
||||||
|
public void setMatchEmptyString(boolean matchEmptyString) {
|
||||||
|
super.setMatchEmptyString(matchEmptyString);
|
||||||
|
setAllowEmptyPrefix(matchEmptyString);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set whether an empty prefix should be allowed for queries.
|
||||||
|
*
|
||||||
|
* @param allowEmptyPrefix
|
||||||
|
*/
|
||||||
|
public void setAllowEmptyPrefix(boolean allowEmptyPrefix) {
|
||||||
|
fAllowEmptyPrefix = allowEmptyPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog#showLowLevelFilter()
|
||||||
|
*/
|
||||||
|
protected boolean showLowLevelFilter() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog#createFilteredList(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
protected FilteredList createFilteredList(Composite parent) {
|
||||||
|
FilteredList list= super.createFilteredList(parent);
|
||||||
|
createProgressMonitorPart(parent);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the control for progress reporting.
|
||||||
|
* @param parent
|
||||||
|
*/
|
||||||
|
private void createProgressMonitorPart(Composite parent) {
|
||||||
|
fProgressMonitorPart= new ProgressMonitorPart(parent, new GridLayout(2, false));
|
||||||
|
GridData gridData= new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
gridData.horizontalIndent= 0;
|
||||||
|
gridData.verticalAlignment= GridData.BEGINNING;
|
||||||
|
fProgressMonitorPart.setLayoutData(gridData);
|
||||||
|
fUpdateJob.addJobChangeListener(new UpdateJobListener(fProgressMonitorPart));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the elements for the given prefix.
|
||||||
|
*
|
||||||
|
* @param prefix
|
||||||
|
* @param monitor
|
||||||
|
*/
|
||||||
|
protected ITypeInfo[] getElementsByPrefix(char[] prefix, IProgressMonitor monitor) {
|
||||||
|
if (monitor.isCanceled()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List types = new ArrayList();
|
||||||
|
if(prefix.length > 0 || fAllowEmptyPrefix) {
|
||||||
|
try {
|
||||||
|
IIndex index = CCorePlugin.getIndexManager().getIndex(CoreModel.getDefault().getCModel().getCProjects());
|
||||||
|
try {
|
||||||
|
index.acquireReadLock();
|
||||||
|
IBinding[] bindings= index.findBindingsForPrefix(prefix, false, IndexFilter.ALL);
|
||||||
|
// IBinding[] bindings= index.findBindingsForPrefix(prefix, false, IndexFilter.ALL, monitor);
|
||||||
|
for(int i=0; i<bindings.length; i++) {
|
||||||
|
if ((i % 100) == 0 && monitor.isCanceled()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
IBinding binding = bindings[i];
|
||||||
|
try {
|
||||||
|
String[] fqn;
|
||||||
|
|
||||||
|
if(binding instanceof ICPPBinding) {
|
||||||
|
fqn= ((ICPPBinding)binding).getQualifiedName();
|
||||||
|
} else {
|
||||||
|
fqn = new String[] {binding.getName()};
|
||||||
|
}
|
||||||
|
final int elementType = IndexModelUtil.getElementType(binding);
|
||||||
|
if (isVisibleType(elementType)) {
|
||||||
|
if (binding instanceof IFunction) {
|
||||||
|
final IFunction function = (IFunction)binding;
|
||||||
|
final String[] paramTypes = IndexModelUtil.extractParameterTypes(function);
|
||||||
|
final String returnType= IndexModelUtil.extractReturnType(function);
|
||||||
|
types.add(new IndexTypeInfo(fqn, elementType, paramTypes, returnType, index));
|
||||||
|
} else {
|
||||||
|
types.add(new IndexTypeInfo(fqn, elementType, index));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(DOMException de) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
index.releaseReadLock();
|
||||||
|
}
|
||||||
|
} catch(CoreException ce) {
|
||||||
|
CCorePlugin.log(ce);
|
||||||
|
} catch(InterruptedException ie) {
|
||||||
|
CCorePlugin.log(ie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (ITypeInfo[])types.toArray(new ITypeInfo[types.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void setListElements(Object[] elements) {
|
||||||
|
super.setListElements(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Unsupported
|
||||||
|
*/
|
||||||
|
public void setElements(Object[] elements) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void handleEmptyList() {
|
||||||
|
updateOkState();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Text createFilterText(Composite parent) {
|
||||||
|
final Text result = super.createFilterText(parent);
|
||||||
|
Listener listener = new Listener() {
|
||||||
|
public void handleEvent(Event e) {
|
||||||
|
scheduleUpdate(result.getText());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
result.addListener(SWT.Modify, listener);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void scheduleUpdate(String filterText) {
|
||||||
|
char[] newPrefix= toPrefix(filterText);
|
||||||
|
if (!isEquivalentPrefix(fCurrentPrefix, newPrefix)) {
|
||||||
|
fUpdateJob.cancel();
|
||||||
|
fCurrentPrefix= newPrefix;
|
||||||
|
fUpdateJob.schedule(200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private char[] toPrefix(String userFilter) {
|
||||||
|
QualifiedTypeName qualifiedName= new QualifiedTypeName(userFilter);
|
||||||
|
if (qualifiedName.segmentCount() > 1) {
|
||||||
|
userFilter= qualifiedName.lastSegment();
|
||||||
|
}
|
||||||
|
userFilter= userFilter.trim().replaceAll("^(\\*)*", ""); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
int asterix= userFilter.indexOf("*"); //$NON-NLS-1$
|
||||||
|
return (asterix==-1 ? userFilter : userFilter.substring(0, asterix)).toCharArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isEquivalentPrefix(char[] currentPrefix, char[] newPrefix) {
|
||||||
|
if (currentPrefix.length == 0 || currentPrefix.length > newPrefix.length) {
|
||||||
|
return false;
|
||||||
|
} else if (newPrefix.length == currentPrefix.length) {
|
||||||
|
return Arrays.equals(currentPrefix, newPrefix);
|
||||||
|
}
|
||||||
|
return new String(currentPrefix).equals(new String(newPrefix, 0, currentPrefix.length));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2004, 2006 QNX Software Systems and others.
|
* Copyright (c) 2004, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - initial API and implementation
|
* QNX Software Systems - initial API and implementation
|
||||||
* Andrew Ferguson (Symbian)
|
* Andrew Ferguson (Symbian)
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.browser.opentype;
|
package org.eclipse.cdt.internal.ui.browser.opentype;
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ public class OpenTypeAction implements IWorkbenchWindowActionDelegate {
|
||||||
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
|
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
|
||||||
*/
|
*/
|
||||||
public void run(IAction action) {
|
public void run(IAction action) {
|
||||||
OpenTypeDialog dialog = new OpenTypeDialog(getShell());
|
ElementSelectionDialog dialog = new ElementSelectionDialog(getShell());
|
||||||
configureDialog(dialog);
|
configureDialog(dialog);
|
||||||
int result = dialog.open();
|
int result = dialog.open();
|
||||||
if (result != IDialogConstants.OK_ID)
|
if (result != IDialogConstants.OK_ID)
|
||||||
|
@ -72,7 +73,9 @@ public class OpenTypeAction implements IWorkbenchWindowActionDelegate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureDialog(OpenTypeDialog dialog) {
|
private void configureDialog(ElementSelectionDialog dialog) {
|
||||||
|
dialog.setTitle(OpenTypeMessages.getString("OpenTypeDialog.title")); //$NON-NLS-1$
|
||||||
|
dialog.setMessage(OpenTypeMessages.getString("OpenTypeDialog.message")); //$NON-NLS-1$
|
||||||
dialog.setDialogSettings(getClass().getName());
|
dialog.setDialogSettings(getClass().getName());
|
||||||
if (fWorkbenchWindow != null) {
|
if (fWorkbenchWindow != null) {
|
||||||
IWorkbenchPage page= fWorkbenchWindow.getActivePage();
|
IWorkbenchPage page= fWorkbenchWindow.getActivePage();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2004, 2006, 2007 IBM Corporation and others.
|
* Copyright (c) 2004, 2007 IBM Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -9,40 +9,19 @@
|
||||||
* IBM Corporation - initial API and implementation
|
* IBM Corporation - initial API and implementation
|
||||||
* QNX Software Systems - adapted for use in CDT
|
* QNX Software Systems - adapted for use in CDT
|
||||||
* Andrew Ferguson (Symbian)
|
* Andrew Ferguson (Symbian)
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.browser.opentype;
|
package org.eclipse.cdt.internal.ui.browser.opentype;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.eclipse.swt.widgets.Event;
|
|
||||||
import org.eclipse.swt.widgets.Listener;
|
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.swt.widgets.Text;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.browser.ITypeInfo;
|
|
||||||
import org.eclipse.cdt.core.browser.IndexTypeInfo;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
|
||||||
import org.eclipse.cdt.core.index.IIndex;
|
|
||||||
import org.eclipse.cdt.core.index.IndexFilter;
|
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
|
||||||
import org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.core.browser.util.IndexModelUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A dialog to select a type from a list of types. The selected type will be
|
* A dialog to select a type from a list of types.
|
||||||
* opened in the editor.
|
*
|
||||||
|
* @deprecated Use {@link ElementSelectionDialog} instead.
|
||||||
*/
|
*/
|
||||||
public class OpenTypeDialog extends TypeSelectionDialog {
|
public class OpenTypeDialog extends ElementSelectionDialog {
|
||||||
|
|
||||||
private static final String DIALOG_SETTINGS= OpenTypeDialog.class.getName();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs an instance of <code>OpenTypeDialog</code>.
|
* Constructs an instance of <code>OpenTypeDialog</code>.
|
||||||
|
@ -50,83 +29,5 @@ public class OpenTypeDialog extends TypeSelectionDialog {
|
||||||
*/
|
*/
|
||||||
public OpenTypeDialog(Shell parent) {
|
public OpenTypeDialog(Shell parent) {
|
||||||
super(parent);
|
super(parent);
|
||||||
setTitle(OpenTypeMessages.getString("OpenTypeDialog.title")); //$NON-NLS-1$
|
|
||||||
setMessage(OpenTypeMessages.getString("OpenTypeDialog.message")); //$NON-NLS-1$
|
|
||||||
setDialogSettings(DIALOG_SETTINGS);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char[] toPrefix(String userFilter) {
|
|
||||||
userFilter= userFilter.trim().replaceAll("^(\\*)*", ""); //$NON-NLS-1$//$NON-NLS-2$
|
|
||||||
int asterix= userFilter.indexOf("*"); //$NON-NLS-1$
|
|
||||||
return (asterix==-1 ? userFilter : userFilter.substring(0, asterix)).toCharArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the list of elements in AbstractElementListSelectionDialog
|
|
||||||
*
|
|
||||||
* Filtering on wildcards and types is done by the superclass - we just provide
|
|
||||||
* a good starting point
|
|
||||||
* @param userFilter
|
|
||||||
*/
|
|
||||||
public void update(String userFilter) {
|
|
||||||
char[] prefix = toPrefix(userFilter);
|
|
||||||
List types = new ArrayList();
|
|
||||||
if(prefix.length>0)
|
|
||||||
try {
|
|
||||||
IIndex index = CCorePlugin.getIndexManager().getIndex(CoreModel.getDefault().getCModel().getCProjects());
|
|
||||||
try {
|
|
||||||
index.acquireReadLock();
|
|
||||||
IBinding[] bindings= index.findBindingsForPrefix(prefix, false, IndexFilter.ALL);
|
|
||||||
for(int i=0; i<bindings.length; i++) {
|
|
||||||
IBinding binding = bindings[i];
|
|
||||||
try {
|
|
||||||
String[] fqn;
|
|
||||||
|
|
||||||
if(binding instanceof ICPPBinding) {
|
|
||||||
fqn= ((ICPPBinding)binding).getQualifiedName();
|
|
||||||
} else {
|
|
||||||
fqn = new String[] {binding.getName()};
|
|
||||||
}
|
|
||||||
types.add(new IndexTypeInfo(fqn, IndexModelUtil.getElementType(binding), index));
|
|
||||||
} catch(DOMException de) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
index.releaseReadLock();
|
|
||||||
}
|
|
||||||
} catch(CoreException ce) {
|
|
||||||
CCorePlugin.log(ce);
|
|
||||||
} catch(InterruptedException ie) {
|
|
||||||
CCorePlugin.log(ie);
|
|
||||||
}
|
|
||||||
setListElements(types.toArray(new ITypeInfo[types.size()]));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setListElements(Object[] elements) {
|
|
||||||
super.setListElements(elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
public void setElements(Object[] elements) {
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void handleEmptyList() {
|
|
||||||
update(getFilter());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Text createFilterText(Composite parent) {
|
|
||||||
final Text result = super.createFilterText(parent);
|
|
||||||
Listener listener = new Listener() {
|
|
||||||
public void handleEvent(Event e) {
|
|
||||||
update(result.getText());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
result.addListener(SWT.Modify, listener);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,19 +7,20 @@
|
||||||
#
|
#
|
||||||
# Contributors:
|
# Contributors:
|
||||||
# QNX Software Systems - Initial API and implementation
|
# QNX Software Systems - Initial API and implementation
|
||||||
|
# Anton Leherbauer (Wind River Systems)
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
OpenTypeAction.exception.title=Exception
|
OpenTypeAction.exception.title=Exception
|
||||||
OpenTypeAction.exception.message=Unexpected exception. See log for details.
|
OpenTypeAction.exception.message=Unexpected exception. See log for details.
|
||||||
OpenTypeAction.notypes.title=Type Selection
|
OpenTypeAction.notypes.title=Element Selection
|
||||||
OpenTypeAction.notypes.message=No types available.
|
OpenTypeAction.notypes.message=No elements available.
|
||||||
OpenTypeAction.description=Open a type in the editor
|
OpenTypeAction.description=Open an element in an Editor
|
||||||
OpenTypeAction.tooltip=Open a Type
|
OpenTypeAction.tooltip=Open an Element
|
||||||
OpenTypeAction.label=Open Type...
|
OpenTypeAction.label=Open Element...
|
||||||
OpenTypeAction.errorTitle=Open Type
|
OpenTypeAction.errorTitle=Open Element
|
||||||
OpenTypeAction.errorOpenEditor=Error opening editor for file \"{0}\"
|
OpenTypeAction.errorOpenEditor=Error opening editor for file \"{0}\"
|
||||||
OpenTypeAction.errorTypeNotFound=Could not locate definition of type \"{0}\"
|
OpenTypeAction.errorTypeNotFound=Could not locate definition of element \"{0}\"
|
||||||
|
|
||||||
OpenTypeDialog.title=Open Type
|
OpenTypeDialog.title=Open Element
|
||||||
OpenTypeDialog.message=&Choose a type (? = any character, * = any string):
|
OpenTypeDialog.message=&Choose an element (? = any character, * = any string):
|
||||||
OpenTypeDialog.filter=
|
OpenTypeDialog.filter=
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2004, 2006 IBM Corporation and others.
|
* Copyright (c) 2004, 2007 IBM Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
* IBM Corporation - initial API and implementation
|
* IBM Corporation - initial API and implementation
|
||||||
* QNX Software Systems - adapted for use in CDT
|
* QNX Software Systems - adapted for use in CDT
|
||||||
* Andrew Ferguson (Symbian)
|
* Andrew Ferguson (Symbian)
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.ui.browser.typeinfo;
|
package org.eclipse.cdt.ui.browser.typeinfo;
|
||||||
|
|
||||||
|
@ -17,21 +18,28 @@ import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.jface.viewers.LabelProvider;
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
import org.eclipse.swt.graphics.Image;
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.browser.IFunctionInfo;
|
||||||
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
|
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
|
||||||
import org.eclipse.cdt.core.browser.ITypeInfo;
|
import org.eclipse.cdt.core.browser.ITypeInfo;
|
||||||
import org.eclipse.cdt.core.browser.ITypeReference;
|
import org.eclipse.cdt.core.browser.ITypeReference;
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IVariableDeclaration;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.core.model.FunctionDeclaration;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.CPluginImages;
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
|
||||||
public class TypeInfoLabelProvider extends LabelProvider {
|
public class TypeInfoLabelProvider extends LabelProvider {
|
||||||
|
|
||||||
public static final int SHOW_TYPE_ONLY= 0x01;
|
public static final int SHOW_NAME_ONLY= 0x01;
|
||||||
public static final int SHOW_ENCLOSING_TYPE_ONLY= 0x02;
|
public static final int SHOW_ENCLOSING_TYPE_ONLY= 0x02;
|
||||||
public static final int SHOW_FULLY_QUALIFIED= 0x04;
|
public static final int SHOW_FULLY_QUALIFIED= 0x04;
|
||||||
public static final int SHOW_PATH= 0x08;
|
public static final int SHOW_PATH= 0x08;
|
||||||
|
public static final int SHOW_PARAMETERS= 0x10;
|
||||||
|
public static final int SHOW_RETURN_TYPE= 0x20;
|
||||||
|
|
||||||
private static final Image HEADER_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_TUNIT_HEADER);
|
private static final Image HEADER_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_TUNIT_HEADER);
|
||||||
private static final Image SOURCE_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_TUNIT);
|
private static final Image SOURCE_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_TUNIT);
|
||||||
|
@ -42,6 +50,8 @@ public class TypeInfoLabelProvider extends LabelProvider {
|
||||||
private static final Image TYPEDEF_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_TYPEDEF);
|
private static final Image TYPEDEF_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_TYPEDEF);
|
||||||
private static final Image UNION_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_UNION);
|
private static final Image UNION_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_UNION);
|
||||||
private static final Image ENUM_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_ENUMERATION);
|
private static final Image ENUM_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_ENUMERATION);
|
||||||
|
private static final Image FUNCTION_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_FUNCTION);
|
||||||
|
private static final Image VARIABLE_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_VARIABLE);
|
||||||
private static final Image UNKNOWN_TYPE_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_UNKNOWN_TYPE);
|
private static final Image UNKNOWN_TYPE_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_UNKNOWN_TYPE);
|
||||||
|
|
||||||
private int fFlags;
|
private int fFlags;
|
||||||
|
@ -61,12 +71,12 @@ public class TypeInfoLabelProvider extends LabelProvider {
|
||||||
if (! (element instanceof ITypeInfo))
|
if (! (element instanceof ITypeInfo))
|
||||||
return super.getText(element);
|
return super.getText(element);
|
||||||
|
|
||||||
ITypeInfo typeRef= (ITypeInfo) element;
|
ITypeInfo typeInfo= (ITypeInfo) element;
|
||||||
IQualifiedTypeName qualifiedName = typeRef.getQualifiedTypeName();
|
IQualifiedTypeName qualifiedName = typeInfo.getQualifiedTypeName();
|
||||||
|
|
||||||
StringBuffer buf= new StringBuffer();
|
StringBuffer buf= new StringBuffer();
|
||||||
if (isSet(SHOW_TYPE_ONLY)) {
|
if (isSet(SHOW_NAME_ONLY)) {
|
||||||
String name= typeRef.getName();
|
String name= typeInfo.getName();
|
||||||
if (name != null && name.length() > 0)
|
if (name != null && name.length() > 0)
|
||||||
buf.append(name);
|
buf.append(name);
|
||||||
} else if (isSet(SHOW_ENCLOSING_TYPE_ONLY)) {
|
} else if (isSet(SHOW_ENCLOSING_TYPE_ONLY)) {
|
||||||
|
@ -74,25 +84,68 @@ public class TypeInfoLabelProvider extends LabelProvider {
|
||||||
if (parentName != null) {
|
if (parentName != null) {
|
||||||
buf.append(parentName.getFullyQualifiedName());
|
buf.append(parentName.getFullyQualifiedName());
|
||||||
} else {
|
} else {
|
||||||
buf.append(TypeInfoMessages.getString("TypeInfoLabelProvider.globalScope")); //$NON-NLS-1$
|
buf.append(TypeInfoMessages.TypeInfoLabelProvider_globalScope);
|
||||||
}
|
}
|
||||||
} else if (isSet(SHOW_FULLY_QUALIFIED)) {
|
} else if (isSet(SHOW_FULLY_QUALIFIED)) {
|
||||||
|
if (qualifiedName.isGlobal()) {
|
||||||
|
buf.append(TypeInfoMessages.TypeInfoLabelProvider_globalScope);
|
||||||
|
buf.append(' ');
|
||||||
|
}
|
||||||
buf.append(qualifiedName.getFullyQualifiedName());
|
buf.append(qualifiedName.getFullyQualifiedName());
|
||||||
}
|
}
|
||||||
|
if (isSet(SHOW_PARAMETERS) && typeInfo.getCElementType() == ICElement.C_FUNCTION) {
|
||||||
|
if (typeInfo instanceof IFunctionInfo) {
|
||||||
|
IFunctionInfo functionInfo= (IFunctionInfo)typeInfo;
|
||||||
|
String[] params= functionInfo.getParameters();
|
||||||
|
if (params != null) {
|
||||||
|
buf.append(FunctionDeclaration.getParameterClause(params));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isSet(SHOW_RETURN_TYPE)) {
|
||||||
|
switch(typeInfo.getCElementType()) {
|
||||||
|
case ICElement.C_FUNCTION:
|
||||||
|
if (typeInfo instanceof IFunctionInfo) {
|
||||||
|
IFunctionInfo functionInfo= (IFunctionInfo)typeInfo;
|
||||||
|
String returnType= functionInfo.getReturnType();
|
||||||
|
if (returnType != null && returnType.length() > 0) {
|
||||||
|
buf.append(TypeInfoMessages.TypeInfoLabelProvider_colon);
|
||||||
|
buf.append(returnType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case ICElement.C_VARIABLE:
|
||||||
|
ITypeReference ref= typeInfo.getResolvedReference();
|
||||||
|
if (ref != null) {
|
||||||
|
ICElement[] cElements= ref.getCElements();
|
||||||
|
if (cElements != null && cElements.length > 0) {
|
||||||
|
String returnType= null;
|
||||||
|
if (cElements[0] instanceof IVariableDeclaration) {
|
||||||
|
try {
|
||||||
|
returnType= ((IVariableDeclaration)cElements[0]).getTypeName();
|
||||||
|
} catch (CModelException exc) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (returnType != null && returnType.length() > 0) {
|
||||||
|
buf.append(TypeInfoMessages.TypeInfoLabelProvider_colon);
|
||||||
|
buf.append(returnType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (isSet(SHOW_PATH)) {
|
if (isSet(SHOW_PATH)) {
|
||||||
IPath path = null;
|
IPath path = null;
|
||||||
ITypeReference ref = typeRef.getResolvedReference();
|
ITypeReference ref = typeInfo.getResolvedReference();
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
path = ref.getPath();
|
path = ref.getPath();
|
||||||
} else {
|
} else {
|
||||||
ICProject project = typeRef.getEnclosingProject();
|
ICProject project = typeInfo.getEnclosingProject();
|
||||||
if (project != null) {
|
if (project != null) {
|
||||||
path = project.getProject().getFullPath();
|
path = project.getProject().getFullPath();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
buf.append(TypeInfoMessages.getString("TypeInfoLabelProvider.dash"));//$NON-NLS-1$
|
buf.append(TypeInfoMessages.TypeInfoLabelProvider_dash);
|
||||||
buf.append(path.toString());
|
buf.append(path.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -156,6 +209,12 @@ public class TypeInfoLabelProvider extends LabelProvider {
|
||||||
case ICElement.C_TYPEDEF:
|
case ICElement.C_TYPEDEF:
|
||||||
return TYPEDEF_ICON;
|
return TYPEDEF_ICON;
|
||||||
|
|
||||||
|
case ICElement.C_FUNCTION:
|
||||||
|
return FUNCTION_ICON;
|
||||||
|
|
||||||
|
case ICElement.C_VARIABLE:
|
||||||
|
return VARIABLE_ICON;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return UNKNOWN_TYPE_ICON;
|
return UNKNOWN_TYPE_ICON;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2004, 2006 QNX Software Systems and others.
|
* Copyright (c) 2004, 2007 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -7,44 +7,40 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - initial API and implementation
|
* QNX Software Systems - initial API and implementation
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.ui.browser.typeinfo;
|
package org.eclipse.cdt.ui.browser.typeinfo;
|
||||||
|
|
||||||
import java.text.MessageFormat;
|
import org.eclipse.osgi.util.NLS;
|
||||||
import java.util.MissingResourceException;
|
|
||||||
import java.util.ResourceBundle;
|
|
||||||
|
|
||||||
public class TypeInfoMessages {
|
public final class TypeInfoMessages extends NLS {
|
||||||
|
|
||||||
private static final String RESOURCE_BUNDLE= TypeInfoMessages.class.getName();
|
private static final String BUNDLE_NAME = "org.eclipse.cdt.ui.browser.typeinfo.TypeInfoMessages";//$NON-NLS-1$
|
||||||
|
|
||||||
private static ResourceBundle fgResourceBundle;
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
fgResourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE);
|
|
||||||
} catch (MissingResourceException x) {
|
|
||||||
fgResourceBundle = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TypeInfoMessages() {
|
private TypeInfoMessages() {
|
||||||
|
// Do not instantiate
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getString(String key) {
|
public static String OpenSymbolDialog_UpdateSymbolsJob_name;
|
||||||
try {
|
public static String OpenSymbolDialog_UpdateSymbolsJob_inProgress;
|
||||||
return fgResourceBundle.getString(key);
|
public static String TypeSelectionDialog_lowerLabel;
|
||||||
} catch (MissingResourceException e) {
|
public static String TypeSelectionDialog_upperLabel;
|
||||||
return '!' + key + '!';
|
public static String TypeSelectionDialog_filterLabel;
|
||||||
} catch (NullPointerException e) {
|
public static String TypeSelectionDialog_filterNamespaces;
|
||||||
return "#" + key + "#"; //$NON-NLS-1$ //$NON-NLS-2$
|
public static String TypeSelectionDialog_filterClasses;
|
||||||
}
|
public static String TypeSelectionDialog_filterStructs;
|
||||||
|
public static String TypeSelectionDialog_filterTypedefs;
|
||||||
|
public static String TypeSelectionDialog_filterEnums;
|
||||||
|
public static String TypeSelectionDialog_filterUnions;
|
||||||
|
public static String TypeSelectionDialog_filterFunctions;
|
||||||
|
public static String TypeSelectionDialog_filterVariables;
|
||||||
|
public static String TypeSelectionDialog_filterLowLevelTypes;
|
||||||
|
public static String TypeInfoLabelProvider_default_filename;
|
||||||
|
public static String TypeInfoLabelProvider_globalScope;
|
||||||
|
public static String TypeInfoLabelProvider_dash;
|
||||||
|
public static String TypeInfoLabelProvider_colon;
|
||||||
|
|
||||||
|
static {
|
||||||
|
NLS.initializeMessages(BUNDLE_NAME, TypeInfoMessages.class);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public static String getFormattedString(String key, String arg) {
|
|
||||||
return getFormattedString(key, new String[] { arg });
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getFormattedString(String key, String[] args) {
|
|
||||||
return MessageFormat.format(getString(key), args);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -7,19 +7,26 @@
|
||||||
#
|
#
|
||||||
# Contributors:
|
# Contributors:
|
||||||
# QNX Software Systems - Initial API and implementation
|
# QNX Software Systems - Initial API and implementation
|
||||||
|
# Anton Leherbauer (Wind River Systems)
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
TypeSelectionDialog.lowerLabel=&Qualifier:
|
TypeSelectionDialog_lowerLabel=&Qualified name and location:
|
||||||
TypeSelectionDialog.upperLabel=&Matching types:
|
TypeSelectionDialog_upperLabel=&Matching elements:
|
||||||
TypeSelectionDialog.filterLabel=Visible types:
|
TypeSelectionDialog_filterLabel=Visible element types:
|
||||||
TypeSelectionDialog.filterNamespaces=namespace
|
TypeSelectionDialog_filterNamespaces=&Namespace
|
||||||
TypeSelectionDialog.filterClasses=class
|
TypeSelectionDialog_filterClasses=&Class
|
||||||
TypeSelectionDialog.filterStructs=struct
|
TypeSelectionDialog_filterStructs=&Struct
|
||||||
TypeSelectionDialog.filterTypedefs=typedef
|
TypeSelectionDialog_filterTypedefs=&Typedef
|
||||||
TypeSelectionDialog.filterEnums=enum
|
TypeSelectionDialog_filterEnums=&Enumeration
|
||||||
TypeSelectionDialog.filterUnions=union
|
TypeSelectionDialog_filterUnions=&Union
|
||||||
TypeSelectionDialog.filterLowLevelTypes=Show low-level types
|
TypeSelectionDialog_filterFunctions=&Function
|
||||||
|
TypeSelectionDialog_filterVariables=&Variable
|
||||||
|
TypeSelectionDialog_filterLowLevelTypes=Show &low-level elements (names beginning with '_')
|
||||||
|
|
||||||
TypeInfoLabelProvider.default_filename=default
|
TypeInfoLabelProvider_default_filename=default
|
||||||
TypeInfoLabelProvider.globalScope=(global)
|
TypeInfoLabelProvider_globalScope=(global)
|
||||||
TypeInfoLabelProvider.dash=\ -
|
TypeInfoLabelProvider_dash=\ -\
|
||||||
|
TypeInfoLabelProvider_colon=:\
|
||||||
|
|
||||||
|
OpenSymbolDialog_UpdateSymbolsJob_name=Updating Element List
|
||||||
|
OpenSymbolDialog_UpdateSymbolsJob_inProgress=Updating Element List...
|
|
@ -9,6 +9,7 @@
|
||||||
* IBM Corporation - initial API and implementation
|
* IBM Corporation - initial API and implementation
|
||||||
* QNX Software Systems - adapted for use in CDT
|
* QNX Software Systems - adapted for use in CDT
|
||||||
* Markus Schorn (Wind River Systems)
|
* Markus Schorn (Wind River Systems)
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.ui.browser.typeinfo;
|
package org.eclipse.cdt.ui.browser.typeinfo;
|
||||||
|
|
||||||
|
@ -202,20 +203,26 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
private static final String SETTINGS_SHOW_TYPEDEFS = "show_typedefs"; //$NON-NLS-1$
|
private static final String SETTINGS_SHOW_TYPEDEFS = "show_typedefs"; //$NON-NLS-1$
|
||||||
private static final String SETTINGS_SHOW_ENUMS = "show_enums"; //$NON-NLS-1$
|
private static final String SETTINGS_SHOW_ENUMS = "show_enums"; //$NON-NLS-1$
|
||||||
private static final String SETTINGS_SHOW_UNIONS = "show_unions"; //$NON-NLS-1$
|
private static final String SETTINGS_SHOW_UNIONS = "show_unions"; //$NON-NLS-1$
|
||||||
|
private static final String SETTINGS_SHOW_FUNCTIONS = "show_functions"; //$NON-NLS-1$
|
||||||
|
private static final String SETTINGS_SHOW_VARIABLES = "show_variables"; //$NON-NLS-1$
|
||||||
private static final String SETTINGS_SHOW_LOWLEVEL = "show_lowlevel"; //$NON-NLS-1$
|
private static final String SETTINGS_SHOW_LOWLEVEL = "show_lowlevel"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final TypeInfoLabelProvider fElementRenderer = new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_TYPE_ONLY);
|
private static final TypeInfoLabelProvider fElementRenderer = new TypeInfoLabelProvider(
|
||||||
private static final TypeInfoLabelProvider fQualifierRenderer = new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_ENCLOSING_TYPE_ONLY + TypeInfoLabelProvider.SHOW_PATH);
|
TypeInfoLabelProvider.SHOW_NAME_ONLY);
|
||||||
|
private static final TypeInfoLabelProvider fQualifierRenderer = new TypeInfoLabelProvider(
|
||||||
|
TypeInfoLabelProvider.SHOW_FULLY_QUALIFIED |
|
||||||
|
TypeInfoLabelProvider.SHOW_PARAMETERS |
|
||||||
|
TypeInfoLabelProvider.SHOW_PATH);
|
||||||
|
|
||||||
private static final StringComparator fStringComparator = new StringComparator();
|
private static final StringComparator fStringComparator = new StringComparator();
|
||||||
|
|
||||||
private static final int[] fAllTypes = { ICElement.C_NAMESPACE, ICElement.C_CLASS,
|
private static final int[] ALL_TYPES = { ICElement.C_NAMESPACE, ICElement.C_CLASS,
|
||||||
ICElement.C_STRUCT, ICElement.C_TYPEDEF, ICElement.C_ENUMERATION,
|
ICElement.C_STRUCT, ICElement.C_TYPEDEF, ICElement.C_ENUMERATION,
|
||||||
ICElement.C_UNION };
|
ICElement.C_UNION, ICElement.C_FUNCTION, ICElement.C_VARIABLE };
|
||||||
|
|
||||||
// the filter matcher contains state information, must not be static
|
// the filter matcher contains state information, must not be static
|
||||||
private final TypeFilterMatcher fFilterMatcher = new TypeFilterMatcher();
|
private final TypeFilterMatcher fFilterMatcher = new TypeFilterMatcher();
|
||||||
private Set fKnownTypes = new HashSet(fAllTypes.length);
|
private Set fKnownTypes = new HashSet(ALL_TYPES.length);
|
||||||
private Text fTextWidget;
|
private Text fTextWidget;
|
||||||
private boolean fSelectFilterText = false;
|
private boolean fSelectFilterText = false;
|
||||||
private FilteredList fNewFilteredList;
|
private FilteredList fNewFilteredList;
|
||||||
|
@ -230,9 +237,9 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
public TypeSelectionDialog(Shell parent) {
|
public TypeSelectionDialog(Shell parent) {
|
||||||
super(parent, fElementRenderer, fQualifierRenderer);
|
super(parent, fElementRenderer, fQualifierRenderer);
|
||||||
setMatchEmptyString(false);
|
setMatchEmptyString(false);
|
||||||
setUpperListLabel(TypeInfoMessages.getString("TypeSelectionDialog.upperLabel")); //$NON-NLS-1$
|
setUpperListLabel(TypeInfoMessages.TypeSelectionDialog_upperLabel);
|
||||||
setLowerListLabel(TypeInfoMessages.getString("TypeSelectionDialog.lowerLabel")); //$NON-NLS-1$
|
setLowerListLabel(TypeInfoMessages.TypeSelectionDialog_lowerLabel);
|
||||||
setVisibleTypes(fAllTypes);
|
setVisibleTypes(ALL_TYPES);
|
||||||
setDialogSettings(DIALOG_SETTINGS);
|
setDialogSettings(DIALOG_SETTINGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,6 +266,18 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Answer whether the given type is visible in the dialog.
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* the type constant, see {@link ICElement}
|
||||||
|
* @return <code>true</code> if the given type is visible,
|
||||||
|
* <code>false</code> otherwise
|
||||||
|
*/
|
||||||
|
protected boolean isVisibleType(int type) {
|
||||||
|
return fKnownTypes.contains(new Integer(type));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets section name to use when storing the dialog settings.
|
* Sets section name to use when storing the dialog settings.
|
||||||
*
|
*
|
||||||
|
@ -295,8 +314,8 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
*/
|
*/
|
||||||
public void create() {
|
public void create() {
|
||||||
super.create();
|
super.create();
|
||||||
if (!fSelectFilterText)
|
if (fSelectFilterText)
|
||||||
fTextWidget.setSelection(0,0);
|
fTextWidget.selectAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -323,22 +342,28 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
int type = typeObject.intValue();
|
int type = typeObject.intValue();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ICElement.C_NAMESPACE:
|
case ICElement.C_NAMESPACE:
|
||||||
name = TypeInfoMessages.getString("TypeSelectionDialog.filterNamespaces"); //$NON-NLS-1$
|
name = TypeInfoMessages.TypeSelectionDialog_filterNamespaces;
|
||||||
break;
|
break;
|
||||||
case ICElement.C_CLASS:
|
case ICElement.C_CLASS:
|
||||||
name = TypeInfoMessages.getString("TypeSelectionDialog.filterClasses"); //$NON-NLS-1$
|
name = TypeInfoMessages.TypeSelectionDialog_filterClasses;
|
||||||
break;
|
break;
|
||||||
case ICElement.C_STRUCT:
|
case ICElement.C_STRUCT:
|
||||||
name = TypeInfoMessages.getString("TypeSelectionDialog.filterStructs"); //$NON-NLS-1$
|
name = TypeInfoMessages.TypeSelectionDialog_filterStructs;
|
||||||
break;
|
break;
|
||||||
case ICElement.C_TYPEDEF:
|
case ICElement.C_TYPEDEF:
|
||||||
name = TypeInfoMessages.getString("TypeSelectionDialog.filterTypedefs"); //$NON-NLS-1$
|
name = TypeInfoMessages.TypeSelectionDialog_filterTypedefs;
|
||||||
break;
|
break;
|
||||||
case ICElement.C_ENUMERATION:
|
case ICElement.C_ENUMERATION:
|
||||||
name = TypeInfoMessages.getString("TypeSelectionDialog.filterEnums"); //$NON-NLS-1$
|
name = TypeInfoMessages.TypeSelectionDialog_filterEnums;
|
||||||
break;
|
break;
|
||||||
case ICElement.C_UNION:
|
case ICElement.C_UNION:
|
||||||
name = TypeInfoMessages.getString("TypeSelectionDialog.filterUnions"); //$NON-NLS-1$
|
name = TypeInfoMessages.TypeSelectionDialog_filterUnions;
|
||||||
|
break;
|
||||||
|
case ICElement.C_FUNCTION:
|
||||||
|
name = TypeInfoMessages.TypeSelectionDialog_filterFunctions;
|
||||||
|
break;
|
||||||
|
case ICElement.C_VARIABLE:
|
||||||
|
name = TypeInfoMessages.TypeSelectionDialog_filterVariables;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -379,10 +404,11 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
* @param parent area to create controls in
|
* @param parent area to create controls in
|
||||||
*/
|
*/
|
||||||
private void createTypeFilterArea(Composite parent) {
|
private void createTypeFilterArea(Composite parent) {
|
||||||
createLabel(parent, TypeInfoMessages.getString("TypeSelectionDialog.filterLabel")); //$NON-NLS-1$
|
createLabel(parent, TypeInfoMessages.TypeSelectionDialog_filterLabel);
|
||||||
|
|
||||||
Composite upperRow = new Composite(parent, SWT.NONE);
|
Composite upperRow = new Composite(parent, SWT.NONE);
|
||||||
GridLayout upperLayout = new GridLayout(3, true);
|
int columns= fKnownTypes.size() > 6 ? 4 : 3;
|
||||||
|
GridLayout upperLayout = new GridLayout(columns, true);
|
||||||
upperLayout.verticalSpacing = 2;
|
upperLayout.verticalSpacing = 2;
|
||||||
upperLayout.marginHeight = 0;
|
upperLayout.marginHeight = 0;
|
||||||
upperLayout.marginWidth = 0;
|
upperLayout.marginWidth = 0;
|
||||||
|
@ -390,39 +416,41 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
|
|
||||||
// the for loop is here to guarantee we always
|
// the for loop is here to guarantee we always
|
||||||
// create the checkboxes in the same order
|
// create the checkboxes in the same order
|
||||||
for (int i = 0; i < fAllTypes.length; ++i) {
|
for (int i = 0; i < ALL_TYPES.length; ++i) {
|
||||||
Integer typeObject = new Integer(fAllTypes[i]);
|
Integer typeObject = new Integer(ALL_TYPES[i]);
|
||||||
if (fKnownTypes.contains(typeObject))
|
if (fKnownTypes.contains(typeObject))
|
||||||
createTypeCheckbox(upperRow, typeObject);
|
createTypeCheckbox(upperRow, typeObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
Composite lowerRow = new Composite(parent, SWT.NONE);
|
if (showLowLevelFilter()) {
|
||||||
GridLayout lowerLayout = new GridLayout(1, true);
|
Composite lowerRow = new Composite(parent, SWT.NONE);
|
||||||
lowerLayout.verticalSpacing = 2;
|
GridLayout lowerLayout = new GridLayout(1, true);
|
||||||
lowerLayout.marginHeight = 0;
|
lowerLayout.verticalSpacing = 2;
|
||||||
upperLayout.marginWidth = 0;
|
lowerLayout.marginHeight = 0;
|
||||||
lowerRow.setLayout(lowerLayout);
|
upperLayout.marginWidth = 0;
|
||||||
|
lowerRow.setLayout(lowerLayout);
|
||||||
|
|
||||||
Composite composite = new Composite(lowerRow, SWT.NONE);
|
Composite composite = new Composite(lowerRow, SWT.NONE);
|
||||||
GridLayout layout= new GridLayout(2, false);
|
GridLayout layout= new GridLayout(2, false);
|
||||||
layout.marginHeight = 0;
|
layout.marginHeight = 0;
|
||||||
layout.marginWidth = 0;
|
layout.marginWidth = 0;
|
||||||
composite.setLayout(layout);
|
composite.setLayout(layout);
|
||||||
|
|
||||||
String name = TypeInfoMessages.getString("TypeSelectionDialog.filterLowLevelTypes"); //$NON-NLS-1$
|
String name = TypeInfoMessages.TypeSelectionDialog_filterLowLevelTypes;
|
||||||
Button checkbox = new Button(composite, SWT.CHECK);
|
Button checkbox = new Button(composite, SWT.CHECK);
|
||||||
checkbox.setFont(composite.getFont());
|
checkbox.setFont(composite.getFont());
|
||||||
checkbox.setText(name);
|
checkbox.setText(name);
|
||||||
checkbox.setSelection(fFilterMatcher.getShowLowLevelTypes());
|
checkbox.setSelection(fFilterMatcher.getShowLowLevelTypes());
|
||||||
checkbox.addSelectionListener(new SelectionAdapter() {
|
checkbox.addSelectionListener(new SelectionAdapter() {
|
||||||
public void widgetSelected(SelectionEvent e) {
|
public void widgetSelected(SelectionEvent e) {
|
||||||
if (e.widget instanceof Button) {
|
if (e.widget instanceof Button) {
|
||||||
Button button = (Button) e.widget;
|
Button button = (Button) e.widget;
|
||||||
fFilterMatcher.setShowLowLevelTypes(button.getSelection());
|
fFilterMatcher.setShowLowLevelTypes(button.getSelection());
|
||||||
updateElements();
|
updateElements();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -466,6 +494,8 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
section.put(SETTINGS_SHOW_TYPEDEFS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_TYPEDEF)));
|
section.put(SETTINGS_SHOW_TYPEDEFS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_TYPEDEF)));
|
||||||
section.put(SETTINGS_SHOW_ENUMS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_ENUMERATION)));
|
section.put(SETTINGS_SHOW_ENUMS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_ENUMERATION)));
|
||||||
section.put(SETTINGS_SHOW_UNIONS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_UNION)));
|
section.put(SETTINGS_SHOW_UNIONS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_UNION)));
|
||||||
|
section.put(SETTINGS_SHOW_FUNCTIONS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_FUNCTION)));
|
||||||
|
section.put(SETTINGS_SHOW_VARIABLES, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_VARIABLE)));
|
||||||
section.put(SETTINGS_SHOW_LOWLEVEL, fFilterMatcher.getShowLowLevelTypes());
|
section.put(SETTINGS_SHOW_LOWLEVEL, fFilterMatcher.getShowLowLevelTypes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,6 +509,8 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
section.put(SETTINGS_SHOW_TYPEDEFS, true);
|
section.put(SETTINGS_SHOW_TYPEDEFS, true);
|
||||||
section.put(SETTINGS_SHOW_ENUMS, true);
|
section.put(SETTINGS_SHOW_ENUMS, true);
|
||||||
section.put(SETTINGS_SHOW_UNIONS, true);
|
section.put(SETTINGS_SHOW_UNIONS, true);
|
||||||
|
section.put(SETTINGS_SHOW_FUNCTIONS, true);
|
||||||
|
section.put(SETTINGS_SHOW_VARIABLES, true);
|
||||||
section.put(SETTINGS_SHOW_LOWLEVEL, false);
|
section.put(SETTINGS_SHOW_LOWLEVEL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,9 +561,30 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
||||||
if (fKnownTypes.contains(typeObject))
|
if (fKnownTypes.contains(typeObject))
|
||||||
fFilterMatcher.getVisibleTypes().add(typeObject);
|
fFilterMatcher.getVisibleTypes().add(typeObject);
|
||||||
}
|
}
|
||||||
fFilterMatcher.setShowLowLevelTypes(section.getBoolean(SETTINGS_SHOW_LOWLEVEL));
|
if (section.getBoolean(SETTINGS_SHOW_FUNCTIONS)) {
|
||||||
|
Integer typeObject = new Integer(ICElement.C_FUNCTION);
|
||||||
|
if (fKnownTypes.contains(typeObject))
|
||||||
|
fFilterMatcher.getVisibleTypes().add(typeObject);
|
||||||
|
}
|
||||||
|
if (section.getBoolean(SETTINGS_SHOW_VARIABLES)) {
|
||||||
|
Integer typeObject = new Integer(ICElement.C_VARIABLE);
|
||||||
|
if (fKnownTypes.contains(typeObject))
|
||||||
|
fFilterMatcher.getVisibleTypes().add(typeObject);
|
||||||
|
}
|
||||||
|
if (showLowLevelFilter()) {
|
||||||
|
fFilterMatcher.setShowLowLevelTypes(section.getBoolean(SETTINGS_SHOW_LOWLEVEL));
|
||||||
|
} else {
|
||||||
|
fFilterMatcher.setShowLowLevelTypes(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return whether the low level filter checkbox should be shown
|
||||||
|
*/
|
||||||
|
protected boolean showLowLevelFilter() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Cdoc)
|
/* (non-Cdoc)
|
||||||
* @see org.eclipse.jface.window.Window#getInitialSize()
|
* @see org.eclipse.jface.window.Window#getInitialSize()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
# Contributors:
|
# Contributors:
|
||||||
# IBM Corporation - initial API and implementation
|
# IBM Corporation - initial API and implementation
|
||||||
# Markus Schorn (Wind River Systems)
|
# Markus Schorn (Wind River Systems)
|
||||||
|
# Anton Leherbauer (Wind River Systems)
|
||||||
###############################################################################
|
###############################################################################
|
||||||
pluginName=C/C++ Development Tools UI
|
pluginName=C/C++ Development Tools UI
|
||||||
providerName=Eclipse.org
|
providerName=Eclipse.org
|
||||||
|
@ -192,11 +193,11 @@ CEditorPresentationActionSet.description=Actions to customize the C/C++ editor p
|
||||||
searchMenu.label= Se&arch
|
searchMenu.label= Se&arch
|
||||||
refactoringMenu.label= Re&factor
|
refactoringMenu.label= Re&factor
|
||||||
|
|
||||||
# Open Type
|
# Open Element
|
||||||
OpenTypeAction.label= Open &Type...
|
OpenTypeAction.label= Open &Element...
|
||||||
OpenTypeAction.tooltip= Open Type
|
OpenTypeAction.tooltip= Open Element
|
||||||
ActionDefinition.openType.name= Open Type
|
ActionDefinition.openType.name= Open Element
|
||||||
ActionDefinition.openType.description= Open a type in a C editor
|
ActionDefinition.openType.description= Open an element in an Editor
|
||||||
|
|
||||||
#Add include
|
#Add include
|
||||||
ActionDefinition.addInclude.name= Add Include
|
ActionDefinition.addInclude.name= Add Include
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2000, 2006 IBM Corporation and others.
|
* Copyright (c) 2000, 2007 IBM Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -273,7 +273,7 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
|
||||||
|
|
||||||
if (pdomNames.size() > 1)
|
if (pdomNames.size() > 1)
|
||||||
{
|
{
|
||||||
ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_TYPE_ONLY));
|
ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_NAME_ONLY));
|
||||||
dialog.setElements(pdomNames.toArray());
|
dialog.setElements(pdomNames.toArray());
|
||||||
dialog.setTitle(CEditorMessages.getString("AddIncludeOnSelection.label")); //$NON-NLS-1$
|
dialog.setTitle(CEditorMessages.getString("AddIncludeOnSelection.label")); //$NON-NLS-1$
|
||||||
dialog.setMessage(CEditorMessages.getString("AddIncludeOnSelection.description")); //$NON-NLS-1$
|
dialog.setMessage(CEditorMessages.getString("AddIncludeOnSelection.description")); //$NON-NLS-1$
|
||||||
|
|
Loading…
Add table
Reference in a new issue