📄 swinggui.java
字号:
public void mouseExited(MouseEvent e) { } public void mouseReleased(MouseEvent e) { if (e.getComponent() == this && (e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) { int x = e.getX(); int y = e.getY(); Font font = fileWindow.textArea.getFont(); FontMetrics metrics = getFontMetrics(font); int h = metrics.getHeight(); int line = y/h; if (line == pressLine) { fileWindow.toggleBreakPoint(line + 1); } else { pressLine = -1; } } } FileHeader(FileWindow fileWindow) { this.fileWindow = fileWindow; addMouseListener(this); update(); } void update() { FileTextArea textArea = fileWindow.textArea; Font font = textArea.getFont(); setFont(font); FontMetrics metrics = getFontMetrics(font); int h = metrics.getHeight(); int lineCount = textArea.getLineCount() + 1; String dummy = Integer.toString(lineCount); if (dummy.length() < 2) { dummy = "99"; } Dimension d = new Dimension(); d.width = metrics.stringWidth(dummy) + 16; d.height = lineCount * h + 100; setPreferredSize(d); setSize(d); } public void paint(Graphics g) { super.paint(g); FileTextArea textArea = fileWindow.textArea; Font font = textArea.getFont(); g.setFont(font); FontMetrics metrics = getFontMetrics(font); Rectangle clip = g.getClipBounds(); g.setColor(getBackground()); g.fillRect(clip.x, clip.y, clip.width, clip.height); int left = getX(); int ascent = metrics.getMaxAscent(); int h = metrics.getHeight(); int lineCount = textArea.getLineCount() + 1; String dummy = Integer.toString(lineCount); if (dummy.length() < 2) { dummy = "99"; } int maxWidth = metrics.stringWidth(dummy); int startLine = clip.y / h; int endLine = (clip.y + clip.height) / h + 1; int width = getWidth(); if (endLine > lineCount) endLine = lineCount; for (int i = startLine; i < endLine; i++) { String text; int pos = -2; try { pos = textArea.getLineStartOffset(i); } catch (BadLocationException ignored) { } boolean isBreakPoint = fileWindow.isBreakPoint(i + 1); text = Integer.toString(i + 1) + " "; int w = metrics.stringWidth(text); int y = i * h; g.setColor(Color.blue); g.drawString(text, 0, y + ascent); int x = width - ascent; if (isBreakPoint) { g.setColor(new Color(0x80, 0x00, 0x00)); int dy = y + ascent - 9; g.fillOval(x, dy, 9, 9); g.drawOval(x, dy, 8, 8); g.drawOval(x, dy, 9, 9); } if (pos == fileWindow.currentPos) { Polygon arrow = new Polygon(); int dx = x; y += ascent - 10; int dy = y; arrow.addPoint(dx, dy + 3); arrow.addPoint(dx + 5, dy + 3); for (x = dx + 5; x <= dx + 10; x++, y++) { arrow.addPoint(x, y); } for (x = dx + 9; x >= dx + 5; x--, y++) { arrow.addPoint(x, y); } arrow.addPoint(dx + 5, dy + 7); arrow.addPoint(dx, dy + 7); g.setColor(Color.yellow); g.fillPolygon(arrow); g.setColor(Color.black); g.drawPolygon(arrow); } } }};class FileWindow extends JInternalFrame implements ActionListener{ static final long serialVersionUID = -6212382604952082370L; SwingGui debugGui; Dim.SourceInfo sourceInfo; FileTextArea textArea; FileHeader fileHeader; JScrollPane p; int currentPos; JLabel statusBar; public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("Cut")) { // textArea.cut(); } else if (cmd.equals("Copy")) { textArea.copy(); } else if (cmd.equals("Paste")) { // textArea.paste(); } } void load() { String url = getUrl(); if (url != null) { RunProxy proxy = new RunProxy(debugGui, RunProxy.LOAD_FILE); proxy.fileName = url; proxy.text = sourceInfo.source(); new Thread(proxy).start(); } } public int getPosition(int line) { int result = -1; try { result = textArea.getLineStartOffset(line); } catch (javax.swing.text.BadLocationException exc) { } return result; } boolean isBreakPoint(int line) { return sourceInfo.breakableLine(line) && sourceInfo.breakpoint(line); } void toggleBreakPoint(int line) { if (!isBreakPoint(line)) { setBreakPoint(line); } else { clearBreakPoint(line); } } void setBreakPoint(int line) { if (sourceInfo.breakableLine(line)) { boolean changed = sourceInfo.breakpoint(line, true); if (changed) { fileHeader.repaint(); } } } void clearBreakPoint(int line) { if (sourceInfo.breakableLine(line)) { boolean changed = sourceInfo.breakpoint(line, false); if (changed) { fileHeader.repaint(); } } } FileWindow(SwingGui debugGui, Dim.SourceInfo sourceInfo) { super(SwingGui.getShortName(sourceInfo.url()), true, true, true, true); this.debugGui = debugGui; this.sourceInfo = sourceInfo; updateToolTip(); currentPos = -1; textArea = new FileTextArea(this); textArea.setRows(24); textArea.setColumns(80); p = new JScrollPane(); fileHeader = new FileHeader(this); p.setViewportView(textArea); p.setRowHeaderView(fileHeader); setContentPane(p); pack(); updateText(sourceInfo); textArea.select(0); } private void updateToolTip() { // in case fileName is very long, try to set tool tip on frame Component c = getComponent(1); // this will work at least for Metal L&F if (c != null && c instanceof JComponent) { ((JComponent)c).setToolTipText(getUrl()); } } public String getUrl() { return sourceInfo.url(); } void updateText(Dim.SourceInfo sourceInfo) { this.sourceInfo = sourceInfo; String newText = sourceInfo.source(); if (!textArea.getText().equals(newText)) { textArea.setText(newText); int pos = 0; if (currentPos != -1) { pos = currentPos; } textArea.select(pos); } fileHeader.update(); fileHeader.repaint(); } void setPosition(int pos) { textArea.select(pos); currentPos = pos; fileHeader.repaint(); } void select(int start, int end) { int docEnd = textArea.getDocument().getLength(); textArea.select(docEnd, docEnd); textArea.select(start, end); } public void dispose() { debugGui.removeWindow(this); super.dispose(); }};class MyTableModel extends AbstractTableModel{ static final long serialVersionUID = 2971618907207577000L; SwingGui debugGui; Vector expressions; Vector values; MyTableModel(SwingGui debugGui) { this.debugGui = debugGui; expressions = new Vector(); values = new Vector(); expressions.addElement(""); values.addElement(""); } public int getColumnCount() { return 2; } public int getRowCount() { return expressions.size(); } public String getColumnName(int column) { switch (column) { case 0: return "Expression"; case 1: return "Value"; } return null; } public boolean isCellEditable(int row, int column) { return true; } public Object getValueAt(int row, int column) { switch (column) { case 0: return expressions.elementAt(row); case 1: return values.elementAt(row); } return ""; } public void setValueAt(Object value, int row, int column) { switch (column) { case 0: String expr = value.toString(); expressions.setElementAt(expr, row); String result = ""; if (expr.length() > 0) { result = debugGui.dim.eval(expr); if (result == null) result = ""; } values.setElementAt(result, row); updateModel(); if (row + 1 == expressions.size()) { expressions.addElement(""); values.addElement(""); fireTableRowsInserted(row + 1, row + 1); } break; case 1: // just reset column 2; ignore edits fireTableDataChanged(); } } void updateModel() { for (int i = 0; i < expressions.size(); ++i) { Object value = expressions.elementAt(i); String expr = value.toString(); String result = ""; if (expr.length() > 0) { result = debugGui.dim.eval(expr); if (result == null) result = ""; } else { result = ""; } result = result.replace('\n', ' '); values.setElementAt(result, i); } fireTableDataChanged(); }};class Evaluator extends JTable{ static final long serialVersionUID = 8133672432982594256L; MyTableModel tableModel; Evaluator(SwingGui debugGui) { super(new MyTableModel(debugGui)); tableModel = (MyTableModel)getModel(); }}class VariableModel implements TreeTableModel{ static class VariableNode { Object object; Object id; VariableNode[] children; VariableNode(Object object, Object id) { this.object = object; this.id = id; } public String toString() { return (id instanceof String) ? (String)id : "[" + ((Integer)id).intValue() + "]"; } } // Names of the columns. private static final String[] cNames = { " Name", " Value"}; // Types of the columns. private static final Class[] cTypes = {TreeTableModel.class, String.class}; private static final VariableNode[] CHILDLESS = new VariableNode[0]; private Dim debugger; private VariableNode root; VariableModel() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -