| /******************************************************************************* |
| * 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 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ui.wizards; |
| |
| import java.io.File; |
| import java.lang.reflect.InvocationTargetException; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| |
| import org.eclipse.compare.internal.Utilities; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.dnd.Clipboard; |
| import org.eclipse.swt.dnd.TextTransfer; |
| 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.Combo; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.FileDialog; |
| import org.eclipse.team.internal.ui.IHelpContextIds; |
| import org.eclipse.team.internal.ui.IPreferenceIds; |
| import org.eclipse.team.internal.ui.ProjectSetImporter; |
| import org.eclipse.team.internal.ui.SWTUtils; |
| import org.eclipse.team.internal.ui.TeamUIMessages; |
| import org.eclipse.team.internal.ui.TeamUIPlugin; |
| import org.eclipse.ui.IWorkingSet; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.dialogs.WorkingSetGroup; |
| |
| public class ImportProjectSetMainPage extends TeamWizardPage { |
| Combo fileCombo; |
| String file = ""; //$NON-NLS-1$ |
| Button browseButton; |
| |
| String urlString = ""; //$NON-NLS-1$ |
| Combo urlCombo; |
| |
| // input type radios |
| private Button fileInputButton; |
| private Button urlInputButton; |
| |
| // input type |
| public static final int InputType_file = 0; |
| public static final int InputType_URL = 1; |
| private int inputType = InputType_file; |
| |
| private boolean runInBackground = isRunInBackgroundPreferenceOn(); |
| // a wizard shouldn't be in an error state until the state has been modified by the user |
| private int messageType = NONE; |
| private WorkingSetGroup workingSetGroup; |
| |
| private PsfFilenameStore psfFilenameStore = PsfFilenameStore.getInstance(); |
| private PsfUrlStore psfUrlStore = PsfUrlStore.getInstance(); |
| |
| public ImportProjectSetMainPage(String pageName, String title, |
| ImageDescriptor titleImage) { |
| super(pageName, title, titleImage); |
| setDescription(TeamUIMessages.ImportProjectSetMainPage_description); |
| } |
| |
| private void setInputType(int inputTypeSelected) { |
| this.inputType = inputTypeSelected; |
| // reset the message type and give the user fresh chance to input |
| // correct data |
| messageType = NONE; |
| // update controls |
| fileInputButton.setSelection(inputType == InputType_file); |
| fileCombo.setEnabled(inputType == InputType_file); |
| browseButton.setEnabled(inputType == InputType_file); |
| urlInputButton.setSelection(inputType == InputType_URL); |
| urlCombo.setEnabled(inputType == InputType_URL); |
| // validate field |
| if (inputType == InputType_file) |
| updateFileEnablement(); |
| if (inputType == InputType_URL) |
| updateUrlEnablement(); |
| |
| } |
| |
| /* |
| * @see IDialogPage#createControl(Composite) |
| */ |
| @Override |
| public void createControl(Composite parent) { |
| Composite composite = createComposite(parent, 1); |
| initializeDialogUnits(composite); |
| |
| // set F1 help |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.IMPORT_PROJECT_SET_PAGE); |
| |
| Composite inner = new Composite(composite, SWT.NULL); |
| inner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = 3; |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| inner.setLayout(layout); |
| |
| fileInputButton = new Button(inner, SWT.RADIO); |
| fileInputButton |
| .setText(TeamUIMessages.ImportProjectSetMainPage_Project_Set_File); |
| fileInputButton.setEnabled(true); |
| fileInputButton.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| setInputType(InputType_file); |
| } |
| }); |
| |
| fileCombo = createDropDownCombo(inner); |
| file = psfFilenameStore.getSuggestedDefault(); |
| fileCombo.setItems(psfFilenameStore.getHistory()); |
| fileCombo.setText(file); |
| fileCombo.addListener(SWT.Modify, event -> { |
| file = fileCombo.getText(); |
| updateFileEnablement(); |
| }); |
| |
| browseButton = new Button(inner, SWT.PUSH); |
| browseButton.setText(TeamUIMessages.ImportProjectSetMainPage_Browse_3); |
| |
| urlInputButton = new Button(inner, SWT.RADIO); |
| urlInputButton |
| .setText(TeamUIMessages.ImportProjectSetMainPage_Project_Set_Url); |
| urlInputButton.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| setInputType(InputType_URL); |
| } |
| }); |
| urlCombo = createDropDownCombo(inner); |
| urlString = psfUrlStore.getSuggestedDefault(); |
| urlCombo.setItems(psfUrlStore.getHistory()); |
| urlCombo.setText(urlString); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = 2; |
| urlCombo.setLayoutData(gd); |
| urlCombo.addListener(SWT.Modify, event -> { |
| urlString = urlCombo.getText(); |
| updateUrlEnablement(); |
| }); |
| |
| GridData data = new GridData(); |
| data.horizontalAlignment = GridData.FILL; |
| int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); |
| data.widthHint = Math.max(widthHint, browseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); |
| browseButton.setLayoutData(data); |
| browseButton.addListener(SWT.Selection, event -> { |
| FileDialog d = new FileDialog(getShell()); |
| d.setFilterExtensions(new String[] {"*.psf", "*"}); //$NON-NLS-1$ //$NON-NLS-2$ |
| d.setFilterNames(new String[] {TeamUIMessages.ImportProjectSetMainPage_Project_Set_Files_2, TeamUIMessages.ImportProjectSetMainPage_allFiles}); // |
| String fileName= getFileName(); |
| if (fileName != null && fileName.length() > 0) { |
| int separator= fileName.lastIndexOf(File.separatorChar); |
| if (separator != -1) { |
| fileName= fileName.substring(0, separator); |
| } |
| } else { |
| fileName= ResourcesPlugin.getWorkspace().getRoot().getLocation().toString(); |
| } |
| d.setFilterPath(fileName); |
| String f = d.open(); |
| if (f != null) { |
| fileCombo.setText(f); |
| file = f; |
| } |
| }); |
| |
| addWorkingSetSection(composite); |
| |
| Button runInBackgroundCheckbox = SWTUtils.createCheckBox(composite, TeamUIMessages.ImportProjectSetMainPage_runInBackground, 3); |
| |
| runInBackgroundCheckbox.setSelection(isRunInBackgroundPreferenceOn()); |
| runInBackgroundCheckbox.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| runInBackground = !runInBackground; |
| } |
| }); |
| |
| setControl(composite); |
| setDefaultInputType(); |
| Dialog.applyDialogFont(parent); |
| } |
| |
| private void setDefaultInputType() { |
| // check for clipboard contents |
| Control c = getControl(); |
| if (c != null) { |
| Clipboard clipboard = new Clipboard(c.getDisplay()); |
| Object o = clipboard.getContents(TextTransfer.getInstance()); |
| clipboard.dispose(); |
| if (o instanceof String) { |
| try { |
| URL url = new URL((String) o); |
| if (url != null) { |
| setInputType(InputType_URL); |
| urlCombo.setText((String) o); |
| return; |
| } |
| } catch (MalformedURLException e) { |
| // ignore, it's not and URL |
| } |
| } |
| } |
| setInputType(InputType_file); |
| } |
| |
| private void addWorkingSetSection(Composite composite) { |
| workingSetGroup = new WorkingSetGroup( |
| composite, |
| null, |
| new String[] { "org.eclipse.ui.resourceWorkingSetPage", //$NON-NLS-1$ |
| "org.eclipse.jdt.ui.JavaWorkingSetPage" /* JavaWorkingSetUpdater.ID */}); //$NON-NLS-1$ |
| } |
| |
| private void updateUrlEnablement() { |
| boolean complete = false; |
| setMessage(null); |
| setErrorMessage(null); |
| |
| if (urlString.length() == 0) { |
| setMessage(TeamUIMessages.ImportProjectSetMainPage_specifyURL, |
| messageType); |
| complete = false; |
| } else { |
| |
| try { |
| new URL(urlString); |
| // the URL is correct, we can clear the error message |
| complete = true; |
| } catch (MalformedURLException e) { |
| messageType = ERROR; |
| setMessage(TeamUIMessages.ImportProjectSetDialog_malformed_url, |
| messageType); |
| complete = false; |
| } |
| } |
| |
| if (complete) { |
| setErrorMessage(null); |
| setDescription(TeamUIMessages.ImportProjectSetMainPage_description); |
| } |
| |
| setPageComplete(complete); |
| } |
| |
| private void updateFileEnablement() { |
| boolean complete = false; |
| setMessage(null); |
| setErrorMessage(null); |
| |
| if (file.length() == 0) { |
| setMessage(TeamUIMessages.ImportProjectSetMainPage_specifyFile, messageType); |
| setPageComplete(false); |
| return; |
| } else { |
| // See if the file exists |
| File f = new File(file); |
| if (!f.exists()) { |
| messageType = ERROR; |
| setMessage(TeamUIMessages.ImportProjectSetMainPage_The_specified_file_does_not_exist_4, messageType); |
| setPageComplete(false); |
| return; |
| } else if (f.isDirectory()) { |
| messageType = ERROR; |
| setMessage(TeamUIMessages.ImportProjectSetMainPage_You_have_specified_a_folder_5, messageType); |
| setPageComplete(false); |
| return; |
| } else if (!ProjectSetImporter.isValidProjectSetFile(file)) { |
| messageType = ERROR; |
| setMessage(TeamUIMessages.ImportProjectSetMainPage_projectSetFileInvalid, messageType); |
| setPageComplete(false); |
| return; |
| } |
| complete = true; |
| } |
| |
| if (complete) { |
| setErrorMessage(null); |
| setDescription(TeamUIMessages.ImportProjectSetMainPage_description); |
| } |
| |
| setPageComplete(complete); |
| } |
| |
| public String getFileName() { |
| return file; |
| } |
| |
| public String getUrl() { |
| return urlString; |
| } |
| |
| @Override |
| public void setVisible(boolean visible) { |
| super.setVisible(visible); |
| if (visible) { |
| fileCombo.setFocus(); |
| } |
| } |
| |
| /** |
| * Return the working sets selected on the page or an empty array if none |
| * were selected. |
| * |
| * @return the selected working sets or an empty array |
| */ |
| public IWorkingSet[] getWorkingSets() { |
| return workingSetGroup.getSelectedWorkingSets(); |
| } |
| |
| private static boolean isRunInBackgroundPreferenceOn() { |
| return TeamUIPlugin.getPlugin().getPreferenceStore().getBoolean( |
| IPreferenceIds.RUN_IMPORT_IN_BACKGROUND); |
| } |
| |
| public boolean isRunInBackgroundOn() { |
| return runInBackground; |
| } |
| |
| public int getInputType() { |
| return inputType; |
| } |
| |
| public String getURLContents() { |
| try { |
| PsfUrlStore.getInstance().remember(urlString); |
| String urlContent = Utilities.getURLContents(new URL(urlString), |
| getContainer()); |
| if (ProjectSetImporter.isValidProjectSetString(urlContent)) { |
| return urlContent; |
| } else { |
| messageType = ERROR; |
| setMessage( |
| TeamUIMessages.ImportProjectSetMainPage_projectSetFileInvalid, |
| messageType); |
| setPageComplete(false); |
| return null; |
| } |
| } catch (OperationCanceledException e) { // ignore |
| } catch (InterruptedException e) { // ignore |
| } catch (InvocationTargetException e) { |
| messageType = ERROR; |
| setMessage( |
| TeamUIMessages.ImportProjectSetMainPage_The_given_URL_cannot_be_loaded, |
| messageType); |
| setPageComplete(false); |
| } catch (MalformedURLException e) { |
| // ignore as we tested it with modify listener on combo |
| } |
| return null; |
| } |
| } |