in ui/src/com/jediterm/terminal/ui/TerminalPanel.java [180:351]
public void init(@NotNull JScrollBar scrollBar) {
initFont();
setPreferredSize(new java.awt.Dimension(getPixelWidth(), getPixelHeight()));
setFocusable(true);
enableInputMethods(true);
setDoubleBuffered(true);
setFocusTraversalKeysEnabled(false);
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
handleHyperlinks(e.getPoint());
}
@Override
public void mouseDragged(final MouseEvent e) {
if (!isLocalMouseAction(e)) {
return;
}
final Point charCoords = panelToCharCoords(e.getPoint());
if (mySelection == null) {
// prevent unlikely case where drag started outside terminal panel
if (mySelectionStartPoint == null) {
mySelectionStartPoint = charCoords;
}
updateSelection(new TerminalSelection(new Point(mySelectionStartPoint)));
}
repaint();
updateSelectionEnd(charCoords);
if (mySettingsProvider.copyOnSelect()) {
handleCopyOnSelect();
}
if (e.getPoint().y < 0) {
moveScrollBar((int) ((e.getPoint().y) * SCROLL_SPEED));
}
if (e.getPoint().y > getPixelHeight()) {
moveScrollBar((int) ((e.getPoint().y - getPixelHeight()) * SCROLL_SPEED));
}
}
});
addMouseWheelListener(e -> {
if (isLocalMouseAction(e)) {
handleMouseWheelEvent(e, scrollBar);
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
if (myLinkHoverConsumer != null) {
myLinkHoverConsumer.onMouseExited();
myLinkHoverConsumer = null;
}
updateHoveredHyperlink(null);
}
@Override
public void mousePressed(final MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
if (e.getClickCount() == 1) {
mySelectionStartPoint = panelToCharCoords(e.getPoint());
updateSelection(null);
repaint();
}
}
}
@Override
public void mouseReleased(final MouseEvent e) {
requestFocusInWindow();
repaint();
}
@Override
public void mouseClicked(final MouseEvent e) {
requestFocusInWindow();
HyperlinkStyle hyperlink = isFollowLinkEvent(e) ? findHyperlink(e.getPoint()) : null;
if (hyperlink != null) {
hyperlink.getLinkInfo().navigate();
} else if (e.getButton() == MouseEvent.BUTTON1 && isLocalMouseAction(e)) {
int count = e.getClickCount();
if (count == 1) {
// do nothing
} else if (count == 2) {
// select word
final Point charCoords = panelToCharCoords(e.getPoint());
Point start = SelectionUtil.getPreviousSeparator(charCoords, myTerminalTextBuffer);
Point stop = SelectionUtil.getNextSeparator(charCoords, myTerminalTextBuffer);
updateSelection(new TerminalSelection(start));
updateSelectionEnd(stop);
if (mySettingsProvider.copyOnSelect()) {
handleCopyOnSelect();
}
} else if (count == 3) {
// select line
final Point charCoords = panelToCharCoords(e.getPoint());
int startLine = charCoords.y;
while (startLine > -getScrollLinesStorage().getSize()
&& myTerminalTextBuffer.getLine(startLine - 1).isWrapped()) {
startLine--;
}
int endLine = charCoords.y;
while (endLine < myTerminalTextBuffer.getHeight()
&& myTerminalTextBuffer.getLine(endLine).isWrapped()) {
endLine++;
}
updateSelection(new TerminalSelection(new Point(0, startLine)));
updateSelectionEnd(new Point(myTermSize.getColumns(), endLine));
if (mySettingsProvider.copyOnSelect()) {
handleCopyOnSelect();
}
}
} else if (e.getButton() == MouseEvent.BUTTON2 && mySettingsProvider.pasteOnMiddleMouseClick() && isLocalMouseAction(e)) {
handlePasteSelection();
} else if (e.getButton() == MouseEvent.BUTTON3) {
HyperlinkStyle contextHyperlink = findHyperlink(e.getPoint());
TerminalActionProvider provider = getTerminalActionProvider(contextHyperlink != null ? contextHyperlink.getLinkInfo() : null, e);
JPopupMenu popup = createPopupMenu(provider);
popup.show(e.getComponent(), e.getX(), e.getY());
}
repaint();
}
});
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(final ComponentEvent e) {
sizeTerminalFromComponent();
}
});
addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
// replace with com.intellij.util.ui.update.UiNotifyConnector#doWhenFirstShown when merged with intellij
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && isShowing()) {
SwingUtilities.invokeLater(() -> sizeTerminalFromComponent());
removeHierarchyListener(this);
}
}
});
myFillCharacterBackgroundIncludingLineSpacing = mySettingsProvider.shouldFillCharacterBackgroundIncludingLineSpacing();
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
myFillCharacterBackgroundIncludingLineSpacing = mySettingsProvider.shouldFillCharacterBackgroundIncludingLineSpacing();
myCursor.cursorChanged();
}
@Override
public void focusLost(FocusEvent e) {
myCursor.cursorChanged();
handleHyperlinks(e.getComponent());
}
});
myBoundedRangeModel.addChangeListener(e -> {
myClientScrollOrigin = myBoundedRangeModel.getValue();
repaint();
});
createRepaintTimer();
}