diff options
author | Bogdan Gheorghe | 2006-07-12 19:46:52 +0000 |
---|---|---|
committer | Bogdan Gheorghe | 2006-07-12 19:46:52 +0000 |
commit | bd54a38b309c5c1b766c507119a261610693bf04 (patch) | |
tree | d1f695bdf02094786213aa1c8388795fbb38ca12 | |
parent | 8db4536566f3a0f7fcc0b5efcff89c1d432ba414 (diff) | |
download | eclipse.platform.team-bd54a38b309c5c1b766c507119a261610693bf04.tar.gz eclipse.platform.team-bd54a38b309c5c1b766c507119a261610693bf04.tar.xz eclipse.platform.team-bd54a38b309c5c1b766c507119a261610693bf04.zip |
Support for exporting working sets as part of a Team Project Set
6 files changed, 1038 insertions, 506 deletions
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ProjectSetImporter.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ProjectSetImporter.java index ef8d0fc90..7172223cf 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ProjectSetImporter.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ProjectSetImporter.java @@ -10,36 +10,17 @@ *******************************************************************************/ package org.eclipse.team.internal.ui; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; +import java.util.*; import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.*; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; -import org.eclipse.team.core.IProjectSetSerializer; -import org.eclipse.team.core.ProjectSetCapability; -import org.eclipse.team.core.RepositoryProviderType; -import org.eclipse.team.core.Team; -import org.eclipse.team.core.TeamException; +import org.eclipse.team.core.*; import org.eclipse.team.internal.core.TeamPlugin; -import org.eclipse.ui.PlatformUI; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +import org.eclipse.ui.*; public class ProjectSetImporter { @@ -48,15 +29,11 @@ public class ProjectSetImporter { try { reader = new InputStreamReader(new FileInputStream(filename), "UTF-8"); //$NON-NLS-1$ - SAXParserFactory factory = SAXParserFactory.newInstance(); - SAXParser parser = factory.newSAXParser(); - ProjectSetContentHandler handler = new ProjectSetContentHandler(); - InputSource source = new InputSource(reader); - parser.parse(source, handler); + XMLMemento xmlMemento = XMLMemento.createReadRoot(reader); + String version = xmlMemento.getString("version"); //$NON-NLS-1$ - Map map = handler.getReferences(); List newProjects = new ArrayList(); - if ((map == null || map.size() == 0) && handler.isVersionOne()) { + if (version.equals("1.0")){ //$NON-NLS-1$ IProjectSetSerializer serializer = Team.getProjectSetSerializer("versionOneSerializer"); //$NON-NLS-1$ if (serializer != null) { IProject[] projects = serializer.addToWorkspace(new String[0], filename, shell, monitor); @@ -65,12 +42,16 @@ public class ProjectSetImporter { } } else { UIProjectSetSerializationContext context = new UIProjectSetSerializationContext(shell, filename); - Iterator it = map.keySet().iterator(); List errors = new ArrayList(); - while (it.hasNext()) { + ArrayList referenceStrings = new ArrayList(); + IMemento[] providers = xmlMemento.getChildren("provider"); //$NON-NLS-1$ + for (int i = 0; i < providers.length; i++) { + IMemento[] projects = providers[i].getChildren("project"); //$NON-NLS-1$ + for (int j = 0; j < projects.length; j++) { + referenceStrings.add(projects[j].getString("reference")); //$NON-NLS-1$ + } try { - String id = (String)it.next(); - List references = (List)map.get(id); + String id = providers[i].getString("id"); //$NON-NLS-1$ TeamCapabilityHelper.getInstance().processRepositoryId(id, PlatformUI.getWorkbench().getActivitySupport()); RepositoryProviderType providerType = RepositoryProviderType.getProviderType(id); @@ -84,15 +65,15 @@ public class ProjectSetImporter { ProjectSetCapability serializer = providerType.getProjectSetCapability(); ProjectSetCapability.ensureBackwardsCompatible(providerType, serializer); if (serializer != null) { - IProject[] projects = serializer.addToWorkspace((String[])references.toArray(new String[references.size()]), context, monitor); - if (projects != null) - newProjects.addAll(Arrays.asList(projects)); + IProject[] allProjects = serializer.addToWorkspace((String[])referenceStrings.toArray(new String[referenceStrings.size()]), context, monitor); + if (allProjects != null) + newProjects.addAll(Arrays.asList(allProjects)); } } catch (TeamException e) { errors.add(e); } } - if (!errors.isEmpty()) { + if (!errors.isEmpty()) { if (errors.size() == 1) { throw (TeamException)errors.get(0); } else { @@ -104,15 +85,25 @@ public class ProjectSetImporter { throw new TeamException(new MultiStatus(TeamUIPlugin.ID, 0, status, TeamUIMessages.ProjectSetImportWizard_1, null)); } } + + //try working sets + IMemento[] sets = xmlMemento.getChildren("workingSets"); //$NON-NLS-1$ + IWorkingSetManager wsManager = TeamUIPlugin.getPlugin().getWorkbench().getWorkingSetManager(); + + for (int i = 0; i < sets.length; i++) { + IWorkingSet ws = wsManager.createWorkingSet(sets[i]); + if (ws != null) + wsManager.addWorkingSet(ws); + } + } + return (IProject[]) newProjects.toArray(new IProject[newProjects.size()]); } catch (IOException e) { throw new InvocationTargetException(e); - } catch (SAXException e) { - throw new InvocationTargetException(e); } catch (TeamException e) { throw new InvocationTargetException(e); - } catch (ParserConfigurationException e) { + } catch (WorkbenchException e) { throw new InvocationTargetException(e); } finally { if (reader != null) { diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java index 43610425d..bace1203f 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java @@ -49,10 +49,16 @@ public class TeamUIMessages extends NLS { public static String ExportProjectSetMainPage_DeselectAll; + public static String ExportProjectSetMainPage_EditButton; + + public static String ExportProjectSetMainPage_ExportWorkingSets; + public static String ExportProjectSetMainPage_FileButton; public static String ExportProjectSetMainPage_SelectAll; + public static String ExportProjectSetMainPage_SelectButton; + public static String ExportProjectSetMainPage_WorkspaceButton; public static String ExportProjectSetMainPage_WorkspaceDialogErrorFilenameSegments; diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties index 6c5b91d23..e4d91b75c 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties @@ -81,6 +81,7 @@ ExportProjectSetMainPage_WorkspaceDialogMessage=Export Team Project Set to Works ExportProjectSetMainPage_WorkspaceDialogFilename=Filename ExportProjectSetMainPage_Browse_4=B&rowse... ExportProjectSetMainPage_SelectAll=S&elect All +ExportProjectSetMainPage_SelectButton=Select which working sets to export ExportProjectSetMainPage_Browse=Bro&wse ... ExportProjectSetMainPage_You_have_specified_a_folder_5=You have specified a folder ExportProjectSetMainPage_WorkspaceDialogTitleMessage=Select a Folder in the Workspace and Type in a Filename @@ -126,6 +127,7 @@ ImportProjectSetAction_0=An error occurred importing this project set. ImportProjectSetMainPage_Project_Set_Files_2=Team Project Set Files (*.psf) ExportProjectSetMainPage__File_name__1=&File name: ExportProjectSetMainPage_WorkspaceButton=W&orkspace +ExportProjectSetMainPage_ExportWorkingSets=Export working sets SyncViewPreferencePage_lastRefreshRunNever=Never @@ -326,6 +328,7 @@ ImportProjectSetMainPage_description=Creates projects from a previously exported ExportProjectSetMainPage_description=Save a file containing the names and locations of the shared projects in the workspace. ExportProjectSetMainPage_DeselectAll=&Deselect All ExportProjectSetMainPage_FileButton=F&ile +ExportProjectSetMainPage_EditButton=Edit... DefaultUIFileModificationValidator_0=Read-only Files Encountered DefaultUIFileModificationValidator_1=Some of the files being modified by the current operation are read-only. Do you wish to make them writable? diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ExportProjectSetLocationPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ExportProjectSetLocationPage.java new file mode 100644 index 000000000..aa55d1ceb --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ExportProjectSetLocationPage.java @@ -0,0 +1,409 @@ +/******************************************************************************* + * Copyright (c) 2006 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.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.*; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +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.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); + } + + 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, new Listener() { + public void handleEvent(Event event) { + saveToFileSystem = true; + 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.getSuggestedDefault(); + fileCombo.setItems(PsfFilenameStore.getHistory()); + fileCombo.setText(file); + fileCombo.addListener(SWT.Modify, new Listener() { + public void handleEvent(Event 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, new Listener() { + public void handleEvent(Event 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(System.getProperty("file.separator").charAt(0)); //$NON-NLS-1$ + 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, new Listener() { + public void handleEvent(Event 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, new Listener() { + public void handleEvent(Event 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, new Listener() { + public void handleEvent(Event 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) { + setMessage(null); + complete = false; + } else { + File f = new File(file); + if (f.isDirectory()) { + setMessage(TeamUIMessages.ExportProjectSetMainPage_You_have_specified_a_folder_5, ERROR); + complete = false; + } else { + if (!isSaveToFileSystem() && workspaceFile == null) + complete = false; + else + complete = true; + } + } + if (complete) { + setMessage(null); + } + setPageComplete(complete); + } + + 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; + + public WorkspaceDialog(Shell shell) { + super(shell); + } + + protected Control createContents(Composite parent) { + Control control = super.createContents(parent); + setTitle(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitle); + setMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitleMessage); + + return control; + } + + 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; + } + + protected void okPressed() { + //make sure that a filename has been typed in + + String patchName = wsFilenameText.getText(); + + if (patchName.equals("")) { //$NON-NLS-1$ + setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorNoFilename); + return; + } + + //make sure that the filename does not contain more than one segment + if (!(ResourcesPlugin.getWorkspace().validateName(patchName, IResource.FILE)).isOK()) { + wsFilenameText.setText(""); //$NON-NLS-1$ + setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorFilenameSegments); + return; + } + + //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(); + } + } + + protected void cancelPressed() { + //this.page.validatePage(); + getSelectedContainer(); + super.cancelPressed(); + } + + public boolean close() { + /* if (dlgTitleImage != null) + dlgTitleImage.dispose();*/ + return super.close(); + } + + void setupListeners() { + wsTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent 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(new IDoubleClickListener() { + public void doubleClick(DoubleClickEvent 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(new ModifyListener() { + public void modifyText(ModifyEvent e) { + setErrorMessage(null); + } + }); + } + } + + + class LocationPageContentProvider extends BaseWorkbenchContentProvider { + //Never show closed projects + boolean showClosedProjects = false; + + 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); + } + } +} diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ExportProjectSetMainPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ExportProjectSetMainPage.java index 178a17723..09aa5f656 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ExportProjectSetMainPage.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ExportProjectSetMainPage.java @@ -10,229 +10,136 @@ *******************************************************************************/ package org.eclipse.team.internal.ui.wizards; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.*; import java.util.List; import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.dialogs.*; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.graphics.Image; +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.*; import org.eclipse.team.core.RepositoryProvider; -import org.eclipse.team.internal.ui.IHelpContextIds; -import org.eclipse.team.internal.ui.TeamUIMessages; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.model.*; +import org.eclipse.team.internal.ui.*; +import org.eclipse.ui.*; +import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog; +import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.ui.part.Page; +import org.eclipse.ui.part.PageBook; public class ExportProjectSetMainPage extends TeamWizardPage { - Combo fileCombo; - protected Text workspaceText; - protected String file = ""; //$NON-NLS-1$ - protected IFile workspaceFile; - Button browseButton; - List selectedProjects = new ArrayList(); - - CheckboxTableViewer tableViewer; - Table table; - - private boolean saveToFileSystem; - private Button fileRadio; - private Button workspaceRadio; - - class ProjectContentProvider extends WorkbenchContentProvider { - public Object[] getElements(Object element) { - if (element instanceof IProject[]) - return (IProject[]) element; + + + PageBook book; + ProjectPage projectPage; + WorkingSetPage workingSetPage; + + IExportProjectSetPage selectedPage; + + Button exportWorkingSets; + + ArrayList passedInSelectedProjects = new ArrayList(); + + class ProjectContentProvider implements ITreePathContentProvider{ + + public Object[] getChildren(TreePath parentPath) { + Object obj = parentPath.getLastSegment(); + if (obj instanceof IWorkingSet){ + return ((IWorkingSet)obj).getElements(); + } return null; } - }; - class LocationPageContentProvider extends BaseWorkbenchContentProvider { - //Never show closed projects - boolean showClosedProjects = false; - - 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]); + public TreePath[] getParents(Object element) { + if (element instanceof IProject){ + ArrayList treePaths = new ArrayList(); + IWorkingSet[] workingSets = TeamUIPlugin.getPlugin().getWorkbench().getWorkingSetManager().getWorkingSets(); + for (int i = 0; i < workingSets.length; i++) { + IAdaptable[] elements = workingSets[i].getElements(); + for (int j = 0; j < elements.length; j++) { + if (elements[j].equals(element)){ + treePaths.add(workingSets[i]); + break; + } } } - return accessibleProjects.toArray(); - } - - return super.getChildren(element); - } - } - - class WorkspaceDialog extends TitleAreaDialog { - - protected TreeViewer wsTreeViewer; - protected Text wsFilenameText; - protected IContainer wsContainer; - protected Image dlgTitleImage; - - public WorkspaceDialog(Shell shell) { - super(shell); - } - - protected Control createContents(Composite parent) { - Control control = super.createContents(parent); - setTitle(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitle); - setMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogTitleMessage); - - return control; - } - - 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; - } - - protected void okPressed() { - //make sure that a filename has been typed in - - String patchName = wsFilenameText.getText(); - - if (patchName.equals("")) { //$NON-NLS-1$ - setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorNoFilename); - return; + return (TreePath[]) treePaths.toArray(new TreePath[treePaths.size()]); } - - //make sure that the filename does not contain more than one segment - if (!(ResourcesPlugin.getWorkspace().validateName(patchName, IResource.FILE)).isOK()) { - wsFilenameText.setText(""); //$NON-NLS-1$ - setErrorMessage(TeamUIMessages.ExportProjectSetMainPage_WorkspaceDialogErrorFilenameSegments); - return; - } - - //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(); - } - } - - protected void cancelPressed() { - //this.page.validatePage(); - getSelectedContainer(); - super.cancelPressed(); + return null; } - public boolean close() { - /* if (dlgTitleImage != null) - dlgTitleImage.dispose();*/ - return super.close(); + public boolean hasChildren(TreePath path) { + Object obj = path.getLastSegment(); + if (obj instanceof IWorkingSet) + return true; + + return false; } - void setupListeners() { - wsTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection s = (IStructuredSelection) event.getSelection(); - Object obj = s.getFirstElement(); - if (obj != null) { - + public Object[] getElements(Object inputElement) { + if (inputElement instanceof IWorkspaceRoot) { + IWorkspaceRoot root = (IWorkspaceRoot) inputElement; + List projectList = new ArrayList(); + IProject[] workspaceProjects = root.getProjects(); + for (int i = 0; i < workspaceProjects.length; i++) { + if (RepositoryProvider.getProvider(workspaceProjects[i]) != null) { + projectList.add(workspaceProjects[i]); } - if (obj instanceof IContainer) - wsContainer = (IContainer) obj; - else if (obj instanceof IFile) { - IFile tempFile = (IFile) obj; - wsContainer = tempFile.getParent(); - wsFilenameText.setText(tempFile.getName()); + } + return projectList.toArray(new IProject[projectList.size()]); + } else if (inputElement instanceof IWorkingSetManager){ + IWorkingSetManager manager = (IWorkingSetManager) inputElement; + IWorkingSet[] allSets = manager.getAllWorkingSets(); + ArrayList resourceSets = new ArrayList(); + for (int i = 0; i < allSets.length; i++) { + String id = allSets[i].getId(); + if (id != null && id.equals(WorkingSetsDialog.resourceWorkingSetId)) { + resourceSets.add(allSets[i]); } } - }); - - wsTreeViewer.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent 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); + + return resourceSets.toArray(new IWorkingSet[resourceSets.size()]); + } else if (inputElement instanceof IAdaptable){ + Object tempProject = ((IAdaptable) inputElement).getAdapter(IProject.class); + if (tempProject != null){ + return new IProject[]{((IProject)tempProject)}; + } + } + else if (inputElement instanceof IAdaptable[]){ + IAdaptable[] tempAdaptable = (IAdaptable[]) inputElement; + List projectList = new ArrayList(); + for (int i = 0; i < tempAdaptable.length; i++) { + if (tempAdaptable[i].getAdapter(IProject.class) != null){ + projectList.add(tempAdaptable[i]); } } - }); + return projectList.toArray(new IProject[projectList.size()]); + } else if (inputElement instanceof HashSet){ + HashSet tempList = (HashSet) inputElement; + return (IProject[]) tempList.toArray(new IProject[tempList.size()]); + } + + return null; + } - wsFilenameText.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - setErrorMessage(null); - } - }); + public void dispose() { + } - } + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + + } + + }; + public ExportProjectSetMainPage(String pageName, String title, ImageDescriptor titleImage) { super(pageName, title, titleImage); setDescription(TeamUIMessages.ExportProjectSetMainPage_description); @@ -242,279 +149,478 @@ public class ExportProjectSetMainPage extends TeamWizardPage { * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { - Composite composite = createComposite(parent, 1); - initializeDialogUnits(composite); - + Composite c = SWTUtils.createHVFillComposite(parent, 0); + + //Add the export working set section + exportWorkingSets(c); + + book = new PageBook(c, SWT.NONE); + book.setLayoutData(SWTUtils.createHVFillGridData()); // set F1 help - PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.EXPORT_PROJECT_SET_PAGE); - - createLabel(composite, TeamUIMessages.ExportProjectSetMainPage_Select_the_projects_to_include_in_the_project_set__2); - - table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); - tableViewer = new CheckboxTableViewer(table); - table.setLayout(new TableLayout()); - GridData data = new GridData(GridData.FILL_BOTH); - data.heightHint = 300; - table.setLayoutData(data); - tableViewer.setContentProvider(new ProjectContentProvider()); - tableViewer.setLabelProvider(new WorkbenchLabelProvider()); - tableViewer.addCheckStateListener(new ICheckStateListener() { - public void checkStateChanged(CheckStateChangedEvent event) { - IProject project = (IProject) event.getElement(); - if (event.getChecked()) { - selectedProjects.add(project); - } else { - selectedProjects.remove(project); - } - updateEnablement(); - } - }); + PlatformUI.getWorkbench().getHelpSystem().setHelp(book, IHelpContextIds.EXPORT_PROJECT_SET_PAGE); + + projectPage = new ProjectPage(); + projectPage.createControl(book); + + workingSetPage = new WorkingSetPage(); + workingSetPage.createControl(book); + + setControl(c); + book.showPage(projectPage.getControl()); + + selectedPage = projectPage; + //pass in any selected + projectPage.getSelectedProjects().addAll(passedInSelectedProjects); + projectPage.getReferenceCountProjects().addAll(passedInSelectedProjects); + + Dialog.applyDialogFont(parent); + } - Composite buttonComposite = new Composite(composite, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - layout.marginWidth = 0; - buttonComposite.setLayout(layout); - data = new GridData(SWT.FILL, SWT.FILL, true, false); - buttonComposite.setLayoutData(data); - - Button selectAll = new Button(buttonComposite, SWT.PUSH); - data = new GridData(); - data.verticalAlignment = GridData.BEGINNING; - data.horizontalAlignment = GridData.END; - int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); - data.widthHint = Math.max(widthHint, selectAll.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); - selectAll.setLayoutData(data); - selectAll.setText(TeamUIMessages.ExportProjectSetMainPage_SelectAll); - selectAll.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - tableViewer.setAllChecked(true); - selectedProjects.removeAll(selectedProjects); - Object[] checked = tableViewer.getCheckedElements(); - for (int i = 0; i < checked.length; i++) { - selectedProjects.add(checked[i]); + + + + + private void exportWorkingSets(Composite composite) { + exportWorkingSets = new Button(composite, SWT.CHECK | SWT.LEFT); + exportWorkingSets.setText(TeamUIMessages.ExportProjectSetMainPage_ExportWorkingSets); + + exportWorkingSets.setSelection(false); + exportWorkingSets.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + if (((Button) e.widget).getSelection()){ + book.showPage(workingSetPage.getControl()); + selectedPage = workingSetPage; + workingSetPage.refresh(); + } + else{ + book.showPage(projectPage.getControl()); + selectedPage = projectPage; } - updateEnablement(); - } - }); - - Button deselectAll = new Button(buttonComposite, SWT.PUSH); - data = new GridData(); - data.verticalAlignment = GridData.BEGINNING; - data.horizontalAlignment = GridData.END; - widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); - data.widthHint = Math.max(widthHint, deselectAll.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); - deselectAll.setLayoutData(data); - deselectAll.setText(TeamUIMessages.ExportProjectSetMainPage_DeselectAll); - deselectAll.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - tableViewer.setAllChecked(false); - selectedProjects.removeAll(selectedProjects); - updateEnablement(); } }); + } + + public IWorkingSet[] getSelectedWorkingSets(){ + return (IWorkingSet[]) selectedPage.getWorkingSet().toArray(new IWorkingSet[selectedPage.getWorkingSet().size()]); + } + + public IProject[] getSelectedProjects() { + return (IProject[]) selectedPage.getSelectedProjects().toArray(new IProject[selectedPage.getSelectedProjects().size()]); + } - Group locationGroup = new Group(composite, SWT.None); - layout = new GridLayout(); - locationGroup.setLayout(layout); - 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; - - initializeProjects(); - setControl(composite); - updateEnablement(); - Dialog.applyDialogFont(parent); + public void setSelectedProjects(IProject[] selectedProjects) { + passedInSelectedProjects.addAll(Arrays.asList(selectedProjects)); + } + + private interface IExportProjectSetPage{ + HashSet getSelectedProjects(); + ArrayList getReferenceCountProjects(); + ArrayList getWorkingSet(); } + + private class ProjectPage extends Page implements IExportProjectSetPage { + private Composite projectComposite; + + private CheckboxTableViewer tableViewer; + private Table table; + + HashSet selectedProjects = new HashSet(); + ArrayList referenceCountProjects = new ArrayList(); + ArrayList selectedWorkingSet = new ArrayList(); + + public void createControl(Composite parent) { + //projectComposite = createComposite(parent, 1); + + projectComposite = new Composite(parent, SWT.NULL); + + // GridLayout + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + projectComposite.setLayout(layout); + + // GridData + GridData data = new GridData(); + data.verticalAlignment = GridData.FILL; + data.horizontalAlignment = GridData.FILL; + data.grabExcessHorizontalSpace=true; + data.grabExcessVerticalSpace=true; + projectComposite.setLayoutData(data); + + initializeDialogUnits(projectComposite); + + //Adds the project table + addProjectSection(projectComposite); + initializeProjects(); + updateEnablement(); + } - private void createExportToFile(Composite composite) { - fileRadio = new Button(composite, SWT.RADIO); - fileRadio.setText(TeamUIMessages.ExportProjectSetMainPage_FileButton); - fileRadio.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - saveToFileSystem = true; - updateEnablement(); - } - }); + public Control getControl() { + return projectComposite; + } - 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.getSuggestedDefault(); - fileCombo.setItems(PsfFilenameStore.getHistory()); - fileCombo.setText(file); - fileCombo.addListener(SWT.Modify, new Listener() { - public void handleEvent(Event event) { - file = fileCombo.getText(); - updateEnablement(); - } - }); + public void setFocus() { + projectComposite.setFocus(); + } + + private void addProjectSection(Composite composite) { + + createLabel(composite, TeamUIMessages.ExportProjectSetMainPage_Select_the_projects_to_include_in_the_project_set__2); + + table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + tableViewer = new CheckboxTableViewer(table); + table.setLayout(new TableLayout()); + GridData data = new GridData(GridData.FILL_BOTH); + data.heightHint = 300; + table.setLayoutData(data); + tableViewer.setContentProvider(new ProjectContentProvider()); + tableViewer.setLabelProvider(new WorkbenchLabelProvider()); + tableViewer.addCheckStateListener(new ICheckStateListener() { + public void checkStateChanged(CheckStateChangedEvent event) { + Object temp = event.getElement(); + if (temp instanceof IProject){ + IProject project = (IProject) event.getElement(); + if (event.getChecked()) { + selectedProjects.add(project); + referenceCountProjects.add(project); + } else { + selectedProjects.remove(project); + referenceCountProjects.remove(project); + } + } else if (temp instanceof IWorkingSet){ + IWorkingSet workingSet = (IWorkingSet) temp; + if (event.getChecked()){ + IAdaptable[] elements = workingSet.getElements(); + for (int i = 0; i < elements.length; i++) { + selectedProjects.add(elements[i]); + } + } else { + IAdaptable[] elements = workingSet.getElements(); + for (int i = 0; i < elements.length; i++) { + selectedProjects.remove(elements[i]); + } + } + } + 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, new Listener() { - public void handleEvent(Event 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(System.getProperty("file.separator").charAt(0)); //$NON-NLS-1$ - if (separator != -1) { - fileName = fileName.substring(0, separator); + Composite buttonComposite = new Composite(composite, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + layout.marginWidth = 0; + buttonComposite.setLayout(layout); + data = new GridData(SWT.FILL, SWT.FILL, true, false); + buttonComposite.setLayoutData(data); + + Button selectAll = new Button(buttonComposite, SWT.PUSH); + data = new GridData(); + data.verticalAlignment = GridData.BEGINNING; + data.horizontalAlignment = GridData.END; + int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); + data.widthHint = Math.max(widthHint, selectAll.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); + selectAll.setLayoutData(data); + selectAll.setText(TeamUIMessages.ExportProjectSetMainPage_SelectAll); + selectAll.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + tableViewer.setAllChecked(true); + selectedProjects.removeAll(selectedProjects); + Object[] checked = tableViewer.getCheckedElements(); + for (int i = 0; i < checked.length; i++) { + selectedProjects.add(checked[i]); } + updateEnablement(); } - d.setFilterPath(fileName); - String f = d.open(); - if (f != null) { - fileCombo.setText(f); - file = f; + }); + + Button deselectAll = new Button(buttonComposite, SWT.PUSH); + data = new GridData(); + data.verticalAlignment = GridData.BEGINNING; + data.horizontalAlignment = GridData.END; + widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); + data.widthHint = Math.max(widthHint, deselectAll.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); + deselectAll.setLayoutData(data); + deselectAll.setText(TeamUIMessages.ExportProjectSetMainPage_DeselectAll); + deselectAll.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + tableViewer.setAllChecked(false); + selectedProjects.removeAll(selectedProjects); + updateEnablement(); } + }); + } + + private void initializeProjects() { + tableViewer.setInput(ResourcesPlugin.getWorkspace().getRoot()); + + // Check any necessary projects + if (selectedProjects != null) { + tableViewer.setCheckedElements(selectedProjects.toArray(new IProject[selectedProjects.size()])); } - }); - } - - private void createExportToWorkspace(Composite composite) { - workspaceRadio = new Button(composite, SWT.RADIO); - workspaceRadio.setText(TeamUIMessages.ExportProjectSetMainPage_WorkspaceButton); - workspaceRadio.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - saveToFileSystem = false; - updateEnablement(); + } + + private void updateEnablement() { + boolean complete; + + complete = (selectedProjects.size() != 0); + + if (complete) { + setMessage(null); } - }); + setPageComplete(complete); + } - 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, new Listener() { - public void handleEvent(Event 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, new Listener() { - public void handleEvent(Event event) { - if (isSaveToFileSystem()) - saveToFileSystem = false; - - WorkspaceDialog d = new WorkspaceDialog(getShell()); - d.open(); - } - }); - } + public ArrayList getReferenceCountProjects() { + return referenceCountProjects; + } - private void initializeProjects() { - List projectList = new ArrayList(); - IProject[] workspaceProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); - for (int i = 0; i < workspaceProjects.length; i++) { - if (RepositoryProvider.getProvider(workspaceProjects[i]) != null) { - projectList.add(workspaceProjects[i]); - } + public HashSet getSelectedProjects() { + return selectedProjects; } - tableViewer.setInput(projectList.toArray(new IProject[projectList.size()])); - // Check any necessary projects - if (selectedProjects != null) { - tableViewer.setCheckedElements(selectedProjects.toArray(new IProject[selectedProjects.size()])); + + public ArrayList getWorkingSet() { + return selectedWorkingSet; } + } - private void updateEnablement() { - boolean complete; - //update radio buttons - fileRadio.setSelection(saveToFileSystem); - workspaceRadio.setSelection(!saveToFileSystem); - - if (selectedProjects.size() == 0) { - setMessage(null); - complete = false; - } else if (file.length() == 0) { - setMessage(null); - complete = false; - } else { - File f = new File(file); - if (f.isDirectory()) { - setMessage(TeamUIMessages.ExportProjectSetMainPage_You_have_specified_a_folder_5, ERROR); - complete = false; - } else { - if (!isSaveToFileSystem() && workspaceFile == null) - complete = false; - else - complete = true; + private class WorkingSetPage extends Page implements IExportProjectSetPage { + + private Composite projectComposite; + private Table wsTable; + private CheckboxTableViewer wsTableViewer; + + private Table table; + private TableViewer tableViewer; + + + HashSet selectedProjects = new HashSet(); + ArrayList referenceCountProjects = new ArrayList(); + ArrayList selectedWorkingSet = new ArrayList(); + + public void createControl(Composite parent) { + + projectComposite = SWTUtils.createHVFillComposite(parent, 0, 2); + initializeDialogUnits(projectComposite); + + Label label = createLabel (projectComposite, TeamUIMessages.ExportProjectSetMainPage_SelectButton); + GridData grid = (GridData) label.getLayoutData(); + grid.horizontalSpan = 2; + label.setData(grid); + + //Adds the working set table + addWorkingSetSection(projectComposite); + + addProjectSection(projectComposite); + + addButtons(projectComposite); + updateEnablement(); + } + + private void addProjectSection(Composite composite) { + + table = new Table(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + tableViewer = new TableViewer(table); + table.setLayout(new TableLayout()); + GridData data = new GridData(GridData.FILL_BOTH); + data.heightHint = 300; + table.setLayoutData(data); + tableViewer.setContentProvider(new ProjectContentProvider()); + tableViewer.setLabelProvider(new WorkbenchLabelProvider()); } + + private void addWorkingSetSection(Composite projectComposite) { + + wsTable = new Table(projectComposite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + wsTableViewer = new CheckboxTableViewer(wsTable); + wsTable.setLayout(new TableLayout()); + GridData data = new GridData(GridData.FILL_BOTH); + data.heightHint = 300; + wsTable.setLayoutData(data); + wsTableViewer.setContentProvider(new ProjectContentProvider()); + wsTableViewer.setLabelProvider(new WorkbenchLabelProvider()); + wsTableViewer.addCheckStateListener(new ICheckStateListener() { + public void checkStateChanged(CheckStateChangedEvent event) { + Object temp = event.getElement(); + if (temp instanceof IWorkingSet){ + IWorkingSet workingSet = (IWorkingSet) temp; + if (event.getChecked()){ + workingSetAdded(workingSet); + //Add the selected project to the table viewer + tableViewer.setInput(selectedProjects); + } else { + workingSetRemoved(workingSet); + //Add the selected project to the table viewer + tableViewer.setInput(selectedProjects); + } + } + updateEnablement(); + } + }); + + wsTableViewer.setInput(TeamUIPlugin.getPlugin().getWorkbench().getWorkingSetManager()); } - if (complete) { - setMessage(null); + + private void addButtons(Composite projectComposite){ + + Composite buttonComposite = new Composite(projectComposite, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 3; + layout.marginWidth = 0; + buttonComposite.setLayout(layout); + GridData data = new GridData(SWT.FILL, SWT.FILL, false, false); + buttonComposite.setLayoutData(data); + + Button selectAll = new Button(buttonComposite, SWT.PUSH); + data = new GridData(); + data.verticalAlignment = GridData.FILL; + data.horizontalAlignment = GridData.FILL; + int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); + data.widthHint = Math.max(widthHint, selectAll.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); + selectAll.setLayoutData(data); + selectAll.setText(TeamUIMessages.ExportProjectSetMainPage_SelectAll); + selectAll.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + wsTableViewer.setAllChecked(true); + + selectedProjects.removeAll(selectedProjects); + selectedWorkingSet.removeAll(selectedWorkingSet); + Object[] checked = wsTableViewer.getCheckedElements(); + for (int i = 0; i < checked.length; i++) { + selectedWorkingSet.add(checked[i]); + if (checked[i] instanceof IWorkingSet){ + IWorkingSet ws = (IWorkingSet) checked[i]; + IAdaptable[] elements = ws.getElements(); + selectedProjects.addAll(Arrays.asList(elements)); + referenceCountProjects.addAll(Arrays.asList(elements)); + } + tableViewer.setInput(selectedProjects); + } + updateEnablement(); + } + }); + + Button deselectAll = new Button(buttonComposite, SWT.PUSH); + data = new GridData(); + data.verticalAlignment = GridData.FILL; + data.horizontalAlignment = GridData.FILL; + widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); + data.widthHint = Math.max(widthHint, deselectAll.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); + deselectAll.setLayoutData(data); + deselectAll.setText(TeamUIMessages.ExportProjectSetMainPage_DeselectAll); + deselectAll.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + wsTableViewer.setAllChecked(false); + selectedWorkingSet.removeAll(selectedWorkingSet); + selectedProjects.removeAll(selectedProjects); + referenceCountProjects.removeAll(selectedProjects); + tableViewer.setInput(selectedProjects); + updateEnablement(); + } + }); + + Button newWorkingSet = new Button(buttonComposite, SWT.PUSH); + data = new GridData(); + data.verticalAlignment = GridData.FILL; + data.horizontalAlignment = GridData.FILL; + widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); + data.widthHint = Math.max(widthHint, deselectAll.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); + newWorkingSet.setLayoutData(data); + newWorkingSet.setText(TeamUIMessages.ExportProjectSetMainPage_EditButton); + newWorkingSet.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + final IWorkingSetManager workingSetManager = TeamUIPlugin.getPlugin().getWorkbench().getWorkingSetManager(); + IWorkingSetSelectionDialog wsWizard = workingSetManager.createWorkingSetSelectionDialog(getShell(), false); + if (wsWizard != null) { + IPropertyChangeListener propListener = null; + try { + //add event listener + propListener = new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + + }}; + + workingSetManager.addPropertyChangeListener(propListener); + wsWizard.open(); + //recalculate working sets + selectedWorkingSet.removeAll(selectedWorkingSet); + referenceCountProjects.removeAll(selectedProjects); + selectedProjects.removeAll(selectedProjects); + wsTableViewer.setInput(workingSetManager); + Object[] checked = wsTableViewer.getCheckedElements(); + for (int i = 0; i < checked.length; i++) { + selectedWorkingSet.add(checked[i]); + if (checked[i] instanceof IWorkingSet) { + IWorkingSet ws = (IWorkingSet) checked[i]; + IAdaptable[] elements = ws.getElements(); + selectedProjects.addAll(Arrays.asList(elements)); + referenceCountProjects.addAll(Arrays.asList(elements)); + } + + } + + wsTableViewer.setInput(workingSetManager); + tableViewer.setInput(selectedProjects); + } finally { + if (propListener != null) + workingSetManager.removePropertyChangeListener(propListener); + } + } + } + }); + } + + public Control getControl() { + return projectComposite; } - setPageComplete(complete); - } - public String getFileName() { - return file; - } + public void setFocus() { + projectComposite.setFocus(); + } - public void setFileName(String file) { - if (file != null) { - this.file = file; + public void refresh(){ + wsTableViewer.setInput(TeamUIPlugin.getPlugin().getWorkbench().getWorkingSetManager()); + } + + private void updateEnablement() { + boolean complete; + + complete = ((selectedProjects.size() != 0) && (selectedWorkingSet.size() != 0)); + + if (complete) { + setMessage(null); + } + setPageComplete(complete); } - } - public IProject[] getSelectedProjects() { - return (IProject[]) selectedProjects.toArray(new IProject[selectedProjects.size()]); - } + public ArrayList getReferenceCountProjects() { + return referenceCountProjects; + } - public void setSelectedProjects(IProject[] selectedProjects) { - this.selectedProjects.addAll(Arrays.asList(selectedProjects)); - } + public HashSet getSelectedProjects() { + return selectedProjects; + } - public void setVisible(boolean visible) { - super.setVisible(visible); - if (visible) { - fileCombo.setFocus(); + public ArrayList getWorkingSet() { + return selectedWorkingSet; } - } - public boolean isSaveToFileSystem() { - return saveToFileSystem; - } + private void workingSetAdded(IWorkingSet workingSet) { + IAdaptable[] elements = workingSet.getElements(); + selectedWorkingSet.add(workingSet); + for (int i = 0; i < elements.length; i++) { + selectedProjects.add(elements[i]); + referenceCountProjects.add(elements[i]); + } + } - public void refreshWorkspaceFile(IProgressMonitor monitor) throws CoreException { - if (workspaceFile != null) - workspaceFile.refreshLocal(IResource.DEPTH_ONE, monitor); + private void workingSetRemoved(IWorkingSet workingSet) { + IAdaptable[] elements = workingSet.getElements(); + selectedWorkingSet.remove(workingSet); + selectedProjects.removeAll(Arrays.asList(elements)); + for (int i = 0; i < elements.length; i++) { + referenceCountProjects.remove(elements[i]); + } + selectedProjects.addAll(referenceCountProjects); + } } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ProjectSetExportWizard.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ProjectSetExportWizard.java index c803d4cd0..64636911d 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ProjectSetExportWizard.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ProjectSetExportWizard.java @@ -12,11 +12,10 @@ package org.eclipse.team.internal.ui.wizards; import java.io.*; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.*; @@ -27,11 +26,13 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.team.core.*; import org.eclipse.team.internal.ui.*; -import org.eclipse.ui.IExportWizard; -import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.*; +import org.w3c.dom.Document; +import org.w3c.dom.Element; public class ProjectSetExportWizard extends Wizard implements IExportWizard { ExportProjectSetMainPage mainPage; + ExportProjectSetLocationPage locationPage; IStructuredSelection selection; public ProjectSetExportWizard() { @@ -42,15 +43,18 @@ public class ProjectSetExportWizard extends Wizard implements IExportWizard { public void addPages() { mainPage = new ExportProjectSetMainPage("projectSetMainPage", TeamUIMessages.ProjectSetExportWizard_Export_a_Project_Set_3, TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_PROJECTSET_EXPORT_BANNER)); //$NON-NLS-1$ IProject[] projects = (IProject[])selection.toList().toArray(new IProject[0]); - mainPage.setSelectedProjects(projects); addPage(mainPage); + mainPage.setSelectedProjects(projects); + locationPage = new ExportProjectSetLocationPage("projectSetLocationPage", TeamUIMessages.ProjectSetExportWizard_Export_a_Project_Set_3, TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_PROJECTSET_EXPORT_BANNER)); //$NON-NLS-1$ + addPage(locationPage); + } public boolean performFinish() { final boolean[] result = new boolean[] {false}; try { getContainer().run(false, false, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException { - String filename = mainPage.getFileName(); + String filename = locationPage.getFileName(); Path path = new Path(filename); if (path.getFileExtension() == null) { filename = filename + ".psf"; //$NON-NLS-1$ @@ -78,7 +82,11 @@ public class ProjectSetExportWizard extends Wizard implements IExportWizard { return; } } - + + IWorkingSet[] workingSets = null; + if (mainPage.exportWorkingSets.getSelection()){ + workingSets = mainPage.getSelectedWorkingSets(); + } // Hash the projects by provider IProject[] projects = mainPage.getSelectedProjects(); Map map = new HashMap(); @@ -102,21 +110,14 @@ public class ProjectSetExportWizard extends Wizard implements IExportWizard { try { writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); //$NON-NLS-1$ - writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); //$NON-NLS-1$ - writer.newLine(); - writer.write("<psf version=\"2.0\">"); //$NON-NLS-1$ - writer.newLine(); - - // For each provider id, do the writing - + // + XMLMemento xmlMemento = getXMLMementoRoot(); Iterator it = map.keySet().iterator(); monitor.beginTask(null, 1000 * map.keySet().size()); while (it.hasNext()) { String id = (String)it.next(); - writer.write("\t<provider id=\""); //$NON-NLS-1$ - writer.write(id); - writer.write("\">"); //$NON-NLS-1$ - writer.newLine(); + IMemento memento = xmlMemento.createChild("provider"); //$NON-NLS-1$ + memento.putString("id", id); //$NON-NLS-1$ List list = (List)map.get(id); IProject[] projectArray = (IProject[])list.toArray(new IProject[list.size()]); RepositoryProviderType providerType = RepositoryProviderType.getProviderType(id); @@ -125,17 +126,18 @@ public class ProjectSetExportWizard extends Wizard implements IExportWizard { if (serializer != null) { String[] references = serializer.asReference(projectArray, context, new SubProgressMonitor(monitor, 990)); for (int i = 0; i < references.length; i++) { - writer.write("\t\t<project reference=\""); //$NON-NLS-1$ - writer.write(references[i]); - writer.write("\"/>"); //$NON-NLS-1$ - writer.newLine(); + IMemento proj = memento.createChild("project"); //$NON-NLS-1$ + proj.putString("reference", references[i]); //$NON-NLS-1$ } } - writer.write("\t</provider>"); //$NON-NLS-1$ - writer.newLine(); } - writer.write("</psf>"); //$NON-NLS-1$ - writer.newLine(); + if (workingSets != null){ + for (int i = 0; i < workingSets.length; i++) { + IMemento memento =xmlMemento.createChild("workingSets"); //$NON-NLS-1$ + workingSets[i].saveState(memento); + } + } + xmlMemento.save(writer); result[0] = true; } catch (IOException e) { throw new InvocationTargetException(e); @@ -152,9 +154,9 @@ public class ProjectSetExportWizard extends Wizard implements IExportWizard { } // if file was written to the workspace, refresh it - if (!mainPage.isSaveToFileSystem()) + if (!locationPage.isSaveToFileSystem()) try { - mainPage.refreshWorkspaceFile(monitor); + locationPage.refreshWorkspaceFile(monitor); } catch (CoreException e) { //throw away } @@ -173,6 +175,21 @@ public class ProjectSetExportWizard extends Wizard implements IExportWizard { monitor.done(); } + + private XMLMemento getXMLMementoRoot() { + Document document; + try { + document = DocumentBuilderFactory.newInstance() + .newDocumentBuilder().newDocument(); + Element element = document.createElement("psf"); //$NON-NLS-1$ + element.setAttribute("version", "2.0"); //$NON-NLS-1$ //$NON-NLS-2$ + document.appendChild(element); + return new XMLMemento(document, element); + } catch (ParserConfigurationException e) { + throw new Error(e.getMessage()); + } + } + }); } catch (InterruptedException e) { return true; |