1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Implementation of the memory view.

This commit is contained in:
Mikhail Khodjaiants 2002-10-18 22:02:51 +00:00
parent 60e7f0dd37
commit 73c66134ef
22 changed files with 287 additions and 35 deletions

View file

@ -1,3 +1,20 @@
2002-10-18 Mikhail Khodjaiants
Implementing the memory view support:
Images for the view's actions:
autorefresh_mem.gif (clcl, dlcl, elcl),
refresh_mem.gif (clcl, dlcl, elcl),
memory_save.gif (clcl, dlcl, elcl),
memory_clear.gif (clcl, dlcl, elcl).
* RefreshMemoryAction.java
* MemoryControlArea.java
* MemoryPresentation.java
* MemoryText.java
* MemoryView.java
* MemoryViewer.java
* CDebugImages.java
* ICDebugHelpContextIds.java
* ICDebugUIConstants.java
2002-10-17 Mikhail Khodjaiants
Implementing the memory view support:
* MemoryControlArea.java

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

View file

@ -64,6 +64,10 @@ public class CDebugImages
public static final String IMG_LCL_TYPE_NAMES = NAME_PREFIX + "tnames_co.gif"; //$NON-NLS-1$
public static final String IMG_LCL_CHANGE_REGISTER_VALUE = NAME_PREFIX + "change_reg_value_co.gif"; //$NON-NLS-1$
public static final String IMG_LCL_AUTO_REFRESH_MEMORY = NAME_PREFIX + "autorefresh_mem.gif"; //$NON-NLS-1$
public static final String IMG_LCL_REFRESH_MEMORY = NAME_PREFIX + "refresh_mem.gif"; //$NON-NLS-1$
public static final String IMG_LCL_MEMORY_SAVE = NAME_PREFIX + "memory_save.gif"; //$NON-NLS-1$
public static final String IMG_LCL_MEMORY_CLEAR = NAME_PREFIX + "memory_clear.gif"; //$NON-NLS-1$
/*
* Set of predefined Image Descriptors.

View file

@ -25,6 +25,7 @@ public interface ICDebugHelpContextIds
// Actions
public static final String CHANGE_REGISTER_VALUE_ACTION = PREFIX + "change_register_value_action_context"; //$NON-NLS-1$
public static final String SHOW_TYPES_ACTION = PREFIX + "show_types_action_context"; //$NON-NLS-1$
public static final String REFRESH_MEMORY_ACTION = PREFIX + "refresh_memory_action_context"; //$NON-NLS-1$
// Views
public static final String REGISTERS_VIEW = PREFIX + "registers_view_context"; //$NON-NLS-1$

View file

@ -0,0 +1,41 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.debug.internal.ui.CDebugImages;
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
import org.eclipse.cdt.debug.internal.ui.views.memory.MemoryViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.actions.SelectionProviderAction;
import org.eclipse.ui.help.WorkbenchHelp;
/**
* Enter type comment.
*
* @since: Oct 18, 2002
*/
public class RefreshMemoryAction extends SelectionProviderAction
{
/**
* Constructor for RefreshMemoryAction.
* @param provider
* @param text
*/
public RefreshMemoryAction( MemoryViewer viewer )
{
super( viewer, "Refresh Memory Block" );
CDebugImages.setLocalImageDescriptors( this, CDebugImages.IMG_LCL_REFRESH_MEMORY );
WorkbenchHelp.setHelp( this, ICDebugHelpContextIds.REFRESH_MEMORY_ACTION );
}
/* (non-Javadoc)
* @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(IStructuredSelection)
*/
public void selectionChanged( IStructuredSelection selection )
{
super.selectionChanged( selection );
}
}

View file

@ -170,7 +170,7 @@ public class MemoryControlArea extends Composite
{
setMemoryManager( ( input instanceof ICMemoryManager ) ? (ICMemoryManager)input : null );
getPresentation().setMemoryBlock( getMemoryBlock() );
setAddressTextState();
setState();
refresh();
}
@ -245,6 +245,7 @@ public class MemoryControlArea extends Composite
getPaddingChar() ) );
getPresentation().setMemoryBlock( getMemoryBlock() );
}
setMemoryTextState();
}
private void removeBlock() throws DebugException
@ -254,6 +255,7 @@ public class MemoryControlArea extends Composite
getMemoryManager().removeBlock( getIndex() );
getPresentation().setMemoryBlock( null );
}
setMemoryTextState();
}
public int getFormat()
@ -311,8 +313,19 @@ public class MemoryControlArea extends Composite
fAddressText.setEnabled( enable );
}
protected void setAddressTextState()
protected void setState()
{
enableAddressText( getMemoryManager() != null );
setMemoryTextState();
}
private void setMemoryTextState()
{
fMemoryText.setEditable( getMemoryManager() != null && getMemoryBlock() != null );
}
protected MemoryText getMemoryText()
{
return fMemoryText;
}
}

View file

@ -6,9 +6,11 @@
package org.eclipse.cdt.debug.internal.ui.views.memory;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.debug.core.ICMemoryManager;
import org.eclipse.cdt.debug.core.IFormattedMemoryBlock;
import org.eclipse.cdt.debug.core.IFormattedMemoryBlockRow;
import org.eclipse.cdt.debug.internal.ui.CDebugUIUtils;
@ -64,14 +66,14 @@ public class MemoryPresentation
{
fAddressZones.clear();
IFormattedMemoryBlockRow[] rows = ( getMemoryBlock() != null ) ? getMemoryBlock().getRows() : new IFormattedMemoryBlockRow[0];
String text = new String();
StringBuffer sb = new StringBuffer();
for ( int i = 0; i < rows.length; ++i )
{
int offset = text.length();
text += getRowText( rows[i] );
int offset = sb.length();
sb.append( getRowText( rows[i] ) );
fAddressZones.add( new Point( offset, offset + getAddressLength() ) );
}
return text;
return sb.toString();
}
public int getItemSize( int offset )
@ -90,7 +92,11 @@ public class MemoryPresentation
public boolean isAcceptable( char ch, int offset )
{
return true;
if ( isInAsciiArea( offset ) )
return true;
if ( isInDataArea( offset ) )
return isValidValue( ch );
return false;
}
public Point[] getAddressZones()
@ -121,8 +127,7 @@ public class MemoryPresentation
private String getInterval( int length )
{
char[] chars = new char[length];
for ( int i = 0; i < chars.length; ++i )
chars[i] = ' ';
Arrays.fill( chars, ' ' );
return new String( chars );
}
@ -133,13 +138,19 @@ public class MemoryPresentation
private String getRowText( IFormattedMemoryBlockRow row )
{
String result = getAddressString( row.getAddress() ) +
getInterval( INTERVAL_BETWEEN_ADDRESS_AND_DATA );
StringBuffer result = new StringBuffer( getRowLength() );
result.append( getAddressString( row.getAddress() ) );
result.append( getInterval( INTERVAL_BETWEEN_ADDRESS_AND_DATA ) );
String[] items = row.getData();
for ( int i = 0; i < items.length; ++i )
result += items[i] + getInterval( INTERVAL_BETWEEN_DATA_ITEMS );
result += getInterval( INTERVAL_BETWEEN_DATA_AND_ASCII ) + row.getASCII() + '\n';
return result;
{
result.append( items[i] );
result.append( getInterval( INTERVAL_BETWEEN_DATA_ITEMS ) );
}
result.append( getInterval( INTERVAL_BETWEEN_DATA_AND_ASCII ) );
result.append( row.getASCII() );
result.append( '\n' );
return result.toString();
}
/*
@ -228,39 +239,126 @@ public class MemoryPresentation
chars[i] = ch;
return String.valueOf( chars ).concat( item );
}
/*
private int getRowLength()
{
return getAddressLength() +
INTERVAL_BETWEEN_ADDRESS_AND_DATA +
(getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS ) * getNumberOfDataItems() +
(getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) * getNumberOfDataItems() +
( ( displayASCII() ) ? INTERVAL_BETWEEN_DATA_AND_ASCII +
getBytesPerRow() : 0 ) + 1;
getDataBytesPerRow() : 0 ) + 1;
}
*/
private int getAddressLength()
{
return 10;
}
/*
private boolean isInAddressZone( int offset )
{
if ( getRowLength() != 0 )
{
int pos = offset % getRowLength();
return ( pos >= 0 && pos < getAddressLength() );
}
return false;
}
private boolean isInAsciiArea( int offset )
{
if ( displayASCII() && getRowLength() != 0 )
{
int pos = offset % getRowLength();
int asciiColumn = getAddressLength() +
INTERVAL_BETWEEN_ADDRESS_AND_DATA +
(getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS ) * getNumberOfDataItems() +
INTERVAL_BETWEEN_DATA_AND_ASCII;
return ( pos >= asciiColumn && pos < getRowLength() - 1 );
}
return false;
}
private boolean isInDataArea( int offset )
{
if ( getRowLength() != 0 )
{
int pos = offset % getRowLength();
int dataBegin = getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA;
int dataEnd = dataBegin + ((getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS ) * getNumberOfDataItems());
if ( pos >= dataBegin && pos < dataEnd )
return isInDataItem( pos - dataBegin );
}
return false;
}
private boolean isInDataItem( int pos )
{
for ( int i = 0; i < getNumberOfDataItems(); ++i )
{
if ( pos < i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) )
return false;
if ( pos >= i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) &&
pos < (i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS)) + getDataItemLength() )
return true;
}
return false;
}
private int getDataItemLength()
{
int result = 0;
switch( getFormat() )
{
case ICDebugUIInternalConstants.MEMORY_FORMAT_HEX:
result = 2 * getSize();
break;
case ICDebugUIInternalConstants.MEMORY_FORMAT_BINARY:
result = 8 * getSize();
break;
}
return result;
if ( getMemoryBlock() != null )
return getMemoryBlock().getWordSize() * 2;
return 0;
}
private int getNumberOfDataItems()
{
return getBytesPerRow() / getSize();
if ( getMemoryBlock() != null )
return getMemoryBlock().getNumberOfColumns();
return 0;
}
private boolean displayASCII()
{
if ( getMemoryBlock() != null )
return getMemoryBlock().displayASCII();
return false;
}
private int getDataBytesPerRow()
{
if ( getMemoryBlock() != null )
return getMemoryBlock().getNumberOfColumns() * getMemoryBlock().getWordSize();
return 0;
}
private boolean isValidValue( char ch )
{
switch( getDataFormat() )
{
case ICMemoryManager.MEMORY_FORMAT_HEX:
return isHexadecimal( ch );
case ICMemoryManager.MEMORY_FORMAT_BINARY:
case ICMemoryManager.MEMORY_FORMAT_OCTAL:
case ICMemoryManager.MEMORY_FORMAT_SIGNED_DECIMAL:
case ICMemoryManager.MEMORY_FORMAT_UNSIGNED_DECIMAL:
case -1:
default:
return false;
}
}
private boolean isHexadecimal( char ch )
{
return ( Character.isDigit( ch ) ||
( ch >= 'a' && ch <= 'f' ) ||
( ch >= 'A' && ch <= 'F' ) );
}
private int getDataFormat()
{
if ( getMemoryBlock() != null )
return getMemoryBlock().getFormat();
return -1;
}
*/
}

View file

@ -26,6 +26,7 @@ import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
*
@ -142,8 +143,19 @@ public class MemoryText
if ( event.character == SWT.LF ||
event.character == SWT.CR ||
event.character == SWT.BS ||
event.character == SWT.DEL ||
!fPresentation.isAcceptable( event.character, fText.getCaretOffset() ) )
event.character == SWT.DEL )
{
event.doit = false;
return;
}
if ( Character.isISOControl( event.character ) )
return;
if ( getSelectionCount() != 0 )
{
event.doit = false;
return;
}
if ( !fPresentation.isAcceptable( event.character, fText.getCaretOffset() ) )
event.doit = false;
}
@ -231,4 +243,19 @@ public class MemoryText
getBackgroundColor() ) );
fText.setStyleRanges( (StyleRange[])list.toArray( new StyleRange[list.size()] ) );
}
protected void setEditable( boolean editable )
{
fText.setEditable( editable );
}
protected int getSelectionCount()
{
return fText.getSelectionCount();
}
protected Control getControl()
{
return fText;
}
}

View file

@ -7,14 +7,17 @@ package org.eclipse.cdt.debug.internal.ui.views.memory;
import org.eclipse.cdt.debug.core.ICMemoryManager;
import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
import org.eclipse.cdt.debug.internal.ui.actions.RefreshMemoryAction;
import org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandler;
import org.eclipse.cdt.debug.internal.ui.views.AbstractDebugEventHandlerView;
import org.eclipse.cdt.debug.internal.ui.views.IDebugExceptionHandler;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
@ -25,6 +28,7 @@ import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
@ -64,6 +68,10 @@ public class MemoryView extends AbstractDebugEventHandlerView
*/
protected void createActions()
{
IAction action = new RefreshMemoryAction( (MemoryViewer)getViewer() );
action.setEnabled( false );
setAction( "RefreshMemory", action ); //$NON-NLS-1$
// set initial content here, as viewer has to be set
setInitialContent();
}
@ -81,6 +89,10 @@ public class MemoryView extends AbstractDebugEventHandlerView
*/
protected void fillContextMenu( IMenuManager menu )
{
menu.add( new Separator( ICDebugUIConstants.EMPTY_MEMORY_GROUP ) );
menu.add( new Separator( ICDebugUIConstants.MEMORY_GROUP ) );
menu.add( getAction( "RefreshMemory" ) ); //$NON-NLS-1$
menu.add( new Separator( IWorkbenchActionConstants.MB_ADDITIONS ) );
}
@ -89,6 +101,9 @@ public class MemoryView extends AbstractDebugEventHandlerView
*/
protected void configureToolBar( IToolBarManager tbm )
{
tbm.add( new Separator( this.getClass().getName() ) );
tbm.add( new Separator( ICDebugUIConstants.MEMORY_GROUP ) );
tbm.add( getAction( "RefreshMemory" ) ); //$NON-NLS-1$
}
/* (non-Javadoc)
@ -192,4 +207,12 @@ public class MemoryView extends AbstractDebugEventHandlerView
setViewerInput( null );
}
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.AbstractDebugView#createContextMenu(Control)
*/
protected void createContextMenu( Control menuControl )
{
super.createContextMenu( ((MemoryControlArea)((MemoryViewer)getViewer()).getTabFolder().getSelection().getControl()).getMemoryText().getControl() );
}
}

View file

@ -12,6 +12,8 @@ import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
@ -63,6 +65,16 @@ public class MemoryViewer extends ContentViewer
fMemoryControlAreas[i] = new MemoryControlArea( fTabFolder, SWT.NONE, i );
tabItem.setControl( fMemoryControlAreas[i] );
}
fTabFolder.addSelectionListener( new SelectionListener()
{
public void widgetSelected( SelectionEvent e )
{
}
public void widgetDefaultSelected( SelectionEvent e )
{
}
} );
fTabFolder.setSelection( 0 );
}
return fControl;
@ -86,7 +98,7 @@ public class MemoryViewer extends ContentViewer
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.Viewer#setSelection(ISelection, boolean)
*/
public void setSelection(ISelection selection, boolean reveal)
public void setSelection( ISelection selection, boolean reveal )
{
}
@ -103,4 +115,9 @@ public class MemoryViewer extends ContentViewer
for ( int i = 0; i < fMemoryControlAreas.length; ++i )
fMemoryControlAreas[i].setInput( (ICMemoryManager)input );
}
protected CTabFolder getTabFolder()
{
return fTabFolder;
}
}

View file

@ -48,4 +48,15 @@ public interface ICDebugUIConstants
* Identifier for a register group in a menu (value <code>"registerGroup"</code>).
*/
public static final String REGISTER_GROUP = "registerGroup"; //$NON-NLS-1$
/**
* Identifier for an empty group preceeding a
* memory group in a menu (value <code>"emptyMemoryGroup"</code>).
*/
public static final String EMPTY_MEMORY_GROUP = "emptyMemoryGroup"; //$NON-NLS-1$
/**
* Identifier for a memory group in a menu (value <code>"memoryGroup"</code>).
*/
public static final String MEMORY_GROUP = "memoryGroup"; //$NON-NLS-1$
}