From 868050e08be5f2fb36f97afcca0b17871ecbbf51 Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Thu, 5 Mar 2026 18:25:28 +0200 Subject: [PATCH 1/8] migrate to v4 --- jingtrang/pom.xml | 4 +- pom.xml | 4 +- rngom/pom.xml | 4 +- xml-impl/pom.xml | 4 +- .../xml/util/xml/ui/AbstractTableView.java | 525 +++++++++--------- .../xml/util/xml/ui/DomCollectionControl.java | 10 +- .../consulo/xml/util/xml/ui/DomTableView.java | 67 +-- .../xml/util/xml/ui/DomUIFactoryImpl.java | 5 - 8 files changed, 308 insertions(+), 315 deletions(-) diff --git a/jingtrang/pom.xml b/jingtrang/pom.xml index b49e74c9..c2a04da1 100644 --- a/jingtrang/pom.xml +++ b/jingtrang/pom.xml @@ -21,7 +21,7 @@ consulo arch.managment - 3-SNAPSHOT + 4-SNAPSHOT @@ -38,7 +38,7 @@ consulo.plugin com.intellij.xml.jingtrang - 3-SNAPSHOT + 4-SNAPSHOT jar diff --git a/pom.xml b/pom.xml index 220a3964..00c61006 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ consulo arch.managment - 3-SNAPSHOT + 4-SNAPSHOT @@ -38,7 +38,7 @@ consulo.plugin com.intellij.xml.parent - 3-SNAPSHOT + 4-SNAPSHOT pom diff --git a/rngom/pom.xml b/rngom/pom.xml index 60620816..0b6ca607 100644 --- a/rngom/pom.xml +++ b/rngom/pom.xml @@ -21,7 +21,7 @@ consulo arch.managment - 3-SNAPSHOT + 4-SNAPSHOT @@ -38,7 +38,7 @@ consulo.plugin com.intellij.xml.rngom - 3-SNAPSHOT + 4-SNAPSHOT jar diff --git a/xml-impl/pom.xml b/xml-impl/pom.xml index b6455a3d..d288b356 100644 --- a/xml-impl/pom.xml +++ b/xml-impl/pom.xml @@ -20,13 +20,13 @@ consulo arch.ide-api-provided - 3-SNAPSHOT + 4-SNAPSHOT consulo.plugin com.intellij.xml - 3-SNAPSHOT + 4-SNAPSHOT consulo-plugin diff --git a/xml-impl/src/main/java/consulo/xml/util/xml/ui/AbstractTableView.java b/xml-impl/src/main/java/consulo/xml/util/xml/ui/AbstractTableView.java index 6485c74b..f1b182f6 100644 --- a/xml-impl/src/main/java/consulo/xml/util/xml/ui/AbstractTableView.java +++ b/xml-impl/src/main/java/consulo/xml/util/xml/ui/AbstractTableView.java @@ -15,32 +15,27 @@ */ package consulo.xml.util.xml.ui; +import consulo.application.HelpManager; import consulo.dataContext.DataSink; -import consulo.dataContext.TypeSafeDataProvider; +import consulo.dataContext.UiDataProvider; import consulo.language.editor.PlatformDataKeys; +import consulo.platform.base.icon.PlatformIconGroup; +import consulo.project.Project; import consulo.proxy.EventDispatcher; import consulo.ui.ex.JBColor; -import consulo.ui.ex.action.ActionManager; -import consulo.ui.ex.action.ActionPlaces; -import consulo.ui.ex.action.ActionToolbar; -import consulo.ui.ex.action.AnAction; -import consulo.ui.ex.action.AnSeparator; -import consulo.ui.ex.action.ContextHelpAction; -import consulo.project.Project; +import consulo.ui.ex.action.*; +import consulo.ui.ex.awt.ColumnInfo; import consulo.ui.ex.awt.PopupHandler; import consulo.ui.ex.awt.ScrollPaneFactory; import consulo.ui.ex.awt.UIUtil; +import consulo.ui.ex.awt.table.ListTableModel; import consulo.ui.ex.awt.table.TableView; +import consulo.util.dataholder.Key; import consulo.util.lang.Comparing; -import consulo.ui.ex.awt.ColumnInfo; -import consulo.ui.ex.awt.table.ListTableModel; import consulo.util.lang.xml.XmlStringUtil; -import consulo.platform.base.icon.PlatformIconGroup; -import consulo.ui.ex.action.DefaultActionGroup; -import consulo.util.dataholder.Key; +import jakarta.annotation.Nonnull; import org.jetbrains.annotations.NonNls; -import jakarta.annotation.Nonnull; import javax.swing.*; import javax.swing.border.MatteBorder; import javax.swing.event.ListSelectionEvent; @@ -60,307 +55,311 @@ /** * @author peter */ -public abstract class AbstractTableView extends JPanel implements TypeSafeDataProvider { - private final MyTableView myTable = new MyTableView(); - private final String myHelpID; - private final String myEmptyPaneText; - private final JPanel myInnerPanel; - private final Project myProject; - private TableCellRenderer[][] myCachedRenderers; - private EmptyPane myEmptyPane; - @NonNls private static final String TREE = "Tree"; - @NonNls private static final String EMPTY_PANE = "EmptyPane"; - private final EventDispatcher myDispatcher = EventDispatcher.create(ChangeListener.class); - private final MyListTableModel myTableModel = new MyListTableModel(); - - public AbstractTableView(final Project project) { - this(project, null, null); - } - - public AbstractTableView(final Project project, final String emptyPaneText, final String helpID) { - super(new BorderLayout()); - myProject = project; - myTableModel.setSortable(false); - - myEmptyPaneText = emptyPaneText; - myHelpID = helpID; - - //ToolTipHandlerProvider.getToolTipHandlerProvider().install(myTable); - - final JTableHeader header = myTable.getTableHeader(); - header.addMouseMotionListener(new MouseMotionAdapter() { - public void mouseMoved(MouseEvent e) { - updateTooltip(e); - } - }); - header.addMouseListener(new MouseAdapter() { - public void mouseEntered(MouseEvent e) { - updateTooltip(e); - } - }); - header.setReorderingAllowed(false); - - myTable.setRowHeight(PlatformIconGroup.nodesClass().getHeight()); - myTable.setPreferredScrollableViewportSize(new Dimension(-1, 150)); - myTable.setSelectionMode(allowMultipleRowsSelection() ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION); - - myInnerPanel = new JPanel(new CardLayout()); - myInnerPanel.add(ScrollPaneFactory.createScrollPane(myTable), TREE); - if (getEmptyPaneText() != null) { - //noinspection HardCodedStringLiteral - myEmptyPane = new EmptyPane(XmlStringUtil.wrapInHtml(getEmptyPaneText())); - final JComponent emptyPanel = myEmptyPane.getComponent(); - myInnerPanel.add(emptyPanel, EMPTY_PANE); +public abstract class AbstractTableView extends JPanel implements UiDataProvider { + private final MyTableView myTable = new MyTableView(); + private final String myHelpID; + private final String myEmptyPaneText; + private final JPanel myInnerPanel; + private final Project myProject; + private TableCellRenderer[][] myCachedRenderers; + private EmptyPane myEmptyPane; + @NonNls + private static final String TREE = "Tree"; + @NonNls + private static final String EMPTY_PANE = "EmptyPane"; + private final EventDispatcher myDispatcher = EventDispatcher.create(ChangeListener.class); + private final MyListTableModel myTableModel = new MyListTableModel(); + + public AbstractTableView(final Project project) { + this(project, null, null); } - add(myInnerPanel, BorderLayout.CENTER); + public AbstractTableView(final Project project, final String emptyPaneText, final String helpID) { + super(new BorderLayout()); + myProject = project; + myTableModel.setSortable(false); - ToolTipManager.sharedInstance().registerComponent(myTable); - } - protected TableCellRenderer getTableCellRenderer(final int row, final int column, final TableCellRenderer superRenderer, final Object value) { - return getTableModel().getColumnInfos()[column].getCustomizedRenderer(value, new StripeTableCellRenderer(superRenderer)); - } + myEmptyPaneText = emptyPaneText; + myHelpID = helpID; - protected final void installPopup(final String place, final DefaultActionGroup group) { - PopupHandler.installPopupHandler(myTable, group, place, ActionManager.getInstance()); - } + //ToolTipHandlerProvider.getToolTipHandlerProvider().install(myTable); + + final JTableHeader header = myTable.getTableHeader(); + header.addMouseMotionListener(new MouseMotionAdapter() { + public void mouseMoved(MouseEvent e) { + updateTooltip(e); + } + }); + header.addMouseListener(new MouseAdapter() { + public void mouseEntered(MouseEvent e) { + updateTooltip(e); + } + }); + header.setReorderingAllowed(false); + + myTable.setRowHeight(PlatformIconGroup.nodesClass().getHeight()); + myTable.setPreferredScrollableViewportSize(new Dimension(-1, 150)); + myTable.setSelectionMode(allowMultipleRowsSelection() ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION); + + myInnerPanel = new JPanel(new CardLayout()); + myInnerPanel.add(ScrollPaneFactory.createScrollPane(myTable), TREE); + if (getEmptyPaneText() != null) { + //noinspection HardCodedStringLiteral + myEmptyPane = new EmptyPane(XmlStringUtil.wrapInHtml(getEmptyPaneText())); + final JComponent emptyPanel = myEmptyPane.getComponent(); + myInnerPanel.add(emptyPanel, EMPTY_PANE); + } - public final void setToolbarActions(final AnAction... actions) { - final DefaultActionGroup actionGroup = new DefaultActionGroup(); - for (final AnAction action : actions) { - actionGroup.add(action); + add(myInnerPanel, BorderLayout.CENTER); + + ToolTipManager.sharedInstance().registerComponent(myTable); } - if (getHelpId() != null) { - actionGroup.add(AnSeparator.getInstance()); - actionGroup.add(new ContextHelpAction(getHelpId())); + + protected TableCellRenderer getTableCellRenderer(final int row, final int column, final TableCellRenderer superRenderer, final Object value) { + return getTableModel().getColumnInfos()[column].getCustomizedRenderer(value, new StripeTableCellRenderer(superRenderer)); } - final ActionManager actionManager = ActionManager.getInstance(); - final ToolbarPosition position = getToolbarPosition(); - final ActionToolbar myActionToolbar = actionManager.createActionToolbar(ActionPlaces.PROJECT_VIEW_TOOLBAR, actionGroup, position == ToolbarPosition.TOP || position == ToolbarPosition.BOTTOM); - myActionToolbar.setTargetComponent(myInnerPanel); - final JComponent toolbarComponent = myActionToolbar.getComponent(); - final MatteBorder matteBorder = BorderFactory.createMatteBorder(0, 0, position == ToolbarPosition.TOP ? 1 : 0, 0, JBColor.DARK_GRAY); - toolbarComponent.setBorder(BorderFactory.createCompoundBorder(matteBorder, toolbarComponent.getBorder())); - - getTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - myActionToolbar.updateActionsImmediately(); - } - }); - - add(toolbarComponent, position.getPosition()); - } - - protected final void setErrorMessages(String[] messages) { - final boolean empty = messages.length == 0; - final String tooltipText = TooltipUtils.getTooltipText(messages); - if (myEmptyPane != null) { - myEmptyPane.getComponent().setBackground(empty ? UIUtil.getTreeTextBackground() : BaseControl.ERROR_BACKGROUND); - myEmptyPane.getComponent().setToolTipText(tooltipText); + protected final void installPopup(final String place, final DefaultActionGroup group) { + PopupHandler.installPopupHandler(myTable, group, place, ActionManager.getInstance()); } - final JViewport viewport = (JViewport)myTable.getParent(); - final Color tableBackground = empty ? UIUtil.getTableBackground() : BaseControl.ERROR_BACKGROUND; - viewport.setBackground(tableBackground); - viewport.setToolTipText(tooltipText); - myTable.setBackground(tableBackground); - myTable.setToolTipText(tooltipText); - if (tooltipText == null) ToolTipManager.sharedInstance().registerComponent(myTable); - } - - protected final void initializeTable() { - myTable.setModelAndUpdateColumns(myTableModel); - if (getEmptyPaneText() != null) { - final CardLayout cardLayout = ((CardLayout)myInnerPanel.getLayout()); - myTable.getModel().addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent e) { - cardLayout.show(myInnerPanel, myTable.getRowCount() == 0 ? EMPTY_PANE : TREE); + + public final void setToolbarActions(final AnAction... actions) { + final DefaultActionGroup actionGroup = new DefaultActionGroup(); + for (final AnAction action : actions) { + actionGroup.add(action); } - }); - } - tuneTable(myTable); - } - - protected void adjustColumnWidths() { - final ColumnInfo[] columnInfos = myTableModel.getColumnInfos(); - for (int i = 0; i < columnInfos.length; i++) { - final int width = getColumnPreferredWidth(i); - if (width > 0) { - myTable.getColumnModel().getColumn(i).setPreferredWidth(width); - } + if (getHelpId() != null) { + actionGroup.add(AnSeparator.getInstance()); + actionGroup.add(new ContextHelpAction(getHelpId())); + } + + final ActionManager actionManager = ActionManager.getInstance(); + final ToolbarPosition position = getToolbarPosition(); + final ActionToolbar myActionToolbar = actionManager.createActionToolbar(ActionPlaces.PROJECT_VIEW_TOOLBAR, actionGroup, position == ToolbarPosition.TOP || position == ToolbarPosition.BOTTOM); + myActionToolbar.setTargetComponent(myInnerPanel); + final JComponent toolbarComponent = myActionToolbar.getComponent(); + final MatteBorder matteBorder = BorderFactory.createMatteBorder(0, 0, position == ToolbarPosition.TOP ? 1 : 0, 0, JBColor.DARK_GRAY); + toolbarComponent.setBorder(BorderFactory.createCompoundBorder(matteBorder, toolbarComponent.getBorder())); + + getTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + myActionToolbar.updateActionsImmediately(); + } + }); + + add(toolbarComponent, position.getPosition()); } - } - - protected int getColumnPreferredWidth(final int i) { - final ColumnInfo columnInfo = myTableModel.getColumnInfos()[i]; - final java.util.List items = myTableModel.getItems(); - int width = -1; - for (int j = 0; j < items.size(); j++) { - final TableCellRenderer renderer = myTable.getCellRenderer(j, i); - final Component component = renderer.getTableCellRendererComponent(myTable, columnInfo.valueOf(items.get(j)), false, false, j, i); - width = Math.max(width, component.getPreferredSize().width); + + protected final void setErrorMessages(String[] messages) { + final boolean empty = messages.length == 0; + final String tooltipText = TooltipUtils.getTooltipText(messages); + if (myEmptyPane != null) { + myEmptyPane.getComponent().setBackground(empty ? UIUtil.getTreeTextBackground() : BaseControl.ERROR_BACKGROUND); + myEmptyPane.getComponent().setToolTipText(tooltipText); + } + final JViewport viewport = (JViewport) myTable.getParent(); + final Color tableBackground = empty ? UIUtil.getTableBackground() : BaseControl.ERROR_BACKGROUND; + viewport.setBackground(tableBackground); + viewport.setToolTipText(tooltipText); + myTable.setBackground(tableBackground); + myTable.setToolTipText(tooltipText); + if (tooltipText == null) { + ToolTipManager.sharedInstance().registerComponent(myTable); + } } - return width; - } - protected String getEmptyPaneText() { - return myEmptyPaneText; - } + protected final void initializeTable() { + myTable.setModelAndUpdateColumns(myTableModel); + if (getEmptyPaneText() != null) { + final CardLayout cardLayout = ((CardLayout) myInnerPanel.getLayout()); + myTable.getModel().addTableModelListener(new TableModelListener() { + public void tableChanged(TableModelEvent e) { + cardLayout.show(myInnerPanel, myTable.getRowCount() == 0 ? EMPTY_PANE : TREE); + } + }); + } + tuneTable(myTable); + } - protected final void updateTooltip(final MouseEvent e) { - final int i = myTable.columnAtPoint(e.getPoint()); - if (i >= 0) { - myTable.getTableHeader().setToolTipText(myTableModel.getColumnInfos()[i].getTooltipText()); + protected void adjustColumnWidths() { + final ColumnInfo[] columnInfos = myTableModel.getColumnInfos(); + for (int i = 0; i < columnInfos.length; i++) { + final int width = getColumnPreferredWidth(i); + if (width > 0) { + myTable.getColumnModel().getColumn(i).setPreferredWidth(width); + } + } } - } - protected void tuneTable(JTable table) { - } + protected int getColumnPreferredWidth(final int i) { + final ColumnInfo columnInfo = myTableModel.getColumnInfos()[i]; + final java.util.List items = myTableModel.getItems(); + int width = -1; + for (int j = 0; j < items.size(); j++) { + final TableCellRenderer renderer = myTable.getCellRenderer(j, i); + final Component component = renderer.getTableCellRendererComponent(myTable, columnInfo.valueOf(items.get(j)), false, false, j, i); + width = Math.max(width, component.getPreferredSize().width); + } + return width; + } - protected boolean allowMultipleRowsSelection() { - return true; - } + protected String getEmptyPaneText() { + return myEmptyPaneText; + } - public final JTable getTable() { - return myTable; - } + protected final void updateTooltip(final MouseEvent e) { + final int i = myTable.columnAtPoint(e.getPoint()); + if (i >= 0) { + myTable.getTableHeader().setToolTipText(myTableModel.getColumnInfos()[i].getTooltipText()); + } + } - public final ListTableModel getTableModel() { - return myTableModel; - } + protected void tuneTable(JTable table) { + } - public void calcData(Key key, DataSink sink) { - if (PlatformDataKeys.HELP_ID == key) { - sink.put(PlatformDataKeys.HELP_ID, getHelpId()); + protected boolean allowMultipleRowsSelection() { + return true; } - } - - private String getHelpId() { - return myHelpID; - } - - public final void addChangeListener(ChangeListener listener) { - myDispatcher.addListener(listener); - } - - public final void reset(ColumnInfo[] columnInfos, List data) { - final boolean columnsChanged = myTableModel.setColumnInfos(columnInfos); - final boolean dataChanged = !data.equals(myTableModel.getItems()); - final int oldRowCount = myTableModel.getRowCount(); - if ((dataChanged || columnsChanged) && myTable.isEditing()) { - myTable.getCellEditor().cancelCellEditing(); + + public final JTable getTable() { + return myTable; } - if (dataChanged) { - final int selectedRow = myTable.getSelectedRow(); - myTableModel.setItems(new ArrayList(data)); - if (selectedRow >= 0 && selectedRow < myTableModel.getRowCount()) { - myTable.getSelectionModel().setSelectionInterval(selectedRow, selectedRow); - } + public final ListTableModel getTableModel() { + return myTableModel; } - myTableModel.cacheValues(); - final int rowCount = myTableModel.getRowCount(); - final int columnCount = myTableModel.getColumnCount(); - myCachedRenderers = new TableCellRenderer[rowCount][columnCount]; - for (int row = 0; row < rowCount; row++) { - for (int column = 0; column < columnCount; column++) { - final TableCellRenderer superRenderer = myTable.getSuperCellRenderer(row, column); - myCachedRenderers[row][column] = getTableCellRenderer(row, column, superRenderer, myTableModel.getItems().get(row)); - } + @Override + public void uiDataSnapshot(@Nonnull DataSink dataSink) { + dataSink.set(HelpManager.HELP_ID, getHelpId()); } - if (columnsChanged || oldRowCount == 0 && rowCount != 0) { - adjustColumnWidths(); + + private String getHelpId() { + return myHelpID; } - myTable.revalidate(); - myTable.repaint(); - } + public final void addChangeListener(ChangeListener listener) { + myDispatcher.addListener(listener); + } - protected abstract void wrapValueSetting(@Nonnull T t, Runnable valueSetter); + public final void reset(ColumnInfo[] columnInfos, List data) { + final boolean columnsChanged = myTableModel.setColumnInfos(columnInfos); + final boolean dataChanged = !data.equals(myTableModel.getItems()); + final int oldRowCount = myTableModel.getRowCount(); + if ((dataChanged || columnsChanged) && myTable.isEditing()) { + myTable.getCellEditor().cancelCellEditing(); + } - protected final void fireChanged() { - myDispatcher.getMulticaster().changed(); - } + if (dataChanged) { + final int selectedRow = myTable.getSelectedRow(); + myTableModel.setItems(new ArrayList(data)); + if (selectedRow >= 0 && selectedRow < myTableModel.getRowCount()) { + myTable.getSelectionModel().setSelectionInterval(selectedRow, selectedRow); + } + } - protected void dispose() { - } + myTableModel.cacheValues(); + final int rowCount = myTableModel.getRowCount(); + final int columnCount = myTableModel.getColumnCount(); + myCachedRenderers = new TableCellRenderer[rowCount][columnCount]; + for (int row = 0; row < rowCount; row++) { + for (int column = 0; column < columnCount; column++) { + final TableCellRenderer superRenderer = myTable.getSuperCellRenderer(row, column); + myCachedRenderers[row][column] = getTableCellRenderer(row, column, superRenderer, myTableModel.getItems().get(row)); + } + } + if (columnsChanged || oldRowCount == 0 && rowCount != 0) { + adjustColumnWidths(); + } - public final Project getProject() { - return myProject; - } + myTable.revalidate(); + myTable.repaint(); + } - protected ToolbarPosition getToolbarPosition() { - return ToolbarPosition.TOP; - } + protected abstract void wrapValueSetting(@Nonnull T t, Runnable valueSetter); - private class MyListTableModel extends ListTableModel { + protected final void fireChanged() { + myDispatcher.getMulticaster().changed(); + } - private Object[][] myTableData; + protected void dispose() { + } - public MyListTableModel() { - super(ColumnInfo.EMPTY_ARRAY); - setSortable(false); + public final Project getProject() { + return myProject; } - public Object getValueAt(final int rowIndex, final int columnIndex) { - return myTableData[rowIndex][columnIndex]; + protected ToolbarPosition getToolbarPosition() { + return ToolbarPosition.TOP; } - void cacheValues() { - final int rowCount = getRowCount(); - final int columnCount = getColumnCount(); - final Object[][] objects = new Object[rowCount][columnCount]; - for (int i = 0; i < rowCount; i++) { - for (int j = 0; j < columnCount; j++) { - objects[i][j] = super.getValueAt(i, j); + private class MyListTableModel extends ListTableModel { + + private Object[][] myTableData; + + public MyListTableModel() { + super(ColumnInfo.EMPTY_ARRAY); + setSortable(false); + } + + public Object getValueAt(final int rowIndex, final int columnIndex) { + return myTableData[rowIndex][columnIndex]; + } + + void cacheValues() { + final int rowCount = getRowCount(); + final int columnCount = getColumnCount(); + final Object[][] objects = new Object[rowCount][columnCount]; + for (int i = 0; i < rowCount; i++) { + for (int j = 0; j < columnCount; j++) { + objects[i][j] = super.getValueAt(i, j); + } + } + myTableData = objects; + } + + public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) { + final Object oldValue = getValueAt(rowIndex, columnIndex); + if (!Comparing.equal(oldValue, aValue)) { + wrapValueSetting(getItems().get(rowIndex), new Runnable() { + public void run() { + MyListTableModel.super.setValueAt("".equals(aValue) ? null : aValue, rowIndex, columnIndex); + } + }); + } } - } - myTableData = objects; - } - public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) { - final Object oldValue = getValueAt(rowIndex, columnIndex); - if (!Comparing.equal(oldValue, aValue)) { - wrapValueSetting(getItems().get(rowIndex), new Runnable() { - public void run() { - MyListTableModel.super.setValueAt("".equals(aValue) ? null : aValue, rowIndex, columnIndex); - } - }); - } } - } + protected static enum ToolbarPosition { + TOP(BorderLayout.NORTH), + LEFT(BorderLayout.WEST), + RIGHT(BorderLayout.EAST), + BOTTOM(BorderLayout.SOUTH); - protected static enum ToolbarPosition { - TOP(BorderLayout.NORTH), - LEFT(BorderLayout.WEST), - RIGHT(BorderLayout.EAST), - BOTTOM(BorderLayout.SOUTH); + private final String myPosition; - private final String myPosition; + private ToolbarPosition(final String position) { + myPosition = position; + } - private ToolbarPosition(final String position) { - myPosition = position; + public String getPosition() { + return myPosition; + } } - public String getPosition() { - return myPosition; + public interface ChangeListener extends EventListener { + void changed(); } - } - - public interface ChangeListener extends EventListener { - void changed(); - } - protected class MyTableView extends TableView { + protected class MyTableView extends TableView { - public final TableCellRenderer getSuperCellRenderer(int row, int column) { - return super.getCellRenderer(row, column); - } + public final TableCellRenderer getSuperCellRenderer(int row, int column) { + return super.getCellRenderer(row, column); + } - public final TableCellRenderer getCellRenderer(int row, int column) { - return myCachedRenderers[row][column]; + public final TableCellRenderer getCellRenderer(int row, int column) { + return myCachedRenderers[row][column]; + } } - } } diff --git a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java index 2daddef7..a94c93e0 100644 --- a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java +++ b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java @@ -18,7 +18,7 @@ import consulo.application.Application; import consulo.application.Result; import consulo.dataContext.DataSink; -import consulo.dataContext.TypeSafeDataProvider; +import consulo.dataContext.UiDataProvider; import consulo.language.editor.WriteCommandAction; import consulo.language.psi.PsiFile; import consulo.language.psi.PsiUtilCore; @@ -53,7 +53,7 @@ /** * @author peter */ -public class DomCollectionControl extends DomUIControl implements Highlightable, TypeSafeDataProvider { +public class DomCollectionControl extends DomUIControl implements Highlightable, UiDataProvider { private static final Key DOM_COLLECTION_CONTROL = Key.create("DomCollectionControl"); private final EventDispatcher myDispatcher = EventDispatcher.create(CommitListener.class); @@ -146,10 +146,8 @@ public void navigate(DomElement element) { } @Override - public void calcData(Key key, DataSink sink) { - if (DOM_COLLECTION_CONTROL.equals(key)) { - sink.put(DOM_COLLECTION_CONTROL, this); - } + public void uiDataSnapshot(@Nonnull DataSink dataSink) { + dataSink.set(DOM_COLLECTION_CONTROL, this); } @Nullable diff --git a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomTableView.java b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomTableView.java index aca09048..9fa6980e 100644 --- a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomTableView.java +++ b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomTableView.java @@ -15,60 +15,61 @@ */ package consulo.xml.util.xml.ui; -import consulo.dataContext.DataSink; -import consulo.dataContext.TypeSafeDataProvider; import consulo.application.Result; +import consulo.dataContext.DataSink; +import consulo.dataContext.UiDataProvider; import consulo.language.editor.WriteCommandAction; -import consulo.util.collection.SmartList; -import consulo.xml.util.xml.DomElement; -import consulo.xml.util.xml.DomUtil; import consulo.project.Project; import consulo.ui.ex.action.ActionPlaces; import consulo.ui.ex.action.DefaultActionGroup; +import consulo.util.collection.SmartList; import consulo.util.dataholder.Key; - +import consulo.xml.util.xml.DomElement; +import consulo.xml.util.xml.DomUtil; import jakarta.annotation.Nonnull; + import java.util.List; /** * @author peter */ public class DomTableView extends AbstractTableView { - private final List myCustomDataProviders = new SmartList(); + private final List myCustomDataProviders = new SmartList<>(); - public DomTableView(final Project project) { - super(project); - } + public DomTableView(final Project project) { + super(project); + } - public DomTableView(final Project project, final String emptyPaneText, final String helpID) { - super(project, emptyPaneText, helpID); - } + public DomTableView(final Project project, final String emptyPaneText, final String helpID) { + super(project, emptyPaneText, helpID); + } - public void addCustomDataProvider(TypeSafeDataProvider provider) { - myCustomDataProviders.add(provider); - } + public void addCustomDataProvider(UiDataProvider provider) { + myCustomDataProviders.add(provider); + } - public void calcData(final Key key, final DataSink sink) { - super.calcData(key, sink); - for (final TypeSafeDataProvider customDataProvider : myCustomDataProviders) { - customDataProvider.calcData(key, sink); + @Override + public void uiDataSnapshot(@Nonnull DataSink dataSink) { + super.uiDataSnapshot(dataSink); + for (final UiDataProvider customDataProvider : myCustomDataProviders) { + customDataProvider.uiDataSnapshot(dataSink); + } } - } - @Deprecated - protected final void installPopup(final DefaultActionGroup group) { - installPopup(ActionPlaces.J2EE_ATTRIBUTES_VIEW_POPUP, group); - } + @Deprecated + protected final void installPopup(final DefaultActionGroup group) { + installPopup(ActionPlaces.J2EE_ATTRIBUTES_VIEW_POPUP, group); + } - protected void wrapValueSetting(@Nonnull final DomElement domElement, final Runnable valueSetter) { - if (domElement.isValid()) { - new WriteCommandAction(getProject(), DomUtil.getFile(domElement)) { - protected void run(final Result result) throws Throwable { - valueSetter.run(); + protected void wrapValueSetting(@Nonnull final DomElement domElement, final Runnable valueSetter) { + if (domElement.isValid()) { + new WriteCommandAction(getProject(), DomUtil.getFile(domElement)) { + protected void run(final Result result) throws Throwable { + valueSetter.run(); + } + }.execute(); + fireChanged(); } - }.execute(); - fireChanged(); } - } } diff --git a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomUIFactoryImpl.java b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomUIFactoryImpl.java index 47751a5a..e8bad6c4 100644 --- a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomUIFactoryImpl.java +++ b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomUIFactoryImpl.java @@ -157,11 +157,6 @@ public HighlightingPass[] createPassesForEditor() { .instantiateMainPasses(psiFile, document) .toArray(HighlightingPass.EMPTY_ARRAY); } - - @Nonnull - public HighlightingPass[] createPassesForVisibleArea() { - return createPassesForEditor(); - } }; } From d2a446893e1a7acd16cd1d2ddb80533ae1a8579a Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Thu, 5 Mar 2026 19:02:28 +0200 Subject: [PATCH 2/8] fix compile --- .../xmlbeans/GenerateInstanceDocumentFromSchemaAction.java | 3 ++- .../xmlbeans/GenerateSchemaFromInstanceDocumentAction.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java b/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java index 05513796..fea61978 100644 --- a/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java +++ b/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java @@ -23,6 +23,7 @@ import consulo.language.psi.PsiFile; import consulo.language.psi.PsiManager; import consulo.project.Project; +import consulo.ui.UIAccess; import consulo.ui.annotation.RequiredUIAccess; import consulo.ui.ex.action.ActionPlaces; import consulo.ui.ex.action.AnAction; @@ -80,7 +81,7 @@ public void actionPerformed(AnActionEvent e) { @RequiredUIAccess private void doAction(Project project, GenerateInstanceDocumentFromSchemaDialog dialog) { - FileDocumentManager.getInstance().saveAllDocuments(); + FileDocumentManager.getInstance().saveAllDocuments(UIAccess.current()); List parameters = new LinkedList<>(); diff --git a/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateSchemaFromInstanceDocumentAction.java b/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateSchemaFromInstanceDocumentAction.java index f9c08a06..b6e0552a 100644 --- a/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateSchemaFromInstanceDocumentAction.java +++ b/xml-impl/src/main/java/com/intellij/xml/actions/xmlbeans/GenerateSchemaFromInstanceDocumentAction.java @@ -22,6 +22,7 @@ import consulo.fileEditor.FileEditorManager; import consulo.language.editor.PlatformDataKeys; import consulo.project.Project; +import consulo.ui.UIAccess; import consulo.ui.annotation.RequiredUIAccess; import consulo.ui.ex.action.ActionPlaces; import consulo.ui.ex.action.AnAction; @@ -86,7 +87,7 @@ public void actionPerformed(AnActionEvent e) { @RequiredUIAccess private static void doAction(Project project, GenerateSchemaFromInstanceDocumentDialog dialog) { - FileDocumentManager.getInstance().saveAllDocuments(); + FileDocumentManager.getInstance().saveAllDocuments(UIAccess.current()); String url = dialog.getUrl().getText(); VirtualFile relativeFile = From 651616c6de449478d053a3496555a329ceed0928 Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Sun, 8 Mar 2026 13:26:20 +0200 Subject: [PATCH 3/8] compile fix --- .../xml/javaee/MapExternalResourceDialog.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/xml-impl/src/main/java/consulo/xml/javaee/MapExternalResourceDialog.java b/xml-impl/src/main/java/consulo/xml/javaee/MapExternalResourceDialog.java index a8d6c32f..b7802a2e 100644 --- a/xml-impl/src/main/java/consulo/xml/javaee/MapExternalResourceDialog.java +++ b/xml-impl/src/main/java/consulo/xml/javaee/MapExternalResourceDialog.java @@ -235,15 +235,9 @@ public String getResourceLocation() { private void createUIComponents() { myExplorerPanel = new JPanel(new BorderLayout()); - DataManager.registerDataProvider(myExplorerPanel, dataId -> - { - if (CommonDataKeys.VIRTUAL_FILE_ARRAY == dataId) { - return myExplorer.getSelectedFiles(); - } - else if (FileSystemTree.DATA_KEY == dataId) { - return myExplorer; - } - return null; + DataManager.registerUiDataProvider(myExplorerPanel, dataSink -> { + dataSink.set(CommonDataKeys.VIRTUAL_FILE_ARRAY, myExplorer.getSelectedFiles()); + dataSink.set(FileSystemTree.DATA_KEY, myExplorer); }); } } From 34dad01b91cb65a7c336b198c786023ffd7981ba Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Fri, 27 Mar 2026 22:00:42 +0200 Subject: [PATCH 4/8] rewrite read action --- .../editorActions/XmlTagNameSynchronizer.java | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/xml-impl/src/main/java/consulo/xml/codeInsight/editorActions/XmlTagNameSynchronizer.java b/xml-impl/src/main/java/consulo/xml/codeInsight/editorActions/XmlTagNameSynchronizer.java index b64c6f5a..8124c2c3 100644 --- a/xml-impl/src/main/java/consulo/xml/codeInsight/editorActions/XmlTagNameSynchronizer.java +++ b/xml-impl/src/main/java/consulo/xml/codeInsight/editorActions/XmlTagNameSynchronizer.java @@ -6,6 +6,7 @@ import consulo.annotation.access.RequiredReadAction; import consulo.annotation.component.ExtensionImpl; import consulo.application.Application; +import consulo.application.concurrent.coroutine.ReadLock; import consulo.codeEditor.*; import consulo.codeEditor.event.EditorFactoryEvent; import consulo.codeEditor.event.EditorFactoryListener; @@ -36,6 +37,10 @@ import consulo.undoRedo.event.CommandEvent; import consulo.undoRedo.event.CommandListener; import consulo.util.collection.ContainerUtil; +import consulo.util.concurrent.coroutine.Continuation; +import consulo.util.concurrent.coroutine.Coroutine; +import consulo.util.concurrent.coroutine.CoroutineScope; +import consulo.util.concurrent.coroutine.step.CodeExecution; import consulo.util.dataholder.Key; import consulo.util.lang.Couple; import consulo.util.lang.StringUtil; @@ -46,9 +51,8 @@ import consulo.xml.lang.xhtml.XHTMLLanguage; import consulo.xml.lang.xml.XMLLanguage; import consulo.xml.psi.xml.XmlTokenType; -import jakarta.inject.Inject; - import jakarta.annotation.Nonnull; +import jakarta.inject.Inject; import java.util.Objects; import java.util.Set; @@ -63,6 +67,8 @@ public final class XmlTagNameSynchronizer implements CommandListener, EditorFact XHTMLLanguage.INSTANCE ); + private static final Key> CONTINUATION_KEY = Key.create("XmlTagNameSynchronizer#CONTINUATION_KEY"); + private static final Key SYNCHRONIZER_KEY = Key.create("tag_name_synchronizer"); @Inject @@ -81,9 +87,30 @@ public void editorCreated(@Nonnull EditorFactoryEvent event) { Document document = editor.getDocument(); VirtualFile file = FileDocumentManager.getInstance().getFile(document); - Language language = findXmlLikeLanguage(project, file); - if (language != null) { - new TagNameSynchronizer((RealEditor)editor, project, language).listenForDocumentChanges(); + + Continuation continuation = CoroutineScope.launchAsync(project.coroutineContext(), () -> { + return Coroutine.first(ReadLock.apply(o -> findXmlLikeLanguage(project, file))) + .then(CodeExecution.consume((language, c) -> { + if (language != null) { + new TagNameSynchronizer((RealEditor) editor, project, language).listenForDocumentChanges(); + + editor.putUserData(CONTINUATION_KEY, null); + } + })); + }); + + editor.putUserData(CONTINUATION_KEY, continuation); + } + + @Override + public void editorReleased(EditorFactoryEvent event) { + Editor editor = event.getEditor(); + + Continuation continuation = editor.getUserData(CONTINUATION_KEY); + if (continuation != null) { + continuation.cancel(); + + editor.putUserData(CONTINUATION_KEY, null); } } From e536287e14ec1ed515521ae1a78d930355c4900c Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Sat, 28 Mar 2026 10:15:41 +0200 Subject: [PATCH 5/8] update to last api --- .../impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java index 5e5b9bfe..8ebd56b1 100644 --- a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java +++ b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java @@ -190,6 +190,7 @@ public void doApplyInformationToEditor() { UpdateHighlightersUtil.setHighlightersToEditor( myProject, myDocument, + myFile, 0, myFile.getTextLength(), infos, From b5a125ff6a8e25edd8a3819ffc569f7ed47f6e12 Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Fri, 3 Apr 2026 21:42:37 +0300 Subject: [PATCH 6/8] remove nonnull --- .../java/consulo/xml/util/xml/ui/DomCollectionControl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java index cd8305d7..0dcf2647 100644 --- a/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java +++ b/xml-impl/src/main/java/consulo/xml/util/xml/ui/DomCollectionControl.java @@ -40,6 +40,7 @@ import consulo.xml.util.xml.highlighting.DomElementProblemDescriptor; import consulo.xml.util.xml.reflect.DomCollectionChildDescription; import consulo.xml.util.xml.ui.actions.DefaultAddAction; +import jakarta.annotation.Nonnull; import org.jspecify.annotations.Nullable; import javax.swing.*; @@ -145,7 +146,7 @@ public void navigate(DomElement element) { } @Override - public void uiDataSnapshot(@Nonnull DataSink dataSink) { + public void uiDataSnapshot(DataSink dataSink) { dataSink.set(DOM_COLLECTION_CONTROL, this); } From 55b9e89dc0185b4e37848c85f44ac271df839335 Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Fri, 3 Apr 2026 22:56:24 +0300 Subject: [PATCH 7/8] use imaginary editor --- .../XmlTagTreeHighlightingPass.java | 13 +++++-------- .../XmlTagTreeHighlightingPassFactory.java | 3 +-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java index 58a8b6fc..68bfcdb3 100644 --- a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java +++ b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java @@ -71,11 +71,12 @@ public class XmlTagTreeHighlightingPass extends TextEditorHighlightingPass { new HighlightInfoTypeImpl(HighlightSeverity.INFORMATION, TAG_TREE_HIGHLIGHTING_KEY); private final PsiFile myFile; - private final EditorEx myEditor; + + private final Editor myEditor; private final List> myPairsToHighlight = new ArrayList<>(); - public XmlTagTreeHighlightingPass(PsiFile file, EditorEx editor) { + public XmlTagTreeHighlightingPass(PsiFile file, Editor editor) { super(file.getProject(), editor.getDocument(), true); myFile = file; myEditor = editor; @@ -84,15 +85,11 @@ public XmlTagTreeHighlightingPass(PsiFile file, EditorEx editor) { @RequiredReadAction @Override public void doCollectInformation(ProgressIndicator progress) { - if (Application.get().isUnitTestMode()) { - return; - } - if (!XmlEditorOptions.getInstance().isTagTreeHighlightingEnabled()) { return; } - int offset = myEditor.getCaretModel().getOffset(); + int offset = getImaginaryEditor().getCaretModel().getOffset(); PsiElement[] elements = null; // FIXME [VISTALL] for now idk when it used, due it based on breadcrumbs, which removed if (elements == null || elements.length == 0 || !XmlTagTreeHighlightingUtil.containsTagsWithSameName(elements)) { @@ -310,7 +307,7 @@ private static ColorValue[] toColorsForLineMarkers(ColorValue[] baseColors) { } private ColorValue[] toColorsForEditor(ColorValue[] baseColors) { - ColorValue tagBackground = myEditor.getBackgroundColor(); + ColorValue tagBackground = ((EditorEx) myEditor).getBackgroundColor(); if (tagBackground == null) { return baseColors; diff --git a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java index b1255d8e..b15c9eff 100644 --- a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java +++ b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java @@ -37,8 +37,7 @@ public void register(Registrar registrar) { public TextEditorHighlightingPass createHighlightingPass(PsiFile file, Editor editor) { return !editor.isOneLineMode() && XmlTagTreeHighlightingUtil.isTagTreeHighlightingActive(file) - && editor instanceof EditorEx editorEx - ? new XmlTagTreeHighlightingPass(file, editorEx) + ? new XmlTagTreeHighlightingPass(file) : null; } } From 9fdd5cebec20055bf8032a8ab73647354ab3429f Mon Sep 17 00:00:00 2001 From: Valery Semenchuk Date: Fri, 3 Apr 2026 23:05:24 +0300 Subject: [PATCH 8/8] compile fix --- .../tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java index b15c9eff..a4ccf546 100644 --- a/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java +++ b/xml-impl/src/main/java/consulo/xml/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPassFactory.java @@ -37,7 +37,7 @@ public void register(Registrar registrar) { public TextEditorHighlightingPass createHighlightingPass(PsiFile file, Editor editor) { return !editor.isOneLineMode() && XmlTagTreeHighlightingUtil.isTagTreeHighlightingActive(file) - ? new XmlTagTreeHighlightingPass(file) + ? new XmlTagTreeHighlightingPass(file, editor) : null; } }