/******************************************************************************* * Rhythos Editor is a game editor and project management tool for making RPGs on top of the Rhythos Game system. * * Copyright (C) 2013 David Maletz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package mrpg.script; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory; import org.fife.ui.rsyntaxtextarea.TokenMakerFactory; import org.fife.ui.rsyntaxtextarea.folding.CurlyFoldParser; import org.fife.ui.rsyntaxtextarea.folding.FoldParserManager; import mrpg.editor.MapEditor; import mrpg.editor.WorkspaceBrowser; import mrpg.editor.resource.Project; import mrpg.editor.resource.Script; public class ScriptEditor extends JFrame implements ScriptTextPane.ModifiedListener, ActionListener { private static final long serialVersionUID = 2350041509426603391L; private ScriptTextPane textPane; private Script script; private static ScriptEditor instance; private JMenuItem save; private ScriptEditor(){ super("Script Editor"); textPane = new ScriptTextPane(700,500); setContentPane(textPane); textPane.initSearchDialogs(this); JMenuBar bar = new JMenuBar(); JMenu menu = new JMenu("File"); save = MapEditor.createMenuItemIcon("Save", MapEditor.SAVE, KeyEvent.VK_S, ActionEvent.CTRL_MASK, this); menu.add(save); bar.add(menu); bar.add(textPane.createViewMenu()); bar.add(textPane.createSearchMenu()); setJMenuBar(bar); setDefaultCloseOperation(HIDE_ON_CLOSE); setIconImages(MapEditor.getWindowIcon()); pack(); MapEditor.addFrame("script", this); } public void setModified(boolean modified){ if(script != null){script.setModified(modified); save.setEnabled(modified); MapEditor.instance.updateSaveButtons();} } public void actionPerformed(ActionEvent e) { if(script != null && script.isModified()) try{script.save(); MapEditor.instance.updateSaveButtons();}catch(Exception ex){} } public void setScript(Script s){ if(script != null) script.setScript(textPane.getText()); script = s; textPane.loadDocument(script.getScript(), script.isModified(), this); save.setEnabled(script.isModified()); } public static void show(Script script){ if(instance == null) instance = new ScriptEditor(); instance.textPane.setParser(new HaxeParser(WorkspaceBrowser.getProject(script), script)); instance.setScript(script); instance.setVisible(true); } public static void onSave(Script script){ if(instance != null && script == instance.script) instance.textPane.onSave(); } public static void loadScript(Script script){ if(instance != null && script == instance.script) script.setScript(instance.textPane.getText()); } public static void update(Script script){ if(instance != null && script == instance.script){ instance.textPane.loadDocument(script.getScript(), script.isModified(), instance); instance.save.setEnabled(script.isModified()); } } public static void compiled(Project p){ if(instance != null && WorkspaceBrowser.getProject(instance.script) == p){ instance.textPane.reparse(); } } public static void init(){ ((AbstractTokenMakerFactory)TokenMakerFactory.getDefaultInstance()).putMapping(ScriptTextPane.SYNTAX_STYLE_HAXE, "org.fife.ui.rsyntaxtextarea.modes.HaxeTokenMaker"); FoldParserManager.get().addFoldParserMapping(ScriptTextPane.SYNTAX_STYLE_HAXE, new CurlyFoldParser()); } }