mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Implementation of 'Change register value' action.
This commit is contained in:
parent
b02cb0cd37
commit
3befb016c8
1 changed files with 229 additions and 0 deletions
|
@ -5,13 +5,33 @@
|
||||||
*/
|
*/
|
||||||
package org.eclipse.cdt.debug.internal.ui.actions;
|
package org.eclipse.cdt.debug.internal.ui.actions;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
|
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
|
||||||
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
|
||||||
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
import org.eclipse.debug.core.model.IValueModification;
|
||||||
|
import org.eclipse.debug.core.model.IVariable;
|
||||||
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
|
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
import org.eclipse.jface.viewers.TreeViewer;
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
import org.eclipse.jface.viewers.Viewer;
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.custom.TreeEditor;
|
import org.eclipse.swt.custom.TreeEditor;
|
||||||
|
import org.eclipse.swt.events.FocusAdapter;
|
||||||
|
import org.eclipse.swt.events.FocusEvent;
|
||||||
|
import org.eclipse.swt.events.KeyAdapter;
|
||||||
|
import org.eclipse.swt.events.KeyEvent;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
import org.eclipse.swt.widgets.Tree;
|
import org.eclipse.swt.widgets.Tree;
|
||||||
|
import org.eclipse.swt.widgets.TreeItem;
|
||||||
|
import org.eclipse.ui.IWorkbenchWindow;
|
||||||
import org.eclipse.ui.actions.SelectionProviderAction;
|
import org.eclipse.ui.actions.SelectionProviderAction;
|
||||||
import org.eclipse.ui.help.WorkbenchHelp;
|
import org.eclipse.ui.help.WorkbenchHelp;
|
||||||
|
|
||||||
|
@ -25,6 +45,11 @@ public class ChangeRegisterValueAction extends SelectionProviderAction
|
||||||
{
|
{
|
||||||
protected Tree fTree;
|
protected Tree fTree;
|
||||||
protected TreeEditor fTreeEditor;
|
protected TreeEditor fTreeEditor;
|
||||||
|
protected Composite fComposite;
|
||||||
|
protected Label fEditorLabel;
|
||||||
|
protected Text fEditorText;
|
||||||
|
protected IVariable fVariable;
|
||||||
|
protected boolean fKeyReleased = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for ChangeRegisterValueAction.
|
* Constructor for ChangeRegisterValueAction.
|
||||||
|
@ -40,4 +65,208 @@ public class ChangeRegisterValueAction extends SelectionProviderAction
|
||||||
fTreeEditor = new TreeEditor( fTree );
|
fTreeEditor = new TreeEditor( fTree );
|
||||||
WorkbenchHelp.setHelp( this, ICDebugHelpContextIds.CHANGE_REGISTER_VALUE_ACTION );
|
WorkbenchHelp.setHelp( this, ICDebugHelpContextIds.CHANGE_REGISTER_VALUE_ACTION );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edit the variable value with an inline text editor.
|
||||||
|
*/
|
||||||
|
protected void doActionPerformed( final IVariable variable )
|
||||||
|
{
|
||||||
|
IWorkbenchWindow window = CDebugUIPlugin.getActiveWorkbenchWindow();
|
||||||
|
if ( window == null )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Shell activeShell = window.getShell();
|
||||||
|
|
||||||
|
// If a previous edit is still in progress, finish it
|
||||||
|
if ( fEditorText != null )
|
||||||
|
{
|
||||||
|
saveChangesAndCleanup( fVariable, activeShell );
|
||||||
|
}
|
||||||
|
fVariable = variable;
|
||||||
|
|
||||||
|
// Use a Composite containing a Label and a Text. This allows us to edit just
|
||||||
|
// the value, while still showing the variable name.
|
||||||
|
fComposite = new Composite( fTree, SWT.NONE );
|
||||||
|
fComposite.setBackground( fTree.getBackground() );
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 2;
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
fComposite.setLayout( layout );
|
||||||
|
|
||||||
|
fEditorLabel = new Label( fComposite, SWT.LEFT );
|
||||||
|
fEditorLabel.setLayoutData( new GridData( GridData.FILL_VERTICAL ) );
|
||||||
|
|
||||||
|
// Fix for bug 1766. Border behavior on Windows & Linux for text
|
||||||
|
// fields is different. On Linux, you always get a border, on Windows,
|
||||||
|
// you don't. Specifying a border on Linux results in the characters
|
||||||
|
// getting pushed down so that only there very tops are visible. Thus,
|
||||||
|
// we have to specify different style constants for the different platforms.
|
||||||
|
int textStyles = SWT.SINGLE | SWT.LEFT;
|
||||||
|
if ( SWT.getPlatform().equals( "win32" ) )
|
||||||
|
{ //$NON-NLS-1$
|
||||||
|
textStyles |= SWT.BORDER;
|
||||||
|
}
|
||||||
|
fEditorText = new Text( fComposite, textStyles );
|
||||||
|
fEditorText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL ) );
|
||||||
|
String valueString = ""; //$NON-NLS-1$
|
||||||
|
try
|
||||||
|
{
|
||||||
|
valueString = fVariable.getValue().getValueString();
|
||||||
|
}
|
||||||
|
catch( DebugException de )
|
||||||
|
{
|
||||||
|
CDebugUIPlugin.errorDialog( "Setting the register value failed.", de );
|
||||||
|
}
|
||||||
|
TreeItem[] selectedItems = fTree.getSelection();
|
||||||
|
fTreeEditor.horizontalAlignment = SWT.LEFT;
|
||||||
|
fTreeEditor.grabHorizontal = true;
|
||||||
|
fTreeEditor.setEditor( fComposite, selectedItems[0] );
|
||||||
|
|
||||||
|
// There is no API on the model presentation to get just the variable name,
|
||||||
|
// so we have to make do with just calling IVariable.getName()
|
||||||
|
String varName = ""; //$NON-NLS-1$
|
||||||
|
try
|
||||||
|
{
|
||||||
|
varName = fVariable.getName();
|
||||||
|
}
|
||||||
|
catch (DebugException de)
|
||||||
|
{
|
||||||
|
CDebugUIPlugin.errorDialog( "Setting the register value failed.", de );
|
||||||
|
}
|
||||||
|
fEditorLabel.setText( varName + "=" ); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fEditorText.setText( valueString );
|
||||||
|
fEditorText.selectAll();
|
||||||
|
|
||||||
|
fComposite.layout( true );
|
||||||
|
fComposite.setVisible( true );
|
||||||
|
fEditorText.setFocus();
|
||||||
|
|
||||||
|
// CR means commit the changes, ESC means abort changing the value
|
||||||
|
fEditorText.addKeyListener(
|
||||||
|
new KeyAdapter()
|
||||||
|
{
|
||||||
|
public void keyReleased( KeyEvent event )
|
||||||
|
{
|
||||||
|
if ( event.character == SWT.CR )
|
||||||
|
{
|
||||||
|
if ( fKeyReleased )
|
||||||
|
{
|
||||||
|
saveChangesAndCleanup( fVariable, activeShell );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cleanup();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( event.character == SWT.ESC )
|
||||||
|
{
|
||||||
|
cleanup();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fKeyReleased = true;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// If the focus is lost, then act as if user hit CR and commit changes
|
||||||
|
fEditorText.addFocusListener(
|
||||||
|
new FocusAdapter()
|
||||||
|
{
|
||||||
|
public void focusLost( FocusEvent fe )
|
||||||
|
{
|
||||||
|
if ( fKeyReleased )
|
||||||
|
{
|
||||||
|
saveChangesAndCleanup( fVariable, activeShell );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the new value validates, save it, and dispose the text widget,
|
||||||
|
* otherwise sound the system bell and leave the user in the editor.
|
||||||
|
*/
|
||||||
|
protected void saveChangesAndCleanup( IVariable variable, Shell shell )
|
||||||
|
{
|
||||||
|
String newValue = fEditorText.getText();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if ( !variable.verifyValue( newValue ) )
|
||||||
|
{
|
||||||
|
shell.getDisplay().beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
variable.setValue( newValue );
|
||||||
|
}
|
||||||
|
catch( DebugException de )
|
||||||
|
{
|
||||||
|
CDebugUIPlugin.errorDialog( "Setting the register value failed.", de );
|
||||||
|
}
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tidy up the widgets that were used
|
||||||
|
*/
|
||||||
|
private void cleanup()
|
||||||
|
{
|
||||||
|
fKeyReleased = false;
|
||||||
|
if ( fEditorText != null )
|
||||||
|
{
|
||||||
|
fEditorText.dispose();
|
||||||
|
fEditorText = null;
|
||||||
|
fVariable = null;
|
||||||
|
fTreeEditor.setEditor( null, null );
|
||||||
|
fComposite.setVisible( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the enabled state of this action based
|
||||||
|
* on the selection
|
||||||
|
*/
|
||||||
|
protected void update( IStructuredSelection sel )
|
||||||
|
{
|
||||||
|
Iterator iter = sel.iterator();
|
||||||
|
if (iter.hasNext())
|
||||||
|
{
|
||||||
|
Object object = iter.next();
|
||||||
|
if ( object instanceof IValueModification )
|
||||||
|
{
|
||||||
|
IValueModification varMod = (IValueModification)object;
|
||||||
|
if ( !varMod.supportsValueModification() )
|
||||||
|
{
|
||||||
|
setEnabled( false );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setEnabled( !iter.hasNext() );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setEnabled( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Action
|
||||||
|
*/
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
Iterator iterator = getStructuredSelection().iterator();
|
||||||
|
doActionPerformed( (IVariable)iterator.next() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SelectionProviderAction
|
||||||
|
*/
|
||||||
|
public void selectionChanged( IStructuredSelection sel )
|
||||||
|
{
|
||||||
|
update( sel );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue