| /******************************************************************************* |
| * Copyright (c) 2000, 2005 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.ui.jarpackager; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| 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.Event; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Text; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.jface.wizard.IWizardPage; |
| import org.eclipse.jface.wizard.WizardPage; |
| |
| import org.eclipse.ui.dialogs.SaveAsDialog; |
| import org.eclipse.ui.PlatformUI; |
| |
| import org.eclipse.jdt.internal.corext.util.Messages; |
| |
| import org.eclipse.jdt.ui.jarpackager.JarPackageData; |
| |
| import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; |
| import org.eclipse.jdt.internal.ui.JavaPlugin; |
| |
| import org.eclipse.jdt.internal.ui.util.SWTUtil; |
| |
| /** |
| * Page 2 of the JAR Package wizard |
| */ |
| class JarOptionsPage extends WizardPage implements IJarPackageWizardPage { |
| |
| // Untyped listener |
| private class UntypedListener implements Listener { |
| /* |
| * Implements method from Listener |
| */ |
| public void handleEvent(Event e) { |
| if (getControl() == null) |
| return; |
| update(); |
| } |
| } |
| |
| private JarPackageData fJarPackage; |
| |
| // widgets |
| private Button fExportErrorsCheckbox; |
| private Button fExportWarningsCheckbox; |
| private Button fUseSourceFoldersCheckbox; |
| private Composite fDescriptionFileGroup; |
| private Button fSaveDescriptionCheckbox; |
| private Label fDescriptionFileLabel; |
| private Text fDescriptionFileText; |
| private Button fDescriptionFileBrowseButton; |
| private Button fBuildIfNeededCheckbox; |
| |
| // dialog store id constants |
| private final static String PAGE_NAME= "jarOptionsWizardPage"; //$NON-NLS-1$ |
| |
| private final static String STORE_EXPORT_WARNINGS= PAGE_NAME + ".EXPORT_WARNINGS"; //$NON-NLS-1$ |
| private final static String STORE_EXPORT_ERRORS= PAGE_NAME + ".EXPORT_ERRORS"; //$NON-NLS-1$ |
| private final static String STORE_SAVE_DESCRIPTION= PAGE_NAME + ".SAVE_DESCRIPTION"; //$NON-NLS-1$ |
| private final static String STORE_DESCRIPTION_LOCATION= PAGE_NAME + ".DESCRIPTION_LOCATION"; //$NON-NLS-1$ |
| private final static String STORE_USE_SRC_FOLDERS= PAGE_NAME + ".STORE_USE_SRC_FOLDERS"; //$NON-NLS-1$ |
| private final static String STORE_BUILD_IF_NEEDED= PAGE_NAME + ".BUILD_IF_NEEDED"; //$NON-NLS-1$ |
| |
| /** |
| * Create an instance of this class |
| */ |
| public JarOptionsPage(JarPackageData jarPackage) { |
| super(PAGE_NAME); |
| setTitle(JarPackagerMessages.JarOptionsPage_title); |
| setDescription(JarPackagerMessages.JarOptionsPage_description); |
| fJarPackage= jarPackage; |
| } |
| |
| /* |
| * Method declared on IDialogPage. |
| */ |
| public void createControl(Composite parent) { |
| Composite composite= new Composite(parent, SWT.NULL); |
| composite.setLayout(new GridLayout()); |
| composite.setLayoutData( |
| new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); |
| |
| createOptionsGroup(composite); |
| |
| restoreWidgetValues(); |
| setControl(composite); |
| update(); |
| |
| Dialog.applyDialogFont(composite); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.JAROPTIONS_WIZARD_PAGE); |
| } |
| |
| /** |
| * Create the export options specification widgets. |
| * |
| * @param parent org.eclipse.swt.widgets.Composite |
| */ |
| protected void createOptionsGroup(Composite parent) { |
| |
| initializeDialogUnits(parent); |
| |
| Composite optionsGroup= new Composite(parent, SWT.NONE); |
| GridLayout layout= new GridLayout(); |
| layout.marginHeight= 0; |
| optionsGroup.setLayout(layout); |
| |
| createLabel(optionsGroup, JarPackagerMessages.JarOptionsPage_howTreatProblems_label, false); |
| |
| UntypedListener selectionListener= new UntypedListener(); |
| |
| fExportErrorsCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT); |
| fExportErrorsCheckbox.setText(JarPackagerMessages.JarOptionsPage_exportErrors_text); |
| fExportErrorsCheckbox.addListener(SWT.Selection, selectionListener); |
| |
| fExportWarningsCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT); |
| fExportWarningsCheckbox.setText(JarPackagerMessages.JarOptionsPage_exportWarnings_text); |
| fExportWarningsCheckbox.addListener(SWT.Selection, selectionListener); |
| |
| createSpacer(optionsGroup); |
| |
| fUseSourceFoldersCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT); |
| fUseSourceFoldersCheckbox.setText(JarPackagerMessages.JarOptionsPage_useSourceFoldersHierarchy); |
| fUseSourceFoldersCheckbox.addListener(SWT.Selection, selectionListener); |
| fUseSourceFoldersCheckbox.setEnabled(fJarPackage.areJavaFilesExported() && !fJarPackage.areGeneratedFilesExported()); |
| |
| createSpacer(optionsGroup); |
| |
| fBuildIfNeededCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT); |
| fBuildIfNeededCheckbox.setText(JarPackagerMessages.JarOptionsPage_buildIfNeeded); |
| fBuildIfNeededCheckbox.addListener(SWT.Selection, selectionListener); |
| |
| createSpacer(optionsGroup); |
| |
| fSaveDescriptionCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT); |
| fSaveDescriptionCheckbox.setText(JarPackagerMessages.JarOptionsPage_saveDescription_text); |
| fSaveDescriptionCheckbox.addListener(SWT.Selection, selectionListener); |
| createDescriptionFileGroup(parent); |
| } |
| |
| /** |
| * Persists resource specification control setting that are to be restored |
| * in the next instance of this page. Subclasses wishing to persist |
| * settings for their controls should extend the hook method |
| * <code>internalSaveWidgetValues</code>. |
| */ |
| public final void saveWidgetValues() { |
| // update directory names history |
| IDialogSettings settings= getDialogSettings(); |
| if (settings != null) { |
| settings.put(STORE_EXPORT_WARNINGS, fJarPackage.exportWarnings()); |
| settings.put(STORE_EXPORT_ERRORS, fJarPackage.areErrorsExported()); |
| settings.put(STORE_USE_SRC_FOLDERS, fJarPackage.useSourceFolderHierarchy()); |
| settings.put(STORE_BUILD_IF_NEEDED, fJarPackage.isBuildingIfNeeded()); |
| settings.put(STORE_SAVE_DESCRIPTION, fJarPackage.isDescriptionSaved()); |
| settings.put(STORE_DESCRIPTION_LOCATION, fJarPackage.getDescriptionLocation().toString()); |
| } |
| // Allow subclasses to save values |
| internalSaveWidgetValues(); |
| } |
| |
| /** |
| * Hook method for subclasses to persist their settings. |
| */ |
| protected void internalSaveWidgetValues() { |
| } |
| |
| /** |
| * Hook method for restoring widget values to the values that they held |
| * last time this wizard was used to completion. |
| */ |
| protected void restoreWidgetValues() { |
| if (!((JarPackageWizard)getWizard()).isInitializingFromJarPackage()) |
| initializeJarPackage(); |
| |
| fExportWarningsCheckbox.setSelection(fJarPackage.exportWarnings()); |
| fExportErrorsCheckbox.setSelection(fJarPackage.areErrorsExported()); |
| fBuildIfNeededCheckbox.setSelection(fJarPackage.isBuildingIfNeeded()); |
| fUseSourceFoldersCheckbox.setSelection(fJarPackage.useSourceFolderHierarchy()); |
| fSaveDescriptionCheckbox.setSelection(fJarPackage.isDescriptionSaved()); |
| fDescriptionFileText.setText(fJarPackage.getDescriptionLocation().toString()); |
| } |
| |
| /** |
| * Initializes the JAR package from last used wizard page values. |
| */ |
| protected void initializeJarPackage() { |
| IDialogSettings settings= getDialogSettings(); |
| if (settings != null) { |
| fJarPackage.setExportWarnings(settings.getBoolean(STORE_EXPORT_WARNINGS)); |
| fJarPackage.setExportErrors(settings.getBoolean(STORE_EXPORT_ERRORS)); |
| fJarPackage.setUseSourceFolderHierarchy(settings.getBoolean(STORE_USE_SRC_FOLDERS)); |
| fJarPackage.setSaveDescription(false); // bug 15877 |
| String pathStr= settings.get(STORE_DESCRIPTION_LOCATION); |
| if (pathStr == null) |
| pathStr= ""; //$NON-NLS-1$ |
| fJarPackage.setDescriptionLocation(new Path(pathStr)); |
| if (settings.get(STORE_BUILD_IF_NEEDED) != null) |
| fJarPackage.setBuildIfNeeded(settings.getBoolean(STORE_BUILD_IF_NEEDED)); |
| } |
| } |
| |
| private void update() { |
| updateModel(); |
| updateWidgetEnablements(); |
| updatePageCompletion(); |
| } |
| |
| /** |
| * Stores the widget values in the JAR package. |
| */ |
| protected void updateModel() { |
| if (getControl() == null) |
| return; |
| fJarPackage.setExportWarnings(fExportWarningsCheckbox.getSelection()); |
| fJarPackage.setExportErrors(fExportErrorsCheckbox.getSelection()); |
| fJarPackage.setBuildIfNeeded(fBuildIfNeededCheckbox.getSelection()); |
| fJarPackage.setSaveDescription(fSaveDescriptionCheckbox.getSelection()); |
| fJarPackage.setDescriptionLocation(new Path(fDescriptionFileText.getText())); |
| fJarPackage.setUseSourceFolderHierarchy(fUseSourceFoldersCheckbox.getSelection()); |
| } |
| |
| /** |
| * Open an appropriate destination browser so that the user can specify a source |
| * to import from |
| */ |
| protected void handleDescriptionFileBrowseButtonPressed() { |
| SaveAsDialog dialog= new SaveAsDialog(getContainer().getShell()); |
| dialog.create(); |
| dialog.getShell().setText(JarPackagerMessages.JarOptionsPage_saveAsDialog_title); |
| dialog.setMessage(JarPackagerMessages.JarOptionsPage_saveAsDialog_message); |
| dialog.setOriginalFile(createFileHandle(fJarPackage.getDescriptionLocation())); |
| if (dialog.open() == Window.OK) { |
| IPath path= dialog.getResult(); |
| path= path.removeFileExtension().addFileExtension(JarPackagerUtil.DESCRIPTION_EXTENSION); |
| fDescriptionFileText.setText(path.toString()); |
| } |
| } |
| |
| /** |
| * Updates the enablements of this page's controls. Subclasses may extend. |
| */ |
| protected void updateWidgetEnablements() { |
| boolean saveDescription= fSaveDescriptionCheckbox.getSelection(); |
| fDescriptionFileGroup.setEnabled(saveDescription); |
| fDescriptionFileBrowseButton.setEnabled(saveDescription); |
| fDescriptionFileText.setEnabled(saveDescription); |
| fDescriptionFileLabel.setEnabled(saveDescription); |
| |
| boolean exportClassFiles= fJarPackage.areClassFilesExported() && !fJarPackage.areOutputFoldersExported(); |
| fExportWarningsCheckbox.setEnabled(exportClassFiles); |
| fExportErrorsCheckbox.setEnabled(exportClassFiles); |
| |
| boolean isAutobuilding= ResourcesPlugin.getWorkspace().isAutoBuilding(); |
| fBuildIfNeededCheckbox.setEnabled(exportClassFiles && !isAutobuilding); |
| |
| fUseSourceFoldersCheckbox.setEnabled(fJarPackage.areJavaFilesExported() && !fJarPackage.areGeneratedFilesExported()); |
| } |
| |
| /* |
| * Implements method from IJarPackageWizardPage |
| */ |
| public boolean isPageComplete() { |
| if (fJarPackage.isDescriptionSaved()){ |
| if (fJarPackage.getDescriptionLocation().toString().length() == 0) { |
| setErrorMessage(null); |
| return false; |
| } |
| IPath location= fJarPackage.getDescriptionLocation(); |
| if (!location.toString().startsWith("/")) { //$NON-NLS-1$ |
| setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionMustBeAbsolute); |
| return false; |
| } |
| IResource resource= findResource(location); |
| if (resource != null && resource.getType() != IResource.FILE) { |
| setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionMustNotBeExistingContainer); |
| return false; |
| } |
| resource= findResource(location.removeLastSegments(1)); |
| if (resource == null || resource.getType() == IResource.FILE) { |
| setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionContainerDoesNotExist); |
| return false; |
| } |
| String fileExtension= fJarPackage.getDescriptionLocation().getFileExtension(); |
| if (fileExtension == null || !fileExtension.equals(JarPackagerUtil.DESCRIPTION_EXTENSION)) { |
| setErrorMessage(Messages.format(JarPackagerMessages.JarOptionsPage_error_invalidDescriptionExtension, JarPackagerUtil.DESCRIPTION_EXTENSION)); |
| return false; |
| } |
| } |
| setErrorMessage(null); |
| return true; |
| } |
| |
| public boolean canFlipToNextPage() { |
| return fJarPackage.areGeneratedFilesExported() && super.canFlipToNextPage(); |
| } |
| |
| /* |
| * Overrides method from WizardDataTransferPage |
| */ |
| protected void createDescriptionFileGroup(Composite parent) { |
| // destination specification group |
| fDescriptionFileGroup= new Composite(parent, SWT.NONE); |
| GridLayout layout= new GridLayout(); |
| layout.numColumns= 3; |
| fDescriptionFileGroup.setLayout(layout); |
| fDescriptionFileGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); |
| |
| fDescriptionFileLabel= new Label(fDescriptionFileGroup, SWT.NONE); |
| fDescriptionFileLabel.setText(JarPackagerMessages.JarOptionsPage_descriptionFile_label); |
| |
| // destination name entry field |
| fDescriptionFileText= new Text(fDescriptionFileGroup, SWT.SINGLE | SWT.BORDER); |
| fDescriptionFileText.addListener(SWT.Modify, new UntypedListener()); |
| GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); |
| data.widthHint= convertWidthInCharsToPixels(40); |
| fDescriptionFileText.setLayoutData(data); |
| |
| // destination browse button |
| fDescriptionFileBrowseButton= new Button(fDescriptionFileGroup, SWT.PUSH); |
| fDescriptionFileBrowseButton.setText(JarPackagerMessages.JarOptionsPage_browseButton_text); |
| fDescriptionFileBrowseButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); |
| SWTUtil.setButtonDimensionHint(fDescriptionFileBrowseButton); |
| fDescriptionFileBrowseButton.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| handleDescriptionFileBrowseButtonPressed(); |
| } |
| }); |
| } |
| |
| /** |
| * Creates a file resource handle for the file with the given workspace path. |
| * This method does not create the file resource; this is the responsibility |
| * of <code>createFile</code>. |
| * |
| * @param filePath the path of the file resource to create a handle for |
| * @return the new file resource handle |
| */ |
| protected IFile createFileHandle(IPath filePath) { |
| if (filePath.isValidPath(filePath.toString()) && filePath.segmentCount() >= 2) |
| return JavaPlugin.getWorkspace().getRoot().getFile(filePath); |
| else |
| return null; |
| } |
| /* |
| * Method declared on IWizardPage. |
| */ |
| public void setPreviousPage(IWizardPage page) { |
| super.setPreviousPage(page); |
| updateWidgetEnablements(); |
| if (getControl() != null) |
| updatePageCompletion(); |
| } |
| |
| /* |
| * Implements method from IJarPackageWizardPage. |
| */ |
| public void finish() { |
| saveWidgetValues(); |
| } |
| |
| /** |
| * Creates a new label with a bold font. |
| * |
| * @param parent the parent control |
| * @param text the label text |
| * @return the new label control |
| */ |
| protected Label createLabel(Composite parent, String text, boolean bold) { |
| Label label= new Label(parent, SWT.NONE); |
| if (bold) |
| label.setFont(JFaceResources.getBannerFont()); |
| label.setText(text); |
| GridData data= new GridData(); |
| data.verticalAlignment= GridData.FILL; |
| data.horizontalAlignment= GridData.FILL; |
| label.setLayoutData(data); |
| return label; |
| } |
| |
| /** |
| * Creates a horizontal spacer line that fills the width of its container. |
| * |
| * @param parent the parent control |
| */ |
| protected void createSpacer(Composite parent) { |
| Label spacer= new Label(parent, SWT.NONE); |
| GridData data= new GridData(); |
| data.horizontalAlignment= GridData.FILL; |
| data.verticalAlignment= GridData.BEGINNING; |
| spacer.setLayoutData(data); |
| } |
| |
| /** |
| * Determine if the page is complete and update the page appropriately. |
| */ |
| protected void updatePageCompletion() { |
| boolean pageComplete= isPageComplete(); |
| setPageComplete(pageComplete); |
| if (pageComplete) { |
| setErrorMessage(null); |
| } |
| } |
| |
| /** |
| * Returns the resource for the specified path. |
| * |
| * @param path the path for which the resource should be returned |
| * @return the resource specified by the path or <code>null</code> |
| */ |
| protected IResource findResource(IPath path) { |
| IWorkspace workspace= JavaPlugin.getWorkspace(); |
| IStatus result= workspace.validatePath( |
| path.toString(), |
| IResource.ROOT | IResource.PROJECT | IResource.FOLDER | IResource.FILE); |
| if (result.isOK() && workspace.getRoot().exists(path)) |
| return workspace.getRoot().findMember(path); |
| return null; |
| } |
| } |