/* | |
* Copyright (C) 2012 The Android Open Source Project | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.motorola.studio.android.codeutils.wizards; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import java.util.ArrayList; | |
import java.util.List; | |
import org.eclipse.core.resources.IProject; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.jdt.core.IJavaProject; | |
import org.eclipse.jdt.core.IPackageFragmentRoot; | |
import org.eclipse.jdt.core.JavaCore; | |
import org.eclipse.jdt.core.JavaModelException; | |
import org.eclipse.jdt.internal.ui.dialogs.StatusUtil; | |
import org.eclipse.jdt.ui.wizards.NewTypeWizardPage; | |
import org.eclipse.swt.widgets.Composite; | |
import com.motorola.studio.android.codeutils.CodeUtilsActivator; | |
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS; | |
import com.motorola.studio.android.common.log.StudioLogger; | |
import com.motorola.studio.android.common.utilities.EclipseUtils; | |
/** | |
* <p> | |
* Class which holds a Source/Package selection part. It is a workaround | |
* in order to use Source/Package selection twice in the same page of | |
* a certain wizard. | |
* </p> | |
* <p> | |
* Despite the fact the this class implements <code>NewTypeWizardPage</code>, it | |
* should be be used as a wizard. It is to be used as a part of it to add a | |
* Source/Package functionality. | |
* </p> | |
*/ | |
@SuppressWarnings("restriction") | |
public class SourcePackageChooserPartWizard extends NewTypeWizardPage | |
{ | |
/** | |
* Command representing the event of a message dispatched. | |
*/ | |
public static final String MESSAGE_DISPATCHED_ACTION = "MESSAGE_DISPATCHED"; | |
/** | |
* Id representing the action of a message dispatched. | |
*/ | |
public static final int MESSAGE_DISPATCHED_ID_ACTION = 0; | |
private int numColumnsGridLayout = 0; | |
private final List<ActionListener> messageActionListenerList = new ArrayList<ActionListener>(); | |
private IStatus mostSevereStatus; | |
/** | |
* Get the most severe status of this Part Page. | |
* | |
* @return The most severe status. | |
*/ | |
public IStatus getMostSevereStatus() | |
{ | |
return mostSevereStatus; | |
} | |
/** | |
* Constructor. | |
* | |
* @param pageName Page Name | |
* @param project Project related to the wizard | |
* @param defaultPackageName The name of the default package to use | |
* on the package field | |
* @param parent The parent composite | |
* @param numColumnsGridLayout The number of columns on the grid layout | |
*/ | |
public SourcePackageChooserPartWizard(String pageName, IProject project, | |
String defaultPackageName, Composite parent, int numColumnsGridLayout) | |
{ | |
super(true, pageName); | |
// set description and title | |
setDescription(CodeUtilsNLS.UI_PersistenceWizardPageDescriptionDeploy); | |
setTitle(CodeUtilsNLS.UI_PersistenceWizardPageTitleDeploy); | |
// set attributes | |
this.numColumnsGridLayout = numColumnsGridLayout; | |
if (project != null) | |
{ | |
// get the java project | |
IJavaProject javaProject = JavaCore.create(project); | |
IPackageFragmentRoot[] possibleRoots = null; | |
// continue in case it does exist | |
if (javaProject != null) | |
{ | |
try | |
{ | |
// get all possible roots | |
possibleRoots = javaProject.getPackageFragmentRoots(); | |
// select the first one, in case it does exist | |
if ((possibleRoots != null) && (possibleRoots.length > 0)) | |
{ | |
// set the first one | |
setPackageFragmentRoot(possibleRoots[0], true); | |
} | |
} | |
catch (JavaModelException e) | |
{ | |
StudioLogger.error(this.getClass(), | |
CodeUtilsNLS.Db_GenerateManagementClassesError, e); | |
IStatus status = | |
new Status(IStatus.ERROR, CodeUtilsActivator.PLUGIN_ID, | |
e.getLocalizedMessage()); | |
EclipseUtils.showErrorDialog(CodeUtilsNLS.Db_GenerateManagementClassesError, | |
CodeUtilsNLS.Db_GenerateManagementClassesError, status); | |
} | |
} | |
} | |
doStatusUpdate(); | |
// create GUI here because since this GUI is an auxiliary one, the interface does not work when created in the org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite method | |
setPackageFragmentRoot(getPackageFragmentRoot(), true); | |
createContainerControls(parent, this.numColumnsGridLayout); | |
boolean defaultPackageUsed = false; | |
if (defaultPackageName != null) | |
{ | |
// try to use the manifest package, but if this fails, use the default getPackageFragment() logic | |
try | |
{ | |
setPackageFragment(getPackageFragmentRoot().getPackageFragment(defaultPackageName), | |
true); | |
defaultPackageUsed = true; | |
} | |
catch (Exception e) | |
{ | |
// do nothing | |
} | |
} | |
if (!defaultPackageUsed) | |
{ | |
setPackageFragment(getPackageFragment(), true); | |
} | |
createPackageControls(parent, this.numColumnsGridLayout); | |
} | |
/** | |
* Add an action listener to which notificates the caller | |
* when a message is dispatched. | |
* | |
* @param actionListener Listener to be notified when some field changed. | |
*/ | |
public void addMessageNotificationActionListener(ActionListener actionListener) | |
{ | |
messageActionListenerList.add(actionListener); | |
} | |
/* | |
* @see NewContainerWizardPage#handleFieldChanged | |
*/ | |
@Override | |
protected void handleFieldChanged(String fieldName) | |
{ | |
super.handleFieldChanged(fieldName); | |
doStatusUpdate(); | |
ActionEvent actionEvent = | |
new ActionEvent(this, MESSAGE_DISPATCHED_ID_ACTION, MESSAGE_DISPATCHED_ACTION); | |
// execute listeners | |
for (ActionListener listener : messageActionListenerList) | |
{ | |
listener.actionPerformed(actionEvent); | |
} | |
} | |
private void doStatusUpdate() | |
{ | |
// status of all used components | |
IStatus[] status = | |
new IStatus[] | |
{ | |
fContainerStatus, | |
isEnclosingTypeSelected() ? fEnclosingTypeStatus : fPackageStatus, | |
}; | |
this.mostSevereStatus = StatusUtil.getMostSevere(status); | |
if (this.mostSevereStatus != null) | |
{ | |
StatusUtil.applyToStatusLine(this, this.mostSevereStatus); | |
} | |
} | |
/* (non-Javadoc) | |
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) | |
*/ | |
public void createControl(Composite parent) | |
{ | |
// do nothing | |
} | |
} |