View as Array fix cosmetics: PY-14194 and PY-14189

fix PY-14185 (also handle multiselection)
increase chunk size
This commit is contained in:
Alexander Marchuk
2014-10-29 12:29:48 +03:00
parent e460b5638f
commit 1bd0d01fe6
5 changed files with 62 additions and 19 deletions
@@ -990,7 +990,7 @@ action.Debugger.AddToWatch.text=Add to Watches
action.Debugger.EvaluateInConsole.text=Evaluate in Console
action.Debugger.UnmuteOnStop.text=Unmute breakpoints on session finish
action.Debugger.AutoRenderer.text=Auto
action.PyDebugger.ViewArray.text = View as array
action.PyDebugger.ViewArray.text = View as Array
group.EditorPopupMenu.text=Editor Popup Menu
group.EditorPopupMenu.description=Editor Popup Menu
action.Add\ to\ migration\ roots.text=_Add to migration roots
@@ -17,7 +17,7 @@ import java.util.List;
* @author amarch
*/
class NumpyArraySlice extends ComparableArrayChunk {
public class NumpyArraySlice extends ComparableArrayChunk {
private NumpyArrayValueProvider myValueProvider;
private DataEvaluator myDataEvaluator;
private String myFormat;
@@ -54,7 +54,7 @@ class NumpyArraySlice extends ComparableArrayChunk {
}
@Override
void fillData(Runnable callback) {
public void fillData(Runnable callback) {
myDataEvaluator.evaluateData(callback);
}
@@ -111,11 +111,11 @@ class NumpyArraySlice extends ComparableArrayChunk {
}
String fullName = ((XValueNodeImpl)node).getName();
if (!fullName.contains(getPresentation())) {
if (fullName == null || !fullName.contains(getPresentation())) {
return;
}
int row = -1;
int row;
if (isOneRow()) {
row = 0;
}
@@ -136,6 +136,9 @@ class NumpyArraySlice extends ComparableArrayChunk {
if (row != -1 && myData[row][0] == null) {
for (int i = 0; i < node.getChildCount() - 1; i++) {
String rawValue = ((XValueNodeImpl)node.getChildAt(i + 1)).getRawValue();
if (rawValue == null) {
return;
}
if (myValueProvider.isNumeric()) {
//remove str quotes in case of numeric
rawValue = rawValue.substring(1, rawValue.length() - 1);
@@ -144,6 +147,9 @@ class NumpyArraySlice extends ComparableArrayChunk {
}
if (node.getChildCount() == 0) {
String rawValue = ((XValueNodeImpl)node).getRawValue();
if (rawValue == null) {
return;
}
if (myValueProvider.isNumeric()) {
//remove str quotes in case of numeric
rawValue = rawValue.substring(1, rawValue.length() - 1);
@@ -45,7 +45,7 @@ import java.util.List;
/**
* @author amarch
*/
class NumpyArrayValueProvider extends ArrayValueProvider {
public class NumpyArrayValueProvider extends ArrayValueProvider {
private PyViewArrayAction.MyDialog myDialog;
private ArrayTableForm myComponent;
private JBTable myTable;
@@ -69,12 +69,14 @@ class NumpyArrayValueProvider extends ArrayValueProvider {
private final static String DISABLE_COLOR_FOR_HUGE_ARRAY =
"Disable color because array too big and calculating min and max would slow down debugging.";
public NumpyArrayValueProvider(@NotNull XValueNode node, @NotNull PyViewArrayAction.MyDialog dialog, @NotNull Project project) {
public NumpyArrayValueProvider(@NotNull XValueNode node, PyViewArrayAction.MyDialog dialog, @NotNull Project project) {
super(node);
myDialog = dialog;
myComponent = dialog.getComponent();
if (dialog != null) {
myComponent = dialog.getComponent();
myTable = myComponent.getTable();
}
myProject = project;
myTable = myComponent.getTable();
myEvaluator = new PyDebuggerEvaluator(project, getValueContainer().getFrameAccessor());
}
@@ -120,12 +122,13 @@ class NumpyArrayValueProvider extends ArrayValueProvider {
getPendingSet().remove(chunk);
notifyNextThread();
fireTableCellUpdated(chunk.rOffset, chunk.cOffset);
SwingUtilities.invokeLater(new Runnable() {
DebuggerUIUtil.invokeLater(new Runnable() {
public void run() {
addDataInCache(arraySlice.rOffset, arraySlice.cOffset, arraySlice.getData());
myTable.setDefaultEditor(myTable.getColumnClass(0), getArrayTableCellEditor());
myTable.setDefaultRenderer(myTable.getColumnClass(0), myTableCellRenderer);
myDialog.setTitle(getTitlePresentation(getSliceText()));
}
});
}
@@ -272,6 +275,7 @@ class NumpyArrayValueProvider extends ArrayValueProvider {
public void run() {
myComponent.getSliceTextField().setText(getDefaultPresentation());
myComponent.getFormatTextField().setText(getDefaultFormat());
myDialog.setTitle(getTitlePresentation(getDefaultPresentation()));
}
});
startFillTable(new NumpyArraySlice(getDefaultPresentation(), Math.min(getMaxRow(myShape), ROWS_IN_DEFAULT_VIEW),
@@ -279,6 +283,10 @@ class NumpyArrayValueProvider extends ArrayValueProvider {
false, false);
}
private static String getTitlePresentation(String slice) {
return "Array View: " + slice;
}
private void fillColorRange(@NotNull final Runnable returnToMain) {
XDebuggerEvaluator.XEvaluationCallback callback = new XDebuggerEvaluator.XEvaluationCallback() {
@Override
@@ -630,7 +638,7 @@ class NumpyArrayValueProvider extends ArrayValueProvider {
}
public void showInfoHint(final String message) {
SwingUtilities.invokeLater(new Runnable() {
DebuggerUIUtil.invokeLater(new Runnable() {
@Override
public void run() {
if (myComponent.getSliceTextField().getEditor() != null) {
@@ -701,7 +709,7 @@ class NumpyArrayValueProvider extends ArrayValueProvider {
startRefillTable(false);
}
private String getEvalShapeCommand(@NotNull String slice) {
private static String getEvalShapeCommand(@NotNull String slice) {
//add information about memory, see #parseShape comments
return "str(" + slice + ".shape)+'#'+str(" + slice + ".flags['C_CONTIGUOUS'])";
}
@@ -764,7 +772,7 @@ class NumpyArrayValueProvider extends ArrayValueProvider {
}
public void setBusy(final boolean busy) {
SwingUtilities.invokeLater(new Runnable() {
DebuggerUIUtil.invokeLater(new Runnable() {
@Override
public void run() {
myComponent.setBusy(busy);
@@ -27,8 +27,8 @@ import java.util.SortedSet;
import java.util.TreeSet;
public abstract class PagingTableModel extends AbstractTableModel {
private static final int CHUNK_COL_SIZE = 10;
private static final int CHUNK_ROW_SIZE = 10;
private static final int CHUNK_COL_SIZE = 50;
private static final int CHUNK_ROW_SIZE = 50;
private static final int DEFAULT_MAX_CACHED_SIZE = 100;
public static final String EMPTY_CELL_VALUE = "...";
@@ -79,11 +79,10 @@ public abstract class PagingTableModel extends AbstractTableModel {
return EMPTY_CELL_VALUE;
}
Object rowObject = myCachedData.get(key)[row % CHUNK_ROW_SIZE][col % CHUNK_COL_SIZE];
return rowObject;
return myCachedData.get(key)[row % CHUNK_ROW_SIZE][col % CHUNK_COL_SIZE];
}
private String formMapKey(int row, int col) {
private static String formMapKey(int row, int col) {
return "[" + getPageRowStart(row) + "," + getPageColStart(col) + "]";
}
@@ -16,14 +16,18 @@
package com.jetbrains.python.debugger.array;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree;
import com.intellij.xdebugger.impl.ui.tree.actions.XDebuggerTreeActionBase;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import com.jetbrains.python.debugger.PyDebugValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.tree.TreePath;
/**
* @author amarch
@@ -34,11 +38,37 @@ public class PyViewArrayAction extends XDebuggerTreeActionBase {
@Override
protected void perform(XValueNodeImpl node, @NotNull String nodeName, AnActionEvent e) {
final MyDialog dialog = new MyDialog(e.getProject());
dialog.setTitle("View Array");
dialog.setValue(node);
dialog.show();
}
@Nullable
private static TreePath[] getSelectedNodes(DataContext dataContext) {
XDebuggerTree tree = XDebuggerTree.getTree(dataContext);
return tree == null ? null : tree.getSelectionPaths();
}
@Override
public void update(AnActionEvent e) {
TreePath[] paths = getSelectedNodes(e.getDataContext());
if (paths != null) {
if(paths.length > 1) {
e.getPresentation().setVisible(false);
return;
}
XValueNodeImpl node = getSelectedNode(e.getDataContext());
if (node != null && node.getValueContainer() instanceof PyDebugValue && node.isComputed()) {
String nodeType = ((PyDebugValue) node.getValueContainer()).getType();
if ("ndarray".equals(nodeType)) {
e.getPresentation().setVisible(true);
return;
}
}
}
e.getPresentation().setVisible(false);
}
protected class MyDialog extends DialogWrapper {
private Project myProject;
private ArrayTableForm myComponent;