📄 xtree.java
字号:
} tree.setModel(_model); //so we need to be in the event-dispatching thread. tree.expandRow(0); currentMode = mode; } public void valueChanged(TreeSelectionEvent tse) { JTree source = (JTree) tse.getSource(); if (source.isSelectionEmpty()) return; XTreeNode node = (XTreeNode) source.getSelectionPath().getLastPathComponent(); if (node.getIndex() == -1) { parent.getTextArea().grabFocus(); return; } try { insert(node.getIndex() - 1); } catch (Exception e) { } source.setSelectionPath(source.getPathForRow(-1)); } public void reload(DefaultTreeModel model) { // tree.setModel(model); this.treeModel = model; } public void actionPerformed(ActionEvent evt) { Object o = evt.getSource(); if (o == expand) { for (int i = 0; i < tree.getRowCount(); i++) tree.expandRow(i); } else if (o == collapse) { for (int i = tree.getRowCount(); i >= 0; i--) tree.collapseRow(i); } else if (o == reload) { root.removeAllChildren(); treeModel.reload(); init("jext.insert.xml", false); associateXTreeToMode(false); ArrayList instances = Jext.getInstances(); for (int i = 0; i < instances.size(); i++) { JextFrame instance = (JextFrame) instances.get(i); if (instance != parent) { instance.getXTree().reload(treeModel); instance.getXTree().associateXTreeToMode(false); } } } else if (o == carriageReturn) Jext.setProperty("carriage", carriageReturn.isSelected() ? "on" : "off"); else if (o == executeScript) Jext.setProperty("execute", executeScript.isSelected() ? "on" : "off"); else if (o == textSurrounding) Jext.setProperty("surrounding", textSurrounding.isSelected() ? "on" : "off"); } private void insert(int index) throws BadLocationException { char c = '\0'; XTreeItem item = (XTreeItem) inserts.elementAt(index); String data = item.getContent(); boolean script = item.isScript(); boolean mixed = item.isMixed(); StringBuffer _buf = new StringBuffer(data.length()); for (int i = 0; i < data.length(); i++) { if( (c = data.charAt(i)) == '\\' && i < data.length() - 1) { switch (data.charAt(i + 1)) { case 'n': i++; _buf.append('\n'); break; case 't': i++; _buf.append('\t'); break; case '\\': i++; _buf.append('\\'); break; } } else _buf.append(c); } data = _buf.toString(); JextTextArea textArea = parent.getTextArea(); if (script && executeScript.isSelected()) { Run.execute(data, parent); } else { textArea.beginProtectedCompoundEdit(); boolean indent = textArea.getEnterIndent(); Document doc = textArea.getDocument(); String surroundText = ""; if (textArea.getSelectionStart() != textArea.getSelectionEnd()) { surroundText = textArea.getSelectedText(); textArea.setSelectedText(""); } _buf = new StringBuffer(data.length()); int caretState = 0; int insertPos = 0; int lastBreak = -1; int wordStart = textArea.getCaretPosition(); int caret = data.length(); StringBuffer mixedScript = new StringBuffer(30); boolean parsing = false; boolean onFirstLine = true, wasFirstLine = false;out: for (int i = 0 ; i < data.length(); i++) { switch (c = data.charAt(i)) { case '|': if (parsing) mixedScript.append('|'); else { if (i < data.length() - 1 && data.charAt(i + 1) == '|') { i++; _buf.append('|'); } else { if (caretState == 0) { caret = insertPos + _buf.length(); caretState = 1; if (onFirstLine) wasFirstLine = true; } } } break; case '\n': if (parsing) { mixedScript.append('\n'); break; } if (indent && !onFirstLine) { doc.insertString(wordStart + insertPos, _buf.toString(), null); insertPos += _buf.length(); _buf = new StringBuffer(data.length() - _buf.length()); int tempLen = doc.getLength(); Indent.indent(textArea, textArea.getCaretLine(), true, true); int indentLen = doc.getLength() - tempLen; if (caretState == 1) { if (!wasFirstLine) caret += indentLen; caretState = 2; } insertPos += indentLen; wasFirstLine = false; } _buf.append('\n'); onFirstLine = false; lastBreak = i; break; case '%': if (mixed) { if (i < data.length() - 1 && data.charAt(i + 1) == '%') { i++; (parsing ? mixedScript : _buf).append('%'); } else if (parsing) { parsing = false; try { if (!DawnParser.isInitialized()) { DawnParser.init(); DawnParser.installPackage(Jext.class, "dawn-jext.scripting"); } DawnParser parser = new DawnParser(new StringReader(mixedScript.toString())); parser.setProperty("JEXT.JEXT_FRAME", parent); parser.exec(); if (!parser.getStack().isEmpty()) _buf.append(parser.popString()); } catch (DawnRuntimeException dre) { JOptionPane.showMessageDialog(parent, dre.getMessage(), Jext.getProperty("dawn.script.error"), JOptionPane.ERROR_MESSAGE); } mixedScript = new StringBuffer(30); } else { parsing = true; } break; } default: (parsing ? mixedScript : _buf).append(c); } } doc.insertString(wordStart + insertPos, _buf.toString(), null); if (!onFirstLine) { int tempLen = doc.getLength(); Indent.indent(textArea, textArea.getCaretLine(), true, true); if (lastBreak < caret && caretState <= 1) caret += doc.getLength() - tempLen; } int caretPos = wordStart + caret; int tempLen = doc.getLength(); if (caretPos > tempLen) caretPos = tempLen; if (surroundText.length() > 0 && textSurrounding.isSelected()) doc.insertString(caretPos, surroundText, null); textArea.setCaretPosition(caretPos); textArea.endProtectedCompoundEdit(); } textArea.grabFocus(); } private static final ImageIcon[] leaves = { Utilities.getIcon("images/tree_leaf.gif", Jext.class), Utilities.getIcon("images/tree_leaf_script.gif", Jext.class), Utilities.getIcon("images/tree_leaf_mixed.gif", Jext.class) }; class XTreeCellRenderer extends DefaultTreeCellRenderer { XTreeCellRenderer() { super(); openIcon = Utilities.getIcon("images/tree_open.gif", Jext.class); closedIcon = Utilities.getIcon("images/tree_close.gif", Jext.class); textSelectionColor = Color.red; borderSelectionColor = tree.getBackground(); backgroundSelectionColor = tree.getBackground(); } public Component getTreeCellRendererComponent(JTree source, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (leaf) { TreePath path = source.getPathForRow(row); if (path != null) { XTreeNode node = (XTreeNode) path.getLastPathComponent(); int index = node.getIndex(); if (index != -1) { leafIcon = leaves[((XTreeItem) inserts.elementAt(index - 1)).getType()]; } } } return super.getTreeCellRendererComponent(source, value, sel, expanded, leaf, row, hasFocus); } }}// End of XTree.java
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -