/* * Copyright 2011-2012 Amazon Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://aws.amazon.com/apache2.0 * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES * OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and * limitations under the License. */ package com.amazonaws.eclipse.explorer.actions; import java.util.Map; import java.util.Map.Entry; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuCreator; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.IActionBars; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.navigator.CommonActionProvider; import org.eclipse.ui.services.IDisposable; import com.amazonaws.eclipse.core.AwsToolkitCore; import com.amazonaws.eclipse.core.preferences.PreferenceConstants; import com.amazonaws.eclipse.core.preferences.PreferencePropertyChangeListener; import com.amazonaws.eclipse.core.regions.Region; import com.amazonaws.eclipse.core.regions.RegionUtils; import com.amazonaws.eclipse.core.ui.IRefreshable; import com.amazonaws.eclipse.explorer.ContentProviderRegistry; import com.amazonaws.eclipse.explorer.ExplorerNode; /** * Action provider for explorer toolbar and view menu. */ public class ConfigurationActionProvider extends CommonActionProvider { private final RegionSelectionMenuAction regionSelectionAction; private final RefreshAction refreshAction; @Override public void fillContextMenu(IMenuManager menu) { StructuredSelection selection = (StructuredSelection)getActionSite().getStructuredViewer().getSelection(); if (selection.getFirstElement() instanceof ExplorerNode && selection.size() == 1) { ExplorerNode node = (ExplorerNode)selection.getFirstElement(); if (node.getOpenAction() != null) { menu.add(node.getOpenAction()); menu.add(new Separator()); } } } private final class RefreshAction extends Action { public RefreshAction() { this.setText("Refresh"); this.setToolTipText("Refresh AWS Explorer"); this.setImageDescriptor(AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_REFRESH)); } @Override public void run() { AwsToolkitCore.getDefault().getAccountManager().reloadAccountInfo(); ContentProviderRegistry.refreshAllContentProviders(); } } private final class RegionSelectionMenuAction extends Action implements IRefreshable, IDisposable { private Menu menu; private PreferencePropertyChangeListener regionChangeListener; private RegionSelectionMenuAction() { super(null, Action.AS_DROP_DOWN_MENU); updateRegionFlag(); setId("aws-region-selection"); regionChangeListener = new PreferencePropertyChangeListener() { public void watchedPropertyChanged() { RegionSelectionMenuAction.this.refreshData(); } }; AwsToolkitCore.getDefault().addDefaultRegionChangeListener(regionChangeListener); } @Override public IMenuCreator getMenuCreator() { return new IMenuCreator() { public Menu getMenu(Menu parent) { return null; } public Menu getMenu(Control parent) { if (menu == null) menu = createMenu(parent); return menu; } public void dispose() { if (regionChangeListener != null) { AwsToolkitCore.getDefault().removeDefaultRegionChangeListener(regionChangeListener); } if (menu != null) { menu.dispose(); } } }; } private Menu createMenu(final Control parent) { Menu menu = new Menu(parent); Region currentRegion = RegionUtils.getCurrentRegion(); for (final Region region : RegionUtils.getRegions()) { MenuItem menuItem = new MenuItem(menu, SWT.RADIO); menuItem.setText(region.getName()); menuItem.setData(region); menuItem.setSelection(region.equals(currentRegion)); menuItem.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { IPreferenceStore preferenceStore = AwsToolkitCore.getDefault().getPreferenceStore(); preferenceStore.setValue(PreferenceConstants.P_DEFAULT_REGION, region.getId()); } public void widgetDefaultSelected(SelectionEvent e) {} }); menuItem.setImage(lookupRegionFlag(region.getId())); } return menu; } private void updateRegionFlag() { Region currentRegion = RegionUtils.getCurrentRegion(); setImageDescriptor(currentRegion.getFlagImageDescriptor()); if (menu != null) { for (MenuItem menuItem : menu.getItems()) { Region region = (Region)menuItem.getData(); menuItem.setSelection(region.equals(currentRegion)); } } } private Image lookupRegionFlag(String regionId) { Region r = RegionUtils.getRegion(regionId); if (r != null) return r.getFlagImage(); return AwsToolkitCore.getDefault().getImageRegistry().get(AwsToolkitCore.IMAGE_AWS_ICON); } public void refreshData() { updateRegionFlag(); } public void dispose() { if (regionChangeListener != null) { AwsToolkitCore.getDefault().removeDefaultRegionChangeListener(regionChangeListener); } } } private final class AccountPreferencesAction extends Action { public AccountPreferencesAction() { setText("Configure AWS Accounts"); setImageDescriptor(AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_GEAR)); } @Override public void run() { String resource = AwsToolkitCore.ACCOUNT_PREFERENCE_PAGE_ID; PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn( null, resource, new String[] { resource }, null); dialog.open(); } } public ConfigurationActionProvider() { regionSelectionAction = new RegionSelectionMenuAction(); refreshAction = new RefreshAction(); } /** * This method is invoked whenever the selection in the viewer changes, so * we need to make sure not to add our action more than once. */ @Override public void fillActionBars(IActionBars actionBars) { for ( IContributionItem item : actionBars.getToolBarManager().getItems() ) { if ( item.getId() == regionSelectionAction.getId() ) return; } actionBars.getToolBarManager().add(new Separator()); actionBars.getToolBarManager().add(refreshAction); actionBars.getToolBarManager().add(new Separator()); actionBars.getToolBarManager().add(regionSelectionAction); MenuManager menuMgr = new MenuManager("AWS Account", AwsToolkitCore.getDefault().getImageRegistry() .getDescriptor(AwsToolkitCore.IMAGE_AWS_ICON), ""); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { String currentAccountId = AwsToolkitCore.getDefault().getCurrentAccountId(); Map<String, String> accounts = AwsToolkitCore.getDefault().getAccountManager().getAllAccountNames(); for ( Entry<String, String> entry : accounts.entrySet() ) { manager.add( new SwitchAccountAction(entry.getKey(), entry.getValue(), currentAccountId.equals(entry.getKey()))); } manager.add(new Separator()); manager.add(new AccountPreferencesAction()); } }); actionBars.getMenuManager().add(menuMgr); actionBars.getToolBarManager().update(true); } private final class SwitchAccountAction extends Action { private final String accountId; public SwitchAccountAction(String accountId, String accountName, boolean isCurrentAccount) { super(accountName, IAction.AS_CHECK_BOX); this.accountId = accountId; setChecked(isCurrentAccount); } @Override public void run() { AwsToolkitCore.getDefault().getAccountManager().setDefaultAccountId( RegionUtils.getCurrentRegion(), accountId); } }; }