From b258ed441ac28f60afed0e287654a91b3b0c5607 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Sat, 2 Sep 2023 11:30:15 -0700 Subject: [PATCH 1/5] decompress faster --- Platform/Apple/virtual/src/core/decomp.s | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Platform/Apple/virtual/src/core/decomp.s b/Platform/Apple/virtual/src/core/decomp.s index a83ef764..468c15fb 100644 --- a/Platform/Apple/virtual/src/core/decomp.s +++ b/Platform/Apple/virtual/src/core/decomp.s @@ -33,8 +33,9 @@ DEBUG = 0 decomp !zone { jsr .chkdst ldy #0 ; In lit loop Y must be zero + sec .fill1A jsr .getbt2 - jmp .fill1B + bne .fill1B ; always taken .incdst inc pDst+1 .chkdst ldx pDst+1 @@ -174,19 +175,19 @@ decomp !zone { bne .gshift ; always taken ; Get another 8 bits into our bit buffer. Destroys X. Preserves A. Requires Y=0. +; Carry is always set on entry, Z always clear on exit ; Alternately, use .getbt2 to preserve X and destroy A .getbts tax .getbt2 lda (pSrc),y - inc pSrc - beq .src3A -.src3B sec rol sta bits txa + inc pSrc + beq .src3A rts .src3A inc pSrc+1 - bne .src3B ; always taken + rts } ; end of zone From 3f359cf3ffc987048b3236303340582b30856ddd Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Sun, 3 Sep 2023 14:41:10 -0700 Subject: [PATCH 2/5] fix a couple of bugs, compare a bit faster --- .../Apple/virtual/src/plasma/gameloop.pla | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/Platform/Apple/virtual/src/plasma/gameloop.pla b/Platform/Apple/virtual/src/plasma/gameloop.pla index d4860ecc..5330a517 100644 --- a/Platform/Apple/virtual/src/plasma/gameloop.pla +++ b/Platform/Apple/virtual/src/plasma/gameloop.pla @@ -363,7 +363,7 @@ export asm memcpy(pSrc, pDst, len, auxWr)#0 inc pTmp+1 bne .pglup ; always taken .part: - cpx #0 + txa beq .done - lda (tmp),y sta (pTmp),y @@ -419,10 +419,10 @@ export asm readAuxByte(ptr)#1 sta $10-1,y dey bne - - jmp $10 -.rdauxb sei ; prevent interrupts while in aux mem sta setAuxRd + jmp $10 +.rdauxb lda (pTmp),y sta clrAuxRd cli @@ -461,19 +461,19 @@ end export asm finishString(isPlural)#1 !zone { +asmPlasmRet 1 + ldy prevCSWL+ABS_OFFSET ; put the cout vector back to default + sty cswl + ldy prevCSWL+1+ABS_OFFSET ; put the cout vector back to default + sty cswh + ldy #0 ; dest offset in Y (will be incremented before store) + cpy inbuf + beq .done1 ; failsafe: handle zero-length string tax ; test for isPlural == 0 beq + lda #$40 ; for setting V later + sta tmp ; save isPlural flag - lda prevCSWL+ABS_OFFSET ; put the cout vector back to default - sta cswl - lda prevCSWL+1+ABS_OFFSET ; put the cout vector back to default - sta cswh clv ; V flag for prev-is-alpha - ldy #0 ; dest offset in Y (will be incremented before store) ldx #0 ; source offset in X (will be incremented before load) - cpx inbuf - beq .done ; failsafe: handle zero-length string .fetch inx lda inbuf,x ; get next input char @@ -487,7 +487,7 @@ export asm finishString(isPlural)#1 dey ; undo copy of the paren stx tmp+1 ; save position in input - dex ; needed for failsafe operation + bcs .done ; failsafe: handle missing end-paren bit tmp ; set copy flag (V) initially to same as isPlural flag .findsl ; see if there's a slash within the parens inx @@ -502,11 +502,8 @@ export asm finishString(isPlural)#1 pha plp + cmp #")" ; scan until ending paren - beq + - cpx inbuf - bcc .findsl ; loop to scan next char - bcs .done ; failsafe: handle missing end-paren (always taken) -+ ldx tmp+1 ; get back to start of parens + bne .findsl ; loop to scan next char + ldx tmp+1 ; get back to start of parens ; copy mode flag is now in V: if slash present, single=copy, plural=nocopy ; if no slash: single=nocopy, plural=copy .plup @@ -540,6 +537,7 @@ export asm finishString(isPlural)#1 .done sty inbuf ; save new length +.done1 lda #inbuf rts @@ -574,8 +572,8 @@ export asm blit(isAux, srcData, dstScreenPtr, nLines, lineSize)#0 lsr ; to carry bit bcc + ldy #15 ; put aux copy routine in zero page -- lda .cpaux + ABS_OFFSET,y - sta $10,y +- ldx .cpaux + ABS_OFFSET,y + stx $10,y dey bpl - + pla ; get line count @@ -693,8 +691,9 @@ export asm puts(str)#0 sta pTmp lda #'!' ldx #1 - sty pTmp+1 + tya beq + ; safety: print '!' instead of null string + sty pTmp+1 ldy #0 lda (pTmp),y tax @@ -912,9 +911,8 @@ export asm rawDisplayStr(pStr)#0 lda (pTmp),y sta tmp - cpy tmp - bcc + - rts -+ iny + bcs ++ + iny lda (pTmp),y ora #$80 cmp #"^" @@ -928,7 +926,8 @@ export asm rawDisplayStr(pStr)#0 + sty tmp+1 jsr DisplayChar ldy tmp+1 - bne - + bne - ; always taken +++rts end /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1006,18 +1005,17 @@ export asm streqi(a, b)#1 cmp #('z'&$7F)+1 ; convert to upper case bcs + cmp #'a'&$7F - bcc + + bcc ++ sbc #$20 -+ sta ysav - lda (pTmp),y - cmp #('z'&$7F)+1 ; convert to upper case - bcs + - cmp #'a'&$7F - bcc + - sbc #$20 -+ cmp ysav - bne .noteqi ; abort on inequality - dex + !byte $C9 ; CMP imm - to skip next opcode ++ clc ; clear carry if not alpha + ; CMP will set carry +++eor (pTmp),y + beq + ; matched + bcc .noteqi ; abort on non-alpha inequality + eor #$20 ; check for case bit + bne .noteqi ; abort on alpha inequality ++ dex bne - lda #1 ldy #0 ; okay, they're equal. Return 1 (not just any char; so that PLASMA when...is can work) From c54052737045df94ea947493949fc24c6e9a6bc7 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Sun, 3 Sep 2023 14:42:51 -0700 Subject: [PATCH 3/5] another fix --- Platform/Apple/virtual/src/plasma/gameloop.pla | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Platform/Apple/virtual/src/plasma/gameloop.pla b/Platform/Apple/virtual/src/plasma/gameloop.pla index 5330a517..7ab40c1a 100644 --- a/Platform/Apple/virtual/src/plasma/gameloop.pla +++ b/Platform/Apple/virtual/src/plasma/gameloop.pla @@ -389,8 +389,8 @@ export asm memset(pDst, val, len)#0 lda evalStkL,x ; len lo pha lda evalStkH,x ; len hi - tax beq + + tax lda tmp - sta (pTmp),y iny @@ -487,11 +487,11 @@ export asm finishString(isPlural)#1 dey ; undo copy of the paren stx tmp+1 ; save position in input - bcs .done ; failsafe: handle missing end-paren bit tmp ; set copy flag (V) initially to same as isPlural flag .findsl ; see if there's a slash within the parens inx cpx inbuf + bcs .done ; failsafe: handle missing end-paren lda inbuf,x ora #$80 ; normalize hi-bit for comparisons below cmp #"/" @@ -989,8 +989,8 @@ export asm streqi(a, b)#1 lda evalStkL+1,x sta pTmp lda evalStkH+1,x - sta pTmp+1 beq .null + sta pTmp+1 ldy #0 lda (tmp),y cmp (pTmp),y From d4d3c59b8cf813251c30ebe4d4ed042e73b5d8b4 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Sun, 3 Sep 2023 15:08:16 -0700 Subject: [PATCH 4/5] defer case check to be faster --- Platform/Apple/virtual/src/plasma/gameloop.pla | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Platform/Apple/virtual/src/plasma/gameloop.pla b/Platform/Apple/virtual/src/plasma/gameloop.pla index 7ab40c1a..5860693d 100644 --- a/Platform/Apple/virtual/src/plasma/gameloop.pla +++ b/Platform/Apple/virtual/src/plasma/gameloop.pla @@ -1002,19 +1002,15 @@ export asm streqi(a, b)#1 + tax ; count up to (verified same) length of the strings - iny lda (tmp),y - cmp #('z'&$7F)+1 ; convert to upper case - bcs + - cmp #'a'&$7F - bcc ++ - sbc #$20 - !byte $C9 ; CMP imm - to skip next opcode -+ clc ; clear carry if not alpha - ; CMP will set carry -++eor (pTmp),y + eor (pTmp),y beq + ; matched - bcc .noteqi ; abort on non-alpha inequality - eor #$20 ; check for case bit + cmp #$20 ; check for case bit bne .noteqi ; abort on alpha inequality + ora (tmp),y ; convert to lower case + cmp #('z'&$7F)+1 + bcs .noteqi ; abort on inequality + cmp #'a'&$7F + bcc .noteqi ; abort on inequality + dex bne - lda #1 From fb6362f2d2c006c2851e79ac1724ee92ca3bb2b7 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Fri, 25 Jul 2025 13:55:48 -0700 Subject: [PATCH 5/5] update to latest --- .gitignore | 8 + .vscode/settings.json | 4 + OutlawEditor/.java-version | 2 +- OutlawEditor/OutlawPluginExample/pom.xml | 71 - .../outlaw/plugin/example/Activator.java | 47 - .../outlaw/plugin/example/ExamplePlugin.java | 72 - OutlawEditor/pom.xml | 170 +- OutlawEditor/src/main/java/module-info.java | 23 + .../badvision/outlaweditor/Application.java | 60 +- .../org/badvision/outlaweditor/Editor.java | 13 +- .../badvision/outlaweditor/GlobalEditor.java | 6 +- .../badvision/outlaweditor/ImageEditor.java | 10 + .../org/badvision/outlaweditor/MapEditor.java | 41 +- .../badvision/outlaweditor/MythosEditor.java | 26 +- .../badvision/outlaweditor/SheetEditor.java | 17 +- .../badvision/outlaweditor/TileEditor.java | 30 +- .../outlaweditor/TransferHelper.java | 19 +- .../outlaweditor/api/ApplicationState.java | 14 +- .../badvision/outlaweditor/api/Platform.java | 2 +- .../outlaweditor/data/DataUtilities.java | 50 +- .../outlaweditor/data/PropertyHelper.java | 6 +- .../badvision/outlaweditor/data/TileMap.java | 11 +- .../outlaweditor/spelling/SpellChecker.java | 33 +- .../ui/ImageEditorTabController.java | 2 - .../outlaweditor/ui/ModalEditor.java | 26 +- .../ui/MythosScriptEditorController.java | 70 +- .../ui/SheetEditorController.java | 6 +- .../badvision/outlaweditor/ui/ToolType.java | 5 +- .../badvision/outlaweditor/ui/UIAction.java | 81 +- .../impl/ApplicationMenuControllerImpl.java | 28 +- .../impl/GlobalEditorTabControllerImpl.java | 22 +- .../ui/impl/ImageEditorTabControllerImpl.java | 18 +- .../ui/impl/MapEditorTabControllerImpl.java | 23 +- .../ui/impl/SheetEditorControllerImpl.java | 33 +- .../ui/impl/TileEditorTabControllerImpl.java | 26 +- .../META-INF/native-image/filter-file.json | 11 + .../META-INF/native-image/jni-config.json | 484 + .../predefined-classes-config.json | 8 + .../META-INF/native-image/proxy-config.json | 2 + .../META-INF/native-image/reflect-config.json | 1637 + .../native-image/resource-config.json | 71 + .../native-image/serialization-config.json | 6 + OutlawEditor/src/main/resources/Menubar.fxml | 1 - .../src/main/resources/SheetEditor.fxml | 2 +- .../main/resources/imageConversionWizard.fxml | 2 +- .../outlaweditor/test/ImageDitheringTest.java | 226 - .../test/JavaFXThreadingRule.java | 108 - .../outlaweditor/test/TestMythosEditor.java | 108 - Platform/Apple/tools/A2PackPlugin/pom.xml | 18 - Platform/Apple/tools/PLASMA/src/parse.c | 4 +- .../Apple/tools/PackPartitions/.java-version | 1 + Platform/Apple/tools/PackPartitions/build.xml | 15 +- .../{groovy-4.0.13.jar => groovy-4.0.24.jar} | Bin 7585814 -> 7602286 bytes ...y-ant-4.0.13.jar => groovy-ant-4.0.24.jar} | Bin 71260 -> 71258 bytes ...json-4.0.13.jar => groovy-json-4.0.24.jar} | Bin 129778 -> 130013 bytes ...y-xml-4.0.13.jar => groovy-xml-4.0.24.jar} | Bin 212577 -> 212578 bytes .../src/org/badvision/A2PackPartitions.groovy | 117 +- Platform/Apple/tools/jace/.gitignore | 2 +- Platform/Apple/tools/jace/.java-version | 2 +- Platform/Apple/tools/jace/.vscode/launch.json | 55 + .../Apple/tools/jace/.vscode/settings.json | 4 + Platform/Apple/tools/jace/LICENSE | 541 +- .../Apple/tools/jace/README-DEVELOPERS.md | 95 + .../tools/jace/README-LAWLESS-SYSTEMS.md | 310 + .../tools/jace/README-MACOS_packaging.md | 92 + Platform/Apple/tools/jace/README.md | 5 + Platform/Apple/tools/jace/build_darwin.sh | 6 + .../jace/misc/65c02_opcode_reference.xlsx | Bin 0 -> 32758 bytes ... => color_pattern_bitmask_calculator.xlsx} | Bin Platform/Apple/tools/jace/package-macos.zsh | 1048 + Platform/Apple/tools/jace/pom.xml | 344 +- Platform/Apple/tools/jace/readme-macos.txt | 24 + .../src/main/java/jace/AboutController.java | 63 + .../src/main/java/jace/ConvertDiskImage.java | 39 +- .../jace/src/main/java/jace/Emulator.java | 59 +- .../src/main/java/jace/EmulatorUILogic.java | 177 +- .../src/main/java/jace/JaceUIController.java | 394 +- .../src/main/java/jace/LawlessLegends.java | 162 +- .../src/main/java/jace/apple2e/Apple2e.java | 246 +- .../src/main/java/jace/apple2e/MOS65C02.java | 337 +- .../src/main/java/jace/apple2e/RAM128k.java | 152 +- .../main/java/jace/apple2e/SoftSwitches.java | 57 +- .../src/main/java/jace/apple2e/Speaker.java | 250 +- .../src/main/java/jace/apple2e/VideoDHGR.java | 82 +- .../src/main/java/jace/apple2e/VideoNTSC.java | 118 +- .../apple2e/softswitch/IntC8SoftSwitch.java | 38 +- .../softswitch/KeyboardSoftSwitch.java | 34 +- .../apple2e/softswitch/Memory2SoftSwitch.java | 61 +- .../apple2e/softswitch/MemorySoftSwitch.java | 36 +- .../apple2e/softswitch/VideoSoftSwitch.java | 34 +- .../java/jace/applesoft/ApplesoftHandler.java | 15 +- .../java/jace/applesoft/ApplesoftProgram.java | 64 +- .../src/main/java/jace/applesoft/Command.java | 34 +- .../src/main/java/jace/applesoft/Line.java | 38 +- .../main/java/jace/assembly/ACME_README.md | 85 + .../main/java/jace/assembly/AcmeCompiler.java | 23 +- .../jace/assembly/AcmeCrossAssembler.java | 147135 +++++++-------- .../java/jace/assembly/AssemblyHandler.java | 99 +- .../jace/src/main/java/jace/cheat/Cheats.java | 93 +- .../main/java/jace/cheat/DynamicCheat.java | 50 +- .../src/main/java/jace/cheat/MemoryCell.java | 10 + .../src/main/java/jace/cheat/MetaCheat.java | 69 +- .../jace/cheat/MontezumasRevengeCheats.java | 49 +- .../java/jace/cheat/PrinceOfPersiaCheats.java | 59 +- .../main/java/jace/cheat/ProgramIdentity.java | 119 + .../main/java/jace/config/AppSettingsDTO.java | 47 + .../java/jace/config/ConfigurableField.java | 34 +- .../main/java/jace/config/Configuration.java | 211 +- .../config/ConfigurationUIController.java | 54 +- .../src/main/java/jace/config/DeviceEnum.java | 4 +- .../java/jace/config/DeviceSelection.java | 35 +- .../java/jace/config/DynamicSelection.java | 37 +- .../src/main/java/jace/config/ISelection.java | 34 +- .../java/jace/config/InvokableAction.java | 34 +- .../jace/config/InvokableActionRegistry.java | 5 +- .../config/InvokableActionRegistryImpl.java | 21 +- .../jace/src/main/java/jace/config/Name.java | 34 +- .../main/java/jace/config/Reconfigurable.java | 34 +- .../jace/src/main/java/jace/core/CPU.java | 41 +- .../jace/src/main/java/jace/core/Card.java | 80 +- .../src/main/java/jace/core/Computer.java | 155 +- .../src/main/java/jace/core/Debugger.java | 34 +- .../jace/src/main/java/jace/core/Device.java | 127 +- .../jace/src/main/java/jace/core/Font.java | 70 +- .../jace/core/IndependentTimedDevice.java | 150 + .../src/main/java/jace/core/KeyHandler.java | 34 +- .../src/main/java/jace/core/Keyboard.java | 62 +- .../src/main/java/jace/core/Motherboard.java | 141 +- .../src/main/java/jace/core/PagedMemory.java | 44 +- .../jace/src/main/java/jace/core/Palette.java | 34 +- .../jace/src/main/java/jace/core/RAM.java | 162 +- .../src/main/java/jace/core/RAMEvent.java | 60 +- .../src/main/java/jace/core/RAMListener.java | 84 +- .../src/main/java/jace/core/SoftSwitch.java | 71 +- .../java/jace/core/SoundGeneratorDevice.java | 42 - .../src/main/java/jace/core/SoundMixer.java | 376 +- .../src/main/java/jace/core/TimedDevice.java | 277 +- .../jace/src/main/java/jace/core/Utility.java | 115 +- .../src/main/java/jace/core/VersionInfo.java | 71 + .../jace/src/main/java/jace/core/Video.java | 73 +- .../src/main/java/jace/core/VideoWriter.java | 48 +- .../java/jace/hardware/CardAppleMouse.java | 76 +- .../main/java/jace/hardware/CardDiskII.java | 66 +- .../main/java/jace/hardware/CardExt80Col.java | 50 +- .../jace/hardware/CardHayesMicromodem.java | 39 +- .../java/jace/hardware/CardMockingboard.java | 433 +- .../java/jace/hardware/CardRamFactor.java | 44 +- .../main/java/jace/hardware/CardRamworks.java | 77 +- .../src/main/java/jace/hardware/CardSSC.java | 218 +- .../java/jace/hardware/CardThunderclock.java | 61 +- .../src/main/java/jace/hardware/Cards.java | 20 +- .../main/java/jace/hardware/DiskIIDrive.java | 126 +- .../main/java/jace/hardware/FloppyDisk.java | 150 +- .../src/main/java/jace/hardware/Joystick.java | 529 +- .../main/java/jace/hardware/NoSlotClock.java | 18 +- .../jace/hardware/PassportMidiInterface.java | 162 +- .../main/java/jace/hardware/ProdosDriver.java | 145 +- .../java/jace/hardware/SmartportDriver.java | 189 +- .../main/java/jace/hardware/VideoImpls.java | 15 +- .../jace/hardware/ZipWarpAccelerator.java | 35 +- .../hardware/massStorage/CardMassStorage.java | 87 +- .../hardware/massStorage/DirectoryNode.java | 43 +- .../jace/hardware/massStorage/DiskNode.java | 33 +- .../jace/hardware/massStorage/FileNode.java | 36 +- .../hardware/massStorage/FreespaceBitmap.java | 37 +- .../java/jace/hardware/massStorage/IDisk.java | 42 +- .../jace/hardware/massStorage/LargeDisk.java | 153 +- .../massStorage/MassStorageDrive.java | 41 +- .../massStorage/ProdosVirtualDisk.java | 124 +- .../jace/hardware/massStorage/SubNode.java | 34 +- .../hardware/mockingboard/AY8910_old.java | 638 - .../mockingboard/EnvelopeGenerator.java | 36 +- .../hardware/mockingboard/NoiseGenerator.java | 34 +- .../java/jace/hardware/mockingboard/PSG.java | 183 +- .../jace/hardware/mockingboard/R6522.java | 194 +- .../hardware/mockingboard/SoundGenerator.java | 34 +- .../hardware/mockingboard/TimedGenerator.java | 45 +- .../main/java/jace/ide/HeadlessProgram.java | 3 +- .../src/main/java/jace/ide/IdeController.java | 22 +- .../main/java/jace/ide/LanguageHandler.java | 2 +- .../jace/src/main/java/jace/ide/Program.java | 26 +- .../src/main/java/jace/ide/TextHandler.java | 11 +- .../java/jace/lawless/FPSMonitorDevice.java | 25 +- .../java/jace/lawless/LawlessComputer.java | 34 +- .../main/java/jace/lawless/LawlessHacks.java | 272 +- .../lawless/LawlessHacks.java.bak.1745129151 | 497 + .../main/java/jace/lawless/LawlessVideo.java | 94 +- .../src/main/java/jace/lawless/Media.java | 181 + .../main/java/jace/lawless/MediaPlayer.java | 135 + .../src/main/java/jace/library/DiskType.java | 39 +- .../main/java/jace/library/MediaCache.java | 44 +- .../main/java/jace/library/MediaConsumer.java | 36 +- .../jace/library/MediaConsumerParent.java | 34 +- .../main/java/jace/library/MediaEntry.java | 34 +- .../main/java/jace/library/TocTreeModel.java | 39 +- .../main/java/jace/state/ObjectGraphNode.java | 35 +- .../jace/src/main/java/jace/state/State.java | 40 +- .../main/java/jace/state/StateManager.java | 39 +- .../src/main/java/jace/state/StateValue.java | 35 +- .../src/main/java/jace/state/Stateful.java | 34 +- .../jace/src/main/java/jace/ui/Library.java | 34 +- .../src/main/java/jace/ui/MetacheatUI.java | 45 +- .../jace/src/main/java/jace/ui/Watch.java | 3 +- .../tools/jace/src/main/java/module-info.java | 29 +- .../resources/META-INF/native-image/.lock | 1 + .../META-INF/native-image/jni-config.json | 212 +- .../META-INF/native-image/reflect-config.json | 1424 +- .../native-image/resource-config.json | 40 +- .../native-image/serialization-config.json | 3 - .../jace/src/main/resources/fxml/About.fxml | 71 + .../jace/src/main/resources/fxml/JaceUI.fxml | 95 +- .../src/main/resources/fxml/Metacheat.fxml | 7 +- .../jace/src/main/resources/fxml/editor.fxml | 5 +- .../jace/cheats/program-identities.txt | 66 + .../resources/jace/data/gamecontrollerdb.txt | 2036 + .../src/main/resources/jace/data/icon.icns | Bin 0 -> 194433 bytes .../main/resources/jace/data/sound/scores.txt | 84 +- .../samplePrograms/joystick_test.bas | 2 + .../main/resources/styles/configuration.css | 6 - .../jace/src/main/resources/styles/style.css | 4 +- .../src/test/java/jace/AbstractFXTest.java | 16 + .../src/test/java/jace/ProgramException.java | 44 + .../jace/src/test/java/jace/TestProgram.java | 465 + .../jace/src/test/java/jace/TestUtils.java | 72 +- .../java/jace/apple2e/CycleCountTest.java | 74 + .../test/java/jace/apple2e/Full65C02Test.java | 804 + .../test/java/jace/apple2e/VideoDHGRTest.java | 80 + .../test/java/jace/apple2e/VideoNTSCTest.java | 85 + .../java/jace/applesoft/ApplesoftTest.java | 38 + .../config/ConfigurationPersistenceTest.java | 84 + .../test/java/jace/config/DumpConfigTest.java | 112 + ...emoryListenerTest.java => MemoryTest.java} | 31 +- .../src/test/java/jace/core/SoundTest.java | 135 + .../src/test/java/jace/core/UtilityTest.java | 42 + .../jace/cpu/Basic6502FuncationalityTest.java | 118 - .../test/java/jace/cpu/CycleCountTest.java | 153 - .../jace/hardware/CardAppleMouseTest.java | 121 + .../test/java/jace/hardware/CardSSCTest.java | 54 + .../java/jace/hardware/FloppyDiskTest.java | 63 + .../hardware/PassportMidiInterfaceTest.java | 44 + .../jace/hardware/mockingboard/PSGTest.java | 50 + .../jace/hardware/mockingboard/R6522Test.java | 49 + .../jace/src/test/resources/jace/bcd_test.asm | 301 + .../tools/jace/src/windows/assets/icon.ico | Bin 0 -> 4286 bytes Platform/Apple/tools/jace/version.properties | 2 + Platform/Apple/virtual/.gitignore | 2 + Platform/Apple/virtual/bundlePacker.sh | 26 + Platform/Apple/virtual/src/marks/marks.s | 25 +- Platform/Apple/virtual/src/plasma/combat.pla | 1 - Platform/Apple/virtual/src/plasma/diskops.pla | 1 + .../Apple/virtual/src/plasma/gameloop.pla | 19 +- .../Apple/virtual/src/plasma/questlog.pla | 24 +- Platform/Apple/virtual/src/tile/tileEngine.s | 2 + 253 files changed, 82004 insertions(+), 90898 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 OutlawEditor/OutlawPluginExample/pom.xml delete mode 100644 OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/Activator.java delete mode 100644 OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/ExamplePlugin.java create mode 100644 OutlawEditor/src/main/java/module-info.java create mode 100644 OutlawEditor/src/main/resources/META-INF/native-image/filter-file.json create mode 100644 OutlawEditor/src/main/resources/META-INF/native-image/jni-config.json create mode 100644 OutlawEditor/src/main/resources/META-INF/native-image/predefined-classes-config.json create mode 100644 OutlawEditor/src/main/resources/META-INF/native-image/proxy-config.json create mode 100644 OutlawEditor/src/main/resources/META-INF/native-image/reflect-config.json create mode 100644 OutlawEditor/src/main/resources/META-INF/native-image/resource-config.json create mode 100644 OutlawEditor/src/main/resources/META-INF/native-image/serialization-config.json delete mode 100644 OutlawEditor/src/test/java/org/badvision/outlaweditor/test/ImageDitheringTest.java delete mode 100644 OutlawEditor/src/test/java/org/badvision/outlaweditor/test/JavaFXThreadingRule.java delete mode 100644 OutlawEditor/src/test/java/org/badvision/outlaweditor/test/TestMythosEditor.java create mode 100644 Platform/Apple/tools/PackPartitions/.java-version rename Platform/Apple/tools/PackPartitions/lib/{groovy-4.0.13.jar => groovy-4.0.24.jar} (71%) rename Platform/Apple/tools/PackPartitions/lib/{groovy-ant-4.0.13.jar => groovy-ant-4.0.24.jar} (94%) rename Platform/Apple/tools/PackPartitions/lib/{groovy-json-4.0.13.jar => groovy-json-4.0.24.jar} (85%) rename Platform/Apple/tools/PackPartitions/lib/{groovy-xml-4.0.13.jar => groovy-xml-4.0.24.jar} (87%) create mode 100644 Platform/Apple/tools/jace/.vscode/launch.json create mode 100644 Platform/Apple/tools/jace/.vscode/settings.json create mode 100644 Platform/Apple/tools/jace/README-DEVELOPERS.md create mode 100644 Platform/Apple/tools/jace/README-LAWLESS-SYSTEMS.md create mode 100644 Platform/Apple/tools/jace/README-MACOS_packaging.md create mode 100644 Platform/Apple/tools/jace/build_darwin.sh create mode 100644 Platform/Apple/tools/jace/misc/65c02_opcode_reference.xlsx rename Platform/Apple/tools/jace/misc/{color pattern bitmask calculator.xlsx => color_pattern_bitmask_calculator.xlsx} (100%) create mode 100644 Platform/Apple/tools/jace/package-macos.zsh create mode 100644 Platform/Apple/tools/jace/readme-macos.txt create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/AboutController.java create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/assembly/ACME_README.md create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/cheat/ProgramIdentity.java create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/config/AppSettingsDTO.java create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/core/IndependentTimedDevice.java delete mode 100644 Platform/Apple/tools/jace/src/main/java/jace/core/SoundGeneratorDevice.java create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/core/VersionInfo.java delete mode 100644 Platform/Apple/tools/jace/src/main/java/jace/hardware/mockingboard/AY8910_old.java create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/lawless/LawlessHacks.java.bak.1745129151 create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/lawless/Media.java create mode 100644 Platform/Apple/tools/jace/src/main/java/jace/lawless/MediaPlayer.java create mode 100644 Platform/Apple/tools/jace/src/main/resources/META-INF/native-image/.lock create mode 100644 Platform/Apple/tools/jace/src/main/resources/fxml/About.fxml create mode 100644 Platform/Apple/tools/jace/src/main/resources/jace/cheats/program-identities.txt create mode 100644 Platform/Apple/tools/jace/src/main/resources/jace/data/gamecontrollerdb.txt create mode 100644 Platform/Apple/tools/jace/src/main/resources/jace/data/icon.icns create mode 100644 Platform/Apple/tools/jace/src/main/resources/samplePrograms/joystick_test.bas create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/AbstractFXTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/ProgramException.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/TestProgram.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/apple2e/CycleCountTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/apple2e/Full65C02Test.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/apple2e/VideoDHGRTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/apple2e/VideoNTSCTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/applesoft/ApplesoftTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/config/ConfigurationPersistenceTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/config/DumpConfigTest.java rename Platform/Apple/tools/jace/src/test/java/jace/core/{MemoryListenerTest.java => MemoryTest.java} (84%) create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/core/SoundTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/core/UtilityTest.java delete mode 100644 Platform/Apple/tools/jace/src/test/java/jace/cpu/Basic6502FuncationalityTest.java delete mode 100644 Platform/Apple/tools/jace/src/test/java/jace/cpu/CycleCountTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/hardware/CardAppleMouseTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/hardware/CardSSCTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/hardware/FloppyDiskTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/hardware/PassportMidiInterfaceTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/hardware/mockingboard/PSGTest.java create mode 100644 Platform/Apple/tools/jace/src/test/java/jace/hardware/mockingboard/R6522Test.java create mode 100644 Platform/Apple/tools/jace/src/test/resources/jace/bcd_test.asm create mode 100644 Platform/Apple/tools/jace/src/windows/assets/icon.ico create mode 100644 Platform/Apple/tools/jace/version.properties create mode 100644 Platform/Apple/virtual/bundlePacker.sh diff --git a/.gitignore b/.gitignore index ec5693fa..1cd19134 100644 --- a/.gitignore +++ b/.gitignore @@ -64,7 +64,15 @@ error_stack.txt # Hey, don't include the commercial game data you ninny! /Platform/Apple/tools/jace/src/main/resources/jace/data/game.2mg +Platform/Apple/tools/PackPartitions/game* +Platform/Apple/tools/PackPartitions/font* +Platform/Apple/tools/PackPartitions/pack_report.txt +Platform/Apple/tools/PackPartitions/world.xml # Ignore NetBeans project files Platform/Apple/tools/jace/nb-configuration.xml Platform/Apple/tools/jace/nbactions.xml + +# Ignore temporary pom files +Platform/Apple/tools/jace/runPom.xml +Platform/Apple/tools/jace/*.log diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..9bd06c2e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic", + "java.debug.settings.onBuildFailureProceed": true +} \ No newline at end of file diff --git a/OutlawEditor/.java-version b/OutlawEditor/.java-version index 62593409..2f32724e 100644 --- a/OutlawEditor/.java-version +++ b/OutlawEditor/.java-version @@ -1 +1 @@ -1.8 +graalvm64-17.0.6 diff --git a/OutlawEditor/OutlawPluginExample/pom.xml b/OutlawEditor/OutlawPluginExample/pom.xml deleted file mode 100644 index f1c459c0..00000000 --- a/OutlawEditor/OutlawPluginExample/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - 4.0.0 - - org.badvision - OutlawPluginExample - 0.1 - bundle - - Outlaw Plugin Example - - - UTF-8 - 1.8 - 1.8 - - - - - - org.apache.felix - maven-bundle-plugin - 3.0.1 - true - - - org.badvision.outlaw.plugin.example - org.badvision.outlaw.plugin.example.Activator - * - - - - - org.apache.felix - maven-scr-plugin - 1.22.0 - - - generate-scr-scrdescriptor - - scr - - - - 8-Bit Bunch - - - - - - - - - - - org.badvision - OutlawEditor - 1.0-SNAPSHOT - - - org.apache.felix - org.apache.felix.scr.annotations - 1.10.0 - - - org.apache.felix - org.apache.felix.main - 5.4.0 - - - diff --git a/OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/Activator.java b/OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/Activator.java deleted file mode 100644 index ba30b341..00000000 --- a/OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/Activator.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.badvision.outlaw.plugin.example; - -import org.badvision.outlaweditor.api.ApplicationState; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -/** - * This is an example activator class, provided to demonstrate basic bundle lifecycle events. - * Since we're using declarative servies (Felix SCR), all the messy bits of service registration - * and reference passing are managed for us. Otherwise we'd be doing that here. Fortunately, - * we don't have to do all that. - * - * Still, this is a useful mechanism if you have some one-time setup or shutdown concerns that apply - * to your whole bundle, such as reading configuration data from a file or whatever. - * - * @author blurry - */ -public class Activator implements BundleActivator { - @Override - public void start(BundleContext bc) throws Exception { - System.out.println("Hello, plugin!"); - checkReferences(); - } - - @Override - public void stop(BundleContext bc) throws Exception { - System.out.println("Goodbye, plugin!"); - } - - private void checkReferences() { - // Note that our activator is not a component, so we can't use the @Reference - // annotation to inject app automatically. ApplicationState has a convenience - // method to get around this in just such events, but it's a hack. - // Ultimately it's not a good idea to rely on this too much as it follows - // some bad practices behind the scene that leave unclosed references, etc. - // I'll have to come up with a safer way to inject dependencies without - // causing housekeeping issues for OSGi. - ApplicationState app = ApplicationState.getInstance(); - if (app == null) { - System.out.println("App is null?!?!"); - } else if (app.getCurrentPlatform() == null) { - System.out.println("Current platform is null?"); - } else { - System.out.println("Current platform is " + app.getCurrentPlatform()); - } - } -} diff --git a/OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/ExamplePlugin.java b/OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/ExamplePlugin.java deleted file mode 100644 index dee8e2f5..00000000 --- a/OutlawEditor/OutlawPluginExample/src/main/java/org/badvision/outlaw/plugin/example/ExamplePlugin.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.badvision.outlaw.plugin.example; - -import javafx.event.ActionEvent; -import javax.xml.bind.JAXB; -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Deactivate; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.Service; -import org.badvision.outlaweditor.api.ApplicationState; -import org.badvision.outlaweditor.api.MenuAction; -import org.badvision.outlaweditor.ui.UIAction; -import org.osgi.framework.BundleContext; - -/** - * This registers a simple plugin that does nothing more than print a message to - * the console when executed. However, this plugin also demonstrates how to - * inject dependencies to more useful features, specifically the - * ApplicationState which in turn provides all game data, etc. - * - * @author blurry - */ -@Component(immediate = true) -@Service(MenuAction.class) -public class ExamplePlugin implements MenuAction { - - // Note: Because ApplicationState is already a defined service, this will automatically be bound. - // Hence, it is not necessary to worry about passing it it. - @Reference - ApplicationState app; - - // This is called when our plugin is starting - @Activate - public void activate() throws Exception { - System.out.println("Hello, menu!"); - checkReferences(); - } - - // This is called when our plugin is stopping - @Deactivate - public void stop(BundleContext bc) throws Exception { - System.out.println("Goodbye, menu!"); - } - - // This identifies the menu item label - @Override - public String getName() { - return "Example action"; - } - - // This method is called when the user selects the menu item - @Override - public void handle(ActionEvent event) { - System.out.println("Clicked!"); - JAXB.marshal(ApplicationState.getInstance().getGameData(), System.out); - checkReferences(); - UIAction.confirm("Did you mean to click that?", - () -> UIAction.alert("Well isn't that special?"), - () -> UIAction.alert("You should be more careful next time then.")); - } - - private void checkReferences() { -// app = ApplicationState.getInstance(); - if (app == null) { - System.out.println("App is null?!?!"); - } else if (app.getCurrentPlatform() == null) { - System.out.println("Current platform is null?"); - } else { - System.out.println("Current platform is " + app.getCurrentPlatform()); - } - } -} diff --git a/OutlawEditor/pom.xml b/OutlawEditor/pom.xml index 81fc9d10..1f5e7734 100644 --- a/OutlawEditor/pom.xml +++ b/OutlawEditor/pom.xml @@ -5,11 +5,13 @@ OutlawEditor OutlawEditor jar - 2.0-SNAPSHOT + 3.0 UTF-8 org.badvision.outlaweditor.Application apache20 + 21-ea+31 + 5.2.3 @@ -20,110 +22,82 @@ OutlawEditor - org.apache.felix - maven-scr-plugin - 1.26.4 - - - generate-scr-scrdescriptor - - scr - - - - 8-Bit Bunch - - - - + com.gluonhq + gluonfx-maven-plugin + 1.0.24 + + ${mainClass} + + + + + + + - org.apache.felix - maven-bundle-plugin - 5.1.2 - true + org.openjfx + javafx-maven-plugin + 0.0.8 - - org.badvision.outlaweditor,org.badvision.outlaweditor.ui.impl,org.badvision.outlaweditor.ui.apple - org.badvision.outlaweditor.api,org.badvision.outlaweditor.data.xml,org.badvision.outlaweditor.data,org.badvision.outlaweditor.ui - + ${mainClass} + + + + + + org.apache.maven.plugins - maven-dependency-plugin - 3.1.2 + maven-compiler-plugin + + 17 + 17 + + 3.13.0 + + + org.codehaus.mojo + jaxb2-maven-plugin + 3.2.0 - unpack-dependencies - prepare-package + xjc - unpack-dependencies + xjc - - META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA - system - junit,org.mockito,org.hamcrest - ${project.build.directory}/classes - - - - org.apache.maven.plugins - maven-jar-plugin - - - ${mainClass} - - + src/main/resources/jaxb + org.badvision.outlaweditor.data.xml - 3.2.0 org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - + maven-dependency-plugin 3.8.1 - - - org.jvnet.jaxb2.maven2 - maven-jaxb2-plugin - 0.14.0 + copy-dependencies + package - generate + copy-dependencies - - jaxb/OutlawSchema/*.xsd - - ${project.build.directory}/generated-sources/xjc/META-INF/jaxb-OutlawSchema.episode - org.badvision.outlaweditor.data.xml - - -Xcopyable - -Xmergeable - - - - org.jvnet.jaxb2_commons - jaxb2-basics - 0.12.0 - - + ${project.build.directory}/lib + false + false + true + compile - jaxb-generate-OutlawSchema - junit @@ -133,44 +107,34 @@ jar - org.jvnet.jaxb2_commons - jaxb2-basics - 0.12.0 - - - org.apache.felix - org.apache.felix.framework - 5.6.10 - - - org.apache.felix - org.apache.felix.main - 5.6.10 + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.2 - org.apache.felix - org.apache.felix.scr.annotations - 1.12.0 + org.glassfish.jaxb + jaxb-runtime + 4.0.5 - org.apache.felix - org.apache.felix.scr - 2.1.26 + org.controlsfx + controlsfx + 11.2.1 - org.apache.poi - poi - 5.0.0 + org.openjfx + javafx-controls + ${javafx.version} - org.apache.poi - poi-ooxml - 5.0.0 + org.openjfx + javafx-web + ${javafx.version} - org.controlsfx - controlsfx - 8.40.18 + org.openjfx + javafx-fxml + ${javafx.version} \ No newline at end of file diff --git a/OutlawEditor/src/main/java/module-info.java b/OutlawEditor/src/main/java/module-info.java new file mode 100644 index 00000000..6d801b1a --- /dev/null +++ b/OutlawEditor/src/main/java/module-info.java @@ -0,0 +1,23 @@ +module outlaweditor { + requires javafx.controls; + requires javafx.graphics; + requires javafx.web; + requires javafx.media; + requires javafx.fxml; + requires java.logging; + requires java.desktop; + requires java.scripting; + requires java.xml; + requires jdk.jsobject; + requires jakarta.xml.bind; + requires org.glassfish.jaxb.runtime; + + requires org.controlsfx.controls; + // requires org.apache.poi.ooxml; + + opens org.badvision.outlaweditor to javafx.graphics, javafx.fxml, javafx.web, org.apache.poi.ooxml; + opens org.badvision.outlaweditor.ui to javafx.fxml; + opens org.badvision.outlaweditor.ui.impl to javafx.fxml; + opens org.badvision.outlaweditor.data to jakarta.xml.bind; + opens org.badvision.outlaweditor.data.xml to javafx.base, jakarta.xml.bind, javafx.web; +} \ No newline at end of file diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/Application.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/Application.java index 35800f0e..066fae0b 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/Application.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/Application.java @@ -10,54 +10,59 @@ package org.badvision.outlaweditor; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; + +import org.badvision.outlaweditor.api.ApplicationState; +import org.badvision.outlaweditor.api.Platform; +import org.badvision.outlaweditor.data.xml.GameData; +import org.badvision.outlaweditor.ui.ApplicationUIController; + import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; import javafx.stage.WindowEvent; -import org.apache.felix.framework.Felix; -import org.apache.felix.framework.util.FelixConstants; -import org.apache.felix.main.AutoProcessor; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Service; -import org.apache.felix.scr.impl.Activator; -import org.badvision.outlaweditor.api.ApplicationState; -import org.badvision.outlaweditor.api.MenuAction; -import org.badvision.outlaweditor.api.Platform; -import org.badvision.outlaweditor.data.xml.GameData; -import org.badvision.outlaweditor.ui.ApplicationUIController; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; -import org.osgi.framework.launch.Framework; -import org.osgi.util.tracker.ServiceTracker; +// import org.apache.felix.scr.annotations.Component; +// import org.apache.felix.scr.annotations.Service; +// import org.apache.felix.scr.impl.Activator; +// import org.badvision.outlaweditor.api.ApplicationState; +// import org.badvision.outlaweditor.api.MenuAction; +// import org.badvision.outlaweditor.api.Platform; +// import org.badvision.outlaweditor.data.xml.GameData; +// import org.badvision.outlaweditor.ui.ApplicationUIController; +// import org.apache.felix.framework.Felix; +// import org.apache.felix.framework.util.FelixConstants; +// import org.apache.felix.main.AutoProcessor; +// import org.osgi.framework.BundleActivator; +// import org.osgi.framework.BundleContext; +// import org.osgi.framework.BundleException; +// import org.osgi.framework.launch.Framework; +// import org.osgi.util.tracker.ServiceTracker; /** * * @author brobert */ -@Component -@Service(org.badvision.outlaweditor.api.ApplicationState.class) -public class Application extends javafx.application.Application implements ApplicationState, BundleActivator { +// @Component +// @Service(org.badvision.outlaweditor.api.ApplicationState.class) +public class Application extends javafx.application.Application implements ApplicationState/*, BundleActivator*/ { - public static Framework felix; + // public static Framework felix; private GameData gameData = new GameData(); private Platform currentPlatform = Platform.AppleII; private ApplicationUIController controller; private Stage primaryStage; public static void shutdown() { + /* try { felix.stop(); felix.waitForStop(0L); } catch (BundleException | InterruptedException ex) { Logger.getLogger(Application.class.getName()).log(Level.SEVERE, null, ex); } + */ } + public static ApplicationState applicationStateSingleton; @Override public GameData getGameData() { @@ -96,16 +101,17 @@ public Stage getPrimaryStage() { @Override public void start(Stage primaryStage) { + applicationStateSingleton = this; this.primaryStage = primaryStage; javafx.application.Platform.setImplicitExit(true); - +/* try { startPluginContainer(); } catch (Exception ex) { Logger.getLogger(Application.class.getName()).log(Level.SEVERE, null, ex); throw new RuntimeException(ex); } - +*/ FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/ApplicationUI.fxml")); fxmlLoader.setResources(null); try { @@ -135,6 +141,7 @@ public static void main(String[] args) { launch(args); } +/* ServiceTracker tracker; private void startPluginContainer() throws BundleException, Exception { Map config = new HashMap<>(); @@ -175,4 +182,5 @@ public void start(BundleContext bc) throws Exception { @Override public void stop(BundleContext bc) throws Exception { } +*/ } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java index e0a6bad9..dda36c6a 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/Editor.java @@ -13,12 +13,13 @@ import java.util.LinkedList; import java.util.logging.Level; import java.util.logging.Logger; -import javafx.scene.layout.Pane; -import javax.xml.bind.JAXBException; + import org.badvision.outlaweditor.data.DataObserver; import org.badvision.outlaweditor.data.DataProducer; import org.badvision.outlaweditor.data.xml.Script; -import org.jvnet.jaxb2_commons.lang.CopyTo2; + +import jakarta.xml.bind.JAXBException; +import javafx.scene.layout.Pane; /** * Extremely generic editor abstraction -- useful for uniform edit features @@ -107,13 +108,15 @@ protected void trackState() { public void undo() { if (!undoStates.isEmpty()) { - CopyTo2 undoState = (CopyTo2) undoStates.removeFirst(); - undoState.copyTo(getEntity()); + T undoState = undoStates.removeFirst(); + copyEntityFrom(undoState); onEntityUpdated(); redraw(); } } + public abstract void copyEntityFrom(T copyFrom); + protected void onEntityUpdated() { } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java index ccb4145f..60f55828 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/GlobalEditor.java @@ -99,5 +99,9 @@ private GameData getGameData() { public void copyData() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - + + @Override + public void copyEntityFrom(Global src) { + throw new UnsupportedOperationException("Not supported."); //To change body of generated methods, choose Tools | Templates. + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java index 09f48fd3..83bf6602 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ImageEditor.java @@ -79,4 +79,14 @@ public void registerPatternSelectorModal(Pane pane, PatternSelectModal modal) { public void showSelectorModal() { patternSelectModal.showPatternSelectModal(targetPane); } + + @Override + public void copyEntityFrom(Image src) { + Image dest = getEntity(); + dest.setCategory(src.getCategory()); + dest.setComment(src.getComment()); + dest.setName(src.getName()); + dest.getDisplayData().clear(); + dest.getDisplayData().addAll(src.getDisplayData()); + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java index fe6531c0..83f32aff 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MapEditor.java @@ -17,6 +17,18 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; + +import org.badvision.outlaweditor.api.ApplicationState; +import org.badvision.outlaweditor.data.TileMap; +import org.badvision.outlaweditor.data.TileUtils; +import org.badvision.outlaweditor.data.xml.Map; +import org.badvision.outlaweditor.data.xml.Script; +import org.badvision.outlaweditor.data.xml.Scripts; +import org.badvision.outlaweditor.data.xml.Tile; +import org.badvision.outlaweditor.ui.TileSelectModal; +import org.badvision.outlaweditor.ui.ToolType; + +import jakarta.xml.bind.JAXBException; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; @@ -42,16 +54,6 @@ import javafx.scene.paint.Paint; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; -import javax.xml.bind.JAXBException; -import org.badvision.outlaweditor.api.ApplicationState; -import org.badvision.outlaweditor.data.TileMap; -import org.badvision.outlaweditor.data.TileUtils; -import org.badvision.outlaweditor.data.xml.Map; -import org.badvision.outlaweditor.data.xml.Script; -import org.badvision.outlaweditor.data.xml.Scripts; -import org.badvision.outlaweditor.data.xml.Tile; -import org.badvision.outlaweditor.ui.TileSelectModal; -import org.badvision.outlaweditor.ui.ToolType; /** * @@ -101,7 +103,7 @@ public void setDrawMode(DrawMode drawMode) { this.drawMode = drawMode; switch (drawMode) { case TileEraser: - ImageCursor cursor = new ImageCursor(new Image("images/eraser.png")); + ImageCursor cursor = new ImageCursor(new Image(MapEditor.class.getResourceAsStream("/images/eraser.png"))); drawCanvas.setCursor(cursor); break; case Select: @@ -815,4 +817,21 @@ public void handle(MouseEvent t) { } } + + @Override + public void copyEntityFrom(Map src) { + Map dest = getEntity(); + dest.setCategory(src.getCategory()); + dest.setDisplay3D(src.isDisplay3D()); + dest.setHeight(src.getHeight()); + dest.setName(src.getName()); + dest.setOrder(src.getOrder()); + dest.setScripts(src.getScripts()); + dest.setStartX(src.getStartX()); + dest.setStartY(src.getStartY()); + dest.setVariables(src.getVariables()); + dest.setWidth(src.getWidth()); + dest.getChunk().clear(); + dest.getChunk().addAll(src.getChunk()); + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java index 281d0cc3..8812d430 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/MythosEditor.java @@ -13,9 +13,7 @@ import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.function.Consumer; import java.util.logging.Level; @@ -23,19 +21,12 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.scene.layout.AnchorPane; -import javafx.stage.Stage; -import javafx.stage.WindowEvent; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; + import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; + import org.badvision.outlaweditor.api.ApplicationState; import static org.badvision.outlaweditor.data.DataUtilities.extract; import static org.badvision.outlaweditor.data.DataUtilities.extractFirst; @@ -56,6 +47,16 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import javafx.stage.WindowEvent; + /** * Mythos Scripting Editor * @@ -80,9 +81,6 @@ public MythosEditor(Script theScript, Scope theScope) { public void show() { primaryStage = new Stage(); FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/MythosScriptEditor.fxml")); - Map properties = new HashMap<>(); - properties.put(MythosScriptEditorController.ONLOAD_SCRIPT, generateLoadScript()); - fxmlLoader.setResources(MythosScriptEditorController.createResourceBundle(properties)); try { AnchorPane node = (AnchorPane) fxmlLoader.load(); controller = fxmlLoader.getController(); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/SheetEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/SheetEditor.java index 4b4779ad..9786ad41 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/SheetEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/SheetEditor.java @@ -14,13 +14,14 @@ package org.badvision.outlaweditor; import java.io.IOException; + +import org.badvision.outlaweditor.data.xml.Sheet; +import org.badvision.outlaweditor.ui.impl.SheetEditorControllerImpl; + import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; -import javafx.stage.WindowEvent; -import org.badvision.outlaweditor.data.xml.Sheet; -import org.badvision.outlaweditor.ui.impl.SheetEditorControllerImpl; /** * Edit a spreadsheet of information @@ -38,6 +39,16 @@ public Sheet getSheet() { return sheet; } + public boolean isShowing() { + return primaryStage != null && primaryStage.isShowing(); + } + + public void toFront() { + if (isShowing()) { + primaryStage.toFront(); + } + } + public void show() { primaryStage = new Stage(); FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/SheetEditor.fxml")); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java index d1eceefe..54358d46 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/TileEditor.java @@ -10,20 +10,11 @@ package org.badvision.outlaweditor; -/** - * - * @author brobert - */ -import javafx.event.EventHandler; -import javafx.scene.control.Menu; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; -import javafx.scene.layout.FlowPane; -import javafx.scene.layout.Pane; -import org.badvision.outlaweditor.api.ApplicationState; import org.badvision.outlaweditor.data.xml.Tile; import org.badvision.outlaweditor.ui.PatternSelectModal; -import org.badvision.outlaweditor.ui.TileSelectModal; + +import javafx.scene.control.Menu; +import javafx.scene.layout.Pane; public abstract class TileEditor extends Editor { abstract public void buildPatternSelector(Menu tilePatternMenu); @@ -45,4 +36,19 @@ public void registerPatternSelectorModal(Pane pane, PatternSelectModal modal) { public void showSelectorModal() { patternSelectModal.showPatternSelectModal(targetPane); } + + @Override + public void copyEntityFrom(Tile src) { + Tile dest = getEntity(); + dest.setBlocker(src.isBlocker()); + dest.setCategory(src.getCategory()); + dest.setComment(src.getComment()); + dest.setId(src.getId()); + dest.setName(src.getName()); + dest.setObstruction(src.isObstruction()); + dest.setSprite(src.isSprite()); + dest.getDisplayData().clear(); + dest.getDisplayData().addAll(src.getDisplayData()); + } + } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/TransferHelper.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/TransferHelper.java index c5ceaf91..4740d888 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/TransferHelper.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/TransferHelper.java @@ -12,7 +12,16 @@ import java.util.HashMap; import java.util.Map; import java.util.Random; -import javafx.scene.ImageCursor; + +import javax.xml.namespace.QName; + +import org.badvision.outlaweditor.ui.ToolType; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.util.JAXBSource; import javafx.scene.Node; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DataFormat; @@ -20,14 +29,6 @@ import javafx.scene.input.Dragboard; import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.util.JAXBSource; -import javax.xml.namespace.QName; -import org.badvision.outlaweditor.data.xml.Script; -import org.badvision.outlaweditor.ui.ToolType; /** * Simplify management of drag/drop operations diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/ApplicationState.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/ApplicationState.java index 0537b88a..383918d7 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/ApplicationState.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/ApplicationState.java @@ -15,12 +15,12 @@ */ package org.badvision.outlaweditor.api; -import javafx.stage.Stage; -import org.badvision.outlaweditor.Application; import org.badvision.outlaweditor.data.xml.GameData; import org.badvision.outlaweditor.ui.ApplicationUIController; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; + +import javafx.stage.Stage; +// import org.osgi.framework.BundleContext; +// import org.osgi.framework.FrameworkUtil; /** * @@ -40,7 +40,7 @@ public interface ApplicationState { public ApplicationUIController getController(); public Stage getPrimaryStage(); - + /* static public BundleContext getBundleContext() { if (Application.felix != null) { return Application.felix.getBundleContext(); @@ -53,5 +53,9 @@ public static ApplicationState getInstance() { BundleContext bc = getBundleContext(); return bc.getService(bc.getServiceReference(ApplicationState.class)); } + */ + public static ApplicationState getInstance() { + return org.badvision.outlaweditor.Application.applicationStateSingleton; + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/Platform.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/Platform.java index a3dc142e..06fe52c6 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/Platform.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/api/Platform.java @@ -43,7 +43,7 @@ public enum Platform { public int maxImageWidth; public int maxImageHeight; - Platform(Class ed, Class imged, TileRenderer ren, ImageRenderer img, int w, int h, int maxW, int maxH) { + Platform(Class ed, Class imged, TileRenderer ren, ImageRenderer img, int w, int h, int maxW, int maxH) { tileEditor = ed; imageEditor = imged; tileRenderer = ren; diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/DataUtilities.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/DataUtilities.java index 08990bf3..7bb51543 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/DataUtilities.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/DataUtilities.java @@ -34,12 +34,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import javax.xml.namespace.QName; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.badvision.outlaweditor.api.ApplicationState; import org.badvision.outlaweditor.data.xml.Block; import org.badvision.outlaweditor.data.xml.Field; @@ -266,12 +260,8 @@ public static List> readFromFile(File file) { if (file.getName().toLowerCase().endsWith("txt") || file.getName().toLowerCase().endsWith("tsv")) { return readTextFile(file); - } else if (file.getName().toLowerCase().endsWith("xls")) { - return readLegacyExcel(file); - } else if (file.getName().toLowerCase().endsWith("xlsx")) { - return readExcel(file); - } - } catch (IOException | InvalidFormatException ex) { + } + } catch (IOException ex) { Logger.getLogger(DataUtilities.class.getName()).log(Level.SEVERE, null, ex); } UIAction.alert("Couldn't figure out how to import file " + file.getName()); @@ -283,42 +273,6 @@ public static List> readTextFile(File file) throws FileNotFoundExce return reader.lines().map(line -> Arrays.asList(line.split("\\t"))).collect(Collectors.toList()); } - public static List> readLegacyExcel(File file) throws FileNotFoundException, IOException { - return readSheet(new HSSFWorkbook(new FileInputStream(file))); - } - - public static List> readExcel(File file) throws FileNotFoundException, IOException, InvalidFormatException { - return readSheet(new XSSFWorkbook(file)); - } - - public static List> readSheet(Workbook workbook) { - Sheet sheet = workbook.getSheetAt(0); - List> data = new ArrayList<>(); - sheet.forEach(row -> { - List rowData = new ArrayList<>(); - row.forEach(cell -> { - String col = getStringValueFromCell(cell); - rowData.add(col); - }); - data.add(rowData); - }); - return data; - } - - public static String getStringValueFromCell(Cell cell) { - switch (cell.getCellType()) { - case BOOLEAN: - return Boolean.toString(cell.getBooleanCellValue()); - case BLANK: - return null; - case NUMERIC: - return Double.toString(cell.getNumericCellValue()); - case STRING: - return cell.getStringCellValue(); - default: - return "???"; - } - } public static String hexDump(byte[] data) { StringBuilder dump = new StringBuilder(); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/PropertyHelper.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/PropertyHelper.java index 2a68e35a..d194c970 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/PropertyHelper.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/PropertyHelper.java @@ -27,15 +27,15 @@ public class PropertyHelper { public static JavaBeanIntegerProperty intProp(Object t, String fieldName) throws NoSuchMethodException { - return new JavaBeanIntegerPropertyBuilder().bean(t).name(fieldName).build(); + return JavaBeanIntegerPropertyBuilder.create().bean(t).name(fieldName).build(); } public static JavaBeanBooleanProperty boolProp(Object t, String fieldName) throws NoSuchMethodException { - return new JavaBeanBooleanPropertyBuilder().bean(t).name(fieldName).build(); + return JavaBeanBooleanPropertyBuilder.create().bean(t).name(fieldName).build(); } public static JavaBeanStringProperty stringProp(Object t, String fieldName) throws NoSuchMethodException { - return new JavaBeanStringPropertyBuilder().bean(t).name(fieldName).build(); + return JavaBeanStringPropertyBuilder.create().bean(t).name(fieldName).build(); } private static final Map boundProperties = new HashMap<>(); diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java index 604fd883..9d16fb2e 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/data/TileMap.java @@ -17,11 +17,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import javafx.scene.control.Alert; -import javafx.scene.image.WritableImage; -import javafx.scene.paint.Color; -import javax.xml.bind.JAXBElement; -import org.badvision.outlaweditor.Application; + import org.badvision.outlaweditor.api.ApplicationState; import org.badvision.outlaweditor.api.Platform; import org.badvision.outlaweditor.data.xml.Map; @@ -33,6 +29,11 @@ import org.badvision.outlaweditor.data.xml.Tile; import org.badvision.outlaweditor.ui.UIAction; +import jakarta.xml.bind.JAXBElement; +import javafx.scene.control.Alert; +import javafx.scene.image.WritableImage; +import javafx.scene.paint.Color; + /** * * @author brobert diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/spelling/SpellChecker.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/spelling/SpellChecker.java index 620aabc8..3ca8ceff 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/spelling/SpellChecker.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/spelling/SpellChecker.java @@ -10,17 +10,14 @@ package org.badvision.outlaweditor.spelling; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; -import java.util.logging.Level; -import java.util.logging.Logger; + import org.badvision.outlaweditor.data.DataUtilities; /** @@ -54,22 +51,18 @@ public SpellResponse check(String value) { private static void loadDictionary() { if (dictionary == null) { - URL dictionaryPath = SpellChecker.class.getResource("/mythos/dictionary.txt"); - try { - BufferedReader content = new BufferedReader(new InputStreamReader((InputStream) dictionaryPath.getContent())); - dictionary = new HashMap<>(); - content.lines().forEach((String word)-> { - String lower = word.toLowerCase(); - Set words = dictionary.get(lower.charAt(0)); - if (words == null) { - words = new LinkedHashSet<>(); - dictionary.put(lower.charAt(0), words); - } - words.add(word); - }); - } catch (IOException ex) { - Logger.getLogger(SpellChecker.class.getName()).log(Level.SEVERE, null, ex); - } + InputStream dictionaryStream = SpellChecker.class.getResourceAsStream("/mythos/dictionary.txt"); + BufferedReader content = new BufferedReader(new InputStreamReader(dictionaryStream)); + dictionary = new HashMap<>(); + content.lines().forEach((String word)-> { + String lower = word.toLowerCase(); + Set words = dictionary.get(lower.charAt(0)); + if (words == null) { + words = new LinkedHashSet<>(); + dictionary.put(lower.charAt(0), words); + } + words.add(word); + }); } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ImageEditorTabController.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ImageEditorTabController.java index 6e5032c5..f9be9ade 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ImageEditorTabController.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ImageEditorTabController.java @@ -10,8 +10,6 @@ package org.badvision.outlaweditor.ui; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Group; diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ModalEditor.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ModalEditor.java index d7129475..da7bf76e 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ModalEditor.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ModalEditor.java @@ -10,7 +10,8 @@ package org.badvision.outlaweditor.ui; -import com.sun.glass.ui.Application; +import static org.badvision.outlaweditor.data.DataUtilities.uppercaseFirst; + import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -23,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; + import javafx.application.Platform; import javafx.beans.property.adapter.JavaBeanStringPropertyBuilder; import javafx.beans.value.ObservableValue; @@ -43,13 +45,13 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.util.Callback; -import static org.badvision.outlaweditor.data.DataUtilities.uppercaseFirst; /** * * @author blurry */ public class ModalEditor { + Dialog dialog; public static interface EditControl { @@ -61,7 +63,6 @@ public static interface EditControl { } public static class TextControl implements EditControl { - TextField control = new TextField(); @Override @@ -98,7 +99,7 @@ public TableControl(Map, TableCell>> co TableColumn col = new TableColumn<>(uppercaseFirst(colName)); col.setCellValueFactory((TableColumn.CellDataFeatures param) -> { try { - return (ObservableValue) new JavaBeanStringPropertyBuilder().bean(param.getValue()).name(colName).build(); + return (ObservableValue) JavaBeanStringPropertyBuilder.create().bean(param.getValue()).name(colName).build(); } catch (NoSuchMethodException ex) { Logger.getLogger(ModalEditor.class.getName()).log(Level.SEVERE, null, ex); throw new RuntimeException(ex); @@ -116,7 +117,7 @@ public TableControl(Map, TableCell>> co addButton.setOnAction((event) -> { try { rows.add(rowType.newInstance()); - Application.invokeLater(() -> { + Platform.runLater(() -> { try { Thread.sleep(100); } catch (InterruptedException ex) { @@ -172,7 +173,7 @@ public PropertyDescriptor getPropertyDescriptor(PropertyDescriptor[] descriptors public Optional editObject(T sourceObject, Map obj, Class clazz, String title, String header) throws IntrospectionException { BeanInfo info = Introspector.getBeanInfo(clazz); - Dialog dialog = new Dialog(); + dialog = new Dialog(); dialog.setTitle(title); dialog.setHeaderText(header); @@ -210,8 +211,7 @@ public Optional editObject(T sourceObject, Map obj, descriptor.getWriteMethod().invoke(sourceObject, control.getValue()); } else { Object val = descriptor.getReadMethod().invoke(sourceObject); - if (val instanceof List) { - List sourceList = (List) val; + if (val instanceof List sourceList) { sourceList.clear(); sourceList.addAll((Collection) control.getValue()); } @@ -227,4 +227,14 @@ public Optional editObject(T sourceObject, Map obj, return dialog.showAndWait(); } + + public boolean isOpen() { + return dialog != null && dialog.isShowing(); + } + + public void close() { + if (isOpen()) { + dialog.close(); + } + } } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/MythosScriptEditorController.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/MythosScriptEditorController.java index 8726cd3f..862ce501 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/MythosScriptEditorController.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/MythosScriptEditorController.java @@ -10,10 +10,10 @@ package org.badvision.outlaweditor.ui; import java.net.URL; -import java.util.ListResourceBundle; -import java.util.Map; import java.util.ResourceBundle; -import java.util.Set; + +import org.badvision.outlaweditor.MythosEditor; + import javafx.application.Platform; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker.State; @@ -25,13 +25,11 @@ import javafx.scene.web.WebView; import javafx.stage.Stage; import netscape.javascript.JSObject; -import org.badvision.outlaweditor.MythosEditor; public class MythosScriptEditorController implements Initializable { public static final String MYTHOS_EDITOR = "/mythos/mythos-editor/html/editor.html"; - public static final String ONLOAD_SCRIPT = "onloadScript"; // This is tied to the Mythos object defined in mythos_uncompressed JSObject mythos; @@ -60,6 +58,26 @@ public class MythosScriptEditorController public void setEditor(MythosEditor editor) { this.editor = editor; + final String loadScript = editor.generateLoadScript(); + if (loadScript != null) { + editorView.getEngine().getLoadWorker().stateProperty().addListener( + (value, old, newState) -> { + if (newState == State.SUCCEEDED) { + mythos = (JSObject) editorView.getEngine().executeScript("Mythos"); + mythos.setMember("editor", editor); + editorView.getEngine().executeScript(loadScript); + editorView.getEngine().executeScript("window.dispatchEvent(new Event('resize'));"); + } + }); + + editorView.getEngine().setPromptHandler((PromptData prompt) -> { + return UIAction.getText(prompt.getMessage(), prompt.getDefaultValue()); + }); + } + + //TODO: Verify the path conversion works in Win7 with a jar file + // Affected by https://bugs.openjdk.java.net/browse/JDK-8136466 + editorView.getEngine().load(getClass().getResource(MYTHOS_EDITOR).toExternalForm()); } // Handler for MenuItem[fx:id="menuItemAbortChanges"] onAction @@ -92,6 +110,11 @@ public void onRedoSelected(ActionEvent event) { public void onUndoSelected(ActionEvent event) { // handle the event here } + /** + * + * @param fxmlFileLocation + * @param resources + */ @Override // This method is called by the FXMLLoader when initialization is complete public void initialize(URL fxmlFileLocation, ResourceBundle resources) { @@ -103,23 +126,6 @@ public void initialize(URL fxmlFileLocation, ResourceBundle resources) { assert menuItemRedo != null : "fx:id=\"menuItemRedo\" was not injected: check your FXML file 'MythosScriptEditor.fxml'."; assert menuItemUndo != null : "fx:id=\"menuItemUndo\" was not injected: check your FXML file 'MythosScriptEditor.fxml'."; - final String loadScript = resources.getString(ONLOAD_SCRIPT); - if (loadScript != null) { - editorView.getEngine().getLoadWorker().stateProperty().addListener( - (value, old, newState) -> { - if (newState == State.SUCCEEDED) { - mythos = (JSObject) editorView.getEngine().executeScript("Mythos"); - mythos.setMember("editor", editor); - editorView.getEngine().executeScript(loadScript); - editorView.getEngine().executeScript("window.dispatchEvent(new Event('resize'));"); - } - }); - - editorView.getEngine().setPromptHandler((PromptData prompt) -> { - return UIAction.getText(prompt.getMessage(), prompt.getDefaultValue()); - }); - } - // JavaFX8 has a bug where stage maximize events do not trigger resize events to webview components Platform.runLater(() -> { Stage stage = (Stage) editorView.getScene().getWindow(); @@ -129,26 +135,6 @@ public void initialize(URL fxmlFileLocation, ResourceBundle resources) { }); } }); - - //TODO: Verify the path conversion works in Win7 with a jar file - // Affected by https://bugs.openjdk.java.net/browse/JDK-8136466 - editorView.getEngine().load(getClass().getResource(MYTHOS_EDITOR).toExternalForm()); - } - - public static ResourceBundle createResourceBundle(final Map input) { - return new ListResourceBundle() { - @Override - protected Object[][] getContents() { - Object[][] output = new Object[input.size()][2]; - Set keys = input.keySet(); - int i = 0; - for (String key : keys) { - output[i] = new Object[]{key, input.get(key)}; - i++; - } - return output; - } - }; } public String getScriptXml() { diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/SheetEditorController.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/SheetEditorController.java index 58f57da3..d0b716ca 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/SheetEditorController.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/SheetEditorController.java @@ -15,12 +15,14 @@ import java.net.URL; import java.util.ResourceBundle; + +import org.controlsfx.control.spreadsheet.SpreadsheetColumn; +import org.controlsfx.control.spreadsheet.SpreadsheetView; + import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.TextField; -import org.controlsfx.control.spreadsheet.SpreadsheetColumn; -import org.controlsfx.control.spreadsheet.SpreadsheetView; /** * diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ToolType.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ToolType.java index 08774c9d..4f7eb944 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ToolType.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/ToolType.java @@ -11,14 +11,15 @@ package org.badvision.outlaweditor.ui; import java.util.Optional; + import javafx.scene.image.Image; public enum ToolType { - ERASER("images/eraser.png"), FILL(null), SELECT(null), MOVE(null), DRAW(null); + ERASER("/images/eraser.png"), FILL(null), SELECT(null), MOVE(null), DRAW(null); ToolType(String iconPath) { if (iconPath != null) { - icon = Optional.of(new Image(iconPath)); + icon = Optional.of(new Image(ToolType.class.getResourceAsStream(iconPath))); } else { icon = Optional.empty(); } diff --git a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/UIAction.java b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/UIAction.java index e09e3c65..f3848a41 100644 --- a/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/UIAction.java +++ b/OutlawEditor/src/main/java/org/badvision/outlaweditor/ui/UIAction.java @@ -19,6 +19,26 @@ import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; + +import org.badvision.outlaweditor.Application; +import org.badvision.outlaweditor.FileUtils; +import org.badvision.outlaweditor.MythosEditor; +import org.badvision.outlaweditor.SheetEditor; +import org.badvision.outlaweditor.api.ApplicationState; +import org.badvision.outlaweditor.apple.ImageDitherEngine; +import org.badvision.outlaweditor.data.DataUtilities; +import org.badvision.outlaweditor.data.TilesetUtils; +import org.badvision.outlaweditor.data.xml.GameData; +import org.badvision.outlaweditor.data.xml.Global; +import org.badvision.outlaweditor.data.xml.Scope; +import org.badvision.outlaweditor.data.xml.Script; +import org.badvision.outlaweditor.data.xml.Sheet; +import org.badvision.outlaweditor.data.xml.UserType; +import org.badvision.outlaweditor.data.xml.Variable; +import org.badvision.outlaweditor.data.xml.Variables; +import org.badvision.outlaweditor.ui.impl.ImageConversionWizardController; + +import jakarta.xml.bind.JAXB; import javafx.animation.FadeTransition; import javafx.application.Platform; import javafx.event.ActionEvent; @@ -41,32 +61,14 @@ import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.HBoxBuilder; -import javafx.scene.layout.VBoxBuilder; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.util.Callback; import javafx.util.Duration; import javafx.util.converter.DefaultStringConverter; -import javax.xml.bind.JAXB; -import org.badvision.outlaweditor.Application; -import org.badvision.outlaweditor.FileUtils; -import org.badvision.outlaweditor.MythosEditor; -import org.badvision.outlaweditor.SheetEditor; -import org.badvision.outlaweditor.api.ApplicationState; -import org.badvision.outlaweditor.apple.ImageDitherEngine; -import org.badvision.outlaweditor.data.DataUtilities; -import org.badvision.outlaweditor.data.TilesetUtils; -import org.badvision.outlaweditor.data.xml.GameData; -import org.badvision.outlaweditor.data.xml.Global; -import org.badvision.outlaweditor.data.xml.Scope; -import org.badvision.outlaweditor.data.xml.Script; -import org.badvision.outlaweditor.data.xml.Sheet; -import org.badvision.outlaweditor.data.xml.UserType; -import org.badvision.outlaweditor.data.xml.Variable; -import org.badvision.outlaweditor.data.xml.Variables; -import org.badvision.outlaweditor.ui.impl.ImageConversionWizardController; /** * @@ -142,6 +144,8 @@ public static void actionPerformed(MAIN_ACTIONS action) throws IOException { JAXB.marshal(ApplicationState.getInstance().getGameData(), currentSaveFile); } break; + default: + break; } } @@ -184,7 +188,7 @@ public static void quitWithoutConfirming() { public static WritableImage getBadImage(int width, int height) { if (badImage == null) { - badImage = new Image("images/icon_brokenLink.png"); + badImage = new Image(UIAction.class.getResourceAsStream("/images/icon_brokenLink.png")); } WritableImage img = new WritableImage(width, height); img.getPixelWriter().setPixels(0, 0, (int) badImage.getWidth(), (int) badImage.getHeight(), badImage.getPixelReader(), 0, 0); @@ -214,7 +218,10 @@ public static void alert(String message) { public static void choose(String message, Choice... choices) { final Stage dialogStage = new Stage(); - HBoxBuilder options = HBoxBuilder.create().alignment(Pos.CENTER).spacing(10.0).padding(new Insets(5)); + HBox hbox = new HBox(); + hbox.setAlignment(Pos.CENTER); + hbox.setSpacing(10.0); + hbox.setPadding(new Insets(5)); List