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
);
+ }
}
}