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.20
diff -u -r1.20 ChangeLog
--- ChangeLog 28 Oct 2002 23:33:53 -0000 1.20
+++ ChangeLog 30 Oct 2002 05:02:44 -0000
@@ -1,3 +1,9 @@
+2002-10-29 Mikhail Khodjaiants
+ Implementing editing features of the memory view.
+ * MemoryPresentation.java
+ * MemoryControlArea.java
+ * MemoryText.java
+
 2002-10-28 Mikhail Khodjaiants
  Implementing editing features of the memory view.
  * MemoryPresentation.java
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.10
diff -u -r1.10 MemoryControlArea.java
--- src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryControlArea.java 28 Oct 2002 23:33:53 -0000 1.10
+++ src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryControlArea.java 30 Oct 2002 05:02:46 -0000
@@ -15,6 +15,8 @@
 import org.eclipse.debug.core.model.IDebugTarget;
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.layout.GridData;
@@ -337,5 +339,36 @@
  {
   fAddressText.setText( "" );
   handleAddressEnter();
+ }
+
+ /**
+  * @see org.eclipse.swt.widgets.Widget#dispose()
+  */
+ public void dispose()
+ {
+  if ( getPresentation() != null )
+  {
+   getPresentation().dispose();
+  }
+  super.dispose();
+ }
+
+ protected String getTitle()
+ {
+  if ( getParent() instanceof CTabFolder )
+  {
+   CTabItem[] tabItems = ((CTabFolder)getParent()).getItems();
+   return tabItems[fIndex].getText();
+  }
+  return "";
+ }
+
+ protected void setTitle( String title )
+ {
+  if ( getParent() instanceof CTabFolder )
+  {
+   CTabItem[] tabItems = ((CTabFolder)getParent()).getItems();
+   tabItems[fIndex].setText( title );
+  }
  }
 }
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.8
diff -u -r1.8 MemoryPresentation.java
--- src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java 28 Oct 2002 23:33:53 -0000 1.8
+++ src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java 30 Oct 2002 05:02:45 -0000
@@ -39,7 +39,7 @@
  private List fChangedZones;
 
  private boolean fDisplayAscii = true;
-  
+
  /**
   * Constructor for MemoryPresentation.
   */
@@ -121,35 +121,6 @@
   return (Point[])fChangedZones.toArray( new Point[fChangedZones.size()] );
  }
  
- public Point[] getDirtyZones()
- {
-  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()
  {
   return ( fBlock != null ) ? getAddressString( fBlock.getStartAddress() ) : "";
@@ -192,85 +163,6 @@
   return result.toString();
  }
 
-/* 
- private String getItemString( int offset )
- {
-  byte[] data = "">-  String item = new String( data, offset, getSize() );
-  String result = "";
-  switch( fFormat )
-  {
-   case ICDebugUIInternalConstants.MEMORY_FORMAT_HEX:
-    for ( int i = 0; i < getSize(); ++i )
-     result += new String( charToBytes( item.charAt( i ) ) );
-    break;
-   case ICDebugUIInternalConstants.MEMORY_FORMAT_BINARY:
-    for ( int i = 0; i < getSize(); ++i )
-     result += prepend( Integer.toBinaryString( data[offset + i] ), '0', 8 );
-    break;
-   case ICDebugUIInternalConstants.MEMORY_FORMAT_OCTAL:
-    for ( int i = 0; i < getSize(); ++i )
-     result += Integer.toOctalString( data[offset + i] );
-    break;
-  }
-  return result;
- }

- private String getASCIIString( int offset )
- {
-  byte[] data = "">-  char[] ascii = new char[getBytesPerRow()];
-  for ( int i = 0; i < ascii.length; ++i )
-  {
-   ascii[i] = ( data.length > offset + i ) ? getChar( data[offset + i] ) : fNotAvailableChar;   
-  }
-  return new String( ascii );
- }

- private char getChar( byte charByte )
- {
-  char ch = (char)charByte;
-  if ( ch == fNotAvailableChar )
-   return fNotAvailableChar;
-  return ( Character.isISOControl( ch ) ) ? fPaddingChar : ch;
- }
-
- private char[] charToBytes( char ch )
- {
-  return new char[]{ charFromByte( (char)(ch >>> 4) ),
-         charFromByte( (char)(ch & 0x0f) ) };
- }
-
- private char charFromByte( char value )
- {
-  if ( value >= 0x0 && value <= 0x9 )
-   return (char)(value + '0');
-  if ( value >= 0xa && value <= 0xf )
-   return (char)(value - 0xa + 'a');
-  return '0';
- }

- private byte[] getDataBytes()
- {
-  return new byte[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
-/*
-  byte[] result =  new byte[0];
-  if ( fBlock != null )
-  {
-   try
-   {
-    result = fBlock.getBytes();
-   }
-   catch( DebugException e )
-   {
-    // ignore
-   }
-  }
-  return result;
-*/
-/*
- }
-*/ 
  private String resize( String item, char ch, int size )
  {
   char[] chars = new char[size - item.length()];
@@ -356,6 +248,13 @@
    return getMemoryBlock().getNumberOfColumns();
   return 0;
  }
+
+ private char getPaddingCharacter()
+ {
+  if ( getMemoryBlock() != null )
+   return getMemoryBlock().getPaddingCharacter();
+  return '.';
+ }
  
  protected boolean displayASCII()
  {
@@ -470,8 +369,9 @@
   return false;
  }
  
- protected void textChanged( int offset, char newChar, char[] replacedText )
+ protected MemoryText.TextReplacement[] textChanged( int offset, char newChar, char[] replacedText )
  {
+  ArrayList list = new ArrayList();
   if ( getMemoryBlock() != null )
   {
    int index = getDataItemIndex( offset );
@@ -489,7 +389,14 @@
     }
     try
     {
-     getMemoryBlock().setItemValue( index, new String( chars ) );
+     String text = new String( chars );
+     getMemoryBlock().setItemValue( index, text );
+     list.add( new MemoryText.TextReplacement( getDataItemOffset( index ), text ) );
+     if ( displayASCII() )
+     {
+      // Ascii is enabled only when the word size is one byte
+      list.add( getAsciiTextReplacement( index, chars ) );
+     }
     }
     catch( DebugException e )
     {
@@ -497,6 +404,7 @@
     }
    }
   }
+  return (MemoryText.TextReplacement[])list.toArray( new MemoryText.TextReplacement[list.size()] );
  }
 
  private int getDataItemIndex( int offset )
@@ -553,5 +461,39 @@
    return offset - getDataItemOffset( index );
   }
   return -1;
+ }

+ private MemoryText.TextReplacement getAsciiTextReplacement( int itemIndex, char[] chars )
+ {
+  int row = itemIndex / getNumberOfDataItemsInRow();
+  int col = itemIndex % getNumberOfDataItemsInRow();
+  int offset = row * getRowLength() +
+      getAddressLength() + INTERVAL_BETWEEN_ADDRESS_AND_DATA +
+      getNumberOfDataItemsInRow() * (getDataItemLength() + INTERVAL_BETWEEN_DATA_ITEMS) +
+      INTERVAL_BETWEEN_DATA_AND_ASCII + col;
+  byte newValue = CDebugUtils.textToByte( chars );
+  char ch = ( Character.isISOControl( (char)newValue ) || newValue < 0 ) ? getPaddingCharacter() : (char)newValue;
+  return new MemoryText.TextReplacement( offset, new String( new char[]{ ch } ) );
+ }

+ public void dispose()
+ {
+  if ( fAddressZones != null )
+  {
+   fAddressZones.clear();
+  }
+  if ( fChangedZones != null )
+  {
+   fChangedZones.clear();
+  }
+ }

+ protected boolean isDirty()
+ {
+  if ( getMemoryBlock() != null )
+  {
+   return getMemoryBlock().isDirty();
+  }
+  return false;
  }
 }
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.8
diff -u -r1.8 MemoryText.java
--- src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java 28 Oct 2002 23:33:53 -0000 1.8
+++ src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java 30 Oct 2002 05:02:45 -0000
@@ -32,9 +32,42 @@
  * @since Jul 25, 2002
  */
 public class MemoryText
-{
+{ 
+ /**
+  *
+  * The instance of this class specifies the text replacement
+  * that has to be applied to the StyledText widget.
+  *
+  * @since Oct 29, 2002
+  */
+ public static class TextReplacement
+ {
+  private int fStart;
+  private String fText;
+
+  /**
+   * Constructor for TextReplacement.
+   */
+  public TextReplacement( int start, String text )
+  {
+   fStart = start;
+   fText = text;
+  }
+  
+  public int getStart()
+  {
+   return fStart;
+  }
+  
+  public String getText()
+  {
+   return fText;
+  }
+ }
+
  private StyledText fText = null;
  private MemoryPresentation fPresentation = null;
+ private boolean fUpdating = false;
 
  /**
   * Constructor for MemoryText.
@@ -81,13 +114,15 @@
 
  protected void handleExtendedModify( ExtendedModifyEvent event )
  {
+  if ( fUpdating )
+   return;
   if ( event.length != 1 )
    return;
+  TextReplacement[] trs = fPresentation.textChanged( event.start,
+                 fText.getText().charAt( event.start ),
+                 event.replacedText.toCharArray() );
   int caretOffset = fText.getCaretOffset();
-  fPresentation.textChanged( event.start,
-           fText.getText().charAt( event.start ),
-           event.replacedText.toCharArray() );
-  refresh();
+  update( trs );
   fText.setCaretOffset( caretOffset );
  }
  
@@ -114,15 +149,8 @@
              getAddressColor(),
              getBackgroundColor() ) );
   }
-  zones = fPresentation.getDirtyZones();
-  for ( int i = 0; i < zones.length; ++i )
-  {
-   fText.setStyleRange( new StyleRange( zones[i].x,
-             zones[i].y - zones[i].x + 1,
-             getDirtyColor(),
-             getBackgroundColor() ) );
-  }
   fText.redraw();
+  updateTitle();
  }
  
  private void refresh( Point[] zones, String[] items )
@@ -133,12 +161,15 @@
    fText.replaceTextRange( zones[i].x,
            zones[i].y - zones[i].x + 1,
            items[i] );
+/*
    fText.setStyleRange( new StyleRange( zones[i].x,
                 zones[i].y - zones[i].x + 1,
                 getDirtyColor(),
                 getBackgroundColor() ) );
+*/
    fText.redrawRange( zones[i].x, zones[i].y - zones[i].x + 1, false );
   }
+  updateTitle();
  }
 
  protected void handleVerifyKey( VerifyEvent event )
@@ -237,6 +268,7 @@
  
  public void setDirtyColor()
  {
+/*
   Point[] zones = fPresentation.getDirtyZones();
   for ( int i = 0; i < zones.length; ++i )
   {
@@ -245,6 +277,7 @@
              getDirtyColor(),
              getBackgroundColor() ) );
   }
+*/
  }
  
  protected void setEditable( boolean editable )
@@ -260,5 +293,42 @@
  protected Control getControl()
  {
   return fText;
+ }

+ protected void update( TextReplacement[] trs )
+ {
+  fUpdating = true;
+  for ( int i = 0; i < trs.length; ++i )
+  {
+   fText.replaceTextRange( trs[i].getStart(),
+           trs[i].getText().length(),
+           trs[i].getText() );
+/*
+   fText.setStyleRange( new StyleRange( trs[i].getStart(),
+               trs[i].getText().length(),
+                getDirtyColor(),
+                getBackgroundColor() ) );
+*/
+   fText.redrawRange( trs[i].getStart(), trs[i].getText().length(), false );
+  }
+  fUpdating = false;
+  updateTitle();
+ }
+
+ private void updateTitle()
+ {
+  if ( fText.getParent() instanceof MemoryControlArea )
+  {
+   String title = ((MemoryControlArea)fText.getParent()).getTitle();
+   if ( title.charAt( 0 ) == '*' )
+   {
+    title = title.substring( 1 );
+   }
+   if ( fPresentation.isDirty() )
+   {
+    title = '*' + title;
+   }
+   ((MemoryControlArea)fText.getParent()).setTitle( title );
+  }
  }
 }


Back to the top