/******************************************************************************* * Copyright (c) 2000, 2011 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.synchronize; import org.eclipse.swt.widgets.Composite; import org.eclipse.team.core.synchronize.FastSyncInfoFilter; import org.eclipse.team.core.synchronize.SyncInfo; import org.eclipse.team.internal.core.subscribers.SubscriberSyncInfoCollector; import org.eclipse.team.internal.core.subscribers.WorkingSetFilteredSyncInfoCollector; import org.eclipse.team.internal.ui.synchronize.actions.DefaultSynchronizePageActions; import org.eclipse.team.internal.ui.synchronize.actions.SubscriberActionContribution; import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; import org.eclipse.team.ui.synchronize.SubscriberParticipant; /** * A synchronize view page that works with participants that are subclasses of * {@link SubscriberParticipant}. It shows changes in the tree or table view * and supports navigation, opening, and filtering changes. *
* Clients can subclass to extend the label decoration or add action bar * contributions. For more extensive modifications, clients should create * their own custom page. *
* @since 3.0 */ public final class SubscriberParticipantPage extends AbstractSynchronizePage { private SubscriberParticipant participant; private final static int[] INCOMING_MODE_FILTER = new int[] {SyncInfo.CONFLICTING, SyncInfo.INCOMING}; private final static int[] OUTGOING_MODE_FILTER = new int[] {SyncInfo.CONFLICTING, SyncInfo.OUTGOING}; private final static int[] BOTH_MODE_FILTER = new int[] {SyncInfo.CONFLICTING, SyncInfo.INCOMING, SyncInfo.OUTGOING}; private final static int[] CONFLICTING_MODE_FILTER = new int[] {SyncInfo.CONFLICTING}; /** * Filters out-of-sync resources by working set and mode */ private WorkingSetFilteredSyncInfoCollector collector; /** * Constructs a new SynchronizeView. * * @param configuration * a synchronize page configuration * @param subscriberCollector * the subscriber's collector */ public SubscriberParticipantPage(ISynchronizePageConfiguration configuration, SubscriberSyncInfoCollector subscriberCollector) { super(configuration); this.participant = (SubscriberParticipant)configuration.getParticipant(); configuration.setComparisonType(isThreeWay() ? ISynchronizePageConfiguration.THREE_WAY : ISynchronizePageConfiguration.TWO_WAY); configuration.addActionContribution(new DefaultSynchronizePageActions()); configuration.addActionContribution(new SubscriberActionContribution()); initializeCollector(configuration, subscriberCollector); } /** * @return Returns the participant. */ public SubscriberParticipant getParticipant() { return participant; } @Override protected AbstractViewerAdvisor createViewerAdvisor(Composite parent) { return new TreeViewerAdvisor(parent, getConfiguration()); } /* * This method is invoked fromsetMode
when the mode has changed.
* It sets the filter on the collector to show the SyncInfo
* appropriate for the mode.
* @param mode the new mode (one of INCOMING_MODE_FILTER
,
* OUTGOING_MODE_FILTER
, CONFLICTING_MODE_FILTER
* or BOTH_MODE_FILTER
)
*/
@Override
protected void updateMode(int mode) {
if(collector != null && isThreeWay()) {
int[] modeFilter = BOTH_MODE_FILTER;
switch(mode) {
case ISynchronizePageConfiguration.INCOMING_MODE:
modeFilter = INCOMING_MODE_FILTER; break;
case ISynchronizePageConfiguration.OUTGOING_MODE:
modeFilter = OUTGOING_MODE_FILTER; break;
case ISynchronizePageConfiguration.BOTH_MODE:
modeFilter = BOTH_MODE_FILTER; break;
case ISynchronizePageConfiguration.CONFLICTING_MODE:
modeFilter = CONFLICTING_MODE_FILTER; break;
}
collector.setFilter(
new FastSyncInfoFilter.AndSyncInfoFilter(
new FastSyncInfoFilter[] {
new FastSyncInfoFilter.SyncInfoDirectionFilter(modeFilter)
}));
}
}
private void initializeCollector(ISynchronizePageConfiguration configuration, SubscriberSyncInfoCollector subscriberCollector) {
SubscriberParticipant participant = getParticipant();
collector = new WorkingSetFilteredSyncInfoCollector(subscriberCollector, participant.getSubscriber().roots());
updateMode(configuration.getMode());
collector.reset();
configuration.setProperty(ISynchronizePageConfiguration.P_SYNC_INFO_SET, collector.getSyncInfoTree());
configuration.setProperty(SynchronizePageConfiguration.P_WORKING_SET_SYNC_INFO_SET, collector.getWorkingSetSyncInfoSet());
}
/* (non-Javadoc)
* @see org.eclipse.team.ui.synchronize.SyncInfoSetSynchronizePage#isThreeWay()
*/
protected boolean isThreeWay() {
return getParticipant().getSubscriber().getResourceComparator().isThreeWay();
}
/* (non-Javadoc)
* @see org.eclipse.team.internal.ui.synchronize.SyncInfoSetSynchronizePage#reset()
*/
@Override
public void reset() {
getParticipant().reset();
}
/*
* Provide internal access to the collector
* @return Returns the collector.
*/
public WorkingSetFilteredSyncInfoCollector getCollector() {
return collector;
}
@Override
public void dispose() {
super.dispose();
collector.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.team.internal.ui.synchronize.AbstractSynchronizePage#createChangesSection(org.eclipse.swt.widgets.Composite)
*/
@Override
protected ChangesSection createChangesSection(Composite parent) {
return new SyncInfoSetChangesSection(parent, this, getConfiguration());
}
}