/*******************************************************************************
* 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.wizards.classwizard;
import java.util.ArrayList;
import java.util.Iterator;
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.core.runtime.IStatus;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;
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);
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);
for (Iterator<ITypeSelectionListener> i = list.iterator(); i.hasNext(); ) {
ITypeSelectionListener listener = i.next();
listener.typeAdded(type);
}
}
public ITypeInfo[] getAddedTypes() {
return fTypeList.toArray(new ITypeInfo[fTypeList.size()]);
}
/*
* @see Dialog#createButtonsForButtonBar
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, ADD_ID, NewClassWizardMessages.NewBaseClassSelectionDialog_addButton_label, true);
super.createButtonsForButtonBar(parent);
}
/*
* @see Dialog#buttonPressed
*/
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == ADD_ID){
addType(getLowerSelectedElement());
}
super.buttonPressed(buttonId);
}
/*
* @see Dialog#okPressed
*/
@Override
protected void okPressed() {
addType(getLowerSelectedElement());
super.okPressed();
}
private void addType(Object elem) {
if (elem instanceof ITypeInfo) {
ITypeInfo type = (ITypeInfo)elem;
if (fTypeList.contains(type)) {
String qualifiedName = type.getQualifiedTypeName().getFullyQualifiedName();
String message = NLS.bind(NewClassWizardMessages.NewBaseClassSelectionDialog_classalreadyadded_info, qualifiedName);
updateStatus(new StatusInfo(IStatus.INFO, message));
} else {
String qualifiedName = type.getQualifiedTypeName().getFullyQualifiedName();
String message = NLS.bind(NewClassWizardMessages.NewBaseClassSelectionDialog_addingclass_info, qualifiedName);
updateStatus(new StatusInfo(IStatus.INFO, message));
boolean canAdd = true;
if (verifyBaseClasses()) {
IProgressService service = PlatformUI.getWorkbench().getProgressService();
NewClassWizardUtil.resolveClassLocation(type, service);
canAdd = (type.getResolvedReference() != null);
}
// // Resolve location of base class
// if (type.getResolvedReference() == null) {
// final ITypeInfo[] typesToResolve = new ITypeInfo[] { type };
// IRunnableWithProgress runnable = new IRunnableWithProgress() {
// public void run(IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException {
// AllTypesCache.resolveTypeLocation(typesToResolve[0], progressMonitor);
// if (progressMonitor.isCanceled()) {
// throw new InterruptedException();
// }
// }
// };
//
// IProgressService service = PlatformUI.getWorkbench().getProgressService();
// try {
// service.busyCursorWhile(runnable);
// } catch (InvocationTargetException e) {
// String title= NewClassWizardMessages.getString("NewBaseClassSelectionDialog.getClasses.exception.title"); //$NON-NLS-1$
// String errorMessage= NewClassWizardMessages.getString("NewBaseClassSelectionDialog.getClasses.exception.message"); //$NON-NLS-1$
// ExceptionHandler.handle(e, title, errorMessage);
// } catch (InterruptedException e) {
// // Cancelled by user
// }
// }
if (canAdd) {
fTypeList.add(type);
message = NLS.bind(NewClassWizardMessages.NewBaseClassSelectionDialog_classadded_info, qualifiedName);
updateStatus(new StatusInfo(IStatus.INFO, message));
notifyTypeAddedListeners(type);
} else {
message = NLS.bind(NewClassWizardMessages.NewBaseClassSelectionDialog_error_classnotadded, qualifiedName);
updateStatus(new StatusInfo(IStatus.ERROR, message));
}
}
}
}
/**
* 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()
*/
@Override
protected void handleDefaultSelected() {
if (validateCurrentSelection())
buttonPressed(ADD_ID);
}
}