Serpent editor to support save/load files
This commit is contained in:
parent
0be061fddf
commit
0e62e5b58f
|
@ -37,6 +37,11 @@
|
|||
<copy file="./target/classes/system.properties" todir="./target/package/ethereumj/config"/>
|
||||
<copy file="./target/classes/GeoLiteCity.dat" todir="./target/package/ethereumj/config"/>
|
||||
|
||||
<copy todir="./target/package/ethereumj/samples">
|
||||
<fileset dir="./samples"/>
|
||||
</copy>
|
||||
|
||||
|
||||
|
||||
<zip destfile="ethereumj-${DSTAMP}-${TSTAMP}.zip" basedir="./target/package">
|
||||
</zip>
|
||||
|
|
|
@ -92,6 +92,12 @@ public class SystemProperties {
|
|||
return Integer.parseInt(prop.getProperty("peer.discovery.port"));
|
||||
}
|
||||
|
||||
public String samplesDir(){
|
||||
if(prop.isEmpty()) return "samples";
|
||||
return prop.getProperty("samples.dir");
|
||||
}
|
||||
|
||||
|
||||
public String toString() {
|
||||
Enumeration<?> e = prop.propertyNames();
|
||||
while (e.hasMoreElements()) {
|
||||
|
|
|
@ -10,9 +10,13 @@ import java.awt.event.ActionEvent;
|
|||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.io.*;
|
||||
import java.util.Scanner;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.ethereum.config.SystemProperties.CONFIG;
|
||||
|
||||
/**
|
||||
* www.ethereumJ.com
|
||||
* User: Roman Mandeleil
|
||||
|
@ -46,7 +50,7 @@ public class SerpentEditor extends JFrame {
|
|||
"\n" +
|
||||
"return(0)\n";
|
||||
|
||||
private String codeSample3 = "\n" +
|
||||
private String defaultCode = "\n" +
|
||||
"\n" +
|
||||
"init: \n" +
|
||||
"\n" +
|
||||
|
@ -69,6 +73,7 @@ public class SerpentEditor extends JFrame {
|
|||
final JSplitPane splitPanel;
|
||||
final JTextArea result;
|
||||
final JPanel contentPane;
|
||||
JFileChooser fileChooser = null;
|
||||
|
||||
public SerpentEditor() {
|
||||
|
||||
|
@ -88,7 +93,7 @@ public class SerpentEditor extends JFrame {
|
|||
codeArea.setSyntaxEditingStyle("text/serpent");
|
||||
codeArea.setCodeFoldingEnabled(true);
|
||||
codeArea.setAntiAliasingEnabled(true);
|
||||
codeArea.setText(codeSample3);
|
||||
codeArea.setText(defaultCode);
|
||||
|
||||
changeStyleProgrammatically();
|
||||
|
||||
|
@ -103,6 +108,7 @@ public class SerpentEditor extends JFrame {
|
|||
splitPanel.setContinuousLayout(true);
|
||||
|
||||
|
||||
|
||||
contentPane.add(splitPanel, BorderLayout.CENTER);
|
||||
splitPanel.add(sp);
|
||||
|
||||
|
@ -123,6 +129,7 @@ public class SerpentEditor extends JFrame {
|
|||
|
||||
contentPane.add(controlsPanel, BorderLayout.SOUTH);
|
||||
|
||||
|
||||
createToolBar();
|
||||
|
||||
setContentPane(contentPane);
|
||||
|
@ -130,6 +137,8 @@ public class SerpentEditor extends JFrame {
|
|||
|
||||
|
||||
pack();
|
||||
this.revalidate();
|
||||
this.repaint();
|
||||
|
||||
}
|
||||
|
||||
|
@ -187,19 +196,20 @@ public class SerpentEditor extends JFrame {
|
|||
} catch (Throwable th) {
|
||||
th.printStackTrace();
|
||||
|
||||
splitPanel.setDividerLocation(0.7);
|
||||
splitPanel.setDividerLocation(0.8);
|
||||
result.setVisible(true);
|
||||
result.setText(th.getMessage());
|
||||
result.setForeground(Color.RED);
|
||||
return ;
|
||||
|
||||
}
|
||||
|
||||
result.setForeground(Color.BLACK.brighter());
|
||||
result.setVisible(true);
|
||||
result.setText(asmResult);
|
||||
|
||||
splitPanel.setDividerLocation(0.7);
|
||||
splitPanel.setDividerLocation(
|
||||
1 - result.getPreferredSize().getHeight() / codeArea.getPreferredSize().getHeight());
|
||||
|
||||
this.repaint();
|
||||
}
|
||||
|
||||
|
@ -245,10 +255,7 @@ public class SerpentEditor extends JFrame {
|
|||
toolbar.setFloatable(false);
|
||||
final JPanel mainContentPane = SerpentEditor.this.contentPane;
|
||||
|
||||
|
||||
|
||||
{
|
||||
|
||||
java.net.URL url = ClassLoader.getSystemResource("buttons/open-file.png");
|
||||
Toolkit kit = Toolkit.getDefaultToolkit();
|
||||
Image img = kit.createImage(url);
|
||||
|
@ -273,7 +280,21 @@ public class SerpentEditor extends JFrame {
|
|||
new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
System.out.println("open file");
|
||||
|
||||
File file = callFileChooser();
|
||||
try {
|
||||
if (file == null) return;
|
||||
String content = new Scanner(file).useDelimiter("\\Z").next();
|
||||
codeArea.setText(content);
|
||||
|
||||
} catch (FileNotFoundException e1) {
|
||||
|
||||
e1.printStackTrace();
|
||||
} catch (java.util.NoSuchElementException e2){
|
||||
|
||||
// don't worry it's just the file is empty
|
||||
codeArea.setText("");
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -306,7 +327,26 @@ public class SerpentEditor extends JFrame {
|
|||
new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
System.out.println("save file");
|
||||
|
||||
File file = null;
|
||||
if (fileChooser == null) file = callFileChooser();
|
||||
else{
|
||||
|
||||
if (fileChooser.getSelectedFile() == null){
|
||||
file = callFileChooser();
|
||||
}else{
|
||||
|
||||
file = fileChooser.getSelectedFile();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
BufferedWriter out = new BufferedWriter(new FileWriter(file), 32768);
|
||||
out.write(codeArea.getText());
|
||||
out.close();
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -431,6 +471,27 @@ public class SerpentEditor extends JFrame {
|
|||
this.contentPane.add(toolbar, BorderLayout.EAST);
|
||||
}
|
||||
|
||||
|
||||
protected File callFileChooser(){
|
||||
|
||||
File file = null;
|
||||
|
||||
if (fileChooser == null) {
|
||||
fileChooser = new JFileChooser(CONFIG.samplesDir());
|
||||
fileChooser.setMultiSelectionEnabled(false);
|
||||
}
|
||||
|
||||
switch (fileChooser.showOpenDialog(SerpentEditor.this))
|
||||
{
|
||||
case JFileChooser.APPROVE_OPTION:
|
||||
|
||||
file = fileChooser.getSelectedFile();
|
||||
break;
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Start all Swing applications on the EDT.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
|
|
|
@ -36,3 +36,8 @@ peer.discovery.timeout = 2
|
|||
# retrieved from the peer [seconds]
|
||||
transaction.approve.timeout = 5
|
||||
|
||||
|
||||
# default directory where we keep
|
||||
# basic Serpent samples relative
|
||||
# to home.dir
|
||||
samples.dir = samples
|
|
@ -0,0 +1,34 @@
|
|||
|
||||
|
||||
# the sample is good example how one can
|
||||
# save program that manage his own currency
|
||||
|
||||
init:
|
||||
|
||||
# this part run only on init stage
|
||||
# we are about to set the maxim
|
||||
# amount of currency
|
||||
contract.storage[0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826] = 1000000
|
||||
code:
|
||||
|
||||
|
||||
# the currency manager
|
||||
# support two functions
|
||||
if msg.datasize == 1:
|
||||
|
||||
# 1. balance check
|
||||
addr = msg.data[0]
|
||||
return(contract.storage[addr])
|
||||
else:
|
||||
|
||||
# 2. balance manipulation
|
||||
from = msg.sender
|
||||
fromvalue = contract.storage[from]
|
||||
to = msg.data[0]
|
||||
value = msg.data[1]
|
||||
if fromvalue >= value:
|
||||
contract.storage[from] = fromvalue - value
|
||||
contract.storage[to] = contract.storage[to] + value
|
||||
return(1)
|
||||
else:
|
||||
return(0)
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
# The sample demonstrates how you
|
||||
# can simply create a program running
|
||||
# on top of chain and saving values for
|
||||
# futre use
|
||||
if !(contract.storage[msg.data[0]]):
|
||||
contract.storage[msg.data[0]] = msg.data[1]
|
||||
return(1)
|
||||
else:
|
||||
return(0)
|
Loading…
Reference in New Issue