Adding editing features to the memory view.
Index:
ChangeLog
===================================================================
RCS
file: /home/tools/org.eclipse.cdt.debug.ui/ChangeLog,v
retrieving revision
1.18
diff -u -r1.18 ChangeLog
--- ChangeLog 25 Oct 2002 17:13:57
-0000 1.18
+++ ChangeLog 28 Oct 2002 02:52:54 -0000
@@ -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
Index:
src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java
===================================================================
RCS
file:
/home/tools/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java,v
retrieving
revision 1.6
diff -u -r1.6 MemoryPresentation.java
---
src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java 25
Oct 2002 21:58:42 -0000 1.6
+++
src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java 28
Oct 2002 02:52:55 -0000
@@ -13,7 +13,6 @@
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
@@
{
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
@@
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
@@
{
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
@@
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
@@
return
0;
}
- private int
getNumberOfDataItems()
+ private int
getNumberOfDataItemsInRow()
{
if (
getMemoryBlock() != null )
return
getMemoryBlock().getNumberOfColumns();
@@ -449,24 +448,74
@@
protected void textChanged( int offset, char
newChar, char[] replacedText )
{
- byte b =
0;
- if ( isInDataArea( offset ) )
+ if (
getMemoryBlock() != null )
{
+ int
index = -1;
+ if ( isInDataArea( offset )
)
+ {
+ index = getDataItemIndex(
offset );
+ }
+ if ( isInAsciiArea(
offset ) )
+ {
+ 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
+ }
+ }
}
- if
( isInAsciiArea( offset ) )
+ }
+
+ private int
getDataItemIndex( int offset )
+ {
+ int row = offset /
getRowLength();
+ int pos = offset %
getRowLength();
+ for ( int i = 0; i <
getNumberOfDataItemsInRow(); ++i
)
{
- b = CDebugUtils.charToByte(
newChar );
+ 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
)
{
- try
- {
- getMemoryBlock().setValue(
offset, new byte[] { b } );
- }
- catch(
DebugException e )
+ int rowNumber = index /
(getMemoryBlock().getNumberOfColumns() *
getMemoryBlock().getWordSize());
+ int pos = index %
(getMemoryBlock().getNumberOfColumns() *
getMemoryBlock().getWordSize());
+ IFormattedMemoryBlockRow[]
rows = getMemoryBlock().getRows();
+ if ( rowNumber <
rows.length )
{
- //
ignore
+ String[] data =
"">+ if ( pos < data.length
)
+ {
+ return
data[pos].toCharArray();
+ }
}
}
+ return
new
char[0];
}
}