com.collabnet.subversion.merge.wizards.MergeWizardBestPracticesPage.java Source code

Java tutorial

Introduction

Here is the source code for com.collabnet.subversion.merge.wizards.MergeWizardBestPracticesPage.java

Source

/*******************************************************************************
 * Copyright (c) 2009 CollabNet.
 * 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:
 *     CollabNet - initial API and implementation
 ******************************************************************************/
package com.collabnet.subversion.merge.wizards;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.ManagedForm;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
import org.tigris.subversion.subclipse.core.ISVNCoreConstants;
import org.tigris.subversion.subclipse.core.ISVNLocalResource;
import org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot;
import org.tigris.subversion.subclipse.ui.actions.CommitAction;
import org.tigris.subversion.subclipse.ui.actions.RevertAction;
import org.tigris.subversion.subclipse.ui.actions.SwitchAction;
import org.tigris.subversion.subclipse.ui.actions.UpdateAction;
import org.tigris.subversion.subclipse.ui.actions.UpdateDialogAction;
import org.tigris.subversion.subclipse.ui.util.ResourceSelectionTree;
import org.tigris.subversion.svnclientadapter.ISVNClientAdapter;
import org.tigris.subversion.svnclientadapter.ISVNInfo;
import org.tigris.subversion.svnclientadapter.ISVNStatus;
import org.tigris.subversion.svnclientadapter.SVNStatusKind;
import org.tigris.subversion.svnclientadapter.utils.Depth;

import com.collabnet.subversion.merge.Activator;
import com.collabnet.subversion.merge.Messages;

@SuppressWarnings("unchecked")
public class MergeWizardBestPracticesPage extends MergeWizardWarningPage {
    private boolean localMods;
    private boolean switchedChildren;
    private boolean mixedRevisions;
    private boolean incompleteWorkingCopy;
    private List localModsList;
    private List switchedChildrenList;
    private List mixedRevisionsList;
    private List incompleteList;
    private FormToolkit toolkit;
    private ManagedForm mform;
    private ScrolledForm form;
    private ResourceSelectionTree updateResourceSelectionTree;
    private ResourceSelectionTree switchResourceSelectionTree;
    private Composite outerContainer;
    private boolean modsSectionExpanded;
    private boolean switchedChildrenSectionExpanded;
    private boolean mixedRevisionsSectionExpanded;
    private boolean completeSectionExpanded;

    private long highestRevision;

    private boolean needsChecks = true;

    public MergeWizardBestPracticesPage(String pageName, String title, ImageDescriptor titleImage) {
        super(pageName, title, titleImage);
    }

    public void createControl(Composite parent) {
        toolkit = new FormToolkit(parent.getDisplay());
        toolkit.setBackground(parent.getBackground());
        form = toolkit.createScrolledForm(parent);
        mform = new ManagedForm(toolkit, form);
        mform.getForm().setDelayedReflow(false);

        outerContainer = mform.getForm().getBody();
        TableWrapLayout layout = new TableWrapLayout();
        layout.numColumns = 1;
        outerContainer.setLayout(layout);

        refreshPage(false, false);

        setControl(form);
    }

    @Override
    public void setVisible(boolean visible) {
        if (visible && needsChecks) {
            performChecks(false);
        }
        super.setVisible(visible);
    }

    public void setNeedsChecks(boolean needsChecks) {
        this.needsChecks = needsChecks;
    }

    public void performChecks(boolean refreshPage) {
        try {
            getContainer().run(true, true, new IRunnableWithProgress() {

                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {

                    needsChecks = false;
                    localMods = false;
                    switchedChildren = false;
                    mixedRevisions = false;
                    incompleteWorkingCopy = false;
                    localModsList = new ArrayList();
                    switchedChildrenList = new ArrayList();
                    mixedRevisionsList = new ArrayList();
                    incompleteList = new ArrayList();
                    IResource[] resources = ((MergeWizard) getWizard()).getResources();

                    if (resources == null)
                        return;

                    monitor.beginTask(Messages.MergeWizardBestPracticesPage_0, resources.length);

                    for (int i = 0; i < resources.length; i++) {
                        monitor.subTask(resources[i].getName());
                        ISVNLocalResource svnResource = SVNWorkspaceRoot.getSVNResourceFor(resources[i]);
                        ISVNClientAdapter svnClient = null;
                        try {
                            svnClient = svnResource.getRepository().getSVNClient();

                            File fileProject = new File(resources[i].getLocation().toString());

                            List incompleteInfoList = new ArrayList();

                            ISVNInfo[] infos = svnClient.getInfo(fileProject, true);
                            for (int j = 0; j < infos.length; j++) {
                                if (infos[j].getDepth() != Depth.infinity && infos[j].getDepth() != Depth.unknown) {
                                    incompleteWorkingCopy = true;
                                    incompleteInfoList.add(infos[j].getUrl().toString());
                                }
                            }
                            File file = new File(resources[i].getLocation().toString());
                            ISVNStatus status = svnClient.getSingleStatus(file);

                            highestRevision = status.getRevision().getNumber();

                            ISVNStatus[] statuses = svnClient.getStatus(file, true, true, false, true);
                            for (int j = 0; j < statuses.length; j++) {
                                if (statuses[j].getUrl() != null
                                        && incompleteInfoList.contains(statuses[j].getUrl().toString())) {
                                    incompleteList.add(SVNWorkspaceRoot.getResourceFor(resources[i], statuses[j]));
                                }
                                if (statuses[j].getTextStatus().equals(SVNStatusKind.MODIFIED)
                                        | statuses[j].getPropStatus().equals(SVNStatusKind.MODIFIED)) {
                                    localMods = true;
                                    localModsList.add(SVNWorkspaceRoot.getResourceFor(resources[i], statuses[j]));
                                }
                                if (statuses[j].isSwitched()) {
                                    switchedChildren = true;
                                    switchedChildrenList
                                            .add(SVNWorkspaceRoot.getResourceFor(resources[i], statuses[j]));
                                }
                                if (!statuses[j].getTextStatus().equals(SVNStatusKind.EXTERNAL)
                                        && statuses[j].getRevision() != null) {
                                    if (!statuses[j].getRevision().equals(status.getRevision())) {
                                        mixedRevisions = true;
                                        if (!mixedRevisionsList.contains(resources[i]))
                                            mixedRevisionsList.add(resources[i]);
                                        if (statuses[j].getRevision().getNumber() > highestRevision) {
                                            highestRevision = statuses[j].getRevision().getNumber();
                                        }
                                    }
                                }
                            }
                        } catch (Exception e) {
                            Activator.handleError(e);
                        } finally {
                            svnResource.getRepository().returnSVNClient(svnClient);
                        }
                        monitor.worked(1);
                    }
                    monitor.done();
                }

            });
        } catch (Exception e) {
            Activator.handleError(e);
        }

        if (refreshPage)
            refreshPage(true, false);
        if (localMods || switchedChildren || mixedRevisions || incompleteWorkingCopy) {
            setMessage(Messages.MergeWizardBestPracticesPage_notReady);
            setPageComplete(false);
        } else {
            setMessage(Messages.MergeWizardBestPracticesPage_ready);
            setPageComplete(true);
        }
    }

    private void commit() {
        CommitAction commitAction = new CommitAction();
        commitAction.setSelectedResources(((MergeWizard) getWizard()).getResources());
        commitAction.setCanRunAsJob(false);
        commitAction.run(null);
        refreshPage(true, true);
    }

    private void revert() {
        RevertAction revertAction = new RevertAction();
        revertAction.setSelectedResources(((MergeWizard) getWizard()).getResources());
        revertAction.setCanRunAsJob(false);
        revertAction.run(null);
        refreshPage(true, true);
    }

    private void update(IResource[] resources, int depth, boolean setDepth, boolean showDialog) {
        UpdateAction updateAction = null;
        if (showDialog) {
            updateAction = new UpdateDialogAction();
            ((UpdateDialogAction) updateAction).setRevision(highestRevision);
        } else {
            updateAction = new UpdateAction();
        }
        updateAction.setSelectedResources(resources);
        updateAction.setDepth(depth);
        updateAction.setSetDepth(setDepth);
        updateAction.setCanRunAsJob(false);
        updateAction.run(null);
        refreshPage(true, true);
    }

    private void update(IResource[] resources, boolean showDialog) {
        int depth;
        boolean setDepth;
        if (incompleteWorkingCopy) {
            depth = ISVNCoreConstants.DEPTH_INFINITY;
            setDepth = true;
        } else {
            depth = ISVNCoreConstants.DEPTH_UNKNOWN;
            setDepth = false;
        }
        update(resources, depth, setDepth, showDialog);
    }

    private void switchChildren(IResource[] resources) {
        SwitchAction switchAction = new SwitchAction();
        switchAction.setSelectedResources(resources);
        switchAction.setCanRunAsJob(false);
        switchAction.run(null);
        refreshPage(true, true);
    }

    private void refreshPage(boolean needsRedraw, boolean usePreviousExpansionState) {
        if (needsRedraw) {
            Control[] children = outerContainer.getChildren();
            for (int i = 0; i < children.length; i++)
                children[i].dispose();
            if (needsChecks)
                performChecks(false);
        }

        Composite composite = toolkit.createComposite(outerContainer, SWT.NONE);
        GridLayout innerLayout = new GridLayout();
        innerLayout.numColumns = 2;
        composite.setLayout(innerLayout);
        TableWrapData td = new TableWrapData(TableWrapData.FILL);
        composite.setLayoutData(td);

        Label modsLabel = toolkit.createLabel(composite, ""); //$NON-NLS-1$
        if (localMods) {
            modsLabel.setImage(Activator.getImage(Activator.IMAGE_PROBLEM));
        } else {
            modsLabel.setImage(Activator.getImage(Activator.IMAGE_CHECK));
        }
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_BEGINNING);
        modsLabel.setLayoutData(gd);

        Section modsSection = toolkit.createSection(composite, Section.TWISTIE);
        gd = new GridData(GridData.FILL_BOTH);
        modsSection.setLayoutData(gd);

        modsSection.setText(Messages.MergeWizardBestPracticesPage_noUncommitted);
        Composite modsSectionClient = toolkit.createComposite(modsSection);
        GridLayout modsLayout = new GridLayout();
        modsLayout.numColumns = 1;
        modsSectionClient.setLayout(modsLayout);
        modsSection.setClient(modsSectionClient);
        modsSection.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                form.reflow(true);
                modsSectionExpanded = e.getState();
            }
        });

        Composite modsComposite = toolkit.createComposite(modsSectionClient);
        GridLayout modsCompositeLayout = new GridLayout();
        modsCompositeLayout.numColumns = 4;
        modsComposite.setLayout(modsCompositeLayout);

        if (localMods) {
            Label modsLabel1 = toolkit.createLabel(modsComposite,
                    Messages.MergeWizardBestPracticesPage_noUncommitted2, SWT.NONE);
            gd = new GridData();
            gd.horizontalSpan = 4;
            modsLabel1.setLayoutData(gd);
            Hyperlink modsCommitLink = toolkit.createHyperlink(modsComposite,
                    Messages.MergeWizardBestPracticesPage_commit, SWT.NONE);
            modsCommitLink.addHyperlinkListener(new HyperlinkAdapter() {
                public void linkActivated(HyperlinkEvent e) {
                    needsChecks = true;
                    commit();
                }
            });
            toolkit.createLabel(modsComposite, Messages.MergeWizardBestPracticesPage_or);
            Hyperlink modsRevertLink = toolkit.createHyperlink(modsComposite,
                    Messages.MergeWizardBestPracticesPage_revert, SWT.NONE);
            modsRevertLink.addHyperlinkListener(new HyperlinkAdapter() {
                public void linkActivated(HyperlinkEvent e) {
                    needsChecks = true;
                    revert();
                }
            });
            toolkit.createLabel(modsComposite, Messages.MergeWizardBestPracticesPage_revert2);
        } else {
            Label modsLabel1 = toolkit.createLabel(modsComposite, Messages.MergeWizardBestPracticesPage_noLocalMods,
                    SWT.NONE);
            gd = new GridData();
            gd.horizontalSpan = 4;
            modsLabel1.setLayoutData(gd);
        }

        Label mixedRevisionsLabel = toolkit.createLabel(composite, ""); //$NON-NLS-1$
        if (mixedRevisions) {
            mixedRevisionsLabel.setImage(Activator.getImage(Activator.IMAGE_PROBLEM));
        } else {
            mixedRevisionsLabel.setImage(Activator.getImage(Activator.IMAGE_CHECK));
        }
        gd = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_BEGINNING);
        mixedRevisionsLabel.setLayoutData(gd);

        Section mixedRevisionsSection = toolkit.createSection(composite, Section.TWISTIE);
        gd = new GridData(GridData.FILL_BOTH);
        mixedRevisionsSection.setLayoutData(gd);

        mixedRevisionsSection.setText(Messages.MergeWizardBestPracticesPage_singleRevision);
        Composite mixedRevisionsSectionClient = toolkit.createComposite(mixedRevisionsSection);
        GridLayout mixedRevisionsLayout = new GridLayout();
        mixedRevisionsLayout.numColumns = 1;
        mixedRevisionsSectionClient.setLayout(mixedRevisionsLayout);
        mixedRevisionsSection.setClient(mixedRevisionsSectionClient);
        mixedRevisionsSection.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                form.reflow(true);
                mixedRevisionsSectionExpanded = e.getState();
            }
        });

        Composite mixedRevisionsComposite = toolkit.createComposite(mixedRevisionsSectionClient);
        GridLayout mixedRevisionsCompositeLayout = new GridLayout();
        mixedRevisionsCompositeLayout.numColumns = 2;
        mixedRevisionsComposite.setLayout(mixedRevisionsCompositeLayout);
        gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
        mixedRevisionsComposite.setLayoutData(gd);

        if (mixedRevisions) {
            Label mixedRevisionsLabel1 = toolkit.createLabel(mixedRevisionsComposite,
                    Messages.MergeWizardBestPracticesPage_singleRevision2, SWT.NONE);
            gd = new GridData();
            gd.horizontalSpan = 2;
            mixedRevisionsLabel1.setLayoutData(gd);
            Hyperlink mixedRevisionsUpdateLink = toolkit.createHyperlink(mixedRevisionsComposite,
                    Messages.MergeWizardBestPracticesPage_update, SWT.NONE);
            mixedRevisionsUpdateLink.addHyperlinkListener(new HyperlinkAdapter() {
                public void linkActivated(HyperlinkEvent e) {
                    needsChecks = true;
                    if (updateResourceSelectionTree == null) {
                        IResource[] mixedArray = new IResource[mixedRevisionsList.size()];
                        mixedRevisionsList.toArray(mixedArray);
                        update(mixedArray, true);
                    } else
                        update(updateResourceSelectionTree.getSelectedResources(), true);
                }
            });
            toolkit.createLabel(mixedRevisionsComposite, Messages.MergeWizardBestPracticesPage_update2);
            if (((MergeWizard) getWizard()).getResources().length > 1) {
                IResource[] mixedArray = new IResource[mixedRevisionsList.size()];
                mixedRevisionsList.toArray(mixedArray);
                updateResourceSelectionTree = new ResourceSelectionTree(mixedRevisionsComposite, SWT.NONE,
                        Messages.MergeWizardBestPracticesPage_itemsToUpdate, mixedArray, new HashMap(), null, false,
                        null, null);
                gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
                gd.horizontalSpan = 2;
                gd.heightHint = 100;
                updateResourceSelectionTree.setLayoutData(gd);
            } else
                updateResourceSelectionTree = null;
        } else {
            Label mixedRevisionsLabel1 = toolkit.createLabel(mixedRevisionsComposite,
                    Messages.MergeWizardBestPracticesPage_atSingleRevision, SWT.NONE);
            gd = new GridData();
            gd.horizontalSpan = 2;
            mixedRevisionsLabel1.setLayoutData(gd);
        }

        Label switchedChildrenLabel = toolkit.createLabel(composite, ""); //$NON-NLS-1$
        if (switchedChildren) {
            switchedChildrenLabel.setImage(Activator.getImage(Activator.IMAGE_PROBLEM));
        } else {
            switchedChildrenLabel.setImage(Activator.getImage(Activator.IMAGE_CHECK));
        }
        gd = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_BEGINNING);
        switchedChildrenLabel.setLayoutData(gd);

        Section switchedChildrenSection = toolkit.createSection(composite, Section.TWISTIE);
        gd = new GridData(GridData.FILL_BOTH);
        switchedChildrenSection.setLayoutData(gd);

        switchedChildrenSection.setText(Messages.MergeWizardBestPracticesPage_noSwitched);
        Composite switchedChildrenSectionClient = toolkit.createComposite(switchedChildrenSection);
        GridLayout switchedChildrenLayout = new GridLayout();
        switchedChildrenLayout.numColumns = 1;
        switchedChildrenSectionClient.setLayout(switchedChildrenLayout);
        switchedChildrenSection.setClient(switchedChildrenSectionClient);
        switchedChildrenSection.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                form.reflow(true);
                switchedChildrenSectionExpanded = e.getState();
            }
        });

        Composite switchedChildrenComposite = toolkit.createComposite(switchedChildrenSectionClient);
        GridLayout switchedChildrenCompositeLayout = new GridLayout();
        switchedChildrenCompositeLayout.numColumns = 2;
        switchedChildrenComposite.setLayout(switchedChildrenCompositeLayout);

        if (switchedChildren) {
            Label switchedChildrenDescriptionLabel1 = toolkit.createLabel(switchedChildrenComposite,
                    Messages.MergeWizardBestPracticesPage_noSwitched2, SWT.NONE);
            gd = new GridData();
            gd.horizontalSpan = 2;
            switchedChildrenDescriptionLabel1.setLayoutData(gd);
            Hyperlink switchedChildrenUpdateLink = toolkit.createHyperlink(switchedChildrenComposite,
                    Messages.MergeWizardBestPracticesPage_switch, SWT.NONE);
            switchedChildrenUpdateLink.addHyperlinkListener(new HyperlinkAdapter() {
                public void linkActivated(HyperlinkEvent e) {
                    needsChecks = true;
                    switchChildren(switchResourceSelectionTree.getSelectedResources());
                }
            });
            toolkit.createLabel(switchedChildrenComposite, Messages.MergeWizardBestPracticesPage_switch2);
            IResource[] switchedArray = new IResource[switchedChildrenList.size()];
            switchedChildrenList.toArray(switchedArray);
            switchResourceSelectionTree = new ResourceSelectionTree(switchedChildrenComposite, SWT.NONE,
                    Messages.MergeWizardBestPracticesPage_itemsToSwitch, switchedArray, new HashMap(), null, false,
                    null, null);
            gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
            gd.horizontalSpan = 2;
            gd.heightHint = 100;
            switchResourceSelectionTree.setLayoutData(gd);
        } else {
            Label switchedChildrenDescriptionLabel1 = toolkit.createLabel(switchedChildrenComposite,
                    Messages.MergeWizardBestPracticesPage_hasNoSwitched, SWT.NONE);
            gd = new GridData();
            gd.horizontalSpan = 2;
            switchedChildrenDescriptionLabel1.setLayoutData(gd);
        }

        Label completeLabel = toolkit.createLabel(composite, ""); //$NON-NLS-1$
        gd = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_BEGINNING);
        completeLabel.setLayoutData(gd);
        if (incompleteWorkingCopy) {
            completeLabel.setImage(Activator.getImage(Activator.IMAGE_PROBLEM));
        } else {
            completeLabel.setImage(Activator.getImage(Activator.IMAGE_CHECK));
        }

        Section completeSection = toolkit.createSection(composite, Section.TWISTIE);
        gd = new GridData(GridData.FILL_BOTH);
        completeSection.setLayoutData(gd);

        completeSection.setText(Messages.MergeWizardBestPracticesPage_completeWorkingCopy);
        Composite completeSectionClient = toolkit.createComposite(completeSection);
        GridLayout completeLayout = new GridLayout();
        completeLayout.numColumns = 1;
        completeSectionClient.setLayout(completeLayout);
        completeSection.setClient(completeSectionClient);
        completeSection.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                form.reflow(true);
                completeSectionExpanded = e.getState();
            }
        });

        Composite completeComposite = toolkit.createComposite(completeSectionClient);
        GridLayout completeCompositeLayout = new GridLayout();
        completeCompositeLayout.numColumns = 3;
        completeComposite.setLayout(completeCompositeLayout);

        Label completeDescriptionLabel1 = toolkit.createLabel(completeComposite,
                Messages.MergeWizardBestPracticesPage_completeWorkingCopy2, SWT.NONE);
        gd = new GridData();
        gd.horizontalSpan = 3;
        completeDescriptionLabel1.setLayoutData(gd);

        toolkit.createLabel(completeComposite, Messages.MergeWizardBestPracticesPage_completeWorkingCopy3,
                SWT.WRAP);
        Hyperlink completeUpdateLink = toolkit.createHyperlink(completeComposite,
                Messages.MergeWizardBestPracticesPage_update3, SWT.NONE);
        completeUpdateLink.addHyperlinkListener(new HyperlinkAdapter() {
            public void linkActivated(HyperlinkEvent e) {
                needsChecks = true;
                IResource[] incompleteArray = new IResource[incompleteList.size()];
                incompleteList.toArray(incompleteArray);
                update(incompleteArray, ISVNCoreConstants.DEPTH_INFINITY, true, true);
            }
        });
        toolkit.createLabel(completeComposite, Messages.MergeWizardBestPracticesPage_update4, SWT.WRAP);

        if (needsRedraw && usePreviousExpansionState) {
            if (modsSectionExpanded)
                modsSection.setExpanded(true);
            if (mixedRevisionsSectionExpanded)
                mixedRevisionsSection.setExpanded(true);
            if (switchedChildrenSectionExpanded)
                switchedChildrenSection.setExpanded(true);
            if (completeSectionExpanded)
                completeSection.setExpanded(true);
            outerContainer.layout(true);
            outerContainer.redraw();
        } else {
            if (localMods) {
                modsSection.setExpanded(true);
                modsSectionExpanded = true;
            }
            if (mixedRevisions) {
                mixedRevisionsSection.setExpanded(true);
                mixedRevisionsSectionExpanded = true;
            }
            if (switchedChildren) {
                switchedChildrenSection.setExpanded(true);
                switchedChildrenSectionExpanded = true;
            }
            if (incompleteWorkingCopy) {
                completeSection.setExpanded(true);
                completeSectionExpanded = true;
            }
        }
    }

    public boolean hasWarnings() {
        return localMods || mixedRevisions || switchedChildren || incompleteWorkingCopy;
    }

    public boolean needsChecks() {
        return needsChecks;
    }

}