Skip to content

Commit

Permalink
Merge pull request JetBrains#178 from segrey/master
Browse files Browse the repository at this point in the history
support multiple KeyListeners
  • Loading branch information
Dmitry Trofimov authored Oct 18, 2018
2 parents 141424c + 8b8ad25 commit d684fe3
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
12 changes: 6 additions & 6 deletions terminal/src/com/jediterm/terminal/ui/JediTermWidget.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@
import java.awt.event.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;

/**
Expand All @@ -40,7 +38,7 @@ public class JediTermWidget extends JPanel implements TerminalSession, TerminalW
protected final JediTerminal myTerminal;
protected final AtomicBoolean mySessionRunning = new AtomicBoolean();
private SearchComponent myFindComponent;
protected PreConnectHandler myPreConnectHandler;
private final PreConnectHandler myPreConnectHandler;
private TtyConnector myTtyConnector;
private TerminalStarter myTerminalStarter;
private Thread myEmuThread;
Expand Down Expand Up @@ -79,7 +77,7 @@ public JediTermWidget(int columns, int lines, SettingsProvider settingsProvider)
myTerminalPanel.setCoordAccessor(myTerminal);

myPreConnectHandler = createPreConnectHandler(myTerminal);
myTerminalPanel.setKeyListener(myPreConnectHandler);
myTerminalPanel.addCustomKeyListener(myPreConnectHandler);
myScrollBar = createScrollBar();

myInnerPanel = new JLayeredPane();
Expand Down Expand Up @@ -355,7 +353,8 @@ public void run() {
mySessionRunning.set(true);
Thread.currentThread().setName("Connector-" + myTtyConnector.getName());
if (myTtyConnector.init(myPreConnectHandler)) {
myTerminalPanel.initKeyHandler();
myTerminalPanel.addCustomKeyListener(myTerminalPanel.getTerminalKeyListener());
myTerminalPanel.removeCustomKeyListener(myPreConnectHandler);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
myTerminalPanel.requestFocusInWindow();
Expand All @@ -377,7 +376,8 @@ public void run() {
for (TerminalWidgetListener listener : myListeners) {
listener.allSessionsClosed(JediTermWidget.this);
}
myTerminalPanel.setKeyListener(myPreConnectHandler);
myTerminalPanel.addCustomKeyListener(myPreConnectHandler);
myTerminalPanel.removeCustomKeyListener(myTerminalPanel.getTerminalKeyListener());
}
}
}
Expand Down
31 changes: 20 additions & 11 deletions terminal/src/com/jediterm/terminal/ui/TerminalPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.text.AttributedCharacterIterator;
import java.text.CharacterIterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
Expand Down Expand Up @@ -79,7 +80,7 @@ public class TerminalPanel extends JComponent implements TerminalDisplay, Clipbo

private boolean myScrollingEnabled = true;
protected int myClientScrollOrigin;
protected KeyListener myKeyListener;
private final List<KeyListener> myCustomKeyListeners = new CopyOnWriteArrayList<>();

private String myWindowTitle = "Terminal";

Expand All @@ -100,6 +101,7 @@ public class TerminalPanel extends JComponent implements TerminalDisplay, Clipbo
private LinkInfo myHoveredHyperlink = null;

private int myCursorType = Cursor.DEFAULT_CURSOR;
private final TerminalKeyHandler myTerminalKeyHandler = new TerminalKeyHandler();

public TerminalPanel(@NotNull SettingsProvider settingsProvider, @NotNull TerminalTextBuffer terminalTextBuffer, @NotNull StyleState styleState) {
mySettingsProvider = settingsProvider;
Expand Down Expand Up @@ -617,8 +619,12 @@ public void setTerminalStarter(final TerminalStarter terminalStarter) {
sizeTerminalFromComponent();
}

public void setKeyListener(final KeyListener keyListener) {
this.myKeyListener = keyListener;
public void addCustomKeyListener(@NotNull KeyListener keyListener) {
myCustomKeyListeners.add(keyListener);
}

public void removeCustomKeyListener(@NotNull KeyListener keyListener) {
myCustomKeyListeners.remove(keyListener);
}

public Dimension requestResize(final Dimension newSize,
Expand Down Expand Up @@ -877,15 +883,17 @@ public void processKeyEvent(final KeyEvent e) {
e.consume();
}


public void handleKeyEvent(KeyEvent e) {
// also called from com.intellij.terminal.JBTerminalPanel
public void handleKeyEvent(@NotNull KeyEvent e) {
final int id = e.getID();
if (id == KeyEvent.KEY_PRESSED) {
myKeyListener.keyPressed(e);
} else if (id == KeyEvent.KEY_RELEASED) {
/* keyReleased(e); */
for (KeyListener keyListener : myCustomKeyListeners) {
keyListener.keyPressed(e);
}
} else if (id == KeyEvent.KEY_TYPED) {
myKeyListener.keyTyped(e);
for (KeyListener keyListener : myCustomKeyListeners) {
keyListener.keyTyped(e);
}
}
}

Expand Down Expand Up @@ -962,8 +970,9 @@ public void mouseDragged(MouseEvent e) {
});
}

public void initKeyHandler() {
setKeyListener(new TerminalKeyHandler());
@NotNull
KeyListener getTerminalKeyListener() {
return myTerminalKeyHandler;
}

public enum TerminalCursorState {
Expand Down

0 comments on commit d684fe3

Please sign in to comment.