Craig Raw
5 years ago
commit
813fbedeb7
13 changed files with 560 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||
.idea |
|||
.gradle |
|||
*iml |
|||
build |
|||
/*.properties |
|||
out |
|||
*.log |
@ -0,0 +1,25 @@ |
|||
plugins { |
|||
id 'application' |
|||
id 'org.openjfx.javafxplugin' version '0.0.8' |
|||
} |
|||
|
|||
group 'com.craigraw' |
|||
version '1.0-SNAPSHOT' |
|||
|
|||
sourceCompatibility = 1.8 |
|||
|
|||
repositories { |
|||
mavenCentral() |
|||
} |
|||
|
|||
javafx { |
|||
version = "14" |
|||
modules = [ 'javafx.controls', 'javafx.fxml' ] |
|||
} |
|||
|
|||
dependencies { |
|||
implementation project(':drongo') |
|||
testCompile group: 'junit', name: 'junit', version: '4.12' |
|||
} |
|||
|
|||
mainClassName = 'com.craigraw.sparrow.MainApp' |
Binary file not shown.
@ -0,0 +1,5 @@ |
|||
distributionBase=GRADLE_USER_HOME |
|||
distributionPath=wrapper/dists |
|||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.2-bin.zip |
|||
zipStoreBase=GRADLE_USER_HOME |
|||
zipStorePath=wrapper/dists |
@ -0,0 +1,172 @@ |
|||
#!/usr/bin/env sh |
|||
|
|||
############################################################################## |
|||
## |
|||
## Gradle start up script for UN*X |
|||
## |
|||
############################################################################## |
|||
|
|||
# Attempt to set APP_HOME |
|||
# Resolve links: $0 may be a link |
|||
PRG="$0" |
|||
# Need this for relative symlinks. |
|||
while [ -h "$PRG" ] ; do |
|||
ls=`ls -ld "$PRG"` |
|||
link=`expr "$ls" : '.*-> \(.*\)$'` |
|||
if expr "$link" : '/.*' > /dev/null; then |
|||
PRG="$link" |
|||
else |
|||
PRG=`dirname "$PRG"`"/$link" |
|||
fi |
|||
done |
|||
SAVED="`pwd`" |
|||
cd "`dirname \"$PRG\"`/" >/dev/null |
|||
APP_HOME="`pwd -P`" |
|||
cd "$SAVED" >/dev/null |
|||
|
|||
APP_NAME="Gradle" |
|||
APP_BASE_NAME=`basename "$0"` |
|||
|
|||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
|||
DEFAULT_JVM_OPTS='"-Xmx64m"' |
|||
|
|||
# Use the maximum available, or set MAX_FD != -1 to use that value. |
|||
MAX_FD="maximum" |
|||
|
|||
warn () { |
|||
echo "$*" |
|||
} |
|||
|
|||
die () { |
|||
echo |
|||
echo "$*" |
|||
echo |
|||
exit 1 |
|||
} |
|||
|
|||
# OS specific support (must be 'true' or 'false'). |
|||
cygwin=false |
|||
msys=false |
|||
darwin=false |
|||
nonstop=false |
|||
case "`uname`" in |
|||
CYGWIN* ) |
|||
cygwin=true |
|||
;; |
|||
Darwin* ) |
|||
darwin=true |
|||
;; |
|||
MINGW* ) |
|||
msys=true |
|||
;; |
|||
NONSTOP* ) |
|||
nonstop=true |
|||
;; |
|||
esac |
|||
|
|||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar |
|||
|
|||
# Determine the Java command to use to start the JVM. |
|||
if [ -n "$JAVA_HOME" ] ; then |
|||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then |
|||
# IBM's JDK on AIX uses strange locations for the executables |
|||
JAVACMD="$JAVA_HOME/jre/sh/java" |
|||
else |
|||
JAVACMD="$JAVA_HOME/bin/java" |
|||
fi |
|||
if [ ! -x "$JAVACMD" ] ; then |
|||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME |
|||
|
|||
Please set the JAVA_HOME variable in your environment to match the |
|||
location of your Java installation." |
|||
fi |
|||
else |
|||
JAVACMD="java" |
|||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
|||
|
|||
Please set the JAVA_HOME variable in your environment to match the |
|||
location of your Java installation." |
|||
fi |
|||
|
|||
# Increase the maximum file descriptors if we can. |
|||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then |
|||
MAX_FD_LIMIT=`ulimit -H -n` |
|||
if [ $? -eq 0 ] ; then |
|||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then |
|||
MAX_FD="$MAX_FD_LIMIT" |
|||
fi |
|||
ulimit -n $MAX_FD |
|||
if [ $? -ne 0 ] ; then |
|||
warn "Could not set maximum file descriptor limit: $MAX_FD" |
|||
fi |
|||
else |
|||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" |
|||
fi |
|||
fi |
|||
|
|||
# For Darwin, add options to specify how the application appears in the dock |
|||
if $darwin; then |
|||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" |
|||
fi |
|||
|
|||
# For Cygwin, switch paths to Windows format before running java |
|||
if $cygwin ; then |
|||
APP_HOME=`cygpath --path --mixed "$APP_HOME"` |
|||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` |
|||
JAVACMD=`cygpath --unix "$JAVACMD"` |
|||
|
|||
# We build the pattern for arguments to be converted via cygpath |
|||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` |
|||
SEP="" |
|||
for dir in $ROOTDIRSRAW ; do |
|||
ROOTDIRS="$ROOTDIRS$SEP$dir" |
|||
SEP="|" |
|||
done |
|||
OURCYGPATTERN="(^($ROOTDIRS))" |
|||
# Add a user-defined pattern to the cygpath arguments |
|||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then |
|||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" |
|||
fi |
|||
# Now convert the arguments - kludge to limit ourselves to /bin/sh |
|||
i=0 |
|||
for arg in "$@" ; do |
|||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` |
|||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option |
|||
|
|||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition |
|||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` |
|||
else |
|||
eval `echo args$i`="\"$arg\"" |
|||
fi |
|||
i=$((i+1)) |
|||
done |
|||
case $i in |
|||
(0) set -- ;; |
|||
(1) set -- "$args0" ;; |
|||
(2) set -- "$args0" "$args1" ;; |
|||
(3) set -- "$args0" "$args1" "$args2" ;; |
|||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;; |
|||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; |
|||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; |
|||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; |
|||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; |
|||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; |
|||
esac |
|||
fi |
|||
|
|||
# Escape application args |
|||
save () { |
|||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done |
|||
echo " " |
|||
} |
|||
APP_ARGS=$(save "$@") |
|||
|
|||
# Collect all arguments for the java command, following the shell quoting and substitution rules |
|||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" |
|||
|
|||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong |
|||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then |
|||
cd "$(dirname "$0")" |
|||
fi |
|||
|
|||
exec "$JAVACMD" "$@" |
@ -0,0 +1,84 @@ |
|||
@if "%DEBUG%" == "" @echo off |
|||
@rem ########################################################################## |
|||
@rem |
|||
@rem Gradle startup script for Windows |
|||
@rem |
|||
@rem ########################################################################## |
|||
|
|||
@rem Set local scope for the variables with windows NT shell |
|||
if "%OS%"=="Windows_NT" setlocal |
|||
|
|||
set DIRNAME=%~dp0 |
|||
if "%DIRNAME%" == "" set DIRNAME=. |
|||
set APP_BASE_NAME=%~n0 |
|||
set APP_HOME=%DIRNAME% |
|||
|
|||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
|||
set DEFAULT_JVM_OPTS="-Xmx64m" |
|||
|
|||
@rem Find java.exe |
|||
if defined JAVA_HOME goto findJavaFromJavaHome |
|||
|
|||
set JAVA_EXE=java.exe |
|||
%JAVA_EXE% -version >NUL 2>&1 |
|||
if "%ERRORLEVEL%" == "0" goto init |
|||
|
|||
echo. |
|||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
|||
echo. |
|||
echo Please set the JAVA_HOME variable in your environment to match the |
|||
echo location of your Java installation. |
|||
|
|||
goto fail |
|||
|
|||
:findJavaFromJavaHome |
|||
set JAVA_HOME=%JAVA_HOME:"=% |
|||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe |
|||
|
|||
if exist "%JAVA_EXE%" goto init |
|||
|
|||
echo. |
|||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% |
|||
echo. |
|||
echo Please set the JAVA_HOME variable in your environment to match the |
|||
echo location of your Java installation. |
|||
|
|||
goto fail |
|||
|
|||
:init |
|||
@rem Get command-line arguments, handling Windows variants |
|||
|
|||
if not "%OS%" == "Windows_NT" goto win9xME_args |
|||
|
|||
:win9xME_args |
|||
@rem Slurp the command line arguments. |
|||
set CMD_LINE_ARGS= |
|||
set _SKIP=2 |
|||
|
|||
:win9xME_args_slurp |
|||
if "x%~1" == "x" goto execute |
|||
|
|||
set CMD_LINE_ARGS=%* |
|||
|
|||
:execute |
|||
@rem Setup the command line |
|||
|
|||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar |
|||
|
|||
@rem Execute Gradle |
|||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% |
|||
|
|||
:end |
|||
@rem End local scope for the variables with windows NT shell |
|||
if "%ERRORLEVEL%"=="0" goto mainEnd |
|||
|
|||
:fail |
|||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of |
|||
rem the _cmd.exe /c_ return code! |
|||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 |
|||
exit /b 1 |
|||
|
|||
:mainEnd |
|||
if "%OS%"=="Windows_NT" endlocal |
|||
|
|||
:omega |
@ -0,0 +1,3 @@ |
|||
rootProject.name = 'sparrow' |
|||
include 'drongo' |
|||
|
@ -0,0 +1,64 @@ |
|||
package com.craigraw.sparrow; |
|||
|
|||
import com.craigraw.drongo.psbt.PSBT; |
|||
import javafx.event.ActionEvent; |
|||
import javafx.fxml.FXML; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.fxml.Initializable; |
|||
import javafx.scene.Parent; |
|||
import javafx.scene.control.Tab; |
|||
import javafx.scene.control.TabPane; |
|||
import javafx.stage.FileChooser; |
|||
import javafx.stage.Stage; |
|||
import org.bouncycastle.util.encoders.Hex; |
|||
|
|||
import java.io.File; |
|||
import java.io.FileInputStream; |
|||
import java.io.IOException; |
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class AppController implements Initializable { |
|||
|
|||
@FXML |
|||
private TabPane tabs; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
public void open(ActionEvent event) { |
|||
Stage window = new Stage(); |
|||
|
|||
FileChooser fileChooser = new FileChooser(); |
|||
File file = fileChooser.showOpenDialog(window); |
|||
if (file != null) { |
|||
System.out.println(file); |
|||
//openFile(file);
|
|||
|
|||
if(file.exists()) { |
|||
try { |
|||
byte[] bytes = new byte[(int)file.length()]; |
|||
FileInputStream stream = new FileInputStream(file); |
|||
stream.read(bytes); |
|||
stream.close(); |
|||
|
|||
if(PSBT.isPSBT(Hex.toHexString(bytes))) { |
|||
PSBT psbt = new PSBT(bytes); |
|||
|
|||
Tab tab = new Tab(file.getName()); |
|||
FXMLLoader transactionLoader = new FXMLLoader(getClass().getResource("transaction.fxml")); |
|||
tab.setContent(transactionLoader.load()); |
|||
TransactionController controller = transactionLoader.getController(); |
|||
controller.setPSBT(psbt); |
|||
|
|||
tabs.getTabs().add(tab); |
|||
} |
|||
} catch(IOException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,26 @@ |
|||
package com.craigraw.sparrow; |
|||
|
|||
import javafx.application.Application; |
|||
import javafx.fxml.FXMLLoader; |
|||
import javafx.scene.Parent; |
|||
import javafx.scene.Scene; |
|||
import javafx.stage.Stage; |
|||
|
|||
public class MainApp extends Application { |
|||
|
|||
@Override |
|||
public void start(Stage stage) throws Exception { |
|||
Parent root = FXMLLoader.load(getClass().getResource("app.fxml")); |
|||
|
|||
Scene scene = new Scene(root); |
|||
scene.getStylesheets().add(getClass().getResource("app.css").toExternalForm()); |
|||
|
|||
stage.setTitle("Sparrow"); |
|||
stage.setScene(scene); |
|||
stage.show(); |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
launch(args); |
|||
} |
|||
} |
@ -0,0 +1,114 @@ |
|||
package com.craigraw.sparrow; |
|||
|
|||
import com.craigraw.drongo.protocol.*; |
|||
import com.craigraw.drongo.psbt.PSBT; |
|||
import javafx.fxml.FXML; |
|||
import javafx.fxml.Initializable; |
|||
import javafx.scene.control.TreeCell; |
|||
import javafx.scene.control.TreeItem; |
|||
import javafx.scene.control.TreeView; |
|||
import javafx.scene.control.cell.TextFieldTreeCell; |
|||
import javafx.util.Callback; |
|||
import javafx.util.StringConverter; |
|||
|
|||
import java.net.URL; |
|||
import java.util.ResourceBundle; |
|||
|
|||
public class TransactionController implements Initializable { |
|||
|
|||
@FXML |
|||
private TreeView<TransactionPart> txtree; |
|||
|
|||
private Transaction transaction; |
|||
private PSBT psbt; |
|||
|
|||
@Override |
|||
public void initialize(URL location, ResourceBundle resources) { |
|||
|
|||
} |
|||
|
|||
private void initialiseTxTree() { |
|||
TreeItem<TransactionPart> rootItem = new TreeItem<>(transaction); |
|||
rootItem.setExpanded(true); |
|||
|
|||
InputsPart inputsPart = new InputsPart(); |
|||
TreeItem<TransactionPart> inputsItem = new TreeItem<TransactionPart>(inputsPart); |
|||
for(TransactionInput input : transaction.getInputs()) { |
|||
TreeItem<TransactionPart> inputItem = new TreeItem<>(input); |
|||
inputsItem.getChildren().add(inputItem); |
|||
} |
|||
|
|||
OutputsPart outputsPart = new OutputsPart(); |
|||
TreeItem<TransactionPart> outputsItem = new TreeItem<TransactionPart>(outputsPart); |
|||
for(TransactionOutput output : transaction.getOutputs()) { |
|||
TreeItem<TransactionPart> outputItem = new TreeItem<>(output); |
|||
outputsItem.getChildren().add(outputItem); |
|||
} |
|||
|
|||
rootItem.getChildren().add(inputsItem); |
|||
rootItem.getChildren().add(outputsItem); |
|||
txtree.setRoot(rootItem); |
|||
|
|||
txtree.setCellFactory(new Callback<TreeView<TransactionPart>, TreeCell<TransactionPart>>() { |
|||
@Override |
|||
public TreeCell<TransactionPart> call(TreeView<TransactionPart> p) { |
|||
return new TextFieldTreeCell<TransactionPart>(new StringConverter<TransactionPart>(){ |
|||
|
|||
@Override |
|||
public String toString(TransactionPart part) { |
|||
if(part instanceof Transaction) { |
|||
Transaction transaction = (Transaction)part; |
|||
return "Tx " + transaction.getTxId().toString().substring(0, 6) + "..."; |
|||
} else if(part instanceof InputsPart) { |
|||
return "Inputs"; |
|||
} else if(part instanceof OutputsPart) { |
|||
return "Outputs"; |
|||
} else if(part instanceof TransactionInput) { |
|||
TransactionInput input = (TransactionInput)part; |
|||
return "Input #" + input.getIndex(); |
|||
} else if(part instanceof TransactionOutput) { |
|||
TransactionOutput output = (TransactionOutput)part; |
|||
return "Output #" + output.getIndex(); |
|||
} |
|||
|
|||
return part.toString(); |
|||
} |
|||
|
|||
@Override |
|||
public TransactionPart fromString(String string) { |
|||
throw new IllegalStateException("No fromString"); |
|||
} |
|||
}); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
public void setPSBT(PSBT psbt) { |
|||
this.psbt = psbt; |
|||
this.transaction = psbt.getTransaction(); |
|||
|
|||
initialiseTxTree(); |
|||
} |
|||
|
|||
private static class InputsPart extends TransactionPart { |
|||
public InputsPart() { |
|||
super(new byte[0], 0); |
|||
} |
|||
|
|||
@Override |
|||
protected void parse() throws ProtocolException { |
|||
|
|||
} |
|||
} |
|||
|
|||
private static class OutputsPart extends TransactionPart { |
|||
public OutputsPart() { |
|||
super(new byte[0], 0); |
|||
} |
|||
|
|||
@Override |
|||
protected void parse() throws ProtocolException { |
|||
|
|||
} |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" fx:controller="com.craigraw.sparrow.AppController" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1"> |
|||
<children> |
|||
<MenuBar> |
|||
<menus> |
|||
<Menu mnemonicParsing="false" text="File"> |
|||
<items> |
|||
<MenuItem text="_Open..." onAction="#open" /> |
|||
<MenuItem mnemonicParsing="false" text="Close" /> |
|||
</items> |
|||
</Menu> |
|||
<Menu mnemonicParsing="false" text="Edit"> |
|||
<items> |
|||
<MenuItem mnemonicParsing="false" text="Delete" /> |
|||
</items> |
|||
</Menu> |
|||
<Menu mnemonicParsing="false" text="Help"> |
|||
<items> |
|||
<MenuItem mnemonicParsing="false" text="About" /> |
|||
</items> |
|||
</Menu> |
|||
</menus> |
|||
</MenuBar> |
|||
<TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="ALWAYS" fx:id="tabs" /> |
|||
|
|||
<Label alignment="BOTTOM_LEFT" text="Label" /> |
|||
</children> |
|||
</VBox> |
@ -0,0 +1,28 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<?import java.lang.*?> |
|||
<?import java.util.*?> |
|||
<?import javafx.scene.*?> |
|||
<?import javafx.scene.control.*?> |
|||
<?import javafx.scene.layout.*?> |
|||
|
|||
<SplitPane dividerPositions="0.7" orientation="VERTICAL" prefHeight="200.0" prefWidth="160.0" VBox.vgrow="ALWAYS" fx:controller="com.craigraw.sparrow.TransactionController" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1"> |
|||
<items> |
|||
<SplitPane dividerPositions="0.4" prefHeight="160.0" prefWidth="200.0"> |
|||
<items> |
|||
<TreeView prefHeight="154.0" prefWidth="174.0" fx:id="txtree" /> |
|||
<ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="200.0" prefWidth="200.0"> |
|||
<content> |
|||
<TableView prefHeight="200.0" prefWidth="200.0" fx:id="txnode"> |
|||
<columns> |
|||
<TableColumn prefWidth="75.0" text="Name" /> |
|||
<TableColumn prefWidth="300.0" text="Value" /> |
|||
</columns> |
|||
</TableView> |
|||
</content> |
|||
</ScrollPane> |
|||
</items> |
|||
</SplitPane> |
|||
<TextArea /> |
|||
</items> |
|||
</SplitPane> |
Loading…
Reference in new issue