All source files live under src/main/java/com/gso/datahelper/. The project is divided into three packages: editor, ui, and util.

Directory Tree

GSO-Data-Helper/
β”œβ”€β”€ src/main/java/com/gso/datahelper/
β”‚   β”œβ”€β”€ GSODataHelper.java              Entry point β€” launches MainWindow
β”‚   β”œβ”€β”€ editor/
β”‚   β”‚   β”œβ”€β”€ Saveable.java               Interface: save()
β”‚   β”‚   β”œβ”€β”€ Undoable.java               Interface: undo/redo/canUndo/canRedo
β”‚   β”‚   β”œβ”€β”€ PackBrowserEditor.java      Open Pack tab
β”‚   β”‚   β”œβ”€β”€ ManifestEditor.java         Manifest tab
β”‚   β”‚   β”œβ”€β”€ MaterialEditor.java         Materials tab
β”‚   β”‚   β”œβ”€β”€ EquipmentEditor.java        Equipment tab
β”‚   β”‚   β”œβ”€β”€ RecipeEditor.java           Recipes tab
β”‚   β”‚   β”œβ”€β”€ SkillEditor.java            Skills tab
β”‚   β”‚   β”œβ”€β”€ EnemyEditor.java            Enemies tab
β”‚   β”‚   β”œβ”€β”€ RoomEditor.java             Rooms tab
β”‚   β”‚   β”œβ”€β”€ DungeonEditor.java          Dungeons tab
β”‚   β”‚   β”œβ”€β”€ QuestEditor.java            Quests tab
β”‚   β”‚   └── LanguageEditor.java         Languages tab
β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”œβ”€β”€ MainWindow.java             Sidebar nav, CardLayout, menu bar, theme toggle
β”‚   β”‚   β”œβ”€β”€ StyledComponents.java       Reusable themed widgets
β”‚   β”‚   └── TexturePickerPanel.java     Thumbnail + browse + copy-to-assets
β”‚   └── util/
β”‚       β”œβ”€β”€ ThemeManager.java           Dark/light palette + full repaint
β”‚       β”œβ”€β”€ JsonUtil.java               Zero-dependency JSON builder
β”‚       β”œβ”€β”€ JsonParser.java             Zero-dependency recursive JSON parser
β”‚       β”œβ”€β”€ FileUtil.java               Save dialogs, directory helpers
β”‚       β”œβ”€β”€ PackContext.java            Shared pack name singleton
β”‚       β”œβ”€β”€ DynamicOptions.java         Live-updating combo box ID lists
β”‚       β”œβ”€β”€ LangRegistry.java           Language key registry + multi-lang sync
β”‚       └── EditorHistory.java          Per-editor undo/redo stack
β”œβ”€β”€ build-windows.bat
β”œβ”€β”€ build-linux-mac.sh
β”œβ”€β”€ run-windows.bat
β”œβ”€β”€ run-linux-mac.sh
└── README.md

Package Responsibilities

editor/

Contains all 11 editor panels plus the two interfaces they implement.

FileResponsibility
SaveableInterface with a single save() method. All editors implement it so MainWindow can route Ctrl+S to whichever editor is visible.
UndoableInterface with undo(), redo(), canUndo(), canRedo(). All editors implement it for consistent undo/redo support.
PackBrowserEditorFile-tree view. Detects JSON root key on click and dispatches to the correct editor.
ManifestEditorWrites manifest.json. Sets PackContext pack name on save.
All other editorsEach manages one content type. Reads from PackContext and DynamicOptions; writes to DynamicOptions and LangRegistry on save.

ui/

FileResponsibility
MainWindowTop-level JFrame. Owns the left sidebar nav buttons, the CardLayout that switches between editors, the menu bar (File, Edit, View), and the theme toggle. Routes Ctrl+S to the active Saveable.
StyledComponentsFactory for themed Swing widgets β€” buttons, labels, text fields, combo boxes, spinners β€” all pre-styled to match the current theme.
TexturePickerPanelComposite widget used by Materials and Equipment editors. Contains a thumbnail display, a browse button, and the logic to copy the chosen image to assets/textures/.

util/

FileResponsibility
ThemeManagerHolds the dark and light colour palettes. Applies them to the full component tree on toggle using role-based colour classification.
JsonUtilBuilds JSON strings from Java data structures with no external libraries.
JsonParserParses JSON strings into Java maps and lists recursively, with no external libraries.
FileUtilHelpers for the save dialog (pre-fill filename, remember last directory), directory creation, and file reading/writing.
PackContextSingleton that holds the current pack name. Editors read from it; ManifestEditor writes to it on save.
DynamicOptionsManages lists of skill IDs, material IDs, and enemy IDs. Editors subscribe as listeners and are notified when a list changes.
LangRegistryGlobal set of translation keys. Editors push keys on save; LanguageEditor reads from it for Collect and Retro-fill. Notifies open language editors of new keys in real time.
EditorHistoryA per-editor bounded stack (max 100 entries) of JSON snapshots. Supports undo and redo by restoring prior snapshots.