Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Adding editing features to the memory view

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];
  }
 }


Back to the top