gdx-studio

#libgdx#java#desktop

git clone https://git.pyrossh.dev/gdx-studio

An IDE for creating Games using libgdx and Java supported on all platforms Android, iOS, Desktop


src/gdxstudio/Editor.java
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 {
			try {
				jls.getJarManager().addCurrentJreClassFileSource();
			} catch (IllegalArgumentException e) {
				// JDK 9+ has no rt.jar/classes.jar for LibraryInfo.getMainJreJarInfo()
				// to find; core JDK classes just won't get autocomplete support.
			}
			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();
    }
}