mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
GP-919: Debouncing tables
This commit is contained in:
@@ -33,11 +33,11 @@ import docking.WindowPosition;
|
||||
import docking.action.*;
|
||||
import docking.widgets.table.CustomToStringCellRenderer;
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
import docking.widgets.table.RowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.app.plugin.core.debug.DebuggerPluginPackage;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractSelectAddressesAction;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources.SelectRowsAction;
|
||||
import ghidra.app.plugin.core.debug.utils.DebouncedRowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.app.services.DebuggerListingService;
|
||||
import ghidra.app.services.DebuggerTraceManagerService;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
@@ -115,7 +115,7 @@ public class DebuggerRegionsProvider extends ComponentProviderAdapter {
|
||||
}
|
||||
|
||||
protected static class RegionTableModel
|
||||
extends RowWrappedEnumeratedColumnTableModel< //
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
RegionTableColumns, ObjectKey, RegionRow, TraceMemoryRegion> {
|
||||
|
||||
public RegionTableModel() {
|
||||
|
||||
@@ -34,14 +34,16 @@ import docking.ActionContext;
|
||||
import docking.WindowPosition;
|
||||
import docking.action.*;
|
||||
import docking.widgets.filechooser.GhidraFileChooser;
|
||||
import docking.widgets.table.*;
|
||||
import docking.widgets.table.CustomToStringCellRenderer;
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
import docking.widgets.table.TableFilter;
|
||||
import ghidra.app.plugin.core.debug.DebuggerPluginPackage;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources.*;
|
||||
import ghidra.app.plugin.core.debug.service.modules.MapModulesBackgroundCommand;
|
||||
import ghidra.app.plugin.core.debug.service.modules.MapSectionsBackgroundCommand;
|
||||
import ghidra.app.plugin.core.debug.utils.BackgroundUtils;
|
||||
import ghidra.app.plugin.core.debug.utils.DebouncedRowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.app.services.*;
|
||||
import ghidra.app.services.DebuggerStaticMappingService.*;
|
||||
import ghidra.async.AsyncUtils;
|
||||
@@ -200,7 +202,7 @@ public class DebuggerModulesProvider extends ComponentProviderAdapter {
|
||||
}
|
||||
|
||||
protected static class ModuleTableModel
|
||||
extends RowWrappedEnumeratedColumnTableModel< //
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
ModuleTableColumns, ObjectKey, ModuleRow, TraceModule> {
|
||||
|
||||
public ModuleTableModel() {
|
||||
@@ -209,7 +211,7 @@ public class DebuggerModulesProvider extends ComponentProviderAdapter {
|
||||
}
|
||||
|
||||
protected static class SectionTableModel
|
||||
extends RowWrappedEnumeratedColumnTableModel< //
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
SectionTableColumns, ObjectKey, SectionRow, TraceSection> {
|
||||
|
||||
public SectionTableModel() {
|
||||
|
||||
@@ -32,12 +32,14 @@ import com.google.common.collect.Range;
|
||||
import docking.ActionContext;
|
||||
import docking.action.DockingAction;
|
||||
import docking.action.DockingActionIf;
|
||||
import docking.widgets.table.*;
|
||||
import docking.widgets.table.CustomToStringCellRenderer;
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
import docking.widgets.table.GTable;
|
||||
import ghidra.app.plugin.core.debug.DebuggerPluginPackage;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerProvider;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources.*;
|
||||
import ghidra.app.plugin.core.debug.utils.DebouncedRowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.app.services.*;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.plugintool.AutoService;
|
||||
@@ -98,7 +100,7 @@ public class DebuggerStaticMappingProvider extends ComponentProviderAdapter
|
||||
}
|
||||
|
||||
protected static class MappingTableModel
|
||||
extends RowWrappedEnumeratedColumnTableModel< //
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
StaticMappingTableColumns, ObjectKey, StaticMappingRow, TraceStaticMapping> {
|
||||
|
||||
public MappingTableModel() {
|
||||
|
||||
@@ -156,7 +156,7 @@ public class ObjectContainer implements Comparable<ObjectContainer> {
|
||||
if (targetObject == null) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
return targetObject.resync(true, true).thenApply(__ -> {
|
||||
return targetObject.resync(true, true).thenApplyAsync(__ -> {
|
||||
rebuildContainers(targetObject.getCachedElements(), targetObject.getCachedAttributes());
|
||||
propagateProvider(provider);
|
||||
return this;
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
/* ###
|
||||
* IP: GHIDRA
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package ghidra.app.plugin.core.debug.utils;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
import docking.widgets.table.RowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.async.AsyncDebouncer;
|
||||
import ghidra.async.AsyncTimer;
|
||||
import ghidra.util.Swing;
|
||||
|
||||
public class DebouncedRowWrappedEnumeratedColumnTableModel<C extends Enum<C> & EnumeratedTableColumn<C, R>, K, R, T>
|
||||
extends RowWrappedEnumeratedColumnTableModel<C, K, R, T> {
|
||||
|
||||
AsyncDebouncer<Void> debouncer = new AsyncDebouncer<Void>(AsyncTimer.DEFAULT_TIMER, 100);
|
||||
|
||||
public DebouncedRowWrappedEnumeratedColumnTableModel(String name, Class<C> colType,
|
||||
Function<T, K> keyFunc, Function<T, R> wrapper) {
|
||||
super(name, colType, keyFunc, wrapper);
|
||||
|
||||
debouncer.addListener(this::settled);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fireTableDataChanged() {
|
||||
debouncer.contact(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fireTableCellUpdated(int row, int column) {
|
||||
debouncer.contact(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fireTableRowsDeleted(int firstRow, int lastRow) {
|
||||
debouncer.contact(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fireTableRowsInserted(int firstRow, int lastRow) {
|
||||
debouncer.contact(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fireTableRowsUpdated(int firstRow, int lastRow) {
|
||||
debouncer.contact(null);
|
||||
}
|
||||
|
||||
// NB. Let structure changes get processed immediately
|
||||
|
||||
private void settled(Void __) {
|
||||
// Just refresh the whole thing
|
||||
Swing.runLater(() -> super.fireTableDataChanged());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user