mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
Bug 292839 - Adding a base class takes too much time in New Class
wizard.
This commit is contained in:
parent
bb0f0865d8
commit
ae0cde8d3a
6 changed files with 35 additions and 97 deletions
|
@ -48,7 +48,6 @@ import org.eclipse.cdt.ui.CUIPlugin;
|
|||
|
||||
import org.eclipse.cdt.internal.ui.util.StringMatcher;
|
||||
|
||||
|
||||
/**
|
||||
* A dialog to select a type from a list of types.
|
||||
*
|
||||
|
@ -264,20 +263,19 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
public void setVisibleTypes(int[] types) {
|
||||
fKnownTypes.clear();
|
||||
for (int i = 0; i < types.length; ++i) {
|
||||
fKnownTypes.add(new Integer(types[i]));
|
||||
fKnownTypes.add(types[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Answer whether the given type is visible in the dialog.
|
||||
*
|
||||
* @param type
|
||||
* the type constant, see {@link ICElement}
|
||||
* @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));
|
||||
return fKnownTypes.contains(type);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -436,8 +434,7 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
upperLayout.marginWidth = 0;
|
||||
upperRow.setLayout(upperLayout);
|
||||
|
||||
// the for loop is here to guarantee we always
|
||||
// create the checkboxes in the same order
|
||||
// The 'for' loop is here to guarantee that we always create the checkboxes in the same order.
|
||||
for (int i = 0; i < ALL_TYPES.length; ++i) {
|
||||
Integer typeObject = new Integer(ALL_TYPES[i]);
|
||||
if (fKnownTypes.contains(typeObject))
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2008 QNX Software Systems and others.
|
||||
* Copyright (c) 2004, 2011 QNX Software Systems and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - initial API and implementation
|
||||
* Sergey Prigogin (Google)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.wizards.classwizard;
|
||||
|
||||
|
@ -16,8 +17,9 @@ import java.util.List;
|
|||
|
||||
import org.eclipse.cdt.core.browser.ITypeInfo;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.browser.opentype.ElementSelectionDialog;
|
||||
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
|
||||
import org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||
import org.eclipse.osgi.util.NLS;
|
||||
|
@ -26,39 +28,37 @@ import org.eclipse.swt.widgets.Shell;
|
|||
import org.eclipse.ui.PlatformUI;
|
||||
import org.eclipse.ui.progress.IProgressService;
|
||||
|
||||
public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
||||
|
||||
public class NewBaseClassSelectionDialog extends ElementSelectionDialog {
|
||||
private static final String DIALOG_SETTINGS = NewBaseClassSelectionDialog.class.getName();
|
||||
private static final int[] VISIBLE_TYPES = { ICElement.C_CLASS, ICElement.C_STRUCT };
|
||||
private static final int ADD_ID = IDialogConstants.CLIENT_ID + 1;
|
||||
private List<ITypeInfo> fTypeList;
|
||||
private List<ITypeSelectionListener> fTypeListeners;
|
||||
|
||||
|
||||
public interface ITypeSelectionListener {
|
||||
void typeAdded(ITypeInfo baseClass);
|
||||
}
|
||||
|
||||
|
||||
public NewBaseClassSelectionDialog(Shell parent) {
|
||||
super(parent);
|
||||
setTitle(NewClassWizardMessages.NewBaseClassSelectionDialog_title);
|
||||
setMessage(NewClassWizardMessages.NewBaseClassSelectionDialog_message);
|
||||
setDialogSettings(DIALOG_SETTINGS);
|
||||
setVisibleTypes(VISIBLE_TYPES);
|
||||
setFilter("*", true); //$NON-NLS-1$
|
||||
setStatusLineAboveButtons(true);
|
||||
fTypeList = new ArrayList<ITypeInfo>();
|
||||
fTypeListeners = new ArrayList<ITypeSelectionListener>();
|
||||
}
|
||||
|
||||
|
||||
public void addListener(ITypeSelectionListener listener) {
|
||||
if (!fTypeListeners.contains(listener))
|
||||
fTypeListeners.add(listener);
|
||||
}
|
||||
|
||||
|
||||
public void removeListener(ITypeSelectionListener listener) {
|
||||
fTypeListeners.remove(listener);
|
||||
}
|
||||
|
||||
|
||||
private void notifyTypeAddedListeners(ITypeInfo type) {
|
||||
// first copy listeners in case one calls removeListener
|
||||
List<ITypeSelectionListener> list = new ArrayList<ITypeSelectionListener>(fTypeListeners);
|
||||
|
@ -67,7 +67,7 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
listener.typeAdded(type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public ITypeInfo[] getAddedTypes() {
|
||||
return fTypeList.toArray(new ITypeInfo[fTypeList.size()]);
|
||||
}
|
||||
|
@ -80,7 +80,7 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
createButton(parent, ADD_ID, NewClassWizardMessages.NewBaseClassSelectionDialog_addButton_label, true);
|
||||
super.createButtonsForButtonBar(parent);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @see Dialog#buttonPressed
|
||||
*/
|
||||
|
@ -91,7 +91,7 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
}
|
||||
super.buttonPressed(buttonId);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @see Dialog#okPressed
|
||||
*/
|
||||
|
@ -100,7 +100,7 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
addType(getLowerSelectedElement());
|
||||
super.okPressed();
|
||||
}
|
||||
|
||||
|
||||
private void addType(Object elem) {
|
||||
if (elem instanceof ITypeInfo) {
|
||||
ITypeInfo type = (ITypeInfo)elem;
|
||||
|
@ -119,8 +119,8 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
NewClassWizardUtil.resolveClassLocation(type, service);
|
||||
canAdd = (type.getResolvedReference() != null);
|
||||
}
|
||||
|
||||
// // resolve location of base class
|
||||
|
||||
// // Resolve location of base class
|
||||
// if (type.getResolvedReference() == null) {
|
||||
// final ITypeInfo[] typesToResolve = new ITypeInfo[] { type };
|
||||
// IRunnableWithProgress runnable = new IRunnableWithProgress() {
|
||||
|
@ -131,7 +131,7 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
// }
|
||||
// }
|
||||
// };
|
||||
//
|
||||
//
|
||||
// IProgressService service = PlatformUI.getWorkbench().getProgressService();
|
||||
// try {
|
||||
// service.busyCursorWhile(runnable);
|
||||
|
@ -140,13 +140,13 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
// String errorMessage= NewClassWizardMessages.getString("NewBaseClassSelectionDialog.getClasses.exception.message"); //$NON-NLS-1$
|
||||
// ExceptionHandler.handle(e, title, errorMessage);
|
||||
// } catch (InterruptedException e) {
|
||||
// // cancelled by user
|
||||
// // Cancelled by user
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
if (canAdd) {
|
||||
fTypeList.add(type);
|
||||
|
||||
|
||||
message = NLS.bind(NewClassWizardMessages.NewBaseClassSelectionDialog_classadded_info, qualifiedName);
|
||||
updateStatus(new StatusInfo(IStatus.INFO, message));
|
||||
|
||||
|
@ -158,16 +158,16 @@ public class NewBaseClassSelectionDialog extends TypeSelectionDialog {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the base classes need to be verified (ie they must exist in the project)
|
||||
* Checks if the base classes need to be verified (i.e. they must exist in the project)
|
||||
*
|
||||
* @return <code>true</code> if the base classes should be verified
|
||||
*/
|
||||
public boolean verifyBaseClasses() {
|
||||
return NewClassWizardPrefs.verifyBaseClasses();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @see AbstractElementListSelectionDialog#handleDefaultSelected()
|
||||
*/
|
||||
|
|
|
@ -17,8 +17,6 @@ public final class NewClassWizardMessages extends NLS {
|
|||
public static String NewClassCreationWizard_title;
|
||||
public static String NewClassCreationWizardPage_title;
|
||||
public static String NewClassCreationWizardPage_description;
|
||||
public static String NewClassCreationWizardPage_getTypes_noClasses_title;
|
||||
public static String NewClassCreationWizardPage_getTypes_noClasses_message;
|
||||
public static String NewClassCreationWizardPage_getTypes_noNamespaces_title;
|
||||
public static String NewClassCreationWizardPage_getTypes_noNamespaces_message;
|
||||
public static String NewClassCreationWizardPage_sourceFolder_label;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#
|
||||
# Contributors:
|
||||
# QNX Software Systems - Initial API and implementation
|
||||
# IBM Corporation
|
||||
# IBM Corporation
|
||||
# Anton Leherbauer (Wind River Systems)
|
||||
# Sergey Prigogin (Google)
|
||||
###############################################################################
|
||||
|
@ -19,8 +19,6 @@ NewClassCreationWizard_title=New C++ Class
|
|||
NewClassCreationWizardPage_title=C++ Class
|
||||
NewClassCreationWizardPage_description=Create a new C++ class.
|
||||
|
||||
NewClassCreationWizardPage_getTypes_noClasses_title=Class Selection
|
||||
NewClassCreationWizardPage_getTypes_noClasses_message=No classes available.
|
||||
NewClassCreationWizardPage_getTypes_noNamespaces_title=Namespace Selection
|
||||
NewClassCreationWizardPage_getTypes_noNamespaces_message=No namespaces available.
|
||||
|
||||
|
|
|
@ -13,11 +13,7 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.wizards.classwizard;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||
import org.eclipse.core.resources.ResourcesPlugin;
|
||||
|
@ -34,11 +30,9 @@ import org.eclipse.ui.IWorkbenchPart;
|
|||
import org.eclipse.ui.views.contentoutline.ContentOutline;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.browser.AllTypesCache;
|
||||
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
|
||||
import org.eclipse.cdt.core.browser.ITypeInfo;
|
||||
import org.eclipse.cdt.core.browser.ITypeReference;
|
||||
import org.eclipse.cdt.core.browser.TypeSearchScope;
|
||||
import org.eclipse.cdt.core.dom.ILinkage;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
|
@ -56,8 +50,6 @@ import org.eclipse.cdt.core.model.ICContainer;
|
|||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.model.ISourceRoot;
|
||||
import org.eclipse.cdt.core.parser.IScannerInfo;
|
||||
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
||||
import org.eclipse.cdt.core.parser.Keywords;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
|
||||
|
@ -65,7 +57,6 @@ import org.eclipse.cdt.internal.ui.editor.CEditor;
|
|||
import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider;
|
||||
|
||||
public class NewClassWizardUtil {
|
||||
|
||||
/**
|
||||
* Returns the parent source folder of the given element. If the given
|
||||
* element is already a source folder, the element itself is returned.
|
||||
|
@ -276,41 +267,6 @@ public class NewClassWizardUtil {
|
|||
return type.getResolvedReference();
|
||||
}
|
||||
|
||||
private static final int[] CLASS_TYPES = { ICElement.C_CLASS, ICElement.C_STRUCT };
|
||||
|
||||
/**
|
||||
* Returns all classes/structs which are accessible from the include
|
||||
* paths of the given project.
|
||||
*
|
||||
* @param cProject the given project
|
||||
* @return array of classes/structs
|
||||
*/
|
||||
public static ITypeInfo[] getReachableClasses(ICProject cProject) {
|
||||
ITypeInfo[] elements = AllTypesCache.getTypes(new TypeSearchScope(true), CLASS_TYPES);
|
||||
if (elements != null && elements.length > 0) {
|
||||
if (cProject != null) {
|
||||
IProject project = cProject.getProject();
|
||||
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
|
||||
if (provider != null) {
|
||||
//TODO get the scanner info for the actual source folder
|
||||
IScannerInfo info = provider.getScannerInformation(project);
|
||||
if (info != null) {
|
||||
String[] includePaths = info.getIncludePaths();
|
||||
List<ITypeInfo> filteredTypes = new ArrayList<ITypeInfo>();
|
||||
for (int i = 0; i < elements.length; ++i) {
|
||||
ITypeInfo baseType = elements[i];
|
||||
if (isTypeReachable(baseType, cProject, includePaths)) {
|
||||
filteredTypes.add(baseType);
|
||||
}
|
||||
}
|
||||
return filteredTypes.toArray(new ITypeInfo[filteredTypes.size()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return elements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given type can be found in the given project or the
|
||||
* given include paths.
|
||||
|
@ -402,7 +358,7 @@ public class NewClassWizardUtil {
|
|||
boolean sameNameDifferentTypeExists = false;
|
||||
|
||||
for (int i = 0; i < bindings.length; ++i) {
|
||||
ICPPBinding binding = (ICPPBinding)bindings[i];
|
||||
ICPPBinding binding = (ICPPBinding) bindings[i];
|
||||
|
||||
//get the fully qualified name of this binding
|
||||
String bindingFullName = renderQualifiedName(binding.getQualifiedName());
|
||||
|
@ -424,8 +380,7 @@ public class NewClassWizardUtil {
|
|||
IEnumeration.class.isAssignableFrom(currentNodeType) || // TODO - this should maybe be ICPPEnumeration
|
||||
ICPPNamespace.class.isAssignableFrom(currentNodeType) ||
|
||||
ITypedef.class.isAssignableFrom(currentNodeType) ||
|
||||
ICPPBasicType.class.isAssignableFrom(currentNodeType))
|
||||
{
|
||||
ICPPBasicType.class.isAssignableFrom(currentNodeType)) {
|
||||
if (bindingFullName.equals(fullyQualifiedTypeName)) {
|
||||
return SEARCH_MATCH_FOUND_EXACT_ANOTHER_TYPE;
|
||||
}
|
||||
|
@ -446,8 +401,7 @@ public class NewClassWizardUtil {
|
|||
return SEARCH_MATCH_ERROR;
|
||||
}
|
||||
return SEARCH_MATCH_NOTFOUND;
|
||||
}
|
||||
finally {
|
||||
} finally {
|
||||
index.releaseReadLock();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1178,14 +1178,6 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
|
|||
}
|
||||
|
||||
private void chooseBaseClasses() {
|
||||
ITypeInfo[] elements = NewClassWizardUtil.getReachableClasses(getCurrentProject());
|
||||
if (elements == null || elements.length == 0) {
|
||||
String title = NewClassWizardMessages.NewClassCreationWizardPage_getTypes_noClasses_title;
|
||||
String message = NewClassWizardMessages.NewClassCreationWizardPage_getTypes_noClasses_message;
|
||||
MessageDialog.openInformation(getShell(), title, message);
|
||||
return;
|
||||
}
|
||||
|
||||
List<IBaseClassInfo> oldContents = fBaseClassesDialogField.getElements();
|
||||
NewBaseClassSelectionDialog dialog = new NewBaseClassSelectionDialog(getShell());
|
||||
dialog.addListener(new ITypeSelectionListener() {
|
||||
|
@ -1193,16 +1185,15 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
|
|||
addBaseClass(newBaseClass, ASTAccessVisibility.PUBLIC, false);
|
||||
}
|
||||
});
|
||||
dialog.setElements(elements);
|
||||
int result = dialog.open();
|
||||
if (result != IDialogConstants.OK_ID) {
|
||||
// restore the old contents
|
||||
// Restore the old contents
|
||||
fBaseClassesDialogField.setElements(oldContents);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* handles changes to the method stubs field
|
||||
* Handles changes to the method stubs field
|
||||
*/
|
||||
private final class MethodStubsFieldAdapter implements IListAdapter<IMethodStub> {
|
||||
|
||||
|
@ -1667,7 +1658,6 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
|
|||
|
||||
ICProject project = getCurrentProject();
|
||||
if (project != null) {
|
||||
|
||||
IQualifiedTypeName fullyQualifiedName = typeName;
|
||||
if (isNamespaceSelected()) {
|
||||
String namespace = getNamespaceText();
|
||||
|
@ -1745,7 +1735,8 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
|
|||
ITypeInfo baseType = baseClass.getType();
|
||||
StatusInfo baseClassStatus = new StatusInfo();
|
||||
if (!NewClassWizardUtil.isTypeReachable(baseType, project, includePaths)) {
|
||||
baseClassStatus.setError(NLS.bind(NewClassWizardMessages.NewClassCreationWizardPage_error_BaseClassNotExistsInProject, baseType.getQualifiedTypeName().toString()));
|
||||
baseClassStatus.setError(NLS.bind(NewClassWizardMessages.NewClassCreationWizardPage_error_BaseClassNotExistsInProject,
|
||||
baseType.getQualifiedTypeName().toString()));
|
||||
}
|
||||
status.add(baseClassStatus);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue