package gdxstudio; import gdxstudio.panel.ConsolePanel; import java.awt.Color; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.io.File; import java.io.IOException; import javax.swing.Timer; import javax.swing.ToolTipManager; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.BadLocationException; import org.fife.rsta.ac.LanguageSupport; import org.fife.rsta.ac.LanguageSupportFactory; import org.fife.rsta.ac.java.JavaLanguageSupport; import org.fife.ui.autocomplete.DefaultCompletionProvider; import org.fife.ui.rsyntaxtextarea.RSyntaxTextAreaHighlighter; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rsyntaxtextarea.TextEditorPane; import org.fife.ui.rtextarea.SearchContext; import org.fife.ui.rtextarea.SearchEngine; final public class Editor extends TextEditorPane { private static final long serialVersionUID = 1L; static DefaultCompletionProvider provider = new DefaultCompletionProvider(); public static SearchContext context = new SearchContext(); final private Timer saveTimer = new Timer(60000, new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { save(); } }); float zoomSize = 13; public Editor(){ super(TextEditorPane.INSERT_MODE, true); saveTimer.start(); setMargin(new Insets(0, 0, 0, 0)); setMarginLineEnabled(true); setMarginLineColor(new Color(248,248,248)); //FIXME color not changing setAntiAliasingEnabled(true); setAutoIndentEnabled(true); setBracketMatchingEnabled(true); setUseFocusableTips(true); setTabSize(4); setLineWrap(true); setWrapStyleWord(true); setTabsEmulated(true); load(); setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); LanguageSupportFactory lsf = LanguageSupportFactory.get(); LanguageSupport support = lsf.getSupportFor(SYNTAX_STYLE_JAVA); LanguageSupportFactory.get().register(this); ToolTipManager.sharedInstance().registerComponent(this); JavaLanguageSupport jls = (JavaLanguageSupport)support; jls.getParser(this).setEnabled(false); try { jls.getJarManager().addCurrentJreClassFileSource(); jls.setAutoActivationEnabled(true); jls.setAutoCompleteEnabled(true); jls.setAutoActivationDelay(50); String filename = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile(); if(filename.endsWith(".jar")) jls.getJarManager().addClassFileSource(new File(filename)); jls.install(this); } catch (IOException ioe) { ioe.printStackTrace(); } ((RSyntaxTextAreaHighlighter ) getHighlighter()).setDrawsLayeredHighlights(false); addFocusListener(new FocusListener(){ @Override public void focusGained(FocusEvent arg0) { saveTimer.start(); } @Override public void focusLost(FocusEvent arg0) { saveTimer.stop(); save(); } }); addCaretListener(new CaretListener(){ @Override public void caretUpdate(CaretEvent e) { StatusBar.updateCaret(getCaretLineNumber()+1, getCaretOffsetFromLineStart()+1); } }); } public void load(){ if(Frame.scenePanel.selectedValueExists()){ setText(Export.readFile("source/"+Frame.scenePanel.getSelectedValue()+".java")); setCaretPosition(0); setDirty(false); } } @Override public void save(){ if(isDirty()){ if(Frame.scenePanel.selectedValueExists()){ Export.writeFile("source/"+Frame.scenePanel.getSelectedValue()+".java", getText()); ConsolePanel.compile(Frame.scenePanel.getSelectedValue()); setDirty(false); } } } public void zoomin(){ zoomSize += 1; setFont(getFont().deriveFont(zoomSize)); } public void zoomout(){ zoomSize -= 1; setFont(getFont().deriveFont(zoomSize)); } public void find(String text){ context.setSearchFor(text); SearchEngine.find(this, context); } public void replace(String text, String replaceText){ context.setSearchFor(text); context.setReplaceWith(replaceText); SearchEngine.replace(this, context); } public void replaceAll(String text, String replaceText){ context.setSearchFor(text); context.setReplaceWith(replaceText); SearchEngine.replaceAll(this, context); } public void addWarning(int line, String tip){ if(getLineCount() >= line){ try { Content.editorScroll.getGutter().addLineTrackingIcon(line-1, Icon.icon("warning"), tip); } catch (BadLocationException e){ e.printStackTrace(); } } } public void addError(int line, String tip){ if(getLineCount() >= line){ try { Content.editorScroll.getGutter().addLineTrackingIcon(line-1, Icon.icon("error"), tip); } catch (BadLocationException e){ e.printStackTrace(); } } } public void clearIcons(){ Content.editorScroll.getGutter().removeAllTrackingIcons(); } }