blob: 1165f337fb2853baa97fbeed5efb0ee7789f5abf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2017 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.team.internal.ui.wizards;
import java.io.File;
import java.util.ArrayList;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class ExportProjectSetLocationPage extends TeamWizardPage {
Combo fileCombo;
protected IFile workspaceFile;
protected String file = ""; //$NON-NLS-1$
Button browseButton;
private boolean saveToFileSystem;
private Button fileRadio;
private Button workspaceRadio;
protected Text workspaceText;
public ExportProjectSetLocationPage(String pageName, String title, ImageDescriptor titleImage) {
super(pageName, title, titleImage);
setDescription(TeamUIMessages.ExportProjectSetMainPage_description);
}
@Override
public void createControl(Composite parent) {
Composite composite = createComposite(parent, 1);
initializeDialogUnits(composite);
Group locationGroup = new Group(composite, SWT.None);
GridLayout layout = new GridLayout();
locationGroup.setLayout(layout);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
locationGroup.setLayoutData(data);
locationGroup.setText(TeamUIMessages.ExportProjectSetMainPage_Project_Set_File_Name__3);
createExportToFile(locationGroup);
createExportToWorkspace(locationGroup);
saveToFileSystem = true;
setControl(composite);
updateEnablement();
Dialog.applyDialogFont(parent);
}
private void createExportToFile(Composite composite) {
fileRadio = new Button(composite, SWT.RADIO);
fileRadio.setText(TeamUIMessages.ExportProjectSetMainPage_FileButton);
fileRadio.addListener(SWT.Selection, event -> {
saveToFileSystem = true;
file = fileCombo.getText();
updateEnablement();
});
Composite inner = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 0;
inner.setLayout(layout);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
inner.setLayoutData(data);
fileCombo = createDropDownCombo(inner);
file = PsfFilenameStore.getInstance().getSuggestedDefault();
fileCombo.setItems(PsfFilenameStore.getInstance().getHistory());
fileCombo.setText(file);
fileCombo.addListener(SWT.Modify, event -> {
file = fileCombo.getText();
updateEnablement();
});
browseButton = new Button(inner, SWT.PUSH);
browseButton.setText(TeamUIMessages.ExportProjectSetMainPage_Browse_4);
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 -> {
if (!isSaveToFileSystem())
saveToFileSystem = true;
FileDialog d = new FileDialog(getShell(), SWT.SAVE);
d.setFilterExtensions(new String[] {"*.psf"}); //$NON-NLS-1$
d.setFilterNames(new String[] {TeamUIMessages.ExportProjectSetMainPage_Project_Set_Files_3});
d.setFileName(TeamUIMessages.ExportProjectSetMainPage_default);
String fileName = getFileName();
if (fileName != null) {
int separator = fileName.lastIndexOf(File.separatorChar);
if (separator != -1) {
fileName = fileName.substring(0, separator);
}
}
d.setFilterPath(fileName);
String f = d.open();
if (f != null) {
fileCombo.setText(f);
file = f;
}
});
}
private void createExportToWorkspace(Composite composite) {
workspaceRadio = new Button(composite, SWT.RADIO);
workspaceRadio.setText(TeamUIMessages.ExportProjectSetMainPage_WorkspaceButton);
workspaceRadio.addListener(SWT.Selection, event -> {
saveToFileSystem = false;
updateEnablement();
});
final Composite nameGroup = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 0;
nameGroup.setLayout(layout);
final GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
nameGroup.setLayoutData(data);
workspaceText = createTextField(nameGroup);
workspaceText.setEditable(false);
workspaceText.addListener(SWT.Modify, event -> {
file = workspaceFile.getLocation().toString();
updateEnablement();
});
Button wsBrowseButton = new Button(nameGroup, SWT.PUSH);
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
gd.widthHint = Math.max(widthHint, wsBrowseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
wsBrowseButton.setLayoutData(gd);
wsBrowseButton.setText(TeamUIMessages.ExportProjectSetMainPage_Browse);
wsBrowseButton.addListener(SWT.Selection, event -> {
if (isSaveToFileSystem())
saveToFileSystem = false;
WorkspaceDialog d = new WorkspaceDialog(getShell());
d.open();
});
}
private void updateEnablement() {
boolean complete;
//update radio buttons
fileRadio.setSelection(saveToFileSystem);
workspaceRadio.setSelection(!saveToFileSystem);
if (file.length() == 0) {
setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_specifyFile);
complete = false;
} else {
File f = new File(file);
if (f.isDirectory()) {
setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_You_have_specified_a_folder_5);
complete = false;
} else {
if (!isSaveToFileSystem() && workspaceFile == null) {
setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_specifyFile);
complete = false;
} else {
complete = true;
}
}
}
if (!isSaveToFileSystem() && workspaceFile != null) {
complete = true;
}
if (complete) {
setErrorMessage(null);
setDescription(TeamUIMessages.ExportProjectSetMainPage_description);
}
setPageComplete(complete);
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
fileCombo.setFocus();
}
}
public boolean isSaveToFileSystem() {
return saveToFileSystem;
}
public void refreshWorkspaceFile(IProgressMonitor monitor) throws CoreException {
if (workspaceFile != null)
workspaceFile.refreshLocal(IResource.DEPTH_ONE, monitor);
}
public String getFileName() {
return file;
}
public void setFileName(String file) {
if (file != null) {
this.file = file;
}
}
class WorkspaceDialog extends TitleAreaDialog {
protected TreeViewer wsTreeViewer;
protected Text wsFilenameText;
protected IContainer wsContainer;
protected Image dlgTitleImage;
private Button okButton;
public WorkspaceDialog(Shell shell) {
super(shell);
}
@Override
protected Control createContents(Composite parent) {
Control control = super.createContents(parent);
setTitle(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitle);
setMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitleMessage);
return control;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
composite.setLayout(layout);
final GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
composite.setLayoutData(data);
getShell().setText(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogMessage);
wsTreeViewer = new TreeViewer(composite, SWT.BORDER);
final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = 550;
gd.heightHint = 250;
wsTreeViewer.getTree().setLayoutData(gd);
wsTreeViewer.setContentProvider(new LocationPageContentProvider());
wsTreeViewer.setLabelProvider(new WorkbenchLabelProvider());
wsTreeViewer.setInput(ResourcesPlugin.getWorkspace());
final Composite group = new Composite(composite, SWT.NONE);
layout = new GridLayout(2, false);
layout.marginWidth = 0;
group.setLayout(layout);
group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
final Label label = new Label(group, SWT.NONE);
label.setLayoutData(new GridData());
label.setText(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogFilename);
wsFilenameText = new Text(group, SWT.BORDER);
wsFilenameText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
wsFilenameText.setText("projectSet.psf"); //$NON-NLS-1$
setupListeners();
return parent;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
okButton = getButton(IDialogConstants.OK_ID);
}
@Override
protected void okPressed() {
//Make sure that a container has been selected
if (wsContainer == null) {
getSelectedContainer();
}
//Assert.isNotNull(wsContainer);
workspaceFile = wsContainer.getFile(new Path(wsFilenameText.getText()));
if (workspaceFile != null) {
workspaceText.setText(workspaceFile.getFullPath().toString());
}
//this.page.validatePage();
//workspaceText.setText(wsFilenameText.getText());
super.okPressed();
}
private void getSelectedContainer() {
Object obj = ((IStructuredSelection) wsTreeViewer.getSelection()).getFirstElement();
if (obj instanceof IContainer)
wsContainer = (IContainer) obj;
else if (obj instanceof IFile) {
wsContainer = ((IFile) obj).getParent();
}
}
@Override
protected void cancelPressed() {
//this.page.validatePage();
getSelectedContainer();
super.cancelPressed();
}
@Override
public boolean close() {
/* if (dlgTitleImage != null)
dlgTitleImage.dispose();*/
return super.close();
}
void setupListeners() {
wsTreeViewer.addSelectionChangedListener(event -> {
IStructuredSelection s = (IStructuredSelection) event.getSelection();
Object obj = s.getFirstElement();
if (obj != null) {
}
if (obj instanceof IContainer)
wsContainer = (IContainer) obj;
else if (obj instanceof IFile) {
IFile tempFile = (IFile) obj;
wsContainer = tempFile.getParent();
wsFilenameText.setText(tempFile.getName());
}
});
wsTreeViewer.addDoubleClickListener(event -> {
ISelection s = event.getSelection();
if (s instanceof IStructuredSelection) {
Object item = ((IStructuredSelection) s).getFirstElement();
if (wsTreeViewer.getExpandedState(item))
wsTreeViewer.collapseToLevel(item, 1);
else
wsTreeViewer.expandToLevel(item, 1);
}
});
wsFilenameText.addModifyListener(e -> {
String patchName = wsFilenameText.getText();
if (patchName.trim().equals("")) { //$NON-NLS-1$
okButton.setEnabled(false);
setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorNoFilename);
} else if (!(ResourcesPlugin.getWorkspace().validateName(patchName, IResource.FILE)).isOK()) {
//make sure that the filename does not contain more than one segment
okButton.setEnabled(false);
setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorFilenameSegments);
} else {
okButton.setEnabled(true);
setErrorMessage(null);
}
});
}
}
class LocationPageContentProvider extends BaseWorkbenchContentProvider {
//Never show closed projects
boolean showClosedProjects = false;
@Override
public Object[] getChildren(Object element) {
if (element instanceof IWorkspace) {
// check if closed projects should be shown
IProject[] allProjects = ((IWorkspace) element).getRoot().getProjects();
if (showClosedProjects)
return allProjects;
ArrayList accessibleProjects = new ArrayList();
for (int i = 0; i < allProjects.length; i++) {
if (allProjects[i].isOpen()) {
accessibleProjects.add(allProjects[i]);
}
}
return accessibleProjects.toArray();
}
return super.getChildren(element);
}
}
public void validateEditWorkspaceFile(Shell shell) throws TeamException {
if (workspaceFile == null || ! workspaceFile.exists() || !workspaceFile.isReadOnly())
return;
IStatus status = ResourcesPlugin.getWorkspace().validateEdit(new IFile[] {workspaceFile}, shell);
if (!status.isOK()) {
throw new TeamException(status);
}
}
}