diff options
Diffstat (limited to 'bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java')
-rw-r--r-- | bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java new file mode 100644 index 000000000..47e360b1c --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java @@ -0,0 +1,336 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.internal.ui.synchronize; + +import org.eclipse.compare.internal.INavigatable; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.jface.action.*; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.jface.viewers.*; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.*; +import org.eclipse.team.internal.ui.*; +import org.eclipse.team.internal.ui.synchronize.actions.*; +import org.eclipse.team.ui.synchronize.ISynchronizeView; +import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant; +import org.eclipse.team.ui.synchronize.subscriber.SubscriberRefreshWizard; +import org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor; +import org.eclipse.team.ui.synchronize.viewers.TreeViewerAdvisor; +import org.eclipse.ui.*; +import org.eclipse.ui.part.*; + +/** + * 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. + * <p> + * Clients can subclass to extend the label decoration or add action bar + * contributions. For more extensive modifications, clients should create + * their own custom page. + * </p> + * @since 3.0 + */ +public final class SubscriberParticipantPage implements IPageBookViewPage, IPropertyChangeListener, IAdaptable { + // Parent composite of this view. It is remembered so that we can dispose of its children when + // the viewer type is switched. + private Composite composite = null; + private ChangesSection changesSection; + private Viewer changesViewer; + private boolean settingWorkingSet = false; + + private ISynchronizeView view; + private SubscriberParticipant participant; + private IPageSite site; + + // Toolbar and status line actions for this page, note that context menu actions shown in + // the changes viewer are contributed via the viewer and not the page. + private NavigateAction gotoNext; + private NavigateAction gotoPrevious; + private Action configureSchedule; + private SyncViewerShowPreferencesAction showPreferences; + private Action refreshAllAction; + private Action collapseAll; + private WorkingSetFilterActionGroup workingSetGroup; + private StatusLineContributionGroup statusLine; + private StructuredViewerAdvisor viewerAdvisor; + + /** + * Constructs a new SynchronizeView. + */ + public SubscriberParticipantPage(SubscriberParticipant page, ISynchronizeView view, StructuredViewerAdvisor viewerAdvisor) { + this.participant = page; + this.view = view; + this.viewerAdvisor = viewerAdvisor; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite) + */ + public void createControl(Composite parent) { + composite = new Composite(parent, SWT.NONE); + //sc.setContent(composite); + GridLayout gridLayout= new GridLayout(); + gridLayout.makeColumnsEqualWidth= false; + gridLayout.marginWidth= 0; + gridLayout.marginHeight = 0; + gridLayout.verticalSpacing = 0; + composite.setLayout(gridLayout); + GridData data = new GridData(GridData.FILL_BOTH); + data.grabExcessVerticalSpace = true; + composite.setLayoutData(data); + + // Create the changes section which, in turn, creates the changes viewer and its configuration + this.changesSection = new ChangesSection(composite, this); + this.changesViewer = createChangesViewer(changesSection.getComposite()); + changesSection.setViewer(changesViewer); + + // toolbar + INavigatable nav = new INavigatable() { + public boolean gotoDifference(boolean next) { + return viewerAdvisor.navigate(next); + } + }; + gotoNext = new NavigateAction(view, nav, true /*next*/); + gotoPrevious = new NavigateAction(view, nav, false /*previous*/); + + if(participant.doesSupportSynchronize()) { + refreshAllAction = new Action() { + public void run() { + // Prime the refresh wizard with an appropriate initial selection + SubscriberRefreshWizard wizard = new SubscriberRefreshWizard(participant); + int scopeHint = SubscriberRefreshWizard.SCOPE_PARTICIPANT_ROOTS; + IWorkingSet set = participant.getWorkingSet(); + if(set != null) { + scopeHint = SubscriberRefreshWizard.SCOPE_WORKING_SET; + } + wizard.setScopeHint(scopeHint); + WizardDialog dialog = new WizardDialog(getShell(), wizard); + dialog.open(); + } + }; + Utils.initAction(refreshAllAction, "action.refreshWithRemote."); //$NON-NLS-1$ + } + + collapseAll = new Action() { + public void run() { + if (changesViewer == null || !(changesViewer instanceof AbstractTreeViewer)) return; + changesViewer.getControl().setRedraw(false); + ((AbstractTreeViewer)changesViewer).collapseToLevel(changesViewer.getInput(), TreeViewer.ALL_LEVELS); + changesViewer.getControl().setRedraw(true); + } + }; + Utils.initAction(collapseAll, "action.collapseAll."); //$NON-NLS-1$ + + configureSchedule = new Action() { + public void run() { + ConfigureRefreshScheduleDialog d = new ConfigureRefreshScheduleDialog( + getShell(), participant.getRefreshSchedule()); + d.setBlockOnOpen(false); + d.open(); + } + }; + Utils.initAction(configureSchedule, "action.configureSchedulel."); //$NON-NLS-1$ + + // view menu + workingSetGroup = new WorkingSetFilterActionGroup(getShell(), this, view, participant); + showPreferences = new SyncViewerShowPreferencesAction(getShell()); + statusLine = new StatusLineContributionGroup(getShell(), getParticipant(), workingSetGroup); + + participant.addPropertyChangeListener(this); + TeamUIPlugin.getPlugin().getPreferenceStore().addPropertyChangeListener(this); + participant.setMode(participant.getMode()); + } + + private Shell getShell() { + return view.getSite().getShell(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento) + */ + public void init(IPageSite site) throws PartInitException { + this.site = site; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.IPage#setFocus() + */ + public void setFocus() { + changesSection.setFocus(); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.IWorkbenchPart#dispose() + */ + public void dispose() { + statusLine.dispose(); + changesSection.dispose(); + viewerAdvisor.dispose(); + TeamUIPlugin.getPlugin().getPreferenceStore().removePropertyChangeListener(this); + participant.removePropertyChangeListener(this); + } + + /* + * This method enables "Show In" support for this view + * + * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) + */ + public Object getAdapter(Class key) { + if (key.equals(ISelectionProvider.class)) + return changesViewer; + if (key == IShowInSource.class) { + return new IShowInSource() { + public ShowInContext getShowInContext() { + StructuredViewer v = (StructuredViewer)changesViewer; + if (v == null) return null; + ISelection s = v.getSelection(); + if (s instanceof IStructuredSelection) { + Object[] resources = Utils.getResources(((IStructuredSelection)s).toArray()); + return new ShowInContext(null, new StructuredSelection(resources)); + } + return null; + } + }; + } + if (key == IShowInTargetList.class) { + return new IShowInTargetList() { + public String[] getShowInTargetIds() { + return new String[] { IPageLayout.ID_RES_NAV }; + } + + }; + } + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.IPage#getControl() + */ + public Control getControl() { + return composite; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars) + */ + public void setActionBars(IActionBars actionBars) { + if(actionBars != null) { + IToolBarManager manager = actionBars.getToolBarManager(); + + // toolbar + if(refreshAllAction != null) { + manager.add(refreshAllAction); + } + manager.add(new Separator()); + if(gotoNext != null) { + manager.add(gotoNext); + manager.add(gotoPrevious); + } + manager.add(collapseAll); + manager.add(new Separator()); + + // view menu + IMenuManager menu = actionBars.getMenuManager(); + workingSetGroup.fillActionBars(actionBars); + menu.add(new Separator()); + menu.add(new Separator()); + menu.add(new Separator("others")); //$NON-NLS-1$ + menu.add(new Separator()); + menu.add(configureSchedule); + menu.add(new Separator()); + menu.add(showPreferences); + + // status line + statusLine.fillActionBars(actionBars); + + // allow the advisor to contribute + getViewerConfiguration().setActionBars(actionBars); + } + } + + /* (non-Javadoc) + * @see org.eclipse.ui.part.IPageBookViewPage#getSite() + */ + public IPageSite getSite() { + return this.site; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent event) { + // Working set changed by user + if(event.getProperty().equals(WorkingSetFilterActionGroup.CHANGE_WORKING_SET)) { + if(settingWorkingSet) return; + settingWorkingSet = true; + participant.setWorkingSet((IWorkingSet)event.getNewValue()); + settingWorkingSet = false; + // Working set changed programatically + } else if(event.getProperty().equals(SubscriberParticipant.P_SYNCVIEWPAGE_WORKINGSET)) { + if(settingWorkingSet) return; + settingWorkingSet = true; + Object newValue = event.getNewValue(); + if (newValue instanceof IWorkingSet) { + workingSetGroup.setWorkingSet((IWorkingSet)newValue); + } else if (newValue == null) { + workingSetGroup.setWorkingSet(null); + } + settingWorkingSet = false; + // Change to showing of sync state in text labels preference + } else if(event.getProperty().equals(IPreferenceIds.SYNCVIEW_VIEW_SYNCINFO_IN_LABEL)) { + if(changesViewer instanceof StructuredViewer) { + ((StructuredViewer)changesViewer).refresh(true /* update labels */); + } + } else if(event.getProperty().equals(SubscriberParticipant.P_SYNCVIEWPAGE_SELECTION)) { + IStructuredSelection selection = (IStructuredSelection)event.getNewValue(); + setSelection(selection.toArray(), true); + } + } + + /** + * @return Returns the participant. + */ + public SubscriberParticipant getParticipant() { + return participant; + } + + /** + * @return Returns the view. + */ + public ISynchronizeView getSynchronizeView() { + return view; + } + + private Viewer createChangesViewer(Composite parent) { + TreeViewer viewer = new TreeViewerAdvisor.NavigableTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + GridData data = new GridData(GridData.FILL_BOTH); + viewer.getControl().setLayoutData(data); + viewerAdvisor.initializeViewer(viewer); + getSite().setSelectionProvider(viewer); + return viewer; + } + + public StructuredViewerAdvisor getViewerConfiguration() { + return viewerAdvisor; + } + + public Viewer getViewer() { + return changesViewer; + } + + public void setSelection(Object[] objects, boolean reveal) { + getViewerConfiguration().setSelection(objects, reveal); + } +}
\ No newline at end of file |