| /******************************************************************************* |
| * Copyright (c) 2000, 2017 IBM Corporation and others. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.ui.wizards.buildpath; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.dltk.core.IBuildpathEntry; |
| import org.eclipse.dltk.core.IScriptProject; |
| import org.eclipse.dltk.internal.ui.wizards.IBuildpathContainerPage; |
| import org.eclipse.dltk.internal.ui.wizards.IBuildpathContainerPageExtension2; |
| import org.eclipse.dltk.internal.ui.wizards.NewWizardMessages; |
| import org.eclipse.dltk.launching.ScriptRuntime; |
| import org.eclipse.dltk.ui.DLTKUILanguageManager; |
| import org.eclipse.dltk.ui.IDLTKUILanguageToolkit; |
| import org.eclipse.dltk.ui.util.ExceptionHandler; |
| import org.eclipse.dltk.ui.util.PixelConverter; |
| import org.eclipse.dltk.ui.wizards.IBuildpathContainerPageExtension; |
| import org.eclipse.jface.wizard.IWizardPage; |
| import org.eclipse.jface.wizard.Wizard; |
| import org.eclipse.jface.wizard.WizardDialog; |
| import org.eclipse.swt.widgets.Shell; |
| |
| public class BuildpathContainerWizard extends Wizard { |
| |
| private BuildpathContainerDescriptor fPageDesc; |
| private IBuildpathEntry fEntryToEdit; |
| |
| private IBuildpathEntry[] fNewEntries; |
| private IBuildpathContainerPage fContainerPage; |
| private IScriptProject fCurrProject; |
| private IBuildpathEntry[] fCurrBuildpath; |
| |
| private BuildpathContainerSelectionPage fSelectionWizardPage; |
| |
| /** |
| * Constructor for BuildpathContainerWizard. |
| */ |
| public BuildpathContainerWizard(IBuildpathEntry entryToEdit, |
| IScriptProject currProject, IBuildpathEntry[] currEntries) { |
| this(entryToEdit, null, currProject, currEntries); |
| } |
| |
| /** |
| * Constructor for BuildpathContainerWizard. |
| */ |
| public BuildpathContainerWizard(BuildpathContainerDescriptor pageDesc, |
| IScriptProject currProject, IBuildpathEntry[] currEntries) { |
| this(null, pageDesc, currProject, currEntries); |
| } |
| |
| private BuildpathContainerWizard(IBuildpathEntry entryToEdit, |
| BuildpathContainerDescriptor pageDesc, IScriptProject currProject, |
| IBuildpathEntry[] currEntries) { |
| fEntryToEdit = entryToEdit; |
| fPageDesc = pageDesc; |
| fNewEntries = null; |
| |
| fCurrProject = currProject; |
| fCurrBuildpath = currEntries; |
| |
| String title; |
| if (entryToEdit == null) { |
| title = NewWizardMessages.BuildpathContainerWizard_new_title; |
| } else { |
| title = NewWizardMessages.BuildpathContainerWizard_edit_title; |
| } |
| setWindowTitle(title); |
| } |
| |
| public IBuildpathEntry[] getNewEntries() { |
| return fNewEntries; |
| } |
| |
| @Override |
| public boolean performFinish() { |
| if (fContainerPage != null) { |
| if (fContainerPage.finish()) { |
| if (fEntryToEdit == null |
| && fContainerPage instanceof IBuildpathContainerPageExtension2) { |
| fNewEntries = ((IBuildpathContainerPageExtension2) fContainerPage) |
| .getNewContainers(); |
| } else { |
| IBuildpathEntry entry = fContainerPage.getSelection(); |
| fNewEntries = (entry != null) |
| ? new IBuildpathEntry[] { entry } |
| : null; |
| } |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| @Override |
| public void addPages() { |
| if (fPageDesc != null) { |
| fContainerPage = getContainerPage(fPageDesc); |
| addPage(fContainerPage); |
| } else if (fEntryToEdit == null) { // new entry: show selection page as |
| // first page |
| BuildpathContainerDescriptor[] containers = BuildpathContainerDescriptor |
| .getDescriptors(fCurrProject); |
| |
| fSelectionWizardPage = new BuildpathContainerSelectionPage( |
| containers); |
| addPage(fSelectionWizardPage); |
| |
| // add as dummy, will not be shown |
| fContainerPage = new BuildpathContainerDefaultPage(); |
| addPage(fContainerPage); |
| } else { // fPageDesc == null && fEntryToEdit != null |
| BuildpathContainerDescriptor[] containers = BuildpathContainerDescriptor |
| .getDescriptors(); |
| |
| String type = fEntryToEdit.getPath().segment(0); |
| if (type.equals(ScriptRuntime.INTERPRETER_CONTAINER)) { |
| IDLTKUILanguageToolkit toolkit = DLTKUILanguageManager |
| .getLanguageToolkit(this.fCurrProject); |
| if (toolkit != null) { |
| String interpreterContainerID = toolkit |
| .getInterpreterContainerId(); |
| BuildpathContainerDescriptor descriptor = findDescriptorPage( |
| containers, fEntryToEdit, interpreterContainerID); |
| fContainerPage = getContainerPage(descriptor); |
| addPage(fContainerPage); |
| } |
| } else { |
| BuildpathContainerDescriptor descriptor = findDescriptorPage( |
| containers, fEntryToEdit); |
| fContainerPage = getContainerPage(descriptor); |
| addPage(fContainerPage); |
| } |
| } |
| super.addPages(); |
| } |
| |
| private IBuildpathContainerPage getContainerPage( |
| BuildpathContainerDescriptor pageDesc) { |
| IBuildpathContainerPage containerPage = null; |
| if (pageDesc != null) { |
| IBuildpathContainerPage page = pageDesc.getPage(); |
| if (page != null) { |
| return page; // if page is already created, avoid double |
| // initialization |
| } |
| try { |
| containerPage = pageDesc.createPage(); |
| } catch (CoreException e) { |
| handlePageCreationFailed(e); |
| containerPage = null; |
| } |
| } |
| |
| if (containerPage == null) { |
| containerPage = new BuildpathContainerDefaultPage(); |
| if (pageDesc != null) { |
| pageDesc.setPage(containerPage); // avoid creation next time |
| } |
| } |
| |
| if (containerPage instanceof IBuildpathContainerPageExtension) { |
| ((IBuildpathContainerPageExtension) containerPage) |
| .initialize(fCurrProject, fCurrBuildpath); |
| } |
| |
| containerPage.setSelection(fEntryToEdit); |
| containerPage.setWizard(this); |
| return containerPage; |
| } |
| |
| @Override |
| public IWizardPage getNextPage(IWizardPage page) { |
| if (page == fSelectionWizardPage) { |
| |
| BuildpathContainerDescriptor selected = fSelectionWizardPage |
| .getSelected(); |
| fContainerPage = getContainerPage(selected); |
| |
| return fContainerPage; |
| } |
| return super.getNextPage(page); |
| } |
| |
| private void handlePageCreationFailed(CoreException e) { |
| String title = NewWizardMessages.BuildpathContainerWizard_pagecreationerror_title; |
| String message = NewWizardMessages.BuildpathContainerWizard_pagecreationerror_message; |
| ExceptionHandler.handle(e, getShell(), title, message); |
| } |
| |
| private BuildpathContainerDescriptor findDescriptorPage( |
| BuildpathContainerDescriptor[] containers, IBuildpathEntry entry, |
| String id) { |
| for (int i = 0; i < containers.length; i++) { |
| if (containers[i].canEdit(entry, id)) { |
| return containers[i]; |
| } |
| } |
| return null; |
| } |
| |
| private BuildpathContainerDescriptor findDescriptorPage( |
| BuildpathContainerDescriptor[] containers, IBuildpathEntry entry) { |
| for (int i = 0; i < containers.length; i++) { |
| if (containers[i].canEdit(entry)) { |
| return containers[i]; |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| public void dispose() { |
| if (fSelectionWizardPage != null) { |
| BuildpathContainerDescriptor[] descriptors = fSelectionWizardPage |
| .getContainers(); |
| for (int i = 0; i < descriptors.length; i++) { |
| descriptors[i].dispose(); |
| } |
| } |
| super.dispose(); |
| } |
| |
| @Override |
| public boolean canFinish() { |
| if (fSelectionWizardPage != null) { |
| if (!fContainerPage.isPageComplete()) { |
| return false; |
| } |
| } |
| if (fContainerPage != null) { |
| return fContainerPage.isPageComplete(); |
| } |
| return false; |
| } |
| |
| public static int openWizard(Shell shell, BuildpathContainerWizard wizard) { |
| WizardDialog dialog = new WizardDialog(shell, wizard); |
| PixelConverter converter = new PixelConverter(shell); |
| dialog.setMinimumPageSize(converter.convertWidthInCharsToPixels(70), |
| converter.convertHeightInCharsToPixels(20)); |
| dialog.create(); |
| return dialog.open(); |
| } |
| |
| } |