in view/src/main/java/jetbrains/jetpad/projectional/view/toAwt/ViewContainerComponent.java [93:334]
public ViewContainerComponent() {
setFocusable(true);
setFocusTraversalKeysEnabled(false);
setDoubleBuffered(true);
MouseAdapter mouseListener = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
handleMouseEvent(e, new Handler<jetbrains.jetpad.event.MouseEvent>() {
@Override
public void handle(jetbrains.jetpad.event.MouseEvent e) {
myContainer.mouseClicked(e);
}
});
}
@Override
public void mousePressed(MouseEvent e) {
handleMouseEvent(e, new Handler<jetbrains.jetpad.event.MouseEvent>() {
@Override
public void handle(jetbrains.jetpad.event.MouseEvent e) {
requestFocus();
myContainer.mousePressed(e);
}
});
}
@Override
public void mouseReleased(MouseEvent e) {
handleMouseEvent(e, new Handler<jetbrains.jetpad.event.MouseEvent>() {
@Override
public void handle(jetbrains.jetpad.event.MouseEvent e) {
myContainer.mouseReleased(e);
}
});
}
@Override
public void mouseMoved(MouseEvent e) {
handleMouseEvent(e, new Handler<jetbrains.jetpad.event.MouseEvent>() {
@Override
public void handle(jetbrains.jetpad.event.MouseEvent e) {
myContainer.mouseMoved(e);
}
}, false);
}
@Override
public void mouseEntered(MouseEvent e) {
handleMouseEvent(e, new Handler<jetbrains.jetpad.event.MouseEvent>() {
@Override
public void handle(jetbrains.jetpad.event.MouseEvent e) {
myContainer.mouseEntered(e);
}
}, false);
}
@Override
public void mouseExited(MouseEvent e) {
handleMouseEvent(e, new Handler<jetbrains.jetpad.event.MouseEvent>() {
@Override
public void handle(jetbrains.jetpad.event.MouseEvent e) {
myContainer.mouseLeft(e);
}
}, false);
}
@Override
public void mouseDragged(MouseEvent e) {
handleMouseEvent(e, new Handler<jetbrains.jetpad.event.MouseEvent>() {
@Override
public void handle(jetbrains.jetpad.event.MouseEvent e) {
myContainer.mouseDragged(e);
}
});
}
private void handleMouseEvent(MouseEvent e, Handler<jetbrains.jetpad.event.MouseEvent> handler) {
handleMouseEvent(e, handler, true);
}
private void handleMouseEvent(MouseEvent e, Handler<jetbrains.jetpad.event.MouseEvent> handler, boolean action) {
if (myContainer == null) return;
if (action) {
actionHappened();
}
jetbrains.jetpad.event.MouseEvent evt = EventTranslator.translate(e);
handler.handle(evt);
if (evt.isConsumed()) {
e.consume();
}
for (View view : myViewPaintHelpers.keySet()) {
if (view.bounds().get().contains(new Vector(e.getX(), e.getY()))) {
e.translatePoint(-view.bounds().get().origin.x, -view.bounds().get().origin.y);
myViewPaintHelpers.get(view).handleMouseEvent(e);
e.translatePoint(view.bounds().get().origin.x, view.bounds().get().origin.y);
}
}
}
};
addMouseListener(mouseListener);
addMouseMotionListener(mouseListener);
addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
View current = myContainer.root().viewAt(new Vector(e.getX(), e.getY()));
while (current != null) {
if (current instanceof ScrollView) {
ScrollView scrollView = (ScrollView) current;
if (scrollView.scroll().get() && scrollView.isVerticalScroller()) {
Vector offset = scrollView.offset().get().sub(new Vector(0, getDefaultFontMetrics().getHeight() * e.getWheelRotation()));
offset = offset.min(Vector.ZERO);
offset = offset.max(scrollView.internalsBounds().sub(scrollView.maxDimension().get()).max(Vector.ZERO).negate());
scrollView.offset().set(offset);
e.consume();
return;
}
}
current = current.getParent();
}
// hack: since java 1.7 mousewheel events aren't bubbling so we have to use this to fix that
// otherwise we won't be able to scroll with the mouse wheel.
if (getParent() != null) {
getParent().dispatchEvent(e);
}
}
});
KeyListener keyListener = new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char ch = e.getKeyChar();
if (e.isControlDown() || e.isMetaDown()) return;
if (ch < 0x20 || ch == 0x7F) return;
handleKeyEvent(e, new Handler<jetbrains.jetpad.event.KeyEvent>() {
@Override
public void handle(jetbrains.jetpad.event.KeyEvent item) {
myContainer.keyTyped(item);
}
});
}
@Override
public void keyPressed(KeyEvent e) {
handleKeyEvent(e, new Handler<jetbrains.jetpad.event.KeyEvent>() {
@Override
public void handle(jetbrains.jetpad.event.KeyEvent e) {
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
if (e.is(KeyStrokeSpecs.PASTE)) {
if (cb.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
try {
String text = (String) cb.getData(DataFlavor.stringFlavor);
myContainer.paste(new PasteEvent(TextContentHelper.createClipboardContent(text)));
e.consume();
return;
} catch (UnsupportedFlavorException | IOException ex) {
throw new RuntimeException(ex);
}
}
}
if (e.is(KeyStrokeSpecs.COPY) || e.is(KeyStrokeSpecs.CUT)) {
CopyCutEvent event;
if (e.is(KeyStrokeSpecs.CUT)) {
myContainer.cut(event = new CopyCutEvent(true));
} else {
myContainer.copy(event = new CopyCutEvent(false));
}
ClipboardContent content = event.getResult();
if (content != null) {
String text;
if (TextContentHelper.isText(content)) {
text = TextContentHelper.getText(content);
} else {
text = content.toString();
}
cb.setContents(new StringSelection(text), new ClipboardOwner() {
@Override
public void lostOwnership(Clipboard clipboard, Transferable contents) {
}
});
}
e.consume();
return;
}
myContainer.keyPressed(e);
}
});
}
@Override
public void keyReleased(KeyEvent e) {
handleKeyEvent(e, new Handler<jetbrains.jetpad.event.KeyEvent>() {
@Override
public void handle(jetbrains.jetpad.event.KeyEvent item) {
myContainer.keyReleased(item);
}
});
}
private void handleKeyEvent(KeyEvent e, Handler<jetbrains.jetpad.event.KeyEvent> handler) {
if (myContainer == null) return;
actionHappened();
jetbrains.jetpad.event.KeyEvent evt = EventTranslator.translate(e);
handler.handle(evt);
if (evt.isConsumed()) {
e.consume();
}
}
};
addKeyListener(keyListener);
myTimer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (System.currentTimeMillis() - myLastActionTime < 3000) return;
setCaretVisible(!myCaretVisible);
}
});
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
setFocused(true);
}
@Override
public void focusLost(FocusEvent e) {
setFocused(false);
}
private void setFocused(boolean focused) {
if (myFocused == focused) return;
myFocused = focused;
repaintCarets();
}
});
}