📄 codeui.java
字号:
codeList.getLocationOnScreen().y + event.getY()); } final int currentLine = codeList.locationToIndex(new Point(event.getX(), event.getY())) + 1; SwingUtilities.invokeLater(new Runnable() { public void run() { codeList.setSelectedIndex(currentLine - 1); } }); JPopupMenu popupMenu = createPopupMenu(currentFile, currentLine); popupMenu.setLocation(menuLocation); popupMenu.setInvoker(codeList); popupMenu.setVisible(true); } } private JPopupMenu createPopupMenu(final File codeFile, final int lineNr) { final Integer executableAddress = breakpoints.getExecutableAddressOf(codeFile, lineNr); boolean breakpointExists = false; if (executableAddress != null) { breakpointExists = breakpoints.breakpointExists(executableAddress); } JPopupMenu menuMotePlugins = new JPopupMenu(); JMenuItem headerMenuItem = new JMenuItem("Breakpoints:"); headerMenuItem.setEnabled(false); menuMotePlugins.add(headerMenuItem); menuMotePlugins.add(new JSeparator()); JMenuItem addBreakpointMenuItem = new JMenuItem("Add breakpoint on line " + lineNr); if (executableAddress == null || breakpointExists) { addBreakpointMenuItem.setEnabled(false); } else { addBreakpointMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { breakpoints.addBreakpoint(codeFile, lineNr, executableAddress); } }); } menuMotePlugins.add(addBreakpointMenuItem); JMenuItem delBreakpointMenuItem = new JMenuItem("Delete breakpoint on line " + lineNr); if (executableAddress == null || !breakpointExists) { delBreakpointMenuItem.setEnabled(false); } else { delBreakpointMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { breakpoints.removeBreakpoint(executableAddress); } }); } menuMotePlugins.add(delBreakpointMenuItem); return menuMotePlugins; } private class CodeListModel extends AbstractListModel { private Vector<String> codeData; public CodeListModel(Vector<String> codeData) { super(); this.codeData = codeData; } public int getSize() { if (codeData == null || codeData.isEmpty()) { return 0; } return codeData.size(); } public Object getElementAt(int index) { if (codeData == null || codeData.isEmpty()) { return "No code to display"; } return codeData.get(index); } } /* FROM: http://www.rgagnon.com/javadetails/java-0306.html, 03/19/2008 */ private static String stringToHTMLString(String string) { StringBuffer sb = new StringBuffer(string.length()); boolean lastWasBlankChar = false; int len = string.length(); char c; for (int i = 0; i < len; i++) { c = string.charAt(i); if (c == ' ') { if (lastWasBlankChar) { lastWasBlankChar = false; sb.append(" "); } else { lastWasBlankChar = true; sb.append(' '); } } else { lastWasBlankChar = false; // // HTML Special Chars if (c == '"') { sb.append("""); } else if (c == '&') { sb.append("&"); } else if (c == '<') { sb.append("<"); } else if (c == '>') { sb.append(">"); } else if (c == '\n') { // Handle Newline sb.append("<br/>"); } else { int ci = 0xffff & c; if (ci < 160 ) { // nothing special only 7 Bit sb.append(c); } else { // Not 7 Bit use the unicode system sb.append("&#"); sb.append(new Integer(ci).toString()); sb.append(';'); } } } } return sb.toString(); } private class CodeCellRenderer extends JLabel implements ListCellRenderer { private int currentIndex; public CodeCellRenderer(int currentLineNr) { this.currentIndex = currentLineNr - 1; } public void changeCurrentLine(int currentLineNr) { this.currentIndex = currentLineNr - 1; } private String getColoredLabelText(int lineNr, int lineStartPos, Token[] tokens, String code) { String html = "<html>"; /* Add line number */ html += "<font color=\"333333\">" + lineNr + ": </font>"; /* Add code */ if (tokens == null || tokens.length == 0 || lineStartPos < 0) { html += "<font color=\"000000\">" + code + "</font>"; } else { for (int i=tokens.length-1; i >= 0; i--) { Token subToken = tokens[i]; String colorString = "000000"; /* Determine code color */ final int type = subToken.symbol.type; switch (type) { case TokenTypes.COMMENT: case TokenTypes.START_COMMENT: case TokenTypes.MID_COMMENT: case TokenTypes.END_COMMENT: colorString = "00AA00"; break; case TokenTypes.STRING: colorString = "0000AA"; break; case TokenTypes.KEYWORD: case TokenTypes.KEYWORD2: colorString = "AA0000"; break; } /* Extract part of token residing in current line */ int tokenLinePos; String subCode; if (subToken.position < lineStartPos) { subCode = subToken.symbol.name.substring(lineStartPos - subToken.position); tokenLinePos = 0; } else if (subToken.position + subToken.symbol.name.length() > lineStartPos + code.length()) { subCode = subToken.symbol.name.substring(0, code.length() + lineStartPos - subToken.position); tokenLinePos = subToken.position - lineStartPos; } else { subCode = subToken.symbol.name; tokenLinePos = subToken.position - lineStartPos; } subCode = stringToHTMLString(subCode); String firstPart = code.substring(0, tokenLinePos); String coloredSubCode = "<font color=\"" + colorString + "\">" + subCode + "</font>"; String lastPart = tokenLinePos + subToken.symbol.name.length() >= code.length()? "":code.substring(tokenLinePos + subToken.symbol.name.length()); code = firstPart + coloredSubCode + lastPart; } code = code.replace(" ", " "); html += code; } html += "</html>"; return html; } public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { int lineNr = index + 1; if (tokensArray != null && index < tokensArray.length && tokensArray[index] != null) { setText(getColoredLabelText(lineNr, tokensStartPos[index], tokensArray[index], (String) value)); } else { setText(getColoredLabelText(lineNr, 0, null, (String) value)); } if (index == currentIndex) { setBackground(Color.green); } else if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } setEnabled(list.isEnabled()); Integer executableAddress = breakpoints.getExecutableAddressOf(currentFile, lineNr); if (breakpoints.breakpointExists(executableAddress)) { setFont(list.getFont().deriveFont(Font.BOLD)); } else { setFont(list.getFont()); } setOpaque(true); return this; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -