diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/AbstractPane.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/AbstractPane.java index 2c882749109..1a555c1f2aa 100644 --- a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/AbstractPane.java +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/AbstractPane.java @@ -61,7 +61,184 @@ public abstract class AbstractPane extends Canvas protected int fRowCount = 0; protected boolean fPaneVisible = true; + + class AbstractPaneMouseListener implements MouseListener + { + public void mouseUp(MouseEvent me) + { + positionCaret(me.x, me.y); + fCaret.setVisible(true); + + if(fSelectionInProgress && me.button == 1) + { + endSelection(me.x, me.y); + } + + fSelectionInProgress = fSelectionStarted = false; + } + + public void mouseDown(MouseEvent me) + { + AbstractPane.this.forceFocus(); + + positionCaret(me.x, me.y); + + fCaret.setVisible(false); + + if(me.button == 1) + { + // if shift is down and we have an existing start address, + // append selection + if((me.stateMask & SWT.SHIFT) != 0 + && fRendering.getSelection().getStart() != null) + { + + // if the pane doesn't have a selection start (the + // selection was created in a different pane) + // then initialize the pane's selection start to the + // rendering's selection start + if(AbstractPane.this.fSelectionStartAddress == null) + AbstractPane.this.fSelectionStartAddress = fRendering + .getSelection().getStart(); + + AbstractPane.this.fSelectionStarted = true; + + AbstractPane.this.appendSelection(me.x, me.y); + + } + else + { + // start a new selection + + AbstractPane.this.startSelection(me.x, me.y); + } + } + } + + public void mouseDoubleClick(MouseEvent me) + { + handleMouseDoubleClick(me); + } + + } + + class AbstractPaneMouseMoveListener implements MouseMoveListener + { + public void mouseMove(MouseEvent me) + { + if(fSelectionStarted) + { + fSelectionInProgress = true; + appendSelection(me.x, me.y); + } + } + } + + class AbstractPaneKeyListener implements KeyListener + { + public void keyPressed(KeyEvent ke) + { + fOldSubCellCaretPosition = fSubCellCaretPosition; + if((ke.stateMask & SWT.SHIFT) != 0) + { + switch(ke.keyCode) + { + case SWT.ARROW_RIGHT: + case SWT.ARROW_LEFT: + case SWT.ARROW_UP: + case SWT.ARROW_DOWN: + case SWT.PAGE_DOWN: + case SWT.PAGE_UP: + if(fRendering.getSelection().getStart() == null) + { + fRendering.getSelection().setStart(fCaretAddress.add(BigInteger.valueOf( + fRendering.getAddressesPerColumn())), fCaretAddress); + } + break; + } + } + + if(ke.keyCode == SWT.ARROW_RIGHT) + { + handleRightArrowKey(); + } + else if(ke.keyCode == SWT.ARROW_LEFT || ke.keyCode == SWT.BS) + { + handleLeftArrowKey(); + } + else if(ke.keyCode == SWT.ARROW_DOWN) + { + handleDownArrowKey(); + } + else if(ke.keyCode == SWT.ARROW_UP) + { + handleUpArrowKey(); + } + else if(ke.keyCode == SWT.PAGE_DOWN) + { + handlePageDownKey(); + } + else if(ke.keyCode == SWT.PAGE_UP) + { + handlePageUpKey(); + } + else if(ke.keyCode == SWT.ESC) + { + fRendering.getViewportCache().clearEditBuffer(); + } + else if(ke.character == '\r') + { + fRendering.getViewportCache().writeEditBuffer(); + } + else if(Rendering.isValidEditCharacter(ke.character)) + { + if(fRendering.getSelection().hasSelection()) + { + setCaretAddress(fRendering.getSelection().getLow()); + fSubCellCaretPosition = 0; + } + + editCell(fCaretAddress, fSubCellCaretPosition, ke.character); + } + + if((ke.stateMask & SWT.SHIFT) != 0) + { + switch(ke.keyCode) + { + case SWT.ARROW_RIGHT: + case SWT.ARROW_LEFT: + case SWT.ARROW_UP: + case SWT.ARROW_DOWN: + case SWT.PAGE_DOWN: + case SWT.PAGE_UP: + fRendering.getSelection().setEnd(fCaretAddress.add(BigInteger.valueOf( + fRendering.getAddressesPerColumn())), + fCaretAddress); + break; + } + } + else if(ke.keyCode != SWT.SHIFT) + // if shift key, keep selection, we might add to it + { + fRendering.getSelection().clear(); + } + } + + public void keyReleased(KeyEvent ke) + { + // do nothing + } + } + + class AbstractPanePaintListener implements PaintListener + { + public void paintControl(PaintEvent pe) + { + AbstractPane.this.paint(pe); + } + } + public AbstractPane(Rendering rendering) { super(rendering, SWT.DOUBLE_BUFFERED); @@ -87,257 +264,13 @@ public abstract class AbstractPane extends Canvas fCaret.setSize(1, gc.stringExtent("|").y); //$NON-NLS-1$ gc.dispose(); - this.addPaintListener(new PaintListener() - { - public void paintControl(PaintEvent pe) - { - AbstractPane.this.paint(pe); - } - }); + this.addPaintListener(createPaintListener()); - this.addMouseListener(new MouseListener() - { - public void mouseUp(MouseEvent me) - { - positionCaret(me.x, me.y); + this.addMouseListener(createMouseListener()); - fCaret.setVisible(true); + this.addMouseMoveListener(createMouseMoveListener()); - if(fSelectionInProgress && me.button == 1) - { - endSelection(me.x, me.y); - } - - fSelectionInProgress = fSelectionStarted = false; - } - - public void mouseDown(MouseEvent me) - { - AbstractPane.this.forceFocus(); - - positionCaret(me.x, me.y); - - fCaret.setVisible(false); - - if(me.button == 1) - { - // if shift is down and we have an existing start address, - // append selection - if((me.stateMask & SWT.SHIFT) != 0 - && fRendering.getSelection().getStart() != null) - { - - // if the pane doesn't have a selection start (the - // selection was created in a different pane) - // then initialize the pane's selection start to the - // rendering's selection start - if(AbstractPane.this.fSelectionStartAddress == null) - AbstractPane.this.fSelectionStartAddress = fRendering - .getSelection().getStart(); - - AbstractPane.this.fSelectionStarted = true; - - AbstractPane.this.appendSelection(me.x, me.y); - - } - else - { - // start a new selection - - AbstractPane.this.startSelection(me.x, me.y); - } - } - } - - public void mouseDoubleClick(MouseEvent me) - { - try - { - BigInteger address = getViewportAddress(me.x / getCellWidth(), me.y - / getCellHeight()); - - fRendering.getSelection().clear(); - fRendering.getSelection().setStart(address.add(BigInteger - .valueOf(fRendering.getAddressesPerColumn())), address); - fRendering.getSelection().setEnd(address.add(BigInteger - .valueOf(fRendering.getAddressesPerColumn())), address); - } - catch(DebugException de) - { - // do nothing - } - } - }); - - this.addMouseMoveListener(new MouseMoveListener() - { - public void mouseMove(MouseEvent me) - { - if(fSelectionStarted) - { - fSelectionInProgress = true; - appendSelection(me.x, me.y); - } - } - }); - - this.addKeyListener(new KeyListener() - { - public void keyPressed(KeyEvent ke) - { - fOldSubCellCaretPosition = fSubCellCaretPosition; - if((ke.stateMask & SWT.SHIFT) != 0) - { - switch(ke.keyCode) - { - case SWT.ARROW_RIGHT: - case SWT.ARROW_LEFT: - case SWT.ARROW_UP: - case SWT.ARROW_DOWN: - case SWT.PAGE_DOWN: - case SWT.PAGE_UP: - if(fRendering.getSelection().getStart() == null) - { - fRendering.getSelection().setStart(fCaretAddress.add(BigInteger.valueOf( - fRendering.getAddressesPerColumn())), fCaretAddress); - } - break; - } - } - - if(ke.keyCode == SWT.ARROW_RIGHT) - { - fSubCellCaretPosition++; - if(fSubCellCaretPosition >= getCellCharacterCount()) - { - fSubCellCaretPosition = 0; - // Ensure that caret is within the addressable range - BigInteger newCaretAddress = fCaretAddress.add(BigInteger - .valueOf(getNumberOfBytesRepresentedByColumn() / fRendering.getAddressableSize())); - if(newCaretAddress.compareTo(fRendering.getMemoryBlockEndAddress()) > 0) - { - fSubCellCaretPosition = getCellCharacterCount(); - } - else - { - setCaretAddress(newCaretAddress); - } - } - updateCaret(); - ensureCaretWithinViewport(); - } - else if(ke.keyCode == SWT.ARROW_LEFT || ke.keyCode == SWT.BS) - { - fSubCellCaretPosition--; - if(fSubCellCaretPosition < 0) - { - fSubCellCaretPosition = getCellCharacterCount() - 1; - // Ensure that caret is within the addressable range - BigInteger newCaretAddress = fCaretAddress.subtract(BigInteger - .valueOf(getNumberOfBytesRepresentedByColumn() / fRendering.getAddressableSize())); - if(newCaretAddress.compareTo(fRendering.getMemoryBlockStartAddress()) < 0) - { - fSubCellCaretPosition = 0; - } - else - { - setCaretAddress(newCaretAddress); - } - - } - updateCaret(); - ensureCaretWithinViewport(); - } - else if(ke.keyCode == SWT.ARROW_DOWN) - { - // Ensure that caret is within the addressable range - BigInteger newCaretAddress = fCaretAddress.add(BigInteger - .valueOf(fRendering.getAddressableCellsPerRow())); - setCaretAddress(newCaretAddress); - - updateCaret(); - ensureCaretWithinViewport(); - } - else if(ke.keyCode == SWT.ARROW_UP) - { - // Ensure that caret is within the addressable range - BigInteger newCaretAddress = fCaretAddress.subtract(BigInteger - .valueOf(fRendering.getAddressableCellsPerRow())); - setCaretAddress(newCaretAddress); - - updateCaret(); - ensureCaretWithinViewport(); - } - else if(ke.keyCode == SWT.PAGE_DOWN) - { - // Ensure that caret is within the addressable range - BigInteger newCaretAddress = fCaretAddress.add(BigInteger - .valueOf(fRendering.getAddressableCellsPerRow() - * (fRendering.getRowCount() - 1))); - - setCaretAddress(newCaretAddress); - - updateCaret(); - ensureCaretWithinViewport(); - } - else if(ke.keyCode == SWT.PAGE_UP) - { - // Ensure that caret is within the addressable range - BigInteger newCaretAddress = fCaretAddress.subtract(BigInteger - .valueOf(fRendering.getAddressableCellsPerRow() - * (fRendering.getRowCount() - 1))); - setCaretAddress(newCaretAddress); - - updateCaret(); - ensureCaretWithinViewport(); - } - else if(ke.keyCode == SWT.ESC) - { - fRendering.getViewportCache().clearEditBuffer(); - } - else if(ke.character == '\r') - { - fRendering.getViewportCache().writeEditBuffer(); - } - else if(Rendering.isValidEditCharacter(ke.character)) - { - if(fRendering.getSelection().hasSelection()) - { - setCaretAddress(fRendering.getSelection().getLow()); - fSubCellCaretPosition = 0; - } - - editCell(fCaretAddress, fSubCellCaretPosition, ke.character); - } - - if((ke.stateMask & SWT.SHIFT) != 0) - { - switch(ke.keyCode) - { - case SWT.ARROW_RIGHT: - case SWT.ARROW_LEFT: - case SWT.ARROW_UP: - case SWT.ARROW_DOWN: - case SWT.PAGE_DOWN: - case SWT.PAGE_UP: - fRendering.getSelection().setEnd(fCaretAddress.add(BigInteger.valueOf( - fRendering.getAddressesPerColumn())), - fCaretAddress); - break; - } - } - else if(ke.keyCode != SWT.SHIFT) - // if shift key, keep selection, we might add to it - { - fRendering.getSelection().clear(); - } - } - - public void keyReleased(KeyEvent ke) - { - // do nothing - } - }); + this.addKeyListener(createKeyListener()); this.addFocusListener(new FocusListener() { @@ -364,6 +297,133 @@ public abstract class AbstractPane extends Canvas }); } + protected MouseListener createMouseListener(){ + return new AbstractPaneMouseListener(); + } + + protected MouseMoveListener createMouseMoveListener(){ + return new AbstractPaneMouseMoveListener(); + } + + protected KeyListener createKeyListener(){ + return new AbstractPaneKeyListener(); + } + + protected PaintListener createPaintListener(){ + return new AbstractPanePaintListener(); + } + + protected void handleRightArrowKey() + { + fSubCellCaretPosition++; + if(fSubCellCaretPosition >= getCellCharacterCount()) + { + fSubCellCaretPosition = 0; + // Ensure that caret is within the addressable range + BigInteger newCaretAddress = fCaretAddress.add(BigInteger + .valueOf(getNumberOfBytesRepresentedByColumn() / fRendering.getAddressableSize())); + if(newCaretAddress.compareTo(fRendering.getMemoryBlockEndAddress()) > 0) + { + fSubCellCaretPosition = getCellCharacterCount(); + } + else + { + setCaretAddress(newCaretAddress); + } + } + updateCaret(); + ensureCaretWithinViewport(); + } + + protected void handleLeftArrowKey() + { + fSubCellCaretPosition--; + if(fSubCellCaretPosition < 0) + { + fSubCellCaretPosition = getCellCharacterCount() - 1; + // Ensure that caret is within the addressable range + BigInteger newCaretAddress = fCaretAddress.subtract(BigInteger + .valueOf(getNumberOfBytesRepresentedByColumn() / fRendering.getAddressableSize())); + if(newCaretAddress.compareTo(fRendering.getMemoryBlockStartAddress()) < 0) + { + fSubCellCaretPosition = 0; + } + else + { + setCaretAddress(newCaretAddress); + } + + } + updateCaret(); + ensureCaretWithinViewport(); + } + + protected void handleDownArrowKey() + { + // Ensure that caret is within the addressable range + BigInteger newCaretAddress = fCaretAddress.add(BigInteger + .valueOf(fRendering.getAddressableCellsPerRow())); + setCaretAddress(newCaretAddress); + + updateCaret(); + ensureCaretWithinViewport(); + } + + protected void handleUpArrowKey() + { + // Ensure that caret is within the addressable range + BigInteger newCaretAddress = fCaretAddress.subtract(BigInteger + .valueOf(fRendering.getAddressableCellsPerRow())); + setCaretAddress(newCaretAddress); + + updateCaret(); + ensureCaretWithinViewport(); + } + + protected void handlePageDownKey() + { + // Ensure that caret is within the addressable range + BigInteger newCaretAddress = fCaretAddress.add(BigInteger + .valueOf(fRendering.getAddressableCellsPerRow() + * (fRendering.getRowCount() - 1))); + + setCaretAddress(newCaretAddress); + + updateCaret(); + ensureCaretWithinViewport(); + } + + protected void handlePageUpKey() + { + // Ensure that caret is within the addressable range + BigInteger newCaretAddress = fCaretAddress.subtract(BigInteger + .valueOf(fRendering.getAddressableCellsPerRow() + * (fRendering.getRowCount() - 1))); + setCaretAddress(newCaretAddress); + + updateCaret(); + ensureCaretWithinViewport(); + } + + protected void handleMouseDoubleClick(MouseEvent me) + { + try + { + BigInteger address = getViewportAddress(me.x / getCellWidth(), me.y + / getCellHeight()); + + fRendering.getSelection().clear(); + fRendering.getSelection().setStart(address.add(BigInteger + .valueOf(fRendering.getAddressesPerColumn())), address); + fRendering.getSelection().setEnd(address.add(BigInteger + .valueOf(fRendering.getAddressesPerColumn())), address); + } + catch(DebugException de) + { + // do nothing + } + } + protected boolean isPaneVisible() { return fPaneVisible; diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/IMemoryByte.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/IMemoryByte.java new file mode 100644 index 00000000000..9c0bb840508 --- /dev/null +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/IMemoryByte.java @@ -0,0 +1,8 @@ +package org.eclipse.dd.debug.memory.renderings.traditional; + +public interface IMemoryByte { + + public boolean isEdited(); + + public void setEdited(boolean edited); +} diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/IViewportCache.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/IViewportCache.java new file mode 100644 index 00000000000..9f2e5d0bd48 --- /dev/null +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/IViewportCache.java @@ -0,0 +1,19 @@ +package org.eclipse.dd.debug.memory.renderings.traditional; + +import java.math.BigInteger; + +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.MemoryByte; + +public interface IViewportCache { + + public void dispose(); + public void refresh(); + public MemoryByte[] getBytes(BigInteger address, int bytesRequested) throws DebugException; + public void archiveDeltas(); + public void setEditedValue(BigInteger address, MemoryByte[] bytes); + public void clearEditBuffer(); + public void writeEditBuffer(); + public boolean containsEditedCell(BigInteger address); + // private void queueRequest(BigInteger startAddress, BigInteger endAddress); +} diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/Rendering.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/Rendering.java index 2f63034c75c..cc4fe61103f 100644 --- a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/Rendering.java +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/Rendering.java @@ -63,11 +63,11 @@ public class Rendering extends Composite implements IDebugEventSetListener // controls - private AddressPane fAddressPane; + protected AddressPane fAddressPane; - private DataPane fBinaryPane; + protected DataPane fBinaryPane; - private TextPane fTextPane; + protected TextPane fTextPane; private GoToAddressComposite fAddressBar; @@ -231,30 +231,16 @@ public class Rendering extends Composite implements IDebugEventSetListener switch(se.detail) { case SWT.ARROW_DOWN: - fViewportAddress = fViewportAddress.add(BigInteger - .valueOf(getAddressableCellsPerRow())); - ensureViewportAddressDisplayable(); - redrawPanes(); + handleDownArrow(); break; case SWT.PAGE_DOWN: - fViewportAddress = fViewportAddress.add(BigInteger - .valueOf(getAddressableCellsPerRow() - * (Rendering.this.getRowCount() - 1))); - ensureViewportAddressDisplayable(); - redrawPanes(); + handlePageDown(); break; case SWT.ARROW_UP: - fViewportAddress = fViewportAddress.subtract(BigInteger - .valueOf(getAddressableCellsPerRow())); - ensureViewportAddressDisplayable(); - redrawPanes(); + handleUpArrow(); break; case SWT.PAGE_UP: - fViewportAddress = fViewportAddress.subtract(BigInteger - .valueOf(getAddressableCellsPerRow() - * (Rendering.this.getRowCount() - 1))); - ensureViewportAddressDisplayable(); - redrawPanes(); + handlePageUp(); break; case SWT.SCROLL_LINE: if(getVerticalBar().getSelection() == getVerticalBar().getMinimum()) @@ -312,77 +298,8 @@ public class Rendering extends Composite implements IDebugEventSetListener } }); - this.setLayout(new Layout() - { - public void layout(Composite composite, boolean changed) - { - int xOffset = 0; - if(Rendering.this.getHorizontalBar().isVisible()) - xOffset = Rendering.this.getHorizontalBar().getSelection(); - - int x = xOffset * -1; - int y = 0; - - if(fAddressBarControl.isVisible()) - { - fAddressBarControl.setBounds(0, 0, - Rendering.this.getBounds().width, fAddressBarControl - .computeSize(100, 30).y); // FIXME - //y = fAddressBarControl.getBounds().height; - } - - if(fAddressPane.isPaneVisible()) - { - fAddressPane.setBounds(x, y, - fAddressPane.computeSize(0, 0).x, Rendering.this - .getBounds().height - - y); - x = fAddressPane.getBounds().x - + fAddressPane.getBounds().width; - } - - if(fBinaryPane.isPaneVisible()) - { - fBinaryPane.setBounds(x, y, - fBinaryPane.computeSize(0, 0).x, Rendering.this - .getBounds().height - - y); - x = fBinaryPane.getBounds().x - + fBinaryPane.getBounds().width; - } - - if(fTextPane.isPaneVisible()) - { - fTextPane.setBounds(x, y, - Math.max(fTextPane.computeSize(0, 0).x, Rendering.this.getClientArea().width - - x - xOffset), Rendering.this.getBounds().height - y); - } - - if(getClientArea().width >= fTextPane.getBounds().x + fTextPane.getBounds().width + xOffset) - { - Rendering.this.getHorizontalBar().setVisible(false); - } - else - { - ScrollBar horizontal = Rendering.this.getHorizontalBar(); - - horizontal.setVisible(true); - horizontal.setMinimum(0); - horizontal.setMaximum(fTextPane.getBounds().x - + fTextPane.getBounds().width + xOffset); - horizontal.setThumb(getClientArea().width); - horizontal.setPageIncrement(40); // TODO ? - horizontal.setIncrement(20); // TODO ? - } - } - - protected Point computeSize(Composite composite, int wHint, - int hHint, boolean flushCache) - { - return new Point(100, 100); // dummy data - } - }); - + setLayout(); + this.addControlListener(new ControlListener() { public void controlMoved(ControlEvent ce) @@ -398,6 +315,114 @@ public class Rendering extends Composite implements IDebugEventSetListener DebugPlugin.getDefault().addDebugEventListener(this); } + protected void setLayout() + { + this.setLayout(new Layout() + { + public void layout(Composite composite, boolean changed) + { + int xOffset = 0; + if(Rendering.this.getHorizontalBar().isVisible()) + xOffset = Rendering.this.getHorizontalBar().getSelection(); + + int x = xOffset * -1; + int y = 0; + + if(fAddressBarControl.isVisible()) + { + fAddressBarControl.setBounds(0, 0, + Rendering.this.getBounds().width, fAddressBarControl + .computeSize(100, 30).y); // FIXME + //y = fAddressBarControl.getBounds().height; + } + + if(fAddressPane.isPaneVisible()) + { + fAddressPane.setBounds(x, y, + fAddressPane.computeSize(0, 0).x, Rendering.this + .getBounds().height + - y); + x = fAddressPane.getBounds().x + + fAddressPane.getBounds().width; + } + + if(fBinaryPane.isPaneVisible()) + { + fBinaryPane.setBounds(x, y, + fBinaryPane.computeSize(0, 0).x, Rendering.this + .getBounds().height + - y); + x = fBinaryPane.getBounds().x + + fBinaryPane.getBounds().width; + } + + if(fTextPane.isPaneVisible()) + { + fTextPane.setBounds(x, y, + Math.max(fTextPane.computeSize(0, 0).x, Rendering.this.getClientArea().width + - x - xOffset), Rendering.this.getBounds().height - y); + } + + if(getClientArea().width >= fTextPane.getBounds().x + fTextPane.getBounds().width + xOffset) + { + Rendering.this.getHorizontalBar().setVisible(false); + } + else + { + ScrollBar horizontal = Rendering.this.getHorizontalBar(); + + horizontal.setVisible(true); + horizontal.setMinimum(0); + horizontal.setMaximum(fTextPane.getBounds().x + + fTextPane.getBounds().width + xOffset); + horizontal.setThumb(getClientArea().width); + horizontal.setPageIncrement(40); // TODO ? + horizontal.setIncrement(20); // TODO ? + } + } + + protected Point computeSize(Composite composite, int wHint, + int hHint, boolean flushCache) + { + return new Point(100, 100); // dummy data + } + }); + } + + protected void handleDownArrow() + { + fViewportAddress = fViewportAddress.add(BigInteger + .valueOf(getAddressableCellsPerRow())); + ensureViewportAddressDisplayable(); + redrawPanes(); + } + + protected void handleUpArrow() + { + fViewportAddress = fViewportAddress.subtract(BigInteger + .valueOf(getAddressableCellsPerRow())); + ensureViewportAddressDisplayable(); + redrawPanes(); + } + + protected void handlePageDown() + { + fViewportAddress = fViewportAddress.add(BigInteger + .valueOf(getAddressableCellsPerRow() + * (Rendering.this.getRowCount() - 1))); + ensureViewportAddressDisplayable(); + redrawPanes(); + } + + protected void handlePageUp() + { + fViewportAddress = fViewportAddress.subtract(BigInteger + .valueOf(getAddressableCellsPerRow() + * (Rendering.this.getRowCount() - 1))); + ensureViewportAddressDisplayable(); + redrawPanes(); + } + protected AddressPane createAddressPane() { return new AddressPane(this); @@ -561,7 +586,7 @@ public class Rendering extends Composite implements IDebugEventSetListener return false; } - private IMemoryBlockExtension getMemoryBlock() + protected IMemoryBlockExtension getMemoryBlock() { IMemoryBlock block = fParent.getMemoryBlock(); if(block != null) @@ -576,12 +601,12 @@ public class Rendering extends Composite implements IDebugEventSetListener return fParent.getBigBaseAddress(); } - protected int getAddressableSize() + public int getAddressableSize() { return fParent.getAddressableSize(); } - protected ViewportCache getViewportCache() + protected IViewportCache getViewportCache() { return fViewportCache; } @@ -589,7 +614,7 @@ public class Rendering extends Composite implements IDebugEventSetListener public MemoryByte[] getBytes(BigInteger address, int bytes) throws DebugException { - return fViewportCache.getBytes(address, bytes); + return getViewportCache().getBytes(address, bytes); } // default visibility for performance @@ -599,7 +624,7 @@ public class Rendering extends Composite implements IDebugEventSetListener { } - class ViewportCache extends Thread + class ViewportCache extends Thread implements IViewportCache { class ArchiveDeltas implements Request { @@ -665,7 +690,7 @@ public class Rendering extends Composite implements IDebugEventSetListener } } - protected void refresh() + public void refresh() { assert Thread.currentThread().equals( Display.getDefault().getThread()) : TraditionalRenderingMessages @@ -677,7 +702,7 @@ public class Rendering extends Composite implements IDebugEventSetListener } } - protected void archiveDeltas() + public void archiveDeltas() { assert Thread.currentThread().equals( Display.getDefault().getThread()) : TraditionalRenderingMessages @@ -886,7 +911,7 @@ public class Rendering extends Composite implements IDebugEventSetListener } // bytes will be fetched from cache - protected MemoryByte[] getBytes(BigInteger address, int bytesRequested) + public MemoryByte[] getBytes(BigInteger address, int bytesRequested) throws DebugException { assert Thread.currentThread().equals( @@ -933,7 +958,7 @@ public class Rendering extends Composite implements IDebugEventSetListener return bytes; } - private boolean containsEditedCell(BigInteger address) + public boolean containsEditedCell(BigInteger address) { assert Thread.currentThread().equals( Display.getDefault().getThread()) : TraditionalRenderingMessages @@ -951,7 +976,7 @@ public class Rendering extends Composite implements IDebugEventSetListener return (MemoryByte[]) fEditBuffer.get(address); } - protected void clearEditBuffer() + public void clearEditBuffer() { assert Thread.currentThread().equals( Display.getDefault().getThread()) : TraditionalRenderingMessages @@ -961,7 +986,7 @@ public class Rendering extends Composite implements IDebugEventSetListener Rendering.this.redrawPanes(); } - protected void writeEditBuffer() + public void writeEditBuffer() { assert Thread.currentThread().equals( Display.getDefault().getThread()) : TraditionalRenderingMessages @@ -997,7 +1022,7 @@ public class Rendering extends Composite implements IDebugEventSetListener clearEditBuffer(); } - protected void setEditedValue(BigInteger address, MemoryByte[] bytes) + public void setEditedValue(BigInteger address, MemoryByte[] bytes) { assert Thread.currentThread().equals( Display.getDefault().getThread()) : TraditionalRenderingMessages @@ -1334,9 +1359,9 @@ public class Rendering extends Composite implements IDebugEventSetListener { if(!this.isDisposed()) { - if(this.isVisible() && fViewportCache != null) + if(this.isVisible() && getViewportCache() != null) { - fViewportCache.refresh(); + getViewportCache().refresh(); } else { @@ -1348,7 +1373,7 @@ public class Rendering extends Composite implements IDebugEventSetListener protected void archiveDeltas() { - fViewportCache.archiveDeltas(); + this.getViewportCache().archiveDeltas(); } public void gotoAddress(BigInteger address) @@ -1364,7 +1389,7 @@ public class Rendering extends Composite implements IDebugEventSetListener redrawPanes(); } - protected void setViewportStartAddress(BigInteger newAddress) + public void setViewportStartAddress(BigInteger newAddress) { fViewportAddress = newAddress; } @@ -1615,6 +1640,36 @@ public class Rendering extends Composite implements IDebugEventSetListener } } + protected void redrawPane(int paneId) + { + if(!isDisposed() && this.isVisible()) + { + AbstractPane pane = null; + if(paneId == Rendering.PANE_ADDRESS) + { + pane = fAddressPane; + } + else if(paneId == Rendering.PANE_BINARY) + { + pane = fBinaryPane; + } + if(paneId == Rendering.PANE_TEXT) + { + pane = fTextPane; + } + if(pane != null && pane.isPaneVisible()) + { + pane.redraw(); + pane.setRowCount(); + if(pane.isFocusControl()) + pane.updateCaret(); + } + + } + + fParent.updateRenderingLabels(); + } + protected void redrawPanes() { if(!isDisposed() && this.isVisible()) diff --git a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/TraditionalRendering.java b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/TraditionalRendering.java index 5ea13b70c6b..e2a0bfb7333 100644 --- a/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/TraditionalRendering.java +++ b/plugins/org.eclipse.dd.debug.memory.renderings.traditional/src/org/eclipse/dd/debug/memory/renderings/traditional/TraditionalRendering.java @@ -95,10 +95,9 @@ import org.eclipse.ui.progress.UIJob; public class TraditionalRendering extends AbstractMemoryRendering implements IRepositionableMemoryRendering { - Rendering fRendering; - - private Action displayEndianBigAction; - private Action displayEndianLittleAction; + protected Rendering fRendering; + protected Action displayEndianBigAction; + protected Action displayEndianLittleAction; private IWorkbenchAdapter fWorkbenchAdapter; private IMemoryBlockConnection fConnection; @@ -1086,7 +1085,7 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe } -class TraditionalMemoryByte extends MemoryByte +class TraditionalMemoryByte extends MemoryByte implements IMemoryByte { private boolean isEdited = false;