public ViewContainerComponent()

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();
      }
    });
  }