├── .gitignore ├── settings.gradle ├── examples ├── src │ ├── test │ │ └── frege │ │ │ └── DummyTest.fr │ └── main │ │ └── frege │ │ └── fregefx │ │ └── example │ │ ├── HelloWorldAsyncIO.fr │ │ └── HelloWorld.fr └── build.gradle ├── fregefx ├── src │ ├── test │ │ └── frege │ │ │ └── DummyTest.fr │ └── main │ │ ├── java │ │ └── org │ │ │ └── frege │ │ │ └── JavaFxWorld.java │ │ ├── frege │ │ └── fregefx │ │ │ ├── JavaFxType.fr │ │ │ └── JavaFxUtils.fr │ │ └── java8 │ │ └── org │ │ └── frege │ │ ├── FregeEventHandler.java │ │ ├── FregeChangeListener.java │ │ └── FregeFX.java ├── build.gradle └── types.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── .idea ├── vcs.xml ├── libraries │ └── Gradle__org_frege_lang_frege_3_24_400.xml ├── gradle.xml └── modules.xml ├── allJavaFX.groovy ├── fregefx.iml ├── LICENSE.txt ├── gradlew.bat ├── README.md └── gradlew /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build 3 | target 4 | out 5 | *_ 6 | generated 7 | .settings -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'fregefx' 2 | 3 | include 'fregefx' 4 | include 'examples' -------------------------------------------------------------------------------- /examples/src/test/frege/DummyTest.fr: -------------------------------------------------------------------------------- 1 | module DummyTest where 2 | 3 | import Test.QuickCheck 4 | 5 | dummy = once true -------------------------------------------------------------------------------- /fregefx/src/test/frege/DummyTest.fr: -------------------------------------------------------------------------------- 1 | module DummyTest where 2 | 3 | import Test.QuickCheck 4 | 5 | dummy = once true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Frege/FregeFX/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | group = org.frege-lang 2 | version = 0.8.2-SNAPSHOT 3 | 4 | 5 | fregeRelease = 3.24public 6 | fregeVersion = 3.24.400 7 | 8 | javaTarget = 1.8 9 | -------------------------------------------------------------------------------- /fregefx/src/main/java/org/frege/JavaFxWorld.java: -------------------------------------------------------------------------------- 1 | package org.frege; 2 | 3 | public interface JavaFxWorld { 4 | public static final JavaFxWorld INSTANCE = new JavaFxWorld() {}; 5 | } 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Apr 14 14:03:34 CEST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip 7 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_frege_lang_frege_3_24_400.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /allJavaFX.groovy: -------------------------------------------------------------------------------- 1 | def base = '/Users/dierkkoenig/Downloads/javafx-src/' 2 | File sources = new File(base) 3 | 4 | sources.eachFileRecurse { File file -> 5 | def name = file.path - base 6 | if (! name.endsWith(".java")) return 7 | if (! name.contains("javafx")) return 8 | if (name.contains("com/sun")) return 9 | 10 | name -= ".java" 11 | 12 | def className = name.replaceAll(/\//, '.' ) 13 | 14 | println "processing $name" 15 | 16 | "gradlew -DnativeClassName=$className -DoutputFile=build/generated/frege/${name}.fr :preFregeFX:fNG".execute() 17 | 18 | sleep 3000 19 | } -------------------------------------------------------------------------------- /fregefx/src/main/frege/fregefx/JavaFxType.fr: -------------------------------------------------------------------------------- 1 | module fregefx.JavaFxType where 2 | 3 | --- Analogon to Realworld 4 | data JFXWorld = pure native org.frege.JavaFxWorld 5 | 6 | --- Analogon to IO 7 | type JFX = ST JFXWorld 8 | 9 | -- in STM is it like so 10 | --data JFX a = JFX (ST JFXWorld a) 11 | --atomically :: JFX α -> IO α 12 | --atomically (State s a) = return a 13 | 14 | --- Analogon to MutableIO 15 | type MutableJFX = Mutable JFXWorld 16 | 17 | --- Analogon to IOMutable 18 | type JFXMutable d = JFX (MutableJFX d) 19 | 20 | --- A mutable reference to a value in the JFX context 21 | type JFXRef a = MutableJFX (Ref a) 22 | -------------------------------------------------------------------------------- /fregefx.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 21 | 22 | -------------------------------------------------------------------------------- /fregefx/src/main/java8/org/frege/FregeEventHandler.java: -------------------------------------------------------------------------------- 1 | package org.frege; 2 | 3 | import frege.prelude.PreludeBase; 4 | import frege.run8.Func; 5 | import frege.run8.Lazy; 6 | import frege.run8.Thunk; 7 | import frege.runtime.Phantom.RealWorld; 8 | import javafx.event.Event; 9 | import javafx.event.EventHandler; 10 | 11 | // type t -> IO () ==> Func.U> 12 | 13 | public class FregeEventHandler implements EventHandler { 14 | protected Func.U> lambda; 15 | 16 | public FregeEventHandler(Func.U> lambda) { 17 | this.lambda = lambda; 18 | } 19 | 20 | @Override 21 | public void handle(T event) { 22 | Lazy lazyEvent = Thunk.lazy(event); 23 | try { 24 | PreludeBase.TST.performUnsafe( lambda.apply(lazyEvent).call() ).call(); 25 | } catch(RuntimeException re) { 26 | re.printStackTrace(); 27 | throw re; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /examples/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | // use if java sources have to be compiled 3 | //project.tasks.compileFrege.dependsOn(project.tasks.compileJava) // make java compile first 4 | //sourceSets { 5 | // main { 6 | // java { 7 | // compileClasspath += project.files("build/classes/main") 8 | // } 9 | // } 10 | //} 11 | 12 | 13 | apply plugin: 'application' 14 | 15 | mainClassName = "fregefx.example.HelloWorld" 16 | 17 | dependencies { 18 | compile project(':fregefx') 19 | } 20 | 21 | def javaVersion = System.getProperty('java.version') ?: "unknown-version" 22 | def jdk8 = javaVersion.startsWith("1.8") 23 | def jdk9 = javaVersion.startsWith("9.") 24 | 25 | if (! (jdk8 || jdk9)) { 26 | println "You should be using Java 8 or 9 (with JavaFX module) but you run $javaVersion ." 27 | } 28 | 29 | 30 | fregeQuickCheck { 31 | // help = true // default: false 32 | // listAvailable = true // default: false 33 | // verbose = false // default: true 34 | // num = 500 // default: 100 35 | // includePredicates = ['myFirstPred', 'mySecondPred'] 36 | // excludePredicates = ['myFirstPred', 'mySecondPred'] 37 | // moduleName = 'DummyTest' // prio 1 38 | // moduleJar = 'path/to/my/module.jar' // prio 2 39 | // moduleDir = "$project.buildDir/classes/test" // prio 3, default 40 | // classpathDirectories = ["$project.buildDir/classes/main", "$project.buildDir/classes/test"] 41 | // allJvmArgs = ['-Xss4M'] 42 | } 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /fregefx/src/main/java8/org/frege/FregeChangeListener.java: -------------------------------------------------------------------------------- 1 | package org.frege; 2 | 3 | import javafx.beans.value.ChangeListener; 4 | import javafx.beans.value.ObservableValue; 5 | import frege.runtime.Phantom.RealWorld; 6 | import frege.prelude.PreludeBase; 7 | import frege.run8.Func; 8 | import frege.run8.Lazy; 9 | import frege.run8.Thunk; 10 | 11 | //type t -> IO () ==> Func.U>> 12 | 13 | public class FregeChangeListener implements ChangeListener { 14 | protected Func.U>> lambda; 15 | 16 | public FregeChangeListener(Func.U>> lambda) { 17 | this.lambda = lambda; 18 | } 19 | 20 | /** 21 | * @param observable It is by design that we do not make use of the of this object. It would introduce more coupling. 22 | */ 23 | @Override 24 | public void changed(ObservableValue observable, T oldValue, T newValue) { 25 | try { 26 | Lazy alt = Thunk.lazy(oldValue); 27 | Lazy neu = Thunk.lazy(newValue); 28 | PreludeBase.TST.performUnsafe(lambda.apply(alt).call().apply(neu).call()).call(); 29 | // Applicable inter = lambda.apply(oldValue).apply(newValue); 30 | // Delayed.forced(inter.apply(null).result().forced()); // the second argument is the IO context 31 | } catch(RuntimeException re) { 32 | re.printStackTrace(); 33 | throw re; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /examples/src/main/frege/fregefx/example/HelloWorldAsyncIO.fr: -------------------------------------------------------------------------------- 1 | {-- 2 | Like HelloWorld but running all IO actions outside the UI Application thread 3 | asynchronously but in strict order. Pretty much an actor. 4 | -} 5 | module fregefx.example.HelloWorldAsyncIO where 6 | 7 | import frege.Prelude hiding(ListView) 8 | import fregefx.JavaFxType 9 | import fregefx.JavaFxAll 10 | import fregefx.JavaFxUtils 11 | 12 | import Control.Concurrent 13 | 14 | type IOQueue = MVar (IO ()) 15 | 16 | main args = do 17 | ioQ <- MVar.newEmpty 18 | FregeFX.launch $ withStage (buildUI ioQ) -- runs in UI Thread 19 | loop ioQ -- runs in main Thread 20 | 21 | loop :: IOQueue -> IO() 22 | loop ioQ = do 23 | ioAction <- ioQ.take 24 | result <- ioAction 25 | loop ioQ 26 | 27 | runIn :: IOQueue -> IO() -> IO () 28 | runIn ioQ ioAction = 29 | ioQ.put ioAction >> return () 30 | 31 | 32 | buildUI :: Family a => IOQueue -> a -> Stage -> JFX a 33 | buildUI ioQ root stage = do 34 | stage.setTitle "FregeFX Hello World" 35 | root <: do 36 | vbox <- VBox.new 5d :: JFX VBox 37 | vbox.setPadding =<< insets 10 38 | vbox <: do 39 | button <- Button.new "Please click me for JFX action" 40 | button `action_` (button.setText "Thanks!") -- IO forbidden by type 41 | vbox <: do 42 | button <- Button.new "Print async to console." 43 | button `actionIO_` (runIn ioQ (println "Printing asynchronously outside") ) -- JFX change forbidden by type 44 | 45 | 46 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | Copyright © 2011-2015, Ingo Wechsung 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or 7 | without modification, are permitted provided that the following 8 | conditions are met: 9 | 10 | Redistributions of source code must retain the above copyright 11 | notice, this list of conditions and the following disclaimer. 12 | 13 | Redistributions in binary form must reproduce the above 14 | copyright notice, this list of conditions and the following 15 | disclaimer in the documentation and/or other materials provided 16 | with the distribution. 17 | 18 | Neither the name of the copyright holder nor the names of its 19 | contributors may be used to endorse or promote products derived 20 | from this software without specific prior written permission. 21 | 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26 | COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 27 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 28 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 30 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 32 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 33 | THE POSSIBILITY OF SUCH DAMAGE. 34 | 35 | 36 | -------------------------------------------------------------------------------- /fregefx/src/main/java8/org/frege/FregeFX.java: -------------------------------------------------------------------------------- 1 | package org.frege; 2 | 3 | import frege.runtime.*; 4 | import frege.runtime.Phantom.RealWorld; 5 | import frege.prelude.PreludeBase; 6 | import frege.run8.Func; 7 | import frege.run8.Lazy; 8 | import frege.run8.Thunk; 9 | import javafx.application.Application; 10 | import javafx.fxml.FXMLLoader; 11 | import javafx.scene.Parent; 12 | import javafx.scene.control.Label; 13 | import javafx.stage.Stage; 14 | 15 | // The type of Stage -> IO () is 16 | // Func.U> 17 | 18 | import java.io.IOException; 19 | 20 | public class FregeFX extends Application { 21 | private static Func.U> lambda; 22 | 23 | @Override 24 | public void start(Stage primaryStage) throws Exception { 25 | final Lazy lazyStage= Thunk.lazy(primaryStage); 26 | try { 27 | PreludeBase.TST.performUnsafe(lambda.apply(lazyStage).call()).call(); 28 | } catch(RuntimeException re) { 29 | re.printStackTrace(); 30 | throw re; 31 | } 32 | } 33 | 34 | /** 35 | * @param callback The callback lambda that will receive the primaryStage to work on. 36 | */ 37 | public static void launch(Func.U> callback) { 38 | lambda = callback; 39 | Application.launch(); 40 | } 41 | 42 | public static Parent fxml(String className, String resourceName ) { 43 | try { 44 | return FXMLLoader.load(Class.forName(className).getClass().getResource(resourceName)); 45 | } catch (ClassNotFoundException e) { 46 | e.printStackTrace(); 47 | } catch (IOException e) { 48 | e.printStackTrace(); 49 | } catch (NullPointerException e) { 50 | e.printStackTrace(); 51 | } 52 | return new Label("could not load " + resourceName); 53 | } 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /examples/src/main/frege/fregefx/example/HelloWorld.fr: -------------------------------------------------------------------------------- 1 | {-- 2 | A simple example of a JavaFX UI with Frege: 3 | a group with a vbox of two buttons plus simple onAction handlers. 4 | UI construction follows a _builder_ style approach, 5 | i.e. the implementation details of how to add sub nodes to a parent is hidden 6 | but the containment structure is visible in the code layout. 7 | -} 8 | module fregefx.example.HelloWorld where 9 | 10 | import frege.Prelude hiding(ListView) 11 | import fregefx.JavaFxType 12 | import fregefx.JavaFxAll 13 | import fregefx.JavaFxUtils 14 | 15 | import Control.Concurrent 16 | 17 | main args = do 18 | FregeFX.launch $ withStage buildUI -- runs in UI Thread 19 | 20 | buildUI :: Family a => a -> Stage -> JFX a 21 | buildUI root stage = do 22 | stage.setTitle "FregeFX Hello World" 23 | root <: do 24 | vbox <- VBox.new 5d :: JFX VBox 25 | vbox.setPadding =<< insets 10 26 | vbox <: do 27 | button <- Button.new "Please click me for JFX action" 28 | button `action_` (button.setText "Thanks!") -- IO forbidden by type 29 | vbox <: do 30 | button <- Button.new "Print current thread to console" 31 | button `actionIO_` do -- JFX change forbidden by type 32 | thread <- Thread.current() 33 | name <- thread.getName 34 | println $ "thread is " ++ name 35 | vbox <: do 36 | button <- Button.new "Bridge from async IO to JFX inside UI thread" 37 | bridgeAction button (Thread.current() >>= _.getName) button.setText 38 | vbox <: do 39 | button <- Button.new "Async action can only be IO" 40 | button `actionIO_` do 41 | async do -- this is async inside async, but who cares 42 | println "printed outside UI thread" 43 | inIO button.getText println 44 | return () 45 | vbox <: do 46 | button <- Button.new "Async plus wait for completion" 47 | button `actionIO_` do 48 | mResult <- MVar.newEmpty -- for thread coordination 49 | async do 50 | println "printed outside UI thread" 51 | mResult.put "done" 52 | mResult.take 53 | println "waited for completion, proceed in UI thread" 54 | -- experiment that dynamically adds 5 buttons 55 | vbox `addAll` map (Button.new . ("Button "++) . show) [1..5] 56 | 57 | 58 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FregeFX 2 | Frege language binding and utilities to create JavaFX user interfaces 3 | 4 | [ ![Download](https://api.bintray.com/packages/fregelang/FregeFX/fregefx/images/download.svg) ](https://bintray.com/fregelang/FregeFX/fregefx/_latestVersion) 5 | 6 | ## Prerequisites 7 | 8 | Java8_u40 or higher (which includes JavaFX 8, which we need here) 9 | 10 | ## Usage 11 | 12 | Run the example via 13 | 14 | gradlew run 15 | 16 | ## Introduction: 17 | 18 | [Talk from JavaOne 2016](https://www.youtube.com/watch?v=CZr8RLJsZqc) 19 | 20 | ## Known uses: 21 | 22 | * [The FregeFX repl](https://github.com/Dierk/frepl-gui) 23 | * The [animated image viewer](https://github.com/Dierk/fregeTutorial/blob/master/src/main/frege/CoverFlow.fr) 24 | in the [Frege Tutorial](https://github.com/Dierk/fregeTutorial/), 25 | [video](https://www.youtube.com/watch?v=pxKJ_KPLml8) 26 | * Purely Functional Doodle [video](https://www.youtube.com/watch?v=9V7w-RSC_1A) 27 | * Ant Colony STM Demo [video](https://www.youtube.com/watch?v=mu6urVc2Z8Q) 28 | 29 | ## Build & Install 30 | 31 | For local build and install use 32 | 33 | gradlew install 34 | 35 | For running the contained `example` project use 36 | 37 | gradlew run 38 | 39 | ## Release Notes 40 | 41 | ### Release 0.8 42 | 43 | Full Java 8 compatibility for both, compiling and running. 44 | 45 | Makes use of the Frege 3.24 release, version 3.24.400, with full support for generics. 46 | 47 | ### Release 0.3.3 0.3.4 48 | 49 | Releases to test-drive and finally execute the upload to bintray and jcenter. 50 | 51 | ### Release 0.3.1 52 | 53 | The first release to support the 3.24-7.x Frege compiler. 54 | 55 | The API has been to a large extent commented out as it will change with upcoming changes to the 56 | Frege compiler and native declarations where things will get dramatically simpler. 57 | Anyway, enough is left to support the 58 | [Frege Tutorial](https://github.com/Dierk/fregeTutorial) 59 | 60 | All compilation targets Java 7 (even though you need to compile and run with Java 8). 61 | The user of this library also needs to compile with the same setting, i.e.: 62 | 63 | * use Java 8 for compiling and running 64 | * set target=1.7 for both, the Java and Frege compiler 65 | * use the 3.24-7.30 Frege compiler. 66 | 67 | # Copyright and License 68 | 69 | Copyright (c) Dierk König, 2016. All rights reserved. 70 | The use and distribution terms for this software are covered by the 71 | [BSD 3-clause license](http://opensource.org/licenses/BSD-3-Clause) 72 | which can be found in the file LICENSE.txt at the root of this distribution. 73 | By using this software in any fashion, you are agreeing to be bound by the terms of this license. 74 | You must not remove this notice, or any other, from this software. 75 | -------------------------------------------------------------------------------- /fregefx/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.jfrog.bintray" version "1.7.3" 3 | } 4 | 5 | apply plugin: 'maven' 6 | apply plugin: 'maven-publish' 7 | 8 | task sourcesJar(type: Jar, dependsOn: classes) { 9 | classifier = 'sources' 10 | from sourceSets.main.allSource 11 | } 12 | 13 | task javadocJar(type: Jar, dependsOn: javadoc) { 14 | classifier = 'javadoc' 15 | from javadoc.destinationDir 16 | } 17 | 18 | artifacts { 19 | archives sourcesJar 20 | archives javadocJar 21 | } 22 | 23 | publishing { 24 | publications { 25 | FregeFxPublication(MavenPublication) { 26 | from components.java 27 | artifact sourcesJar 28 | artifact javadocJar 29 | groupId group 30 | artifactId 'fregefx' 31 | version project.version 32 | } 33 | } 34 | } 35 | 36 | bintray { // see https://github.com/bintray/gradle-bintray-plugin 37 | user = project.hasProperty('bintrayUser') ? bintrayUser : "" // from /gradle.properties 38 | key = project.hasProperty('bintrayKey') ? bintrayKey : "" // from /gradle.properties 39 | publications = ['FregeFxPublication'] 40 | pkg { 41 | repo = 'FregeFX' 42 | name = 'fregefx' 43 | desc = 'FregeFX - JavaFX with Frege (Haskell for the JVM)' 44 | userOrg = "fregelang" 45 | licenses = ['BSD 3-Clause'] 46 | vcsUrl = 'https://github.com/Frege/FregeFX.git' 47 | websiteUrl = 'https://github.com/Frege/FregeFX' 48 | issueTrackerUrl = 'https://github.com/Frege/FregeFX/issues' 49 | githubRepo = 'Frege/FregeFX' 50 | githubReleaseNotesFile = 'README.md' 51 | publicDownloadNumbers = true 52 | version { 53 | name = project.version 54 | desc = 'FregeFX - Frege language binding for JavaFX' 55 | //released = new Date() // optional; does not work atm 56 | vcsTag = project.version 57 | attributes = [:] 58 | // Optional configuration for Maven Central sync of the version 59 | // we currently don't upload to mavenCentral as it is too cumbersome and 60 | // jcenter is good enough to care for all artifacts. 61 | // This way, we also get better download stats. 62 | // mavenCentralSync { 63 | // sync = false == project.version.toString().endsWith("-SNAPSHOT") //Optional (true by default). Determines whether to sync the version to Maven Central. 64 | // user = project.hasProperty('sonatypeUsername') ? sonatypeUsername : "" //OSS user token 65 | // password = project.hasProperty('sonatypePassword') ? sonatypePassword : "" //OSS user password 66 | // close = '1' //Optional property. By default the staging repository is closed and artifacts are released to Maven Central. You can optionally turn this behaviour off (by puting 0 as value) and release the version manually. 67 | // } 68 | } 69 | } 70 | } 71 | 72 | 73 | project.tasks.compileFrege.dependsOn(project.tasks.compileJava) 74 | 75 | ext { 76 | jfxLibDir = locateJfxLibDir() 77 | } 78 | 79 | dependencies { 80 | if (jfxLibDir) { 81 | runtime files("$jfxLibDir/jfxrt.jar") 82 | } // TODO: find out why this seems to be necessary even on JDK 8 83 | } 84 | 85 | boolean runningOnJDK8() { 86 | System.getProperty('java.version')[0..2].toDouble() == 1.8 87 | } 88 | 89 | 90 | fregeDoc { 91 | // xss = "8m" 92 | } 93 | 94 | String locateJfxLibDir() { 95 | def javaFxHome = System.env['JAVAFX_HOME'] ?: '' 96 | def javaHome = System.env['JAVA_HOME'] ?: '' 97 | def jdk8 = System.getProperty('java.version').startsWith('1.8') 98 | def jdk9 = System.getProperty('java.version').startsWith('9.') 99 | 100 | if (jdk9) { 101 | try { 102 | Class.forName('javafx.application.Platform', false, this.getClass().getClassLoader()) 103 | } catch (e) { 104 | def message = "Your Java 9 version does not include JavaFX, validate via 'java --list-modules'." 105 | throw new GradleScriptException(message, e) 106 | } 107 | return null 108 | } 109 | 110 | // we should run with Java 8. 111 | if (!jdk8) { 112 | throw new GradleScriptException("Please use Java 8.", null) 113 | } 114 | 115 | def jdkHome = System.properties.'java.home' ?: '' 116 | 117 | def result = "$javaFxHome/rt/lib" 118 | if (new File("$result/jfxrt.jar").exists()) { 119 | println "using javafx from explicit JAVAFX_HOME: $result" 120 | return result 121 | } 122 | result = "$jdkHome/lib/ext/" 123 | if (jdk8 && new File("$result/jfxrt.jar").exists()) { 124 | println "using javafx from current java 8: $result" 125 | return result 126 | } 127 | result = "$javaHome/jre/lib/" 128 | if (new File("$result/jfxrt.jar").exists()) { 129 | println "using javafx from explicit JAVA_HOME: $result" 130 | return result 131 | } 132 | result = "$javaHome/lib/" 133 | if (new File("$result/jfxrt.jar").exists()) { 134 | println "using javafx from explicit JAVA_HOME: $result" 135 | return result 136 | } 137 | logger.error "please use a Java Version 8" 138 | logger.error " or set JAVA_HOME to a dir that contains the jre/lib/jfxrt.jar" 139 | logger.error " or set JAVAFX_HOME to a dir that contains the rt/lib/jfxrt.jar" 140 | throw new GradleScriptException("location of jfxrt.jar could not be determined", null) 141 | } 142 | // 143 | //fregeNativeGen { 144 | //// typesFile = "$projectDir/src/main/resources/types.properties" 145 | // className = System.properties.nativeClassName //"javafx.scene.control.Button" 146 | // outputFile = file(System.properties.outputFile) // outputFile 147 | //} -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /fregefx/src/main/frege/fregefx/JavaFxUtils.fr: -------------------------------------------------------------------------------- 1 | module fregefx.JavaFxUtils where 2 | 3 | import frege.Prelude hiding(ListView) 4 | 5 | import fregefx.JavaFxType 6 | import fregefx.JavaFxAll 7 | 8 | {- define the Java stuff inline ... this way it works for both java7/java8 -} 9 | native module where { 10 | public static class FregeFX extends javafx.application.Application { 11 | private static Func.U> lambda; 12 | 13 | @Override 14 | public void start(javafx.stage.Stage primaryStage) throws Exception { 15 | final Lazy lazyStage= Thunk.lazy(primaryStage); 16 | try { 17 | lambda.apply(lazyStage).call().apply(Thunk.lazy(org.frege.JavaFxWorld.INSTANCE)).call(); 18 | } catch(RuntimeException re) { 19 | re.printStackTrace(); 20 | throw re; 21 | } 22 | } 23 | 24 | /** 25 | * @param callback The callback lambda that will receive the primaryStage to work on. 26 | */ 27 | public static void launch(Func.U> callback) { 28 | lambda = callback; 29 | javafx.application.Application.launch(); 30 | } 31 | 32 | public static javafx.scene.Parent fxml(String className, String resourceName ) { 33 | try { 34 | return javafx.fxml.FXMLLoader.load(Class.forName(className).getClass().getResource(resourceName)); 35 | } catch (ClassNotFoundException e) { 36 | e.printStackTrace(); 37 | } catch (java.io.IOException e) { 38 | e.printStackTrace(); 39 | } catch (NullPointerException e) { 40 | e.printStackTrace(); 41 | } 42 | return new javafx.scene.control.Label("could not load " + resourceName); 43 | } 44 | } 45 | 46 | // event handling 47 | public static javafx.event.EventHandler 48 | onAction(final Func.U> lambda) { 49 | return new javafx.event.EventHandler() { 50 | @Override 51 | public void handle(T event) { 52 | Lazy lazyEvent = Thunk.lazy(event); 53 | try { 54 | lambda.apply(lazyEvent).call().apply(Thunk.lazy(org.frege.JavaFxWorld.INSTANCE)).call(); 55 | } catch(RuntimeException re) { 56 | re.printStackTrace(); 57 | throw re; 58 | } 59 | } 60 | }; 61 | } 62 | 63 | // change handling 64 | public static javafx.beans.value.ChangeListener 65 | onChange(final Func.U>> lambda) { 66 | return new javafx.beans.value.ChangeListener() { 67 | @Override 68 | public void changed(javafx.beans.value.ObservableValue observable, T oldValue, T newValue) { 69 | try { 70 | Lazy alt = Thunk.lazy(oldValue); 71 | Lazy neu = Thunk.lazy(newValue); 72 | lambda.apply(alt).call().apply(neu).call().apply(Thunk.lazy(org.frege.JavaFxWorld.INSTANCE)).call(); 73 | } catch(RuntimeException re) { 74 | re.printStackTrace(); 75 | throw re; 76 | } 77 | } 78 | }; 79 | } 80 | 81 | // bridging async IO actions to JFX actions, relaying any value that was obtained in IO as pure for rendering in JFX 82 | public static void doBridge(final Func.U ioLambda, final Func.U> jfxLambda) { 83 | try { 84 | final java.util.concurrent.FutureTask ioFuture = 85 | new java.util.concurrent.FutureTask(new java.util.concurrent.Callable() { 86 | public Object call() { 87 | final Lazy erg = PreludeBase.TST.performUnsafe( ioLambda ); 88 | erg.call(); // force evaluation 89 | javafx.application.Platform.runLater(new Runnable() { 90 | @Override 91 | public void run() { 92 | jfxLambda.apply(erg).call().apply(Thunk.lazy(org.frege.JavaFxWorld.INSTANCE)).call(); 93 | } 94 | }); 95 | return null; 96 | } 97 | }); 98 | java.util.concurrent.ForkJoinPool.commonPool().execute(ioFuture); 99 | } catch(RuntimeException re) { 100 | re.printStackTrace(); 101 | throw re; 102 | } 103 | } 104 | 105 | // make a function foo that takes a JFX t value and passes the t into an IO action 106 | // even though it must return an IO (), it must run inside the UI thread 107 | // foo :: JFX t -> (t -> IO ()) -> IO () 108 | public static void bridgeDo(final Func.U jfxLambda, final Func.U> ioLambda) { 109 | try { 110 | javafx.application.Platform.runLater(new Runnable() { 111 | @Override 112 | public void run() { 113 | final Lazy erg = jfxLambda.apply(Thunk.lazy(org.frege.JavaFxWorld.INSTANCE)); 114 | erg.call(); 115 | 116 | final java.util.concurrent.FutureTask ioFuture = 117 | new java.util.concurrent.FutureTask(new java.util.concurrent.Callable() { 118 | public Object call() { 119 | ioLambda.apply(erg).call().apply(Thunk.lazy(frege.runtime.Phantom.theRealWorld)).call(); 120 | return null; 121 | } 122 | }); 123 | java.util.concurrent.ForkJoinPool.commonPool().execute(ioFuture); 124 | } 125 | }); 126 | 127 | } catch(RuntimeException re) { 128 | re.printStackTrace(); 129 | throw re; 130 | } 131 | } 132 | } 133 | 134 | --- The starter for every FregeFX Application 135 | data FregeFX = mutable native javafx.application.Application where 136 | native launch JavaFxUtils.FregeFX.launch :: ( Stage -> JFX () ) -> IO () 137 | native fxml JavaFxUtils.FregeFX.fxml :: String -> String -> JFX Parent 138 | 139 | 140 | --- Logging a message in the JFX context. For debugging/tracing purposes only 141 | jfxlog :: String -> JFX () 142 | jfxlog message = if (traceLn message) then return () else return () 143 | 144 | 145 | bridgeAction :: ButtonBase -> IO t -> ( t -> JFX () ) -> JFX ButtonBase 146 | bridgeAction button ioAction jfxAction = do 147 | button.setOnAction (onAction $ \_ -> ioAction `thenDo` jfxAction) 148 | pure button 149 | 150 | actionIO_ :: ButtonBase -> IO () -> JFX ButtonBase 151 | actionIO_ button ioAction = bridgeAction button ioAction (\_ -> return ()) 152 | 153 | --- Run any function _f_ in the JavaFX Application Thread to ensure proper painting. 154 | --- Any code that touches a JavaFX UI component must run in this thread. 155 | withUI :: JFX () -> JFX () 156 | withUI f = Platform.runLater =<< Runnable.new f 157 | 158 | --- Given a _populate_ logic on how to build a scenegraph below the root group 159 | --- and a _stage_, assemble the pieces and show the stage. 160 | withStage :: (Group -> Stage -> JFX Group) -> Stage -> JFX () 161 | withStage populate stage = do 162 | content <- Group.new () 163 | scene <- Scene.new content 164 | stage.setScene scene 165 | populate content stage 166 | stage.show 167 | 168 | --- Like withStage but use an AnchorPane as the root to allow resizing of the content 169 | --- when the frame is resized. Callback function does not add to the root itself but 170 | --- returns a the newly created content as a Node such that we can enforce Anchor constraints on it. 171 | withResizableStage :: (Pane -> Stage -> JFX Node) -> Stage -> JFX () 172 | withResizableStage buildNode stage = do 173 | pane <- AnchorPane.new () 174 | node <- buildNode pane stage 175 | AnchorPane.setBottomAnchor node 0.0 176 | AnchorPane.setLeftAnchor node 0.0 177 | AnchorPane.setRightAnchor node 0.0 178 | AnchorPane.setTopAnchor node 0.0 179 | pane `addNode` return node 180 | scene <- Scene.new pane 181 | stage.setScene scene 182 | stage.show 183 | 184 | --- JavaFX users will work with ObservableList a lot, which inherits from List. 185 | --- The mutable java.util.List type is usually not visible in Frege but when 186 | --- using JavaFX, having these methods accessible is convenient. 187 | data List e = mutable native java.util.List{e} where 188 | native add :: List e -> e -> JFX Bool 189 | native size :: List e -> JFX Int 190 | native remove :: List e -> e -> JFX Bool 191 | 192 | 193 | 194 | pure native onChange JavaFxUtils.onChange{t} :: (t -> t -> JFX ()) -> ChangeListener t 195 | 196 | pure native onAction JavaFxUtils.onAction{t} :: (t -> JFX () ) -> EventHandler t 197 | 198 | native thenDo JavaFxUtils.doBridge{t} :: IO t -> ( t -> JFX () ) -> JFX () 199 | 200 | native inIO JavaFxUtils.bridgeDo{t} :: JFX t -> (t -> IO () ) -> IO () 201 | 202 | 203 | --- Convenience function to set an action event handler as 204 | --- > action button $ \event -> button.OnEvent.new eventHandler setText "got it" 205 | action :: ButtonBase -> (ActionEvent -> JFX () ) -> JFX ButtonBase 206 | action button eventHandler = do 207 | button.setOnAction (onAction eventHandler) 208 | pure button 209 | 210 | --- Convenience function to set an action event handler 211 | --- that does not depend on the action event as 212 | --- > action_ button (button.setText "got it") 213 | action_ :: ButtonBase -> JFX () -> JFX ButtonBase 214 | action_ button plainHandler = do 215 | let handler = onAction (\_ -> plainHandler) 216 | button.setOnAction handler 217 | return button 218 | 219 | --- Convenience factory function for insets 220 | insets :: Double -> JFX Insets 221 | insets n = Insets.new n n n n 222 | 223 | --- A Family type is a type that has _children_ and can attain more of them over time 224 | class Family family where 225 | children :: family -> JFX (ObservableList Node) 226 | 227 | instance Family Group where 228 | children group = group.getChildren 229 | 230 | instance Family HBox where 231 | children hbox = hbox.getChildren 232 | 233 | instance Family VBox where 234 | children vbox = vbox.getChildren 235 | 236 | instance Family Pane where 237 | children pane = pane.getChildren 238 | 239 | instance Family AnchorPane where 240 | children pane = pane.getChildren 241 | 242 | 243 | --- Convenience function to add a control/pane/node to a family 244 | add :: Family t => t -> JFX Region -> JFX t 245 | add family builder = do 246 | child <- builder 247 | family.children >>= _.add child 248 | return family 249 | 250 | infixr 3 `<:` 251 | (<:) = add 252 | 253 | --- Convenience function that applies _add_ to all entries in the list. 254 | addAll :: Family family => family -> [JFX Region] -> JFX family 255 | addAll family builders = do 256 | mapM (add family) builders 257 | return family 258 | 259 | --- Nodes can be added just like Regions. 260 | addNode :: Family t => t -> JFX Node -> JFX t 261 | addNode family builder = do 262 | child <- builder 263 | family.children >>= _.add child 264 | return family 265 | 266 | 267 | {-- 268 | Unsafe, best-effort function for looking up a node in a scene. 269 | This returns a Node value on the Java side but in order to do 270 | anything sensible with this on the Frege side, we need a specialized subtype like @TextArea@. 271 | The function lookupNode returns such a specialized type by returning an instance of @JFX CastTarget@. 272 | Errors are thrown at runtime if the selector String cannot be found or yields the wrong type. 273 | *Use only if you are ok with runtime errors!* 274 | -} 275 | lookupNode :: CastTarget a => Scene -> String -> JFX a 276 | lookupNode scene selector = do 277 | mayNode <- scene.lookup selector 278 | case mayNode of 279 | Just node -> downcast node >>= either 280 | (\cce -> error $ "cannot cast selector '" ++ selector ++ "'. Reason: " ++ show cce.getMessage) 281 | return 282 | Nothing -> error $ "cannot find '" ++ selector ++ "'" 283 | 284 | 285 | data ClassCastException = native java.lang.ClassCastException 286 | 287 | -- generalized downcast 288 | class CastTarget a where 289 | downcast :: Node -> JFX (ClassCastException | a) 290 | 291 | instance CastTarget TextArea where 292 | native downcast "(javafx.scene.control.TextArea)" :: Node -> JFX (ClassCastException | TextArea ) 293 | 294 | instance CastTarget (ListView t) where 295 | native downcast "(javafx.scene.control.ListView)" :: Node -> JFX (ClassCastException | ListView t ) 296 | -------------------------------------------------------------------------------- /fregefx/types.properties: -------------------------------------------------------------------------------- 1 | javafx.animation.Animation=io 2 | javafx.animation.AnimationAccessorImpl=io 3 | javafx.animation.AnimationBuilder=io 4 | javafx.animation.AnimationTimer=io 5 | javafx.animation.FadeTransition=io 6 | javafx.animation.FadeTransitionBuilder=io 7 | javafx.animation.FillTransition=io 8 | javafx.animation.FillTransitionBuilder=io 9 | javafx.animation.Interpolatable=io 10 | javafx.animation.Interpolator=io 11 | javafx.animation.KeyFrame=io 12 | javafx.animation.KeyValue=io 13 | javafx.animation.ParallelTransition=io 14 | javafx.animation.ParallelTransitionBuilder=io 15 | javafx.animation.PathTransition=io 16 | javafx.animation.PathTransitionBuilder=io 17 | javafx.animation.PauseTransition=io 18 | javafx.animation.PauseTransitionBuilder=io 19 | javafx.animation.RotateTransition=io 20 | javafx.animation.RotateTransitionBuilder=io 21 | javafx.animation.ScaleTransition=io 22 | javafx.animation.ScaleTransitionBuilder=io 23 | javafx.animation.SequentialTransition=io 24 | javafx.animation.SequentialTransitionBuilder=io 25 | javafx.animation.StrokeTransition=io 26 | javafx.animation.StrokeTransitionBuilder=io 27 | javafx.animation.Timeline=io 28 | javafx.animation.TimelineBuilder=io 29 | javafx.animation.Transition=io 30 | javafx.animation.TransitionBuilder=io 31 | javafx.animation.TranslateTransition=io 32 | javafx.animation.TranslateTransitionBuilder=io 33 | javafx.application.Application=io 34 | javafx.application.ConditionalFeature=io 35 | javafx.application.HostServices=io 36 | javafx.application.Platform=io 37 | javafx.application.Preloader=io 38 | javafx.beans.binding.Binding=io 39 | javafx.beans.binding.Bindings=io 40 | javafx.beans.binding.BooleanBinding=io 41 | javafx.beans.binding.BooleanExpression=io 42 | javafx.beans.binding.DoubleBinding=io 43 | javafx.beans.binding.DoubleExpression=io 44 | javafx.beans.binding.FloatBinding=io 45 | javafx.beans.binding.FloatExpression=io 46 | javafx.beans.binding.IntegerBinding=io 47 | javafx.beans.binding.IntegerExpression=io 48 | javafx.beans.binding.ListBinding=io 49 | javafx.beans.binding.ListExpression=io 50 | javafx.beans.binding.LongBinding=io 51 | javafx.beans.binding.LongExpression=io 52 | javafx.beans.binding.MapBinding=io 53 | javafx.beans.binding.MapExpression=io 54 | javafx.beans.binding.NumberBinding=io 55 | javafx.beans.binding.NumberExpression=io 56 | javafx.beans.binding.NumberExpressionBase=io 57 | javafx.beans.binding.ObjectBinding=io 58 | javafx.beans.binding.ObjectExpression=io 59 | javafx.beans.binding.SetBinding=io 60 | javafx.beans.binding.SetExpression=io 61 | javafx.beans.binding.StringBinding=io 62 | javafx.beans.binding.StringExpression=io 63 | javafx.beans.binding.When=io 64 | javafx.beans.DefaultProperty=io 65 | javafx.beans.InvalidationListener=io 66 | javafx.beans.NamedArg=io 67 | javafx.beans.Observable=io 68 | javafx.beans.property.adapter.DescriptorListenerCleaner=io 69 | javafx.beans.property.adapter.JavaBeanBooleanProperty=io 70 | javafx.beans.property.adapter.JavaBeanBooleanPropertyBuilder=io 71 | javafx.beans.property.adapter.JavaBeanDoubleProperty=io 72 | javafx.beans.property.adapter.JavaBeanDoublePropertyBuilder=io 73 | javafx.beans.property.adapter.JavaBeanFloatProperty=io 74 | javafx.beans.property.adapter.JavaBeanFloatPropertyBuilder=io 75 | javafx.beans.property.adapter.JavaBeanIntegerProperty=io 76 | javafx.beans.property.adapter.JavaBeanIntegerPropertyBuilder=io 77 | javafx.beans.property.adapter.JavaBeanLongProperty=io 78 | javafx.beans.property.adapter.JavaBeanLongPropertyBuilder=io 79 | javafx.beans.property.adapter.JavaBeanObjectProperty=io 80 | javafx.beans.property.adapter.JavaBeanObjectPropertyBuilder=io 81 | javafx.beans.property.adapter.JavaBeanProperty=io 82 | javafx.beans.property.adapter.JavaBeanStringProperty=io 83 | javafx.beans.property.adapter.JavaBeanStringPropertyBuilder=io 84 | javafx.beans.property.adapter.ReadOnlyJavaBeanBooleanProperty=io 85 | javafx.beans.property.adapter.ReadOnlyJavaBeanBooleanPropertyBuilder=io 86 | javafx.beans.property.adapter.ReadOnlyJavaBeanDoubleProperty=io 87 | javafx.beans.property.adapter.ReadOnlyJavaBeanDoublePropertyBuilder=io 88 | javafx.beans.property.adapter.ReadOnlyJavaBeanFloatProperty=io 89 | javafx.beans.property.adapter.ReadOnlyJavaBeanFloatPropertyBuilder=io 90 | javafx.beans.property.adapter.ReadOnlyJavaBeanIntegerProperty=io 91 | javafx.beans.property.adapter.ReadOnlyJavaBeanIntegerPropertyBuilder=io 92 | javafx.beans.property.adapter.ReadOnlyJavaBeanLongProperty=io 93 | javafx.beans.property.adapter.ReadOnlyJavaBeanLongPropertyBuilder=io 94 | javafx.beans.property.adapter.ReadOnlyJavaBeanObjectProperty=io 95 | javafx.beans.property.adapter.ReadOnlyJavaBeanObjectPropertyBuilder=io 96 | javafx.beans.property.adapter.ReadOnlyJavaBeanProperty=io 97 | javafx.beans.property.adapter.ReadOnlyJavaBeanStringProperty=io 98 | javafx.beans.property.adapter.ReadOnlyJavaBeanStringPropertyBuilder=io 99 | javafx.beans.property.BooleanProperty=io 100 | javafx.beans.property.BooleanPropertyBase=io 101 | javafx.beans.property.DoubleProperty=io 102 | javafx.beans.property.DoublePropertyBase=io 103 | javafx.beans.property.FloatProperty=io 104 | javafx.beans.property.FloatPropertyBase=io 105 | javafx.beans.property.IntegerProperty=io 106 | javafx.beans.property.IntegerPropertyBase=io 107 | javafx.beans.property.ListProperty=io 108 | javafx.beans.property.ListPropertyBase=io 109 | javafx.beans.property.LongProperty=io 110 | javafx.beans.property.LongPropertyBase=io 111 | javafx.beans.property.MapProperty=io 112 | javafx.beans.property.MapPropertyBase=io 113 | javafx.beans.property.ObjectProperty=io 114 | javafx.beans.property.ObjectPropertyBase=io 115 | javafx.beans.property.Property=io 116 | javafx.beans.property.ReadOnlyBooleanProperty=io 117 | javafx.beans.property.ReadOnlyBooleanPropertyBase=io 118 | javafx.beans.property.ReadOnlyBooleanWrapper=io 119 | javafx.beans.property.ReadOnlyDoubleProperty=io 120 | javafx.beans.property.ReadOnlyDoublePropertyBase=io 121 | javafx.beans.property.ReadOnlyDoubleWrapper=io 122 | javafx.beans.property.ReadOnlyFloatProperty=io 123 | javafx.beans.property.ReadOnlyFloatPropertyBase=io 124 | javafx.beans.property.ReadOnlyFloatWrapper=io 125 | javafx.beans.property.ReadOnlyIntegerProperty=io 126 | javafx.beans.property.ReadOnlyIntegerPropertyBase=io 127 | javafx.beans.property.ReadOnlyIntegerWrapper=io 128 | javafx.beans.property.ReadOnlyListProperty=io 129 | javafx.beans.property.ReadOnlyListPropertyBase=io 130 | javafx.beans.property.ReadOnlyListWrapper=io 131 | javafx.beans.property.ReadOnlyLongProperty=io 132 | javafx.beans.property.ReadOnlyLongPropertyBase=io 133 | javafx.beans.property.ReadOnlyLongWrapper=io 134 | javafx.beans.property.ReadOnlyMapProperty=io 135 | javafx.beans.property.ReadOnlyMapPropertyBase=io 136 | javafx.beans.property.ReadOnlyMapWrapper=io 137 | javafx.beans.property.ReadOnlyObjectProperty=io 138 | javafx.beans.property.ReadOnlyObjectPropertyBase=io 139 | javafx.beans.property.ReadOnlyObjectWrapper=io 140 | javafx.beans.property.ReadOnlyProperty=io 141 | javafx.beans.property.ReadOnlySetProperty=io 142 | javafx.beans.property.ReadOnlySetPropertyBase=io 143 | javafx.beans.property.ReadOnlySetWrapper=io 144 | javafx.beans.property.ReadOnlyStringProperty=io 145 | javafx.beans.property.ReadOnlyStringPropertyBase=io 146 | javafx.beans.property.ReadOnlyStringWrapper=io 147 | javafx.beans.property.SetProperty=io 148 | javafx.beans.property.SetPropertyBase=io 149 | javafx.beans.property.SimpleBooleanProperty=io 150 | javafx.beans.property.SimpleDoubleProperty=io 151 | javafx.beans.property.SimpleFloatProperty=io 152 | javafx.beans.property.SimpleIntegerProperty=io 153 | javafx.beans.property.SimpleListProperty=io 154 | javafx.beans.property.SimpleLongProperty=io 155 | javafx.beans.property.SimpleMapProperty=io 156 | javafx.beans.property.SimpleObjectProperty=io 157 | javafx.beans.property.SimpleSetProperty=io 158 | javafx.beans.property.SimpleStringProperty=io 159 | javafx.beans.property.StringProperty=io 160 | javafx.beans.property.StringPropertyBase=io 161 | javafx.beans.value.ChangeListener=io 162 | javafx.beans.value.ObservableBooleanValue=io 163 | javafx.beans.value.ObservableDoubleValue=io 164 | javafx.beans.value.ObservableFloatValue=io 165 | javafx.beans.value.ObservableIntegerValue=io 166 | javafx.beans.value.ObservableListValue=io 167 | javafx.beans.value.ObservableLongValue=io 168 | javafx.beans.value.ObservableMapValue=io 169 | javafx.beans.value.ObservableNumberValue=io 170 | javafx.beans.value.ObservableObjectValue=io 171 | javafx.beans.value.ObservableSetValue=io 172 | javafx.beans.value.ObservableStringValue=io 173 | javafx.beans.value.ObservableValue=io 174 | javafx.beans.value.ObservableValueBase=io 175 | javafx.beans.value.WeakChangeListener=io 176 | javafx.beans.value.WritableBooleanValue=io 177 | javafx.beans.value.WritableDoubleValue=io 178 | javafx.beans.value.WritableFloatValue=io 179 | javafx.beans.value.WritableIntegerValue=io 180 | javafx.beans.value.WritableListValue=io 181 | javafx.beans.value.WritableLongValue=io 182 | javafx.beans.value.WritableMapValue=io 183 | javafx.beans.value.WritableNumberValue=io 184 | javafx.beans.value.WritableObjectValue=io 185 | javafx.beans.value.WritableSetValue=io 186 | javafx.beans.value.WritableStringValue=io 187 | javafx.beans.value.WritableValue=io 188 | javafx.beans.WeakInvalidationListener=io 189 | javafx.beans.WeakListener=io 190 | javafx.collections.ArrayChangeListener=io 191 | javafx.collections.FXCollections=io 192 | javafx.collections.ListChangeBuilder=io 193 | javafx.collections.ListChangeListener=io 194 | javafx.collections.MapChangeListener=io 195 | javafx.collections.ModifiableObservableListBase=io 196 | javafx.collections.ObservableArray=io 197 | javafx.collections.ObservableArrayBase=io 198 | javafx.collections.ObservableFloatArray=io 199 | javafx.collections.ObservableIntegerArray=io 200 | javafx.collections.ObservableList=io 201 | javafx.collections.ObservableListBase=io 202 | javafx.collections.ObservableMap=io 203 | javafx.collections.ObservableSet=io 204 | javafx.collections.SetChangeListener=io 205 | javafx.collections.transformation.FilteredList=io 206 | javafx.collections.transformation.SortedList=io 207 | javafx.collections.transformation.TransformationList=io 208 | javafx.collections.WeakListChangeListener=io 209 | javafx.collections.WeakMapChangeListener=io 210 | javafx.collections.WeakSetChangeListener=io 211 | javafx.concurrent.EventHelper=io 212 | javafx.concurrent.ScheduledService=io 213 | javafx.concurrent.Service=io 214 | javafx.concurrent.Task=io 215 | javafx.concurrent.Worker=io 216 | javafx.concurrent.WorkerStateEvent=io 217 | javafx.css.CssMetaData=io 218 | javafx.css.FontCssMetaData=io 219 | javafx.css.ParsedValue=io 220 | javafx.css.PseudoClass=io 221 | javafx.css.SimpleStyleableBooleanProperty=io 222 | javafx.css.SimpleStyleableDoubleProperty=io 223 | javafx.css.SimpleStyleableFloatProperty=io 224 | javafx.css.SimpleStyleableIntegerProperty=io 225 | javafx.css.SimpleStyleableLongProperty=io 226 | javafx.css.SimpleStyleableObjectProperty=io 227 | javafx.css.SimpleStyleableStringProperty=io 228 | javafx.css.Styleable=io 229 | javafx.css.StyleableBooleanProperty=io 230 | javafx.css.StyleableDoubleProperty=io 231 | javafx.css.StyleableFloatProperty=io 232 | javafx.css.StyleableIntegerProperty=io 233 | javafx.css.StyleableLongProperty=io 234 | javafx.css.StyleableObjectProperty=io 235 | javafx.css.StyleableProperty=io 236 | javafx.css.StyleablePropertyFactory=io 237 | javafx.css.StyleableStringProperty=io 238 | javafx.css.StyleConverter=io 239 | javafx.css.StyleOrigin=io 240 | javafx.embed.swing.CachingTransferable=io 241 | javafx.embed.swing.DataFlavorUtils=io 242 | javafx.embed.swing.FXDnD=io 243 | javafx.embed.swing.InputMethodSupport=io 244 | javafx.embed.swing.JFXPanel=io 245 | javafx.embed.swing.JFXPanelBuilder=io 246 | javafx.embed.swing.SwingCursors=io 247 | javafx.embed.swing.SwingDnD=io 248 | javafx.embed.swing.SwingDragSource=io 249 | javafx.embed.swing.SwingEvents=io 250 | javafx.embed.swing.SwingFXUtils=io 251 | javafx.embed.swing.SwingNode=io 252 | javafx.embed.swt.CustomTransfer=io 253 | javafx.embed.swt.CustomTransferBuilder=io 254 | javafx.embed.swt.FXCanvas=io 255 | javafx.embed.swt.SWTCursors=io 256 | javafx.embed.swt.SWTEvents=io 257 | javafx.embed.swt.SWTFXUtils=io 258 | javafx.event.ActionEvent=io 259 | javafx.event.Event=io 260 | javafx.event.EventDispatchChain=io 261 | javafx.event.EventDispatcher=io 262 | javafx.event.EventHandler=io 263 | javafx.event.EventTarget=io 264 | javafx.event.EventType=io 265 | javafx.event.WeakEventHandler=io 266 | javafx.fxml.FXML=io 267 | javafx.fxml.FXMLLoader=io 268 | javafx.fxml.Initializable=io 269 | javafx.fxml.JavaFXBuilderFactory=io 270 | javafx.fxml.LoadException=io 271 | javafx.geometry.BoundingBox=io 272 | javafx.geometry.BoundingBoxBuilder=io 273 | javafx.geometry.Bounds=io 274 | javafx.geometry.Dimension2D=io 275 | javafx.geometry.Dimension2DBuilder=io 276 | javafx.geometry.HorizontalDirection=io 277 | javafx.geometry.HPos=io 278 | javafx.geometry.Insets=io 279 | javafx.geometry.InsetsBuilder=io 280 | javafx.geometry.NodeOrientation=io 281 | javafx.geometry.Orientation=io 282 | javafx.geometry.Point2D=io 283 | javafx.geometry.Point2DBuilder=io 284 | javafx.geometry.Point3D=io 285 | javafx.geometry.Point3DBuilder=io 286 | javafx.geometry.Pos=io 287 | javafx.geometry.Rectangle2D=io 288 | javafx.geometry.Rectangle2DBuilder=io 289 | javafx.geometry.Side=io 290 | javafx.geometry.VerticalDirection=io 291 | javafx.geometry.VPos=io 292 | javafx.print.Collation=io 293 | javafx.print.JobSettings=io 294 | javafx.print.PageLayout=io 295 | javafx.print.PageOrientation=io 296 | javafx.print.PageRange=io 297 | javafx.print.Paper=io 298 | javafx.print.PaperSource=io 299 | javafx.print.PrintColor=io 300 | javafx.print.Printer=io 301 | javafx.print.PrinterAttributes=io 302 | javafx.print.PrinterJob=io 303 | javafx.print.PrintQuality=io 304 | javafx.print.PrintResolution=io 305 | javafx.print.PrintSides=io 306 | javafx.scene.AccessibleAction=io 307 | javafx.scene.AccessibleAttribute=io 308 | javafx.scene.AccessibleRole=io 309 | javafx.scene.AmbientLight=io 310 | javafx.scene.CacheHint=io 311 | javafx.scene.Camera=io 312 | javafx.scene.canvas.Canvas=io 313 | javafx.scene.canvas.CanvasBuilder=io 314 | javafx.scene.canvas.GraphicsContext=io 315 | javafx.scene.chart.AreaChart=io 316 | javafx.scene.chart.AreaChartBuilder=io 317 | javafx.scene.chart.Axis=io 318 | javafx.scene.chart.AxisBuilder=io 319 | javafx.scene.chart.BarChart=io 320 | javafx.scene.chart.BarChartBuilder=io 321 | javafx.scene.chart.BubbleChart=io 322 | javafx.scene.chart.BubbleChartBuilder=io 323 | javafx.scene.chart.CategoryAxis=io 324 | javafx.scene.chart.CategoryAxisBuilder=io 325 | javafx.scene.chart.Chart=io 326 | javafx.scene.chart.ChartBuilder=io 327 | javafx.scene.chart.LineChart=io 328 | javafx.scene.chart.LineChartBuilder=io 329 | javafx.scene.chart.NumberAxis=io 330 | javafx.scene.chart.NumberAxisBuilder=io 331 | javafx.scene.chart.PieChart=io 332 | javafx.scene.chart.PieChartBuilder=io 333 | javafx.scene.chart.ScatterChart=io 334 | javafx.scene.chart.ScatterChartBuilder=io 335 | javafx.scene.chart.StackedAreaChart=io 336 | javafx.scene.chart.StackedAreaChartBuilder=io 337 | javafx.scene.chart.StackedBarChart=io 338 | javafx.scene.chart.StackedBarChartBuilder=io 339 | javafx.scene.chart.ValueAxis=io 340 | javafx.scene.chart.ValueAxisBuilder=io 341 | javafx.scene.chart.XYChart=io 342 | javafx.scene.chart.XYChartBuilder=io 343 | javafx.scene.control.Accordion=io 344 | javafx.scene.control.AccordionBuilder=io 345 | javafx.scene.control.Alert=io 346 | javafx.scene.control.Button=io 347 | javafx.scene.control.ButtonBar=io 348 | javafx.scene.control.ButtonBase=io 349 | javafx.scene.control.ButtonBaseBuilder=io 350 | javafx.scene.control.ButtonBuilder=io 351 | javafx.scene.control.ButtonType=io 352 | javafx.scene.control.cell.CellUtils=io 353 | javafx.scene.control.cell.CheckBoxListCell=io 354 | javafx.scene.control.cell.CheckBoxListCellBuilder=io 355 | javafx.scene.control.cell.CheckBoxTableCell=io 356 | javafx.scene.control.cell.CheckBoxTableCellBuilder=io 357 | javafx.scene.control.cell.CheckBoxTreeCell=io 358 | javafx.scene.control.cell.CheckBoxTreeCellBuilder=io 359 | javafx.scene.control.cell.CheckBoxTreeTableCell=io 360 | javafx.scene.control.cell.ChoiceBoxListCell=io 361 | javafx.scene.control.cell.ChoiceBoxListCellBuilder=io 362 | javafx.scene.control.cell.ChoiceBoxTableCell=io 363 | javafx.scene.control.cell.ChoiceBoxTableCellBuilder=io 364 | javafx.scene.control.cell.ChoiceBoxTreeCell=io 365 | javafx.scene.control.cell.ChoiceBoxTreeCellBuilder=io 366 | javafx.scene.control.cell.ChoiceBoxTreeTableCell=io 367 | javafx.scene.control.cell.ComboBoxListCell=io 368 | javafx.scene.control.cell.ComboBoxListCellBuilder=io 369 | javafx.scene.control.cell.ComboBoxTableCell=io 370 | javafx.scene.control.cell.ComboBoxTableCellBuilder=io 371 | javafx.scene.control.cell.ComboBoxTreeCell=io 372 | javafx.scene.control.cell.ComboBoxTreeCellBuilder=io 373 | javafx.scene.control.cell.ComboBoxTreeTableCell=io 374 | javafx.scene.control.cell.DefaultTreeCell=io 375 | javafx.scene.control.cell.MapValueFactory=io 376 | javafx.scene.control.cell.ProgressBarTableCell=io 377 | javafx.scene.control.cell.ProgressBarTreeTableCell=io 378 | javafx.scene.control.cell.PropertyValueFactory=io 379 | javafx.scene.control.cell.PropertyValueFactoryBuilder=io 380 | javafx.scene.control.cell.TextFieldListCell=io 381 | javafx.scene.control.cell.TextFieldListCellBuilder=io 382 | javafx.scene.control.cell.TextFieldTableCell=io 383 | javafx.scene.control.cell.TextFieldTableCellBuilder=io 384 | javafx.scene.control.cell.TextFieldTreeCell=io 385 | javafx.scene.control.cell.TextFieldTreeCellBuilder=io 386 | javafx.scene.control.cell.TextFieldTreeTableCell=io 387 | javafx.scene.control.cell.TreeItemPropertyValueFactory=io 388 | javafx.scene.control.Cell=io 389 | javafx.scene.control.CellBuilder=io 390 | javafx.scene.control.CheckBox=io 391 | javafx.scene.control.CheckBoxBuilder=io 392 | javafx.scene.control.CheckBoxTreeItem=io 393 | javafx.scene.control.CheckBoxTreeItemBuilder=io 394 | javafx.scene.control.CheckMenuItem=io 395 | javafx.scene.control.CheckMenuItemBuilder=io 396 | javafx.scene.control.ChoiceBox=io 397 | javafx.scene.control.ChoiceBoxBuilder=io 398 | javafx.scene.control.ChoiceDialog=io 399 | javafx.scene.control.ColorPicker=io 400 | javafx.scene.control.ColorPickerBuilder=io 401 | javafx.scene.control.ComboBox=io 402 | javafx.scene.control.ComboBoxBase=io 403 | javafx.scene.control.ComboBoxBaseBuilder=io 404 | javafx.scene.control.ComboBoxBuilder=io 405 | javafx.scene.control.ContentDisplay=io 406 | javafx.scene.control.ContextMenu=io 407 | javafx.scene.control.ContextMenuBuilder=io 408 | javafx.scene.control.Control=io 409 | javafx.scene.control.ControlBuilder=io 410 | javafx.scene.control.ControlUtils=io 411 | javafx.scene.control.CustomMenuItem=io 412 | javafx.scene.control.CustomMenuItemBuilder=io 413 | javafx.scene.control.DateCell=io 414 | javafx.scene.control.DatePicker=io 415 | javafx.scene.control.Dialog=io 416 | javafx.scene.control.DialogEvent=io 417 | javafx.scene.control.DialogPane=io 418 | javafx.scene.control.FocusModel=io 419 | javafx.scene.control.FXDialog=io 420 | javafx.scene.control.HeavyweightDialog=io 421 | javafx.scene.control.Hyperlink=io 422 | javafx.scene.control.HyperlinkBuilder=io 423 | javafx.scene.control.IndexedCell=io 424 | javafx.scene.control.IndexedCellBuilder=io 425 | javafx.scene.control.IndexRange=io 426 | javafx.scene.control.IndexRangeBuilder=io 427 | javafx.scene.control.Label=io 428 | javafx.scene.control.LabelBuilder=io 429 | javafx.scene.control.Labeled=io 430 | javafx.scene.control.LabeledBuilder=io 431 | javafx.scene.control.ListCell=io 432 | javafx.scene.control.ListCellBuilder=io 433 | javafx.scene.control.ListView=io 434 | javafx.scene.control.ListViewBuilder=io 435 | javafx.scene.control.Menu=io 436 | javafx.scene.control.MenuBar=io 437 | javafx.scene.control.MenuBarBuilder=io 438 | javafx.scene.control.MenuBuilder=io 439 | javafx.scene.control.MenuButton=io 440 | javafx.scene.control.MenuButtonBuilder=io 441 | javafx.scene.control.MenuItem=io 442 | javafx.scene.control.MenuItemBuilder=io 443 | javafx.scene.control.MultipleSelectionModel=io 444 | javafx.scene.control.MultipleSelectionModelBase=io 445 | javafx.scene.control.MultipleSelectionModelBuilder=io 446 | javafx.scene.control.OverrunStyle=io 447 | javafx.scene.control.Pagination=io 448 | javafx.scene.control.PaginationBuilder=io 449 | javafx.scene.control.PasswordField=io 450 | javafx.scene.control.PasswordFieldBuilder=io 451 | javafx.scene.control.PopupControl=io 452 | javafx.scene.control.PopupControlBuilder=io 453 | javafx.scene.control.ProgressBar=io 454 | javafx.scene.control.ProgressBarBuilder=io 455 | javafx.scene.control.ProgressIndicator=io 456 | javafx.scene.control.ProgressIndicatorBuilder=io 457 | javafx.scene.control.RadioButton=io 458 | javafx.scene.control.RadioButtonBuilder=io 459 | javafx.scene.control.RadioMenuItem=io 460 | javafx.scene.control.RadioMenuItemBuilder=io 461 | javafx.scene.control.ResizeFeaturesBase=io 462 | javafx.scene.control.ScrollBar=io 463 | javafx.scene.control.ScrollBarBuilder=io 464 | javafx.scene.control.ScrollPane=io 465 | javafx.scene.control.ScrollPaneBuilder=io 466 | javafx.scene.control.ScrollToEvent=io 467 | javafx.scene.control.SelectionMode=io 468 | javafx.scene.control.SelectionModel=io 469 | javafx.scene.control.Separator=io 470 | javafx.scene.control.SeparatorBuilder=io 471 | javafx.scene.control.SeparatorMenuItem=io 472 | javafx.scene.control.SeparatorMenuItemBuilder=io 473 | javafx.scene.control.SingleSelectionModel=io 474 | javafx.scene.control.Skin=io 475 | javafx.scene.control.SkinBase=io 476 | javafx.scene.control.Skinnable=io 477 | javafx.scene.control.Slider=io 478 | javafx.scene.control.SliderBuilder=io 479 | javafx.scene.control.SortEvent=io 480 | javafx.scene.control.Spinner=io 481 | javafx.scene.control.SpinnerValueFactory=io 482 | javafx.scene.control.SplitMenuButton=io 483 | javafx.scene.control.SplitMenuButtonBuilder=io 484 | javafx.scene.control.SplitPane=io 485 | javafx.scene.control.SplitPaneBuilder=io 486 | javafx.scene.control.Tab=io 487 | javafx.scene.control.TabBuilder=io 488 | javafx.scene.control.TableCell=io 489 | javafx.scene.control.TableCellBuilder=io 490 | javafx.scene.control.TableColumn=io 491 | javafx.scene.control.TableColumnBase=io 492 | javafx.scene.control.TableColumnBuilder=io 493 | javafx.scene.control.TableFocusModel=io 494 | javafx.scene.control.TablePosition=io 495 | javafx.scene.control.TablePositionBase=io 496 | javafx.scene.control.TablePositionBuilder=io 497 | javafx.scene.control.TableRow=io 498 | javafx.scene.control.TableRowBuilder=io 499 | javafx.scene.control.TableSelectionModel=io 500 | javafx.scene.control.TableUtil=io 501 | javafx.scene.control.TableView=io 502 | javafx.scene.control.TableViewBuilder=io 503 | javafx.scene.control.TabPane=io 504 | javafx.scene.control.TabPaneBuilder=io 505 | javafx.scene.control.TextArea=io 506 | javafx.scene.control.TextAreaBuilder=io 507 | javafx.scene.control.TextField=io 508 | javafx.scene.control.TextFieldBuilder=io 509 | javafx.scene.control.TextFormatter=io 510 | javafx.scene.control.TextInputControl=io 511 | javafx.scene.control.TextInputControlBuilder=io 512 | javafx.scene.control.TextInputDialog=io 513 | javafx.scene.control.TitledPane=io 514 | javafx.scene.control.TitledPaneBuilder=io 515 | javafx.scene.control.Toggle=io 516 | javafx.scene.control.ToggleButton=io 517 | javafx.scene.control.ToggleButtonBuilder=io 518 | javafx.scene.control.ToggleGroup=io 519 | javafx.scene.control.ToggleGroupBuilder=io 520 | javafx.scene.control.ToolBar=io 521 | javafx.scene.control.ToolBarBuilder=io 522 | javafx.scene.control.Tooltip=io 523 | javafx.scene.control.TooltipBuilder=io 524 | javafx.scene.control.TreeCell=io 525 | javafx.scene.control.TreeCellBuilder=io 526 | javafx.scene.control.TreeItem=io 527 | javafx.scene.control.TreeItemBuilder=io 528 | javafx.scene.control.TreeSortMode=io 529 | javafx.scene.control.TreeTableCell=io 530 | javafx.scene.control.TreeTableColumn=io 531 | javafx.scene.control.TreeTablePosition=io 532 | javafx.scene.control.TreeTableRow=io 533 | javafx.scene.control.TreeTableView=io 534 | javafx.scene.control.TreeUtil=io 535 | javafx.scene.control.TreeView=io 536 | javafx.scene.control.TreeViewBuilder=io 537 | javafx.scene.CssStyleHelper=io 538 | javafx.scene.Cursor=io 539 | javafx.scene.DepthTest=io 540 | javafx.scene.effect.Blend=io 541 | javafx.scene.effect.BlendBuilder=io 542 | javafx.scene.effect.BlendMode=io 543 | javafx.scene.effect.Bloom=io 544 | javafx.scene.effect.BloomBuilder=io 545 | javafx.scene.effect.BlurType=io 546 | javafx.scene.effect.BoxBlur=io 547 | javafx.scene.effect.BoxBlurBuilder=io 548 | javafx.scene.effect.ColorAdjust=io 549 | javafx.scene.effect.ColorAdjustBuilder=io 550 | javafx.scene.effect.ColorInput=io 551 | javafx.scene.effect.ColorInputBuilder=io 552 | javafx.scene.effect.DisplacementMap=io 553 | javafx.scene.effect.DisplacementMapBuilder=io 554 | javafx.scene.effect.DropShadow=io 555 | javafx.scene.effect.DropShadowBuilder=io 556 | javafx.scene.effect.Effect=io 557 | javafx.scene.effect.EffectChangeListener=io 558 | javafx.scene.effect.FloatMap=io 559 | javafx.scene.effect.FloatMapBuilder=io 560 | javafx.scene.effect.GaussianBlur=io 561 | javafx.scene.effect.GaussianBlurBuilder=io 562 | javafx.scene.effect.Glow=io 563 | javafx.scene.effect.GlowBuilder=io 564 | javafx.scene.effect.ImageInput=io 565 | javafx.scene.effect.ImageInputBuilder=io 566 | javafx.scene.effect.InnerShadow=io 567 | javafx.scene.effect.InnerShadowBuilder=io 568 | javafx.scene.effect.Light=io 569 | javafx.scene.effect.LightBuilder=io 570 | javafx.scene.effect.Lighting=io 571 | javafx.scene.effect.LightingBuilder=io 572 | javafx.scene.effect.MotionBlur=io 573 | javafx.scene.effect.MotionBlurBuilder=io 574 | javafx.scene.effect.PerspectiveTransform=io 575 | javafx.scene.effect.PerspectiveTransformBuilder=io 576 | javafx.scene.effect.Reflection=io 577 | javafx.scene.effect.ReflectionBuilder=io 578 | javafx.scene.effect.SepiaTone=io 579 | javafx.scene.effect.SepiaToneBuilder=io 580 | javafx.scene.effect.Shadow=io 581 | javafx.scene.effect.ShadowBuilder=io 582 | javafx.scene.Group=io 583 | javafx.scene.GroupBuilder=io 584 | javafx.scene.image.Image=io 585 | javafx.scene.image.ImageView=io 586 | javafx.scene.image.ImageViewBuilder=io 587 | javafx.scene.image.PixelFormat=io 588 | javafx.scene.image.PixelReader=io 589 | javafx.scene.image.PixelWriter=io 590 | javafx.scene.image.WritableImage=io 591 | javafx.scene.image.WritablePixelFormat=io 592 | javafx.scene.ImageCursor=io 593 | javafx.scene.ImageCursorBuilder=io 594 | javafx.scene.input.Clipboard=io 595 | javafx.scene.input.ClipboardContent=io 596 | javafx.scene.input.ClipboardContentBuilder=io 597 | javafx.scene.input.ContextMenuEvent=io 598 | javafx.scene.input.DataFormat=io 599 | javafx.scene.input.Dragboard=io 600 | javafx.scene.input.DragEvent=io 601 | javafx.scene.input.GestureEvent=io 602 | javafx.scene.input.InputEvent=io 603 | javafx.scene.input.InputMethodEvent=io 604 | javafx.scene.input.InputMethodHighlight=io 605 | javafx.scene.input.InputMethodRequests=io 606 | javafx.scene.input.InputMethodTextRun=io 607 | javafx.scene.input.KeyCharacterCombination=io 608 | javafx.scene.input.KeyCharacterCombinationBuilder=io 609 | javafx.scene.input.KeyCode=io 610 | javafx.scene.input.KeyCodeCombination=io 611 | javafx.scene.input.KeyCodeCombinationBuilder=io 612 | javafx.scene.input.KeyCombination=io 613 | javafx.scene.input.KeyEvent=io 614 | javafx.scene.input.Mnemonic=io 615 | javafx.scene.input.MnemonicBuilder=io 616 | javafx.scene.input.MouseButton=io 617 | javafx.scene.input.MouseDragEvent=io 618 | javafx.scene.input.MouseEvent=io 619 | javafx.scene.input.PickResult=io 620 | javafx.scene.input.RotateEvent=io 621 | javafx.scene.input.ScrollEvent=io 622 | javafx.scene.input.SwipeEvent=io 623 | javafx.scene.input.TouchEvent=io 624 | javafx.scene.input.TouchPoint=io 625 | javafx.scene.input.TransferMode=io 626 | javafx.scene.input.ZoomEvent=io 627 | javafx.scene.layout.AnchorPane=io 628 | javafx.scene.layout.AnchorPaneBuilder=io 629 | javafx.scene.layout.Background=io 630 | javafx.scene.layout.BackgroundConverter=io 631 | javafx.scene.layout.BackgroundFill=io 632 | javafx.scene.layout.BackgroundImage=io 633 | javafx.scene.layout.BackgroundPosition=io 634 | javafx.scene.layout.BackgroundRepeat=io 635 | javafx.scene.layout.BackgroundSize=io 636 | javafx.scene.layout.Border=io 637 | javafx.scene.layout.BorderConverter=io 638 | javafx.scene.layout.BorderImage=io 639 | javafx.scene.layout.BorderPane=io 640 | javafx.scene.layout.BorderPaneBuilder=io 641 | javafx.scene.layout.BorderRepeat=io 642 | javafx.scene.layout.BorderStroke=io 643 | javafx.scene.layout.BorderStrokeStyle=io 644 | javafx.scene.layout.BorderWidths=io 645 | javafx.scene.layout.ColumnConstraints=io 646 | javafx.scene.layout.ColumnConstraintsBuilder=io 647 | javafx.scene.layout.ConstraintsBase=io 648 | javafx.scene.layout.CornerRadii=io 649 | javafx.scene.layout.CornerRadiiConverter=io 650 | javafx.scene.layout.FlowPane=io 651 | javafx.scene.layout.FlowPaneBuilder=io 652 | javafx.scene.layout.GridPane=io 653 | javafx.scene.layout.GridPaneBuilder=io 654 | javafx.scene.layout.HBox=io 655 | javafx.scene.layout.HBoxBuilder=io 656 | javafx.scene.layout.Pane=io 657 | javafx.scene.layout.PaneBuilder=io 658 | javafx.scene.layout.Priority=io 659 | javafx.scene.layout.Region=io 660 | javafx.scene.layout.RegionBuilder=io 661 | javafx.scene.layout.RowConstraints=io 662 | javafx.scene.layout.RowConstraintsBuilder=io 663 | javafx.scene.layout.StackPane=io 664 | javafx.scene.layout.StackPaneBuilder=io 665 | javafx.scene.layout.TilePane=io 666 | javafx.scene.layout.TilePaneBuilder=io 667 | javafx.scene.layout.VBox=io 668 | javafx.scene.layout.VBoxBuilder=io 669 | javafx.scene.LightBase=io 670 | javafx.scene.media.AudioClip=io 671 | javafx.scene.media.AudioClipBuilder=io 672 | javafx.scene.media.AudioEqualizer=io 673 | javafx.scene.media.AudioSpectrumListener=io 674 | javafx.scene.media.AudioTrack=io 675 | javafx.scene.media.EqualizerBand=io 676 | javafx.scene.media.Media=io 677 | javafx.scene.media.MediaBuilder=io 678 | javafx.scene.media.MediaErrorEvent=io 679 | javafx.scene.media.MediaException=io 680 | javafx.scene.media.MediaMarkerEvent=io 681 | javafx.scene.media.MediaPlayer=io 682 | javafx.scene.media.MediaPlayerBuilder=io 683 | javafx.scene.media.MediaView=io 684 | javafx.scene.media.MediaViewBuilder=io 685 | javafx.scene.media.NGMediaView=io 686 | javafx.scene.media.SubtitleTrack=io 687 | javafx.scene.media.Track=io 688 | javafx.scene.media.VideoTrack=io 689 | javafx.scene.Node=io 690 | javafx.scene.NodeBuilder=io 691 | javafx.scene.paint.Color=io 692 | javafx.scene.paint.ColorBuilder=io 693 | javafx.scene.paint.CycleMethod=io 694 | javafx.scene.paint.ImagePattern=io 695 | javafx.scene.paint.ImagePatternBuilder=io 696 | javafx.scene.paint.LinearGradient=io 697 | javafx.scene.paint.LinearGradientBuilder=io 698 | javafx.scene.paint.Material=io 699 | javafx.scene.paint.Paint=io 700 | javafx.scene.paint.PhongMaterial=io 701 | javafx.scene.paint.RadialGradient=io 702 | javafx.scene.paint.RadialGradientBuilder=io 703 | javafx.scene.paint.Stop=io 704 | javafx.scene.paint.StopBuilder=io 705 | javafx.scene.ParallelCamera=io 706 | javafx.scene.Parent=io 707 | javafx.scene.ParentBuilder=io 708 | javafx.scene.PerspectiveCamera=io 709 | javafx.scene.PerspectiveCameraBuilder=io 710 | javafx.scene.PointLight=io 711 | javafx.scene.PropertyHelper=io 712 | javafx.scene.Scene=io 713 | javafx.scene.SceneAntialiasing=io 714 | javafx.scene.SceneBuilder=io 715 | javafx.scene.shape.Arc=io 716 | javafx.scene.shape.ArcBuilder=io 717 | javafx.scene.shape.ArcTo=io 718 | javafx.scene.shape.ArcToBuilder=io 719 | javafx.scene.shape.ArcType=io 720 | javafx.scene.shape.Box=io 721 | javafx.scene.shape.Circle=io 722 | javafx.scene.shape.CircleBuilder=io 723 | javafx.scene.shape.ClosePath=io 724 | javafx.scene.shape.ClosePathBuilder=io 725 | javafx.scene.shape.CubicCurve=io 726 | javafx.scene.shape.CubicCurveBuilder=io 727 | javafx.scene.shape.CubicCurveTo=io 728 | javafx.scene.shape.CubicCurveToBuilder=io 729 | javafx.scene.shape.CullFace=io 730 | javafx.scene.shape.Cylinder=io 731 | javafx.scene.shape.DrawMode=io 732 | javafx.scene.shape.Ellipse=io 733 | javafx.scene.shape.EllipseBuilder=io 734 | javafx.scene.shape.FillRule=io 735 | javafx.scene.shape.HLineTo=io 736 | javafx.scene.shape.HLineToBuilder=io 737 | javafx.scene.shape.Line=io 738 | javafx.scene.shape.LineBuilder=io 739 | javafx.scene.shape.LineTo=io 740 | javafx.scene.shape.LineToBuilder=io 741 | javafx.scene.shape.Mesh=io 742 | javafx.scene.shape.MeshView=io 743 | javafx.scene.shape.MoveTo=io 744 | javafx.scene.shape.MoveToBuilder=io 745 | javafx.scene.shape.ObservableFaceArray=io 746 | javafx.scene.shape.Path=io 747 | javafx.scene.shape.PathBuilder=io 748 | javafx.scene.shape.PathElement=io 749 | javafx.scene.shape.PathElementBuilder=io 750 | javafx.scene.shape.Polygon=io 751 | javafx.scene.shape.PolygonBuilder=io 752 | javafx.scene.shape.Polyline=io 753 | javafx.scene.shape.PolylineBuilder=io 754 | javafx.scene.shape.PredefinedMeshManager=io 755 | javafx.scene.shape.QuadCurve=io 756 | javafx.scene.shape.QuadCurveBuilder=io 757 | javafx.scene.shape.QuadCurveTo=io 758 | javafx.scene.shape.QuadCurveToBuilder=io 759 | javafx.scene.shape.Rectangle=io 760 | javafx.scene.shape.RectangleBuilder=io 761 | javafx.scene.shape.Shape=io 762 | javafx.scene.shape.Shape3D=io 763 | javafx.scene.shape.ShapeBuilder=io 764 | javafx.scene.shape.Sphere=io 765 | javafx.scene.shape.StrokeLineCap=io 766 | javafx.scene.shape.StrokeLineJoin=io 767 | javafx.scene.shape.StrokeType=io 768 | javafx.scene.shape.SVGPath=io 769 | javafx.scene.shape.SVGPathBuilder=io 770 | javafx.scene.shape.TriangleMesh=io 771 | javafx.scene.shape.VertexFormat=io 772 | javafx.scene.shape.VLineTo=io 773 | javafx.scene.shape.VLineToBuilder=io 774 | javafx.scene.SnapshotParameters=io 775 | javafx.scene.SnapshotParametersBuilder=io 776 | javafx.scene.SnapshotResult=io 777 | javafx.scene.SubScene=io 778 | javafx.scene.text.Font=io 779 | javafx.scene.text.FontBuilder=io 780 | javafx.scene.text.FontPosture=io 781 | javafx.scene.text.FontSmoothingType=io 782 | javafx.scene.text.FontWeight=io 783 | javafx.scene.text.Text=io 784 | javafx.scene.text.TextAlignment=io 785 | javafx.scene.text.TextBoundsType=io 786 | javafx.scene.text.TextBuilder=io 787 | javafx.scene.text.TextFlow=io 788 | javafx.scene.transform.Affine=io 789 | javafx.scene.transform.AffineBuilder=io 790 | javafx.scene.transform.MatrixType=io 791 | javafx.scene.transform.NonInvertibleTransformException=io 792 | javafx.scene.transform.Rotate=io 793 | javafx.scene.transform.RotateBuilder=io 794 | javafx.scene.transform.Scale=io 795 | javafx.scene.transform.ScaleBuilder=io 796 | javafx.scene.transform.Shear=io 797 | javafx.scene.transform.ShearBuilder=io 798 | javafx.scene.transform.Transform=io 799 | javafx.scene.transform.TransformChangedEvent=io 800 | javafx.scene.transform.Translate=io 801 | javafx.scene.transform.TranslateBuilder=io 802 | javafx.scene.web.DirectoryLock=io 803 | javafx.scene.web.HTMLEditor=io 804 | javafx.scene.web.PopupFeatures=io 805 | javafx.scene.web.PromptData=io 806 | javafx.scene.web.WebEngine=io 807 | javafx.scene.web.WebEngineBuilder=io 808 | javafx.scene.web.WebErrorEvent=io 809 | javafx.scene.web.WebEvent=io 810 | javafx.scene.web.WebHistory=io 811 | javafx.scene.web.WebView=io 812 | javafx.scene.web.WebViewBuilder=io 813 | javafx.stage.DirectoryChooser=io 814 | javafx.stage.DirectoryChooserBuilder=io 815 | javafx.stage.FileChooser=io 816 | javafx.stage.FileChooserBuilder=io 817 | javafx.stage.Modality=io 818 | javafx.stage.Popup=io 819 | javafx.stage.PopupBuilder=io 820 | javafx.stage.PopupWindow=io 821 | javafx.stage.PopupWindowBuilder=io 822 | javafx.stage.Screen=io 823 | javafx.stage.Stage=io 824 | javafx.stage.StageBuilder=io 825 | javafx.stage.StageStyle=io 826 | javafx.stage.Window=io 827 | javafx.stage.WindowBuilder=io 828 | javafx.stage.WindowEvent=io 829 | javafx.util.Builder=io 830 | javafx.util.BuilderFactory=io 831 | javafx.util.Callback=io 832 | javafx.util.converter.BigDecimalStringConverter=io 833 | javafx.util.converter.BigIntegerStringConverter=io 834 | javafx.util.converter.BooleanStringConverter=io 835 | javafx.util.converter.ByteStringConverter=io 836 | javafx.util.converter.CharacterStringConverter=io 837 | javafx.util.converter.CurrencyStringConverter=io 838 | javafx.util.converter.DateStringConverter=io 839 | javafx.util.converter.DateTimeStringConverter=io 840 | javafx.util.converter.DefaultStringConverter=io 841 | javafx.util.converter.DoubleStringConverter=io 842 | javafx.util.converter.FloatStringConverter=io 843 | javafx.util.converter.FormatStringConverter=io 844 | javafx.util.converter.IntegerStringConverter=io 845 | javafx.util.converter.LocalDateStringConverter=io 846 | javafx.util.converter.LocalDateTimeStringConverter=io 847 | javafx.util.converter.LocalTimeStringConverter=io 848 | javafx.util.converter.LongStringConverter=io 849 | javafx.util.converter.NumberStringConverter=io 850 | javafx.util.converter.PercentageStringConverter=io 851 | javafx.util.converter.ShortStringConverter=io 852 | javafx.util.converter.TimeStringConverter=io 853 | javafx.util.Duration=io 854 | javafx.util.Pair=io 855 | javafx.util.StringConverter=io 856 | 857 | boolean=pure,Bool 858 | byte=pure,Byte 859 | char=pure,Char 860 | double=pure,Double 861 | float=pure,Float 862 | int=pure,Int 863 | 864 | java.awt.Point=st 865 | 866 | java.io.File=io 867 | java.io.FileInputStream=io 868 | java.io.InputStream=io 869 | java.io.OutputStream=io 870 | java.io.PrintStream=io 871 | java.io.PrintWriter=io 872 | java.io.Reader=io 873 | java.io.Writer=io 874 | 875 | java.lang.Appendable=st 876 | java.lang.Comparable=pure 877 | java.lang.Iterable=st 878 | java.lang.Readable=st 879 | java.lang.String=pure 880 | java.lang.StringBuffer=st 881 | java.lang.StringBuilder=st 882 | 883 | java.lang.reflect.Array=st 884 | 885 | java.math.BigDecimal=pure 886 | java.math.BigInteger=pure,Integer 887 | 888 | java.nio.ByteBuffer=st 889 | java.nio.ByteOrder=pure 890 | java.nio.CharBuffer=st 891 | java.nio.DoubleBuffer=st 892 | java.nio.FloatBuffer=st 893 | java.nio.IntBuffer=st 894 | java.nio.LongBuffer=st 895 | java.nio.ShortBuffer=st 896 | 897 | java.nio.channels.FileChannel=io 898 | java.nio.channels.ReadableByteChannel=st 899 | 900 | java.nio.file.Path=pure 901 | java.nio.file.WatchService=st 902 | 903 | java.security.Permission=pure 904 | java.security.PermissionCollection=st 905 | 906 | java.util.AbstractCollection=st 907 | java.util.AbstractList=st 908 | java.util.AbstractMap$SimpleEntry=st,AbstractMapSimpleEntry 909 | java.util.AbstractMap$SimpleImmutableEntry=pure,AbstractMapSimpleImmutableEntry 910 | java.util.AbstractMap=st 911 | java.util.AbstractQueue=st 912 | java.util.AbstractSequentialList=st 913 | java.util.AbstractSet=st 914 | java.util.ArrayDeque=st 915 | java.util.ArrayList=st 916 | java.util.Arrays=pure 917 | java.util.BitSet=st 918 | java.util.Calendar=st 919 | java.util.Collection=st 920 | java.util.Collections=pure 921 | java.util.Comparator=pure 922 | java.util.Currency=pure 923 | java.util.Date=st 924 | java.util.Deque=st 925 | java.util.Dictionary=st 926 | java.util.Enumeration=st 927 | java.util.EnumMap=st 928 | java.util.EnumSet=st 929 | java.util.EventListener=st 930 | java.util.EventListenerProxy=st 931 | java.util.EventObject=st 932 | java.util.Formattable=st 933 | java.util.FormattableFlags=pure 934 | java.util.Formatter$BigDecimalLayoutForm=pure,FormatterBigDecimalLayoutForm 935 | java.util.Formatter=st 936 | java.util.GregorianCalendar=st 937 | java.util.HashMap=st 938 | java.util.HashSet=st 939 | java.util.Hashtable=st 940 | java.util.IdentityHashMap=st 941 | java.util.Iterator=st 942 | java.util.LinkedHashMap=st 943 | java.util.LinkedHashSet=st 944 | java.util.LinkedList=st 945 | java.util.List=st 946 | java.util.ListIterator=st 947 | java.util.ListResourceBundle=st 948 | java.util.Locale$Builder=st,LocaleBuilder 949 | java.util.Locale$Category=pure,LocaleCategory 950 | java.util.Locale=pure 951 | java.util.Map$Entry=st,MapEntry 952 | java.util.Map=st 953 | java.util.NavigableMap=st 954 | java.util.NavigableSet=st 955 | java.util.Objects=pure 956 | java.util.Observable=st 957 | java.util.Observer=st 958 | java.util.PriorityQueue=st 959 | java.util.Properties=st 960 | java.util.PropertyPermission=pure 961 | java.util.PropertyResourceBundle=st 962 | java.util.Queue=st 963 | java.util.Random=st 964 | java.util.RandomAccess=st 965 | java.util.ResourceBundle=st 966 | java.util.ResourceBundle$Control=pure 967 | java.util.Scanner=st 968 | java.util.ServiceLoader=st 969 | java.util.Set=st 970 | java.util.SimpleTimeZone=st 971 | java.util.SortedMap=st 972 | java.util.SortedSet=st 973 | java.util.Stack=st 974 | java.util.StringTokenizer=st 975 | java.util.Timer=st 976 | java.util.TimerTask=st 977 | java.util.TimeZone=pure 978 | java.util.TreeMap=st 979 | java.util.TreeSet=st 980 | java,util.UUID=pure 981 | java.util.Vector=st 982 | java.util.WeakHashMap=st 983 | 984 | java.util.regex.MatchResult=pure 985 | java.util.regex.Matcher=st,RegexMatcher 986 | java.util.regex.Pattern=pure,RegexPattern 987 | 988 | long=pure,Long 989 | short=pure,Short 990 | void=pure,() 991 | --------------------------------------------------------------------------------