/**
* Aptana Studio
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
* Please see the license.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.ide.syncing.ui.navigator.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
import com.aptana.ide.syncing.core.SiteConnectionUtils;
import com.aptana.ide.syncing.ui.SyncingUIPlugin;
public class SyncingActionProvider extends CommonActionProvider
{
private static final String SYNC_IMAGE = "icons/full/elcl16/arrow_up_down.png"; //$NON-NLS-1$
private static final String UPLOAD_IMAGE = "icons/full/elcl16/arrow_up.png"; //$NON-NLS-1$
private static final String DOWNLOAD_IMAGE = "icons/full/elcl16/arrow_down.png"; //$NON-NLS-1$
private static final String GROUP_SYNCING = "syncing"; //$NON-NLS-1$
private NavigatorSynchronizeAction fSynchronizeAction;
private NavigatorUploadAction fUploadAction;
private NavigatorDownloadAction fDownloadAction;
private boolean isToolbarFilled;
private List<IContributionItem> hiddenItems;
public SyncingActionProvider()
{
hiddenItems = new ArrayList<IContributionItem>();
}
@Override
public void dispose()
{
hiddenItems.clear();
super.dispose();
}
@Override
public void init(ICommonActionExtensionSite aSite)
{
super.init(aSite);
IWorkbenchPart activePart;
ICommonViewerSite viewerSite = aSite.getViewSite();
if (viewerSite instanceof ICommonViewerWorkbenchSite)
{
activePart = ((ICommonViewerWorkbenchSite) viewerSite).getPart();
}
else
{
activePart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
}
fSynchronizeAction = new NavigatorSynchronizeAction(activePart);
fSynchronizeAction.setImageDescriptor(SyncingUIPlugin.getImageDescriptor(SYNC_IMAGE));
fUploadAction = new NavigatorUploadAction(activePart);
fUploadAction.setImageDescriptor(SyncingUIPlugin.getImageDescriptor(UPLOAD_IMAGE));
fDownloadAction = new NavigatorDownloadAction(activePart);
fDownloadAction.setImageDescriptor(SyncingUIPlugin.getImageDescriptor(DOWNLOAD_IMAGE));
}
@Override
public void fillActionBars(IActionBars actionBars)
{
boolean hasSyncConnection = false;
IStructuredSelection selection = getSelection();
if (!selection.isEmpty())
{
Object element = selection.getFirstElement();
if (element instanceof IAdaptable)
{
hasSyncConnection = hasSyncConnection((IAdaptable) element);
}
}
// fillActionBars() is called each time the selection changes, so adds a check to only add the toolbar items
// once
IToolBarManager toolbar = actionBars.getToolBarManager();
if (!isToolbarFilled)
{
if (hasSyncConnection)
{
fillToolBar(toolbar);
actionBars.updateActionBars();
isToolbarFilled = true;
}
}
else if (updateToolbar(toolbar, hasSyncConnection))
{
actionBars.updateActionBars();
}
updateSelection();
}
protected void fillToolBar(IToolBarManager toolBar)
{
toolBar.add(new GroupMarker(GROUP_SYNCING));
toolBar.add(fSynchronizeAction);
toolBar.add(fUploadAction);
toolBar.add(fDownloadAction);
}
private IStructuredSelection getSelection()
{
// could safely cast
return (IStructuredSelection) getContext().getSelection();
}
private void updateSelection()
{
IStructuredSelection selection = getSelection();
fSynchronizeAction.selectionChanged(selection);
fUploadAction.selectionChanged(selection);
fDownloadAction.selectionChanged(selection);
}
private boolean updateToolbar(IToolBarManager toolbar, boolean hasSyncConnection)
{
boolean updated = false;
IContributionItem[] items = toolbar.getItems();
if (hasSyncConnection)
{
// adds the syncing items back, but only needs to do it once until after the next time hasSyncConnection is
// false
for (IContributionItem hiddenItem : hiddenItems)
{
toolbar.appendToGroup(GROUP_SYNCING, hiddenItem);
}
updated = hiddenItems.size() > 0;
hiddenItems.clear();
}
else
{
// removes the syncing items
for (IContributionItem item : items)
{
if (item instanceof ActionContributionItem)
{
if (((ActionContributionItem) item).getAction() instanceof NavigatorBaseSyncAction)
{
toolbar.remove(item);
hiddenItems.add(item);
updated = true;
}
}
}
}
return updated;
}
private static boolean hasSyncConnection(IAdaptable element)
{
return (SiteConnectionUtils.findSitesForSource(element).length > 0)
|| (SiteConnectionUtils.findSitesWithDestination(element).length > 0);
}
}