blob: 833b52ec017b6a7496f9399b5606eec967abf11b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 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.jdt.internal.debug.ui.actions;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaReferenceType;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
/**
* Allows the user to choose what source to display from available strata
*/
public class ShowStratumAction implements IObjectActionDelegate, IMenuCreator {
private IStructuredSelection fSelection;
private IWorkbenchPart fPart;
/* (non-Javadoc)
* @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
*/
@Override
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
fPart = targetPart;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
@Override
public void run(IAction action) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof IStructuredSelection) {
fSelection = (IStructuredSelection) selection;
action.setMenuCreator(this);
} else {
action.setMenuCreator(null);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
*/
@Override
public Menu getMenu(Control parent) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
*/
@Override
public Menu getMenu(Menu parent) {
//Create the new menu. The menu will get filled when it is about to be shown. see fillMenu(Menu).
Menu menu = new Menu(parent);
menu.addMenuListener(new MenuAdapter() {
@Override
public void menuShown(MenuEvent e) {
Menu m = (Menu)e.widget;
MenuItem[] items = m.getItems();
for (int i=0; i < items.length; i++) {
items[i].dispose();
}
fillMenu(m);
}
});
return menu;
}
/**
* Fills the given menu with available stratum.
*
* @param m
*/
private void fillMenu(Menu m) {
IStackFrame frame = (IStackFrame) fSelection.getFirstElement();
final IJavaStackFrame javaStackFrame = frame.getAdapter(IJavaStackFrame.class);
if (javaStackFrame != null) {
try {
IJavaReferenceType declaringType = javaStackFrame.getReferenceType();
final IJavaDebugTarget target = (IJavaDebugTarget) javaStackFrame.getDebugTarget();
String currentStratum = target.getDefaultStratum();
String[] strata = declaringType.getAvailableStrata();
for (int i = 0; i < strata.length; i++) {
final String stratum = strata[i];
MenuItem item = createMenuItem(m, stratum, javaStackFrame, target);
item.setSelection(stratum.equals(currentStratum));
}
MenuItem item = createMenuItem(m, null, javaStackFrame, target);
item.setSelection(currentStratum == null);
} catch (DebugException e) {
}
}
}
private MenuItem createMenuItem(Menu m, final String stratum, final IJavaStackFrame frame, final IJavaDebugTarget target) {
MenuItem item = new MenuItem(m, SWT.CHECK);
if (stratum == null) {
item.setText(ActionMessages.ShowStratumAction_0);
} else {
item.setText(stratum);
}
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (((MenuItem)e.getSource()).getSelection()) {
target.setDefaultStratum(stratum);
} else {
target.setDefaultStratum(null);
}
DebugEvent event = new DebugEvent(frame, DebugEvent.CHANGE, DebugEvent.CONTENT);
DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{event});
ISourceDisplay display = frame.getAdapter(ISourceDisplay.class);
if (display != null) {
display.displaySource(frame, fPart.getSite().getPage(), true);
}
}
});
return item;
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.IMenuCreator#dispose()
*/
@Override
public void dispose() {
}
}