📄 swingterminal.java
字号:
public Dimension getSize() { int xborder = 0, yborder = 0; if (insets != null) { xborder = insets.left + insets.right; yborder = insets.top + insets.bottom; } return new Dimension(buffer.width * charWidth + xborder, buffer.height * charHeight + yborder); } /** * Return the preferred Size of the character display. * This turns out to be the actual size. * @return Dimension dimension of the display * @see #size */ public Dimension getPreferredSize() { return getSize(); } /** * The insets of the character display define the border. * @return Insets border thickness in pixels */ public Insets getInsets() { return insets; } public void clearSelection() { selectBegin = new Point(0, 0); selectEnd = new Point(0, 0); selection = null; } public String getSelection() { return selection; } private boolean buttonCheck(int modifiers, int mask) { return (modifiers & mask) == mask; } public void mouseMoved(MouseEvent evt) { /* nothing yet we do here */ } public void mouseDragged(MouseEvent evt) { if (buttonCheck(evt.getModifiers(), MouseEvent.BUTTON1_MASK) || // Windows NT/95 etc: returns 0, which is a bug evt.getModifiers() == 0) { int xoffset = (super.getSize().width - buffer.width * charWidth) / 2; int yoffset = (super.getSize().height - buffer.height * charHeight) / 2; int x = (evt.getX() - xoffset) / charWidth; int y = (evt.getY() - yoffset) / charHeight + buffer.windowBase; int oldx = selectEnd.x, oldy = selectEnd.y; if ((x <= selectBegin.x && y <= selectBegin.y)) { selectBegin.x = x; selectBegin.y = y; } else { selectEnd.x = x; selectEnd.y = y; } if (oldx != x || oldy != y) { buffer.update[0] = true; if (debug > 0) System.err.println("select([" + selectBegin.x + "," + selectBegin.y + "]," + "[" + selectEnd.x + "," + selectEnd.y + "])"); redraw(); } } } public void mouseClicked(MouseEvent evt) { /* nothing yet we do here */ } public void mouseEntered(MouseEvent evt) { /* nothing yet we do here */ } public void mouseExited(MouseEvent evt) { /* nothing yet we do here */ } /** * Handle mouse pressed events for copy & paste. * @param evt the event that occured * @see java.awt.event.MouseEvent */ public void mousePressed(MouseEvent evt) { requestFocus(); int xoffset = (super.getSize().width - buffer.width * charWidth) / 2; int yoffset = (super.getSize().height - buffer.height * charHeight) / 2; if (buffer instanceof VDUInput) { ((VDUInput) buffer).mousePressed(xoffset, yoffset, evt.getModifiers()); } // looks like we get no modifiers here ... ... We do? -Marcus if (buttonCheck(evt.getModifiers(), MouseEvent.BUTTON1_MASK)) { selectBegin.x = (evt.getX() - xoffset) / charWidth; selectBegin.y = (evt.getY() - yoffset) / charHeight + buffer.windowBase; selectEnd.x = selectBegin.x; selectEnd.y = selectBegin.y; } } /** * Handle mouse released events for copy & paste. * @param evt the mouse event */ public void mouseReleased(MouseEvent evt) { int xoffset = (super.getSize().width - buffer.width * charWidth) / 2; int yoffset = (super.getSize().height - buffer.height * charHeight) / 2; if (buffer instanceof VDUInput) { ((VDUInput) buffer).mousePressed(xoffset, yoffset, evt.getModifiers()); } if (buttonCheck(evt.getModifiers(), MouseEvent.BUTTON1_MASK)) { mouseDragged(evt); if (selectBegin.x == selectEnd.x && selectBegin.y == selectEnd.y) { buffer.update[0] = true; redraw(); return; } selection = ""; // fix end.x and end.y, they can get over the border if (selectEnd.x < 0) selectEnd.x = 0; if (selectEnd.y < 0) selectEnd.y = 0; if (selectEnd.y >= buffer.charArray.length) selectEnd.y = buffer.charArray.length - 1; if (selectEnd.x > buffer.charArray[0].length) selectEnd.x = buffer.charArray[0].length; // Initial buffer space for selectEnd - selectBegin + 1 lines // NOTE: Selection includes invisible text as spaces! // (also leaves invisible non-whitespace selection ending as spaces) StringBuffer selectionBuf = new StringBuffer(buffer.charArray[0].length*(selectEnd.y-selectBegin.y+1)); for (int l = selectBegin.y; l <= selectEnd.y; l++) { int start, end; start = (l == selectBegin.y ? start = selectBegin.x : 0); end = (l == selectEnd.y ? end = selectEnd.x : buffer.charArray[l].length); boolean newlineFound = false; char ch = ' '; for(int i = start; i < end; i++) { if((buffer.charAttributes[l][i] & VDUBuffer.INVISIBLE) != 0) ch = ' '; else ch = buffer.charArray[l][i]; if(ch == '\n') newlineFound = true; selectionBuf.append(ch); } if(!newlineFound) selectionBuf.append('\n'); // Trim all spaces from end of line, like xterm does. selection += ("-" + (selectionBuf.toString())).trim().substring(1); if (end == buffer.charArray[l].length) selection += "\n"; } } } public void keyTyped(KeyEvent e) { if (buffer != null) ((VDUInput) buffer).keyTyped(e.getKeyCode(), e.getKeyChar(), getModifiers(e)); } public void keyPressed(KeyEvent e) { if (buffer != null) ((VDUInput) buffer).keyPressed(e.getKeyCode(), e.getKeyChar(), getModifiers(e)); } public void keyReleased(KeyEvent e) { // ignore } // lightweight component event handling private MouseListener mouseListener; /** * Add a mouse listener to the VDU. This is the implementation for * the lightweight event handling. * @param listener the new mouse listener */ public void addMouseListener(MouseListener listener) { mouseListener = AWTEventMulticaster.add(mouseListener, listener); enableEvents(AWTEvent.MOUSE_EVENT_MASK); } /** * Remove a mouse listener to the VDU. This is the implementation for * the lightweight event handling. * @param listener the mouse listener to remove */ public void removeMouseListener(MouseListener listener) { mouseListener = AWTEventMulticaster.remove(mouseListener, listener); } private MouseMotionListener mouseMotionListener; /** * Add a mouse motion listener to the VDU. This is the implementation for * the lightweight event handling. * @param listener the mouse motion listener */ public void addMouseMotionListener(MouseMotionListener listener) { mouseMotionListener = AWTEventMulticaster.add(mouseMotionListener, listener); enableEvents(AWTEvent.MOUSE_EVENT_MASK); } /** * Remove a mouse motion listener to the VDU. This is the implementation for * the lightweight event handling. * @param listener the mouse motion listener to remove */ public void removeMouseMotionListener(MouseMotionListener listener) { mouseMotionListener = AWTEventMulticaster.remove(mouseMotionListener, listener); } /** * Process mouse events for this component. It will call the * methods (mouseClicked() etc) in the added mouse listeners. * @param evt the dispatched mouse event */ public void processMouseEvent(MouseEvent evt) { // handle simple mouse events if (mouseListener != null) switch (evt.getID()) { case MouseEvent.MOUSE_CLICKED: mouseListener.mouseClicked(evt); break; case MouseEvent.MOUSE_ENTERED: mouseListener.mouseEntered(evt); break; case MouseEvent.MOUSE_EXITED: mouseListener.mouseExited(evt); break; case MouseEvent.MOUSE_PRESSED: mouseListener.mousePressed(evt); break; case MouseEvent.MOUSE_RELEASED: mouseListener.mouseReleased(evt); break; } super.processMouseEvent(evt); } /** * Process mouse motion events for this component. It will call the * methods (mouseDragged() etc) in the added mouse motion listeners. * @param evt the dispatched mouse event */ public void processMouseMotionEvent(MouseEvent evt) { // handle mouse motion events if (mouseMotionListener != null) switch (evt.getID()) { case MouseEvent.MOUSE_DRAGGED: mouseMotionListener.mouseDragged(evt); break; case MouseEvent.MOUSE_MOVED: mouseMotionListener.mouseMoved(evt); break; } super.processMouseMotionEvent(evt); } private KeyListener keyListener; /** * Add a key listener to the VDU. This is necessary to be able to receive * keyboard input from this component. It is a prerequisite for a * lightweigh component. * @param listener the key listener */ public void addKeyListener(KeyListener listener) { keyListener = AWTEventMulticaster.add(keyListener, listener); enableEvents(AWTEvent.KEY_EVENT_MASK); } /** * Remove key listener from the VDU. It is a prerequisite for a * lightweigh component. * @param listener the key listener to remove */ public void removeKeyListener(KeyListener listener) { keyListener = AWTEventMulticaster.remove(keyListener, listener); } /** * Process key events for this component. * @param evt the dispatched key event */ public void processKeyEvent(KeyEvent evt) { if (keyListener != null) switch (evt.getID()) { case KeyEvent.KEY_PRESSED: keyListener.keyPressed(evt); break; case KeyEvent.KEY_RELEASED: keyListener.keyReleased(evt); break; case KeyEvent.KEY_TYPED: keyListener.keyTyped(evt); break; } // consume TAB keys if they originate from our component if (evt.getKeyCode() == KeyEvent.VK_TAB && evt.getSource() == this) evt.consume(); super.processKeyEvent(evt); } FocusListener focusListener; public void addFocusListener(FocusListener listener) { focusListener = AWTEventMulticaster.add(focusListener, listener); } public void removeFocusListener(FocusListener listener) { focusListener = AWTEventMulticaster.remove(focusListener, listener); } public void processFocusEvent(FocusEvent evt) { if (focusListener != null) switch (evt.getID()) { case FocusEvent.FOCUS_GAINED: focusListener.focusGained(evt); break; case FocusEvent.FOCUS_LOST: focusListener.focusLost(evt); break; } super.processFocusEvent(evt); } private int getModifiers(KeyEvent e) { return (e.isControlDown() ? VDUInput.KEY_CONTROL : 0) | (e.isShiftDown() ? VDUInput.KEY_SHIFT : 0) | (e.isAltDown() ? VDUInput.KEY_ALT : 0) | (e.isActionKey() ? VDUInput.KEY_ACTION : 0); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -