From a50dd3b34b68d939655d5c5de038dcf1688bc225 Mon Sep 17 00:00:00 2001 From: ske087 Date: Thu, 6 Aug 2026 20:05:21 +0300 Subject: [PATCH] chore: upgrade StudioBridge v2.1.2 -> v2.1.3, add persistent-folder creation, update runbook - Rebuild StudioBridge-2.1.3.jar from latest upstream (v2.1.3) and deploy to portable-dist - Add ensurePersistentDirectories() so the app creates ~/.studio-bridge and Profiles at startup (GUI + --sendonly) - Bundle full StudioBridge source under StudioBridge-src/ (with rebuild-jar.bat) - Update launchers (Launch-StudioBridge.bat, portable-dist/StudioBridge.bat) to v2.1.3 - Add check-update.ps1 and UPDATE.md for the step-by-step update runbook - Update README (v2.1.3, persistent data + updating sections) - Ignore StudioBridge-src/target/ build output --- .gitignore | 1 + Launch-StudioBridge.bat | 16 +- README.md | 32 +- StudioBridge-src/.classpath | 40 + StudioBridge-src/.github/FUNDING.yml | 15 + StudioBridge-src/.github/entitlements.plist | 12 + .../.github/packaging/cli-mac.properties | 2 + .../.github/packaging/cli-win.properties | 5 + .../.github/packaging/icons/icon.icns | Bin 0 -> 71911 bytes .../.github/packaging/icons/icon.ico | Bin 0 -> 4286 bytes .../.github/packaging/icons/icon.png | Bin 0 -> 20836 bytes StudioBridge-src/.github/release.yml | 29 + .../.github/workflows/build-and-release.yml | 517 +++++++ StudioBridge-src/.gitignore | 5 + StudioBridge-src/LICENSE | 674 +++++++++ StudioBridge-src/README.md | 237 +++ StudioBridge-src/pom.xml | 143 ++ StudioBridge-src/rebuild-jar.bat | 65 + .../StudioBridge/functions/Config.java | 430 ++++++ .../StudioBridge/functions/Connectivity.java | 110 ++ .../rdiger36/StudioBridge/functions/Exit.java | 130 ++ .../LengthRestrictedDocumentFilter.java | 83 ++ .../StudioBridge/functions/Models.java | 61 + .../StudioBridge/functions/ProfilesPath.java | 122 ++ .../StudioBridge/functions/Resize.java | 31 + .../StudioBridge/functions/UDPPackage.java | 189 +++ .../StudioBridge/functions/Update.java | 96 ++ .../StudioBridge/gui/DialogOneButton.java | 105 ++ .../StudioBridge/gui/DialogTwoButtons.java | 121 ++ .../rdiger36/StudioBridge/gui/MainMenu.java | 1269 +++++++++++++++++ .../StudioBridge/gui/MultiPrinterSetup.java | 242 ++++ .../StudioBridge/gui/PrinterCheck.java | 192 +++ .../rdiger36/StudioBridge/gui/SaveDialog.java | 93 ++ .../rdiger36/StudioBridge/gui/ToolInfo.java | 141 ++ .../java/rdiger36/StudioBridge/gui/UI.java | 55 + .../StudioBridge/objects/LocalMachine.java | 109 ++ .../StudioBridge/objects/Printer.java | 88 ++ .../src/main/resources/achtung.png | Bin 0 -> 733 bytes .../src/main/resources/delete.png | Bin 0 -> 1055 bytes StudioBridge-src/src/main/resources/edit.png | Bin 0 -> 340 bytes StudioBridge-src/src/main/resources/icon.png | Bin 0 -> 20836 bytes StudioBridge-src/src/main/resources/load.gif | Bin 0 -> 1451 bytes .../src/main/resources/messages_de.properties | 2 + .../src/main/resources/messages_en.properties | 2 + StudioBridge-src/src/main/resources/save.png | Bin 0 -> 1021 bytes .../src/main/resources/success.png | Bin 0 -> 907 bytes .../java/rdiger36/StudioBridge/AppTest.java | 38 + .../StudioBridge/gui/MainMenuTest.java | 84 ++ UPDATE.md | 194 +++ check-update.ps1 | 106 ++ ...ridge-2.1.2.jar => StudioBridge-2.1.3.jar} | Bin 6140590 -> 6139208 bytes portable-dist/StudioBridge.bat | 2 +- 52 files changed, 5875 insertions(+), 13 deletions(-) create mode 100644 StudioBridge-src/.classpath create mode 100644 StudioBridge-src/.github/FUNDING.yml create mode 100644 StudioBridge-src/.github/entitlements.plist create mode 100644 StudioBridge-src/.github/packaging/cli-mac.properties create mode 100644 StudioBridge-src/.github/packaging/cli-win.properties create mode 100644 StudioBridge-src/.github/packaging/icons/icon.icns create mode 100644 StudioBridge-src/.github/packaging/icons/icon.ico create mode 100644 StudioBridge-src/.github/packaging/icons/icon.png create mode 100644 StudioBridge-src/.github/release.yml create mode 100644 StudioBridge-src/.github/workflows/build-and-release.yml create mode 100644 StudioBridge-src/.gitignore create mode 100644 StudioBridge-src/LICENSE create mode 100644 StudioBridge-src/README.md create mode 100644 StudioBridge-src/pom.xml create mode 100644 StudioBridge-src/rebuild-jar.bat create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Config.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Connectivity.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Exit.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/LengthRestrictedDocumentFilter.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Models.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/ProfilesPath.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Resize.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/UDPPackage.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Update.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogOneButton.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogTwoButtons.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MainMenu.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MultiPrinterSetup.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/PrinterCheck.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/SaveDialog.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/ToolInfo.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/UI.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/LocalMachine.java create mode 100644 StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/Printer.java create mode 100644 StudioBridge-src/src/main/resources/achtung.png create mode 100644 StudioBridge-src/src/main/resources/delete.png create mode 100644 StudioBridge-src/src/main/resources/edit.png create mode 100644 StudioBridge-src/src/main/resources/icon.png create mode 100644 StudioBridge-src/src/main/resources/load.gif create mode 100644 StudioBridge-src/src/main/resources/messages_de.properties create mode 100644 StudioBridge-src/src/main/resources/messages_en.properties create mode 100644 StudioBridge-src/src/main/resources/save.png create mode 100644 StudioBridge-src/src/main/resources/success.png create mode 100644 StudioBridge-src/src/test/java/rdiger36/StudioBridge/AppTest.java create mode 100644 StudioBridge-src/src/test/java/rdiger36/StudioBridge/gui/MainMenuTest.java create mode 100644 UPDATE.md create mode 100644 check-update.ps1 rename portable-dist/{StudioBridge-2.1.2.jar => StudioBridge-2.1.3.jar} (95%) diff --git a/.gitignore b/.gitignore index ccc8607..a5ad73c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ portable-dist/jre/ +StudioBridge-src/target/ diff --git a/Launch-StudioBridge.bat b/Launch-StudioBridge.bat index 00603de..b7a8fee 100644 --- a/Launch-StudioBridge.bat +++ b/Launch-StudioBridge.bat @@ -17,25 +17,25 @@ REM Set the path to the portable-dist folder set "PORTABLE=%ROOTDIR%portable-dist" REM --------------------------------------------------------------------------- -REM JAR auto-download (StudioBridge 2.1.2) +REM JAR auto-download (StudioBridge 2.1.3) REM --------------------------------------------------------------------------- -set "JAR_FILE=%PORTABLE%\StudioBridge-2.1.2.jar" -set "JAR_URL=https://github.com/Rdiger-36/StudioBridge/releases/download/v.2.1.2/StudioBridge-2.1.2.jar" +set "JAR_FILE=%PORTABLE%\StudioBridge-2.1.3.jar" +set "JAR_URL=https://github.com/Rdiger-36/StudioBridge/releases/download/v.2.1.3/StudioBridge-2.1.3.jar" if not exist "%JAR_FILE%" ( - echo [JAR] StudioBridge-2.1.2.jar not found. - echo [JAR] Downloading StudioBridge 2.1.2... + echo [JAR] StudioBridge-2.1.3.jar not found. + echo [JAR] Downloading StudioBridge 2.1.3... echo. powershell -NoProfile -Command "Invoke-WebRequest -Uri '%JAR_URL%' -OutFile '%JAR_FILE%'" 2>nul if not exist "%JAR_FILE%" ( echo ERROR: JAR download failed. Please check your internet connection. - echo You can also manually download StudioBridge-2.1.2.jar from: - echo https://github.com/Rdiger-36/StudioBridge/releases/tag/v.2.1.2 + echo You can also manually download StudioBridge-2.1.3.jar from: + echo https://github.com/Rdiger-36/StudioBridge/releases/tag/v.2.1.3 echo and place it in: %PORTABLE% pause exit /b 1 ) - echo [JAR] StudioBridge 2.1.2 downloaded successfully. + echo [JAR] StudioBridge 2.1.3 downloaded successfully. echo. ) REM --------------------------------------------------------------------------- diff --git a/README.md b/README.md index 9340af7..d2768a7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # StudioBridge -> **This portable distribution bundles StudioBridge v2.1.2** — the latest release from [Rdiger-36/StudioBridge](https://github.com/Rdiger-36/StudioBridge). +> **This portable distribution bundles StudioBridge v2.1.3** — the latest release from [Rdiger-36/StudioBridge](https://github.com/Rdiger-36/StudioBridge). With StudioBridge it is possible to make Bambu Lab 3D Printers visible in Bambu Studio or Orca Slicer, that cannot be automatically added by them. It is also possible to connect printers from other subnets or from accessible external networks (e.g. via VPN) or in your normal home network. @@ -18,12 +18,36 @@ You have the option to send the package via broadcast or directly to Bambu Studi You can check if the printer would connect correctly in Bambu Studio with the function **"Check Printer"**. +# Persistent data +On its very first start the app creates its own persistent data folder, so that everything you +save is remembered the next time you run it: + +- **Data directory:** `~/.studio-bridge/` — created automatically at startup. +- **Settings:** `~/.studio-bridge/settings` — remembers your theme, profile directory, + "remember last used profile" and direct-mode options. +- **Profiles:** `~/.studio-bridge/Profiles/*.sbp` — one file per printer profile + (printer name, IP address, serial number, model). Once you have saved a printer there, + it is loaded again on the next start, both in the GUI and with `--sendonly`. + +> **Note:** On Windows this is usually `C:\Users\\.studio-bridge\`. If you used a +> version older than 2.1.x, the app migrates your old `~/StudioBridge` data directory into the +> new one automatically on startup. + +# Updating StudioBridge +To check whether a newer release exists and to update/rebuild the complete bundle, see +**[UPDATE.md](UPDATE.md)** — a step-by-step runbook for an AI agent or a manual update. + +Quick check for updates: +```powershell +.\check-update.ps1 +``` + Successfully tested on: - Windows 10/11 ARM and x86 - Linux Ubuntu 25.10 ARM and x86 - MacOS Intel and M-Series -# Supported Printers (v2.1.2) +# Supported Printers (v2.1.3) | Display Name | Model Code | |---|---| | A1 | N2S | @@ -90,8 +114,8 @@ StudioBridge.jar is built in Java, so a Java Runtime Environment (JRE) is requir 2. Verify with `java -version`. **Running the GUI:** -2. Download `StudioBridge-2.1.2.jar` from the [GitHub releases page](https://github.com/Rdiger-36/StudioBridge/releases/tag/v.2.1.2). -2. Double-click the `.jar` to launch, or run: `java -jar StudioBridge-2.1.2.jar` +2. Download `StudioBridge-2.1.3.jar` from the [GitHub releases page](https://github.com/Rdiger-36/StudioBridge/releases/tag/v.2.1.3). +2. Double-click the `.jar` to launch, or run: `java -jar StudioBridge-2.1.3.jar` # FAQ diff --git a/StudioBridge-src/.classpath b/StudioBridge-src/.classpath new file mode 100644 index 0000000..09de93f --- /dev/null +++ b/StudioBridge-src/.classpath @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StudioBridge-src/.github/FUNDING.yml b/StudioBridge-src/.github/FUNDING.yml new file mode 100644 index 0000000..71997e8 --- /dev/null +++ b/StudioBridge-src/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: Rdiger36 +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/StudioBridge-src/.github/entitlements.plist b/StudioBridge-src/.github/entitlements.plist new file mode 100644 index 0000000..d876808 --- /dev/null +++ b/StudioBridge-src/.github/entitlements.plist @@ -0,0 +1,12 @@ + + + + + + com.apple.security.cs.allow-jit + + + com.apple.security.cs.allow-unsigned-executable-memory + + + diff --git a/StudioBridge-src/.github/packaging/cli-mac.properties b/StudioBridge-src/.github/packaging/cli-mac.properties new file mode 100644 index 0000000..d0c0e89 --- /dev/null +++ b/StudioBridge-src/.github/packaging/cli-mac.properties @@ -0,0 +1,2 @@ +main-jar=StudioBridge.jar +java-options=-Xmx512m diff --git a/StudioBridge-src/.github/packaging/cli-win.properties b/StudioBridge-src/.github/packaging/cli-win.properties new file mode 100644 index 0000000..130cf70 --- /dev/null +++ b/StudioBridge-src/.github/packaging/cli-win.properties @@ -0,0 +1,5 @@ +main-jar=StudioBridge.jar +java-options=-Xmx512m +win-console=true +win-shortcut=false +win-menu=false diff --git a/StudioBridge-src/.github/packaging/icons/icon.icns b/StudioBridge-src/.github/packaging/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..cbbf559abe875d68a800e90e71c98e41d0827dfa GIT binary patch literal 71911 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%0A0?l+RluwZc_|`y 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 $GITHUB_OUTPUT + + - name: Build fat JAR + run: mvn clean package -q + + - name: Prepare JAR artifact + run: | + mkdir input + cp target/*-jar-with-dependencies.jar input/${{ env.MAIN_JAR }} + cp target/*-jar-with-dependencies.jar "target/StudioBridge-${{ steps.version.outputs.value }}.jar" + + - uses: actions/upload-artifact@v7 + with: + name: jar-release + path: target/StudioBridge-*.jar + + - uses: actions/upload-artifact@v7 + with: + name: jar-input + path: input/StudioBridge.jar + + # ───────────────────────────────────────────────────────────────────────── + # Windows — MSI installer + portable ZIP (x86 and arm64) + # ───────────────────────────────────────────────────────────────────────── + build-windows: + needs: build-jar + if: startsWith(github.ref, 'refs/tags/v') + strategy: + fail-fast: false + matrix: + include: + - runner: windows-latest + arch: x86 + - runner: windows-11-arm + arch: arm64 + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + + # icon.ico is pre-converted and stored in .github/packaging/icons/ + + - name: Install WiX toolset (ARM64 only — not pre-installed on windows-11-arm) + if: matrix.arch == 'arm64' + shell: pwsh + run: | + choco install wixtoolset --no-progress -y + $wixDir = Get-ChildItem "C:\Program Files (x86)\WiX Toolset*\bin" | + Select-Object -First 1 -ExpandProperty FullName + echo "$wixDir" >> $env:GITHUB_PATH + + - name: Download JAR + uses: actions/download-artifact@v7 + with: + name: jar-input + path: input + + - name: Build minimal runtime via jlink + shell: pwsh + run: | + jlink ` + --add-modules "${{ env.MODULES }}" ` + --strip-debug ` + --no-header-files ` + --no-man-pages ` + --compress=zip-6 ` + --output runtime + + - name: Build MSI installer + shell: pwsh + run: | + # Add icon to CLI properties + Copy-Item .github/packaging/cli-win.properties cli-win.properties + Add-Content cli-win.properties "icon=.github/packaging/icons/icon.ico" + + jpackage ` + --type msi ` + --name "${{ env.APP_NAME }}" ` + --app-version "${{ needs.build-jar.outputs.version }}" ` + --input input ` + --main-jar "${{ env.MAIN_JAR }}" ` + --icon .github/packaging/icons/icon.ico ` + --runtime-image runtime ` + --java-options "${{ env.JAVA_OPTS }}" ` + --copyright "${{ env.COPYRIGHT }}" ` + --vendor "${{ env.VENDOR }}" ` + --description "${{ env.DESCRIPTION }}" ` + --about-url "${{ env.ABOUT_URL }}" ` + --win-menu --win-shortcut ` + --win-dir-chooser --win-shortcut-prompt ` + --win-upgrade-uuid "${{ env.WIN_UUID }}" ` + --add-launcher "StudioBridgeCLI=cli-win.properties" ` + --dest msi-output + + - name: Build portable app-image + shell: pwsh + run: | + Copy-Item .github/packaging/cli-win.properties cli-win.properties + Add-Content cli-win.properties "icon=.github/packaging/icons/icon.ico" + + jpackage ` + --type app-image ` + --name "${{ env.APP_NAME }}" ` + --app-version "${{ needs.build-jar.outputs.version }}" ` + --input input ` + --main-jar "${{ env.MAIN_JAR }}" ` + --icon .github/packaging/icons/icon.ico ` + --runtime-image runtime ` + --java-options "${{ env.JAVA_OPTS }}" ` + --add-launcher "StudioBridgeCLI=cli-win.properties" ` + --dest app-image + + - name: Create portable ZIP + shell: pwsh + run: | + $v = "${{ needs.build-jar.outputs.version }}" + Compress-Archive ` + -Path "app-image\${{ env.APP_NAME }}\*" ` + -DestinationPath "StudioBridge-${v}_win_${{ matrix.arch }}_NO-INSTALL.zip" + + - name: Rename and move MSI + shell: pwsh + run: | + $v = "${{ needs.build-jar.outputs.version }}" + Get-ChildItem msi-output\*.msi | + Move-Item -Destination "StudioBridge-${v}_win_${{ matrix.arch }}.msi" + + - uses: actions/upload-artifact@v7 + with: + name: windows-${{ matrix.arch }} + path: | + *.msi + *.zip + + # ───────────────────────────────────────────────────────────────────────── + # Linux — AppImage (x86_64 and aarch64) + # ───────────────────────────────────────────────────────────────────────── + build-linux: + needs: build-jar + if: startsWith(github.ref, 'refs/tags/v') + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-latest + arch: x86_64 + - runner: ubuntu-24.04-arm + arch: aarch64 + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + + - name: Install dependencies + run: sudo apt-get install -y libfuse2 + + - name: Download appimagetool + run: | + wget -q \ + "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-${{ matrix.arch }}.AppImage" \ + -O appimagetool + chmod +x appimagetool + + - name: Download JAR + uses: actions/download-artifact@v7 + with: + name: jar-input + path: input + + - name: Build minimal runtime via jlink + run: | + jlink \ + --add-modules "${{ env.MODULES }}" \ + --strip-debug \ + --no-header-files \ + --no-man-pages \ + --compress=zip-6 \ + --output runtime + + - name: Build app-image via jpackage + run: | + jpackage \ + --type app-image \ + --name "${{ env.APP_NAME }}" \ + --app-version "${{ needs.build-jar.outputs.version }}" \ + --input input \ + --main-jar "${{ env.MAIN_JAR }}" \ + --icon src/main/resources/icon.png \ + --runtime-image runtime \ + --java-options "${{ env.JAVA_OPTS }}" + + - name: Package as AppImage + run: | + VERSION="${{ needs.build-jar.outputs.version }}" + APPDIR="build/${{ env.APP_NAME }}.AppDir" + + # FHS-compliant AppDir structure + mkdir -p \ + "${APPDIR}/usr/bin" \ + "${APPDIR}/usr/lib/${{ env.APP_NAME }}" \ + "${APPDIR}/usr/share/applications" \ + "${APPDIR}/usr/share/icons/hicolor/256x256/apps" + + # Copy jpackage app-image into usr/lib + cp -a "${{ env.APP_NAME }}/." "${APPDIR}/usr/lib/${{ env.APP_NAME }}/" + + # Symlink launcher into PATH + ln -sfn "../lib/${{ env.APP_NAME }}/bin/${{ env.APP_NAME }}" \ + "${APPDIR}/usr/bin/${{ env.APP_NAME }}" + + # AppRun + cat > "${APPDIR}/AppRun" << 'APPRUN' + #!/bin/sh + HERE="$(dirname "$(readlink -f "$0")")" + exec "$HERE/usr/bin/StudioBridge" "$@" + APPRUN + chmod +x "${APPDIR}/AppRun" + + # .desktop entry + cat > "${APPDIR}/${{ env.APP_NAME }}.desktop" << 'DESKTOP' + [Desktop Entry] + Type=Application + Name=StudioBridge + Exec=StudioBridge + Icon=StudioBridge + Categories=Utility; + Terminal=false + DESKTOP + + # Icons + install -m 0644 src/main/resources/icon.png "${APPDIR}/${{ env.APP_NAME }}.png" + install -m 0644 src/main/resources/icon.png \ + "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${{ env.APP_NAME }}.png" + + ARCH=${{ matrix.arch }} APPIMAGE_EXTRACT_AND_RUN=1 \ + ./appimagetool "${APPDIR}" \ + "${{ env.APP_NAME }}-${VERSION}-${{ matrix.arch }}.AppImage" + + - uses: actions/upload-artifact@v7 + with: + name: linux-${{ matrix.arch }} + path: "*.AppImage" + + # ───────────────────────────────────────────────────────────────────────── + # macOS — signed + notarized DMG (arm64 / Apple Silicon only) + # + # Intel (x86) support dropped: macOS 27 (September 2026) removes Rosetta 2, + # making x86 app execution on Apple Silicon impossible. Intel Macs cannot + # upgrade to macOS 27, so the x86 user base will effectively be zero. + # + # Required secrets: + # MACOS_CERTIFICATE — base64-encoded Developer ID Application .p12 + # MACOS_CERTIFICATE_PWD — export password for the .p12 + # MACOS_KEYCHAIN_PWD — temporary keychain password (any value) + # APPLE_TEAM_NAME — name part of "Developer ID Application: Name (ID)" + # APPLE_TEAM_ID — 10-character Apple Team ID + # APPLE_ID — Apple ID e-mail for notarytool + # APPLE_APP_PASSWORD — app-specific password (appleid.apple.com) + # ───────────────────────────────────────────────────────────────────────── + build-macos: + needs: build-jar + if: startsWith(github.ref, 'refs/tags/v') + runs-on: macos-latest # arm64 — Apple Silicon (M-Series) + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + + - name: Import Developer ID certificate + env: + MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }} + MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }} + MACOS_KEYCHAIN_PWD: ${{ secrets.MACOS_KEYCHAIN_PWD }} + run: | + echo "$MACOS_CERTIFICATE" | base64 --decode > certificate.p12 + security create-keychain -p "$MACOS_KEYCHAIN_PWD" build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p "$MACOS_KEYCHAIN_PWD" build.keychain + security import certificate.p12 \ + -k build.keychain \ + -P "$MACOS_CERTIFICATE_PWD" \ + -T /usr/bin/codesign \ + -T /usr/bin/jpackage + security set-key-partition-list \ + -S apple-tool:,apple: \ + -s -k "$MACOS_KEYCHAIN_PWD" build.keychain + + # icon.icns is pre-converted and stored in .github/packaging/icons/ + + - name: Download JAR + uses: actions/download-artifact@v7 + with: + name: jar-input + path: input + + - name: Build minimal runtime via jlink + run: | + jlink \ + --add-modules "${{ env.MODULES }}" \ + --strip-debug \ + --no-header-files \ + --no-man-pages \ + --compress=zip-6 \ + --output runtime + + - name: Sign all native libraries inside JAR + # Apple notarization scans inside JARs for .dylib/.jnilib and rejects unsigned ones. + # Multiple dependencies (JNA, FlatLaf, ...) bundle macOS native code — sign them all. + env: + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + APPLE_TEAM_NAME: ${{ secrets.APPLE_TEAM_NAME }} + run: | + mkdir -p jar-natives + + # Collect paths of all native libs inside the JAR + NATIVE_LIBS=$(jar tf input/StudioBridge.jar | grep -E '\.(jnilib|dylib)$') + + if [ -z "$NATIVE_LIBS" ]; then + echo "No native libs found in JAR — skipping." + else + # Extract only those files + (cd jar-natives && echo "$NATIVE_LIBS" | xargs jar xf ../input/StudioBridge.jar) + + # Sign each one with hardened runtime + secure timestamp + find jar-natives -name "*.jnilib" -o -name "*.dylib" | \ + while read lib; do + echo "Signing: $lib" + codesign --force \ + --sign "Developer ID Application: ${APPLE_TEAM_NAME} (${APPLE_TEAM_ID})" \ + --options runtime \ + --timestamp \ + --entitlements .github/entitlements.plist \ + "$lib" + done + + # Repack signed natives back into the JAR + (cd jar-natives && find . -name "*.jnilib" -o -name "*.dylib" | \ + sed 's|^\./||' | xargs jar uf ../input/StudioBridge.jar) + fi + + rm -rf jar-natives + + - name: Build signed DMG + env: + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + APPLE_TEAM_NAME: ${{ secrets.APPLE_TEAM_NAME }} + run: | + # Add icon to CLI properties + cp .github/packaging/cli-mac.properties cli-mac.properties + echo "icon=.github/packaging/icons/icon.icns" >> cli-mac.properties + + jpackage \ + --type dmg \ + --name "${{ env.APP_NAME }}" \ + --app-version "${{ needs.build-jar.outputs.version }}" \ + --input input \ + --main-jar "${{ env.MAIN_JAR }}" \ + --icon .github/packaging/icons/icon.icns \ + --runtime-image runtime \ + --java-options "${{ env.JAVA_OPTS }}" \ + --copyright "${{ env.COPYRIGHT }}" \ + --vendor "${{ env.VENDOR }}" \ + --description "${{ env.DESCRIPTION }}" \ + --mac-sign \ + --mac-signing-key-user-name "Developer ID Application: ${APPLE_TEAM_NAME} (${APPLE_TEAM_ID})" \ + --mac-entitlements .github/entitlements.plist \ + --add-launcher "StudioBridgeCLI=cli-mac.properties" \ + --dest dmg-output + + - name: Rename DMG + run: | + V="${{ needs.build-jar.outputs.version }}" + mv dmg-output/*.dmg "StudioBridge-${V}_macOS_arm64.dmg" + + - name: Notarize and staple DMG + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }} + run: | + DMG=$(ls *.dmg | head -1) + + # Submit and capture result as JSON for error logging + RESULT=$(xcrun notarytool submit "$DMG" \ + --apple-id "$APPLE_ID" \ + --team-id "$APPLE_TEAM_ID" \ + --password "$APPLE_APP_PASSWORD" \ + --wait --output-format json) + + echo "$RESULT" + STATUS=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['status'])") + ID=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") + + # On failure print the detailed log from Apple before exiting + if [ "$STATUS" != "Accepted" ]; then + echo "Notarization failed (status: $STATUS) — fetching log..." + xcrun notarytool log "$ID" \ + --apple-id "$APPLE_ID" \ + --team-id "$APPLE_TEAM_ID" \ + --password "$APPLE_APP_PASSWORD" + exit 1 + fi + + xcrun stapler staple "$DMG" + + - uses: actions/upload-artifact@v7 + with: + name: macos-arm64 + path: "*.dmg" + + # ───────────────────────────────────────────────────────────────────────── + # Release — collects all artifacts, creates GitHub Release on tag push + # ───────────────────────────────────────────────────────────────────────── + release: + needs: [ build-jar, build-windows, build-linux, build-macos ] + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: read + steps: + - name: Download all artifacts + uses: actions/download-artifact@v7 + with: + path: artifacts + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: | + artifacts/jar-release/* + artifacts/windows-x86/* + artifacts/windows-arm64/* + artifacts/linux-x86_64/* + artifacts/linux-aarch64/* + artifacts/macos-arm64/* + name: "Version ${{ needs.build-jar.outputs.version }}" + generate_release_notes: true + append_body: true + body: | + --- + ## Downloads + + ### Windows + | | Installer (MSI) | Portable (ZIP) | + |---|---|---| + | **x86 (Intel/AMD)** | [⬇ StudioBridge-${{ needs.build-jar.outputs.version }}_win_x86.msi](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}_win_x86.msi) | [⬇ NO-INSTALL x86](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}_win_x86_NO-INSTALL.zip) | + | **ARM64** | [⬇ StudioBridge-${{ needs.build-jar.outputs.version }}_win_arm64.msi](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}_win_arm64.msi) | [⬇ NO-INSTALL arm64](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}_win_arm64_NO-INSTALL.zip) | + + ### Linux + | | AppImage | + |---|---| + | **x86_64 (Intel/AMD)** | [⬇ StudioBridge-${{ needs.build-jar.outputs.version }}-x86_64.AppImage](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}-x86_64.AppImage) | + | **aarch64 (ARM)** | [⬇ StudioBridge-${{ needs.build-jar.outputs.version }}-aarch64.AppImage](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}-aarch64.AppImage) | + + ### macOS + | | DMG | + |---|---| + | **Apple Silicon (M-Series)** | [⬇ StudioBridge-${{ needs.build-jar.outputs.version }}_macOS_arm64.dmg](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}_macOS_arm64.dmg) | + + ### JAR (alle Plattformen, erfordert Java 21+) + | | | + |---|---| + | **Standalone JAR** | [⬇ StudioBridge-${{ needs.build-jar.outputs.version }}.jar](https://github.com/Rdiger-36/StudioBridge/releases/download/${{ github.ref_name }}/StudioBridge-${{ needs.build-jar.outputs.version }}.jar) | + prerelease: ${{ contains(github.ref_name, '-') }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/StudioBridge-src/.gitignore b/StudioBridge-src/.gitignore new file mode 100644 index 0000000..3c85ea6 --- /dev/null +++ b/StudioBridge-src/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +.project +.settings +target/ +.idea/ diff --git a/StudioBridge-src/LICENSE b/StudioBridge-src/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/StudioBridge-src/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/StudioBridge-src/README.md b/StudioBridge-src/README.md new file mode 100644 index 0000000..830570e --- /dev/null +++ b/StudioBridge-src/README.md @@ -0,0 +1,237 @@ +

+ StudioBridge icon +

+ +

StudioBridge

+ +

+ Make your Bambu Lab 3D printers visible in Bambu Studio or Orca Slicer — across any network.
+ Connect printers from other subnets, VPNs, or your home network with a simple GUI. +

+ +

+ version + Java + platform + license + build + maintained +

+ +

+ stars + forks + open issues + total downloads + last commit +

+ +--- + +With StudioBridge it is possible to make Bambu Lab 3D Printers visible in Bambu Studio or Orca Slicer, that can not be automatically added by them. +It is also possible to connect printers from other subnets or from accessible external networks (e.g. via VPN) or in your normal home network. +There are many scripts for all kinds of systems, but many users feel more comfortable with a GUI. Therefore I developed StudioBridge, which is basically based on the scripts i found in countless forums. + +# How it works +StudioBridge sends a UDP request to your Slicer (Bambu Studio or Orca Slicer) with the printer data (IP address, serial number, printer type, printer name). +Once all the data has been entered, it can be sent to your Slicer, making the printer visible. Now the printer can be accessed via the LAN access code. This means that all the usual functions are available. + +This Programm has nothing to do with Bambu Connect and it also doesn't replace it. It's only for the connection in your Slicer. + +With StudioBridge all printers of the Bambu Lab assortment can be added. It is also possible to create and save a profile for each printer. + +You have the option to send the package via broadcast or directly to Bambu Studio. + +You can check if the printer would connect correctly in Bambu Studio with the function "Check Printer". + +Successfully tested on: +- Windows 10/11 ARM and x86 +- Linux Ubuntu 25.10 ARM and x86 +- macOS M-Series (Apple Silicon) + +> **Note for Intel Mac users:** macOS 27 (September 2026) removes Rosetta 2 support. Native Intel (x86) builds are no longer provided. Intel Mac users can use the `.jar` release with Java 21+. + +# Requirements +- min. Java 21 (only for .jar compiled release) + +# Preview +Lightmode + +![image](https://github.com/user-attachments/assets/d7f51a53-35d4-4e5d-b77d-9bf5a77eaf36) ![image](https://github.com/user-attachments/assets/8a1b0062-bc4d-4b25-8247-d3349b8b6b74) + + +Darkmode + +![image](https://github.com/user-attachments/assets/216cb8b1-8913-4d71-87af-b4356de9c614) ![image](https://github.com/user-attachments/assets/a41a6a8b-a3ae-4baf-92a9-1069df042c4c) + +Multiple Printer Setup + +![Bildschirmfoto 2025-02-05 um 00 04 00](https://github.com/user-attachments/assets/3a295a9c-2ca2-4d1d-ad1e-8e68909f9f84) +![Bildschirmfoto 2025-02-05 um 00 03 04](https://github.com/user-attachments/assets/62ed0dd8-000d-4682-8399-c5b6229204ed) + +Printer Check + +![Printer_Check](https://github.com/user-attachments/assets/ccb139b0-e737-49a5-9b8c-0faf00316892) + +If TCP Handshake is not working, then it helps to restart your printer. + +# Demo + +![StudioBridgeDemo](https://github.com/user-attachments/assets/e5e197ab-54bf-4a6d-bc40-dd46607597f8) + + +# Arguments + +To use StudioBridge via Terminal/CMD/PowerShell you have to run the StudioBridgeCLI on MacOS and Windows + +#### MacOS +```bash + +/Applications/StudioBridge.app/Contents/MacOS/StudioBridgeCLI --help + +*** StudioBridge by Rdiger-36 v.2.1.3 *** + +Usage: + /Applications/StudioBridge.app/Contents/MacOS/StudioBridgeCLI [OPTIONS] + +Options: + You can combine every option with each other + +Starting options: + --noupdate Skip search for latest updates on startup + --sendonly Start with no GUI, only send data from all printers to Bambu Studio + --direct Send UPD package directly to Bambu Studio, not over broadcast + --help Show help for StudioBridge + +Profile options: + --customProfilesDir='/path/to/profiles/' + Set custom profiles directory which will be loaded from this for StudioBridgeCLI + Default: `~/.studio-bridge/Profiles` + --selectedPrinters='/path/to/profile.sbp/','/path/to/other/profile2.sbp/' + Set single profiles which will be used for StudioBridgeCLI (single and multi profiles comma-separated) + +Example: + /Applications/StudioBridge.app/Contents/MacOS/StudioBridgeCLI --help + /Applications/StudioBridge.app/Contents/MacOS/StudioBridgeCLI --sendonly --noupdate --direct + /Applications/StudioBridge.app/Contents/MacOS/StudioBridgeCLI --sendonly --customProfilesDir='/Users/rdiger-36/Documents/StudioBridgeProfiles' + /Applications/StudioBridge.app/Contents/MacOS/StudioBridgeCLI --sendonly --selectedPrinters='/Users/rdiger-36/Documents/My P1S.sbp','/Users/rdiger-36/Desktop/Profiles/H2D-Pro Work.sbp.sbp' +``` + +#### Windows +You can find the StudioBridgeCLI.exe in your installation directory, standard: "C:\Program Files\StudioBridge" +```bash +.\StudioBridgeCLI.exe --help + +*** StudioBridge by Rdiger-36 v.2.1.3 *** + +You are currently running this application in raw mode (via .jar)! +For the official version for your OS and CPU architecture, please visit the GitHub repository. +https://github.com/Rdiger-36/StudioBridge/ + +Usage: + ./StudioBridgeCLI.exe [OPTIONS] + +Options: + You can combine every option with each other + +Starting options: + --noupdate Skip search for latest updates on startup + --sendonly Start with no GUI, only send data from all printers to Bambu Studio + --direct Send UPD package directly to Bambu Studio, not over broadcast + --help Show help for StudioBridge + +Profile options: + --customProfilesDir='/path/to/profiles/' + Set custom profiles directory which will be loaded from this for StudioBridgeCLI + Default: `~/.studio-bridge/Profiles` + --selectedPrinters='/path/to/profile.sbp/','/path/to/other/profile2.sbp/' + Set single profiles which will be used for StudioBridgeCLI (single and multi profiles comma-separated) + +Example: + ./StudioBridgeCLI.exe --help + ./StudioBridgeCLI.exe --sendonly --noupdate --direct + ./StudioBridgeCLI.exe --sendonly --customProfilesDir='C:\Users\rdiger-36\Documents\StudioBridgeProfiles' + ./StudioBridgeCLI.exe --sendonly --selectedPrinters='C:\Users\rdiger-36\Documents\My P1S.sbp','C:\Users\rdiger-36\Desktop\H2D-Pro Work.sbp' +``` + +#### Linux +```bash +.\StudioBridge.AppImage --help + +*** StudioBridge by Rdiger-36 v.2.1.3 *** + +You are currently running this application in raw mode (via .jar)! +For the official version for your OS and CPU architecture, please visit the GitHub repository. +https://github.com/Rdiger-36/StudioBridge/ + +Usage: + ./StudioBridge.AppImage [OPTIONS] + +Options: + You can combine every option with each other + +Starting options: + --noupdate Skip search for latest updates on startup + --sendonly Start with no GUI, only send data from all printers to Bambu Studio + --direct Send UPD package directly to Bambu Studio, not over broadcast + --help Show help for StudioBridge + +Profile options: + --customProfilesDir='/path/to/profiles/' + Set custom profiles directory which will be loaded from this for StudioBridgeCLI + Default: `~/.studio-bridge/Profiles` + --selectedPrinters='/path/to/profile.sbp/','/path/to/other/profile2.sbp/' + Set single profiles which will be used for StudioBridgeCLI (single and multi profiles comma-separated) + +Example: + ./StudioBridge.AppImage --help + ./StudioBridge.AppImage --sendonly --noupdate --direct + ./StudioBridge.AppImage --sendonly --customProfilesDir='/home/rdiger-36/Documents/StudioBridgeProfiles' + ./StudioBridge.AppImage --sendonly --selectedPrinters='/home/rdiger-36/Documents/My P1S.sbp','/home/rdiger-36/Desktop/H2D-Pro Work.sbp' +``` + +If you use --sendonly the output will look like this: +```bash +*** StudioBridge by Rdiger-36 *** + +Found 2 profiles! +Try to send all of them to Bambu Studio + +Successfully sended Test Bambu X1E - 192.168.XXX.XXX - X1E to Bambu Studio +Successfully sended Bambu Lab P1S - 192.168.XXX.XXX - P1S to Bambu Studio +All Packages successfully sent to Bambu Studio +``` +# Installing Java and Running the JAR File (Only for using .jar!) + +StudioBridge.jar is built in Java, so a Java Runtime Environment (JRE) is required to run the program. Below are simple instructions for installing Java on Windows, macOS, and Linux, as well as for launching the StudioBridge GUI. + +Java Installation + +Windows: + + 1. Visit the official Java website and download the latest Java Runtime Environment (JRE) for Windows. + 2. Run the downloaded installer file and follow the on-screen instructions to complete the installation. + 3. To confirm that Java is installed, you can search for “Java” in the Start menu. You should see options like “Java Control Panel” if installation was successful. + +macOS: + + 1. Visit the official Java website and download the latest Java Runtime Environment (JRE) for macOS. + 2. Open the downloaded .dmg file and follow the instructions to install Java by dragging it into the Applications folder. + 3. After installation, open “System Preferences,” then “Java” to verify Java is installed and configured correctly. + +Linux: + + 1. Most Linux distributions offer Java in their software repositories. Open the Software Center or Package Manager for your distribution and search for “OpenJDK” or “Java Runtime Environment.” + 2. Select the version you need (Java 8 or later) and install it. + 3. You can check if Java is installed by searching for it in the applications menu or checking for “Java” in system settings. + +Running the StudioBridge GUI + + 1. Download the StudioBridge.jar file from the GitHub releases page. + 2. Locate the StudioBridge.jar file in your Downloads or specified folder. + 3. Double-click the .jar file to launch StudioBridge. This should open the GUI, allowing you to configure and use your 3D printers with Bambu Studio over LAN. + +If the .jar file does not open directly, ensure Java is properly installed, and check your system’s default settings for opening .jar files. + +# Support Me +[![Buy Me a Coffee](https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png)](https://www.buymeacoffee.com/Rdiger36) diff --git a/StudioBridge-src/pom.xml b/StudioBridge-src/pom.xml new file mode 100644 index 0000000..07d2c5d --- /dev/null +++ b/StudioBridge-src/pom.xml @@ -0,0 +1,143 @@ + + 4.0.0 + + rdiger36 + StudioBridge + 2.1.3 + jar + + StudioBridge + http://maven.apache.org + + + UTF-8 + rdiger36.StudioBridge.gui.MainMenu + + + 3.7.1 + 2.22.0 + 5.19.0 + 20260522 + 4.13.2 + 1.1.2 + + + + + jitpack.io + https://jitpack.io + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 11 + 11 + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.5.0 + + + + true + ${main.class} + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + jar-with-dependencies + + + + ${main.class} + + + + + + package + + single + + + + + + + org.codehaus.mojo + versions-maven-plugin + 2.18.0 + + + + com.github.steos:jnafilechooser + + .*-SNAPSHOT + + + + + + + + junit + junit + ${junit.version} + test + + + com.formdev + flatlaf + ${flatlaf.version} + + + com.formdev + flatlaf-extras + ${flatlaf.version} + + + commons-io + commons-io + ${commons-io.version} + + + net.java.dev.jna + jna + ${jna.version} + + + net.java.dev.jna + jna-platform + ${jna.version} + + + org.json + json + ${json.version} + + + com.github.steos + jnafilechooser + ${jnafilechooser.version} + + + + \ No newline at end of file diff --git a/StudioBridge-src/rebuild-jar.bat b/StudioBridge-src/rebuild-jar.bat new file mode 100644 index 0000000..36efb02 --- /dev/null +++ b/StudioBridge-src/rebuild-jar.bat @@ -0,0 +1,65 @@ +@echo off +REM =========================================================================== +REM rebuild-jar.bat - Rebuild StudioBridge.jar from source and deploy it to +REM the portable-dist folder. +REM +REM Requirements: +REM - Apache Maven (auto-located from %LOCALAPPDATA%\Programs\apache-maven-*) +REM - A JDK/JRE with javac (uses the bundled one in ..\portable-dist\jre) +REM =========================================================================== +setlocal +cd /d "%~dp0" + +REM --- Locate Maven ---------------------------------------------------------- +set "MAVEN_CMD=" +for /d %%D in ("%LOCALAPPDATA%\Programs\apache-maven-*") do ( + if exist "%%D\bin\mvn.cmd" set "MAVEN_CMD=%%D\bin\mvn.cmd" +) +if not defined MAVEN_CMD ( + echo ERROR: Maven not found. Install it or set MAVEN_CMD manually. + pause + exit /b 1 +) + +REM --- Use the bundled JDK/JRE for building --------------------------------- +set "JAVA_HOME=%~dp0..\portable-dist\jre" +if not exist "%JAVA_HOME%\bin\javac.exe" ( + echo ERROR: No compiler found in "%JAVA_HOME%". + pause + exit /b 1 +) + +echo [BUILD] Using Maven : %MAVEN_CMD% +echo [BUILD] Using JAVA_HOME : %JAVA_HOME% +echo. + +REM --- Build ---------------------------------------------------------------- +call "%MAVEN_CMD%" -f pom.xml clean package +if errorlevel 1 ( + echo. + echo ERROR: Maven build failed. + pause + exit /b 1 +) + +REM --- Deploy the fat jar to portable-dist ---------------------------------- +set "JAR_VERSION=2.1.3" +set "BUILT=target\StudioBridge-%JAR_VERSION%-jar-with-dependencies.jar" +set "DEST=..\portable-dist\StudioBridge-%JAR_VERSION%.jar" + +if not exist "%BUILT%" ( + echo ERROR: Build output not found: %BUILT% + pause + exit /b 1 +) + +copy /Y "%BUILT%" "%DEST%" >nul +if errorlevel 1 ( + echo ERROR: Could not copy jar to %DEST% + pause + exit /b 1 +) + +echo. +echo [OK] Rebuilt and deployed: %DEST% +endlocal diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Config.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Config.java new file mode 100644 index 0000000..d77ac7d --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Config.java @@ -0,0 +1,430 @@ +package rdiger36.StudioBridge.functions; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; + +import javax.swing.ImageIcon; +import javax.swing.JFrame; + +import com.formdev.flatlaf.FlatLaf; + +import rdiger36.StudioBridge.gui.DialogOneButton; +import rdiger36.StudioBridge.gui.DialogTwoButtons; +import rdiger36.StudioBridge.gui.MainMenu; +import rdiger36.StudioBridge.gui.SaveDialog; +import rdiger36.StudioBridge.objects.Printer; + +/** + * The {@code Config} class provides utility methods for managing application settings + * and printer profiles. It includes functionality for saving and loading user + * preferences (e.g., theme, profile directories, last used profile) as well as + * reading and writing printer profile configuration files. + * + *

This class serves as a central configuration handler for the application and + * ensures consistent access to settings and profile data.

+ */ + +public class Config { + + /** + * Displays a warning dialog if the current printer profile is new and contains + * unsaved data. The user may choose to save the profile or continue without saving. + * + *

If the user chooses to save, a dialog is shown to enter a profile name. + * The profile is then written to disk and the given {@link Printer} object is + * updated accordingly.

+ * + * @param mainFrame the window used for dialog positioning. + * @param printer the printer object containing the unsaved profile data. + * @return the name of the saved profile, or an empty string if the user chose + * not to save. + */ + public static String saveUnsavedNewProfile(JFrame mainFrame, Printer printer) { + + // Display a dialog that warns the user about unsaved profile changes. + // The dialog has two buttons: "Save new profile" and "Continue without saving". + // The user's choice is stored in the variable 'response'. + int response = new DialogTwoButtons(mainFrame, null, + new ImageIcon(MainMenu.class.getResource("/achtung.png")), + "Warning! The new profile has not been saved yet!", + "Save new profile", + "Continue without saving").showDialog(); + + // If the user chooses to save the profile (response == 0): + if (response == 0) { + // Get the profile name by showing a save dialog. + // The text from the 'txtName' field is used as the initial suggestion for the profile name. + String profileName = new SaveDialog(mainFrame, printer.getProfileName(), "Save").saveProfile().trim(); + + // Save the profile with the entered name and associated details (model, IP, serial number), when the profile name is set. + if (!profileName.equals("")) { + printer.setProfileName(profileName); + saveProfile(mainFrame, printer); + } + + // Return the name of the saved profile. + return profileName; + } + + // If the user chooses to continue without saving, return an empty string. + return ""; + } + + /** + * Displays a dialog when an existing profile contains unsaved changes. The user + * may choose to save or continue without saving. + * + *

If the user chooses to save, the changes are written to the profile file.

+ * + * @param mainFrame the window used for dialog positioning. + * @param printer the printer object representing the modified profile. + * @return {@code true} if the profile was saved, {@code false} if the user chose + * not to save. + */ + public static boolean saveUnsavedProfile(JFrame mainFrame, Printer printer) { + + // Display a dialog warning the user that the current profile contains unsaved changes. + // The dialog has two buttons: "Save profile" and "Continue without saving". + int response = new DialogTwoButtons(mainFrame, null, + new ImageIcon(MainMenu.class.getResource("/achtung.png")), + "Warning! The selected profile contains changes!", + "Save profile", + "Continue without saving").showDialog(); + + // If the user chooses to save the profile (response == 0): + if (response == 0) { + + // Save the profile using the selected name and the provided profile details. + saveProfile(mainFrame, printer); + + // Return true indicating that the profile has been saved. + return true; + } + + // If the user chooses to continue without saving, return false. + return false; + } + + /** + * Writes the contents of a {@link Printer} profile to a configuration file. + * The file is stored inside the application's profile directory and saved + * using the profile name with ".sbp" as extension. + * + * @param mainFrame the window used for displaying error dialogs. + * @param printer the printer object whose data should be stored. + * @return {@code true} if the profile was saved successfully, + * {@code false} if an error occurred. + */ + public static boolean saveProfile(JFrame mainFrame, Printer printer) { + + // Create a StringBuilder to build the profile configuration line by line. + StringBuilder config = new StringBuilder(); + + // Add the profile name from the comboBox to the configuration. + config.append("ProfileName=" + printer.getProfileName()); + config.append(System.getProperty("line.separator")); // Add a new line. + + // Add the IP address from the txtIP field to the configuration. + config.append("IP-Address=" + printer.getIpAdress()); + config.append(System.getProperty("line.separator")); // Add a new line. + + // Add the printer serial number from the txtSerial field to the configuration. + config.append("PrinterSN=" + printer.getSerialNumber()); + config.append(System.getProperty("line.separator")); // Add a new line. + + // Add the printer model type (as index) from the cbxModel comboBox to the configuration. + config.append("PrinterType=" + printer.getPrinterModel()); + config.append(System.getProperty("line.separator")); // Add a new line. + + // Add the printer name from the txtName field to the configuration. + config.append("PrinterName=" + printer.getPrinterName()); + + /** + * Create a FileOutputStream to write the content of the config StringBuilder into a file. + * The file is saved in the profiles directory defined by MainMenu.ProfilesDir, with the profile + * name and ".sbp" file extension. + */ + FileOutputStream fos; + try { + // Create and open a file at the specified path with the profile name. + fos = new FileOutputStream(MainMenu.ProfilesDir + System.getProperty("file.separator") + printer.getProfileName() + ".sbp"); + + // Write the content of the config to the file as bytes. + fos.write(config.toString().getBytes()); + + // Close the file stream after writing. + fos.close(); + } catch (Exception e1) { + // Show error if saving the file has failed + new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to save the profile!", "Ok").showDialog(); + return false; + } + + // Return true if the profile was successfully saved. + return true; + } + + /** + * Loads the contents of a printer profile file and constructs a {@link Printer} + * object based on its data. + * + * @param mainFrame the frame used for error dialog display. + * @param profile the absolute file path of the profile to load. + * @return a {@link Printer} object with the loaded data, + * or {@code null} if the file could not be read. + */ + public static Printer loadProfile(JFrame mainFrame, String profile) { + + // Create a File object representing the configuration file. + File configFile = new File(profile); + + // Variable to hold each line read from the configuration file. + String line = ""; + + // BufferedReader to read the contents of the configuration file. + BufferedReader inputStream; + + // Check if the configuration file exists. + if (configFile.exists()) { + Printer printer = new Printer(configFile.getName().replace(".sbp", ""), "", "", "", ""); + + try { + // Open the configuration file for reading. + inputStream = new BufferedReader(new FileReader(configFile)); + + // Read each line of the file until the end. + while((line = inputStream.readLine()) != null) { + + /** + * Use the get_Conf() method to assign the values from the configuration file + * to the appropriate variables (combo box and text fields). + * Each line is split into a key-value pair, where the key is on the left side of '=' + * and the value on the right. + */ + String[] parts = line.split("=", 2); + getPrinterConf(parts[0], parts.length > 1 ? parts[1] : "", printer); + } + + // Close the BufferedReader after reading all lines. + inputStream.close(); + } catch (Exception e) { + // Show error if reading the file has failed + new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to read the profile file!", "Ok").showDialog(); + return null; + } + return printer; + } else { + return null; + } + } + + /** + * Parses a configuration key/value pair and assigns the corresponding value + * to the given {@link Printer} object's fields. + * + * @param configType the configuration key (e.g., "IP-Address"). + * @param wert the configuration value. + * @param printer the printer object that receives the configuration data. + */ + private static void getPrinterConf(String configType, String wert, Printer printer) { + + // Switch statement to assign the value to the correct field based on the configuration type. + switch(configType) { + + // Set the IP address in the txtIP field, limiting the length to 15 characters. + case "IP-Address": + printer.setIpAdress(checkLength(wert, 15)); + break; + + // Set the printer serial number in the txtSerial field, limiting the length to 25 characters. + case "PrinterSN": + printer.setSerialNumber(checkLength(wert, 25)); + break; + + // Set the selected index of the printer model in the cbxModel combo box based on the value. + case "PrinterType": + printer.setPrinterModel(checkLength(wert, 25)); + break; + + // Set the printer name in the txtName field, limiting the length to 25 characters. + case "PrinterName": + printer.setPrinterName(checkLength(wert, 25)); + break; + + // Default case if no known configuration type is found (does nothing). + default: + break; + } + } + + + /** + * Ensures that a string does not exceed a maximum length. If the string is + * longer than the allowed value, it is truncated. + * + * @param wert the string to check. + * @param length the maximum allowed length. + * @return the original string if within limits, otherwise a truncated version. + */ + private static String checkLength(String wert, int length) { + + // If the length of the string exceeds the specified maximum, truncate it. + if (wert.length() > length) { + wert = wert.substring(0, length); + } + + // Return the original or truncated string. + return wert; + } + + + /** + * Writes the user's application settings to the "settings" file in the + * application configuration directory. + * + *

The following settings are stored:

+ *
    + *
  • Dark mode state
  • + *
  • Custom profile directory
  • + *
  • Remember last used profile
  • + *
  • Last used profile name (optional)
  • + *
  • Direct mode flag
  • + *
  • Show JAR info flag
  • + *
+ * + * @param mainFrame the frame used to display possible error dialogs. + */ + public static void saveUserSettings(JFrame mainFrame) { + // Create a StringBuilder to construct the configuration settings line by line. + StringBuilder config = new StringBuilder(); + + // Append the dark mode setting to the configuration. + config.append("enableDarkmode=" + FlatLaf.isLafDark()); + config.append(System.getProperty("line.separator")); // Add a new line. + + // Append the custom profiles path to the configuration. + config.append("customProfilesPath=" + MainMenu.ProfilesDir); + config.append(System.getProperty("line.separator")); // Add a new line. + + // Append the usage of the last used profile to the configuration. + config.append("rememberLastUsedProfile=" + MainMenu.rememberLastUsedProfile); + config.append(System.getProperty("line.separator")); // Add a new line. + + // If the option to remember the last used profile is enabled, store the name of the profile to the configuration + if (MainMenu.rememberLastUsedProfile) { + + // Append the last used profile to the configuration. + config.append("lastUsedProfile=" + MainMenu.lastUsedProfile); + config.append(System.getProperty("line.separator")); // Add a new line. + } + + // Append the usage of the mode for sending UDP packages to the configuration. + config.append("directMode=" + MainMenu.directMode); + config.append(System.getProperty("line.separator")); // Add a new line. + + // Append the usage of the mode to show the jar info to the configuration. + config.append("showJarInfo=" + MainMenu.jarInfo); + config.append(System.getProperty("line.separator")); // Add a new line. + + /** + * FileOutputStream to create and write the contents of the StringBuilder to + * a file at the specified save path. + */ + FileOutputStream fos; + try { + // Create a FileOutputStream for the settings file. + fos = new FileOutputStream(MainMenu.savePath + System.getProperty("file.separator") + "settings"); + // Write the configuration settings to the file. + fos.write(config.toString().getBytes()); + // Close the output stream. + fos.close(); + } catch (Exception e1) { + // Show error if saving the file has failed + e1.printStackTrace(); + new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to write the config to the config file!", "Ok").showDialog(); + } + } + + /** + * Loads the application settings from the "settings" file and assigns the + * values to the corresponding fields in {@link MainMenu}. + * + *

If the settings file does not exist, no values are loaded.

+ */ + public static void loadAppSettings() { + // Define the path to the user settings file. + String userSettings = MainMenu.savePath + System.getProperty("file.separator") + "settings"; + + + // Check if the settings file exists. + if (new File(userSettings).exists()) { + try { + String line; + // Open the settings file for reading using a BufferedReader. + try (BufferedReader inputStream = new BufferedReader(new FileReader(userSettings))) { + // Read each line of the file. + while((line = inputStream.readLine()) != null) { + + String[] parts = line.split("=", 2); + getAppConf(parts[0], parts.length > 1 ? parts[1] : ""); + } + // The BufferedReader is automatically closed here due to the try-with-resources statement. + } + } catch (Exception e) { + // Show error if reading the file has failed + e.printStackTrace(); + new DialogOneButton(null, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to read the config file!", "Ok").showDialog(); + } + } + } + + /** + * Assigns a setting key/value pair from the settings file to the appropriate + * application field in {@link MainMenu}. + * + * @param configType the settings key. + * @param wert the settings value. + */ + private static void getAppConf(String configType, String wert) { + + // Switch statement to assign the value to the correct field based on the configuration type. + switch(configType) { + + // Set the enableDarkmode setting + case "enableDarkmode": + MainMenu.darkmode = Boolean.valueOf(wert); + break; + + // Set the customProfilesPath setting + case "customProfilesPath": + MainMenu.ProfilesDir = wert; + break; + + // Set the rememberLastUsedProfile setting + case "rememberLastUsedProfile": + MainMenu.rememberLastUsedProfile = Boolean.valueOf(wert); + break; + + // Set the lastUsedProfile setting + case "lastUsedProfile": + MainMenu.lastUsedProfile = wert; + break; + + // Set the directMode setting + case "directMode": + MainMenu.directMode = Boolean.valueOf(wert); + break; + + // Set the showJarInfo setting + case "showJarInfo": + MainMenu.jarInfo = Boolean.valueOf(wert); + break; + + // Default case if no known configuration type is found (does nothing). + default: + break; + } + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Connectivity.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Connectivity.java new file mode 100644 index 0000000..74f8adf --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Connectivity.java @@ -0,0 +1,110 @@ +package rdiger36.StudioBridge.functions; + +import javax.net.ssl.*; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; + +/** + * Utility class that provides methods to check network connectivity, + * including TLS handshake validation and reachability tests. + */ +public class Connectivity { + + /** + * Attempts to establish a TLS connection to the specified host on port 6000. + *

+ * This method: + *

    + *
  • Creates a custom SSLContext that trusts all certificates (insecure, for testing purposes).
  • + *
  • Opens a TLS socket to the host and performs a handshake.
  • + *
  • Sends a basic HTTP GET request to test communication.
  • + *
+ * + * @param host The hostname or IP address of the target server. + * @return {@code true} if the TLS handshake was successful (or if data exchange + * succeeded after handshake failure); {@code false} otherwise. + */ + public static boolean checkTLSHandshake(String host) { + int port = 6000; + SSLSocket socket = null; + boolean handshakeDone = false; + + try { + // Create an SSL context that trusts all certificates (not recommended for production use) + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, new TrustManager[]{new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] c, String a) {} + public void checkServerTrusted(X509Certificate[] c, String a) {} + public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } + }}, new SecureRandom()); + + // Create an SSL socket + SSLSocketFactory factory = sc.getSocketFactory(); + socket = (SSLSocket) factory.createSocket(); + + // Set connection timeout + socket.setSoTimeout(5000); + + // Connect to host and start TLS handshake + socket.connect(new InetSocketAddress(host, port), 5000); + socket.startHandshake(); + handshakeDone = true; + + // Send a simple HTTP GET request to check data transmission + String http = "GET / HTTP/1.1\r\n" + + "Host: " + host + ":" + port + "\r\n" + + "User-Agent: java-ssl-probe\r\n" + + "Accept: */*\r\n" + + "Connection: close\r\n\r\n"; + OutputStream out = socket.getOutputStream(); + out.write(http.getBytes(StandardCharsets.US_ASCII)); + out.flush(); + + // Read one byte to verify response from server + InputStream in = socket.getInputStream(); + byte[] one = in.readNBytes(1); + boolean gotResponse = one.length > 0; + return handshakeDone && gotResponse; + + } catch (SSLHandshakeException e) { + // TLS handshake failed (likely invalid certificate or protocol mismatch) + return false; + + } catch (Exception e) { + // If handshake was already done but a later error occurred, still return true + if (handshakeDone) { + return true; + } + return false; + + } finally { + // Clean up the socket + if (socket != null) { + try { + socket.close(); + } catch (Exception ignore) {} + } + } + } + + /** + * Attempts to checkPort 6000 of the printer to check network reachability. + * + * @param host The hostname or IP address to ping. + * @return {@code true} if the host is reachable within 5 seconds, + * {@code false} otherwise. + */ + public static boolean pingPrinter(String host) { + try (java.net.Socket s = new java.net.Socket()) { + s.connect(new java.net.InetSocketAddress(host, 8883), 5000); + return true; + } catch (Exception e) { + return false; + } + } + +} diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Exit.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Exit.java new file mode 100644 index 0000000..eea721b --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Exit.java @@ -0,0 +1,130 @@ +package rdiger36.StudioBridge.functions; + +import java.io.File; +import java.util.ArrayList; + +import javax.swing.ImageIcon; +import javax.swing.JFrame; + +import rdiger36.StudioBridge.gui.DialogTwoButtons; +import rdiger36.StudioBridge.gui.MainMenu; +import rdiger36.StudioBridge.objects.Printer; + +/** + * The {@code Exit} class provides functionality for performing a clean shutdown + * of the application. Before termination, it ensures that unsaved profiles and + * user settings are properly handled to prevent data loss. + * + *

The class checks whether the currently edited or imported profiles contain + * unsaved changes and triggers the necessary save dialogs if required before + * the application closes.

+ */ +public class Exit { + + /** + * Initiates the application shutdown sequence while ensuring that all + * unsaved profile data and user settings are correctly saved. + * + *

The method performs the following checks:

+ *
    + *
  • If the currently selected profile is a new, unsaved profile + * containing data, the user is prompted to save it.
  • + *
  • If the loaded profile has been modified, the user is prompted + * to save the changes.
  • + *
  • If imported profiles exist that have not yet been saved to the + * filesystem, the user is warned accordingly.
  • + *
  • Finally, user settings are saved and the application terminates.
  • + *
+ * + * @param mainFrame the main application window used to display dialogs. + * @param profiles a list of all profile names currently loaded in the UI. + * @param printer the currently edited {@link Printer} object whose values + * may need to be saved before exiting. + */ + public static void closeApp(JFrame mainFrame, ArrayList profiles, Printer printer) { + + String importedProfileSaved = checkImportedProfiles(profiles); + + // Check if the selected profile is "New profile" and has unsaved data + if (printer.getPrinterModel().equals("New profile") && + (printer.getIpAdress().length() > 0 || printer.getSerialNumber().length() > 0 || printer.getPrinterName().length() > 0)) { + + Config.saveUnsavedNewProfile(mainFrame, printer); + } + + // Check if there are changes in the existing profile + else if (MainMenu.mainPrinter != null) { + if (!printer.getIpAdress().equals(MainMenu.mainPrinter.getIpAdress()) || + !printer.getSerialNumber().equals(MainMenu.mainPrinter.getSerialNumber()) || + !printer.getPrinterName().equals(MainMenu.mainPrinter.getPrinterName()) || + !printer.getPrinterModel().equals(MainMenu.mainPrinter.getPrinterModel())) { + + Config.saveUnsavedNewProfile(mainFrame, printer); + } + } + + // Check if there is exactly one unsaved imported profile + else if (importedProfileSaved.equals("oneUnsaved")) { + Config.saveUnsavedNewProfile(mainFrame, printer); + } + + // Check if several imported profiles are unsaved + else if (importedProfileSaved.equals("multipleUnsaved")) { + int result = new DialogTwoButtons( + mainFrame, + null, + new ImageIcon(MainMenu.class.getResource("/achtung.png")), + "Warning! There are several unsaved imported profiles!
Do you want to go back to save them?", + "Yes", + "No" + ).showDialog(); + + if (result == 0) { + return; // Abort exit + } + } + + // Save user settings before exiting + Config.saveUserSettings(mainFrame); + System.exit(0); + } + + /** + * Checks whether imported profiles listed in the profile overview + * exist on disk as .sbp files. Profiles that do not have a corresponding + * file are considered unsaved. + * + *

The result indicates how many profiles are unsaved:

+ *
    + *
  • {@code "multipleUnsaved"} – more than one unsaved profile
  • + *
  • {@code "oneUnsaved"} – exactly one unsaved profile
  • + *
  • empty string – all profiles are saved
  • + *
+ * + * @param profiles a list of profile names displayed in the UI. + * @return a status string describing the number of unsaved profiles. + */ + private static String checkImportedProfiles(ArrayList profiles) { + + // Directory where profiles are stored + String profDir = MainMenu.ProfilesDir + System.getProperty("file.separator"); + + int unsavedCounter = 0; + + for (String profile : profiles) { + File profileFile = new File(profDir + profile + ".sbp"); + + if (!profileFile.exists()) { + unsavedCounter++; + } + } + + if (unsavedCounter > 1) { + return "multipleUnsaved"; + } else if (unsavedCounter == 1) { + return "oneUnsaved"; + } + + return ""; + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/LengthRestrictedDocumentFilter.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/LengthRestrictedDocumentFilter.java new file mode 100644 index 0000000..f894d2c --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/LengthRestrictedDocumentFilter.java @@ -0,0 +1,83 @@ +package rdiger36.StudioBridge.functions; + +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.DocumentFilter; + +/** + * A DocumentFilter that restricts the length of text in a document. + *

+ * This filter ensures that the total length of the document does not exceed + * a specified maximum length when text is inserted or replaced. + *

+ */ +public class LengthRestrictedDocumentFilter extends DocumentFilter { + private int maxLength; + + /** + * Constructs a LengthRestrictedDocumentFilter with the specified maximum length. + * + * @param maxLength The maximum allowed length of the document. + */ + public LengthRestrictedDocumentFilter(int maxLength) { + this.maxLength = maxLength; + } + + /** + * Inserts the specified string at the given offset if it does not + * exceed the maximum length of the document. + * + * @param fb The FilterBypass to use for the insert operation. + * @param offset The offset at which to insert the string. + * @param string The string to insert. + * @param attr The attributes to apply to the inserted string. + * @throws BadLocationException If the insert position is invalid. + */ + @Override + public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { + if (string == null) { + return; + } + + // Ensure that the total length does not exceed the maximum length + if ((fb.getDocument().getLength() + string.length()) <= maxLength) { + super.insertString(fb, offset, string, attr); + } + } + + /** + * Replaces text in the document at the specified offset if the result + * does not exceed the maximum length. + * + * @param fb The FilterBypass to use for the replace operation. + * @param offset The offset at which to start replacing text. + * @param length The length of the text to be replaced. + * @param string The string to insert in place of the replaced text. + * @param attrs The attributes to apply to the replaced string. + * @throws BadLocationException If the replace position is invalid. + */ + @Override + public void replace(FilterBypass fb, int offset, int length, String string, AttributeSet attrs) throws BadLocationException { + if (string == null) { + return; + } + + // Check if the new total length exceeds the maximum length + if ((fb.getDocument().getLength() + string.length() - length) <= maxLength) { + super.replace(fb, offset, length, string, attrs); + } + } + + /** + * Removes text from the document at the specified offset. + * + * @param fb The FilterBypass to use for the remove operation. + * @param offset The offset at which to start removing text. + * @param length The length of the text to remove. + * @throws BadLocationException If the remove position is invalid. + */ + @Override + public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { + super.remove(fb, offset, length); + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Models.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Models.java new file mode 100644 index 0000000..2af2551 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Models.java @@ -0,0 +1,61 @@ +package rdiger36.StudioBridge.functions; + +public class Models { + + /** + * Converts model names to a specific format for sending to the printer. + * + * @param model The model name as selected by the user. + * @return The formatted model name. + */ + public static String getModelFromName(String model) { + switch (model) { + case "A1": model = "N2S"; break; + case "A1 Mini": model = "N1"; break; + case "A2L": model = "N9"; break; + case "P1P": model = "C11"; break; + case "P1S": model = "C12"; break; + case "P2S": model = "N7"; break; + case "X1": model = "3DPrinter-X1"; break; + case "X1C": model = "3DPrinter-X1-Carbon"; break; + case "X1E": model = "C13"; break; + case "X2D": model = "N6"; break; + case "H2C": model = "O1C"; break; + case "H2C (new revision)": model = "O1C2"; break; + case "H2D": model = "O1D"; break; + case "H2D Pro": model = "O1E"; break; + case "H2S": model = "O1S"; break; + default: break; + } + return model; + } + + + /** + * Maps model codes to model names. + * + * @param model The model code as a string. + * @return The corresponding model name. + */ + public static String getNameFromModel(String model) { + switch (model) { + case "N2S": model = "A1"; break; + case "N1": model = "A1 Mini"; break; + case "N9": model = "A2L"; break; + case "C11": model = "P1P"; break; + case "C12": model = "P1S"; break; + case "N7": model = "P2S"; break; + case "3DPrinter-X1": model = "X1"; break; + case "3DPrinter-X1-Carbon": model = "X1C"; break; + case "C13": model = "X1E"; break; + case "N6": model = "X2D"; break; + case "O1C": model = "H2C"; break; + case "O1C2": model = "H2C (new revision)"; break; + case "O1D": model = "H2D"; break; + case "O1E": model = "H2D Pro"; break; + case "O1S": model = "H2S"; break; + default: break; + } + return model; + } +} diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/ProfilesPath.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/ProfilesPath.java new file mode 100644 index 0000000..d2936b0 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/ProfilesPath.java @@ -0,0 +1,122 @@ +package rdiger36.StudioBridge.functions; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; + +import jnafilechooser.api.JnaFileChooser; +import jnafilechooser.api.JnaFileChooser.Mode; +import net.miginfocom.swing.MigLayout; +import rdiger36.StudioBridge.gui.MainMenu; +import rdiger36.StudioBridge.gui.SaveDialog; + +/** + * A dialog for selecting and setting the path for saving profiles. + *

+ * This dialog allows the user to choose a directory for storing profiles + * and reset the path to a default value. + *

+ */ +public class ProfilesPath { + + private JDialog dial; + private JTextField textField; + private String response; + private JButton btnReset; + private JButton btnChooseDir; + + /** + * Constructs a ProfilesPath dialog. + * + * @param mainFrame The parent frame to center the dialog. + */ + public ProfilesPath(JFrame mainFrame) { + + dial = new JDialog(); + dial.setResizable(false); + dial.setTitle("StudioBridge"); + dial.setIconImage(Toolkit.getDefaultToolkit().getImage(SaveDialog.class.getResource("/icon.png"))); + dial.setModal(true); + dial.setAlwaysOnTop(true); + dial.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + response = ""; + dial.dispose(); + } + }); + dial.setSize(369, 103); + if (mainFrame != null) { + dial.setLocationRelativeTo(mainFrame); + } else { + dial.setLocationRelativeTo(null); + } + + JLabel lblPath = new JLabel("Path:"); + lblPath.setHorizontalAlignment(SwingConstants.CENTER); + + dial.getContentPane().setLayout(new MigLayout("", "[grow][grow][200px,grow][200px,grow][grow]", "[14px,grow][23px,grow]")); + dial.getContentPane().add(lblPath, "cell 0 0 2 1,alignx left,aligny center"); + + JButton btnSave = new JButton("Save"); + btnSave.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + response = textField.getText().toString(); + dial.dispose(); + } + }); + + textField = new JTextField(MainMenu.ProfilesDir); + dial.getContentPane().add(textField, "cell 2 0 2 1,grow"); + textField.setColumns(10); + + btnChooseDir = new JButton("..."); + dial.getContentPane().add(btnChooseDir, "cell 4 0,alignx right"); + dial.getContentPane().add(btnSave, "cell 2 1,alignx right,aligny center"); + + btnReset = new JButton("Reset to default"); + dial.getContentPane().add(btnReset, "cell 3 1"); + + btnReset.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + textField.setText(MainMenu.defaultSavePath + System.getProperty("file.separator") + "Profiles"); + } + }); + + btnChooseDir.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JnaFileChooser fc = new JnaFileChooser(); + fc.setMode(Mode.Directories); + fc.setTitle("Choose profile save directory"); + + boolean returnValue = fc.showOpenDialog(dial); + if (returnValue) { + textField.setText(fc.getSelectedFile().getAbsolutePath()); + } + } + }); + + btnSave.setMinimumSize(btnReset.getPreferredSize()); + + dial.pack(); + dial.setLocationRelativeTo(mainFrame); + } + + /** + * Displays the dialog and returns the selected path. + * + * @return The selected path as a string. + */ + public String changePath() { + dial.setVisible(true); // Shows the dialog (blocking) + return response; // Returns the state of the dialog + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Resize.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Resize.java new file mode 100644 index 0000000..64b1012 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Resize.java @@ -0,0 +1,31 @@ +package rdiger36.StudioBridge.functions; + +import java.awt.Image; + +import javax.swing.ImageIcon; + +/** + * A utility class for resizing image icons. + *

+ * This class provides methods to scale image icons to specified dimensions. + *

+ */ +public class Resize { + + /** + * Scales an ImageIcon to a new width and height. + * + * @param originalIcon The original ImageIcon to be scaled. + * @param width The new width of the scaled icon. + * @param height The new height of the scaled icon. + * @return The scaled ImageIcon. + */ + public static ImageIcon setNewImageIconSize(ImageIcon originalIcon, int width, int height) { + + Image originalImage = originalIcon.getImage(); // Transform the ImageIcon to an Image + Image resizedImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH); // Scale the image + ImageIcon resizedIcon = new ImageIcon(resizedImage); // Transform back to an ImageIcon + + return resizedIcon; + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/UDPPackage.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/UDPPackage.java new file mode 100644 index 0000000..0962cde --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/UDPPackage.java @@ -0,0 +1,189 @@ +package rdiger36.StudioBridge.functions; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.nio.charset.StandardCharsets; +import java.util.Date; + +import javax.swing.ImageIcon; +import javax.swing.JFrame; + +import rdiger36.StudioBridge.gui.DialogOneButton; +import rdiger36.StudioBridge.gui.MainMenu; +import rdiger36.StudioBridge.objects.Printer; + +/** + * The UDPPackage class provides functionality to send UDP packets + * to a local Bambu Studio instance for 3D printers. It includes methods + * to create and send a specific UDP message containing printer details. + * + *

This class facilitates communication between the application + * and Bambu Studio, enabling the transmission of essential information + * about the connected 3D printer.

+ * + *

Methods:

+ *
    + *
  • send(JFrame, Printer, int, boolean) - Sends a specific UDP data packet to the local Bambu Studio instance with the printer's details.
  • + *
  • getAvailableUDPPort() - Retrieves the first available UDP port from the specified list of ports.
  • + *
+ */ +public class UDPPackage { + + /** + * Sends a specific UDP data packet to the local Bambu Studio instance. + * + * @param mainFrame The main frame of the application, used to show dialogs. + * @param printer The Printer object with all necessary data. + * @param remoteUdpPort The correct port for BambuStudio. + * @param multiMode The option for single or multi mode. + */ + public static boolean send(JFrame mainFrame, Printer printer, int remoteUdpPort, boolean multiMode) { + + Date date = new Date(); + + try { + + // Create the message to be sent + String message = + "NOTIFY * HTTP/1.1\r\n" + + "Server: Buildroot/2018.02-rc3 UPnP/1.0 ssdpd/1.8\r\n" + + "Date: " + date.toString() + "\r\n" + + "Location: " + printer.getIpAdress() + "\r\n" + + "ST: urn:bambulab-com:device:3dprinter:1\r\n" + + "EXT:\r\n" + + "USN: " + printer.getSerialNumber() + "\r\n" + + "Cache-Control: max-age=1800\r\n" + + "DevModel.bambu.com: " + Models.getModelFromName(printer.getPrinterModel()) + "\r\n" + + "DevName.bambu.com: " + printer.getPrinterName() + "\r\n" + + "DevSignal.bambu.com: -44\r\n" + + "DevConnect.bambu.com: lan\r\n" + + "DevBind.bambu.com: free\r\n" + + "\r\n"; + + UDPPackage.startBroadcast(message); + + if (!multiMode && mainFrame != null) new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/success.png")), "Package sent successfully.
The Printer will appear in the next 60 seconds in Bambu Studio.
You can close this Programm when your printer(s) appear in Bambu Studio", "Ok").showDialog(); + + } catch (Exception e) { + // Show a warning that the package could not be sent to Bambu Studio + if (!multiMode && mainFrame != null) new DialogOneButton(mainFrame, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Failed to send the package!", "Ok").showDialog(); + return false; + } + + return true; + } + + /** + * Retrieves the first available UDP port from a list of specified ports (2021 or 1990). + * Uses `lsof` on macOS, and Java socket binding on other operating systems. + * + * @return the port number if available, or 0 if none are available. + */ + public static int getAvailableUDPPort() { + int[] portsToCheck = {2021, 1990}; + + String os = System.getProperty("os.name").toLowerCase(); + for (int port : portsToCheck) { + boolean isInUse; + if (os.contains("mac")) { + // On macOS, check port using lsof + isInUse = isPortInUseWithLsof(port); + } else { + // On other systems, use socket-based port check + isInUse = isUDPPortInUse(port); + } + if (isInUse) { + return port; // Return the first available port + } + } + return 0; // Return 0 if no port is available + } + + /** + * Checks if a specific UDP port is in use on macOS using the lsof command. + * + * @param port The UDP port number to check. + * @return true if the port is in use, false otherwise. + */ + private static boolean isPortInUseWithLsof(int port) { + try { + // Run lsof command to check if the port is in use + Process process = new ProcessBuilder("lsof", "-i", "udp:" + port).start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + return reader.readLine() != null; // If output is not null, port is in use + } catch (Exception e) { + return false; + } + } + + /** + * Checks if a specific UDP port is in use using Java socket binding. + * + * @param port The UDP port number to check. + * @return true if the port is already in use, false otherwise. + */ + private static boolean isUDPPortInUse(int port) { + DatagramSocket socket = null; + try { + // Attempt to create a socket on the specified port + socket = new DatagramSocket(port); + return false; // Port is available + } catch (SocketException e) { + return true; // Port is already in use + } finally { + // Close the socket if it was successfully opened + if (socket != null && !socket.isClosed()) { + socket.close(); + } + } + } + + /** + * Starts a background thread that sends the given message as a UDP broadcast + * or to a specific destination address. The message is sent to multiple ports + * in 10 intervals. + * + * @param message the text message to send via UDP + */ + public static void startBroadcast(String message) { + new Thread(() -> { + try (DatagramSocket socket = new DatagramSocket()) { + + // Default destination (configured in settings) + String destionation = MainMenu.destionation4UDP; + + // Enable true broadcast mode when directMode is active + if (MainMenu.directMode) { + socket.setBroadcast(true); + destionation = "255.255.255.255"; + } + + // Ports to which the packet will be sent + int[] targetPorts = {2021, 1990}; + + // Send message 10 times in 5-second intervals + for (int i = 0; i < 10; i++) { + byte[] data = message.getBytes(StandardCharsets.US_ASCII); + InetAddress bcast = InetAddress.getByName(destionation); + + // Send packet to each target port + for (int port : targetPorts) { + DatagramPacket p = new DatagramPacket(data, data.length, bcast, port); + socket.send(p); + } + + Thread.sleep(5_000); + } + + socket.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + }).start(); + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Update.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Update.java new file mode 100644 index 0000000..831964d --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/functions/Update.java @@ -0,0 +1,96 @@ +package rdiger36.StudioBridge.functions; + +import java.awt.Desktop; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import javax.swing.ImageIcon; +import javax.swing.JFrame; + +import org.json.JSONObject; + +import rdiger36.StudioBridge.gui.DialogTwoButtons; +import rdiger36.StudioBridge.gui.MainMenu; + +/** + * A utility class for checking and managing software updates for StudioBridge. + * This class retrieves the latest version of the application from GitHub + * and prompts the user to update if a new version is available. + */ +public class Update { + + private static final String RELEASES_URL = "https://github.com/Rdiger-36/StudioBridge/releases/latest"; + + /** + * Checks if a new version of StudioBridge is available online. + * + * @param mainFrame The parent JFrame used for displaying dialogs. + */ + public static void checkVersion(JFrame mainFrame) { + // Retrieve only the release version info + String onlineVersion = getOnlineVersion(); + + if (onlineVersion != null) { + + // Strip everything except digits — handles tag formats like + // "v.2.1.2", "Version 2.1.1", "2.1.0-BETA", etc. + String onlineVersionString = onlineVersion.replaceAll("[^0-9]", ""); + + // Convert version strings to integers for comparison + int online = Integer.parseInt(onlineVersionString); + int local = Integer.parseInt(MainMenu.version); + + if (local < online) { + if (mainFrame != null) { + // Prompt user with update dialog + int response = new DialogTwoButtons(mainFrame, null, + new ImageIcon(MainMenu.class.getResource("/achtung.png")), + "An update for StudioBridge is available!", + "Open releases page", + "Continue without update").showDialog(); + + if (response == 0) { + try { + Desktop.getDesktop().browse(new URI(RELEASES_URL)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } else { + System.out.println("Attention! A new update for StudioBridge is available:\r\n"); + System.out.println(RELEASES_URL); + System.out.println(); + } + } + } + } + + /** + * Retrieves the latest release version from the GitHub API. + * + * @return The version name of the latest release, or null if an error occurs. + */ + private static String getOnlineVersion() { + try { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://api.github.com/repos/Rdiger-36/StudioBridge/releases/latest")) + .header("Accept", "application/vnd.github.v3+json") + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + JSONObject jsonResponse = new JSONObject(response.body()); + return jsonResponse.getString("name"); + } + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogOneButton.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogOneButton.java new file mode 100644 index 0000000..ecb95cd --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogOneButton.java @@ -0,0 +1,105 @@ +package rdiger36.StudioBridge.gui; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.SwingConstants; + +import net.miginfocom.swing.MigLayout; +import rdiger36.StudioBridge.functions.Resize; + +/** + * The DialogOneButton class creates a modal dialog with a single button + * for user confirmation or information display. It can be used to present + * messages to the user and capture their response. + * + *

This class is designed to simplify the creation of dialogs in the + * application, providing a consistent look and feel.

+ */ +public class DialogOneButton { + + private boolean response; // Indicates whether the dialog was confirmed or canceled + private JDialog dial; // The dialog window + + /** + * Constructs a new DialogOneButton instance. + * + * @param mainFrame The main frame of the application, used to center the dialog. + * @param mainDial An optional main dialog to center the new dialog relative to. + * @param icon An optional icon to display in the dialog. + * @param message The message to display in the dialog. + * @param buttonText The text for the button that closes the dialog. + */ + public DialogOneButton(JFrame mainFrame, JDialog mainDial, ImageIcon icon, String message, String buttonText) { + dial = new JDialog(); + dial.setResizable(false); + dial.setTitle("StudioBridge"); + dial.setIconImage(Toolkit.getDefaultToolkit().getImage(DialogOneButton.class.getResource("/icon.png"))); + dial.setModal(true); + dial.setAlwaysOnTop(true); + + // Close action for the dialog + dial.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + response = false; + dial.dispose(); + } + }); + + dial.setSize(276, 167); + if (mainFrame != null) { + dial.setLocationRelativeTo(mainFrame); + } else if (mainDial != null) { + dial.setLocationRelativeTo(mainDial); + } else { + dial.setLocationRelativeTo(null); + } + + // Create and configure the message label + JLabel label = new JLabel(message); + label.setHorizontalAlignment(SwingConstants.CENTER); + if (icon != null) { + label.setIconTextGap(15); + if (!icon.toString().endsWith(".gif")) { + label.setIcon(Resize.setNewImageIconSize(icon, 24, 24)); + } else { + label.setIcon(icon); + } + } + + // Layout configuration using MigLayout + dial.getContentPane().setLayout(new MigLayout("", "[grow][87px][][87px][grow]", "[14px,grow][10.00][23px,grow]")); + dial.getContentPane().add(label, "cell 0 0 5 1,alignx center,aligny center"); + + // Button to close the dialog + JButton btn1 = new JButton(buttonText); + btn1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + response = true; // Set response to true when button is clicked + dial.dispose(); // Close the dialog + } + }); + dial.getContentPane().add(btn1, "cell 2 2,alignx center,aligny center"); + if (buttonText.contains("NoButton")) btn1.setVisible(false); // Optionally hide button + + dial.pack(); // Adjust dialog size to fit components + dial.setLocationRelativeTo(mainFrame); // Center dialog relative to the main frame + } + + /** + * Displays the dialog and waits for the user to respond. + * + * @return true if the dialog was confirmed, false otherwise. + */ + public boolean showDialog() { + dial.setVisible(true); // Show the dialog (blocking) + return response; // Return the state of the dialog + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogTwoButtons.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogTwoButtons.java new file mode 100644 index 0000000..619fb0b --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/DialogTwoButtons.java @@ -0,0 +1,121 @@ +package rdiger36.StudioBridge.gui; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.SwingConstants; + +import net.miginfocom.swing.MigLayout; +import rdiger36.StudioBridge.functions.Resize; + +/** + * The DialogTwoButtons class creates a modal dialog with two buttons for user confirmation. + * It allows users to make a choice between two options. + * + *

This class provides a simple way to present decisions to users, enhancing interaction + * with the application.

+ */ +public class DialogTwoButtons { + private int response; // Indicates which button was pressed + private JDialog dial; // The dialog window + + /** + * Constructs a new DialogTwoButtons instance. + * + * @param mainFrame The main frame of the application, used to center the dialog. + * @param mainDial An optional main dialog to center the new dialog relative to. + * @param icon An optional icon to display in the dialog. + * @param message The message to display in the dialog. + * @param button1Text The text for the first button. + * @param button2Text The text for the second button. + */ + public DialogTwoButtons(JFrame mainFrame, JDialog mainDial, ImageIcon icon, String message, String button1Text, String button2Text) { + dial = new JDialog(); + dial.setResizable(false); + dial.setTitle("StudioBridge"); + dial.setIconImage(Toolkit.getDefaultToolkit().getImage(DialogTwoButtons.class.getResource("/icon.png"))); + dial.setModal(true); + dial.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); + dial.setAlwaysOnTop(true); + + // Close action for the dialog + dial.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + response = 99; // Set response to a default value when closed + dial.dispose(); + } + }); + + dial.setSize(276, 167); + + // Create and configure the message label + JLabel label = new JLabel(message); + label.setHorizontalAlignment(SwingConstants.CENTER); + + if (icon != null) { + label.setIconTextGap(15); + label.setIcon(Resize.setNewImageIconSize(icon, 24, 24)); + } + + // Button 1 configuration + JButton btn1 = new JButton(button1Text); + btn1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + response = 0; // Set response to 0 for the first button + dial.dispose(); // Close the dialog + } + }); + + // Button 2 configuration + JButton btn2 = new JButton(button2Text); + btn2.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + response = 1; // Set response to 1 for the second button + dial.dispose(); // Close the dialog + } + }); + + // Layout configuration using MigLayout + dial.getContentPane().setLayout(new MigLayout("", "[grow][87px][87px][grow]", "[14px,grow][10.00][23px,grow]")); + dial.getContentPane().add(label, "cell 0 0 4 1,alignx center,aligny center"); + dial.getContentPane().add(btn1, "cell 1 2,alignx center,aligny center"); + dial.getContentPane().add(btn2, "cell 2 2,alignx center,aligny center"); + + // Ensure both buttons have the same minimum size + if (btn1.getText().length() > btn2.getText().length()) { + btn2.setMinimumSize(btn1.getPreferredSize()); + } else { + btn1.setMinimumSize(btn2.getPreferredSize()); + } + + dial.pack(); // Adjust dialog size to fit components + + // Center dialog relative to the main frame or another dialog + if (mainFrame != null) { + dial.setLocationRelativeTo(mainFrame); + } else if (mainDial != null) { + dial.setLocationRelativeTo(mainDial); + } else { + dial.setLocationRelativeTo(null); + } + } + + /** + * Displays the dialog and waits for the user to respond. + * + * @return An integer indicating which button was pressed: + * 0 for the first button, 1 for the second button, + * or 99 if the dialog was closed without selection. + */ + public int showDialog() { + dial.setVisible(true); // Show the dialog (blocking) + return response; // Return the state of the dialog + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MainMenu.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MainMenu.java new file mode 100644 index 0000000..3cb8043 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MainMenu.java @@ -0,0 +1,1269 @@ +package rdiger36.StudioBridge.gui; + +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Desktop; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.Insets; +import java.awt.Point; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.BorderFactory; +import javax.swing.DefaultComboBoxModel; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JSeparator; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import javax.swing.text.AbstractDocument; +import jnafilechooser.api.JnaFileChooser; +import jnafilechooser.api.JnaFileChooser.Mode; +import net.miginfocom.swing.MigLayout; +import rdiger36.StudioBridge.functions.*; +import rdiger36.StudioBridge.objects.*; + +/** + * The MainMenu class serves as the main graphical user interface (GUI) + * for the StudioBridge application. It allows users to configure printer settings, + * manage profiles, and send data packages to printers. + */ +public class MainMenu { + + // Default and current save paths for profiles + public static String defaultSavePath = System.getProperty("user.home") + System.getProperty("file.separator") + ".studio-bridge"; + public static String savePath = defaultSavePath; + public static String ProfilesDir = savePath + System.getProperty("file.separator") + "Profiles"; + + // Application Name + public static String title = "StudioBridge"; + + // Application version + public static String version = "213"; + + // Destination for UDPPackage + public static String destionation4UDP = "localhost"; + + // Direct mode setting: if true than send UDP package directly to Bambu Studio, else send it via broadcast + public static boolean directMode = false; + + // Set boolean for checking updates on startup + public static boolean checkForUpdate = true; + + // Set boolean for darkmode for GUI + public static boolean darkmode = false; + + // Control over the use of the last selected profile + public static boolean rememberLastUsedProfile = false; + + // For internal use to run as native jar + public static boolean runningAsJar = true; + + // Set specific profiles directory via cmdline + public static boolean useCustomProfilesDir = false; + + // Set specific profile via cmdline + public static boolean useSpecificProfiles = false; + + // Set visibility of jar version start + public static boolean jarInfo = true; + + // Contains the name of the last used profile + public static String lastUsedProfile; + + // Contains the names of profiles which are not allowed to set + public static List notAllowedProfileNames = new ArrayList(List.of("New profile", "Import profile", "---", "")); + + // Contains the profiles which were set by CLI option + public static List profilesListCLI = new ArrayList(); + + // Create LocalMachine Object from localhost + public static LocalMachine localMachine = new LocalMachine(); + + // Create static Printer Object, will be used as selected printer for GUI + public static Printer mainPrinter; + + // Create static HashMap containing printer objects with profilename as key, will be used for multi printer setup + public static HashMap printerMap; + + public static void main(String[] args) { + + // Get running OS + if (System.getProperty("jpackage.app-path") != null) { + runningAsJar = false; + jarInfo = false; + } + + boolean sendOnly = false; + boolean showHelp = false; + + migrateOldDataDirectory(); + Config.loadAppSettings(); + migrateLegacyProfilesPathSetting(); + ensurePersistentDirectories(); + + final Map valid = new LinkedHashMap<>(); + + valid.put("Starting options:", ""); + valid.put("--noupdate", "Skip search for latest updates on startup"); + valid.put("--sendonly", "Start with no GUI, only send data from all printers to Bambu Studio"); + valid.put("--direct", "Send UPD package directly to Bambu Studio, not over broadcast"); + valid.put("--help", "Show help for StudioBridge"); + + valid.put("", ""); + + valid.put("Profile options:", ""); + valid.put("--customProfilesDir='/path/to/profiles/'", + "Set custom profiles directory which will be loaded from this for StudioBridgeCLI"); + valid.put("--selectedPrinters='/path/to/profile.sbp/','/path/to/other/profile2.sbp/'", + "Set single profiles which will be used for StudioBridgeCLI (single and multi profiles comma-separated)"); + + + // Initialize arguments + List unknown = new ArrayList<>(); + + for (String arg : args) { + if ("--help".equals(arg)) { + showHelp = true; + break; + } + if ("--noupdate".equals(arg)) { + checkForUpdate = false; + continue; + } + + if ("--direct".equals(arg)) { + directMode = true; + continue; + } + + if ("--sendonly".equals(arg)) { + sendOnly = true; + continue; + } + + if (arg.startsWith("--customProfilesDir")) { + ProfilesDir = arg.split("=")[1]; + useCustomProfilesDir = true; + continue; + } + + if (arg.startsWith("--selectedPrinters")) { + String argProfiles = arg.split("=")[1]; + String[] profiles = argProfiles.split(","); + + for (String profile : profiles) { + profilesListCLI.add(profile); + } + + useSpecificProfiles = true; + continue; + } + + unknown.add(arg); + } + + if (showHelp) { + printHeader(); + printUsage(valid); + return; + } + + if (!unknown.isEmpty()) { + printHeader(); + System.out.println("Unknown argument: " + unknown); + System.out.println(); + printUsage(valid); + System.exit(1); + } + + if (sendOnly) { + startNoGUI(); + } else { + + if (localMachine.getOs().equals("macos")) { + System.setProperty( "apple.awt.application.name", title ); + System.setProperty( "apple.awt.application.appearance", "system" ); + System.setProperty( "apple.laf.useScreenMenuBar", "true" ); + } + UI.changeLAF(darkmode); // Change the look and feel based on the dark mode setting + startGUI(); + } + } + + // print help as console output + private static void printUsage(Map valid) { + + String prog = "./StudioBridge.jar"; + + if (!runningAsJar) { + if (localMachine.getOs().equals("windows")) { + prog = "./StudioBridgeCLI.exe"; + } else if (localMachine.getOs().equals("linux")) { + prog = "./StudioBridge.appimage"; + } else if (localMachine.getOs().equals("macos")) { + prog = "/Applications/StudioBridge.app/Contents/MacOS/StudioBridgeCLI"; + } + } + + System.out.println("Usage:"); + System.out.println(" " + prog + " [OPTIONS]"); + System.out.println(); + System.out.println("Options:"); + System.out.println(" You can combine every option with each other"); + System.out.println(); + + final int indent = 6; + final int maxInline = 22; + + for (Map.Entry e : valid.entrySet()) { + String key = e.getKey(); + String desc = e.getValue(); + + if (key.endsWith(":")) { + System.out.println(key); + continue; + } + + if (key.trim().isEmpty()) { + System.out.println(); + continue; + } + + if (key.length() > maxInline) { + System.out.println(" " + key); + if (!desc.isEmpty()) { + System.out.println(" ".repeat(indent) + desc); + } + } else { + System.out.printf(" %-"+maxInline+"s %s%n", key, desc); + } + } + + System.out.println(); + System.out.println("Example:"); + System.out.println(" " + prog + " --help"); + System.out.println(" " + prog + " --sendonly --noupdate --direct"); + + // different output for different OS + if (localMachine.getOs().equals("windows")) { + System.out.println(" " + prog + " --sendonly --customProfilesDir='C:\\Users\\rdiger-36\\Documents\\StudioBridgeProfiles'"); + System.out.println(" " + prog + " --sendonly --selectedPrinters='C:\\Users\\rdiger-36\\Documents\\My P1S.sbp','C:\\Users\\rdiger-36\\Desktop\\H2D-Pro Work.sbp'"); + } else if (localMachine.getOs().equals("linux")) { + System.out.println(" " + prog + " --sendonly --customProfilesDir='/home/rdiger-36/Documents/StudioBridgeProfiles'"); + System.out.println(" " + prog + " --sendonly --selectedPrinters='/home/rdiger-36/Documents/My P1S.sbp','/home/rdiger-36/Desktop/H2D-Pro Work.sbp'"); + } else if (localMachine.getOs().equals("macos")) { + System.out.println(" " + prog + " --sendonly --customProfilesDir='/Users/rdiger-36/Documents/StudioBridgeProfiles'"); + System.out.println(" " + prog + " --sendonly --selectedPrinters='/Users/rdiger-36/Documents/My P1S.sbp','/Users/rdiger-36/Desktop/Profiles/H2D-Pro Work.sbp.sbp'"); + } + } + + + private static void printHeader() { + String version = MainMenu.version.substring(0, 1) + "." + MainMenu.version.substring(1, 2) + "." + MainMenu.version.substring(2, 3); + System.out.println("*** " + title + " by Rdiger-36 v." + version + " ***\n"); + + if (runningAsJar) { + System.out.println("You are currently running this application in raw mode (via .jar)!"); + System.out.println("For the official version for your OS and CPU architecture, please visit the GitHub repository."); + System.out.println("https://github.com/Rdiger-36/StudioBridge/\n"); + } + + } + + + private static void migrateOldDataDirectory() { + String sep = System.getProperty("file.separator"); + File oldDir = new File(System.getProperty("user.home") + sep + "StudioBridge"); + File newDir = new File(defaultSavePath); + + if (!oldDir.exists() || !oldDir.isDirectory()) { + return; + } + + newDir.mkdirs(); + mergeDirectories(oldDir, newDir); + deleteDirectory(oldDir); + } + + /** + * Repairs a profiles path that was read from the settings file but still points into + * the old data directory that {@link #migrateOldDataDirectory()} has already moved. + * + *

The settings file always contains an absolute {@code customProfilesPath}, even for + * users who never picked one, so everybody who used StudioBridge before the data + * directory was renamed has the old location stored there. Because the settings are + * loaded after the directory migration, that stored value overrides the migrated path + * and the profiles moved to the new directory are never found again.

+ * + *

This runs on every start and does not require the old directory to still exist, + * because {@code getAllProfiles()} recreates the missing directory as an empty one.

+ */ + private static void migrateLegacyProfilesPathSetting() { + String legacyDir = System.getProperty("user.home") + System.getProperty("file.separator") + "StudioBridge"; + ProfilesDir = remapLegacyProfilesPath(ProfilesDir, legacyDir, defaultSavePath); + } + + /** + * Moves a path that lies inside the old data directory to the same relative location + * inside the current one. Paths outside the old directory are returned unchanged, so a + * directory the user deliberately selected somewhere else is kept as it is. + * + * @param profilesDir the profiles path as loaded from the settings file. + * @param legacyDir the data directory used before the rename. + * @param currentDir the data directory used today. + * @return the remapped path, or the unchanged path if no remapping is needed. + */ + static String remapLegacyProfilesPath(String profilesDir, String legacyDir, String currentDir) { + if (profilesDir == null || legacyDir == null || currentDir == null) { + return profilesDir; + } + + if (profilesDir.equals(legacyDir)) { + return currentDir; + } + + // Compare including the separator so that siblings like "StudioBridgeBackup" are not matched + if (profilesDir.startsWith(legacyDir + System.getProperty("file.separator"))) { + return currentDir + profilesDir.substring(legacyDir.length()); + } + + return profilesDir; + } + + private static void mergeDirectories(File src, File dest) { + File[] files = src.listFiles(); + if (files == null) return; + + for (File file : files) { + File target = new File(dest, file.getName()); + if (file.isDirectory()) { + target.mkdirs(); + mergeDirectories(file, target); + } else if (!target.exists()) { + file.renameTo(target); + } + } + } + + /** + * Creates the application's persistent data directory and the profiles + * sub-directory on startup (first run). This guarantees that the folder + * exists even before the user saves anything, so that on the next start + * the application can load the stored settings and printer profiles and + * remember them. + * + *

Runs in both GUI and {@code --sendonly} mode, before the profiles + * directory is read, so a fresh installation always has a usable data + * directory.

+ */ + private static void ensurePersistentDirectories() { + try { + File dataDir = new File(savePath); + if (!dataDir.exists() && !dataDir.mkdirs()) { + System.err.println("Warning! Could not create the persistent data directory: " + savePath); + } + + File profilesDir = new File(ProfilesDir); + if (!profilesDir.exists() && !profilesDir.mkdirs()) { + System.err.println("Warning! Could not create the profiles directory: " + ProfilesDir); + } + } catch (Exception e) { + System.err.println("Warning! Could not create the StudioBridge persistent data directory: " + savePath); + e.printStackTrace(); + } + } + + private static void deleteDirectory(File dir) { + File[] files = dir.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + deleteDirectory(file); + } else { + file.delete(); + } + } + } + dir.delete(); + } + + // CLI mode, no GUI + private static void startNoGUI() { + + printHeader(); + + String sendOverMethod = "broadcast"; + + if (directMode) sendOverMethod = "localhost"; + + if (checkForUpdate) Update.checkVersion(null); + + // prepare profiles or profile directory + String profilesDir = ProfilesDir; + ArrayList errors = new ArrayList<>(); + + List profilesToUse = new ArrayList<>(); + + if (useSpecificProfiles) { + for (String path : profilesListCLI) { + File f = new File(path); + + if (!f.exists()) { + System.err.println("Profile does not exist: " + path); + continue; + } + + if (!f.getName().toLowerCase().endsWith(".sbp")) { + System.err.println("Invalid profile format (must end with .sbp): " + path); + continue; + } + + profilesToUse.add(f); + } + + } else { + File dir = new File(profilesDir); + + File[] files = dir.listFiles((d, name) -> + name.toLowerCase().endsWith(".sbp")); + + if (files != null) { + profilesToUse.addAll(Arrays.asList(files)); + } + } + + if (!profilesToUse.isEmpty()) { + + // Determine which UDP port (2021 or 1990) is in use, or set to 0 if none is available + int remoteUdpPort = UDPPackage.getAvailableUDPPort(); + + // Check if a valid port was assigned + if (remoteUdpPort > 0) { + + System.out.println("Found " + profilesToUse.size() + " profile(s)!"); + System.out.println("Try to send all of them to Bambu Studio\n"); + + for (File file : profilesToUse) { + if (file.isFile()) { // Process only files, not subdirectories + System.out.println("Loading profile " + file.toString()); + Properties properties = new Properties(); + try (FileReader reader = new FileReader(file)) { + properties.load(reader); + } catch (IOException e) { + System.err.println("Error loading file: " + file.getName()); + e.printStackTrace(); + continue; // Process next file on error + } + + Printer printer = new Printer(file.getName() ,properties.getProperty("PrinterName"), properties.getProperty("IP-Address"), properties.getProperty("PrinterSN"), properties.getProperty("PrinterType")); + + // Send the UDP package + boolean sendSuccess = UDPPackage.send(null, printer, remoteUdpPort, false); + if (!sendSuccess) { + String errorMsg = "Error! Could not send package via " + sendOverMethod + " to Bambu Studio: " + printer.getPrinterName() + + " - " + printer.getIpAdress() + " - " + printer.getPrinterModel() + "\n"; + errors.add(errorMsg); + } else { + String successMsg = "Successfully sended package via " + sendOverMethod + " to Bambu Studio: " + printer.getPrinterName() + + " - " + printer.getIpAdress() + " - " + printer.getPrinterModel() + "\n"; + System.out.println((successMsg)); + } + } + + try { + Thread.sleep(1000); // Simulated delay + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + + // Log errors if any + if (!errors.isEmpty()) { + StringBuilder errorLog = new StringBuilder("Attention! The following printers could not send to Bambu Studio:\n"); + for (String error : errors) { + errorLog.append(error).append("\n"); + } + System.err.println(errorLog.toString()); + } + + // Overall message if everything went well + if (errors.isEmpty()) { + System.out.println("All Packages successfully sent. The printers(s) will appear in the nect 60 seconds in Bambu Studio."); + } + System.out.println("The programm stays online for the next 60 seconds and will exit automatically."); + + } else { + System.err.println("Warning! Bambu Studio is not running!"); + } + } else { + System.err.println("Warning! There are no useable profiles in your profiles directory:"); + System.err.println(profilesDir); + } + } + + /** + * @wbp.parser.entryPoint + */ + public static void startGUI() { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + new MainMenu(darkmode, null); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Constructs the main menu and initializes the GUI components. + * + * @param darkmode A boolean indicating whether dark mode should be enabled. + * @param frame The parent JFrame to center the main menu. + */ + public MainMenu(boolean darkmode, JFrame frame) { +// UI.changeLAF(darkmode); // Change the look and feel based on the dark mode setting + + printerMap = new HashMap(); + + // Create the main application frame + JFrame frmStudioBridge = new JFrame(); + frmStudioBridge.setResizable(false); + frmStudioBridge.getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + URL iconUrl = MainMenu.class.getClassLoader().getResource("icon.png"); + frmStudioBridge.setIconImage(Toolkit.getDefaultToolkit().getImage(iconUrl)); + frmStudioBridge.setTitle(title); + frmStudioBridge.setSize(299, 235); + frmStudioBridge.setLocationRelativeTo(frame); + frmStudioBridge.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + frmStudioBridge.getContentPane().setLayout(new MigLayout("", "[76.00px][]", "[35px:n,grow][10px:10px:10px][][][][][][10px:n][35px:n,grow]")); + + // Add informational label + JLabel lblInfo = new JLabel("This program sends a specific data package to Bambu
Studio. This allows the printer to be used in different networks"); + frmStudioBridge.getContentPane().add(lblInfo, "cell 0 0 2 1,growx,aligny center"); + + // Separator + JSeparator separator = new JSeparator(); + frmStudioBridge.getContentPane().add(separator, "cell 0 1 2 1,growx,aligny center"); + + // Profile selection components + JLabel lblProfile = new JLabel("Profile"); + frmStudioBridge.getContentPane().add(lblProfile, "flowy,cell 0 2,grow"); + + JComboBox cbxProfile = new JComboBox<>(); + cbxProfile.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + cbxProfile.setModel(new DefaultComboBoxModel(new String[] {"New profile", "Import profile", "---"})); + frmStudioBridge.getContentPane().add(cbxProfile, "flowx,cell 1 2,growx"); + + // Printer information labels + JLabel lblIP = new JLabel("IP-Address"); + frmStudioBridge.getContentPane().add(lblIP, "cell 0 3,growx,aligny center"); + + JLabel lblSerial = new JLabel("Serial number"); + frmStudioBridge.getContentPane().add(lblSerial, "flowx,cell 0 4,growx,aligny center"); + + JLabel lblDevModel = new JLabel("Model"); + frmStudioBridge.getContentPane().add(lblDevModel, "flowx,cell 0 5,growx,aligny center"); + + String[] items = { + "A-Series", "A1", "A1 Mini", "A2L", + "H-Series", "H2C", "H2C (new revision)", "H2D", "H2D Pro", "H2S", + "P-Series", "P1P", "P1S", "P2S", + "X-Series", "X1", "X1C", "X1E", "X2D" + }; + + // Model selection combo box + JComboBox cbxModel = new JComboBox<>(items); + cbxModel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + cbxModel.setMaximumRowCount(20); + + // Rendering Categories bold + cbxModel.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent( + JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + + JLabel lbl = (JLabel) super.getListCellRendererComponent( + list, value, index, isSelected, cellHasFocus + ); + + if (index == -1 && cbxModel.getSelectedIndex() == -1) { + lbl.setText("Please select a printer model"); + return lbl; + } + + String text = value.toString(); + boolean isCategory = text.endsWith("-Series"); + + if (index >= 0) { + if (isCategory) { + lbl.setFont(lbl.getFont().deriveFont(Font.BOLD)); + lbl.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + } else { + lbl.setFont(lbl.getFont().deriveFont(Font.PLAIN)); + lbl.setBorder(BorderFactory.createEmptyBorder(4, 20, 4, 4)); + } + } else { + lbl.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); + lbl.setFont(lbl.getFont().deriveFont(Font.PLAIN)); + } + + return lbl; + } + }); + frmStudioBridge.getContentPane().add(cbxModel, "cell 1 5,growx"); + cbxModel.setSelectedIndex(-1); + + + // Setting up preparation for combobox model for mouse and arrow keys + AtomicInteger lastDirection = new AtomicInteger(0); + + cbxModel.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_UP) { + lastDirection.set(-1); + } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { + lastDirection.set(1); + } + } + }); + + cbxModel.addPopupMenuListener(new PopupMenuListener() { + @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} + @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + lastDirection.set(0); + } + @Override public void popupMenuCanceled(PopupMenuEvent e) {} + }); + + cbxModel.addActionListener(arg -> { + + int idx = cbxModel.getSelectedIndex(); + if (idx < 0) return; + + String selected = cbxModel.getItemAt(idx); + + if (selected.endsWith("-Series")) { + + if (idx == 0) { + cbxModel.setSelectedIndex(idx + 1); + return; + } + + if (lastDirection.get() == 0) { + cbxModel.setSelectedIndex(idx + 1); + return; + } + + if (lastDirection.get() == 1) { + cbxModel.setSelectedIndex(idx + 1); + return; + } + + if (lastDirection.get() == -1) { + cbxModel.setSelectedIndex(idx - 1); + } + } + }); + + + // Printer name input field + JLabel lblDevName = new JLabel("Name"); + frmStudioBridge.getContentPane().add(lblDevName, "cell 0 6,growx,aligny center"); + + JTextField txtName = new JTextField(); + txtName.setText(""); + txtName.setColumns(10); + ((AbstractDocument) txtName.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(25)); + frmStudioBridge.getContentPane().add(txtName, "cell 1 6,growx"); + + // Separator + JSeparator separator_1 = new JSeparator(); + frmStudioBridge.getContentPane().add(separator_1, "cell 0 7 2 1,growx,aligny center"); + + // Button to send package + JButton btnSendPackage = new JButton("Send package"); + btnSendPackage.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + frmStudioBridge.getContentPane().add(btnSendPackage, "cell 0 8"); + + JButton btnCheckPrinter = new JButton("Check Printer"); + btnCheckPrinter.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + frmStudioBridge.getContentPane().add(btnCheckPrinter, "flowx,cell 1 8"); + + // Input fields for IP and Serial number + JTextField txtIP = new JTextField(); + frmStudioBridge.getContentPane().add(txtIP, "flowx,cell 1 3,growx"); + txtIP.setColumns(10); + ((AbstractDocument) txtIP.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15)); + + JTextField txtSerial = new JTextField(); + txtSerial.setText(""); + txtSerial.setColumns(10); + ((AbstractDocument) txtSerial.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(25)); + frmStudioBridge.getContentPane().add(txtSerial, "cell 1 4,growx"); + + // Menu bar and settings options + JMenuBar menuBar = new JMenuBar(); + frmStudioBridge.setJMenuBar(menuBar); + + JMenu mnSettings = new JMenu("Settings"); + menuBar.add(mnSettings); + + JCheckBoxMenuItem cbxmntmDarkmode = new JCheckBoxMenuItem("Darkmode"); + mnSettings.add(cbxmntmDarkmode); + cbxmntmDarkmode.setSelected(darkmode); + + // Action listener for dark mode toggle + cbxmntmDarkmode.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + + boolean dark = cbxmntmDarkmode.isSelected(); + + Point loc = frmStudioBridge.getLocationOnScreen(); + int state = frmStudioBridge.getExtendedState(); + + UI.changeLAF(dark); + SwingUtilities.updateComponentTreeUI(frmStudioBridge); + frmStudioBridge.pack(); + frmStudioBridge.setLocation(loc); + frmStudioBridge.setExtendedState(state); + frmStudioBridge.revalidate(); + frmStudioBridge.repaint(); + } + }); + + JCheckBoxMenuItem cbxmntmRememberLastProfile = new JCheckBoxMenuItem("Remember last used profile"); + cbxmntmRememberLastProfile.setSelected(rememberLastUsedProfile); + mnSettings.add(cbxmntmRememberLastProfile); + + cbxmntmRememberLastProfile.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + rememberLastUsedProfile = cbxmntmRememberLastProfile.isSelected(); + } + }); + + JCheckBoxMenuItem cbxmntmSetSendingMode = new JCheckBoxMenuItem("Send packages directly"); + cbxmntmSetSendingMode.setSelected(directMode); + mnSettings.add(cbxmntmSetSendingMode); + + cbxmntmSetSendingMode.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + + if (cbxmntmSetSendingMode.isSelected()) { + new DialogOneButton(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "The mode for sending UDP packets has been changed to localhost!
Data will now be sent directly to Bambu Studio on your local machine.", "Ok").showDialog(); + } else { + new DialogOneButton(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "The mode for sending UDP packets has been changed to broadcast!
Data will now be sent to the broadcast address of your current network.", "Ok").showDialog(); + } + + directMode = cbxmntmSetSendingMode.isSelected(); + } + }); + + mnSettings.add(new JSeparator()); + + JMenuItem mntmChangeProfilesPath = new JMenuItem("Set custom profiles path"); + mnSettings.add(mntmChangeProfilesPath); + + // Action listener for changing the profiles path + mntmChangeProfilesPath.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String newProfilesDir = new ProfilesPath(frmStudioBridge).changePath(); + + if (newProfilesDir.length() > 0 && new File(newProfilesDir).exists()) { + ProfilesDir = newProfilesDir; + cbxProfile.removeAllItems(); + cbxProfile.addItem("New profile"); + cbxProfile.addItem("Import profile"); + cbxProfile.addItem("---"); + getAllProfiles(frmStudioBridge, cbxProfile); + if (cbxProfile.getItemCount() <= 3) { + cbxProfile.setSelectedIndex(0); + mainPrinter = new Printer("New profile", "", "", "", "No model"); + } + frmStudioBridge.pack(); + } + } + }); + + JMenuItem mntmMultiPrinterSetup = new JMenuItem("Multiple Printer Setup"); + mnSettings.add(mntmMultiPrinterSetup); + + mntmMultiPrinterSetup.addActionListener(arg -> new MultiPrinterSetup(frmStudioBridge)); + + // Action listener for sending the data package + btnSendPackage.addActionListener(arg -> { + + // Set new printer object from GUI data + Printer tempPrinter = new Printer(cbxProfile.getSelectedItem().toString(), txtName.getText(), txtIP.getText(), txtSerial.getText(), cbxModel.getSelectedItem().toString()); + + if (tempPrinter.getIpAdress().equals("") || tempPrinter.getSerialNumber().equals("") || tempPrinter.getPrinterName().equals("")) { + new DialogOneButton(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Attention! Please check your inputs!", "Back").showDialog(); + return; + } + + // Check if the input data is changed or new + if (tempPrinter.getProfileName().equals("New profile")) { + tempPrinter.setProfileName(Config.saveUnsavedNewProfile(frame, tempPrinter)); + if (!tempPrinter.getProfileName().equals("")) { + cbxProfile.addItem(tempPrinter.getProfileName()); + Config.saveProfile(frame, tempPrinter); + cbxProfile.setSelectedItem(tempPrinter.getProfileName()); + frmStudioBridge.pack(); + mainPrinter = tempPrinter; + } + } else if (!tempPrinter.getIpAdress().equals(mainPrinter.getIpAdress()) || !tempPrinter.getSerialNumber().equals(mainPrinter.getSerialNumber()) || !tempPrinter.getPrinterName().equals(mainPrinter.getPrinterName()) || !tempPrinter.getPrinterModel().equals(mainPrinter.getPrinterModel())) { + if (Config.saveUnsavedProfile(frame, tempPrinter)) { + mainPrinter = tempPrinter; + } + } + + // Determine which UDP port (2021 or 1990) is in use, or set to 0 if none is available + int remoteUdpPort = UDPPackage.getAvailableUDPPort(); + + // Check if a valid port was assigned to remoteUdpPort + if (remoteUdpPort > 0) { + UDPPackage.send(frmStudioBridge, mainPrinter, remoteUdpPort, false); + } else { + // Show a warning if Bambu Studio is not running + new DialogOneButton(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Bambu Studio is not running!", "Ok").showDialog(); + } + }); + + // Action listener for opening new GUI to check the printer stats + btnCheckPrinter.addActionListener(arg -> { + + if (txtIP.getText().equals("")) { + new DialogOneButton(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "You must enter a valid IP-Address!", "Ok").showDialog(); + } else { + new Thread(() -> new PrinterCheck(frmStudioBridge, txtIP.getText())).start(); + } + + }); + + // Action listener for profile selection + cbxProfile.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + if (cbxProfile.getSelectedItem() != null) { + + if (cbxProfile.getSelectedItem().toString().equals("Import profile")) { + + JnaFileChooser fc = new JnaFileChooser(); + fc.setMode(Mode.Files); + fc.setTitle("Choose profile save directory"); + + boolean returnValue = fc.showOpenDialog(frame); + if (returnValue) { + String profilePath = fc.getSelectedFile().getAbsolutePath(); + String profileName = fc.getSelectedFile().getName().replace(".sbp", ""); + + profileName = new SaveDialog(frmStudioBridge, "New imported profile", "Set profile name").saveProfile(); + + if (profileName != null) { + if (profileName.equals("")) profileName = "New imported profile"; + + setProfile(profilePath); + cbxProfile.addItem(profileName); + cbxProfile.setSelectedItem(profileName); + mainPrinter.setProfileName(profileName); + Config.saveProfile(frmStudioBridge, mainPrinter); + + } + + } else { + cbxProfile.setSelectedItem("New profile"); + } + + } else if (cbxProfile.getSelectedItem().toString().equals("---")) { + + if (MainMenu.lastUsedProfile != null) { + + if (!notAllowedProfileNames.contains(MainMenu.lastUsedProfile)) { + cbxProfile.setSelectedItem(MainMenu.lastUsedProfile); + } else { + cbxProfile.setSelectedItem("New profile"); + cbxModel.setSelectedIndex(-1); + } + + } else { + cbxProfile.setSelectedItem("New profile"); + cbxModel.setSelectedIndex(-1); + } + + + } else if (cbxProfile.getSelectedItem().toString().equals("New profile")) { + String profilePath = null; + setProfile(profilePath); + } else { + // Construct the path to the profile configuration file. + String profilePath = MainMenu.ProfilesDir + System.getProperty("file.separator") + cbxProfile.getSelectedItem().toString() + ".sbp"; + setProfile(profilePath); + } + } + + frmStudioBridge.pack(); + } + + private void setProfile(String profile) { + + if (profile != null) { + mainPrinter = Config.loadProfile(frmStudioBridge, profile); + MainMenu.lastUsedProfile = mainPrinter.getProfileName(); + txtName.setText(mainPrinter.getPrinterName()); + txtIP.setText(mainPrinter.getIpAdress()); + txtSerial.setText(mainPrinter.getSerialNumber()); + cbxModel.setSelectedItem(mainPrinter.getPrinterModel()); + } else { + mainPrinter = null; + MainMenu.lastUsedProfile = "New profile"; + txtName.setText(""); + txtIP.setText(""); + txtSerial.setText(""); + cbxModel.setSelectedIndex(-1); + } + } + }); + + // Window listener for handling close event + frmStudioBridge.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + + String profile = (cbxProfile.getSelectedItem() != null) + ? cbxProfile.getSelectedItem().toString() + : ""; + + String name = txtName.getText().trim(); + String ip = txtIP.getText().trim(); + String serial = txtSerial.getText().trim(); + + String model = (cbxModel.getSelectedItem() != null) + ? cbxModel.getSelectedItem().toString() + : ""; + + boolean isValid = + !profile.isEmpty() && + !name.isEmpty() && + !ip.isEmpty() && + !serial.isEmpty() && + !model.isEmpty(); + + if (mainPrinter == null) { + if (isValid) { + if (mainPrinter == null) mainPrinter = new Printer(cbxProfile.getSelectedItem().toString() + ,txtName.getText() + ,txtIP.getText() + ,txtSerial.getText() + ,cbxModel.getSelectedItem().toString()); + } else { + if (mainPrinter == null) mainPrinter = new Printer("New profile", "", "", "", "no model"); + } + } + + // List to store all profiles except for the special entries + ArrayList profileList = new ArrayList<>(); + + // Iterate through all items in the JComboBox + for (int i = 0; i < cbxProfile.getItemCount(); i++) { + String item = cbxProfile.getItemAt(i); + + // Only add profiles that are not "New profile", "Import profile", or "---" + if (!notAllowedProfileNames.contains(item)) { + profileList.add(item); + } + } + + Exit.closeApp(frmStudioBridge, profileList, mainPrinter); + } + }); + + getAllProfiles(frmStudioBridge, cbxProfile); // Load all profiles into the combo box + + JButton btnEditProfile = new JButton(""); + btnEditProfile.setRequestFocusEnabled(false); + btnEditProfile.setMargin(new Insets(2, 2, 2, 2)); + btnEditProfile.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + btnEditProfile.setContentAreaFilled(false); + btnEditProfile.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/edit.png")), 16, 16)); + frmStudioBridge.getContentPane().add(btnEditProfile, "cell 1 2,alignx right"); + + JButton btnSaveProfile = new JButton(""); + btnSaveProfile.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + btnSaveProfile.setRequestFocusEnabled(false); + btnSaveProfile.setMargin(new Insets(2, 2, 2, 2)); + btnSaveProfile.setContentAreaFilled(false); + btnSaveProfile.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/save.png")), 16, 16)); + frmStudioBridge.getContentPane().add(btnSaveProfile, "cell 1 2,alignx right"); + + // Buttons for profile actions + JButton btnDeleteProfile = new JButton(""); + btnDeleteProfile.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + btnDeleteProfile.setMargin(new Insets(2, 2, 2, 2)); + btnDeleteProfile.setContentAreaFilled(false); + btnDeleteProfile.setRequestFocusEnabled(false); + btnDeleteProfile.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/delete.png")), 16, 16)); + frmStudioBridge.getContentPane().add(btnDeleteProfile, "cell 1 2,alignx right"); + + // Copyright button + JButton btnCopy = new JButton("© Niklas (Rdiger-36)"); + btnCopy.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + btnCopy.setMargin(new Insets(0, 0, 0, 0)); + btnCopy.setBorderPainted(false); + btnCopy.setContentAreaFilled(false); + btnCopy.setHorizontalAlignment(SwingConstants.RIGHT); + btnCopy.setVerticalAlignment(SwingConstants.BOTTOM); + btnCopy.setFont(new Font("Segoe UI", Font.PLAIN, 10)); + + // Action listener for copyright button + btnCopy.addActionListener(arg -> new ToolInfo(frmStudioBridge)); + frmStudioBridge.getContentPane().add(btnCopy, "cell 1 8,alignx right"); + + // Action listener for deleting profiles + btnDeleteProfile.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + String profile = cbxProfile.getSelectedItem().toString(); + + if (!notAllowedProfileNames.contains(profile)) { + + int response = new DialogTwoButtons(frmStudioBridge, null,new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Attention! Do you want to delete the profile: \"" + cbxProfile.getSelectedItem() + "\"?", "Yes", "No").showDialog(); + + if (response == 0) { + new File(ProfilesDir + System.getProperty("file.separator") + cbxProfile.getSelectedItem() + ".sbp").delete(); + cbxProfile.removeItem(cbxProfile.getSelectedItem()); + cbxProfile.setSelectedIndex(0); + mainPrinter = new Printer("New profile", "", "", "", "no model"); + printerMap.remove(profile); + cbxModel.setSelectedIndex(-1); + frmStudioBridge.pack(); + } + } + } + }); + + // Action listener for saving profiles + btnSaveProfile.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + try { + + Printer tempPrinter = new Printer(cbxProfile.getSelectedItem().toString(), txtName.getText(), txtIP.getText(), txtSerial.getText(), cbxModel.getSelectedItem().toString()); + + if (tempPrinter.getProfileName().equals("New profile")) { + + String profileName = new SaveDialog(frmStudioBridge, tempPrinter.getPrinterName(), "Save").saveProfile(); + + if (profileName == null) { + return; + } else { + tempPrinter.setProfileName(profileName); + } + } + + if (!notAllowedProfileNames.contains(tempPrinter.getProfileName())) { + if (!profileExists(tempPrinter.getProfileName())) { + cbxProfile.addItem(tempPrinter.getProfileName()); + Config.saveProfile(frmStudioBridge, tempPrinter); + cbxProfile.setSelectedItem(tempPrinter.getProfileName()); + frmStudioBridge.pack(); + } else { + int result = new DialogTwoButtons(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! The profile: " + tempPrinter.getProfileName() + " already exists, do you want to overwrite it?", "Yes", "No").showDialog(); + if (result == 0) { + Config.saveProfile(frmStudioBridge, tempPrinter); + } + } + + mainPrinter = tempPrinter; + + if (printerMap.containsKey(mainPrinter.getProfileName())) { + printerMap.replace(mainPrinter.getProfileName(), mainPrinter); + } else { + printerMap.put(mainPrinter.getProfileName(), tempPrinter); + } + + } + } catch (Exception ex) {} + + } + }); + + btnEditProfile.addActionListener(arg -> { + try { + + String oldProfileName = cbxProfile.getSelectedItem().toString(); + int oldProfilePosition = cbxProfile.getSelectedIndex(); + + if (!notAllowedProfileNames.contains(oldProfileName)) { + + Printer tempPrinter = new Printer(cbxProfile.getSelectedItem().toString(), txtName.getText(), txtIP.getText(), txtSerial.getText(), cbxModel.getSelectedItem().toString()); + + String profileName = new SaveDialog(frmStudioBridge, tempPrinter.getProfileName(), "Save").saveProfile(); + + if (profileName == null) { + return; + } else { + tempPrinter.setProfileName(profileName); + } + + if (!notAllowedProfileNames.contains(tempPrinter.getProfileName())) { + + cbxProfile.addItem(tempPrinter.getProfileName()); + Config.saveProfile(frmStudioBridge, tempPrinter); + cbxProfile.setSelectedItem(tempPrinter.getProfileName()); + + cbxProfile.removeItemAt(oldProfilePosition); + + printerMap.remove(oldProfileName); + printerMap.put(tempPrinter.getProfileName(), tempPrinter); + + new File(ProfilesDir + System.getProperty("file.separator") + oldProfileName + ".sbp").delete(); + + mainPrinter = tempPrinter; + + frmStudioBridge.pack(); + } + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + + + if(checkForUpdate) new Thread(() -> Update.checkVersion(frmStudioBridge)).start(); // Check for updates, if it is not disabled by --noupdate argument at startup + + if (jarInfo) { + + int response = new DialogTwoButtons(frmStudioBridge, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "You are currently running this application in raw mode (via .jar).
" + + "For the official version for your OS and CPU architecture, please visit the GitHub repository.\r\n" + + "", "Open GitHub", "Close and never show again").showDialog(); + + if (response == 0) { + try { + Desktop.getDesktop().browse(new URI("https://github.com/Rdiger-36/StudioBridge/")); + } catch (Exception e) { + e.printStackTrace(); + } + } else if (response == 1) { + jarInfo = false; + } + } + + Desktop desktop = Desktop.getDesktop(); + if (desktop.isSupported(Desktop.Action.APP_ABOUT)) { + desktop.setAboutHandler( e -> { + new ToolInfo(frmStudioBridge); + } ); + } + + frmStudioBridge.pack(); + frmStudioBridge.setVisible(true); + } + + /** + * Retrieves all profiles from the Profiles directory and adds them to the specified combo box. + * + * @param comboBox The combo box to which profiles will be added. + */ + private void getAllProfiles(JFrame mainFrame, JComboBox comboBox) { + File directory = new File(ProfilesDir); + + if (!directory.exists()) { + directory.mkdirs(); // Create the directory if it does not exist + } + + if (directory.exists() && directory.isDirectory()) { + File dir = new File(ProfilesDir); + File[] filesList = dir.listFiles((d, name) -> name.toLowerCase().endsWith(".sbp")); + if (filesList != null) { + + printerMap.clear(); + + for (File file : filesList) { + if (file.isFile() && !file.getName().startsWith(".")) { + + Printer printer = Config.loadProfile(mainFrame, file.toString()); + + printerMap.put(printer.getProfileName(), printer); + + comboBox.addItem(printer.getProfileName()); + } + } + } + + if (rememberLastUsedProfile) { + if (((DefaultComboBoxModel)comboBox.getModel()).getIndexOf(lastUsedProfile) != -1) { + comboBox.setSelectedItem(lastUsedProfile); + } + } + // If still on "New profile" and real profiles exist, default to the first one + if ("New profile".equals(comboBox.getSelectedItem()) && comboBox.getItemCount() > 3) { + comboBox.setSelectedIndex(3); + } + + } else { + new DialogOneButton(null, null, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Error! Directory " + ProfilesDir + " could not be created!", "Close").showDialog(); + System.exit(0); + } + } + + /** + * Checks if a profile already exists in the combo box. + * + * @param comboBox The combo box containing the profiles. + * @param entry The profile name to check. + * @return True if the profile exists, false otherwise. + */ + private static boolean profileExists(String entry) { + if (MainMenu.printerMap.containsKey(entry)) { + return true; // Entry exists + } else { + return false; // Entry does not exist + } + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MultiPrinterSetup.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MultiPrinterSetup.java new file mode 100644 index 0000000..dfeddf2 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/MultiPrinterSetup.java @@ -0,0 +1,242 @@ +package rdiger36.StudioBridge.gui; + +import java.awt.Dialog.ModalExclusionType; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.table.DefaultTableModel; +import net.miginfocom.swing.MigLayout; +import rdiger36.StudioBridge.functions.*; +import rdiger36.StudioBridge.objects.Printer; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JProgressBar; + +/** + * Class responsible for managing the setup of multiple printers within a GUI. + * Provides functionality to import printers, select/deselect them, and send configuration packages. + */ +public class MultiPrinterSetup { + private JTable table; + + private volatile boolean stopThread = false; + private volatile boolean printerSelected = false; + + private static ArrayList errors = new ArrayList<>(); + + /** + * Constructor that initializes the MultiPrinterSetup dialog. + * + * @param frmStudioBridge The parent JFrame for positioning the dialog. + */ + public MultiPrinterSetup(JFrame frmStudioBridge) { + JDialog dialInfo = new JDialog(); + dialInfo.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE); + dialInfo.setModal(true); + dialInfo.setAlwaysOnTop(true); + dialInfo.setTitle("Multiple Printer Setup"); + dialInfo.setIconImage(Toolkit.getDefaultToolkit().getImage(MultiPrinterSetup.class.getResource("/icon.png"))); + dialInfo.setBounds(100, 100, 602, 482); + dialInfo.toFront(); + dialInfo.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + stopThread = true; + dialInfo.dispose(); + } + }); + + JScrollPane scrollPane = new JScrollPane(); + + table = new JTable(); + table.setFocusTraversalKeysEnabled(false); + table.setFocusable(false); + table.setModel(new DefaultTableModel( + new Object[][] {}, + new String[] { "Profil", "Name", "IP-Address", "Serial", "Model", "Send Package" } + ) { + Class[] columnTypes = new Class[] { + Object.class, Object.class, Object.class, Object.class, Object.class, Boolean.class + }; + + public Class getColumnClass(int columnIndex) { + return columnTypes[columnIndex]; + } + }); + + // Set preferred column widths + table.getColumnModel().getColumn(0).setPreferredWidth(110); + table.getColumnModel().getColumn(1).setPreferredWidth(120); + table.getColumnModel().getColumn(2).setPreferredWidth(164); + table.getColumnModel().getColumn(3).setPreferredWidth(159); + table.getColumnModel().getColumn(4).setPreferredWidth(108); + table.getColumnModel().getColumn(5).setPreferredWidth(93); + scrollPane.setViewportView(table); + + dialInfo.getContentPane().setLayout(new MigLayout("", "[188.00,grow][223.00,grow][390.00][]", "[grow][bottom][]")); + dialInfo.getContentPane().add(scrollPane, "cell 0 0 4 1,grow"); + + importPrinters(table); + + // Adjust scroll pane size based on content + int maxVisibleRows = 10; + int rowHeight = table.getRowHeight(); + int tableHeaderHeight = table.getTableHeader().getPreferredSize().height; + int visibleRows = Math.min(table.getRowCount(), maxVisibleRows); + int preferredHeight = (rowHeight * visibleRows) + tableHeaderHeight + 5; + int totalColumnWidth = 0; + + for (int col = 0; col < table.getColumnCount(); col++) { + totalColumnWidth += table.getColumnModel().getColumn(col).getPreferredWidth(); + } + + int padding = 30; + scrollPane.setPreferredSize(new Dimension(totalColumnWidth + padding, preferredHeight)); + + JProgressBar progressBar = new JProgressBar(); + progressBar.setIndeterminate(true); + progressBar.setVisible(false); + progressBar.setStringPainted(true); + dialInfo.getContentPane().add(progressBar, "cell 1 1,grow"); + + JButton btnSendPrinters = new JButton("Send selected Printers"); + btnSendPrinters.addActionListener(e -> sendSelectedPrinters(frmStudioBridge, dialInfo, progressBar)); + dialInfo.getContentPane().add(btnSendPrinters, "cell 0 1,grow"); + + JButton btnSelAll = new JButton("Select All"); + btnSelAll.addActionListener(e -> setAllBooleans(true)); + dialInfo.getContentPane().add(btnSelAll, "cell 2 1,alignx right"); + + JButton btnDeSelAll = new JButton("Deselect All"); + btnDeSelAll.addActionListener(e -> setAllBooleans(false)); + dialInfo.getContentPane().add(btnDeSelAll, "cell 3 1,alignx left"); + + dialInfo.requestFocus(); + dialInfo.pack(); + dialInfo.setLocationRelativeTo(frmStudioBridge); + dialInfo.setVisible(true); + } + + /** + * Imports printer configurations from files and populates the JTable. + * + * @param table The JTable to populate with printer data. + */ + private void importPrinters(JTable table) { + DefaultTableModel model = (DefaultTableModel) table.getModel(); + + for (Printer printer : MainMenu.printerMap.values()) { + model.addRow(new Object[]{printer.getProfileName(), printer.getPrinterName(), printer.getIpAdress(), printer.getSerialNumber(), printer.getPrinterModel(), false}); + } + } + + /** + * Selects or deselects all printers in the table. + * + * @param value true to select all, false to deselect all. + */ + private void setAllBooleans(boolean value) { + DefaultTableModel model = (DefaultTableModel) table.getModel(); + for (int i = 0; i < model.getRowCount(); i++) { + model.setValueAt(value, i, 5); + } + } + + /** + * Handles the process of sending selected printers' data. + * + * @param frmStudioBridge The parent JFrame. + * @param dialInfo The dialog interface. + * @param progressBar The progress bar to indicate sending status. + */ + private void sendSelectedPrinters(JFrame frmStudioBridge, JDialog dialInfo, JProgressBar progressBar) { + // This method handles the sending logic for selected printers. + + stopThread = false; + errors.clear(); + Thread sendingThread = new Thread(() -> { + progressBar.setString("Check Printers..."); + progressBar.setVisible(true); + + printerSelected = false; + + // Determine which UDP port (2021 or 1990) is in use, or set to 0 if none is available + int remoteUdpPort = UDPPackage.getAvailableUDPPort(); + + // Check if a valid port was assigned to remoteUdpPort + if (remoteUdpPort > 0) { + + DefaultTableModel model = (DefaultTableModel) table.getModel(); + int rowCount = model.getRowCount(); + + for (int i = 0; i < rowCount && !stopThread; i++) { + Boolean shouldSend = (Boolean) model.getValueAt(i, 5); + if (shouldSend != null && shouldSend) { + + printerSelected = true; + + Printer printer = new Printer((String) model.getValueAt(i, 0), (String) model.getValueAt(i, 1), (String) model.getValueAt(i, 2), (String) model.getValueAt(i, 3), (String) model.getValueAt(i, 4)); + + SwingUtilities.invokeLater(() -> progressBar.setString("Send Package for " + printer.getPrinterName())); + + if (!UDPPackage.send(frmStudioBridge, printer, remoteUdpPort, true)) { + errors.add(printer.getPrinterName() + " - " + printer.getIpAdress() + " - " + printer.getPrinterModel()); + } + + try { + Thread.sleep(1000); // Simulierte Verzögerung + } catch (InterruptedException e) { + // Thread wurde unterbrochen, daher beenden wir den Prozess + Thread.currentThread().interrupt(); + break; + } + } + } + + SwingUtilities.invokeLater(() -> { + progressBar.setVisible(false); + if (!stopThread) { + dialInfo.setModal(false); + if (printerSelected) { + if (!errors.isEmpty()) { + String errorsOn = ""; + + for (String error : errors) { + errorsOn = errorsOn + error + "
"; + } + + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Attention! Following printers could not sent :
" + errorsOn + "", "Ok").showDialog(); + } else { + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/success.png")), "Packages sent successfully.
The Printer(s) will appear in the next 60 seconds in Bambu Studio.
You can close this Programm when your printer(s) appear in Bambu Studio", "Ok").showDialog(); + } + } else { + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Attention! Please select at least one printer!", "Back").showDialog(); + } + dialInfo.setModal(true); + } + }); + + + + } else { + SwingUtilities.invokeLater(() -> { + progressBar.setVisible(false); + if (!stopThread) { + dialInfo.setModal(false); + new DialogOneButton(null, dialInfo, new ImageIcon(MainMenu.class.getResource("/achtung.png")), "Warning! Bambu Studio is not running!", "Ok").showDialog(); + dialInfo.setModal(true); + } + }); + } + }); + + sendingThread.start(); + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/PrinterCheck.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/PrinterCheck.java new file mode 100644 index 0000000..2aaa0d7 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/PrinterCheck.java @@ -0,0 +1,192 @@ +package rdiger36.StudioBridge.gui; + +import java.awt.Toolkit; +import java.awt.Dialog.ModalExclusionType; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import javax.swing.ImageIcon; +import javax.swing.JDialog; +import javax.swing.JFrame; +import net.miginfocom.swing.MigLayout; +import rdiger36.StudioBridge.functions.*; + +import javax.swing.JLabel; +import javax.swing.JSeparator; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import javax.swing.JButton; + +/** + * A dialog window that checks the connectivity of a printer using ping and + * a TCP/TLS handshake test. Both checks are executed in background threads, + * and the results are displayed in the dialog. + */ +public class PrinterCheck { + + // Prevents multiple scans from running at the same time + boolean isRunning = false; + + /** + * Creates and displays a modal dialog that performs connectivity checks + * for a printer at the given IP address. + * + * @param frmStudioBridge the parent frame used for positioning the dialog + * @param IPAddress the IP address of the printer to test + */ + public PrinterCheck(JFrame frmStudioBridge, String IPAddress) { + + // Create dialog + JDialog dialPrinter = new JDialog(); + dialPrinter.setResizable(false); + dialPrinter.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE); + dialPrinter.setModal(true); + dialPrinter.setAlwaysOnTop(true); + dialPrinter.setTitle("Check Printer Connectivity"); + dialPrinter.setIconImage(Toolkit.getDefaultToolkit().getImage(MultiPrinterSetup.class.getResource("/icon.png"))); + dialPrinter.setBounds(100, 100, 602, 482); + dialPrinter.toFront(); + + // Close dialog on window close + dialPrinter.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dialPrinter.dispose(); + } + }); + + dialPrinter.getContentPane().setLayout(new MigLayout("", "[][]", "[][10px:10px:10px][][10px:10px:10px][][][][]")); + + // Intro text + JLabel lblInfo = new JLabel("Here you can verify whether your printer is reachable from your machine and whether" + + "
it accepts TCP connections on port 6000. If both tests succeed, everything is working correctly." + + "
If either test fails, you should review your network settings. If the TCP handshake fails specifically," + + "
Bambu Studio often displays a \"Connection Failed Error –1\" message."); + dialPrinter.getContentPane().add(lblInfo, "cell 0 0 2 1"); + + // Separator line + JSeparator separator = new JSeparator(); + dialPrinter.getContentPane().add(separator, "cell 0 1 2 1,growx,aligny center"); + + // IP information + JLabel lblInfoIP = new JLabel("Connectivity check for the printer witc the IP-Address: " + IPAddress); + dialPrinter.getContentPane().add(lblInfoIP, "cell 0 2 2 1,alignx center,aligny top"); + + // Ping test label + JLabel lblPing = new JLabel("Is printer reachable?"); + dialPrinter.getContentPane().add(lblPing, "cell 0 4"); + + // Ping test status + JLabel lblPingState = new JLabel("Please wait..."); + lblPingState.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage(MultiPrinterSetup.class.getResource("/load.gif")))); + lblPingState.setHorizontalTextPosition(SwingConstants.LEFT); + lblPingState.setVerticalTextPosition(SwingConstants.CENTER); + dialPrinter.getContentPane().add(lblPingState, "cell 1 4"); + + // Handshake test label + JLabel lblHandshake = new JLabel("TCP handshake "); + dialPrinter.getContentPane().add(lblHandshake, "cell 0 5"); + + // Handshake test status + JLabel lblHandshakeState = new JLabel("Please wait..."); + lblHandshakeState.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage(MultiPrinterSetup.class.getResource("/load.gif")))); + lblHandshakeState.setHorizontalTextPosition(SwingConstants.LEFT); + lblHandshakeState.setVerticalTextPosition(SwingConstants.CENTER); + dialPrinter.getContentPane().add(lblHandshakeState, "cell 1 5"); + + // Retry button + JButton btnRetry = new JButton("Retry"); + dialPrinter.getContentPane().add(btnRetry, "cell 0 7 2 1,alignx center"); + + // Start scan automatically when dialog opens + dialPrinter.addWindowListener(new WindowAdapter() { + @Override public void windowOpened(WindowEvent e) { + new SwingWorker() { + @Override protected Void doInBackground() { + startScan(IPAddress, lblPingState, lblHandshakeState); + return null; + } + }.execute(); + } + }); + + // Retry button action + btnRetry.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + // Make sure no scan is running + if (!isRunning) + new Thread(() -> startScan(IPAddress, lblPingState, lblHandshakeState)).start(); + } + }); + + dialPrinter.requestFocus(); + dialPrinter.pack(); + dialPrinter.setLocationRelativeTo(frmStudioBridge); + dialPrinter.setVisible(true); + } + + /** + * Executes a ping check and a TLS handshake against the given printer IP + * and updates the provided label components with the results. + * + * @param IPAddress the printer's IP address + * @param lblPingState label that displays ping test results + * @param lblHandshakeState label that displays handshake results + */ + private void startScan(String IPAddress, JLabel lblPingState, JLabel lblHandshakeState) { + + isRunning = true; + + // Set both indicators to "loading" + SwingUtilities.invokeLater(() -> { + lblPingState.setText("Please wait..."); + lblPingState.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage(MultiPrinterSetup.class.getResource("/load.gif")))); + + lblHandshakeState.setText("Please wait..."); + lblHandshakeState.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage(MultiPrinterSetup.class.getResource("/load.gif")))); + }); + + // Execute ping test + if (Connectivity.pingPrinter(IPAddress)) { + + // Ping successful + SwingUtilities.invokeLater(() -> { + lblPingState.setText("Printer is reachable from your computer!"); + lblPingState.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/success.png")), 16, 16)); + }); + + // Execute handshake test + if (Connectivity.checkTLSHandshake(IPAddress)) { + + // Handshake successful + SwingUtilities.invokeLater(() -> { + lblHandshakeState.setText("Handshake was sucessfully between computer and printer!"); + lblHandshakeState.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/success.png")), 16, 16)); + }); + + } else { + + // Handshake failed + SwingUtilities.invokeLater(() -> { + lblHandshakeState.setText("Error on Handshake between computer and printer!"); + lblHandshakeState.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/delete.png")), 16, 16)); + }); + } + + } else { + + // Printer not reachable + SwingUtilities.invokeLater(() -> { + lblPingState.setText("Printer is not reachable from your computer!"); + lblPingState.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/delete.png")), 16, 16)); + + lblHandshakeState.setText("Printer is not reachable from your computer!"); + lblHandshakeState.setIcon(Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/delete.png")), 16, 16)); + }); + } + + isRunning = false; + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/SaveDialog.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/SaveDialog.java new file mode 100644 index 0000000..9483cd1 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/SaveDialog.java @@ -0,0 +1,93 @@ +package rdiger36.StudioBridge.gui; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JTextField; +import javax.swing.SwingConstants; +import javax.swing.text.AbstractDocument; + +import net.miginfocom.swing.MigLayout; +import rdiger36.StudioBridge.functions.LengthRestrictedDocumentFilter; + +/** + * A dialog for saving a profile name. + *

+ * This class creates a modal dialog that prompts the user to enter a profile name + * and provides a save button to confirm the action. + *

+ */ +public class SaveDialog { + private JDialog dial; + private JTextField textField; + + private String response; + + /** + * Constructs a SaveDialog instance. + * + * @param mainFrame The parent JFrame for positioning the dialog. + * @param profileName The default profile name to display in the text field. + * @param btnText The String that is set for the Button. + */ + public SaveDialog(JFrame mainFrame, String profileName, String btnText) { + + dial = new JDialog(); + dial.setResizable(false); + dial.setTitle("StudioBridge"); + dial.setIconImage(Toolkit.getDefaultToolkit().getImage(SaveDialog.class.getResource("/icon.png"))); + dial.setModal(true); + dial.setAlwaysOnTop(true); + dial.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + response = null; + dial.dispose(); + } + }); + dial.setSize(276, 167); + if (mainFrame != null) { + dial.setLocationRelativeTo(mainFrame); + } else { + dial.setLocationRelativeTo(null); + } + + JLabel lblProfilename = new JLabel("Profilename:"); + lblProfilename.setHorizontalAlignment(SwingConstants.CENTER); + + dial.getContentPane().setLayout(new MigLayout("", "[grow][87px][grow][87px][grow]", "[14px,grow][23px,grow]")); + dial.getContentPane().add(lblProfilename, "cell 0 0 2 1,alignx center,aligny center"); + + JButton btn1 = new JButton(btnText); + btn1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + response = textField.getText(); + dial.dispose(); + } + }); + + textField = new JTextField(profileName); + dial.getContentPane().add(textField, "cell 2 0 2 1,growx"); + textField.setColumns(10); + ((AbstractDocument) textField.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(25)); + dial.getContentPane().add(btn1, "cell 2 1,alignx center,aligny center"); + + dial.pack(); + dial.setLocationRelativeTo(mainFrame); + } + + /** + * Displays the dialog and waits for the user to enter a profile name. + * + * @return The profile name entered by the user. + */ + public String saveProfile() { + dial.setVisible(true); // Show the dialog (blocking) + return response; // Return the dialog's response + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/ToolInfo.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/ToolInfo.java new file mode 100644 index 0000000..2e10f01 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/ToolInfo.java @@ -0,0 +1,141 @@ +package rdiger36.StudioBridge.gui; + +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Desktop; +import java.awt.Dialog.ModalExclusionType; +import java.awt.Font; +import java.awt.Toolkit; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.net.URI; + +import javax.swing.GroupLayout; +import javax.swing.ImageIcon; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JSeparator; +import javax.swing.LayoutStyle; +import javax.swing.SwingConstants; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; + +import rdiger36.StudioBridge.functions.Resize; + +/** + * A dialog displaying information about the StudioBridge application. + *

+ * This class creates a modal dialog that presents the developer's information, + * GitHub link, and icon source. + *

+ */ +public class ToolInfo { + + /** + * Constructs a ToolInfo dialog. + * + * @param frmBambuConnect The parent JFrame for positioning the dialog. + */ + public ToolInfo(JFrame frmBambuConnect) { + JDialog dialInfo = new JDialog(); + dialInfo.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE); + dialInfo.setModal(true); + dialInfo.setAlwaysOnTop(true); + dialInfo.setTitle("StudioBridge Info"); + dialInfo.setResizable(false); + dialInfo.setIconImage(Toolkit.getDefaultToolkit().getImage(ToolInfo.class.getResource("/icon.png"))); + dialInfo.setBounds(100, 100, 386, 250); + dialInfo.toFront(); + dialInfo.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dialInfo.dispose(); + } + }); + + JEditorPane dtrpnDeveloper = new JEditorPane("text/html", "\r\n" + + "Developer: Niklas (Rdiger-36)
\r\n" + + "GitHub: StudioBridge Repo
\r\n" + + "
\r\n" + + "Icon Source: Freepik - Flaticon\r\n" + + "
\r\n" + + "
\r\n" + + ""); + dtrpnDeveloper.setEditable(false); + dtrpnDeveloper.setOpaque(false); + dtrpnDeveloper.setBorder(null); + dtrpnDeveloper.setFont(new Font("Segoe UI", Font.PLAIN, 14)); + dtrpnDeveloper.setCaretColor(dtrpnDeveloper.getBackground()); + + // Hyperlink listener for handling clicks on links in the JEditorPane + dtrpnDeveloper.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType() == HyperlinkEvent.EventType.ENTERED) { + dtrpnDeveloper.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } else if (e.getEventType() == HyperlinkEvent.EventType.EXITED) { + dtrpnDeveloper.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } else if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + try { + String clickedText = dtrpnDeveloper.getDocument().getText( + e.getSourceElement().getStartOffset(), + e.getSourceElement().getEndOffset() - e.getSourceElement().getStartOffset()); + + if (clickedText.equals("StudioBridge Repo")) { + clickedText = "https://github.com/Rdiger-36/StudioBridge"; + } else if (clickedText.equals("Freepik - Flaticon")) { + clickedText = "https://www.flaticon.com/de/kostenlose-icons/3d-drucker"; + } + + Desktop.getDesktop().browse(new URI(clickedText)); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + }); + + JLabel lbueberschrift = new JLabel("StudioBridge v" + MainMenu.version.substring(0, 1) + "." + + MainMenu.version.substring(1, 2) + "." + MainMenu.version.substring(2, 3)); + lbueberschrift.setHorizontalAlignment(SwingConstants.CENTER); + lbueberschrift.setIconTextGap(25); + lbueberschrift.setForeground(new Color(229, 152, 67)); + lbueberschrift.setFont(new Font("Segoe UI", Font.BOLD, 16)); + ImageIcon icon = Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/icon.png")), 64, 64); + lbueberschrift.setIcon(icon); + + JSeparator separator = new JSeparator(); + + GroupLayout groupLayout = new GroupLayout(dialInfo.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addComponent(lbueberschrift, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE) + .addComponent(separator, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE) + .addGroup(groupLayout.createSequentialGroup() + .addGap(10) + .addComponent(dtrpnDeveloper, GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lbueberschrift, GroupLayout.PREFERRED_SIZE, 91, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(separator, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(dtrpnDeveloper) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)) + ); + + dialInfo.requestFocus(); + dialInfo.getContentPane().setLayout(groupLayout); + dialInfo.pack(); + dialInfo.setLocationRelativeTo(frmBambuConnect); + dialInfo.setVisible(true); + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/UI.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/UI.java new file mode 100644 index 0000000..a5bd511 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/UI.java @@ -0,0 +1,55 @@ +package rdiger36.StudioBridge.gui; + +import javax.swing.UIManager; +import com.formdev.flatlaf.FlatLaf; + +/** + * A utility class for managing the Look and Feel (LAF) of the user interface. + * This class provides methods to change the appearance of the application + * to a dark mode or revert to the system default. + */ +public class UI { + + /** + * Changes the Look and Feel of the application based on the specified mode. + * + * @param mode A boolean value indicating whether to switch to dark mode (true) + * or to revert to the system's default Look and Feel (false). + */ + public static void changeLAF(boolean mode) { + try { + + FlatLaf.setUseNativeWindowDecorations(true); // Use native decorations for windows + + if (mode) { + // Set the Look and Feel to a dark theme using FlatLaf + + if (MainMenu.localMachine.getOs().equals("macos")) { + UIManager.setLookAndFeel("com.formdev.flatlaf.themes.FlatMacDarkLaf"); + } else { + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatDarkLaf"); + } + + } else { + // Revert to the system's default Look and Feel + + if (MainMenu.localMachine.getOs().equals("macos")) { + UIManager.setLookAndFeel("com.formdev.flatlaf.themes.FlatMacLightLaf"); + } else { + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatLightLaf"); + } + } + + // Configure additional UI properties for the dark theme +// UIManager.put("TitlePane.menuBarEmbedded", true); +// UIManager.put("TitlePane.unifiedBackground", true); + UIManager.put("MenuItem.selectionType", "underline"); + + FlatLaf.updateUI(); // Refresh the UI to apply changes + + } catch (Exception e1) { + // Print stack trace if an exception occurs during Look and Feel change + e1.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/LocalMachine.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/LocalMachine.java new file mode 100644 index 0000000..bc3ea26 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/LocalMachine.java @@ -0,0 +1,109 @@ +package rdiger36.StudioBridge.objects; + +/** + * Represents information about the local machine, such as operating system, + * architecture, OS version, and data model (32/64 bit). The values are normalized + * for consistent use across the application. + */ +public class LocalMachine { + private final String os; + private final String osArch; + private final String osVersion; + private final String dataModel; + + /** + * Creates a new {@code LocalMachine} instance by gathering system properties + * and normalizing them for unified representation. + */ + public LocalMachine() { + // Normalize OS name + this.os = simplifyOS(System.getProperty("os.name")); + // Normalize OS architecture + this.osArch = normalizeArch(System.getProperty("os.arch")); + // Raw OS version + this.osVersion = System.getProperty("os.version"); + // JVM data model (e.g., 32 or 64) + this.dataModel = System.getProperty("sun.arch.data.model", "?"); + } + + /** + * Converts raw architecture strings into a consistent format. + * + * @param raw the architecture string from system properties + * @return normalized architecture identifier + */ + private String normalizeArch(String raw) { + if (raw == null) return "unknown"; + + String lower = raw.toLowerCase(); + + switch (lower) { + case "amd64": + case "x86_64": + return "x86_64"; + case "aarch64": + case "arm64": + return "arm64"; + case "x86": + case "i386": + case "i686": + return "x86"; + default: + return lower; // fallback for uncommon architectures + } + } + + /** + * Maps OS names to simplified identifiers (windows, macos, linux). + * + * @param raw the OS name from system properties + * @return normalized OS identifier + */ + private String simplifyOS(String raw) { + if (raw == null) return "unknown"; + + String lower = raw.toLowerCase(); + + if (lower.startsWith("win")) return "windows"; + else if (lower.startsWith("mac")) return "macos"; + else if (lower.startsWith("linux")) return "linux"; + else return lower; // fallback + } + + /** + * @return simplified OS name (windows, macos, linux, …) + */ + public String getOs() { + return os; + } + + /** + * @return normalized CPU architecture (x86, x86_64, arm64, …) + */ + public String getOsArch() { + return osArch; + } + + /** + * @return raw OS version string + */ + public String getOsVersion() { + return osVersion; + } + + /** + * @return data model (typically 32 or 64) + */ + public String getDataModel() { + return dataModel; + } + + /** + * Returns a formatted summary of the machine information. + */ + @Override + public String toString() { + return String.format("OS=%s %s, ARCH=%s, Model=%s-bit", + os, osVersion, osArch, dataModel); + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/Printer.java b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/Printer.java new file mode 100644 index 0000000..145aff9 --- /dev/null +++ b/StudioBridge-src/src/main/java/rdiger36/StudioBridge/objects/Printer.java @@ -0,0 +1,88 @@ +package rdiger36.StudioBridge.objects; + +/** + * Represents a printer profile containing the printer's identifying information + * such as profile name, printer name, IP address, serial number and model. + * + *

This class is used throughout the application to store profile data and + * synchronize UI fields with configuration files.

+ */ +public class Printer { + + // Basic profile properties + private String profileName; + private String printerName; + private String ipAdress; + private String serialNumber; + private String printerModel; + + /** + * Creates a new {@code Printer} instance with the provided profile data. + * + * @param profileName the name of the printer profile + * @param printerName the human-readable name of the printer + * @param ipAdress the printer's network IP address + * @param serialNumber the unique printer serial number + * @param printerModel the printer model identifier + */ + public Printer(String profileName, String printerName, + String ipAdress, String serialNumber, String printerModel) { + + this.profileName = profileName; + this.printerName = printerName; + this.ipAdress = ipAdress; + this.serialNumber = serialNumber; + this.printerModel = printerModel; + } + + // ------------------------ Getter / Setter ------------------------ + + /** @return the name of the printer profile */ + public String getProfileName() { return profileName; } + + /** Sets the profile name. */ + public void setProfileName(String profileName) { + this.profileName = profileName; + } + + /** @return the human-readable name of the printer */ + public String getPrinterName() { return printerName; } + + /** Sets the printer's display name. */ + public void setPrinterName(String printerName) { + this.printerName = printerName; + } + + /** @return the printer's IP address */ + public String getIpAdress() { return ipAdress; } + + /** Sets the printer's IP address. */ + public void setIpAdress(String ipAdress) { + this.ipAdress = ipAdress; + } + + /** @return the printer's serial number */ + public String getSerialNumber() { return serialNumber; } + + /** Sets the printer's serial number. */ + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + /** @return the model identifier of the printer */ + public String getPrinterModel() { return printerModel; } + + /** Sets the model identifier of the printer. */ + public void setPrinterModel(String printerModel) { + this.printerModel = printerModel; + } + + /** + * Returns a formatted string representing the printer profile. + */ + @Override + public String toString() { + return String.format("Profile=%s, Name=%s, IP-Address=%s, Serialnumber=%s, Model=%s", + profileName, printerName, ipAdress, serialNumber, printerModel); + } +} \ No newline at end of file diff --git a/StudioBridge-src/src/main/resources/achtung.png b/StudioBridge-src/src/main/resources/achtung.png new file mode 100644 index 0000000000000000000000000000000000000000..561eb5452a05419b8ac4b1a81a8fc8c7e9c488ed GIT binary patch literal 733 zcmV<30wVp1P)sUkfOzg&E`pQr z82+Xk-&fJYv~5}k7nBpz)wO+1ODL*$8&Lv zW?HkN)z{wHZEZ)Wr7*yLJmIysquF(VLMOR;1St&w9OWODvI!?AjNJO?3F(HD41{n} z{nL2=5e zAJG&#=lhS8aJ2y$jynIEzkE2s$&KpkJ6++pTFHO{&Q4(Gc(c6vYQ#LE;lyQhjIr7c zZe}2Wqgvk{Qx}$X@Gx{nQ{j38F`QI;b6+1$4n;1+X&OA;fDA|ZZjo<2Pl@O-bkwWw zfa48E525H`lmchoj8LKrw#q>8o@W3@m~0>&&W;1^t=yC&8V=+gid+LY8L*;DP%wg{ z>L14FhRi1oc7;a`jhO^_6ko#gV4kw2q7vAYi;qfIXL^6f5qY`g!Cf=gqqtdo| z1Gvcz*9}ezyHFAB$CpX5^{xr-9~8LvawxbA@GRCt^%(tS+SbsPuqH^0jb4l!*Mcfb4H?~Z%m?zlUi4u}VD z6By2+fPa*^0-6=BG@UvN&1M<8prD)$$Ph(JQAk#~Hp30_c(?;c8gQUeF)jqL0g~}_ z$9+HToPWIkd%r%Pf8HP>1j5QnIp!V$o0$f?&=SPXUk0oA8m#3iSbHZ}r;B5O?zIjq z7a!mr5n*|n@C45Rpq3`E0k@6)?Rl2naDmk|bL>P-0D?LDI5s{BHuHEbYwe1qk50iI zFhqc_D39~)$Om)(Uc~CEiB;FOuMh>Z)&a2ca~!)hAPIc-6RoC8&7ExjAz~j_zcOo0 z#J|bu9DJpR;43XjW&7VDdhKP#_Ut3}X_dnlICA9<0(d2W8?QK7;Tz;lwbP^QT=Hx$ zit%hK0;bb7n9Gg{pSJ3q-t~5(O*sp!pqN-mMaLr1s%4@Os&8`nx4lkFamn)!O;)<6 zjdTpyZEO0Hqk)Nd1LsLL;H8sp_HT1tPUH~8+zxW6KEkeZE1PKR$5-ag&rGh zOOsj)xg&Mm7c-Nj*Ns~A8x7pB(E!|!v0#LM0d85ifOK3P<(e}j(yT7QJEKkT zPHEz3NTuuiP(<)|>wudofx9j67}iGt-m)6d_idnGZ%dwTBE+}z1Lv&9Mh~?%@02#) zJE2XWiH$oPM6`;g36s0O;5;uK#=VVi0=}>6;lFs5dx}@H<2A1TQnt_om1SvEG|^w8 zi9Bk{(*4*hdXT@jW0@#;_KX966dvIQ@^%3$wT+zr7snI4Qd;GlwPlk>u3sDy^whzN z-5tE>8dT`$uApE1(`=`)yxoq#PWtzjW4NFs2y}M@-nRC&-XouPPQ_=?h)gqoOQEIf z3bFg`t@hwO$>z{&yt224kEA|cGv9AYp*x#*ws)7G4!c>?0*r3T#b{2xZBT2bewmte z@oM^sS9TrEOp<;XYe1P^je|B*Sd(1nX_bl8CKKuBNE7{-o)z;$S{Bfqkk0kKxB=hF zA_`k%0yWA7$AOF_X_Y~XW|fL-5R{T~jS9s!bJ%Ga@2rjBsZtT~>Lq;~E=O897&w65 zYCy9z6rYGf{Cm;*HJ_W3Y?3Oqe3P}r9#0KXha+oc${7LJa=s0b{tKQ Z$N%a;>BKuXV-^4a002ovPDHLkV1h=U^{4;< literal 0 HcmV?d00001 diff --git a/StudioBridge-src/src/main/resources/edit.png b/StudioBridge-src/src/main/resources/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9f27bec50c74d78ede64608510ae56ec4ccfef GIT binary patch literal 340 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 literal 0 HcmV?d00001 diff --git a/StudioBridge-src/src/main/resources/messages_de.properties b/StudioBridge-src/src/main/resources/messages_de.properties new file mode 100644 index 0000000..0a4200e --- /dev/null +++ b/StudioBridge-src/src/main/resources/messages_de.properties @@ -0,0 +1,2 @@ +greeting=Hallo Welt +exit=Beenden diff --git a/StudioBridge-src/src/main/resources/messages_en.properties b/StudioBridge-src/src/main/resources/messages_en.properties new file mode 100644 index 0000000..b629cb7 --- /dev/null +++ b/StudioBridge-src/src/main/resources/messages_en.properties @@ -0,0 +1,2 @@ +greeting=Hello World +exit=Exit diff --git a/StudioBridge-src/src/main/resources/save.png b/StudioBridge-src/src/main/resources/save.png new file mode 100644 index 0000000000000000000000000000000000000000..d7765310bcff861fb68ce22cec89885843c29746 GIT binary patch literal 1021 zcmVdIj3)iX_ArANFF@7-LLy zzWBc2gNX)RVg_!D?m@_9TjkoBx-% zXS;ffH=i?3?x1RR7onsADVauEQm`6I;K+G5x+enY@g;EhcLCO}=v|6|2q3ad<;ddN zWGtSXWEkH>)#PR&no?9nlGP0*qXxpFT3S1#I$VBra78K{YUjb-2yENFpDVRAc!{{j zS>l`<4Cl(q#?cIpKFp|(79&_*31e|J0`GDdSMSVX#v9bGJ&CA?Z-&6NtVtE;rWy0M z&xp)p3ULoJ3_B*v>{te@GppK$lCbv)IMyqm@>UpcI0RI81W?`@R86fRuuacp%b97$ ze9l8;z9$iPPh!|%NoI#q&=00m-9QSu{uFeMBy_hDIM@+Iaa#n;jgZRz>WAsdl5DA; zV$5fr60rj!Sq4Rh?H6U^9T6Xlr`69UWz@LSsCk@1&A5n@qj7wCU%-1kLDkT_3e!cO zTweEt;p!)e*xNC(_s1DyPfRX%#1Tm6RBdMmTiGpSl`IrVff!FgipJsg234+U8O9$L zWP81vF`u3wV!NVL>4-6gPC>SI3s@JkYDUQ-kyH?iOW-33_ybV{17Wyk*VM8ri!e6M z%l0}KWB%GrWNHi2v5o*^_$?w;bVjfgP8X75S_=zFEy%|;|GJ<(U*$FbT1azxRtja8 zd@x>^Papegj4^-dBx3urWPhOQk2Ec9S2X*uBBYT{Bq2oNi11PHK>_RQJa~TyuD@1c zY4pHw*1c_ST-I~nd5J9D3RO>_*w`@TF?MgZ~dgFx3B8yojrcu z-+Qj=vc9DD&(c@whF`LE<;mQ>OJte@S$!be=MK`HbrT(LCi?Ii(TNtK6W578zE1Q} r%f36_OeJ58khQjttQ|XKYR%Dq0t0d{A-k)Y00000NkvXXu0mjfLDb#u literal 0 HcmV?d00001 diff --git a/StudioBridge-src/src/main/resources/success.png b/StudioBridge-src/src/main/resources/success.png new file mode 100644 index 0000000000000000000000000000000000000000..f42709d2c5fa250669fca738f3d0a9384599e44e GIT binary patch literal 907 zcmY*XYiL|W7~N1%DNU1h-S^(z``r6}Z0=^Wu`$JTLz|GsHe19$O;TdifVS2YHNIHV zO{gOMYDNlPij@*C#m1oGBcLn2AoUuD(z5MJm0-20iVp%71QCL>1wn^z&Ue0Z&it8~ zm-Y^Dkcr1e(6tGqA6hj9J)jLAMFr2HdMdmj>HZ zxJN;q4TMe^b;wYVpdg~W2puBiGpIcSc>&sal;a^sT!I{G zBa0x(q`^udBLyZ&QeY;LPJzKdmMBTk6G%&d9tSOklo+TNed@)6W^sHr*{4*w(A!N37+%^$w8Bgb3OTen&X`E~FSmr#HtEz%yGp@m6 ziS=Z*sxVk&e35gqw5!ve#5xx3XJ{H(kBK;9)KAB7DzeB$Jv!tF5ub`+ zD(t0#4j=ZDVVn$k)E0*gR;lCh-p|PE_8%Dbqx` z&K8@NYm#mlwJSaEl|K3O%=>5h@5J?Y78e#S*LF^R*#G$c7xo`DPK;lAaOAs(9<6+T z=*EvH>nHQUJ8FN{>znOKjTyUi?dr A.B.C` → continue with Step 2. + - `ERROR ...` → network/API problem; retry or proceed manually by visiting + the [releases page](https://github.com/Rdiger-36/StudioBridge/releases). + +### Step 2 — Fetch the new source code +- [ ] Create a temp working copy of the upstream repository: + ```powershell + $src = Join-Path $env:TEMP "StudioBridge-update-src" + if (Test-Path $src) { Remove-Item $src -Recurse -Force } + git clone --depth 1 https://github.com/Rdiger-36/StudioBridge.git $src + ``` +- [ ] (Optional) If the new release is a tag, check it out: + ```powershell + git -C $src fetch --tags --depth 1 origin tag v. + git -C $src checkout v. + ``` + Replace `` with the real tag (e.g. `v.2.1.4`). + +### Step 3 — Review what changed +- [ ] Inspect the changelog / diff to understand the update: + ```powershell + git -C $src log --oneline -15 + Get-ChildItem $src\src -Recurse -File | Select-Object FullName + ``` +- [ ] Check the version was bumped in the upstream `pom.xml` + (`...`) and in `MainMenu.java` + (`public static String version = "..."`). + +### Step 4 — Re-apply the project-specific patch (persistent folder) +> ⚠️ **IMPORTANT:** The upstream code does **not** create the persistent data +> folder on startup. This project adds that behaviour. You must re-apply it to +> the fresh source or the rebuild will lose it. + +- [ ] Copy the fresh source into the workspace (replacing the old one): + ```powershell + $dest = "c:\Users\scheianu\Desktop\Proiecte cod\Bambu_lab\StudioBridge-src" + if (Test-Path $dest) { Remove-Item $dest -Recurse -Force } + New-Item -ItemType Directory -Path $dest | Out-Null + Get-ChildItem $src -Force | Where-Object { $_.Name -ne '.git' } | + Copy-Item -Destination $dest -Recurse -Force + ``` +- [ ] Edit `StudioBridge-src\src\main\java\rdiger36\StudioBridge\gui\MainMenu.java`: + + **(a)** In `main(String[] args)`, right after `migrateLegacyProfilesPathSetting();` + add a call to `ensurePersistentDirectories();` so it runs on every start + (both GUI and `--sendonly` mode): + ```java + migrateOldDataDirectory(); + Config.loadAppSettings(); + migrateLegacyProfilesPathSetting(); + ensurePersistentDirectories(); + ``` + + **(b)** Add the method after `mergeDirectories(...)`: + ```java + /** + * Creates the application's persistent data directory and the profiles + * sub-directory on startup (first run). This guarantees that the folder + * exists even before the user saves anything, so that on the next start + * the application can load the stored settings and printer profiles and + * remember them. + */ + private static void ensurePersistentDirectories() { + try { + File dataDir = new File(savePath); + if (!dataDir.exists() && !dataDir.mkdirs()) { + System.err.println("Warning! Could not create the persistent data directory: " + savePath); + } + File profilesDir = new File(ProfilesDir); + if (!profilesDir.exists() && !profilesDir.mkdirs()) { + System.err.println("Warning! Could not create the profiles directory: " + ProfilesDir); + } + } catch (Exception e) { + System.err.println("Warning! Could not create the StudioBridge persistent data directory: " + savePath); + e.printStackTrace(); + } + } + ``` +- [ ] Confirm there are no compile errors (IDE / `get_errors` on the file). + +### Step 5 — Build the new jar +- [ ] Build the fat jar with Maven (bundled JDK 11 as JAVA_HOME): + ```powershell + $env:JAVA_HOME = "c:\Users\scheianu\Desktop\Proiecte cod\Bambu_lab\portable-dist\jre" + $mvn = "$env:LOCALAPPDATA\Programs\apache-maven-3.9.9\bin\mvn.cmd" + & $mvn -f "c:\Users\scheianu\Desktop\Proiecte cod\Bambu_lab\StudioBridge-src\pom.xml" clean package + ``` +- [ ] Expected output file: + `StudioBridge-src\target\StudioBridge--jar-with-dependencies.jar` + (this is the **complete bundle** — all dependencies included). + +### Step 6 — Deploy to portable-dist +- [ ] Replace the old jar with the new one: + ```powershell + $root = "c:\Users\scheianu\Desktop\Proiecte cod\Bambu_lab" + # remove old version jar(s) + Get-ChildItem "$root\portable-dist" -Filter "StudioBridge-*.jar" | Remove-Item -Force + Copy-Item "$root\StudioBridge-src\target\StudioBridge--jar-with-dependencies.jar" ` + "$root\portable-dist\StudioBridge-.jar" + ``` + +### Step 7 — Update the launcher scripts +- [ ] `portable-dist\StudioBridge.bat`: change the jar name to the new version: + ``` + "%JAVA_HOME%\bin\java.exe" -jar "%~dp0StudioBridge-.jar" %* + ``` +- [ ] `Launch-StudioBridge.bat`: update the `JAR_FILE`, `JAR_URL` and echo texts + to the new version. Use the release download URL pattern: + ``` + https://github.com/Rdiger-36/StudioBridge/releases/download/v./StudioBridge-.jar + ``` + +### Step 8 — Update the README +- [ ] Bump every `v2.x.y` / `StudioBridge-x.y.z` reference in `README.md` to the new version. +- [ ] If the supported-printer table or arguments changed upstream, sync them from the + upstream `README.md` (`StudioBridge-src\README.md`). + +### Step 9 — Verify the new bundle +- [ ] Version check (must print the new version): + ```powershell + & "portable-dist\jre\bin\java.exe" -jar "portable-dist\StudioBridge-.jar" --help + ``` +- [ ] Persistent folder creation on a fresh run (uses a temp home so the real + one is untouched): + ```powershell + $testHome = Join-Path $env:TEMP "sb-update-test-home" + if (Test-Path $testHome) { Remove-Item $testHome -Recurse -Force } + New-Item -ItemType Directory -Path $testHome | Out-Null + & "portable-dist\jre\bin\java.exe" "-Duser.home=$testHome" ` + -jar "portable-dist\StudioBridge-.jar" --sendonly --noupdate + Get-ChildItem $testHome -Recurse -Force | Select-Object FullName + Remove-Item $testHome -Recurse -Force + ``` + Expected: `\.studio-bridge` and `\.studio-bridge\Profiles` exist. +- [ ] (Optional) Run `.\check-update.ps1` again — it should now report up to date. + +### Step 10 — Clean up +- [ ] Delete the temp clone: + ```powershell + Remove-Item (Join-Path $env:TEMP "StudioBridge-update-src") -Recurse -Force + ``` +- [ ] Remove the `StudioBridge-src\target` build output if you want a clean project: + ```powershell + Remove-Item "c:\Users\scheianu\Desktop\Proiecte cod\Bambu_lab\StudioBridge-src\target" -Recurse -Force + ``` + +--- + +## Version locations to keep in sync (when bumping) +| File | Where | +|---|---| +| `StudioBridge-src\pom.xml` | `X.Y.Z` | +| `StudioBridge-src\...\gui\MainMenu.java` | `public static String version = "xyz"` (no dots) | +| `portable-dist\StudioBridge-X.Y.Z.jar` | deployed jar filename | +| `portable-dist\StudioBridge.bat` | jar filename | +| `Launch-StudioBridge.bat` | `JAR_FILE`, `JAR_URL`, echo texts | +| `README.md` | version references | + +> Tip: after finishing, all todo boxes above should be ticked (`[x]`). diff --git a/check-update.ps1 b/check-update.ps1 new file mode 100644 index 0000000..7ab4f5c --- /dev/null +++ b/check-update.ps1 @@ -0,0 +1,106 @@ +<# +.SYNOPSIS + check-update.ps1 - Check if a newer StudioBridge release exists on GitHub + and compare it with the version bundled in this project. + +.DESCRIPTION + Used as Step 1 of the update procedure (see UPDATE.md). + It reads the currently bundled version from the jar in portable-dist, + queries the GitHub releases API for the latest release, and reports + whether an update is available. + +.EXAMPLE + .\check-update.ps1 + .\check-update.ps1 -Repo "Rdiger-36/StudioBridge" + +.NOTES + Exit codes: + 0 - up to date (or no update available) + 1 - update available + 2 - error (offline, API failure, or version could not be determined) +#> +param( + [string]$Repo = "Rdiger-36/StudioBridge", + [string]$PortableDir = (Join-Path $PSScriptRoot "portable-dist") +) + +$ErrorActionPreference = "Stop" + +function Get-BundledVersion { + # Bundled version = parsed from the deployed jar filename: StudioBridge-X.Y.Z.jar + $jar = Get-ChildItem -Path $PortableDir -Filter "StudioBridge-*.jar" -File -ErrorAction SilentlyContinue | + Where-Object { $_.Name -match 'StudioBridge-(\d+\.\d+\.\d+)\.jar$' } | + Select-Object -First 1 + + if ($jar) { + if ($jar.Name -match 'StudioBridge-(\d+\.\d+\.\d+)\.jar$') { + return $matches[1] + } + } + + # Fallback: read the version from the launcher script (JAR_FILE=...StudioBridge-X.Y.Z.jar) + $bat = Join-Path $PortableDir "StudioBridge.bat" + if (Test-Path $bat) { + $line = Select-String -Path $bat -Pattern 'StudioBridge-(\d+\.\d+\.\d+)\.jar' | Select-Object -First 1 + if ($line -and $line.Matches[0].Groups[1]) { + return $line.Matches[0].Groups[1].Value + } + } + return $null +} + +function Get-LatestVersion { + $headers = @{ 'User-Agent' = 'StudioBridge-update-check' } + $release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest" -Headers $headers + # Normalize tags like "v.2.1.3", "v2.1.3", "2.1.3" -> "2.1.3" + return ($release.tag_name -replace '^v\.?', '') +} + +function Test-Newer([string]$current, [string]$latest) { + $a = $current -split '\.' | ForEach-Object { [int]$_ } + $b = $latest -split '\.' | ForEach-Object { [int]$_ } + for ($i = 0; $i -lt [Math]::Max($a.Count, $b.Count); $i++) { + $x = if ($i -lt $a.Count) { $a[$i] } else { 0 } + $y = if ($i -lt $b.Count) { $b[$i] } else { 0 } + if ($x -ne $y) { return $x -lt $y } + } + return $false +} + +# --- Main ---------------------------------------------------------------- +try { + $bundled = Get-BundledVersion + if (-not $bundled) { + Write-Host "ERROR: Could not determine the bundled version in: $PortableDir" -ForegroundColor Red + exit 2 + } + + Write-Host "Repo : $Repo" + Write-Host "Bundled version : $bundled" + + $latest = Get-LatestVersion + Write-Host "Latest on GitHub : $latest" + + if ($bundled -eq $latest) { + Write-Host "" + Write-Host "OK - You are up to date. No update needed." -ForegroundColor Green + exit 0 + } + + if (Test-Newer $bundled $latest) { + Write-Host "" + Write-Host "UPDATE AVAILABLE: $bundled -> $latest" -ForegroundColor Yellow + Write-Host "Follow the steps in UPDATE.md to download, rebuild and deploy." + exit 1 + } + + Write-Host "" + Write-Host "Note: bundled version ($bundled) is newer than the latest GitHub release ($latest)." -ForegroundColor Cyan + exit 0 +} +catch { + Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red + if ($_.ErrorDetails.Message) { Write-Host $_.ErrorDetails.Message -ForegroundColor Red } + Write-Host "Check your internet connection, then retry." -ForegroundColor Yellow + exit 2 +} diff --git a/portable-dist/StudioBridge-2.1.2.jar b/portable-dist/StudioBridge-2.1.3.jar similarity index 95% rename from portable-dist/StudioBridge-2.1.2.jar rename to portable-dist/StudioBridge-2.1.3.jar index 8d0e7e6a49f812ef6bf7ef10f405dbc5590aab8d..214f920c84c8e03ca760ce1eba4dcfaa6a84bc47 100644 GIT binary patch delta 142857 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%0D7+FYNFIqh*nBB2<=-> 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

3&L&$G^~N^IoIIR+aL=fofpFjKWL^sjoe9aA z4l3%RLlT~%nu#W+N24DQ9#@=&%CUj^%#sG^xVx*O{WweV*KS1Kv!(tzncga}*K7%A zL%oyCC}TX7d^Q`2y=|#twwxoi(mCv-q9*%6t>QUo!P@x!fa;OmT%=#@{{zBxsQyVt zl*{nU4nJ@+`g^YArPDPuY02=$t`s*<3ea&0!&arRq)ynlE13v&_R-yWlAZQjs-7qL zJJ#7J)*UfndxgH1R#;Q5|2(fWBsPgmVv+x`^Cfc@a{hdToJbqzOHPbD15&3;-z4hQ z7e(-GK9AmH0Z`qvBx;nFgeSG`ry4ixie&yAVZQB@u9nui+FDwcHM=kI|Ke$QA!dQp z*a0#Pin_m8Bxq@c*V59m)sUG@I~Txtk?3tik88L7Ss*oGLDt;3nYBV&ORJWSmX^In zkiOJ$q2$4W3|k0|eAeON<8{!JZKv0PMpOn^JA=+Glzf>TW(8CxEJq9{@n@$I(~7-G zly@M>ihQ#rYZhT_HXL$~Qy11$O&4up9jhHpd?Bi;pT$d7au}%XtgQ3=LGU`a%a(U203?0}6 zXwzgXdX+0#GCfCj_+{24n0zpF)ijiKQ(4p=x9IT*BJ+^;SsIilxwFDLmD&1gCtShZ zp`MnOjYbY}1SU^v$~3vjf~=xXc~VP8x-WtXLUb}YL?`2Q_eDJ3OoqOXOD3~;Sfxyb z9s{afLAMr3t}L~A39tV?0zKVecbG}}S3Io~HC!w?Gnoq+b6*%ZYH4|Q($cD{Z3^^Kb zfdWF~ZrzF#(XG1Hq2(iM(y(3*bz76yatW6tcj6*jmqWfw5F_mA7f+n0l+~%X0_yDe znZflbas_&ug58|BxVx)-LzznNGfc4cUWJFT_1>;{)?y{v3fx;Lher@SYQG9F)wT)DMa^Hw@_-XQ^)lO)UbVF zp`PSAc^t(t&3i7-+G8G-an` z>+qmyidO#t=>tX$`2S?`S4+0`o}MXM1Nsjc_5TUbqC&}b%Jvp1T0{C}X8eB=@4u!O z+MJP0)WYXZBlBFTblk;eD!G)DO(e8%MpyR70XUE~I^(3oTy+*t@L$z(BrRAX! zTLGjtqRgs_@LlWv8p&FguU9hC>~Ay$wV`)w4fz{O6#2T8w_dU`WbyxXuy4E5bi4@3 zI^`<@O=RAaJeP7CTC@&4|J9sVzD{zK(}}Y`u$wjWTlKWGf;7@8*r1B$x0KrSc)jE$ z%SRZ*neKs3WiX^>K8!c3$(yc|>dW#$={J48ARmX3hGssDN)`Efw4n$sHOt4mzeU%0 z_|cUA$#+VbBJV)#y*gQb?T(n4T8KLy`fJ9I17zH;zopcp(d$(4|IvTp{$$Aa{vY|M zy=wBWDpT+RWU*vin<*u(?NN3|FTY5#65bzBr0UY6f*y5b3pZ&Llk|`pt%Zdf9p?gZ zYb7T+aAwe+`)`fOu^6FaPbi^lQ@3KtUe3dtDM43;=72XA&%1Zybz4s9Ow&=b>LR2Ltg9Jv%FX|VJX%Rv`j+V*GwbUsUNs# z_C}Q{Cv4kP=?qg|hAA~gOTKW?f3~Sa6D&ercZRN!a0*RPYi+u}9gB08TU2dDuQgA5 z_k_thpiXM)T4caQ`|eQ1I&ElqNEEWv9O9ayxVce|HMLYFx+Ot>br3|i|BvWRGcH=E z#zVBs-i%9wGo~VInz0V7!$l9)C{XBlr_vR%zJR! zhkBR5+JWh|+UfP%YiWI(rlr+HqonQKS+F*;>-_S){=-_x;(4guN<(V=ASQ*QMcc3v zTvWBj)2{5sC|SO+kMRjMs`rLZYu1vPGZlFgy6A@H zMF}*0PW+$_2$Tc;H52JSM=j8l4XR3W(`@VZMNsH73QJS|^*lBCuG>}eyN-YK%0aF1 z!}wjZjXayJ$QzSoKq}94)ui5fRmk)Xq@gLlekGH~-90tln-dx{2WL#QBB8pb=g58LRJxqlXQ$ySc_%D<=W%%DMEl%3_}e5=(Rm&&e@9OS4s%{h|v2h0|V64Y#< z9+xZfI2SlQ#hA8S>u%hRjgCs~R^1ek$XDoubd-O^)3i@^(;C_5r~h{hNa+{^1~fed ziP8P~VdVAyjqa{E>J&{At!U UmrJs&JLT+>Z1r|t>IRAb14TT={r~^~ delta 145695 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 z zibxzjBo{5#3>JzzFf5G5Ex~mAG;Lji_0Ny4RI&`y`iP}a{InY<-YvyRtp!UFPfYuX zNMqsVK#_2we#=;cAIy;>Ag}>dybQirK8xpkXO@Fa-YTrCBUYiNdKWrKd!?q33+-Eu z2)6PkFSYFo6s3ER0Ox_4X& z9m_p=vRj^VSN%#)pX!B5F3t6hiVNAVg0F}Babk;~+@1QYD9@-)kWrG#L86o$WdzA> zsAv_c_hFa_V<&etT+yi?L)>Y|YRte-WKiZB?AG61jrpAEU{2Iog9h`8GS;Adt{Bgy zZ;qFH($6)}m^z6gQzyx>5W9rfp)WzNwP+}%Q#fzoS`12&GdS^iEf(~=VrErj(jM(iZiaO8_Uxf{2 z?ZnshNpy54mQH(pjkyZFF++F3A=hZmE>y-MlI_Nqo1?)J!J>)^3u@I(>&P41=H0OU zdzdKTPqy1pB%8_#X)pRwNfhv;mX#GQn( zi-ZmB>#p!7uOra8x{p!O^ZH1nZuCLb>7}|4K&8CQN2RnKAQ8wNpm65`ck*GH;~)u7 zc@#b3(ohMKbrdD{9VtQ5MwX}7j59K$`8bKxv~lGQ82mSK!G;Drg$;mXm{2|LfiJlF zAbN-Kl;b75QD@M}`%ExWteqeVG!cAea6&Ufp`@~72+)N&9C80s;lU6&{k702{lbM@ zAbuk{ec?j%to_H4ZptDFYeNwn&k z>qNwkMz2GsI&u<%<{L%Whb5I$)G3q`oAi3M8K+RqT10A=2MByQJ%ylFf4i8H<@)R8!|^c2d-9y~ww}YZ z=nEB}!|3n%nqhv_?>szY{e~0G-Y9Tfb~&>Bcpm8ne&X<^Pl%S7cZJC+(9sL1`IwrH z3U2k93o!2uLkD6?6nPOlkXvcaMQj@QH6Yn7oJ8A#jdia}m}0oJ`~{4?1Xn)c0I3ok zop>+&ehIm*NYu;GyEcwEbDHR=r0MSE#W~T&QBI=|qOa^C!FXc&J_^FST#4Lv7_*5`m0as2cqox%Cb3QZQ^Wr_8y5Dciwi zocOWK(NUtr{U!ucS8-nZnK;@*Ho8vBv~Q0yaI7q;UPNE#6oC%g*|je6cu8N z=Qs|bKZMWgxI5uwxRaAPd6%I}X&=Dy?`|Rw&GrGBZF`)8Wzs(%V5v1s#feTuATsbK z8slvBcalzN*9SRCrxOcsQjSUaK1ApCqqK*bPQuqp468^nm7Q$Kp$M6uu4a^IUp1a6 z{t?E<*R?sZ_z@<-iS;;9%80YrRcE?8{sXb&4LPx&5#yV3!tF6y@8IT~81)#v`h81I z+0S5)sutmZoj#L}sGq1y<&!DpQwVx@6nXBH z@f7abit~0%y128GJzc7ymD7DDXxB}I&B?6{!&me(z+pG0#xT-A7B12hZ@e z(Tx<(v68!o0{~3a>klUd_t~FQjeIs~Di=606$1LQIK4m?A7^m5#!M$C$--j@c(NLl z{X(M=8ZDqXFR+}Mx&RfaZwpZ`k#fjV4v%`tCdov;2ja^AhaMS)mheSv`}!T!tZ%V?up-k~D?qKEJB>FNnaGJO^z_s|;*!LGNB z6k6Oima?I@#ptfFk3_hx5c8B1S+AVTXw*|wo4z1_m%!piuSA}L?BAnhjVv}K{eax` zMVs{=g4rb!SYNcZAB`+&@=+8>6gHGHA_8{|P@oM|`~ee{r&ymeY}!ZEU9<@fy~95a zAF&DZl_8(aMMOa%AJKG2eL}ve)(rNcY-?u~Z|IL1+{s3Sag$+(Gj_pP#kKhiUN^bO zbETH=plLsY*LjPuP2Lx*s25k{z@iXmOX~auHl&4cKie;ePmO<|-=$>tOpFQOA^4oi6m89NcHvH%&)~;XMA(#WnrLeYuGv&#s;xnZD*HN{7q z19)fXYYF&dz6g6!zNHphl*dFwTKUbaAiWtMhV?aY4*n=R>ukX_ZDzck=R}?%#(P); z?sZXwow+$<8T|Y)hdpgD3|DoGn;iH4CRwZoxCc^G?%MCl{6Ko+p_lE?&ZmW$JUg4;+qgF*o??&cdpjK-K!D%iW zKH=ix%ssxB!HJ$6p5p1^#aoTa9`G1kVRF>sBuRjaDRr{f))4{%L`2Th-(`YFDl#}Q zFUZA`8>^p{?hA5}28+LNd>KOYD#*p294ezB&v8K7fN%~ktL9=yg$~*np>s76@uSXi zElvnk=g1bhwze?3CMO(fxLA>!LR&)^6vL73I(&-PXFXW~&5M&5j03_7ZG`Mto};$A zaJ)5xeDd13IPr3>bA(`zc6yZlafIh0b)3lP02d`YX(NRiSO*~y0rBIV^Jy2OlHKeg z3OKPL)Rm%~p>|du4xjDg;;!$w3mE#TKXq}{2Gf0KZM;wc0mMK!@cOKoX{0&`0mUF- z&+GBF3zW>ooXk~Qn>DXU*>XyA)n*Fk5D{Fp(d0YU#Sq(vOf=Hfb0R6+(R(x8wAF+G zlQ?l`Qh9BBazjU-O>%emDKVSr@}+6nE;z=?BL6XWWb2I^3=ID1u5Bsw&*Maq5(p+A zZnR3tN=+i%Ubs4+6Y>SPg{;>z%L6iHD@E9ul2*Cc^0xFZ<7I6TdDt#+cC(}-p4f>l z+~Q*BlIfn1T7|m{%n~U6CDl+kxAXsiZFuL@dLdo6LtJ3lA(u+LE*Bgza?*4J6Q&pf zIMZx!WtdP6p~H}$EsZ)>Zt*H_=u~0h#rj&IH@t!aCXC2ChvfQ3K1>CXW|zuQ9L7+g zIWDIX6@uBE*F5Qi_b#~2@Y=;NL~izBMZ}VesRhr6X0$2)ic#rbBYVC66{Rew)4wi; z`RjOJXn0)8c|K);^;>k08N8*8!zw>*T_OD^BixBy3(tM$>PjzyF{#pbqIG@{-d=(H zB7gA%=xjblcsGBrP76jXd+OqkAnR)PAM~_8`gBW&|Dfc6yz~xI2S8V{(|`C2om}l{ zYXCaGL+~#a{Rlt=kcCT-df~1fG~5=u69s#*+<#TwRk~w+x4J0m!Cmkm5ZNuR!C)U+ zS`i^Ms-m{3P`j3hBnqy035>Drg0#4R(^w>|X=`IwTbdRGv!a@F_t}%1YWs!t&oZ zF}9Mnxv+VNNGPfBE)wXc!#@y3!N|f1SkP8h^OD@qYc1!MLTUw{cb# zjCyseAa=^9iAXDUDXN_9N={X^I8uKs$F_ZD7jAB>A0ALvn-M7AQbq=+0>3?gq)|%QyqZ(cQHHPa6FUmwDQTX?# zNO(!Aad&Ox8cCOHYx|j8vT&o4Xl)hhAES*nxrHOAdg@w?ww{Tlje%-V2NTx;PE=e+ z+mH^`!O)jW@9Jnr2@hNu)_^wGMd!In59(^Wn_TlnDj&BhSMhgxUSZyajtX_Y2c)uqgd5s1g@YPw0!4a~3kOCrvs8ZMOUm8HkI z89s}QjnjIVd;qS9cMIh)XjiqyK5ipz4U-NTxMOk+7yf5wxGCsRBlOl= znN+`t)-A8Gwx;mgVD>jo{|^RNfAU0sK4NHN)bd-J(-;A*&j`IZEgpdvHxiOCr0GSJ zV~y&?n&O*ilMn>6o4_^Of2TQ3Fx7Exs&l1gO)&``F@Z9hp&w3fiU8v?g%NIaW{I0K zy=aOKUTY>p{3)&(8UwzKHPf~gn&&bM2eq3a8n>O#i7~luPL!B{_M5vzRD$;q5>T*} zt3(-RGH;HIR;*=qgwv(wX!=3(G)^?JIlNizFAqPiw)Ey(Vp^);F>&brVhRYAh zu=sT=SlsNH2xCJo2{YB@&pA@`yj<``5-Qf2N|Llgg`+s@f)e7P7F^&>hW}<1mjh;0 zP>f>#Wayg@ztGkxm~01r77$@zS1O#ah6+-(y@eT7m5U|UQS z1gB9L`y{bMZ4S4>~=6M9XC2e4TbIC#3Wn{6p`7n?v9k$ z9)el*ByfH`SiFJ3p7l9g++Ld~1T+u{FB;Oo-4zFy!46WWyM6Ah1 zhl2LkaAa9J>hPit{cw;DBZ3B38d>?v;o3s4?jnK%pWWSEDRcsk=N6gbg_iR@+@%x5 zgShl!NUS1xPj?Fnwbo&ytEW+^&i53h0!Y~r{VT1%h=kDL{z$jK8(cRc-6&n(bWtjt zrUsNdVp@ig)F@oOG}sVAzjZ>enLLOi`JJ@w1*f4RTSdv8F-0gHE+XEPJi^_a&UA*y zK9A?Hz5%+YVRnCgk^~u%h9)^+vIN;Qne{s@?EajFc6=50ArM=p&z6WR>H;+_a8;8T znBNtf6sBD<1%I|oM6i-xj%vmk3PU@d-WBy(dzC2AN*IHionrc!ZW!a{Y>*)G?x@Ng z-B9i(n~h<-BC*XFv7&L^G4SIodw1;+q1*2Na&)jigZd^2~(o+|WMcwjxqk@iJF-C2v zYj4<NJi<{8~ju&0BQkv7)A1Gb( z{;1NWPMlZNU+Y3S{k7GFkIo{}OjwOj%90kPqfZwrl{VD-5RwiafTV|fM4kt$X*asX z;A6fLI4B)O=#MaKP=fUuLtJpf+JK}8GjMm>Kq#sEK=|$`f-XZ)6g(bMRcT8X2cm@c zt8zH24@~gS(AJaT`&tGTTW9M^7!I*Y?9dK`h*u`eDT(8}6pbK`?S1Vx_T$$iZl4cUl?4 z_Oxy=q^)twTa@mY!b>Wrpx@AQ6RG}h+BD%+doJRuR{GGL-;l^jCnC7hr&C%}y&-^O zJBhF({W(NiPk7snBWclyt@@YIehk5|Z{Fv>aEm@lHySe(N{;sXFVDQc(vjx3hCipL zE2Sgz=yYRIbBZ2@_T!Oh4A&J7;&ve`Bb~1nE3R+fZ;=DM8|vp%y!@ME}xfHfgm{0f(-Zh#p+6bmmgJ zv1p4I5r#zzmW@T`)z&k_k22OP6=XFIl{#%JM^0~5su&`tiQ|yeZYPIZ>_k8+V1lNI zu`H=~7NS$pVNR%yDD7z97>u?0enMGDdg2)8UCYwe#erhQcx^YK0>UFpT<@aNp6Al9 zz{qDEs9-!63{kkMKOXC%kvEa8KAimaJ5-K)$l=|;qix_I-|yNk!jfkO(Fv&3xi3gD z5mVv26EHnKg!>KXXehIyZPQ@nMfNZ z5cH-cOY!twaW*n)uukN;)Ay|M*;kJ_@T!8c=AcmLsb~%Y=g)i^KL_RQJy#ngYe>uH zLUY_HhN)=eDU@gZlk$Ml;+%&xvem`A08FZ14w{|m9ZtmE@vx=~IWXbWJ&w5j39r5? zG|2vmebR!*oUnP~VM7=GgzV*K9I<^4b{_J1Tb<_15(H-MpXY72~`L?k^x(VK9T*8n}2^@Jo9|OhYR8G`c0L{+rIFZ!O zQ^9B5I~G7`8?^{q(dPwd^apxzq{%`w)k8FXp|*{%C6i+>Gx7f6&xOcn$PkWf9fHD4 znSjDf8EI7L5tOw^n<^|D&E@Wn_OznXMM!yi3P+kQM&%Yw<3#8AC{tMu9Jp~YY}kjU z&5BwMyYh8ozX}?^+_Mr*FDZ9u&?--9 zdvwFwJuJU+Q3ah|3NzYlGKNiQ(I!ufV#|6VU@ZZThPn# zD31ZLr7_D9da9o!*;;HRW}iZ}eO`_p+6o^-3`ihtSXFN2tJ6kS-a9QydC`Lv7(xCh z;7I&R>~00%+?qj&B@MXliEk_GVdy_AVd#qc5?5RAh$|US zMZ%E=tjD}`#%idj^O?aRRInPmLCH9>#)z!XXs7GHc;ekM(YM3bK)MFTZ-amnU0Q># zH#~1GdfqmHwrxb&C$7cxshtHU;;p^h^47r*Y*1ia01?z-C9I#f4$AWFMA(gr*J0TKCUpEO{`!+KfHY37g^df;J)&C+zLOi60%j@DP~}Rt(;P(jM#1 z;oVzMgrWhQDBG&Viz{1Ej%Vo-Wb#%_z%ntAuxubxS2#D36AqKSY$$yjTrzK#h~RF* zHrVxX4o9Nrdf8I=cF5es$iYXOy?bFdDdGQf!8

>KO?GIzg-;5nUL=yaN8H%-U}k^9Vhy~^Kzkmdy#O|M~)o&2vz#mF7$J_ zD*KRE-Y3qBKY*!k@h2|}nz;{2e7{QIkzY~3U%LRQ-;D~`_`4{oqCxxNW!EwZ@|+=0 zD$tw**xK)O04w}$lzjjz{4wSXt4l+&(R(!qVaqTa95{doHzUH^iWVKjfMDY-L6W?^ z?Iq)l#~~y+gd0?1l8%Sa0#YJG#F01HYfNxiH4gjM^|mJW!MQ>Q3K4e_ z^TB%qB-)BkY0W4o9rb+VByw6X;39^1H;Mb>-bkal-_M{mX&`EDjHuA^m$$EjDEF8UGb_M}PIgO_%nt?{u zX&Nff`YaT!#w9vdNWk8#JK=$>Sw@PU&k_aj-r-re$A)C*Fll{8UCtqVTdv~#taI?v zi+&yPQIc&=*q%qj=)6nh+0eub=(Xqe7%4xvM*L*K&F<$yWGT?CMPqZ}}!>>J)nUbu4?VV3r$5eq*ScL`DI{#_$f zK~?X;Nu#pik{y?j>SK|fPx%#9nAu%IWUcp1f+Q7SCgS(f7_p{-FX7ikm!afk0hA1W zZ7g6#`LB_Seg@R?G6d2rsQxuLD(f<4AX}_CQFIw&EZ&sRb3i!J;2d=A-dB(y5)V+b z1n~u0hrB?Q1;t-QMa)vE{OLz`WcwLH_&Th(io-bv1B_(tcBR z4<5XI0~MIv)R>0?WS1}4YqwTOyLMP>iD=)}C|J=^6zmV3k<>7qv6Kz9x`{fHb&mIEJ_975;g9;T@e9$Dt@SPpw*Aj z=|(+7PI1@&%e(jx^MMTyjbRtIDUXdp z;~yB7^nt_6@QXi`{|~;V^~X z)$p{;_@~+|L6;(7Y)$d;qJn2|L7h~i%qnA9Ehazk472*1ZAGM!@J-8!q7FWuwE8(_ zjY~1lX9B(wVqMHkL;4t@4W2gwk@psXb?i~jIC2yxA4a`}sND&Uv^s%8zGle# zQzC*oJ&n$n^bYVeOw5_irSG6K^$u+-#{Su&J3csj{~pe+TnxKy?lCx$Migsn;nwBW zVwBwnQ*?$6D1vqRBK9eP=&LAMmWXD2LOa6TOiv_#*4opLPng`la1oK#!ew`nu%lV| zXwJ_+BZo#+^l)CJuOmf$L89hWe*ufXXsg46m%m_bnp3?T$2Fp_7;IY9W`I9UtL^K~ zN8guUp|C-W2s={DH*HP)ctgfFjK^LL>EU-Q`ZE62+EM?8zLuo=7X=#9ScGE*Q(WU` zGEEbGy|~V{8eeH&ZKB}<4ZmYq5Q nDo-`Sk(8YqVJfYwI9f_em@Y-p9~^JDUQ|` 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