private int[] myShape;
private ArrayTableCellRenderer myTableCellRenderer;
private PagingTableModel myPagingModel;
- private boolean lastFinished = false;
+ private boolean lastSuccessful = false;
private final static int COLUMNS_IN_DEFAULT_SLICE = 40;
private final static int ROWS_IN_DEFAULT_SLICE = 40;
if (!myBaseSlice.equals(getModelFullChunk().getBaseSlice()) || !myFormat.equals(getModelFullChunk().getFormat())) {
return;
}
-
- myLastPresentation = arraySlice;
- lastFinished = true;
- getPendingSet().remove(chunk);
- notifyNextThread();
- fireTableCellUpdated(chunk.getRowOffset(), chunk.getColOffset());
- DebuggerUIUtil.invokeLater(new Runnable() {
- public void run() {
- addDataInCache(arraySlice.getRowOffset(), arraySlice.getColOffset(), arraySlice.getData());
-
- myTable.setDefaultEditor(myTable.getColumnClass(0), getArrayTableCellEditor());
- myTable.setDefaultRenderer(myTable.getColumnClass(0), myTableCellRenderer);
- myDialog.setTitle(getTitlePresentation(getSliceText()));
- }
- });
+ notifyChunkLoaded(arraySlice);
}
});
}
myComponent.getSliceTextField().setText(getDefaultPresentation());
myComponent.getFormatTextField().setText(getDefaultFormat());
myDialog.setTitle(getTitlePresentation(getDefaultPresentation()));
+ if (myTable.getColumnCount() > 0) {
+ myTable.setDefaultEditor(myTable.getColumnClass(0), getArrayTableCellEditor());
+ }
}
});
startFillTable(new NumpyArraySlice(getDefaultPresentation(), Math.min(getMaxRow(myShape), ROWS_IN_DEFAULT_VIEW),
private void startFillTable(final NumpyArraySlice arraySlice, boolean rendered, final boolean inPlace) {
if (myLastPresentation != null &&
arraySlice.getBaseSlice().equals(myLastPresentation.getBaseSlice()) &&
- arraySlice.getFormat().equals(myLastPresentation.getFormat()) && lastFinished) {
+ arraySlice.getFormat().equals(myLastPresentation.getFormat()) && lastSuccessful) {
return;
}
- lastFinished = false;
+ lastSuccessful = false;
myPagingModel = getPagingModel(myShape, rendered, arraySlice);
DebuggerUIUtil.invokeLater(new Runnable() {
return 0;
}
- public void notifyNextThread() {
- myPagingModel.runNextThread();
+ public void notifyChunkLoaded(final NumpyArraySlice arraySlice) {
+ myLastPresentation = arraySlice;
+ lastSuccessful = true;
+ myPagingModel.addDataInCache(arraySlice.getRowOffset(), arraySlice.getColOffset(), arraySlice.getData());
+ myPagingModel.runNextLoadingTask();
+ DebuggerUIUtil.invokeLater(new Runnable() {
+ public void run() {
+ myTable.setDefaultRenderer(myTable.getColumnClass(0), myTableCellRenderer);
+ myDialog.setTitle(getTitlePresentation(getSliceText()));
+ for (int r = 0; r < arraySlice.getRows(); r++) {
+ for (int c = 0; c < arraySlice.getColumns(); c++) {
+ myPagingModel.fireTableCellUpdated(r + arraySlice.getRowOffset(), c + arraySlice.getColOffset());
+ }
+ }
+ }
+ });
}
public void setBusy(final boolean busy) {
*/
package com.jetbrains.python.debugger.array;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.components.JBViewport;
import com.intellij.util.containers.HashMap;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
-import java.util.LinkedList;
import java.util.SortedSet;
import java.util.TreeSet;
private SortedSet<ArrayChunk> myPendingSet = new TreeSet<ArrayChunk>();
private Queue<String> cachedChunkKeys = new Queue<String>(DEFAULT_MAX_CACHED_SIZE + 1);
- private LinkedList<Thread> myThreadList = new LinkedList<Thread>();
- private Thread evaluatedThread;
+ private ArrayChunk evaluatedChunk;
private boolean myRendered;
private int myRows = 0;
protected abstract Runnable getDataEvaluator(final ArrayChunk chunk);
- public void runNextThread() {
- if (evaluatedThread != null) {
- myThreadList.remove(evaluatedThread);
- evaluatedThread = null;
+ public void runNextLoadingTask() {
+ if (evaluatedChunk != null) {
+ myPendingSet.remove(evaluatedChunk);
+ evaluatedChunk = null;
}
- if (myThreadList.size() > 0) {
- evaluatedThread = myThreadList.get(0);
- evaluatedThread.start();
+ if (myPendingSet.size() > 0) {
+ evaluatedChunk = myPendingSet.first();
+ ApplicationManager.getApplication().executeOnPooledThread(getDataEvaluator(evaluatedChunk));
myProvider.setBusy(true);
}
else {
final ArrayChunk segment = createChunk(rLength, cLength, rOffset, cOffset);
myPendingSet.add(segment);
- Runnable evaluator = getDataEvaluator(segment);
- final Thread evalThread = new Thread(evaluator);
- myThreadList.add(evalThread);
- if (evaluatedThread == null) {
- runNextThread();
+ if (evaluatedChunk == null) {
+ runNextLoadingTask();
}
}
String old = cachedChunkKeys.pullFirst();
myCachedData.remove(old);
}
-
- for (int r = 0; r < newData.length; r++) {
- for (int c = 0; c < newData[0].length; c++) {
- fireTableCellUpdated(r + rOffset, c + cOffset);
- }
- }
}
public int getColumnCount() {
return myRows;
}
- public SortedSet<ArrayChunk> getPendingSet() {
- return myPendingSet;
- }
-
public void clearCached() {
myCachedData = new HashMap<String, Object[][]>();
myPendingSet = new TreeSet<ArrayChunk>();
cachedChunkKeys = new Queue<String>(DEFAULT_MAX_CACHED_SIZE + 1);
- if (evaluatedThread != null) {
- evaluatedThread.interrupt();
- }
- evaluatedThread = null;
- myThreadList = new LinkedList<Thread>();
+ evaluatedChunk = null;
}
public static class LazyViewport extends JBViewport {