/* * (c) 2005-2009 Carlos G�mez Rodr�guez, todos los derechos reservados / all rights reserved. * Licencia en license/bsd.txt / License in license/bsd.txt * * Created at regulus on 23-jul-2005 22:27:32 * as file JSyntaxBSHCodePanel.java on package org.f2o.absurdum.puck.gui.panels */ package org.f2o.absurdum.puck.gui.panels.code; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.StringTokenizer; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.BadLocationException; import javax.swing.text.EditorKit; import javax.swing.undo.UndoManager; import jsyntaxpane.CompoundUndoMan; import jsyntaxpane.DefaultSyntaxKit; import jsyntaxpane.actions.DocumentSearchData; import jsyntaxpane.components.Markers; import org.f2o.absurdum.puck.gui.SpacingPanel; import org.f2o.absurdum.puck.gui.codeassist.CodeAssistMenuHandler; import org.f2o.absurdum.puck.gui.codeassist.CodeInsertActionBuilder; import org.f2o.absurdum.puck.gui.panels.EntityPanel; import org.f2o.absurdum.puck.i18n.UIMessages; import org.f2o.absurdum.puck.util.swing.EnhancedJEditTextArea; import org.jedit.syntax.JEditTextArea; import org.jedit.syntax.JavaTokenMarker; import org.jedit.syntax.SyntaxDocument; import org.jedit.syntax.TextAreaDefaults; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; /** * @author carlos * * Created at regulus, 23-jul-2005 22:27:32 */ public class JSyntaxBSHCodePanel extends BSHCodePanel { //private JEditorPane jep; //private EnhancedJEditTextArea jep; private JEditorPane jep; private JButton enlButton = new JButton(UIMessages.getInstance().getMessage("button.enl")); private JSyntaxBSHCodeFrame auxFrame; //context attribute: specifies which type of panel it is, used to know which code templates are available on menus private String context; //entity panel corresponding to this code panel, if any. private EntityPanel entityPanel; final JLabel lineNumLabel = new JLabel(" : "); /* private void updateLineNumberLabel() { int line = jep.getCaretLine(); int lineCount = jep.getLineCount(); int column = jep.getCaretPosition() - jep.getLineStartOffset(line); lineNumLabel.setText((line+1) + " : " + (column+1)); lineNumLabel.setMinimumSize(new Dimension(200,0)); } */ public void unsetCodeFrame() { auxFrame = null; } private void updateLineNumberLabel() { int line = JSyntaxBSHCodeFrame.getCaretRowPosition(jep); //jep. .getCaretLine(); //int lineCount = 0; //getCaretColumnPosition(jep); //jep .getLineCount(); int column = JSyntaxBSHCodeFrame.getCaretColumnPosition(jep); //jep.getCaretPosition() - jep .getLineStartOffset(line); lineNumLabel.setText((line+1) + " : " + (column+1)); } public String getContext() { return context; } public JSyntaxBSHCodePanel ( ) { this ( "noContext" ); } private DocumentSearchData searchData = null; private void saveSearchDialogs() { searchData = (DocumentSearchData)jep.getDocument().getProperty("SearchData"); } void restoreSearchDialogs() { jep.getDocument().putProperty("SearchData",searchData); } public JSyntaxBSHCodePanel ( String context ) { this ( context, null ); } public String getPanelName() { if ( entityPanel == null ) return "Code editing"; else return entityPanel.getPanelName() + " - " + "Code editing"; } public JSyntaxBSHCodePanel ( String context , EntityPanel ep ) { this.context = context; this.entityPanel = ep; setBorder(BorderFactory.createTitledBorder(UIMessages.getInstance().getMessage("bsh.code"))); //jep = new JEditorPane(); TextAreaDefaults tad = new TextAreaDefaults(); tad.rows = 25; tad.cols = 80; DefaultSyntaxKit.initKit(); jep = new JEditorPane(); //jep = new JEditTextArea(tad); //jep.setDocument(new SyntaxDocument()); //jep.setTokenMarker(new JavaTokenMarker()); setLayout(new BorderLayout()); //JScrollPane jsp = new JScrollPane(jep); auxFrame = new JSyntaxBSHCodeFrame(getPanelName(),jep,context,this); //jsp.setPreferredSize(new Dimension(120,70)); //add(jsp,BorderLayout.CENTER); //jep.setPreferredSize(new Dimension(120,70)); JScrollPane jsp = new JScrollPane(jep); jsp.setPreferredSize(new Dimension(120,70)); add(new SpacingPanel(jsp),BorderLayout.CENTER); JPanel southPanel = new JPanel(); southPanel.setLayout(new BorderLayout()); southPanel.add(enlButton,BorderLayout.CENTER); JPanel lineNumPanel = new JPanel(); lineNumPanel.add(lineNumLabel); lineNumPanel.setMinimumSize(new Dimension(200,100)); lineNumPanel.setPreferredSize(new Dimension(40,1)); southPanel.add(lineNumPanel,BorderLayout.EAST); add(new SpacingPanel(southPanel),BorderLayout.SOUTH); //add(enlButton,BorderLayout.SOUTH); enlButton.addActionListener ( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { Markers.removeMarkers(jep); //jep.getDocument().putProperty("SearchData",null); //with this we discard the find/replace dialog instances associated with the document. saveSearchDialogs(); //TODO: remove the previous line when JSyntaxPane is updated so that dialogs are associated to (document,editor) pairs rather than to documents. auxFrame.refresh(); auxFrame.setVisible(true); } } ); //jep.addPopupMenu(CodeAssistMenuHandler.getInstance().getMenuForContext(context, new CodeInsertActionBuilder(jep))); jep.addCaretListener ( new CaretListener() { public void caretUpdate(CaretEvent e) { updateLineNumberLabel(); //lineNumLabel.setText("line: " + (jep.getCaretLine()+1) + "/" + jep.getLineCount()); } } ); jep.setContentType("text/java"); //jep.setFont(jep.getFont().deriveFont((float)18.0)); jep.getComponentPopupMenu().add(CodeAssistMenuHandler.getInstance().getMenuForContext(context, new CodeInsertActionBuilder(jep)),0); jep.getComponentPopupMenu().add(new JSeparator(),1); } public String getCode() { return jep.getText(); } public Node getXML ( Document d ) { if (jep.getText() == null || jep.getText().length() == 0) return null; Element result = d.createElement("Code"); result.setAttribute("language","BeanShell"); /* System.err.println(this); System.err.println(jep.getText()); String text = jep.getText(); System.err.println("t1: " + text.indexOf("\n")); System.err.println("t2: " + text.indexOf("\n\r")); System.err.println("t3: " + text.indexOf("\r")); System.err.println("t4: " +text.indexOf("\r\n")); System.err.println("t5: " +text.indexOf("\n\n")); try { text = jep.getDocument().getText(0, jep.getDocument().getLength()-1); } catch ( BadLocationException ble ) {} System.err.println("t1: " + text.indexOf("\n")); System.err.println("t2: " + text.indexOf("\n\r")); System.err.println("t3: " + text.indexOf("\r")); System.err.println("t4: " +text.indexOf("\r\n")); System.err.println("t5: " +text.indexOf("\n\n")); */ //result.appendChild(d.createCDATASection(jep.getText())); try { result.appendChild(d.createCDATASection(jep.getDocument().getText(0, jep.getDocument().getLength()))); } catch ( BadLocationException ble ) { ble.printStackTrace(); } return result; } //from Code node public void initFromXML ( org.w3c.dom.Node n ) { NodeList nl = n.getChildNodes(); String theCode = ""; //jep.setText(""); for ( int i = 0 ; i < nl.getLength() ; i++ ) { Node child = nl.item(i); if ( child instanceof Text ) { theCode = theCode + child.getNodeValue(); //jep.setText(jep.getText()+child.getNodeValue()); } } jep.setText(theCode.trim()); //jep.setContentType("text/java"); /* EditorKit ek = jep.getEditorKit(); ek.deinstall(jep); ek.install(jep); */ ((jsyntaxpane.SyntaxDocument)jep.getDocument()).clearUndos(); /* jsyntaxpane.SyntaxDocument doc = (jsyntaxpane.SyntaxDocument)jep.getDocument(); UndoManager um = (UndoManager) doc.getUndoableEditListeners()[0]; doc.removeUndoableEditListener(um); doc.addUndoableEditListener(new CompoundUndoMan(doc)); */ } }