This is an automated email from the ASF dual-hosted git repository. neilcsmith pushed a commit to branch delivery in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/delivery by this push: new ab220159e3 Don't scroll output window on link click. new 81ac164a88 Merge pull request #6679 from mbien/dont-scroll-output-on-click ab220159e3 is described below commit ab220159e33cb228193890de13dd28fff14a7f2a Author: Michael Bien <mbie...@gmail.com> AuthorDate: Thu Nov 9 22:44:17 2023 +0100 Don't scroll output window on link click. - adds another boolean to control if caret positioning should scroll - calls it with false on link clicks, default remains true - adds override annotation to the hierarchy to be able to safely make changes. This also exposed duplicated/dead code which was removed - luckily its all internal API --- .../src/org/netbeans/core/output2/OutputPane.java | 9 ++++ .../src/org/netbeans/core/output2/OutputTab.java | 42 +++++++++--------- .../core/output2/ui/AbstractOutputPane.java | 50 +++++++++++++--------- 3 files changed, 60 insertions(+), 41 deletions(-) diff --git a/platform/core.output2/src/org/netbeans/core/output2/OutputPane.java b/platform/core.output2/src/org/netbeans/core/output2/OutputPane.java index df10c56901..13455a0aeb 100644 --- a/platform/core.output2/src/org/netbeans/core/output2/OutputPane.java +++ b/platform/core.output2/src/org/netbeans/core/output2/OutputPane.java @@ -48,10 +48,12 @@ class OutputPane extends AbstractOutputPane { findOutputTab().documentChanged(this); } + @Override protected void caretPosChanged(int pos) { findOutputTab().caretPosChanged(pos); } + @Override protected void lineClicked(int line, int pos) { if ((getDocument() instanceof OutputDocument)) { findOutputTab().lineClicked(line, pos); @@ -64,6 +66,7 @@ class OutputPane extends AbstractOutputPane { findOutputTab().enterPressed(caret.getMark(), caret.getDot()); } + @Override protected void postPopupMenu(Point p, Component src) { if (src.isShowing()) { findOutputTab().postPopupMenu(p, src); @@ -116,6 +119,7 @@ class OutputPane extends AbstractOutputPane { } + @Override public void setWrapped (boolean val) { if (val != isWrapped() || !(getEditorKit() instanceof OutputEditorKit)) { NbPreferences.forModule(OutputPane.class).putBoolean("wrap", val); //NOI18N @@ -138,6 +142,7 @@ class OutputPane extends AbstractOutputPane { //been fully readjusted to its new dimensions, scroll bounds, etc. SwingUtilities.invokeLater (new Runnable() { private boolean first = true; + @Override public void run() { if (first) { first = false; @@ -160,6 +165,7 @@ class OutputPane extends AbstractOutputPane { } } + @Override public boolean isWrapped() { if (getEditorKit() instanceof OutputEditorKit) { return getEditorKit() instanceof OutputEditorKit @@ -169,6 +175,7 @@ class OutputPane extends AbstractOutputPane { } } + @Override protected JEditorPane createTextView() { JEditorPane result = new JEditorPane(); if ("Aqua".equals(UIManager.getLookAndFeel().getID())) { @@ -187,6 +194,7 @@ class OutputPane extends AbstractOutputPane { result.setInputMap(JEditorPane.WHEN_FOCUSED, myMap); Action act = new AbstractAction() { + @Override public void actionPerformed(ActionEvent arg0) { OutputDocument od =(OutputDocument)((JEditorPane)arg0.getSource()).getDocument(); findOutputTab().inputSent(od.sendLine()); @@ -195,6 +203,7 @@ class OutputPane extends AbstractOutputPane { result.getActionMap().put("SENDLINE", act); act = new AbstractAction() { + @Override public void actionPerformed(ActionEvent arg0) { OutputDocument od =(OutputDocument)((JEditorPane)arg0.getSource()).getDocument(); findOutputTab().inputSent(od.sendLine()); diff --git a/platform/core.output2/src/org/netbeans/core/output2/OutputTab.java b/platform/core.output2/src/org/netbeans/core/output2/OutputTab.java index 0c61bc0a63..7775395541 100644 --- a/platform/core.output2/src/org/netbeans/core/output2/OutputTab.java +++ b/platform/core.output2/src/org/netbeans/core/output2/OutputTab.java @@ -33,7 +33,6 @@ import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.CharConversionException; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -51,7 +50,6 @@ import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; -import javax.swing.JSeparator; import javax.swing.KeyStroke; import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; @@ -74,9 +72,6 @@ import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.openide.windows.IOContainer; import org.openide.windows.OutputListener; -import org.openide.windows.WindowManager; -import org.openide.xml.XMLUtil; - import static org.netbeans.core.output2.OutputTab.ACTION.*; import org.netbeans.core.output2.options.OutputOptions; import org.netbeans.core.output2.ui.OutputKeymapManager; @@ -197,10 +192,12 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks return null; } + @Override protected AbstractOutputPane createOutputPane() { return new OutputPane(this); } + @Override public void inputSent(String txt) { if (Controller.LOG) Controller.log("Input sent on OutputTab: " + txt); getOutputPane().lockScroll(); @@ -212,6 +209,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks } } + @Override protected void inputEof() { if (Controller.LOG) Controller.log ("Input EOF"); NbIO.IOReader in = io.in(); @@ -220,6 +218,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks } } + @Override public void hasSelectionChanged(boolean val) { if (isShowing() && actionsLoaded) { actions.get(ACTION.COPY).setEnabled(val); @@ -246,7 +245,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks l.outputLineAction(oe); //Select the text on click if it is still visible if (getOutputPane().getLength() >= range[1]) { // #179768 - getOutputPane().sendCaretToPos(range[0], range[1], true); + getOutputPane().sendCaretToPos(range[0], range[1], true, false); } } } @@ -327,10 +326,12 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks } } + @Override public void activated() { updateActions(); } + @Override public void closed() { io.setClosed(true); io.setStreamClosed(true); @@ -351,9 +352,11 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks } } + @Override public void deactivated() { } + @Override public void selected() { } @@ -642,7 +645,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks } } - List<TabAction> activeActions = new ArrayList<TabAction>(popupItems.length); + List<TabAction> activeActions = new ArrayList<>(popupItems.length); for (int i = 0; i < popupItems.length; i++) { if (popupItems[i] == null) { popup.addSeparator(); @@ -756,18 +759,6 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks return origPane != null ? filtOut.getWriter() : outWriter; } - private void disableHtmlName() { - Controller.getDefault().removeFromUpdater(this); - String escaped; - try { - escaped = XMLUtil.toAttributeValue(io.getName() + " "); - } catch (CharConversionException e) { - escaped = io.getName() + " "; - } - //#88204 apostophes are escaped in xm but not html - io.getIOContainer().setTitle(this, escaped.replace("'", "'")); - } - private void initOptionsListener() { optionsListener = new PropertyChangeListener() { @Override @@ -872,7 +863,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks EXPAND_TREE }; - private final Map<ACTION, TabAction> actions = new EnumMap<ACTION, TabAction>(ACTION.class); + private final Map<ACTION, TabAction> actions = new EnumMap<>(ACTION.class); private void createActions() { KeyStrokeUtils.refreshActionCache(); @@ -1090,6 +1081,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks return super.isEnabled(); } + @Override public void actionPerformed(ActionEvent e) { if (getIO().isClosed()) { // Cached action for an already closed tab. @@ -1257,6 +1249,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks orig = original; } + @Override public Object getValue(String key) { if (Action.SMALL_ICON.equals(key)) { return null; @@ -1264,26 +1257,32 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks return orig.getValue(key); } + @Override public void putValue(String key, Object value) { orig.putValue(key, value); } + @Override public void setEnabled(boolean b) { orig.setEnabled(b); } + @Override public boolean isEnabled() { return orig.isEnabled(); } + @Override public void addPropertyChangeListener(PropertyChangeListener listener) { orig.addPropertyChangeListener(listener); } + @Override public void removePropertyChangeListener(PropertyChangeListener listener) { orig.removePropertyChangeListener(listener); } + @Override public void actionPerformed(ActionEvent e) { orig.actionPerformed(e); } @@ -1303,6 +1302,7 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks handle = escHandle; } + @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { JPopupMenu popup = (JPopupMenu) e.getSource(); popup.removeAll(); @@ -1320,10 +1320,12 @@ final class OutputTab extends AbstractOutputTab implements IOContainer.CallBacks } } + @Override public void popupMenuCanceled(PopupMenuEvent e) { popupMenuWillBecomeInvisible(e); } + @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { //do nothing } diff --git a/platform/core.output2/src/org/netbeans/core/output2/ui/AbstractOutputPane.java b/platform/core.output2/src/org/netbeans/core/output2/ui/AbstractOutputPane.java index 13027fe614..918e473ab3 100644 --- a/platform/core.output2/src/org/netbeans/core/output2/ui/AbstractOutputPane.java +++ b/platform/core.output2/src/org/netbeans/core/output2/ui/AbstractOutputPane.java @@ -156,6 +156,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document * Scrolls the pane to the bottom, invokeLatered to ensure all state has * been updated, so the bottom really *is* the bottom. */ + @Override public void run() { enqueued = false; if (locked) { @@ -384,12 +385,18 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } public final void sendCaretToPos(int startPos, int endPos, boolean select) { + sendCaretToPos(startPos, endPos, select, true); + } + + public final void sendCaretToPos(int startPos, int endPos, boolean select, boolean scroll) { inSendCaretToLine = true; try { getCaret().setVisible(true); getCaret().setSelectionVisible(true); if (select) { - scrollTo(endPos); + if (scroll) { + scrollTo(endPos); + } getCaret().setDot(endPos); getCaret().moveDot(startPos); textView.repaint(); @@ -409,7 +416,12 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document private boolean inSendCaretToLine = false; private int lineToScroll = -1; + public final boolean sendCaretToLine(int idx, boolean select) { + return sendCaretToLine(idx, select, true); + } + + public final boolean sendCaretToLine(int idx, boolean select, boolean scroll) { int lastLine = getLineCount() - 1; if (idx > lastLine) { idx = lastLine; @@ -428,7 +440,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document getCaret().setDot(position); } - if (!scrollToLine(idx + 3) && isScrollLocked()) { + if (scroll && !scrollToLine(idx + 3) && isScrollLocked()) { lineToScroll = idx + 3; } } catch (Error sie) { @@ -464,25 +476,6 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document return line == lineIdx && visRect.y + visRect.height == rect.y + rect.height; } - boolean scrollToPos(int pos) { - Rectangle rect = null; - try { - rect = textView.modelToView(pos); - } catch (BadLocationException ex) { - Exceptions.printStackTrace(ex); - } - - if (rect == null) { - return false; - } - - boolean oldLocked = locked; - textView.scrollRectToVisible(rect); - locked = oldLocked; - - return true; - } - public final void lockScroll() { if (!locked) { locked = true; @@ -543,6 +536,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document //***********************Listener implementations***************************** + @Override public void stateChanged(ChangeEvent e) { if (e.getSource() == getVerticalScrollBar().getModel()) { if (!locked) { //XXX check if doc is still being written? @@ -594,6 +588,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public final void changedUpdate(DocumentEvent e) { //Ensure it is consumed e.getLength(); @@ -609,6 +604,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public final void insertUpdate(DocumentEvent e) { //Ensure it is consumed e.getLength(); @@ -624,12 +620,14 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public final void removeUpdate(DocumentEvent e) { //Ensure it is consumed e.getLength(); documentChanged(); } + @Override public void mouseClicked(MouseEvent e) { if (e.isAltDown() || e.isAltGraphDown() || e.isControlDown() && SwingUtilities.isMiddleMouseButton(e)) { @@ -639,9 +637,11 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public void mouseEntered(MouseEvent e) { } + @Override public void mouseExited(MouseEvent e) { resetCursor(); } @@ -675,6 +675,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public void mouseMoved(MouseEvent e) { if (e.getSource() == textView) { if (isOnHyperlink(e.getPoint())) { @@ -688,6 +689,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public void mouseDragged(MouseEvent e) { if (e.getSource() == getVerticalScrollBar()) { int y = e.getY(); @@ -700,6 +702,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document /** last pressed position for hyperlink test */ private int lastPressedPos = -1; + @Override public void mousePressed(MouseEvent e) { if (e.getSource() == textView && SwingUtilities.isLeftMouseButton(e)) { lastPressedPos = textView.viewToModel(e.getPoint()); @@ -725,6 +728,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public final void mouseReleased(MouseEvent e) { if (e.getSource() == textView && SwingUtilities.isLeftMouseButton(e)) { int pos = textView.viewToModel(e.getPoint()); @@ -748,6 +752,7 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public void keyPressed(KeyEvent keyEvent) { switch (keyEvent.getKeyCode()) { case KeyEvent.VK_END: @@ -805,14 +810,17 @@ public abstract class AbstractOutputPane extends JScrollPane implements Document } } + @Override public void keyReleased(KeyEvent keyEvent) { } + @Override public void keyTyped(KeyEvent keyEvent) { } protected abstract void changeFontSizeBy(int change); + @Override public final void mouseWheelMoved(MouseWheelEvent e) { if (e.isAltDown() || e.isAltGraphDown() || e.isControlDown()) { int change = -e.getWheelRotation(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists