diff --git a/python/src/com/jetbrains/python/debugger/array/JBTableWithRowHeaders.java b/python/src/com/jetbrains/python/debugger/array/JBTableWithRowHeaders.java index ce61c7d8168a..ffad2bf7a24c 100644 --- a/python/src/com/jetbrains/python/debugger/array/JBTableWithRowHeaders.java +++ b/python/src/com/jetbrains/python/debugger/array/JBTableWithRowHeaders.java @@ -35,11 +35,13 @@ import java.util.Set; */ public class JBTableWithRowHeaders extends JBTable { private final JBScrollPane myScrollPane; + private boolean myAutoResize; private RowHeaderTable myRowHeaderTable; private Set myNotAdjustableColumns = ContainerUtil.newHashSet(); - public JBTableWithRowHeaders() { - setAutoResizeMode(AUTO_RESIZE_OFF); + public JBTableWithRowHeaders(boolean autoResize) { + myAutoResize = autoResize; + setAutoResizeMode(myAutoResize ? AUTO_RESIZE_OFF : AUTO_RESIZE_SUBSEQUENT_COLUMNS); setRowSelectionAllowed(false); setMaxItemsForSizeCalculation(50); setTableHeader(new CustomTableHeader(this)); @@ -60,12 +62,17 @@ public class JBTableWithRowHeaders extends JBTable { Component component = super.prepareRenderer(renderer, row, column); JTableHeader header = getTableHeader(); TableColumn resizingColumn = header.getResizingColumn(); - if (resizingColumn == null && !myNotAdjustableColumns.contains(column)) { + if (myAutoResize && resizingColumn == null && !myNotAdjustableColumns.contains(column)) { updateColumnWidth(column, component.getPreferredSize().width, this); } return component; } + public void setAutoResize(boolean autoResize) { + myAutoResize = autoResize; + setAutoResizeMode(myAutoResize ? AUTO_RESIZE_OFF : AUTO_RESIZE_SUBSEQUENT_COLUMNS); + } + private static int updateColumnWidth(int column, int width, @NotNull JTable table) { TableColumn tableColumn = table.getColumnModel().getColumn(column); int headerWidth = new ColumnHeaderRenderer().getTableCellRendererComponent(table, tableColumn.getHeaderValue(), false, false, -1, column).getPreferredSize().width + 4; @@ -92,7 +99,7 @@ public class JBTableWithRowHeaders extends JBTable { } } - public static class RowHeaderTable extends JBTable implements PropertyChangeListener, TableModelListener { + public class RowHeaderTable extends JBTable implements PropertyChangeListener, TableModelListener { private JTable myMainTable; public RowHeaderTable(JTable table) { @@ -112,7 +119,12 @@ public class JBTableWithRowHeaders extends JBTable { @Override public Component prepareRenderer(@NotNull TableCellRenderer renderer, int row, int column) { Component component = super.prepareRenderer(renderer, row, column); - getPreferredSize().width = updateColumnWidth(column, component.getPreferredSize().width, this); + if (myAutoResize) { + getPreferredSize().width = updateColumnWidth(column, component.getPreferredSize().width, this); + } + else { + getColumnModel().getColumn(0).setPreferredWidth(50); + } setPreferredScrollableViewportSize(getPreferredSize()); return component; } @@ -157,7 +169,7 @@ public class JBTableWithRowHeaders extends JBTable { } - private static class RowNumberRenderer extends DefaultTableCellRenderer { + private class RowNumberRenderer extends DefaultTableCellRenderer { public RowNumberRenderer() { setHorizontalAlignment(SwingConstants.CENTER); } diff --git a/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java b/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java index 1c9053d76bd8..755c8be4558c 100644 --- a/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java +++ b/python/src/com/jetbrains/python/debugger/containerview/PyDataView.java @@ -53,6 +53,7 @@ import java.util.stream.Collectors; public class PyDataView implements DumbAware { public static final String DATA_VIEWER_ID = "Data View"; public static final String COLORED_BY_DEFAULT = "python.debugger.dataview.coloredbydefault"; + public static final String AUTO_RESIZE = "python.debugger.dataview.autoresize"; public static final String EMPTY_TAB_NAME = "empty"; private static final Logger LOG = Logger.getInstance(PyDataView.class); @@ -286,6 +287,12 @@ public class PyDataView implements DumbAware { } } + public void changeAutoResize(boolean autoResize) { + for (TabInfo info : myTabs.getTabs()) { + getPanel(info).resize(autoResize); + } + } + private static PyDataViewerPanel getPanel(TabInfo tabInfo) { return ((PyDataViewerPanel)tabInfo.getComponent()); } diff --git a/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java b/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java index a8689a5e146a..e9bf6e6d6e6c 100644 --- a/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java +++ b/python/src/com/jetbrains/python/debugger/containerview/PyDataViewToolWindowFactory.java @@ -73,7 +73,16 @@ public class PyDataViewToolWindowFactory implements ToolWindowFactory { }); addPythonConsoleListener(project); - ((ToolWindowEx)toolWindow).setAdditionalGearActions(new DefaultActionGroup(new ColoredByDefaultAction())); + PyDataViewToggleAction autoResizeAction = new PyDataViewToggleAction("Auto-resize", PyDataView.AUTO_RESIZE) { + @Override + public void setSelected(AnActionEvent e, boolean state) { + super.setSelected(e, state); + PyDataView.getInstance(project).changeAutoResize(state); + } + }; + DefaultActionGroup group = new DefaultActionGroup(new PyDataViewToggleAction("Colored by Default", PyDataView.COLORED_BY_DEFAULT), + autoResizeAction); + ((ToolWindowEx)toolWindow).setAdditionalGearActions(group); } private static void addPythonConsoleListener(@NotNull Project project) { @@ -89,19 +98,22 @@ public class PyDataViewToolWindowFactory implements ToolWindowFactory { }); } - private static class ColoredByDefaultAction extends ToggleAction { - public ColoredByDefaultAction() { - super("Colored by Default"); + private static class PyDataViewToggleAction extends ToggleAction { + private final String myPropertyKey; + + public PyDataViewToggleAction(String text, String propertyKey) { + super(text); + myPropertyKey = propertyKey; } @Override public boolean isSelected(AnActionEvent e) { - return PropertiesComponent.getInstance(e.getProject()).getBoolean(PyDataView.COLORED_BY_DEFAULT, true); + return PropertiesComponent.getInstance(e.getProject()).getBoolean(myPropertyKey, true); } @Override public void setSelected(AnActionEvent e, boolean state) { - PropertiesComponent.getInstance(e.getProject()).setValue(PyDataView.COLORED_BY_DEFAULT, state, true); + PropertiesComponent.getInstance(e.getProject()).setValue(myPropertyKey, state, true); } } diff --git a/python/src/com/jetbrains/python/debugger/containerview/PyDataViewerPanel.java b/python/src/com/jetbrains/python/debugger/containerview/PyDataViewerPanel.java index ffaf34fbf766..a61f40f4141c 100644 --- a/python/src/com/jetbrains/python/debugger/containerview/PyDataViewerPanel.java +++ b/python/src/com/jetbrains/python/debugger/containerview/PyDataViewerPanel.java @@ -125,7 +125,7 @@ public class PyDataViewerPanel extends JPanel { mySliceTextField = createEditorField(); addCompletion(); - myTable = new JBTableWithRowHeaders(); + myTable = new JBTableWithRowHeaders(PropertiesComponent.getInstance(myProject).getBoolean(PyDataView.AUTO_RESIZE, true)); myScrollPane = myTable.getScrollPane(); } @@ -178,6 +178,11 @@ public class PyDataViewerPanel extends JPanel { } } + public void resize(boolean autoResize) { + myTable.setAutoResize(autoResize); + apply(getSliceTextField().getText()); + } + private void updateUI(@NotNull ArrayChunk chunk, @NotNull PyDebugValue debugValue, @NotNull DataViewStrategy strategy) { AsyncArrayTableModel model = strategy.createTableModel(chunk.getRows(), chunk.getColumns(), this, debugValue); model.addToCache(chunk);