1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 09:25:31 +02:00

Bug 328690 - Traditional Rendering: "Copy" contents from individual pane

This commit is contained in:
Ken Ryall 2011-03-15 15:54:52 +00:00
parent 60f2c4acc5
commit 011be21212
4 changed files with 175 additions and 58 deletions

View file

@ -246,7 +246,7 @@ public abstract class AbstractPane extends Canvas
break;
}
}
else if(ke.keyCode != SWT.SHIFT)
else if(ke.keyCode != SWT.SHIFT && ke.keyCode != SWT.CTRL && ke.keyCode != SWT.COMMAND)
// if shift key, keep selection, we might add to it
{
fRendering.getSelection().clear();
@ -667,7 +667,7 @@ public abstract class AbstractPane extends Canvas
fSelectionStarted = true;
new CopyAction(fRendering, DND.SELECTION_CLIPBOARD).run();
new CopyDefaultAction(fRendering, DND.SELECTION_CLIPBOARD).run();
}
}
catch(DebugException e)
@ -729,7 +729,7 @@ public abstract class AbstractPane extends Canvas
updateCaret();
new CopyAction(fRendering, DND.SELECTION_CLIPBOARD).run();
new CopyDefaultAction(fRendering, DND.SELECTION_CLIPBOARD).run();
}
catch(DebugException e)
{

View file

@ -64,9 +64,13 @@ import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.progress.UIJob;
@ -168,7 +172,7 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
private void setRenderingPadding(String padding)
{
if(padding == null || padding.length() == 0)
padding = "?";
padding = "?"; //$NON-NLS-1$
TraditionalRendering.this.fRendering.setPaddingString(padding);
}
@ -302,6 +306,7 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
// FIXME
private static final String ID_GO_TO_ADDRESS_COMMAND = "org.eclipse.debug.ui.command.gotoaddress"; //$NON-NLS-1$
private AbstractHandler fGoToAddressHandler;
private IAction fSavedActionHandler; // When we set the global copy action handler we save off the existing so we can restore it.
public void activated()
{
@ -325,6 +330,21 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
}
gotoCommand.setHandler(fGoToAddressHandler);
}
// Set the action handler for the global copy action
final Action defaultAction = new CopyDefaultAction(this.fRendering, DND.CLIPBOARD);
IWorkbenchPartSite site = getMemoryRenderingContainer().getMemoryRenderingSite().getSite();
if (site instanceof IViewSite)
{
IActionBars actionBars = ((IViewSite) site).getActionBars();
if (actionBars != null)
{
fSavedActionHandler = actionBars.getGlobalActionHandler(ActionFactory.COPY.getId());
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), defaultAction);
}
}
}
@ -339,7 +359,18 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
Command command = commandSupport.getCommand(ID_GO_TO_ADDRESS_COMMAND);
command.setHandler(null);
}
// Restore the saved action handler for the memory view.
IWorkbenchPartSite site = getMemoryRenderingContainer().getMemoryRenderingSite().getSite();
if (site instanceof IViewSite)
{
IActionBars actionBars = ((IViewSite) site).getActionBars();
if (actionBars != null)
{
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), fSavedActionHandler);
}
}
super.deactivated();
}
@ -550,27 +581,12 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
super.createPopupMenu(renderingControls[i]);
super.createPopupMenu(this.fRendering);
// copy
// Create the copy actions
final Action copyAction = new CopyAction(this.fRendering);
// copy address
final Action copyAddressAction = new Action(
TraditionalRenderingMessages
.getString("TraditionalRendering.COPY_ADDRESS")) //$NON-NLS-1$
{
public void run()
{
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
TraditionalRendering.this.fRendering.copyAddressToClipboard();
}
});
}
};
final CopyAction copyBinaryAction = new CopyBinaryAction(this.fRendering);
final CopyAction copyTextAction = new CopyTextAction(this.fRendering);
final CopyAction copyAddressAction = new CopyAddressAction(this.fRendering);
final CopyAction copyAllAction = new CopyAllAction(this.fRendering);
// reset to base address
@ -607,7 +623,7 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
// For compatibility with DSF update modes (hopefully this will either be replaced by an enhanced
// platform interface or the caching will move out of the data layer
try {
Method m = fRendering.getMemoryBlock().getClass().getMethod("clearCache", new Class[0]);
Method m = fRendering.getMemoryBlock().getClass().getMethod("clearCache", new Class[0]); //$NON-NLS-1$
if(m != null)
m.invoke(fRendering.getMemoryBlock(), new Object[0]);
}
@ -904,7 +920,7 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
displayColumnCounts[i].setChecked(fRendering.getColumnsSetting() == finali);
}
final Action displayColumnCountCustomValue = new Action("", IAction.AS_RADIO_BUTTON)
final Action displayColumnCountCustomValue = new Action("", IAction.AS_RADIO_BUTTON) //$NON-NLS-1$
{
public void run()
{
@ -1097,11 +1113,21 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
BigInteger start = fRendering.getSelection().getStart();
BigInteger end = fRendering.getSelection().getEnd();
copyAction.setEnabled(start != null && end != null);
manager.add(copyAction);
manager.add(copyAddressAction);
copyBinaryAction.setEnabled(start != null && end != null);
copyTextAction.setEnabled(start != null && end != null);
sub = new MenuManager(TraditionalRenderingMessages.getString("TraditionalRendering.COPY")); //$NON-NLS-1$
sub.add(copyBinaryAction);
sub.add(copyTextAction);
sub.add(copyAddressAction);
sub.add(copyAllAction);
manager.add(sub);
copyBinaryAction.checkStatus();
copyTextAction.checkStatus();
copyAddressAction.checkStatus();
copyAllAction.checkStatus();
manager.add(gotoBaseAddressAction);
manager.add(refreshAction);
manager.add(new Separator());
@ -1274,34 +1300,95 @@ public class TraditionalRendering extends AbstractMemoryRendering implements IRe
}
}
class CopyAction extends Action
class CopyBinaryAction extends CopyAction
{
public CopyBinaryAction(Rendering rendering) {
super(rendering, CopyType.BINARY, DND.CLIPBOARD);
setText(TraditionalRenderingMessages.getString("TraditionalRendering.BINARY")); //$NON-NLS-1$
setToolTipText(TraditionalRenderingMessages.getString("TraditionalRendering.COPY_SELECTED_DATA")); //$NON-NLS-1$
}
}
class CopyTextAction extends CopyAction
{
public CopyTextAction(Rendering rendering) {
super(rendering, CopyType.TEXT, DND.CLIPBOARD);
setText(TraditionalRenderingMessages.getString("TraditionalRendering.TEXT")); //$NON-NLS-1$
setToolTipText(TraditionalRenderingMessages.getString("TraditionalRendering.COPY_SELECTED_DATA_TEXT")); //$NON-NLS-1$
}
}
class CopyAddressAction extends CopyAction
{
public CopyAddressAction(Rendering rendering) {
super(rendering, CopyType.ADDRESS, DND.CLIPBOARD);
setText(TraditionalRenderingMessages.getString("TraditionalRendering.ADDRESS")); //$NON-NLS-1$
setToolTipText(TraditionalRenderingMessages.getString("TraditionalRendering.COPY_SELECTED_ADDDESS")); //$NON-NLS-1$
}
}
class CopyAllAction extends CopyAction
{
public CopyAllAction(Rendering rendering) {
super(rendering, CopyType.ALL, DND.CLIPBOARD);
setText(TraditionalRenderingMessages.getString("TraditionalRendering.ALL")); //$NON-NLS-1$
setToolTipText(TraditionalRenderingMessages.getString("TraditionalRendering.COPY_ALL")); //$NON-NLS-1$
}
}
class CopyDefaultAction extends CopyAction
{
public CopyDefaultAction(Rendering rendering, int clipType) {
super(rendering, CopyType.DEFAULT, clipType);
setText(TraditionalRenderingMessages.getString("TraditionalRendering.DEFAULT")); //$NON-NLS-1$
}
}
abstract class CopyAction extends Action
{
// TODO for the sake of large copies, this action should probably read in
// blocks on a Job.
public enum CopyType {UNDEFINED, BINARY, TEXT, ADDRESS, ALL, DEFAULT};
private Rendering fRendering;
private int fType = DND.CLIPBOARD;
public CopyAction(Rendering rendering)
{
this(rendering, DND.CLIPBOARD);
}
private int fClipboardType = DND.CLIPBOARD;
private CopyType fCopyType = CopyType.ALL;
static private CopyType fDefaultCopyType = CopyType.UNDEFINED;
@SuppressWarnings("restriction") // using platform's labels and images; acceptable build risk
public CopyAction(Rendering rendering, int clipboardType)
public CopyAction(Rendering rendering, CopyType copyType, int clipboardType)
{
super();
fType = clipboardType;
fCopyType = copyType;
fClipboardType = clipboardType;
fRendering = rendering;
setText(DebugUIMessages.CopyViewToClipboardAction_title);
setToolTipText(DebugUIMessages.CopyViewToClipboardAction_tooltip);
setImageDescriptor(DebugPluginImages
.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_COPY_VIEW_TO_CLIPBOARD));
setHoverImageDescriptor(DebugPluginImages
.getImageDescriptor(IInternalDebugUIConstants.IMG_LCL_COPY_VIEW_TO_CLIPBOARD));
setDisabledImageDescriptor(DebugPluginImages
.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_COPY_VIEW_TO_CLIPBOARD));
if (fDefaultCopyType == CopyType.UNDEFINED)
{
IPreferenceStore store = TraditionalRenderingPlugin.getDefault().getPreferenceStore();
String defaultString = store.getString(TraditionalRenderingPreferenceConstants.MEM_DEFAULT_COPY_ACTION);
if (defaultString.length() > 0)
{
try {
fDefaultCopyType = Enum.valueOf(CopyType.class, defaultString);
} catch (Exception e) {
fDefaultCopyType = CopyType.ALL;
}
}
else
fDefaultCopyType = CopyType.ALL;
}
}
public void checkStatus()
{
setChecked(fDefaultCopyType == fCopyType);
}
public void run()
{
@ -1310,13 +1397,34 @@ class CopyAction extends Action
Clipboard clip = null;
try
{
if (fCopyType == CopyType.DEFAULT)
fCopyType = fDefaultCopyType;
if (fCopyType != fDefaultCopyType)
{
IPreferenceStore store = TraditionalRenderingPlugin.getDefault().getPreferenceStore();
store.putValue(TraditionalRenderingPreferenceConstants.MEM_DEFAULT_COPY_ACTION, fCopyType.name());
}
fDefaultCopyType = fCopyType;
boolean copyAddress = fRendering.getPaneVisible(Rendering.PANE_ADDRESS)
&& (fCopyType == CopyType.ADDRESS || fCopyType == CopyType.ALL);
boolean copyBinary = fRendering.getPaneVisible(Rendering.PANE_BINARY)
&& (fCopyType == CopyType.BINARY || fCopyType == CopyType.ALL);
boolean copyText = fRendering.getPaneVisible(Rendering.PANE_TEXT)
&& (fCopyType == CopyType.TEXT || fCopyType == CopyType.ALL);
clip = new Clipboard(fRendering.getDisplay());
BigInteger start = fRendering.getSelection().getStart();
BigInteger end = fRendering.getSelection().getEnd();
// end will be null when there is nothing selected
if (end == null)
{
if (fCopyType == CopyType.ADDRESS)
fRendering.copyAddressToClipboard();
return;
}
if(start.compareTo(end) > 0)
{
@ -1351,7 +1459,7 @@ class CopyAction extends Action
if(rows * columns * bytesPerColumn < lengthToRead.intValue())
rows++;
StringBuffer buffer = new StringBuffer();
for(int row = 0; row < rows; row++)
@ -1359,13 +1467,13 @@ class CopyAction extends Action
BigInteger rowAddress = start.add(BigInteger.valueOf(row
* columns * bytesPerColumn));
if(fRendering.getPaneVisible(Rendering.PANE_ADDRESS))
if(copyAddress)
{
buffer.append(fRendering.getAddressString(rowAddress));
buffer.append(PANE_SPACING);
}
if(fRendering.getPaneVisible(Rendering.PANE_BINARY))
if(copyBinary)
{
for(int col = 0; col < columns; col++)
{
@ -1402,13 +1510,12 @@ class CopyAction extends Action
}
}
if(fRendering.getPaneVisible(Rendering.PANE_BINARY)
&& fRendering.getPaneVisible(Rendering.PANE_TEXT))
if(copyBinary && copyText)
{
buffer.append(PANE_SPACING);
}
if(fRendering.getPaneVisible(Rendering.PANE_TEXT))
if(copyText)
{
for(int col = 0; col < columns; col++)
{
@ -1448,11 +1555,12 @@ class CopyAction extends Action
{
TextTransfer plainTextTransfer = TextTransfer.getInstance();
clip.setContents(new Object[] { buffer.toString() },
new Transfer[] { plainTextTransfer }, fType);
new Transfer[] { plainTextTransfer }, fClipboardType);
}
}
finally
{
checkStatus();
if(clip != null)
{
clip.dispose();

View file

@ -41,5 +41,7 @@ public class TraditionalRenderingPreferenceConstants {
public static final String MEM_EDIT_BUFFER_SAVE_ON_ENTER_OR_FOCUS_LOST = "saveOnEnterOrFocusLost";
public static final String MEM_HISTORY_TRAILS_COUNT = "memoryHistoryTrailsCount";
public static final String MEM_DEFAULT_COPY_ACTION = "memoryDefaultCopyAction";
}

View file

@ -12,6 +12,7 @@ TraditionalRendering.GO_TO_ADDRESS=Go To Address
TraditionalRendering.RESET_TO_BASE_ADDRESS=Reset To Base Address
TraditionalRendering.REFRESH=Refresh
TraditionalRendering.ADDRESS=Address
TraditionalRendering.ALL=All
TraditionalRendering.BINARY=Binary
TraditionalRendering.TEXT=Text
TraditionalRendering.1_BYTE=1 byte
@ -27,6 +28,7 @@ TraditionalRendering.LITTLE=Little
TraditionalRendering.HEX=Hex
TraditionalRendering.DECIMAL_SIGNED=Decimal Signed
TraditionalRendering.DECIMAL_UNSIGNED=Decimal Unsigned
TraditionalRendering.DEFAULT=Default
TraditionalRendering.OCTAL=Octal
TraditionalRendering.PANES=Panes
TraditionalRendering.ENDIAN=Endian
@ -56,7 +58,12 @@ TraditionalRendering.COLUMN_COUNT_32=32
TraditionalRendering.COLUMN_COUNT_64=64
TraditionalRendering.COLUMN_COUNT_128=128
TraditionalRendering.COLUMN_COUNT_CUSTOM=Custom...
TraditionalRendering.COPY=Copy
TraditionalRendering.COPY_ADDRESS=Copy Address
TraditionalRendering.COPY_ALL=Copy all visible data (address, binary, text)
TraditionalRendering.COPY_SELECTED_ADDDESS=Copy the selected address
TraditionalRendering.COPY_SELECTED_DATA=Copy selected data
TraditionalRendering.COPY_SELECTED_DATA_TEXT=Copy selected data in text format
TraditionalRendering.UPDATEMODE=Update Mode
TraditionalRendering.UPDATE_ALWAYS=Always
TraditionalRendering.UPDATE_ON_BREAKPOINT=On Breakpoint