/*
* 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.sns;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.navigator.CommonActionProvider;
import com.amazonaws.eclipse.core.AwsToolkitCore;
import com.amazonaws.eclipse.explorer.ContentProviderRegistry;
import com.amazonaws.eclipse.explorer.sns.SNSContentProvider.TopicNode;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.model.DeleteTopicRequest;
import com.amazonaws.services.sns.model.Topic;
public class SNSActionProvider extends CommonActionProvider {
@Override
public void fillContextMenu(IMenuManager menu) {
StructuredSelection selection = (StructuredSelection)getActionSite().getStructuredViewer().getSelection();
menu.add(new CreateTopicAction());
boolean showDeleteMenuItem = true;
List<Topic> selectedTopics = new ArrayList<Topic>();
Iterator iterator = selection.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
if (next instanceof TopicNode) {
selectedTopics.add(((TopicNode)next).getTopic());
} else {
showDeleteMenuItem = false;
}
}
if (selectedTopics.size() > 0 && showDeleteMenuItem) {
menu.add(new DeleteTopicAction(selectedTopics));
menu.add(new Separator());
}
if (selectedTopics.size() == 1) {
AmazonSNS sns = AwsToolkitCore.getClientFactory().getSNSClient();
menu.add(new PublishMessageAction(sns, selectedTopics.get(0)));
menu.add(new NewSubscriptionAction(sns, selectedTopics.get(0), null));
}
}
private Dialog newConfirmationDialog(String title, String message) {
return new MessageDialog(Display.getDefault().getActiveShell(), title, null, message, MessageDialog.WARNING, new String[] {"OK", "Cancel"}, 0);
}
public class DeleteTopicAction extends Action {
private final List<Topic> topics;
public DeleteTopicAction(List<Topic> topics) {
this.topics = topics;
this.setText("Delete Topic" + (topics.size() > 1 ? "s" : ""));
this.setToolTipText("Delete the selected Amazon SNS topics");
this.setImageDescriptor(AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_REMOVE));
}
@Override
public void run() {
Dialog dialog = newConfirmationDialog("Delete selected topics?", "Are you sure you want to delete the selected Amazon SNS topics?");
if (dialog.open() != 0) return;
AmazonSNS sns = AwsToolkitCore.getClientFactory().getSNSClient();
for (Topic topic : topics) {
try {
sns.deleteTopic(new DeleteTopicRequest(topic.getTopicArn()));
} catch (Exception e) {
AwsToolkitCore.getDefault().reportException("Unable to delete Amazon SNS topic", e);
}
}
ContentProviderRegistry.refreshAllContentProviders();
}
}
public static class CreateTopicAction extends Action {
public CreateTopicAction() {
this.setText("Create New Topic");
this.setToolTipText("Create a new Amazon SNS Topic");
this.setImageDescriptor(AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_ADD));
}
@Override
public void run() {
WizardDialog dialog = new WizardDialog(Display.getDefault().getActiveShell(), new CreateTopicWizard());
dialog.open();
}
}
}