/*******************************************************************************
 * Copyright (c) 2005, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.debug.internal.ui.views.memory;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.actions.ActionMessages;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.actions.IAddMemoryBlocksTarget;
import org.eclipse.debug.ui.memory.IMemoryRenderingSite;

/**
 * This is the retargettable add memory block action in the Memory View. All
 * AddMemoryBlock actions in the view will use this action to make sure that
 * clients can override the "Add Memory Monitor" dialog.
 *
 */
public class RetargetAddMemoryBlockAction extends AddMemoryBlockAction {

	public RetargetAddMemoryBlockAction(IMemoryRenderingSite site) {
		super(site);
	}

	public RetargetAddMemoryBlockAction(IMemoryRenderingSite site, boolean addDefaultRenderings) {
		super(site, addDefaultRenderings);
	}

	public RetargetAddMemoryBlockAction(String text, int style, IMemoryRenderingSite site) {
		super(text, style, site);
	}

	@Override
	public void run() {
		// get current selection from Debug View
		Object debugContext = DebugUITools.getPartDebugContext(fSite.getSite());
		IAddMemoryBlocksTarget target = getAddMemoryBlocksTarget(debugContext);

		if (target != null) {
			try {
				if (target.supportsAddMemoryBlocks(getMemoryView())) {
					target.addMemoryBlocks(getMemoryView(), getMemoryView().getSite().getSelectionProvider().getSelection());
				} else
					super.run();
			} catch (CoreException e) {
				DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), ActionMessages.RetargetAddMemoryBlockAction_0, ActionMessages.RetargetAddMemoryBlockAction_1, e);
			}
		} else {
			super.run();
		}
	}

	@Override
	protected void updateAction(Object debugContext) {

		try {
			IAddMemoryBlocksTarget target = getAddMemoryBlocksTarget(debugContext);

			if (target != null) {
				if (target.supportsAddMemoryBlocks(getMemoryView())) {
					if (getMemoryView().getSite().getSelectionProvider() != null)
						setEnabled(target.canAddMemoryBlocks(getMemoryView(), getMemoryView().getSite().getSelectionProvider().getSelection()));
					else
						super.updateAction(debugContext);
				} else
					super.updateAction(debugContext);
			} else {
				super.updateAction(debugContext);
			}
		} catch (CoreException e) {
			DebugUIPlugin.log(e);
		}
	}

	private IAddMemoryBlocksTarget getAddMemoryBlocksTarget(Object debugContext) {
		IMemoryBlockRetrieval standardMemRetrieval = MemoryViewUtil.getMemoryBlockRetrieval(debugContext);

		if (standardMemRetrieval == null)
			return null;

		IAddMemoryBlocksTarget target = null;

		if (standardMemRetrieval instanceof IAddMemoryBlocksTarget) {
			target = (IAddMemoryBlocksTarget) standardMemRetrieval;
		} else if (standardMemRetrieval instanceof IAdaptable) {
			target = ((IAdaptable) standardMemRetrieval).getAdapter(IAddMemoryBlocksTarget.class);
		}
		return target;
	}
}
