diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000..9fa4289 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,31 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 8 + uses: actions/setup-java@v4 + with: + java-version: '8' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B package --file pom.xml diff --git a/.gitignore b/.gitignore index b425f09..031b03e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,35 +1,897 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### IntelliJ IDEA ### -.idea/ -*.iws -*.iml -*.ipr - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store \ No newline at end of file +# ============================================================================== +# COMPREHENSIVE .GITIGNORE TEMPLATE +# ============================================================================== +# This template covers most common development scenarios and tools +# Generated patterns use ** to match any subdirectory depth + +# ============================================================================== +# PYTHON +# ============================================================================== +**/__pycache__/ +**/*.py[cod] +**/*$py.class +**/*.so +**/.Python +**/build/ +**/develop-eggs/ +**/dist/ +**/downloads/ +**/eggs/ +**/.eggs/ +**/lib/ +**/lib64/ +**/parts/ +**/sdist/ +**/var/ +**/wheels/ +**/share/python-wheels/ +**/*.egg-info/ +**/.installed.cfg +**/*.egg +**/MANIFEST + +# PyInstaller +**/*.manifest +**/*.spec + +# Installer logs +**/pip-log.txt +**/pip-delete-this-directory.txt + +# Unit test / coverage reports +**/htmlcov/ +**/.tox/ +**/.nox/ +**/.coverage +**/.coverage.* +**/.cache +**/nosetests.xml +**/coverage.xml +**/*.cover +**/*.py,cover +**/.hypothesis/ +**/.pytest_cache/ +**/cover/ + +# Translations +**/*.mo +**/*.pot + +# Django stuff: +**/*.log +**/local_settings.py +**/db.sqlite3 +**/db.sqlite3-journal + +# Flask stuff: +**/instance/ +**/.webassets-cache + +# Scrapy stuff: +**/.scrapy + +# Sphinx documentation +**/docs/_build/ + +# PyBuilder +**/.pybuilder/ +**/target/ + +# Jupyter Notebook +**/.ipynb_checkpoints + +# IPython +**/profile_default/ +**/ipython_config.py + +# pyenv +**/.python-version + +# pipenv +**/Pipfile.lock + +# poetry +**/poetry.lock + +# pdm +**/.pdm.toml +**/.pdm-python +**/.pdm-build/ + +# PEP 582 +**/__pypackages__/ + +# Celery stuff +**/celerybeat-schedule +**/celerybeat.pid + +# SageMath parsed files +**/*.sage.py + +# Environments +**/.env +**/.venv +**/env/ +**/venv/ +**/ENV/ +**/env.bak/ +**/venv.bak/ + +# Spyder project settings +**/.spyderproject +**/.spyproject + +# Rope project settings +**/.ropeproject + +# mkdocs documentation +**/site/ + +# mypy +**/.mypy_cache/ +**/.dmypy.json +**/dmypy.json + +# Pyre type checker +**/.pyre/ + +# pytype static type analyzer +**/.pytype/ + +# Cython debug symbols +**/cython_debug/ + +# PyCharm +**/.idea/ + +# ============================================================================== +# NODE.JS / JAVASCRIPT / TYPESCRIPT +# ============================================================================== +**/node_modules/ +**/npm-debug.log* +**/yarn-debug.log* +**/yarn-error.log* +**/lerna-debug.log* +**/.pnpm-debug.log* + +# Runtime data +**/pids/ +**/*.pid +**/*.seed +**/*.pid.lock + +# Coverage directory used by tools like istanbul +**/coverage/ +**/.nyc_output + +# Grunt intermediate storage +**/.grunt + +# Bower dependency directory +**/bower_components + +# node-waf configuration +**/.lock-wscript + +# Compiled binary addons +**/build/Release + +# Dependency directories +**/jspm_packages/ + +# Snowpack dependency directory +**/web_modules/ + +# TypeScript cache +**/*.tsbuildinfo + +# Optional npm cache directory +**/.npm + +# Optional eslint cache +**/.eslintcache + +# Optional stylelint cache +**/.stylelintcache + +# Microbundle cache +**/.rpt2_cache/ +**/.rts2_cache_cjs/ +**/.rts2_cache_es/ +**/.rts2_cache_umd/ + +# Optional REPL history +**/.node_repl_history + +# Output of 'npm pack' +**/*.tgz + +# Yarn Integrity file +**/.yarn-integrity + +# dotenv environment variable files +**/.env +**/.env.development.local +**/.env.test.local +**/.env.production.local +**/.env.local + +# parcel-bundler cache +**/.cache +**/.parcel-cache + +# Next.js build output +**/.next +**/out/ + +# Nuxt.js build / generate output +**/.nuxt +**/dist + +# Gatsby files +**/.cache/ +**/public + +# Vue.js +**/dist/ +**/.tmp +**/.cache + +# Vuepress build output +**/.vuepress/dist + +# Serverless directories +**/.serverless/ + +# FuseBox cache +**/.fusebox/ + +# DynamoDB Local files +**/.dynamodb/ + +# TernJS port file +**/.tern-port + +# Stores VSCode versions used for testing VSCode extensions +**/.vscode-test + +# yarn v2 +**/.yarn/cache +**/.yarn/unplugged +**/.yarn/build-state.yml +**/.yarn/install-state.gz +**/.pnp.* + +# Storybook +**/.storybook-out +**/storybook-static + +# Angular +**/e2e/ +**/.angular/ + +# React Native +**/ios/Pods/ +**/android/app/build/ + +# Expo +**/.expo/ +**/dist/ +**/npm-debug.* +**/yarn-error.* +**/.expo-shared + +# ============================================================================== +# JAVA +# ============================================================================== +**/*.class +**/*.log +**/*.ctxt +**/.mtj.tmp/ +**/*.jar +**/*.war +**/*.nar +**/*.ear +**/*.zip +**/*.tar.gz +**/*.rar +**/hs_err_pid* +**/replay_pid* + +# Maven +**/target/ +**/pom.xml.tag +**/pom.xml.releaseBackup +**/pom.xml.versionsBackup +**/pom.xml.next +**/release.properties +**/dependency-reduced-pom.xml +**/buildNumber.properties +**/.mvn/timing.properties +**/.mvn/wrapper/maven-wrapper.jar + +# Gradle +**/.gradle/ +**/build/ +**/.gradletasknamecache +**/gradle-app.setting + +# IntelliJ IDEA +**/.idea/ +**/*.iws +**/*.iml +**/*.ipr +**/out/ + +# Eclipse +**/.apt_generated +**/.classpath +**/.factorypath +**/.project +**/.settings +**/.springBeans +**/.sts4-cache +**/bin/ +**/tmp/ +**/*.tmp +**/*.bak +**/*.swp +**/*~.nib +**/local.properties +**/.metadata +**/.loadpath +**/.recommenders + +# NetBeans +**/nbproject/private/ +**/.nbbuild/ +**/dist/ +**/nbdist/ +**/.nb-gradle/ + +# VS Code +**/.vscode/ + +# ============================================================================== +# C / C++ +# ============================================================================== +# Prerequisites +**/*.d + +# Object files +**/*.o +**/*.ko +**/*.obj +**/*.elf + +# Linker output +**/*.ilk +**/*.map +**/*.exp + +# Precompiled Headers +**/*.gch +**/*.pch + +# Libraries +**/*.lib +**/*.a +**/*.la +**/*.lo + +# Shared objects (inc. Windows DLLs) +**/*.dll +**/*.so +**/*.so.* +**/*.dylib + +# Executables +**/*.exe +**/*.out +**/*.app +**/*.i*86 +**/*.x86_64 +**/*.hex + +# Debug files +**/*.dSYM/ +**/*.su +**/*.idb +**/*.pdb + +# Kernel Module Compile Results +**/*.mod* +**/*.cmd +**/.tmp_versions/ +**/modules.order +**/Module.symvers +**/Mkfile.old +**/dkms.conf + +# CMake +**/CMakeLists.txt.user +**/CMakeCache.txt +**/CMakeFiles +**/CMakeScripts +**/Testing +**/Makefile +**/cmake_install.cmake +**/install_manifest.txt +**/compile_commands.json +**/CTestTestfile.cmake +**/_deps + +# Conan +**/conanfile.txt +**/conandata.yml +**/conan.lock +**/.conan/ + +# ============================================================================== +# C# / .NET +# ============================================================================== +**/bin/ +**/obj/ +**/out/ +**/*.user +**/*.suo +**/*.sln.docstates +**/*.userprefs +**/*.pidb +**/*.booproj +**/.vs/ +**/packages/ +**/TestResults/ +**/*.Cache +**/ClientBin/ +**/*_i.c +**/*_p.c +**/*_h.h +**/*.ilk +**/*.meta +**/*.obj +**/*.iobj +**/*.pch +**/*.pdb +**/*.ipdb +**/*.pgc +**/*.pgd +**/*.rsp +**/*.sbr +**/*.tlb +**/*.tli +**/*.tlh +**/*.tmp +**/*.tmp_proj +**/*_wpftmp.csproj +**/*.log +**/*.vspscc +**/*.vssscc +**/.builds +**/*.pidb +**/*.svclog +**/*.scc + +# ============================================================================== +# GO +# ============================================================================== +# Binaries for programs and plugins +**/*.exe +**/*.exe~ +**/*.dll +**/*.so +**/*.dylib + +# Test binary, built with `go test -c` +**/*.test + +# Output of the go coverage tool +**/*.out + +# Dependency directories +**/vendor/ + +# Go workspace file +**/go.work + +# ============================================================================== +# RUST +# ============================================================================== +# Generated by Cargo +**/target/ + +# Remove Cargo.lock from gitignore if creating an executable +# Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc +**/*.pdb + +# ============================================================================== +# PHP +# ============================================================================== +**/vendor/ +**/node_modules/ +**/npm-debug.log +**/yarn-error.log + +# Laravel specific +**/.env +**/storage/*.key +**/Homestead.yaml +**/Homestead.json +**/.vagrant +**/.phpunit.result.cache + +# Symfony specific +**/.env.local +**/.env.local.php +**/.env.*.local +**/config/secrets/prod/prod.decrypt.private.php +**/public/bundles/ +**/var/ +**/vendor/ + +# Composer +**/composer.phar +**/composer.lock + +# ============================================================================== +# RUBY +# ============================================================================== +**/*.gem +**/*.rbc +**/.config +**/coverage/ +**/InstalledFiles +**/pkg/ +**/spec/reports/ +**/spec/examples.txt +**/test/tmp/ +**/test/version_tmp/ +**/tmp/ +**/.yardoc/ +**/_yardoc/ +**/doc/ +**/.bundle/ +**/vendor/bundle +**/lib/bundler/man/ +**/.rbenv-version +**/.rvmrc +**/.ruby-version +**/.ruby-gemset +**/Gemfile.lock + +# Rails +**/log/ +**/tmp/ +**/db/*.sqlite3 +**/db/*.sqlite3-journal +**/db/*.sqlite3-* +**/public/system/ +**/coverage/ +**/spec/tmp/ +**/.sass-cache/ +**/capybara-*.html +**/.rspec +**/.generators +**/.rakeTasks + +# ============================================================================== +# DATABASES +# ============================================================================== +**/*.db +**/*.sqlite +**/*.sqlite3 +**/*.db-shm +**/*.db-wal + +# MySQL +**/mysql-bin.* + +# PostgreSQL +**/*.backup +**/*.sql + +# MongoDB +**/dump/ + +# Redis +**/dump.rdb + +# ============================================================================== +# DEVOPS & CONTAINERS +# ============================================================================== +# Docker +**/Dockerfile* +**/.dockerignore +**/docker-compose*.yml +**/.docker/ + +# Kubernetes +**/*.kubeconfig + +# Terraform +**/*.tfstate +**/*.tfstate.* +**/.terraform/ +**/.terraform.lock.hcl +**/terraform.tfvars +**/terraform.tfvars.json +**/*.tfplan +**/*.tfstate.backup + +# Vagrant +**/.vagrant/ +**/*.box + +# Ansible +**/retry files +**/*.retry + +# ============================================================================== +# OPERATING SYSTEMS +# ============================================================================== +# Windows +**/Thumbs.db +**/Thumbs.db:encryptable +**/ehthumbs.db +**/ehthumbs_vista.db +**/*.stackdump +**/$RECYCLE.BIN/ +**/Desktop.ini + +# macOS +**/.DS_Store +**/.AppleDouble +**/.LSOverride +**/Icon +**/.DocumentRevisions-V100 +**/.fseventsd +**/.Spotlight-V100 +**/.TemporaryItems +**/.Trashes +**/.VolumeIcon.icns +**/.com.apple.timemachine.donotpresent +**/.AppleDB +**/.AppleDesktop +**/Network Trash Folder +**/Temporary Items +**/.apdisk + +# Linux +**/*~ +**/.fuse_hidden* +**/.directory +**/.Trash-* +**/.nfs* + +# ============================================================================== +# IDEs & EDITORS +# ============================================================================== +# Visual Studio Code +**/.vscode/ +**/*.code-workspace +**/.history/ + +# Visual Studio +**/.vs/ +**/bin/ +**/obj/ +**/*.user +**/*.suo + +# IntelliJ IDEA +**/.idea/ +**/*.iws +**/*.iml +**/*.ipr + +# Eclipse +**/.metadata +**/bin/ +**/tmp/ +**/*.tmp +**/*.bak +**/*.swp +**/*~.nib +**/local.properties +**/.settings/ +**/.loadpath +**/.recommenders +**/.apt_generated/ +**/.apt_generated_test/ +**/.cache-main +**/.scala_dependencies +**/.worksheet + +# NetBeans +**/nbproject/private/ +**/.nbbuild/ +**/dist/ +**/nbdist/ +**/.nb-gradle/ +**/build/ + +# Sublime Text +**/*.sublime-workspace +**/*.sublime-project + +# Vim +**/*.swp +**/*.swo +**/*~ +**/.netrwhist +**/tags + +# Emacs +**/*~ +**/#*# +**/.#* +**/.emacs.desktop +**/.emacs.desktop.lock +**/*.elc +**/auto-save-list +**/tramp +**/.org-id-locations +**/*_archive +**/*_flymake.* +**/flycheck_*.el +**/.dir-locals.el +**/.projectile + +# Atom +**/.atom/ + +# ============================================================================== +# LOGS & TEMPORARY FILES +# ============================================================================== +**/logs/ +**/*.log +**/log/ +**/debug/ +**/tmp/ +**/temp/ +**/.tmp/ +**/.temp/ +**/crash.log +**/error.log +**/access.log +**/combined.log +**/npm-debug.log* +**/yarn-debug.log* +**/yarn-error.log* + +# ============================================================================== +# SECURITY & CREDENTIALS +# ============================================================================== +**/.env* +!**/.env.example +!**/.env.template +**/*.pem +**/*.key +**/*.p12 +**/*.pfx +**/*.jks +**/*.keystore +**/secrets/ +**/credentials/ +**/.secrets/ +**/.credentials/ +**/auth.json +**/service-account*.json +**/.gcloud/ +**/.aws/ +**/.azure/ + +# ============================================================================== +# BACKUP & ARCHIVE FILES +# ============================================================================== +**/*.bak +**/*.backup +**/*.old +**/*.orig +**/*.rej +**/*.swp +**/*.swo +**/*~ +**/*.tmp +**/*.temp +**/.DS_Store? +**/._* +**/*.zip +**/*.rar +**/*.7z +**/*.tar +**/*.gz +**/*.tgz +**/*.tar.gz +**/*.tar.bz2 +**/*.tar.xz + +# ============================================================================== +# CACHE & BUILD ARTIFACTS +# ============================================================================== +**/.cache/ +**/cache/ +**/build/ +**/dist/ +**/out/ +**/target/ +**/.next/ +**/.nuxt/ +**/.vuepress/dist/ +**/public/build/ +**/public/hot +**/public/storage +**/storage/*.key +**/bootstrap/cache/ + +# ============================================================================== +# PACKAGE MANAGERS +# ============================================================================== +# npm +**/node_modules/ +**/package-lock.json +**/.npm/ + +# Yarn +**/yarn.lock +**/.yarn/ +**/.pnp.* + +# pnpm +**/pnpm-lock.yaml +**/.pnpm-store/ + +# Bower +**/bower_components/ + +# Composer (PHP) +**/vendor/ +**/composer.lock + +# Bundler (Ruby) +**/vendor/bundle/ +**/Gemfile.lock + +# Maven (Java) +**/target/ + +# Gradle (Java/Android) +**/.gradle/ +**/build/ + +# Cargo (Rust) +**/target/ +**/Cargo.lock + +# ============================================================================== +# MISC +# ============================================================================== +# Thumbnails +**/*.jpg:large +**/*.jpeg:large +**/*.png:large +**/*.gif:large + +# Archive files +**/*.7z +**/*.dmg +**/*.iso +**/*.jar +**/*.rar +**/*.tar +**/*.zip + +# ============================================================================== +# PROJECT SPECIFIC +# ============================================================================== +# Add your project-specific ignores here +# workspace/ +# data/ +# uploads/ +# downloads/ + diff --git a/README.md b/README.md index ccdb1ba..3add5c7 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,314 @@ Add the snapshot version ## Demo Get jar file here: [latest-releases](https://github.com/DJ-Raven/swing-modal-dialog/releases/latest) -## Document +## Documentation -Not yet +### Modal Dialog + +Modal dialogs are overlay windows that require user interaction before continuing with the main application. + +#### Basic Usage + +```java +import raven.modal.ModalDialog; +import raven.modal.component.SimpleModalBorder; + +// Create a simple modal with content +JPanel content = new JPanel(); +content.add(new JLabel("Hello, World!")); + +// Show modal dialog +ModalDialog.showModal(parentComponent, new SimpleModalBorder( + content, + "Dialog Title", + SimpleModalBorder.OK_CANCEL_OPTION, + null +)); +``` + +#### Advanced Modal with Options + +```java +import raven.modal.option.Option; +import raven.modal.option.Location; + +// Create custom options +Option option = ModalDialog.createOption() + .setAnimationEnabled(true) + .setCloseOnPressedEscape(true) + .setBackgroundClickType(Option.BackgroundClickType.CLOSE_MODAL) + .setOpacity(0.7f); + +// Set position and behavior +option.getLayoutOption() + .setLocation(Location.CENTER, Location.CENTER) + .setMovable(true); + +// Show modal with custom options +ModalDialog.showModal(parentComponent, modal, option, "modal-id"); +``` + +#### Nested Modals + +```java +ModalDialog.showModal(this, new SimpleModalBorder( + content, "Main Modal", SimpleModalBorder.YES_NO_CANCEL_OPTION, + (controller, action) -> { + if (action == SimpleModalBorder.YES_OPTION) { + // Show another modal + ModalDialog.pushModal(new SimpleModalBorder( + new JLabel("Nested Content"), + "Nested Modal", + SimpleModalBorder.OK_OPTION, + null + ), "nested-modal"); + } + } +), "main-modal"); +``` + +### Toast Notifications + +Toast notifications are transient messages that appear briefly to provide feedback to users. + +#### Basic Toast + +```java +import raven.modal.Toast; +import raven.modal.toast.option.ToastStyle; + +// Simple toast message +Toast.show(this, "Operation completed successfully!"); +``` + +#### Styled Toast + +```java +import raven.modal.toast.option.ToastOption; + +// Create toast with custom options +ToastOption option = Toast.createOption() + .setToastStyle(ToastStyle.SUCCESS) + .setLocation(ToastLocation.TOP_CENTER) + .setAutoClose(true) + .setDuration(3000); + +Toast.show(this, "Data saved successfully!", option); +``` + +#### Custom Toast Content + +```java +import raven.modal.toast.ToastCustom; + +// Custom toast with panel content +JPanel customContent = new JPanel(); +customContent.add(new JLabel("Custom content with buttons")); + +ToastCustom.show(this, customContent, ToastLocation.BOTTOM_RIGHT); +``` + +### Drawer Navigation + +Drawers provide slide-in panels for navigation or additional content. + +#### Simple Drawer + +```java +import raven.modal.drawer.DrawerPanel; +import raven.modal.drawer.SimpleDrawerBuilder; +import raven.modal.drawer.menu.MenuItem; +import java.awt.Color; + +SimpleDrawerBuilder drawerBuilder = new SimpleDrawerBuilder() { + @Override + public void build(DrawerPanel drawerPanel) { + // Create menu items + drawerPanel.addMenu(createMenuItems()); + } + + private MenuItem[] createMenuItems() { + return new MenuItem[]{ + new MenuItem("Dashboard", () -> System.out.println("Dashboard clicked")), + new MenuItem("Settings", () -> System.out.println("Settings clicked")), + new MenuItem("Profile", () -> System.out.println("Profile clicked")) + }; + } +}; + +// Add drawer to frame (assuming you have a JFrame) +DrawerPanel.addDrawer(frame, drawerBuilder); +``` + +#### Advanced Drawer with Custom Styling + +```java +SimpleDrawerBuilder drawerBuilder = new SimpleDrawerBuilder() { + @Override + public void build(DrawerPanel drawerPanel) { + // Set header + drawerPanel.setHeader(createHeader()); + + // Create menu with icons + drawerPanel.addMenu(createStyledMenuItems()); + } + + private Component createHeader() { + JPanel header = new JPanel(new BorderLayout()); + header.add(new JLabel("My Application"), BorderLayout.WEST); + header.setBackground(Color.GRAY); + return header; + } +}; +``` + +### Configuration Options + +#### Modal Options + +```java +Option option = ModalDialog.createOption(); + +// Animation settings +option.setAnimationEnabled(true); + +// Behavior settings +option.setCloseOnPressedEscape(true); +option.setBackgroundClickType(Option.BackgroundClickType.CLOSE_MODAL); + +// Visual settings +option.setOpacity(0.8f); +option.setHeavyWeight(false); // Use heavyweight window for better integration + +// Border and shadow +option.getBorderOption() + .setBorderWidth(1) + .setShadow(BorderOption.Shadow.MEDIUM); + +// Positioning +option.getLayoutOption() + .setLocation(Location.CENTER, Location.CENTER) + .setRelativeToOwner(true) + .setMovable(true) + .setAnimateScale(0.1f); +``` + +#### Toast Options + +```java +ToastOption toastOption = Toast.createOption(); + +// Style configuration +toastOption.setToastStyle(ToastStyle.INFO); +toastOption.setLocation(ToastLocation.TOP_RIGHT); + +// Timing +toastOption.setAutoClose(true); +toastOption.setDuration(5000); + +// Animation +toastOption.setAnimationEnabled(true); +``` + +### Event Handling + +#### Modal Events + +```java +ModalDialog.showModal(this, new SimpleModalBorder( + content, + "Title", + SimpleModalBorder.YES_NO_CANCEL_OPTION, + (controller, action) -> { + switch (action) { + case SimpleModalBorder.OPENED: + // Modal is opened + break; + case SimpleModalBorder.YES_OPTION: + // User clicked YES + break; + case SimpleModalBorder.NO_OPTION: + // User clicked NO + break; + case SimpleModalBorder.CANCEL_OPTION: + // User clicked CANCEL or closed modal + break; + } + + // Consume the event to prevent modal from closing + if (needValidation) { + controller.consume(); + } + } +)); +``` + +#### Toast Events + +```java +ToastOption option = Toast.createOption() + .setCallback(new ToastCallback() { + @Override + public void onToastAction(ToastEvent evt) { + switch (evt.getAction()) { + case ToastEvent.SHOWN: + // Toast is shown + break; + case ToastEvent.DISMISSED: + // Toast was dismissed + break; + case ToastEvent.ACTION_PERFORMED: + // User clicked on toast + break; + } + } + }); +``` + +### Best Practices + +1. **Modal Dialogs:** + - Use modals for important actions that require user confirmation + - Keep modal content concise and focused + - Provide clear action buttons (YES/NO/CANCEL) + - Use appropriate positioning and sizing + +2. **Toast Notifications:** + - Use for non-critical feedback messages + - Keep messages short and clear + - Don't show too many toasts simultaneously + - Use appropriate styles (success, warning, error) + +3. **Drawers:** + - Use for navigation or secondary content + - Keep menu items concise and well-organized + - Consider responsive behavior for different screen sizes + - Provide clear visual hierarchy + +4. **Performance:** + - Reuse modal instances when possible + - Clean up resources when modals are closed + - Use lightweight options for better performance + - Consider heavyweight windows for complex modals + +### Component Reference + +#### Key Classes + +- `ModalDialog` - Main class for modal dialogs +- `Toast` - Main class for toast notifications +- `DrawerPanel` - Main class for drawer navigation +- `Option` - Configuration options for modals +- `ToastOption` - Configuration options for toasts +- `SimpleModalBorder` - Pre-built modal border component +- `SimpleDrawerBuilder` - Builder for simple drawer implementations + +#### Enums and Types + +- `Location` - Positioning options (LEFT, CENTER, RIGHT, TOP, BOTTOM, etc.) +- `ToastStyle` - Toast styles (SUCCESS, WARNING, ERROR, INFO) +- `ToastLocation` - Toast display positions +- `SimpleModalBorder` - Pre-built modal options ## Library Resources diff --git a/demo/src/main/java/raven/modal/demo/forms/FormModal.java b/demo/src/main/java/raven/modal/demo/forms/FormModal.java index 2e74ec1..9a4908e 100644 --- a/demo/src/main/java/raven/modal/demo/forms/FormModal.java +++ b/demo/src/main/java/raven/modal/demo/forms/FormModal.java @@ -254,7 +254,7 @@ private void showModalSlide(Option option) { c1.consume(); if (country != null) { simpleInputForms.newCountryCreated(country); - ModalDialog.popModel(id); + ModalDialog.popModal(id); } } }), id); diff --git a/demo/src/main/java/raven/modal/demo/forms/FormTable.java b/demo/src/main/java/raven/modal/demo/forms/FormTable.java index a2ed0d2..ee0c9fd 100644 --- a/demo/src/main/java/raven/modal/demo/forms/FormTable.java +++ b/demo/src/main/java/raven/modal/demo/forms/FormTable.java @@ -51,7 +51,8 @@ public void formInit() { formRefresh(); } catch (IOException e) { - System.err.println(e.getMessage()); + // Handle IOException gracefully - could be used for debugging + // e.printStackTrace(); // Uncomment for debugging } } diff --git a/demo/src/main/java/raven/modal/demo/forms/FormToast.java b/demo/src/main/java/raven/modal/demo/forms/FormToast.java index 516c6b9..e97f374 100644 --- a/demo/src/main/java/raven/modal/demo/forms/FormToast.java +++ b/demo/src/main/java/raven/modal/demo/forms/FormToast.java @@ -278,7 +278,8 @@ public void execute(PromiseCallback callback) { callback.done(Toast.Type.DEFAULT, "Promise has done with default"); } } catch (InterruptedException e) { - e.printStackTrace(); + // Thread was interrupted, handle gracefully + Thread.currentThread().interrupt(); // Restore interrupt status } } }; diff --git a/demo/src/main/java/raven/modal/demo/menu/MyDrawerBuilder.java b/demo/src/main/java/raven/modal/demo/menu/MyDrawerBuilder.java index f32ade6..0f78fc2 100644 --- a/demo/src/main/java/raven/modal/demo/menu/MyDrawerBuilder.java +++ b/demo/src/main/java/raven/modal/demo/menu/MyDrawerBuilder.java @@ -197,7 +197,7 @@ public void styleMenu(JComponent component) { simpleMenuOption.addMenuEvent(new MenuEvent() { @Override public void selected(MenuAction action, int[] index) { - System.out.println("Drawer menu selected " + Arrays.toString(index)); + // Menu selected: " + Arrays.toString(index) + " (debug info removed) Class itemClass = action.getItem().getItemClass(); int i = index[0]; if (i == 9) { diff --git a/demo/src/test/java/test/Test.java b/demo/src/test/java/test/Test.java index 3a4ded8..02a6cd0 100644 --- a/demo/src/test/java/test/Test.java +++ b/demo/src/test/java/test/Test.java @@ -29,17 +29,17 @@ public Test() { button.addActionListener(e -> { SimpleInputForms simpleInputForms = new SimpleInputForms(); ModalDialog.showModal(this, new SimpleModalBorder(simpleInputForms, "Input", SimpleModalBorder.YES_NO_OPTION, (controller, action) -> { - System.out.println("Action: " + action); + // DEBUG: Action = " + action + " if (action == SimpleModalBorder.OPENED) { simpleInputForms.formOpen(); - System.out.println("Form-1 OPENED"); + // DEBUG: Form-1 opened successfully } else if (action == SimpleModalBorder.YES_OPTION) { controller.consume(); SimpleInputForms2 simpleInputForms2 = new SimpleInputForms2(); ModalDialog.pushModal(new SimpleModalBorder(simpleInputForms2, "New Input", SimpleModalBorder.YES_NO_OPTION, (controller1, action1) -> { if (action1 == SimpleModalBorder.OPENED) { simpleInputForms2.formOpen(); - System.out.println("Form-2 OPENED"); + // DEBUG: Form-2 opened successfully } }), "input"); } diff --git a/demo/src/test/java/test/TestForm.java b/demo/src/test/java/test/TestForm.java index ebd7e75..486562b 100644 --- a/demo/src/test/java/test/TestForm.java +++ b/demo/src/test/java/test/TestForm.java @@ -54,7 +54,8 @@ public void execute(PromiseCallback callback) { Thread.sleep(2000); callback.done(Toast.Type.SUCCESS, "HI"); } catch (Exception e) { - e.printStackTrace(); + // Handle exception gracefully in test environment + // e.printStackTrace(); // Uncomment for debugging } } diff --git a/demo/src/test/java/test/TestModal.java b/demo/src/test/java/test/TestModal.java index b21adf4..3c8e2f6 100644 --- a/demo/src/test/java/test/TestModal.java +++ b/demo/src/test/java/test/TestModal.java @@ -98,7 +98,7 @@ private void showCustomModal(Component com, SimpleMessageModal.Type type) { "\nor simply had a good time relaxing, I'd love to hear about it." + "\nIt's always great to catch up and share our experiences."; ModalDialog.showModal(com, new SimpleMessageModal(type, message, "This is a modal custom message", SimpleModalBorder.YES_NO_OPTION, (controller, action) -> { - System.out.println("Action: " + action); + // DEBUG: Modal action = " + action + " }), option, "modal_id"); } diff --git a/demo/src/test/java/test/validation/ValidationDrawerBuilder.java b/demo/src/test/java/test/validation/ValidationDrawerBuilder.java index c758dfd..81f2347 100644 --- a/demo/src/test/java/test/validation/ValidationDrawerBuilder.java +++ b/demo/src/test/java/test/validation/ValidationDrawerBuilder.java @@ -200,7 +200,7 @@ public void styleMenu(JComponent component) { simpleMenuOption.addMenuEvent(new MenuEvent() { @Override public void selected(MenuAction action, int[] index) { - System.out.println("Drawer menu selected " + Arrays.toString(index)); + // DEBUG: Drawer menu selected " + Arrays.toString(index) + " (removed for cleaner output) } }); diff --git a/modal-dialog/src/main/java/raven/modal/ModalDialog.java b/modal-dialog/src/main/java/raven/modal/ModalDialog.java index ed36111..f42e065 100644 --- a/modal-dialog/src/main/java/raven/modal/ModalDialog.java +++ b/modal-dialog/src/main/java/raven/modal/ModalDialog.java @@ -64,7 +64,7 @@ public static void pushModal(Modal modal, String id) { getInstance().getModalContainerById(id).pushModal(modal, id); } - public static void popModel(String id) { + public static void popModal(String id) { getInstance().getModalContainerById(id).popModal(id); }