From 113211c2e4a895013a26c9b184e80d38368ea164 Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Mon, 28 Oct 2002 02:53:58 +0000 Subject: [PATCH] Adding editing features to the memory view. --- debug/org.eclipse.cdt.debug.ui/ChangeLog | 5 +- .../ui/views/memory/MemoryPresentation.java | 85 +++++++++++++++---- 2 files changed, 71 insertions(+), 19 deletions(-) diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog index d1632b4c9b2..f5383b7f44e 100644 --- a/debug/org.eclipse.cdt.debug.ui/ChangeLog +++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog @@ -1,4 +1,7 @@ -2002-10-24 Mikhail Khodjaiants +2002-10-27 Mikhail Khodjaiants + * MemoryPresentation.java: adding editing features to the memory view. + +2002-10-25 Mikhail Khodjaiants Implementation of the 'Number Of Columns' action. * MemoryNumberOfColumnAction.java: the action class * MemoryViewer.java: support of the action diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java index b7f209bfbb9..48ecbc9a690 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java @@ -13,7 +13,6 @@ 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.core.CDebugUtils; import org.eclipse.cdt.debug.internal.ui.CDebugUIUtils; import org.eclipse.debug.core.DebugException; import org.eclipse.swt.graphics.Point; @@ -260,7 +259,7 @@ public class MemoryPresentation { return getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA + - (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) * getNumberOfDataItems() + + (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) * getNumberOfDataItemsInRow() + ( ( displayASCII() ) ? INTERVAL_BETWEEN_DATA_AND_ASCII + getDataBytesPerRow() : 0 ) + 1; } @@ -287,7 +286,7 @@ public class MemoryPresentation int pos = offset % getRowLength(); int asciiColumn = getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA + - (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS ) * getNumberOfDataItems() + + (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS ) * getNumberOfDataItemsInRow() + INTERVAL_BETWEEN_DATA_AND_ASCII; return ( pos >= asciiColumn && pos < getRowLength() - 1 ); } @@ -300,7 +299,7 @@ public class MemoryPresentation { int pos = offset % getRowLength(); int dataBegin = getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA; - int dataEnd = dataBegin + ((getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS ) * getNumberOfDataItems()); + int dataEnd = dataBegin + ((getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS ) * getNumberOfDataItemsInRow()); if ( pos >= dataBegin && pos < dataEnd ) return isInDataItem( pos - dataBegin ); } @@ -309,7 +308,7 @@ public class MemoryPresentation private boolean isInDataItem( int pos ) { - for ( int i = 0; i < getNumberOfDataItems(); ++i ) + for ( int i = 0; i < getNumberOfDataItemsInRow(); ++i ) { if ( pos < i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) ) return false; @@ -327,7 +326,7 @@ public class MemoryPresentation return 0; } - private int getNumberOfDataItems() + private int getNumberOfDataItemsInRow() { if ( getMemoryBlock() != null ) return getMemoryBlock().getNumberOfColumns(); @@ -449,24 +448,74 @@ public class MemoryPresentation protected void textChanged( int offset, char newChar, char[] replacedText ) { - byte b = 0; - if ( isInDataArea( offset ) ) - { - } - if ( isInAsciiArea( offset ) ) - { - b = CDebugUtils.charToByte( newChar ); - } if ( getMemoryBlock() != null ) { - try + int index = -1; + if ( isInDataArea( offset ) ) { - getMemoryBlock().setValue( offset, new byte[] { b } ); + index = getDataItemIndex( offset ); } - catch( DebugException e ) + if ( isInAsciiArea( offset ) ) { - // ignore + index = offset; + } + if ( index != -1 ) + { + char[] chars = getDataItemChars( index ); + int itemOffset = getDataItemOffset( index ); + chars[offset - itemOffset] = newChar; + try + { + getMemoryBlock().setItemValue( index, new String( chars ) ); + } + catch( DebugException e ) + { + // ignore + } } } } + + private int getDataItemIndex( int offset ) + { + int row = offset / getRowLength(); + int pos = offset % getRowLength(); + for ( int i = 0; i < getNumberOfDataItemsInRow(); ++i ) + { + if ( pos < i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) ) + return -1; + if ( pos >= i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) && + pos < (i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS)) + getDataItemLength() ) + return i + (row * getNumberOfDataItemsInRow()); + } + return -1; + } + + private int getDataItemOffset( int index ) + { + int row = index / getNumberOfDataItemsInRow(); + int pos = index % getDataItemLength(); + return row * getRowLength() + + getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA + + pos * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS); + } + + private char[] getDataItemChars( int index ) + { + if ( getMemoryBlock() != null ) + { + int rowNumber = index / (getMemoryBlock().getNumberOfColumns() * getMemoryBlock().getWordSize()); + int pos = index % (getMemoryBlock().getNumberOfColumns() * getMemoryBlock().getWordSize()); + IFormattedMemoryBlockRow[] rows = getMemoryBlock().getRows(); + if ( rowNumber < rows.length ) + { + String[] data = rows[rowNumber].getData(); + if ( pos < data.length ) + { + return data[pos].toCharArray(); + } + } + } + return new char[0]; + } }