GP-919: Debouncing tables

This commit is contained in:
Dan
2021-05-04 16:32:55 -04:00
parent 085daeb39b
commit 61c47a7663
6 changed files with 82 additions and 11 deletions

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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;

View File

@@ -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());
}
}