blob: 619929cef241fb5f0baa6b4d0ac14c1f10b57911 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 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.ccvs.ui.wizards;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.Splitter;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
import org.eclipse.team.core.diff.*;
import org.eclipse.team.core.mapping.IResourceDiffTree;
import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
import org.eclipse.team.internal.ccvs.ui.IHelpContextIds;
import org.eclipse.team.internal.ccvs.ui.mappings.ModelSynchronizeWizard;
import org.eclipse.team.internal.ui.*;
import org.eclipse.team.ui.synchronize.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.PageBook;
/**
* Page that displays the compare input for sharing
*/
public class SharingWizardSyncPage extends CVSWizardPage implements IDiffChangeListener {
// Constant keys used to store last size for this page
private static final String PAGE_HEIGHT = "SyncPageHeight"; //$NON-NLS-1$
private static final String PAGE_WIDTH = "SyncPageWidth"; //$NON-NLS-1$
private ParticipantPageCompareEditorInput input;
private ISynchronizePageConfiguration configuration;
private IProject project;
PageBook pageBook;
private Control syncPage;
private Control noChangesPage;
private int width;
private int height;
private SharingWizardPageActionGroup sharingWizardPageActionGroup;
private Button fCheckbox;
public SharingWizardSyncPage(String pageName, String title, ImageDescriptor titleImage, String description) {
super(pageName, title, titleImage, description);
}
public void setProject(IProject project) {
this.project = project;
}
@Override
public void createControl(Composite parent) {
final PixelConverter converter= SWTUtils.createDialogPixelConverter(parent);
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(SWTUtils.createGridLayout(1, converter, SWTUtils.MARGINS_DEFAULT));
setControl(composite);
pageBook = new PageBook(composite, SWT.NONE);
pageBook.setLayoutData(SWTUtils.createHVFillGridData());
syncPage = createSyncPage(pageBook);
noChangesPage = createNoChangesPage(pageBook);
noChangesPage.setLayoutData(SWTUtils.createHVFillGridData());
updatePage();
PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.SHARING_SYNC_PAGE);
Dialog.applyDialogFont(parent);
}
private IResourceDiffTree getDiffTree() {
if (configuration == null)
return null;
return getParticipant().getContext().getDiffTree();
}
private Control createSyncPage(PageBook pageBook) {
Composite composite = createComposite(pageBook, 1, false);
input = createCompareInput();
Control c = input.createContents(composite);
if (c instanceof Splitter) {
Splitter s = (Splitter) c;
// hide the content pane by maximizing the outline control
s.setMaximizedControl(s.getChildren()[0]);
}
c.setLayoutData(new GridData(GridData.FILL_BOTH));
getDiffTree().addDiffChangeListener(this);
fCheckbox= new Button(composite, SWT.CHECK);
fCheckbox.setLayoutData(SWTUtils.createHFillGridData());
fCheckbox.setText(CVSUIMessages.SharingWizardSyncPage_12);
fCheckbox.setSelection(true);
return composite;
}
private Control createNoChangesPage(PageBook pageBook) {
Composite composite = createComposite(pageBook, 1, false);
createWrappingLabel(composite, NLS.bind(CVSUIMessages.SharingWizardSyncPage_3, new String[] { project.getName() }), 0);
return composite;
}
/* private */ void showErrors(final IStatus[] status) {
if (status.length == 0) return;
getShell().getDisplay().syncExec(() -> {
String title = CVSUIMessages.SharingWizardSyncPage_8;
if (status.length == 1) {
IStatus s = status[0];
if (s.getException() instanceof CoreException) {
s = ((CoreException) s.getException()).getStatus();
}
ErrorDialog.openError(getShell(), title, null, s);
} else {
MultiStatus multi = new MultiStatus(CVSUIPlugin.ID, 0, status, CVSUIMessages.SharingWizardSyncPage_9,
null);
ErrorDialog.openError(getShell(), title, null, multi);
}
});
}
private ParticipantPageCompareEditorInput createCompareInput() {
ISynchronizeParticipant participant = createParticipant();
configuration = participant.createPageConfiguration();
configuration.setProperty(ISynchronizePageConfiguration.P_TOOLBAR_MENU, new String[] {ISynchronizePageConfiguration.NAVIGATE_GROUP, SharingWizardPageActionGroup.ACTION_GROUP});
sharingWizardPageActionGroup = new SharingWizardPageActionGroup();
configuration.addActionContribution(sharingWizardPageActionGroup);
configuration.setRunnableContext(getContainer());
CompareConfiguration cc = new CompareConfiguration();
cc.setLeftEditable(false);
cc.setRightEditable(false);
ParticipantPageCompareEditorInput part = new ParticipantPageCompareEditorInput(cc, configuration, participant) {
@Override
protected boolean isOfferToRememberParticipant() {
return false;
}
};
return part;
}
private ISynchronizeParticipant createParticipant() {
return ModelSynchronizeWizard.createWorkspaceParticipant(Utils.getResourceMappings(new IProject[] { project }), getShell());
}
@Override
public void dispose() {
if (input != null) {
input.getParticipant().dispose();
}
}
@Override
public void setPreviousPage(IWizardPage page) {
// There's no going back from this page
super.setPreviousPage(null);
}
private void updatePage() {
Display.getDefault().syncExec(() -> {
if (pageBook.isDisposed())
return;
if (getDiffTree().isEmpty()) {
pageBook.showPage(noChangesPage);
} else {
pageBook.showPage(syncPage);
}
});
}
public ModelSynchronizeParticipant getParticipant() {
return (ModelSynchronizeParticipant)configuration.getParticipant();
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (syncPage.isVisible()) {
initializeSize();
getShell().setSize(Math.max(width, 300), Math.max(height, 300));
if(input != null) {
Viewer viewer = input.getPageConfiguration().getPage().getViewer();
if(viewer instanceof AbstractTreeViewer && !viewer.getControl().isDisposed()) {
((AbstractTreeViewer)viewer).expandToLevel(2);
}
}
}
}
private void initializeSize() {
IDialogSettings settings = getDialogSettings();
if (settings != null) {
try {
width = settings.getInt(PAGE_WIDTH);
height = settings.getInt(PAGE_HEIGHT);
} catch (NumberFormatException e) {
// Ignore and go on;
}
}
if (width == 0) width = 640;
if (height == 0) height = 480;
}
/**
* Save the size of the page so it can be opened with the same size next time
*/
public void saveSettings() {
IDialogSettings settings = getDialogSettings();
if (settings != null) {
Point size = getShell().getSize();
settings.put(PAGE_WIDTH, size.x);
settings.put(PAGE_HEIGHT, size.y);
}
}
public boolean commitChanges() {
return fCheckbox != null ? fCheckbox.getSelection() && hasOutgoingChanges() : false;
}
private boolean hasOutgoingChanges() {
IResourceDiffTree tree = getDiffTree();
return tree != null && tree.hasMatchingDiffs(ResourcesPlugin.getWorkspace().getRoot().getFullPath(), new FastDiffFilter() {
@Override
public boolean select(IDiff diff) {
if (diff instanceof IThreeWayDiff) {
IThreeWayDiff twd = (IThreeWayDiff) diff;
return twd.getDirection() == IThreeWayDiff.OUTGOING || twd.getDirection() == IThreeWayDiff.CONFLICTING;
}
return false;
}
});
}
/**
* @return Returns the project.
*/
public IProject getProject() {
return project;
}
@Override
public void diffsChanged(IDiffChangeEvent event, IProgressMonitor monitor) {
showErrors(event.getErrors());
updatePage();
}
@Override
public void propertyChanged(IDiffTree tree, int property, IPath[] paths) {
// Ignore
}
}