Skip to main content

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

Implementing editing features of the memory view.

Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.ui/ChangeLog,v
retrieving revision 1.19
diff -u -r1.19 ChangeLog
--- ChangeLog 28 Oct 2002 02:53:58 -0000 1.19
+++ ChangeLog 28 Oct 2002 23:33:03 -0000
@@ -1,3 +1,9 @@
+2002-10-28 Mikhail Khodjaiants
+ Implementing editing features of the memory view.
+ * MemoryPresentation.java
+ * MemoryControlArea.java
+ * MemoryText.java

 2002-10-27 Mikhail Khodjaiants
  * MemoryPresentation.java: adding editing features to the memory view.
 
Index: src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryControlArea.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryControlArea.java,v
retrieving revision 1.9
diff -u -r1.9 MemoryControlArea.java
--- src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryControlArea.java 21 Oct 2002 21:49:18 -0000 1.9
+++ src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryControlArea.java 28 Oct 2002 23:33:03 -0000
@@ -181,6 +181,7 @@
  {
   fAddressText.setText( ( getPresentation() != null ) ? getPresentation().getAddressExpression() : "" );
   fMemoryText.refresh();
+  fMemoryView.updateObjects();
  }
  
  protected void setMemoryManager( ICMemoryManager mm )
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.7
diff -u -r1.7 MemoryPresentation.java
--- src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java 28 Oct 2002 02:53:58 -0000 1.7
+++ src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java 28 Oct 2002 23:33:03 -0000
@@ -6,6 +6,7 @@
 
 package org.eclipse.cdt.debug.internal.ui.views.memory;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
@@ -13,6 +14,7 @@
 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;
@@ -35,7 +37,6 @@
  
  private List fAddressZones;
  private List fChangedZones;
- private List fDirtyZones;
 
  private boolean fDisplayAscii = true;
   
@@ -46,7 +47,6 @@
  {  
   fAddressZones = new LinkedList();
   fChangedZones = new LinkedList();
-  fDirtyZones = new LinkedList();
  }
 
  public IFormattedMemoryBlock getMemoryBlock()
@@ -123,7 +123,31 @@
  
  public Point[] getDirtyZones()
  {
-  return (Point[])fDirtyZones.toArray( new Point[fDirtyZones.size()] );
+  ArrayList dirtyZones = new ArrayList();
+  if ( fBlock != null )
+  {
+   IFormattedMemoryBlockRow[] rows = fBlock.getRows();
+   for ( int i = 0; i < rows.length; ++i )
+   {
+    int rowOffset = i * getRowLength();
+    Integer[] dirtyItems = rows[i].getDirtyItems();
+    for ( int j = 0; j < dirtyItems.length; ++j )
+    {
+     int offset = rowOffset +
+         getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA +
+         dirtyItems[j].intValue() * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS);
+     dirtyZones.add( new Point( offset, offset + getDataItemLength() ) );
+     if ( displayASCII() )
+     {
+      offset = rowOffset +
+         getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA +
+         getNumberOfDataItemsInRow() * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS);
+      dirtyZones.add( new Point( offset, offset + (getDataItemLength() / 2) ) );
+     }
+    }
+   }
+  }
+  return (Point[])dirtyZones.toArray( new Point[dirtyZones.size()] );
  }
  
  public String getStartAddress()
@@ -159,9 +183,9 @@
    result.append( items[i] );
    result.append( getInterval( INTERVAL_BETWEEN_DATA_ITEMS ) );
   }
-  result.append( getInterval( INTERVAL_BETWEEN_DATA_AND_ASCII ) );
   if ( displayASCII() )
   {
+   result.append( getInterval( INTERVAL_BETWEEN_DATA_AND_ASCII ) );
    result.append( row.getASCII() );
   }
   result.append( '\n' );
@@ -450,20 +474,19 @@
  {
   if ( getMemoryBlock() != null )
   {
-   int index = -1;
-   if ( isInDataArea( offset ) )
-   {
-    index = getDataItemIndex( offset );
-   }
-   if ( isInAsciiArea( offset ) )
-   {
-    index = offset;
-   }
+   int index = getDataItemIndex( offset );
    if ( index != -1 )
    {
     char[] chars = getDataItemChars( index );
-    int itemOffset = getDataItemOffset( index );
-    chars[offset - itemOffset] = newChar;
+    if ( isInDataArea( offset ) )
+    {
+     int charIndex = getOffsetInDataItem( offset, index );
+     chars[charIndex] = newChar;
+    }
+    if ( isInAsciiArea( offset ) )
+    {
+     chars = CDebugUtils.getByteText( (byte)newChar );
+    }
     try
     {
      getMemoryBlock().setItemValue( index, new String( chars ) );
@@ -479,7 +502,7 @@
  private int getDataItemIndex( int offset )
  {
   int row = offset / getRowLength();
-  int pos = offset % getRowLength();
+  int pos = offset % getRowLength() - getAddressLength() - INTERVAL_BETWEEN_ADDRESS_AND_DATA;
   for ( int i = 0; i < getNumberOfDataItemsInRow(); ++i )
   {
    if ( pos < i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) )
@@ -488,13 +511,17 @@
      pos < (i * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS)) + getDataItemLength() )
     return i + (row * getNumberOfDataItemsInRow());
   }
+  if ( displayASCII() && pos >= getNumberOfDataItemsInRow() * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) + INTERVAL_BETWEEN_DATA_AND_ASCII )
+  {
+   return ((pos - ((getNumberOfDataItemsInRow() * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) + INTERVAL_BETWEEN_DATA_AND_ASCII))) * 2 / getDataItemLength()) + row * getNumberOfDataItemsInRow();
+  }
   return -1;
  }
 
  private int getDataItemOffset( int index )
  {
   int row = index / getNumberOfDataItemsInRow();
-  int pos = index % getDataItemLength();
+  int pos = index % getNumberOfDataItemsInRow();
   return row * getRowLength() +
       getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA +
       pos * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS);
@@ -504,8 +531,8 @@
  {
   if ( getMemoryBlock() != null )
   {
-   int rowNumber = index / (getMemoryBlock().getNumberOfColumns() * getMemoryBlock().getWordSize());
-   int pos = index % (getMemoryBlock().getNumberOfColumns() * getMemoryBlock().getWordSize());
+   int rowNumber = index / getMemoryBlock().getNumberOfColumns();
+   int pos = index % getMemoryBlock().getNumberOfColumns();
    IFormattedMemoryBlockRow[] rows = getMemoryBlock().getRows();
    if ( rowNumber < rows.length )
    {
@@ -517,5 +544,14 @@
    }
   }
   return new char[0];
+ }

+ private int getOffsetInDataItem( int offset, int index )
+ {
+  if ( isInDataArea( offset ) )
+  {
+   return offset - getDataItemOffset( index );
+  }
+  return -1;
  }
 }
Index: src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java,v
retrieving revision 1.7
diff -u -r1.7 MemoryText.java
--- src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java 25 Oct 2002 21:58:42 -0000 1.7
+++ src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java 28 Oct 2002 23:33:03 -0000
@@ -83,11 +83,12 @@
  {
   if ( event.length != 1 )
    return;
+  int caretOffset = fText.getCaretOffset();
   fPresentation.textChanged( event.start,
            fText.getText().charAt( event.start ),
            event.replacedText.toCharArray() );
-  Point[] zones = fPresentation.getDirtyZones();
-  refresh( zones, fPresentation.getText( zones ) );
+  refresh();
+  fText.setCaretOffset( caretOffset );
  }
  
  public void refresh()


Back to the top