package de.lazyzero.kkMulticopterFlashTool.gui;
import static lu.tudor.santec.i18n.Translatrix._;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rsyntaxtextarea.Theme;
import org.fife.ui.rtextarea.RTextScrollPane;
import org.fife.ui.rtextarea.SearchContext;
import org.fife.ui.rtextarea.SearchEngine;
import com.jgoodies.forms.builder.ButtonBarBuilder2;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.lazyzero.kkMulticopterFlashTool.KKMulticopterFlashTool;
import de.lazyzero.kkMulticopterFlashTool.gui.widgets.GithubPanel;
import de.lazyzero.kkMulticopterFlashTool.gui.widgets.GithubPanelListener;
import de.lazyzero.kkMulticopterFlashTool.utils.avra.Avra;
import de.lazyzero.kkMulticopterFlashTool.utils.avra.SimonKAvraCommandLine;
import de.lazyzero.kkMulticopterFlashTool.utils.download.Download;
/**
* A simple example showing how to use RSyntaxTextArea to add Java syntax
* highlighting to a Swing application.
* <p>
*
* This example uses RSyntaxTextArea 2.0.1.
* <p>
*
* Project Home: http://fifesoft.com/rsyntaxtextarea<br>
* Downloads: https://sourceforge.net/projects/rsyntaxtextarea
*/
public class SimonkEditorPanel extends JPanel implements ActionListener, GithubPanelListener, DocumentListener {
private static final long serialVersionUID = 1L;
KKMulticopterFlashTool parent;
private RSyntaxTextArea tgyTextArea;
private JButton compileButton;
private JButton saveButton;
private ButtonBarBuilder2 bar;
private JButton saveCompileButton;
private CellConstraints cc;
private GithubPanel githubPanel;
private JTabbedPane tabs;
private RSyntaxTextArea incTextArea;
private boolean tgyChanged;
private boolean incChanged;
public SimonkEditorPanel(KKMulticopterFlashTool parent) {
this.parent = parent;
//create the CellContraints
cc = new CellConstraints();
// create the Layout for Panel this
String panelColumns = "fill:pref:grow";
String panelRows = "pref,3dlu,fill:pref:grow,3dlu,pref";
FormLayout formLayout = new FormLayout(panelColumns, panelRows);
this.setLayout(formLayout);
githubPanel = new GithubPanel("sim-/tgy");
githubPanel.addGithubPanelListener(this);
tgyTextArea = new RSyntaxTextArea(20, 60);
tgyTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_ASSEMBLER_X86);
tgyTextArea.setCodeFoldingEnabled(true);
tgyTextArea.setAntiAliasingEnabled(true);
RTextScrollPane tgyEditorPane = new RTextScrollPane(tgyTextArea);
tgyEditorPane.setFoldIndicatorEnabled(true);
tgyEditorPane.setLineNumbersEnabled(true);
incTextArea = new RSyntaxTextArea(20, 60);
incTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_ASSEMBLER_X86);
incTextArea.setCodeFoldingEnabled(true);
incTextArea.setAntiAliasingEnabled(true);
RTextScrollPane incEditorPane = new RTextScrollPane(incTextArea);
incEditorPane.setFoldIndicatorEnabled(true);
incEditorPane.setLineNumbersEnabled(true);
tabs = new JTabbedPane();
tabs.add("empty",tgyEditorPane);
tabs.add("empty",incEditorPane);
saveButton = new JButton(_("save"));
saveButton.addActionListener(this);
saveButton.setEnabled(false);
compileButton = new JButton(_("compile"));
compileButton.addActionListener(this);
compileButton.setEnabled(false);
saveCompileButton = new JButton(_("save") + " & " +_("compile"));
saveCompileButton.addActionListener(this);
saveCompileButton.setEnabled(false);
bar = new ButtonBarBuilder2();
bar.addButton(saveButton);
bar.addButton(compileButton);
bar.addGlue();
bar.addUnrelatedGap();
bar.addButton(saveCompileButton);
this.add(githubPanel, cc.xy(1, 1));
this.add(tabs, cc.xy(1, 3));
this.add(bar.getPanel(), cc.xy(1, 5));
try {
Theme theme = Theme.load(SimonkEditorPanel.class.getResourceAsStream("/de/lazyzero/kkMulticopterFlashTool/gui/widgets/dark.xml"));
theme.apply(tgyTextArea);
theme.apply(incTextArea);
} catch (IOException ioe) { // Never happens
ioe.printStackTrace();
}
}
private boolean setLinetoFirstof(RSyntaxTextArea area, String text) {
SearchContext context = new SearchContext();
if (text.length() == 0) {
return false;
}
area.setCaretPosition(0);
context.setSearchFor(text);
context.setMatchCase(true);
context.setRegularExpression(false);
context.setSearchForward(true);
context.setWholeWord(false);
return SearchEngine.find(area, context).wasFound();
}
private String readFile(String file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
return stringBuilder.toString();
}
private boolean writeFile(RSyntaxTextArea rSysntaxTextArea, String filename) {
byte dataToWrite[] = rSysntaxTextArea.getText().getBytes();
FileOutputStream out;
try {
out = new FileOutputStream(filename);
out.write(dataToWrite);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(saveButton)) {
if (tgyChanged) {
tgyChanged = !writeFile(tgyTextArea, githubPanel.getPath() + File.separatorChar + "tgy.asm");
tabs.setTitleAt(0, "tgy.asm - " + githubPanel.getVersion());
}
if (incChanged) {
incChanged = !writeFile(incTextArea, githubPanel.getPath() + File.separatorChar + githubPanel.getTarget() + ".inc");
tabs.setTitleAt(1, githubPanel.getTarget() + ".inc - " + githubPanel.getVersion());
}
enableSave();
} else if (e.getSource().equals(compileButton)) {
parent.clearText();
parent.println(_("compile.simonk.start"));
File sources = new File(githubPanel.getPath());
Avra avra = new Avra(this.parent, new SimonKAvraCommandLine(githubPanel.getTarget(), sources));
if(avra.compile()) {
// parent.clearText();
parent.println(_("compile.simonk.success"));
parent.setHexFile(avra.getHexFile(), false);
avra.clean();
} else {
parent.err("Compiling failed.");
parent.switch2ProgrammingTab();
}
} else if (e.getSource().equals(saveCompileButton)) {
saveButton.doClick();
compileButton.doClick();
}
}
@Override
public void githubPanelChanged(int state) {
System.out.println("downloadStateChanged: " + state);
if (state == Download.COMPLETE) {
try {
System.out.println("Open File from: " + githubPanel.getPath());
tgyTextArea.setText(readFile(githubPanel.getPath() + File.separatorChar + "tgy.asm"));
setLinetoFirstof(tgyTextArea, ".equ");
tabs.setTitleAt(0, "tgy.asm - " + githubPanel.getVersion());
tgyTextArea.getDocument().addDocumentListener(this);
tgyChanged = false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (state == Download.DOWNLOADING) {
tgyTextArea.setText("");
tgyTextArea.revalidate();
tgyTextArea.repaint();
incTextArea.setText("");
incTextArea.revalidate();
incTextArea.repaint();
tabs.setTitleAt(0, _("empty"));
tabs.setTitleAt(1, _("empty"));
tgyTextArea.getDocument().removeDocumentListener(this);
incTextArea.getDocument().removeDocumentListener(this);
tgyChanged = false;
incChanged = false;
} else if (state == GithubPanel.TARGET_CHANGED) {
try {
incTextArea.setText(readFile(githubPanel.getPath() + File.separatorChar + githubPanel.getTarget() + ".inc"));
setLinetoFirstof(incTextArea, ".equ");
tabs.setTitleAt(1, githubPanel.getTarget() + ".inc - " + githubPanel.getVersion());
incTextArea.getDocument().addDocumentListener(this);
incChanged = false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
enableSave();
}
private void enableSave() {
saveButton.setEnabled(incChanged || tgyChanged);
saveCompileButton.setEnabled(incChanged || tgyChanged);
enableCompile();
}
private void enableCompile() {
compileButton.setEnabled(!incChanged && !tgyChanged);
}
@Override
public void insertUpdate(DocumentEvent e) {
}
@Override
public void removeUpdate(DocumentEvent e) {
}
@Override
public void changedUpdate(DocumentEvent e) {
if (e.getDocument().equals(tgyTextArea.getDocument())) {
tabs.setTitleAt(0, "*tgy.asm - " + githubPanel.getVersion());
tgyChanged = true;
} else if (e.getDocument().equals(incTextArea.getDocument())) {
tabs.setTitleAt(1, "*" + githubPanel.getTarget() + ".inc - " + githubPanel.getVersion());
incChanged = true;
}
System.out.println("changedUpdate: " + e.getLength());
enableSave();
}
}