blob: dea81fdc5ccdcac3b2803520d8f4454a1ff2d8dd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 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.ui.synchronize.actions;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ui.ITeamUIImages;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.internal.ui.synchronize.SynchronizeView;
import org.eclipse.team.internal.ui.wizards.GlobalSynchronizeWizard;
import org.eclipse.team.ui.TeamImages;
import org.eclipse.team.ui.TeamUI;
import org.eclipse.team.ui.synchronize.ISynchronizeParticipant;
import org.eclipse.team.ui.synchronize.ISynchronizeParticipantListener;
import org.eclipse.team.ui.synchronize.ISynchronizeParticipantReference;
import org.eclipse.team.ui.synchronize.ISynchronizeView;
public class SynchronizePageDropDownAction extends Action implements IMenuCreator, ISynchronizeParticipantListener {
private ISynchronizeView fView;
private Action synchronizeAction;
private MenuManager menuManager;
public SynchronizePageDropDownAction(ISynchronizeView view) {
fView= view;
Utils.initAction(this, "action.refreshSubscriber."); //$NON-NLS-1$
synchronizeAction = new Action(TeamUIMessages.GlobalRefreshAction_4) {
@Override
public void run() {
IWizard wizard = new GlobalSynchronizeWizard();
WizardDialog dialog = new WizardDialog(fView.getViewSite().getShell(), wizard);
dialog.open();
}
};
synchronizeAction.setImageDescriptor(TeamImages.getImageDescriptor(ITeamUIImages.IMG_SYNC_VIEW));
synchronizeAction.setActionDefinitionId("org.eclipse.team.ui.synchronizeAll"); //$NON-NLS-1$
setMenuCreator(this);
TeamUI.getSynchronizeManager().addSynchronizeParticipantListener(this);
update();
fView.getSite().getKeyBindingService().registerAction(synchronizeAction);
setActionDefinitionId("org.eclipse.team.ui.synchronizeLast"); //$NON-NLS-1$
fView.getSite().getKeyBindingService().registerAction(this);
}
@Override
public void dispose() {
if(menuManager != null) {
menuManager.dispose();
menuManager = null;
}
TeamUI.getSynchronizeManager().removeSynchronizeParticipantListener(this);
}
@Override
public Menu getMenu(Menu parent) {
return null;
}
@Override
public Menu getMenu(Control parent) {
Menu fMenu = null;
if (menuManager == null) {
menuManager = new MenuManager();
fMenu = menuManager.createContextMenu(parent);
final ISynchronizeParticipantReference[] participants = TeamUI.getSynchronizeManager().getSynchronizeParticipants();
addParticipantsToMenu(participants);
if (participants.length > 0)
menuManager.add(new Separator());
menuManager.add(synchronizeAction);
menuManager.update(true);
} else {
fMenu = menuManager.getMenu();
}
return fMenu;
}
protected void addParticipantsToMenu(ISynchronizeParticipantReference[] refs) {
ISynchronizeParticipant current = fView.getParticipant();
for (int i = 0; i < refs.length; i++) {
ISynchronizeParticipantReference page = refs[i];
Action action = new ShowSynchronizeParticipantAction(fView, page);
try {
boolean isCurrent = page.getParticipant().equals(current);
action.setChecked(isCurrent);
} catch (TeamException e) {
continue;
}
menuManager.add(action);
}
}
@Override
public void run() {
ISynchronizeParticipant current = fView.getParticipant();
if(current != null) {
current.run(fView);
} else {
synchronizeAction.run();
}
update();
}
@Override
public void participantsAdded(ISynchronizeParticipant[] consoles) {
Display display = TeamUIPlugin.getStandardDisplay();
display.asyncExec(() -> {
if(menuManager != null) {
menuManager.dispose();
menuManager = null;
}
update();
});
}
@Override
public void participantsRemoved(ISynchronizeParticipant[] consoles) {
Display display = TeamUIPlugin.getStandardDisplay();
display.asyncExec(() -> {
if(menuManager != null) {
menuManager.dispose();
menuManager = null;
}
update();
});
}
public void update() {
ISynchronizeParticipant current = fView.getParticipant();
ISynchronizeParticipantReference[] refs = TeamUI.getSynchronizeManager().getSynchronizeParticipants();
String text = null;
if(current != null && refs.length > 0) {
text = NLS.bind(TeamUIMessages.GlobalRefreshAction_5, new String[] { Utils.shortenText(SynchronizeView.MAX_NAME_LENGTH, current.getName()) });
setToolTipText(text);
setText(text);
} else {
text = TeamUIMessages.GlobalRefreshAction_4;
setToolTipText(text);
setText(text);
}
}
}