mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-21 21:52:10 +02:00
Bug 509438 - [traditional] Show a Tooltip for all bytes in range of a
cross reference information Change-Id: Id5821c0f4c68832f060e6b091ff611e35de6e15d
This commit is contained in:
parent
377f0cc815
commit
84d765d241
4 changed files with 90 additions and 4 deletions
|
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||||
Bundle-ManifestVersion: 2
|
Bundle-ManifestVersion: 2
|
||||||
Bundle-Name: %pluginName
|
Bundle-Name: %pluginName
|
||||||
Bundle-SymbolicName: org.eclipse.cdt.debug.ui.memory.traditional;singleton:=true
|
Bundle-SymbolicName: org.eclipse.cdt.debug.ui.memory.traditional;singleton:=true
|
||||||
Bundle-Version: 1.4.0.qualifier
|
Bundle-Version: 1.5.0.qualifier
|
||||||
Bundle-Localization: plugin
|
Bundle-Localization: plugin
|
||||||
Require-Bundle: org.eclipse.debug.core,
|
Require-Bundle: org.eclipse.debug.core,
|
||||||
org.eclipse.debug.ui,
|
org.eclipse.debug.ui,
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<version>1.4.0-SNAPSHOT</version>
|
<version>1.5.0-SNAPSHOT</version>
|
||||||
<artifactId>org.eclipse.cdt.debug.ui.memory.traditional</artifactId>
|
<artifactId>org.eclipse.cdt.debug.ui.memory.traditional</artifactId>
|
||||||
<packaging>eclipse-plugin</packaging>
|
<packaging>eclipse-plugin</packaging>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -163,11 +163,22 @@ public class Rendering extends Composite implements IDebugEventSetListener
|
||||||
/**
|
/**
|
||||||
* Maintains the subset of items visible in the current view address range.
|
* Maintains the subset of items visible in the current view address range.
|
||||||
* This information is refreshed when the associated Panes are about to be redrawn
|
* This information is refreshed when the associated Panes are about to be redrawn
|
||||||
|
* Note: Only the start address of each entry is included i.e. one entry per information item
|
||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
protected final Map<BigInteger, List<IMemoryBlockAddressInfoItem>> fMapStartAddrToInfoItems = Collections
|
protected final Map<BigInteger, List<IMemoryBlockAddressInfoItem>> fMapStartAddrToInfoItems = Collections
|
||||||
.synchronizedMap(new HashMap<BigInteger, List<IMemoryBlockAddressInfoItem>>());
|
.synchronizedMap(new HashMap<BigInteger, List<IMemoryBlockAddressInfoItem>>());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps any address within a memory information range to a corresponding list of information items
|
||||||
|
* sharing that address.
|
||||||
|
* This is useful to e.g. produce a tooltip while hovering over any memory location of a memory information range
|
||||||
|
*
|
||||||
|
* @since 1.5
|
||||||
|
*/
|
||||||
|
protected final Map<BigInteger, List<IMemoryBlockAddressInfoItem>> fMapAddrToInfoItems = Collections
|
||||||
|
.synchronizedMap(new HashMap<BigInteger, List<IMemoryBlockAddressInfoItem>>());
|
||||||
|
|
||||||
public Rendering(Composite parent, TraditionalRendering renderingParent)
|
public Rendering(Composite parent, TraditionalRendering renderingParent)
|
||||||
{
|
{
|
||||||
super(parent, SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.H_SCROLL
|
super(parent, SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND | SWT.H_SCROLL
|
||||||
|
@ -1198,6 +1209,7 @@ public class Rendering extends Composite implements IDebugEventSetListener
|
||||||
}
|
}
|
||||||
|
|
||||||
fMapStartAddrToInfoItems.clear();
|
fMapStartAddrToInfoItems.clear();
|
||||||
|
fMapAddrToInfoItems.clear();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,6 +132,7 @@ public class RenderingAddressInfo extends Rendering
|
||||||
|
|
||||||
fSelectedContext = null;
|
fSelectedContext = null;
|
||||||
fMapStartAddrToInfoItems.clear();
|
fMapStartAddrToInfoItems.clear();
|
||||||
|
fMapAddrToInfoItems.clear();
|
||||||
fAddressInfoTypeStatusMap.clear();
|
fAddressInfoTypeStatusMap.clear();
|
||||||
fAddressInfoItems = null;
|
fAddressInfoItems = null;
|
||||||
|
|
||||||
|
@ -261,6 +262,7 @@ public class RenderingAddressInfo extends Rendering
|
||||||
// The selection has changed, so our Address information may no longer be valid
|
// The selection has changed, so our Address information may no longer be valid
|
||||||
fAddressInfoItems = addressInfoItems;
|
fAddressInfoItems = addressInfoItems;
|
||||||
fMapStartAddrToInfoItems.clear();
|
fMapStartAddrToInfoItems.clear();
|
||||||
|
fMapAddrToInfoItems.clear();
|
||||||
|
|
||||||
if (fBinaryPane.isVisible()) {
|
if (fBinaryPane.isVisible()) {
|
||||||
redrawPanes();
|
redrawPanes();
|
||||||
|
@ -334,6 +336,7 @@ public class RenderingAddressInfo extends Rendering
|
||||||
IMemoryBlockAddressInfoItem[] items = fAddressInfoItems;
|
IMemoryBlockAddressInfoItem[] items = fAddressInfoItems;
|
||||||
if (items == null || !fParent.isShowCrossRefInfoGlobalPref()) {
|
if (items == null || !fParent.isShowCrossRefInfoGlobalPref()) {
|
||||||
fMapStartAddrToInfoItems.clear();
|
fMapStartAddrToInfoItems.clear();
|
||||||
|
fMapAddrToInfoItems.clear();
|
||||||
return fMapStartAddrToInfoItems;
|
return fMapStartAddrToInfoItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,6 +346,7 @@ public class RenderingAddressInfo extends Rendering
|
||||||
// unless the cell size matches the addressable size of the target system
|
// unless the cell size matches the addressable size of the target system
|
||||||
if (fParent.getAddressableSize() != getBytesPerColumn()) {
|
if (fParent.getAddressableSize() != getBytesPerColumn()) {
|
||||||
fMapStartAddrToInfoItems.clear();
|
fMapStartAddrToInfoItems.clear();
|
||||||
|
fMapAddrToInfoItems.clear();
|
||||||
return fMapStartAddrToInfoItems;
|
return fMapStartAddrToInfoItems;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -357,6 +361,7 @@ public class RenderingAddressInfo extends Rendering
|
||||||
synchronized (fMapStartAddrToInfoItems) {
|
synchronized (fMapStartAddrToInfoItems) {
|
||||||
// Refreshing the Address to InfoItem data map
|
// Refreshing the Address to InfoItem data map
|
||||||
fMapStartAddrToInfoItems.clear();
|
fMapStartAddrToInfoItems.clear();
|
||||||
|
fMapAddrToInfoItems.clear();
|
||||||
BigInteger startAddress = getViewportStartAddress();
|
BigInteger startAddress = getViewportStartAddress();
|
||||||
// Get the endAddress considering a page that uses single height,
|
// Get the endAddress considering a page that uses single height,
|
||||||
// Note: The UI may some times present rows with double height even if the user does not see items
|
// Note: The UI may some times present rows with double height even if the user does not see items
|
||||||
|
@ -395,6 +400,29 @@ public class RenderingAddressInfo extends Rendering
|
||||||
if (itemStartIsInRange || itemEndIsInRange || itemSpansOverVisibleRange) {
|
if (itemStartIsInRange || itemEndIsInRange || itemSpansOverVisibleRange) {
|
||||||
fMapStartAddrToInfoItems.put(item.getAddress(), allValuesMap.get(item.getAddress()));
|
fMapStartAddrToInfoItems.put(item.getAddress(), allValuesMap.get(item.getAddress()));
|
||||||
filteredValuesMap.put(item.getAddress(), allValuesMap.get(item.getAddress()));
|
filteredValuesMap.put(item.getAddress(), allValuesMap.get(item.getAddress()));
|
||||||
|
// Add information items for each address within the range
|
||||||
|
// But establish the limits to only add information to visible items (i.e. limiting the processing)
|
||||||
|
BigInteger firstItemVisibleAddress = itemStartIsInRange ? item.getAddress() : startAddress;
|
||||||
|
BigInteger lastItemVisibleAddress = itemEndIsInRange ? item.getAddress().add(item.getRangeInAddressableUnits().subtract(BigInteger.ONE)) : endAddress;
|
||||||
|
|
||||||
|
for (BigInteger candidateAddress=firstItemVisibleAddress; candidateAddress.compareTo(lastItemVisibleAddress) <=0; candidateAddress = candidateAddress.add(BigInteger.ONE)) {
|
||||||
|
List<IMemoryBlockAddressInfoItem> allItemsAtBase = allValuesMap.get(item.getAddress());
|
||||||
|
List<IMemoryBlockAddressInfoItem> newInfoItems = filterToItemsValidForAddress(allItemsAtBase, item.getAddress(), candidateAddress);
|
||||||
|
|
||||||
|
// Add new valid items to the map, associating it to candidate address
|
||||||
|
List<IMemoryBlockAddressInfoItem> existingItems = fMapAddrToInfoItems.get(candidateAddress);
|
||||||
|
if (existingItems == null) {
|
||||||
|
// Brand new list of items
|
||||||
|
fMapAddrToInfoItems.put(candidateAddress, newInfoItems);
|
||||||
|
} else {
|
||||||
|
// Appending new items to the existing list
|
||||||
|
for (IMemoryBlockAddressInfoItem newItem : newInfoItems) {
|
||||||
|
if (!existingItems.contains(newItem)) {
|
||||||
|
existingItems.add(newItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -402,10 +430,56 @@ public class RenderingAddressInfo extends Rendering
|
||||||
return filteredValuesMap;
|
return filteredValuesMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param allBaseItems - Set of items sharing the same starting address
|
||||||
|
* @param baseAddress - The starting address
|
||||||
|
* @param candidateAddress - An address higher than base address
|
||||||
|
* @return - The set of items that are still overlapping at the incremented address
|
||||||
|
*/
|
||||||
|
private List<IMemoryBlockAddressInfoItem> filterToItemsValidForAddress(List<IMemoryBlockAddressInfoItem> allBaseItems,
|
||||||
|
BigInteger baseAddress, BigInteger candidateAddress) {
|
||||||
|
|
||||||
|
List<IMemoryBlockAddressInfoItem> items = new ArrayList<>();
|
||||||
|
|
||||||
|
// Keep info items applicable for the given address
|
||||||
|
BigInteger range = candidateAddress.subtract(baseAddress);
|
||||||
|
|
||||||
|
// sanity check - should not happen
|
||||||
|
if (range.compareTo(BigInteger.ZERO) < 0) {
|
||||||
|
// return empty list
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
else if (range.compareTo(BigInteger.ZERO) == 0) {
|
||||||
|
// Since all items share the same start address,
|
||||||
|
// all items must be valid for a single address span
|
||||||
|
return allBaseItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aggregate elements having a length equal or higher than the span between base address and current address
|
||||||
|
for (IMemoryBlockAddressInfoItem item : allBaseItems) {
|
||||||
|
if (item.getRangeInAddressableUnits().compareTo(range) >=0 ) {
|
||||||
|
items.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
String buildAddressInfoString(BigInteger cellAddress, String separator, boolean addTypeHeaders) {
|
String buildAddressInfoString(BigInteger cellAddress, String separator, boolean addTypeHeaders) {
|
||||||
List<IMemoryBlockAddressInfoItem> infoItems = fMapStartAddrToInfoItems.get(cellAddress);
|
List<IMemoryBlockAddressInfoItem> infoItems;
|
||||||
|
if (addTypeHeaders) {
|
||||||
|
// Tooltip information
|
||||||
|
infoItems = fMapAddrToInfoItems.get(cellAddress);
|
||||||
|
} else {
|
||||||
|
// element information
|
||||||
|
infoItems = fMapStartAddrToInfoItems.get(cellAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buildAddressInfoString(cellAddress, separator, addTypeHeaders, infoItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildAddressInfoString(BigInteger cellAddress, String separator, boolean addTypeHeaders, List<IMemoryBlockAddressInfoItem> infoItems) {
|
||||||
if (infoItems == null || infoItems.size() < 1) {
|
if (infoItems == null || infoItems.size() < 1) {
|
||||||
// No information to display
|
// No information to display
|
||||||
return "";
|
return "";
|
||||||
|
@ -455,7 +529,7 @@ public class RenderingAddressInfo extends Rendering
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
boolean hasAddressInfo(BigInteger cellAddress) {
|
boolean hasAddressInfo(BigInteger cellAddress) {
|
||||||
return fMapStartAddrToInfoItems.keySet().contains(cellAddress);
|
return fMapAddrToInfoItems.keySet().contains(cellAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue