From fa195087f37c3174fd519929763975567807353b Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Sat, 18 Oct 2008 00:34:21 -0400 Subject: [PATCH] Initial commit. Signed-off-by: Edward Z. Yang --- build-before-profiler.xml | 69 +++ build.xml | 70 +++ hs_err_pid5500.log | 175 ++++++ manifest.mf | 3 + nbproject/build-impl.xml | 629 +++++++++++++++++++++ nbproject/genfiles.properties | 11 + nbproject/profiler-build-impl.xml | 131 +++++ nbproject/project.properties | 65 +++ nbproject/project.xml | 19 + .../services/org.jdesktop.application.Application | 1 + .../ezyang/gravity/GravitySimulatorAboutBox.form | 203 +++++++ .../ezyang/gravity/GravitySimulatorAboutBox.java | 137 +++++ .../mit/ezyang/gravity/GravitySimulatorApp.java | 44 ++ .../mit/ezyang/gravity/GravitySimulatorView.form | 163 ++++++ .../mit/ezyang/gravity/GravitySimulatorView.java | 323 +++++++++++ .../resources/GravitySimulatorAboutBox.properties | 14 + .../resources/GravitySimulatorApp.properties | 11 + .../resources/GravitySimulatorView.properties | 37 ++ src/edu/mit/ezyang/gravity/resources/about.png | Bin 0 -> 8187 bytes .../gravity/resources/busyicons/busy-icon0.png | Bin 0 -> 3588 bytes .../gravity/resources/busyicons/busy-icon1.png | Bin 0 -> 3585 bytes .../gravity/resources/busyicons/busy-icon10.png | Bin 0 -> 3568 bytes .../gravity/resources/busyicons/busy-icon11.png | Bin 0 -> 3581 bytes .../gravity/resources/busyicons/busy-icon12.png | Bin 0 -> 3589 bytes .../gravity/resources/busyicons/busy-icon13.png | Bin 0 -> 3586 bytes .../gravity/resources/busyicons/busy-icon14.png | Bin 0 -> 3586 bytes .../gravity/resources/busyicons/busy-icon2.png | Bin 0 -> 3585 bytes .../gravity/resources/busyicons/busy-icon3.png | Bin 0 -> 3572 bytes .../gravity/resources/busyicons/busy-icon4.png | Bin 0 -> 3576 bytes .../gravity/resources/busyicons/busy-icon5.png | Bin 0 -> 3580 bytes .../gravity/resources/busyicons/busy-icon6.png | Bin 0 -> 3581 bytes .../gravity/resources/busyicons/busy-icon7.png | Bin 0 -> 3598 bytes .../gravity/resources/busyicons/busy-icon8.png | Bin 0 -> 3594 bytes .../gravity/resources/busyicons/busy-icon9.png | Bin 0 -> 3581 bytes .../gravity/resources/busyicons/idle-icon.png | Bin 0 -> 3360 bytes src/edu/mit/ezyang/gravity/resources/splash.png | Bin 0 -> 21747 bytes 36 files changed, 2105 insertions(+) create mode 100644 build-before-profiler.xml create mode 100644 build.xml create mode 100644 hs_err_pid5500.log create mode 100644 manifest.mf create mode 100644 nbproject/build-impl.xml create mode 100644 nbproject/genfiles.properties create mode 100644 nbproject/profiler-build-impl.xml create mode 100644 nbproject/project.properties create mode 100644 nbproject/project.xml create mode 100644 src/META-INF/services/org.jdesktop.application.Application create mode 100644 src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.form create mode 100644 src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.java create mode 100644 src/edu/mit/ezyang/gravity/GravitySimulatorApp.java create mode 100644 src/edu/mit/ezyang/gravity/GravitySimulatorView.form create mode 100644 src/edu/mit/ezyang/gravity/GravitySimulatorView.java create mode 100644 src/edu/mit/ezyang/gravity/resources/GravitySimulatorAboutBox.properties create mode 100644 src/edu/mit/ezyang/gravity/resources/GravitySimulatorApp.properties create mode 100644 src/edu/mit/ezyang/gravity/resources/GravitySimulatorView.properties create mode 100644 src/edu/mit/ezyang/gravity/resources/about.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon0.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon1.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon10.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon11.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon12.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon13.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon14.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon2.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon3.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon4.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon5.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon6.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon7.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon8.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon9.png create mode 100644 src/edu/mit/ezyang/gravity/resources/busyicons/idle-icon.png create mode 100644 src/edu/mit/ezyang/gravity/resources/splash.png diff --git a/build-before-profiler.xml b/build-before-profiler.xml new file mode 100644 index 0000000..1b9e8dd --- /dev/null +++ b/build-before-profiler.xml @@ -0,0 +1,69 @@ + + + + + + Builds, tests, and runs the project GravitySimulator. + + + diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..04af60a --- /dev/null +++ b/build.xml @@ -0,0 +1,70 @@ + + + + + + Builds, tests, and runs the project GravitySimulator. + + + + diff --git a/hs_err_pid5500.log b/hs_err_pid5500.log new file mode 100644 index 0000000..34c937b --- /dev/null +++ b/hs_err_pid5500.log @@ -0,0 +1,175 @@ +# +# An unexpected error has been detected by Java Runtime Environment: +# +# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d8efbf9, pid=5500, tid=992 +# +# Java VM: Java HotSpot(TM) Client VM (10.0-b23 mixed mode, sharing windows-x86) +# Problematic frame: +# V [jvm.dll+0x7fbf9] +# +# If you would like to submit a bug report, please visit: +# http://java.sun.com/webapps/bugreport/crash.jsp +# + +--------------- T H R E A D --------------- + +Current thread (0x02191800): VMThread [stack: 0x01320000,0x01370000] [id=992] + +siginfo: ExceptionCode=0xc0000005, reading address 0x00000000 + +Registers: +EAX=0x0000001e, EBX=0x00001000, ECX=0x00000000, EDX=0x6da5e154 +ESP=0x0136f644, EBP=0x0054fdd0, ESI=0x00000000, EDI=0x6da5e155 +EIP=0x6d8efbf9, EFLAGS=0x00010216 + +Top of Stack: (sp=0x0136f644) +0x0136f644: 0136f6b8 02191800 6d9c2517 6da5e154 +0x0136f654: 00000000 00000000 0136ff54 00000000 +0x0136f664: 7c34d518 7c391358 00000000 6da5e458 +0x0136f674: 00000000 0136ff44 6da5e000 6d870000 +0x0136f684: 00000080 0001d000 00001000 00000002 +0x0136f694: 6d9c31ae 0054fdd0 7c34246e 0136f6c0 +0x0136f6a4: 00000000 0136f6c0 00000000 00000000 +0x0136f6b4: 00000000 0136f7ac 0136f7c8 0136f6e4 + +Instructions: (pc=0x6d8efbf9) +0x6d8efbe9: f1 8d 78 01 8d 49 00 8a 08 40 84 c9 75 f9 2b c7 +0x6d8efbf9: 8b 3e 50 52 8b ce ff 57 04 8b ce e8 27 3d 0d 00 + + +Stack: [0x01320000,0x01370000], sp=0x0136f644, free space=317k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x7fbf9] + +VM_Operation (0x04c6f3f8): Exit, mode: safepoint, requested by thread 0x04457000 + + +--------------- P R O C E S S --------------- + +Java Threads: ( => current thread ) + 0x051b6c00 JavaThread "J3D-InputDeviceScheduler-1" [_thread_blocked, id=4180, stack(0x04fe0000,0x05030000)] + 0x051b6400 JavaThread "J3D-SoundSchedulerUpdateThread-1" [_thread_blocked, id=4860, stack(0x04f90000,0x04fe0000)] + 0x051b6000 JavaThread "J3D-RenderStructureUpdateThread-1" [_thread_blocked, id=6104, stack(0x04f40000,0x04f90000)] + 0x051b5800 JavaThread "J3D-BehaviorScheduler-1" [_thread_blocked, id=5988, stack(0x04ef0000,0x04f40000)] + 0x051b5400 JavaThread "J3D-TransformStructureUpdateThread-1" [_thread_blocked, id=5496, stack(0x04ea0000,0x04ef0000)] + 0x051b4c00 JavaThread "J3D-RenderingEnvironmentStructureUpdateThread-1" [_thread_blocked, id=2964, stack(0x04e50000,0x04ea0000)] + 0x051b4800 JavaThread "J3D-SoundStructureUpdateThread-1" [_thread_blocked, id=5464, stack(0x04e00000,0x04e50000)] + 0x051b4400 JavaThread "J3D-GeometryStructureUpdateThread-1" [_thread_blocked, id=3232, stack(0x04db0000,0x04e00000)] + 0x051b3c00 JavaThread "J3D-BehaviorStructureUpdateThread-1" [_thread_blocked, id=1156, stack(0x04d60000,0x04db0000)] + 0x050c0000 JavaThread "J3D-Renderer-1" [_thread_in_native, id=4316, stack(0x06300000,0x06350000)] + 0x050bf800 JavaThread "J3D-MasterControl-1" [_thread_blocked, id=5976, stack(0x062b0000,0x06300000)] + 0x050bc000 JavaThread "J3D-NotificationThread" [_thread_blocked, id=5016, stack(0x06260000,0x062b0000)] + 0x050bb800 JavaThread "J3D-TimerThread" [_thread_blocked, id=5568, stack(0x06210000,0x06260000)] + 0x04471c00 JavaThread "J3D-RenderingAttributesStructureUpdateThread" [_thread_blocked, id=5124, stack(0x06140000,0x06190000)] + 0x02171400 JavaThread "DestroyJavaVM" [_thread_blocked, id=3880, stack(0x001f0000,0x00240000)] + 0x04457000 JavaThread "AWT-EventQueue-0" [_thread_blocked, id=5940, stack(0x04c20000,0x04c70000)] + 0x021e3000 JavaThread "AWT-Shutdown" [_thread_blocked, id=4076, stack(0x04b40000,0x04b90000)] + 0x04456c00 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=4052, stack(0x04af0000,0x04b40000)] + 0x021b2c00 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=4276, stack(0x043a0000,0x043f0000)] + 0x021a4800 JavaThread "CompilerThread0" daemon [_thread_blocked, id=1452, stack(0x04350000,0x043a0000)] + 0x021a4000 JavaThread "Attach Listener" daemon [_thread_blocked, id=5656, stack(0x04300000,0x04350000)] + 0x0219b400 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=3604, stack(0x042b0000,0x04300000)] + 0x02197400 JavaThread "Finalizer" daemon [_thread_blocked, id=5980, stack(0x04260000,0x042b0000)] + 0x02193000 JavaThread "Reference Handler" daemon [_thread_blocked, id=3536, stack(0x02090000,0x020e0000)] + +Other Threads: +=>0x02191800 VMThread [stack: 0x01320000,0x01370000] [id=992] + +VM state:at safepoint (shutting down) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x01387030/0x00000164] Threads_lock - owner thread: 0x02191800 + +Heap + def new generation total 960K, used 578K [0x23d00000, 0x23e00000, 0x241e0000) + eden space 896K, 61% used [0x23d00000, 0x23d89280, 0x23de0000) + from space 64K, 47% used [0x23de0000, 0x23de78c8, 0x23df0000) + to space 64K, 0% used [0x23df0000, 0x23df0000, 0x23e00000) + tenured generation total 4096K, used 3499K [0x241e0000, 0x245e0000, 0x27d00000) + the space 4096K, 85% used [0x241e0000, 0x2454ae08, 0x2454b000, 0x245e0000) + compacting perm gen total 12288K, used 5071K [0x27d00000, 0x28900000, 0x2bd00000) + the space 12288K, 41% used [0x27d00000, 0x281f3f28, 0x281f4000, 0x28900000) + ro space 8192K, 66% used [0x2bd00000, 0x2c250f10, 0x2c251000, 0x2c500000) + rw space 12288K, 52% used [0x2c500000, 0x2cb506d0, 0x2cb50800, 0x2d100000) + +Dynamic libraries: +0x00400000 - 0x00423000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\java.exe +0x773d0000 - 0x774f7000 C:\Windows\system32\ntdll.dll +0x75d20000 - 0x75dfb000 C:\Windows\system32\kernel32.dll +0x75c50000 - 0x75d16000 C:\Windows\system32\ADVAPI32.dll +0x76fc0000 - 0x77082000 C:\Windows\system32\RPCRT4.dll +0x7c340000 - 0x7c396000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\msvcr71.dll +0x6d870000 - 0x6dac0000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\client\jvm.dll +0x77590000 - 0x7762d000 C:\Windows\system32\USER32.dll +0x76eb0000 - 0x76efb000 C:\Windows\system32\GDI32.dll +0x741c0000 - 0x741f2000 C:\Windows\system32\WINMM.dll +0x76f00000 - 0x76faa000 C:\Windows\system32\msvcrt.dll +0x771b0000 - 0x772f4000 C:\Windows\system32\ole32.dll +0x77120000 - 0x771ad000 C:\Windows\system32\OLEAUT32.dll +0x751b0000 - 0x751e9000 C:\Windows\system32\OLEACC.dll +0x75e00000 - 0x75e1e000 C:\Windows\system32\IMM32.DLL +0x75f80000 - 0x76048000 C:\Windows\system32\MSCTF.dll +0x75a30000 - 0x75a5c000 C:\Windows\system32\apphelp.dll +0x76050000 - 0x76059000 C:\Windows\system32\LPK.DLL +0x76e30000 - 0x76ead000 C:\Windows\system32\USP10.dll +0x77510000 - 0x7753d000 C:\Windows\system32\WS2_32.dll +0x77500000 - 0x77506000 C:\Windows\system32\NSI.dll +0x75ab0000 - 0x75ad1000 C:\Windows\system32\NTMARTA.DLL +0x77540000 - 0x7758a000 C:\Windows\system32\WLDAP32.dll +0x75c40000 - 0x75c47000 C:\Windows\system32\PSAPI.DLL +0x75a90000 - 0x75aa1000 C:\Windows\system32\SAMLIB.dll +0x6d320000 - 0x6d328000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\hpi.dll +0x6d820000 - 0x6d82c000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\verify.dll +0x6d3c0000 - 0x6d3df000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\java.dll +0x6d860000 - 0x6d86f000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\zip.dll +0x6d0b0000 - 0x6d1de000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\awt.dll +0x75350000 - 0x75392000 C:\Windows\system32\WINSPOOL.DRV +0x744b0000 - 0x744ef000 C:\Windows\system32\uxtheme.dll +0x494e0000 - 0x494e7000 C:\Software\Cli\TrayIt4!.dll +0x76060000 - 0x76b6f000 C:\Windows\system32\shell32.dll +0x76d00000 - 0x76d58000 C:\Windows\system32\SHLWAPI.dll +0x74e30000 - 0x74fce000 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_5cdbaa5a083979cc\comctl32.dll +0x6d2c0000 - 0x6d313000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\fontmanager.dll +0x6d620000 - 0x6d633000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\net.dll +0x750c0000 - 0x750fb000 C:\Windows\system32\mswsock.dll +0x75130000 - 0x75135000 C:\Windows\System32\wship6.dll +0x6d640000 - 0x6d649000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\nio.dll +0x10000000 - 0x1000e000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\j3dcore-ogl-chk.dll +0x6a240000 - 0x6a30b000 C:\Windows\system32\OPENGL32.dll +0x6d010000 - 0x6d033000 C:\Windows\system32\GLU32.dll +0x6b470000 - 0x6b555000 C:\Windows\system32\DDRAW.dll +0x742a0000 - 0x742a6000 C:\Windows\system32\DCIMAN32.dll +0x76b70000 - 0x76cfa000 C:\Windows\system32\SETUPAPI.dll +0x72540000 - 0x7254c000 C:\Windows\system32\dwmapi.dll +0x05c70000 - 0x05ebb000 C:\Windows\system32\ig4icd32.dll +0x05ec0000 - 0x06035000 C:\Windows\system32\ig4dev32.dll +0x6d3f0000 - 0x6d3f6000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\jawt.dll +0x05c10000 - 0x05c39000 C:\Program Files\Java\jdk1.6.0_07\jre\bin\j3dcore-ogl.dll +0x77090000 - 0x77114000 C:\Windows\system32\CLBCatQ.DLL + +VM Arguments: +java_command: edu.mit.ezyang.gravity.GravitySimulatorApp +Launcher Type: SUN_STANDARD + +Environment Variables: +CLASSPATH=.;C:\Program Files\Java\jre1.6.0\lib\ext\QTJava.zip +PATH=C:\Software\Cygwin\bin;C:\Software\MiKTeX\miktex\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\Common Files\Roxio Shared\DLLShared\;C:\Program Files\CollabNet Subversion;C:\Program Files\Subversion\bin;C:\Program Files\doxygen\bin;C:\Software\Cli;C:\Program Files\MySQL\MySQL Server 5.0\bin;C:\Users\Edward\Webs\cake\1.2.x.x\cake\console;C:\Program Files\Git\cmd;C:\Program Files\GNU\GnuPG;C:\Program Files\TortoiseSVN\bin;C:\Program Files\MATLAB\R2008a\bin;C:\Program Files\MATLAB\R2008a\bin\win32;C:\Program Files\QuickTime\QTSystem\;C:\Program Files\LilyPond\usr\bin;C:\Software\PHP/versions/5.2.6;C:\Program Files\OpenVPN\bin;C:\Program Files\Nmap +USERNAME=Edward +OS=Windows_NT +PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 13, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows Vista Build 6001 Service Pack 1 + +CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 15 stepping 13, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3 + +Memory: 4k page, physical 2086204k(527060k free), swap 4194303k(2456968k free) + +vm_info: Java HotSpot(TM) Client VM (10.0-b23) for windows-x86 JRE (1.6.0_07-b06), built on Jun 10 2008 01:14:11 by "java_re" with MS VC++ 7.1 + +time: Fri Oct 17 18:04:05 2008 +elapsed time: 12 seconds + diff --git a/manifest.mf b/manifest.mf new file mode 100644 index 0000000..328e8e5 --- /dev/null +++ b/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml new file mode 100644 index 0000000..8ca8ea3 --- /dev/null +++ b/nbproject/build-impl.xml @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties new file mode 100644 index 0000000..8737d76 --- /dev/null +++ b/nbproject/genfiles.properties @@ -0,0 +1,11 @@ +build.xml.data.CRC32=3e062047 +build.xml.script.CRC32=45612313 +build.xml.stylesheet.CRC32=be360661 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=ef36b87e +nbproject/build-impl.xml.script.CRC32=bb9fbd47 +nbproject/build-impl.xml.stylesheet.CRC32=487672f9 +nbproject/profiler-build-impl.xml.data.CRC32=3e062047 +nbproject/profiler-build-impl.xml.script.CRC32=abda56ed +nbproject/profiler-build-impl.xml.stylesheet.CRC32=42cb6bcf diff --git a/nbproject/profiler-build-impl.xml b/nbproject/profiler-build-impl.xml new file mode 100644 index 0000000..7c8995d --- /dev/null +++ b/nbproject/profiler-build-impl.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + Must select one file in the IDE or set profile.class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..6f743ee --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,65 @@ +application.desc=A simple java desktop application based on Swing Application Framework +application.homepage=http://appframework.dev.java.net +application.title=Basic Application Example +application.vendor=Sun Microsystems Inc. +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/GravitySimulator.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath=\ + ${libs.swing-app-framework.classpath}:\ + ${libs.absolutelayout.classpath} +# Space-separated list of extra javac options +javac.compilerargs=-Xlint:unchecked +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit.classpath}:\ + ${libs.junit_4.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class=edu.mit.ezyang.gravity.GravitySimulatorApp +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..baf62a6 --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,19 @@ + + + org.netbeans.modules.java.j2seproject + + + GravitySimulator + 1.6.5 + + + + + + + + + + + + diff --git a/src/META-INF/services/org.jdesktop.application.Application b/src/META-INF/services/org.jdesktop.application.Application new file mode 100644 index 0000000..d79ed1a --- /dev/null +++ b/src/META-INF/services/org.jdesktop.application.Application @@ -0,0 +1 @@ +gravitysimulator.GravitySimulatorApp \ No newline at end of file diff --git a/src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.form b/src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.form new file mode 100644 index 0000000..9e6b515 --- /dev/null +++ b/src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.form @@ -0,0 +1,203 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.java b/src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.java new file mode 100644 index 0000000..e11f7e3 --- /dev/null +++ b/src/edu/mit/ezyang/gravity/GravitySimulatorAboutBox.java @@ -0,0 +1,137 @@ +/* + * GravitySimulatorAboutBox.java + */ + +package edu.mit.ezyang.gravity; + +import org.jdesktop.application.Action; + +public class GravitySimulatorAboutBox extends javax.swing.JDialog { + + public GravitySimulatorAboutBox(java.awt.Frame parent) { + super(parent); + initComponents(); + getRootPane().setDefaultButton(closeButton); + } + + @Action public void closeAboutBox() { + setVisible(false); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + closeButton = new javax.swing.JButton(); + javax.swing.JLabel appTitleLabel = new javax.swing.JLabel(); + javax.swing.JLabel versionLabel = new javax.swing.JLabel(); + javax.swing.JLabel appVersionLabel = new javax.swing.JLabel(); + javax.swing.JLabel vendorLabel = new javax.swing.JLabel(); + javax.swing.JLabel appVendorLabel = new javax.swing.JLabel(); + javax.swing.JLabel homepageLabel = new javax.swing.JLabel(); + javax.swing.JLabel appHomepageLabel = new javax.swing.JLabel(); + javax.swing.JLabel appDescLabel = new javax.swing.JLabel(); + javax.swing.JLabel imageLabel = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(edu.mit.ezyang.gravity.GravitySimulatorApp.class).getContext().getResourceMap(GravitySimulatorAboutBox.class); + setTitle(resourceMap.getString("title")); // NOI18N + setModal(true); + setName("aboutBox"); // NOI18N + setResizable(false); + + javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(edu.mit.ezyang.gravity.GravitySimulatorApp.class).getContext().getActionMap(GravitySimulatorAboutBox.class, this); + closeButton.setAction(actionMap.get("closeAboutBox")); // NOI18N + closeButton.setName("closeButton"); // NOI18N + + appTitleLabel.setFont(appTitleLabel.getFont().deriveFont(appTitleLabel.getFont().getStyle() | java.awt.Font.BOLD, appTitleLabel.getFont().getSize()+4)); + appTitleLabel.setText(resourceMap.getString("Application.title")); // NOI18N + appTitleLabel.setName("appTitleLabel"); // NOI18N + + versionLabel.setFont(versionLabel.getFont().deriveFont(versionLabel.getFont().getStyle() | java.awt.Font.BOLD)); + versionLabel.setText(resourceMap.getString("versionLabel.text")); // NOI18N + versionLabel.setName("versionLabel"); // NOI18N + + appVersionLabel.setText(resourceMap.getString("Application.version")); // NOI18N + appVersionLabel.setName("appVersionLabel"); // NOI18N + + vendorLabel.setFont(vendorLabel.getFont().deriveFont(vendorLabel.getFont().getStyle() | java.awt.Font.BOLD)); + vendorLabel.setText(resourceMap.getString("vendorLabel.text")); // NOI18N + vendorLabel.setName("vendorLabel"); // NOI18N + + appVendorLabel.setText(resourceMap.getString("Application.vendor")); // NOI18N + appVendorLabel.setName("appVendorLabel"); // NOI18N + + homepageLabel.setFont(homepageLabel.getFont().deriveFont(homepageLabel.getFont().getStyle() | java.awt.Font.BOLD)); + homepageLabel.setText(resourceMap.getString("homepageLabel.text")); // NOI18N + homepageLabel.setName("homepageLabel"); // NOI18N + + appHomepageLabel.setText(resourceMap.getString("Application.homepage")); // NOI18N + appHomepageLabel.setName("appHomepageLabel"); // NOI18N + + appDescLabel.setText(resourceMap.getString("appDescLabel.text")); // NOI18N + appDescLabel.setName("appDescLabel"); // NOI18N + + imageLabel.setIcon(resourceMap.getIcon("imageLabel.icon")); // NOI18N + imageLabel.setName("imageLabel"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(imageLabel) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(versionLabel) + .addComponent(vendorLabel) + .addComponent(homepageLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(appVersionLabel) + .addComponent(appVendorLabel) + .addComponent(appHomepageLabel))) + .addComponent(appTitleLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(appDescLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE) + .addComponent(closeButton)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(imageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(appTitleLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(appDescLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(versionLabel) + .addComponent(appVersionLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(vendorLabel) + .addComponent(appVendorLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(homepageLabel) + .addComponent(appHomepageLabel)) + .addGap(19, 19, Short.MAX_VALUE) + .addComponent(closeButton) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton closeButton; + // End of variables declaration//GEN-END:variables + +} diff --git a/src/edu/mit/ezyang/gravity/GravitySimulatorApp.java b/src/edu/mit/ezyang/gravity/GravitySimulatorApp.java new file mode 100644 index 0000000..962cfec --- /dev/null +++ b/src/edu/mit/ezyang/gravity/GravitySimulatorApp.java @@ -0,0 +1,44 @@ +/* + * GravitySimulatorApp.java + */ + +package edu.mit.ezyang.gravity; + +import org.jdesktop.application.Application; +import org.jdesktop.application.SingleFrameApplication; + +/** + * The main class of the application. + */ +public class GravitySimulatorApp extends SingleFrameApplication { + + /** + * At startup create and show the main frame of the application. + */ + @Override protected void startup() { + show(new GravitySimulatorView(this)); + } + + /** + * This method is to initialize the specified window by injecting resources. + * Windows shown in our application come fully initialized from the GUI + * builder, so this additional configuration is not needed. + */ + @Override protected void configureWindow(java.awt.Window root) { + } + + /** + * A convenient static getter for the application instance. + * @return the instance of GravitySimulatorApp + */ + public static GravitySimulatorApp getApplication() { + return Application.getInstance(GravitySimulatorApp.class); + } + + /** + * Main method launching the application. + */ + public static void main(String[] args) { + launch(GravitySimulatorApp.class, args); + } +} diff --git a/src/edu/mit/ezyang/gravity/GravitySimulatorView.form b/src/edu/mit/ezyang/gravity/GravitySimulatorView.form new file mode 100644 index 0000000..d736526 --- /dev/null +++ b/src/edu/mit/ezyang/gravity/GravitySimulatorView.form @@ -0,0 +1,163 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/edu/mit/ezyang/gravity/GravitySimulatorView.java b/src/edu/mit/ezyang/gravity/GravitySimulatorView.java new file mode 100644 index 0000000..6b38c38 --- /dev/null +++ b/src/edu/mit/ezyang/gravity/GravitySimulatorView.java @@ -0,0 +1,323 @@ +/* + * GravitySimulatorView.java + */ + +package edu.mit.ezyang.gravity; + +import org.jdesktop.application.Action; +import org.jdesktop.application.SingleFrameApplication; +import org.jdesktop.application.FrameView; +import javax.swing.JDialog; + +import javax.swing.JFrame; +import com.sun.j3d.utils.behaviors.mouse.*; +import com.sun.j3d.utils.geometry.*; +import com.sun.j3d.utils.universe.*; +import java.util.HashMap; +import javax.media.j3d.*; +import javax.swing.JPopupMenu; +import javax.vecmath.*; + +/** + * The application's main frame. + */ +public class GravitySimulatorView extends FrameView { + + /** + * SimpleUniverse controlling everything + */ + protected SimpleUniverse universe; + + /** + * Root group node that new elements should be added to. + */ + protected BranchGroup universeRoot; + + /** + * 3D transform controlling viewpoint. + */ + protected Transform3D viewTransform; + + protected TransformGroup viewTransformGroup; + + public GravitySimulatorView(SingleFrameApplication app) { + super(app); + + // make menus heavy + JPopupMenu.setDefaultLightWeightPopupEnabled(false); + initComponents(); + + // 3D canvas initialization + Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); + universe = new SimpleUniverse(canvas); + + BranchGroup root = new BranchGroup(); + TransformGroup rotateGroup = new TransformGroup(); + universeRoot = new BranchGroup(); + universeRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); + universeRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); + processCommand("add cube"); + + //processCommand("clear"); + //processCommand("add sphere"); + + rotateGroup.addChild(universeRoot); + rotateGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); + rotateGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); + + BoundingSphere bounding = new BoundingSphere(new Point3d(0f,0f,0f), 1000.0f); + + DirectionalLight light = new DirectionalLight(new Color3f(1.8f, 0.2f, 0.2f), new Vector3f(4.0f, -7.0f, 7.0f)); + light.setInfluencingBounds(bounding); + rotateGroup.addChild(light); + + AmbientLight ambLight = new AmbientLight(new Color3f(1f, 1f, 1f)); + ambLight.setInfluencingBounds(bounding); + rotateGroup.addChild(ambLight); + + Transform3D yAxis = new Transform3D(); + Alpha rotationAlpha = new Alpha(-1, 4000); + RotationInterpolator rotator = new RotationInterpolator( + rotationAlpha, rotateGroup, yAxis, + 0.0f, (float) Math.PI*2.0f); + BoundingSphere bounds = + new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); + rotator.setSchedulingBounds(bounds); + rotateGroup.addChild(rotator); + + TransformGroup controlGroup = new TransformGroup(); + controlGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); + controlGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); + MouseRotate behavior = new MouseRotate(); + behavior.setTransformGroup(controlGroup); + behavior.setSchedulingBounds(new BoundingSphere()); + controlGroup.addChild(behavior); + + controlGroup.addChild(rotateGroup); + root.addChild(controlGroup); + universe.addBranchGraph(root); + ViewingPlatform platform = universe.getViewingPlatform(); + platform.setNominalViewingTransform(); + viewTransformGroup = platform.getMultiTransformGroup().getTransformGroup(0); + viewTransform = new Transform3D(); + viewTransform.setTranslation(new Vector3f(0.0f,0.0f,10.0f)); + viewTransformGroup.setTransform(viewTransform); + //universe.getViewer().getView().setFieldOfView(60f); + canvasPanel.add(canvas); + + } + + /** + * Processes a command from the command line box, modifying Universe. + * @param command to execute + */ + public void processCommand(String command) { + send(command); + String[] parts = command.split(" "); + if (parts.length == 0 || parts[0].equals("") || parts[0].equals("help")) { + send("Commands: add, view, clear"); + return; + } + if (parts[0].equals("add")) { + if (parts.length == 1) { + send("Need object to add: sphere, cone, cube or cylinder"); + return; + } + BranchGroup group = new BranchGroup(); + group.setCapability(BranchGroup.ALLOW_DETACH); + + // initialize default "first class" parameters + float scale = 0.4f; + Vector3f location = new Vector3f(0f, 0f, 0f); + + // initialize generic params HashMap; this can be used for + // any sort of thing you want + HashMap params = new HashMap(); + + // parse the arguments + if (parts.length > 2) { + String state = null; + for (int i = 2; i < parts.length; i++) { + if (state == null) { + state = parts[i]; + } else { + if (state.equals("scale")) { + scale = new Float(parts[i]); + } else if (state.equals("at")) { + location = vectorize(parts[i]); + } else { + params.put(state, parts[i]); + } + state = null; + } + } + } + // generate the actual primitive + Node object; + if (parts[1].equals("sphere")) { + Sphere sphere = new Sphere(scale); + sphere.getAppearance().getMaterial().setAmbientColor(.8f,.2f,.2f); + object = sphere; + } else if (parts[1].equals("cube")) { + object = new ColorCube(scale); + } else if (parts[1].equals("cone")) { + object = new Cone(scale * 1f, scale * 2f); + } else if (parts[1].equals("cylinder")) { + object = new Cylinder(scale * 1f, scale * 2f); + } else { + send("Unknown primitive: " + parts[1]); + return; + } + // generate the transform (we do this even if we don't position them + // anywhere interesting) + Transform3D transform = new Transform3D(); + TransformGroup transformGroup = new TransformGroup(); + transform.setTranslation(location); + transformGroup.setTransform(transform); + + transformGroup.addChild(object); + group.addChild(transformGroup); + universeRoot.addChild(group); + } else if (parts[0].equals("view")) { + if (parts.length == 1) { + send("Need location parameter x,y,z"); + return; + } + viewTransform.setTranslation(vectorize(parts[1])); + viewTransformGroup.setTransform(viewTransform); + } else if (parts[0].equals("zoom")) { + if (parts.length == 1) { + send("Need zoom value z (view 0,0,z)"); + return; + } + viewTransform.setTranslation(vectorize("0,0," + parts[1])); + viewTransformGroup.setTransform(viewTransform); + } else if (parts[0].equals("clear")) { + universeRoot.removeAllChildren(); + } else { + send("Unknown command: " + parts[0] + ", type help for options"); + return; + } + } + + /** + * Converts string in form x,y,z to Vector3f + * @param input vector in form x,y,z + * @return + */ + protected Vector3f vectorize(String input) { + String[] vectorFields = input.split(","); + return new Vector3f(new Float(vectorFields[0]), new Float(vectorFields[1]), new Float(vectorFields[2])); + } + + protected void send(String message) { + terminal.append(message + "\n"); + } + + @Action + public void showAboutBox() { + if (aboutBox == null) { + JFrame mainFrame = GravitySimulatorApp.getApplication().getMainFrame(); + aboutBox = new GravitySimulatorAboutBox(mainFrame); + aboutBox.setLocationRelativeTo(mainFrame); + } + GravitySimulatorApp.getApplication().show(aboutBox); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + mainPanel = new javax.swing.JPanel(); + canvasPanel = new javax.swing.JPanel(); + console = new javax.swing.JPanel(); + commandLine = new javax.swing.JTextField(); + terminalPane = new javax.swing.JScrollPane(); + terminal = new javax.swing.JTextArea(); + menuBar = new javax.swing.JMenuBar(); + javax.swing.JMenu fileMenu = new javax.swing.JMenu(); + javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem(); + javax.swing.JMenu helpMenu = new javax.swing.JMenu(); + javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem(); + + mainPanel.setName("mainPanel"); // NOI18N + mainPanel.setLayout(new java.awt.BorderLayout()); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(edu.mit.ezyang.gravity.GravitySimulatorApp.class).getContext().getResourceMap(GravitySimulatorView.class); + canvasPanel.setBackground(resourceMap.getColor("canvasPanel.background")); // NOI18N + canvasPanel.setName("canvasPanel"); // NOI18N + canvasPanel.setLayout(new java.awt.BorderLayout()); + mainPanel.add(canvasPanel, java.awt.BorderLayout.CENTER); + + console.setName("console"); // NOI18N + console.setLayout(new java.awt.BorderLayout()); + + commandLine.setText(resourceMap.getString("commandLine.text")); // NOI18N + commandLine.setName("commandLine"); // NOI18N + commandLine.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + commandLineActionPerformed(evt); + } + }); + console.add(commandLine, java.awt.BorderLayout.CENTER); + + terminalPane.setName("terminalPane"); // NOI18N + + terminal.setColumns(20); + terminal.setEditable(false); + terminal.setFont(resourceMap.getFont("terminal.font")); // NOI18N + terminal.setRows(5); + terminal.setName("terminal"); // NOI18N + terminalPane.setViewportView(terminal); + + console.add(terminalPane, java.awt.BorderLayout.PAGE_START); + + mainPanel.add(console, java.awt.BorderLayout.PAGE_END); + + menuBar.setName("menuBar"); // NOI18N + + fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N + fileMenu.setName("fileMenu"); // NOI18N + + javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(edu.mit.ezyang.gravity.GravitySimulatorApp.class).getContext().getActionMap(GravitySimulatorView.class, this); + exitMenuItem.setAction(actionMap.get("quit")); // NOI18N + exitMenuItem.setName("exitMenuItem"); // NOI18N + fileMenu.add(exitMenuItem); + + menuBar.add(fileMenu); + + helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N + helpMenu.setName("helpMenu"); // NOI18N + + aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N + aboutMenuItem.setName("aboutMenuItem"); // NOI18N + helpMenu.add(aboutMenuItem); + + menuBar.add(helpMenu); + + setComponent(mainPanel); + setMenuBar(menuBar); + }// //GEN-END:initComponents + +private void commandLineActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commandLineActionPerformed + processCommand(commandLine.getText()); + commandLine.setText(""); +}//GEN-LAST:event_commandLineActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel canvasPanel; + private javax.swing.JTextField commandLine; + private javax.swing.JPanel console; + private javax.swing.JPanel mainPanel; + private javax.swing.JMenuBar menuBar; + private javax.swing.JTextArea terminal; + private javax.swing.JScrollPane terminalPane; + // End of variables declaration//GEN-END:variables + + private JDialog aboutBox; +} diff --git a/src/edu/mit/ezyang/gravity/resources/GravitySimulatorAboutBox.properties b/src/edu/mit/ezyang/gravity/resources/GravitySimulatorAboutBox.properties new file mode 100644 index 0000000..b76ddd5 --- /dev/null +++ b/src/edu/mit/ezyang/gravity/resources/GravitySimulatorAboutBox.properties @@ -0,0 +1,14 @@ +title = About: ${Application.title} ${Application.version} + +closeAboutBox.Action.text = &Close + +appDescLabel.text=${Application.description} + +versionLabel.text=Product Version\: + +vendorLabel.text=Vendor\: + +homepageLabel.text=Homepage\: + +#NOI18N +imageLabel.icon=about.png diff --git a/src/edu/mit/ezyang/gravity/resources/GravitySimulatorApp.properties b/src/edu/mit/ezyang/gravity/resources/GravitySimulatorApp.properties new file mode 100644 index 0000000..61d16cd --- /dev/null +++ b/src/edu/mit/ezyang/gravity/resources/GravitySimulatorApp.properties @@ -0,0 +1,11 @@ +# Application global resources + +Application.name = GravitySimulator +Application.title = Basic Application Example +Application.version = 1.0 +Application.vendor = Sun Microsystems Inc. +Application.homepage = http://appframework.dev.java.net +Application.description = A simple java desktop application based on Swing Application Framework +Application.vendorId = Sun +Application.id = ${Application.name} +Application.lookAndFeel = system diff --git a/src/edu/mit/ezyang/gravity/resources/GravitySimulatorView.properties b/src/edu/mit/ezyang/gravity/resources/GravitySimulatorView.properties new file mode 100644 index 0000000..1085a61 --- /dev/null +++ b/src/edu/mit/ezyang/gravity/resources/GravitySimulatorView.properties @@ -0,0 +1,37 @@ +# Resources for the GravitySimulatorView class + +# top-level menus + +fileMenu.text = File +helpMenu.text = Help + +# @Action resources + +showAboutBox.Action.text = &About... +showAboutBox.Action.shortDescription = Show the application's information dialog + +# status bar resources + +StatusBar.messageTimeout = 5000 +StatusBar.busyAnimationRate = 30 +StatusBar.idleIcon = busyicons/idle-icon.png +StatusBar.busyIcons[0] = busyicons/busy-icon0.png +StatusBar.busyIcons[1] = busyicons/busy-icon1.png +StatusBar.busyIcons[2] = busyicons/busy-icon2.png +StatusBar.busyIcons[3] = busyicons/busy-icon3.png +StatusBar.busyIcons[4] = busyicons/busy-icon4.png +StatusBar.busyIcons[5] = busyicons/busy-icon5.png +StatusBar.busyIcons[6] = busyicons/busy-icon6.png +StatusBar.busyIcons[7] = busyicons/busy-icon7.png +StatusBar.busyIcons[8] = busyicons/busy-icon8.png +StatusBar.busyIcons[9] = busyicons/busy-icon9.png +StatusBar.busyIcons[10] = busyicons/busy-icon10.png +StatusBar.busyIcons[11] = busyicons/busy-icon11.png +StatusBar.busyIcons[12] = busyicons/busy-icon12.png +StatusBar.busyIcons[13] = busyicons/busy-icon13.png +StatusBar.busyIcons[14] = busyicons/busy-icon14.png +#NOI18N +canvasPanel.background=240, 240, 240 +commandLine.text= +#NOI18N +terminal.font=Monospaced-Plain-12 diff --git a/src/edu/mit/ezyang/gravity/resources/about.png b/src/edu/mit/ezyang/gravity/resources/about.png new file mode 100644 index 0000000000000000000000000000000000000000..c6dfe0a5228507c09da581f78f712dbcf25e37c8 GIT binary patch literal 8187 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 A_y7O^ literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon0.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon0.png new file mode 100644 index 0000000000000000000000000000000000000000..242c0c85bc938a08f6eaa046bd24e9509b0b1d9c GIT binary patch literal 3588 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 KMNUMnLSTZ21;I%G literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon1.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6f63438ec797feb79c00697d783e4c58dcbe88 GIT binary patch literal 3585 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 Hu0mjf*HOc* literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon10.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon10.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ef4a1fc6a59aec6b053ed05c17ad3a2d24ec9b GIT binary patch literal 3568 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 DwfwCf literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon12.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon12.png new file mode 100644 index 0000000000000000000000000000000000000000..e447ee8ac29a421f2cc2c6786ace0e13559d280a GIT binary patch literal 3589 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 LNkvXXu0mjf9hSZ+ literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon13.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon13.png new file mode 100644 index 0000000000000000000000000000000000000000..848a6f1a41bac5459b3768c20e3eb044749c158e GIT binary patch literal 3586 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 IM6N<$g3?{b8UO$Q literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon14.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon14.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3561df212ff3f799e2e5c6f99db7746ffa783c GIT binary patch literal 3586 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 IM6N<$f;*eD;Q#;t literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon2.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..c866e62a7c6ae133b78981f8cfa7562364682ce0 GIT binary patch literal 3585 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 Hu0mjfrAo$p literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon3.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..9be22fa58602d70a8ffa3b0a7729ebc938153a54 GIT binary patch literal 3572 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 D&7!)r literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon7.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon7.png new file mode 100644 index 0000000000000000000000000000000000000000..49fbc6ec54f7a5a44a83ff2a7fab1d2c286e5b18 GIT binary patch literal 3598 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 literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon8.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon8.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a5a409387b1eccc58b63fa0d1afa9b80108ba8 GIT binary patch literal 3594 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 Qv;Y7A07*qoM6N<$f^|K;T>t<8 literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon9.png b/src/edu/mit/ezyang/gravity/resources/busyicons/busy-icon9.png new file mode 100644 index 0000000000000000000000000000000000000000..827801235b043066db61a9b1216d8f2e11002a7b GIT binary patch literal 3581 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 DEnc`0 literal 0 HcwPel00001 diff --git a/src/edu/mit/ezyang/gravity/resources/busyicons/idle-icon.png b/src/edu/mit/ezyang/gravity/resources/busyicons/idle-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..50312f85a94a9ff69ada73017e9700c464655790 GIT binary patch literal 3360 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 literal 0 HcwPel00001 -- 2.11.4.GIT