I ran it successfully on macOS 26.4.1 with Java 21.0.1 and poked around. It
looks good to me!

The one UI annoyance I have had with modeler is that the DB Type is
unreadable for the selected row since the text is the same color as the
background.

[image: Screenshot 2026-05-06 at 1.14.43 PM.png]

On Wed, May 6, 2026 at 10:01 AM Andrus Adamchik <[email protected]> wrote:

> I am mostly done with the massive refactoring effort. So I guess I can
> finally start looking at the MCP task.
>
> There's definitely more code to clean up, but it is fairly well isolated.
> At the top level, I think the structure is solid. The main changes:
>
> 1. Abandoned the idea of separating controllers from Swing components and
> treating components as mere "views". It only took us 20 years to give up
> fighting the framework :) Vanilla Swing components are this old-school
> beautiful OO: deep inheritance hierarchies (something frowned upon these
> days), easily composable, cleanly encapsulated. Web development is all
> stateless processors, so stateful component-based OO design is a lost art
> in Java.
>
> 2. All the Modeler state is stored in two classes - Application and
> ProjectSession. Common component superclasses are created to pass those two
> around the hierarchy (so there's AppPanel, AppDialog, ProjectPanel,
> ProjectDialog, etc. classes.) Make sure you use them when creating new
> components. On a side note, the use of DI in the Modeler is completely
> alien and is getting in the way. Have to keep it only for the purpose of
> overriding defaults from cayenne, cayenne-project and cayenne-dbimport (I'd
> rather we use builders in those instead of DI).
>
> 3. Fixed preferences mess. There's a single "repository" to map prefs
> locations (PreferencesRepository), and a bunch of highly custom
> PreferenceAdapters. Very easy to create new preferences (and hence capture
> more user selections, component sizes etc.) Feature wise:
>
> * A 5.0-specific preference tree root, so that we don't pollute common JVM
> preferences namespace
> * Auto-migrations of most existing preferences to the new root
> * GUI for preferences export as JSON
> * GUI for resetting preferences back to defaults (with or without 4.x
> re-migration)
>
> (still a few issues remain around renaming DataMaps and projects...
> working on those)
>
> 4. Small UI fixes: clean window resizing behavior, borders around editable
> table fields, etc. Haven't done FlatLaf yet.
>
> 5. Proper event hierarchies (clean immutable events); removed project
> events from the core.
>
> 6. Logging console - still ugly, but consistent and functional.
>
> I have a request for the community - before we make an M2 release, could
> you create a local Modeler build and take it for a spin? Due to the sheer
> volume of changes, there may be some regressions. If you see anything
> broken, please open a Jira and assign to me.
>
> Thanks,
> Andrus
>
>
> > On Apr 20, 2026, at 10:23 AM, Andrus Adamchik <[email protected]>
> wrote:
> >
> > So I feel like the advent of agentic coding opens up new possibilities
> for CayenneModeler. While some want you to think you can simply prompt
> Claude to "Rewrite CayenneModeler in JavaFX" (or Electron or JetBrains
> Compose Multiplatform), still with our limited resources, building and
> supporting an entirely new thing is realistically out of reach.
> >
> > But I think we can take the current Swing app to a new level by
> augmenting our rusty Swing skills with AI. A few of my experiments adding
> this or that UI piece were mostly successful. A few idea on top of my mind:
> >
> > 1. A built-in MCP server for DB Import and CGen. This is to close the
> loop on agentic coding, allowing to use both of these tools from an agent
> CLI. (The MCP idea was what prompted me to look into this to begin with)
> > 2. Fix table editors UX (selections conflicting with cell editors)
> > 3. Write unit tests
> > 4. Modernizing L&F. Not sure how far we can get while staying in Swing,
> but worth a try. Looking at FlatLaf lib, which is a successor of JGoodies
> that we already use
> > 5. Implement dozens of small usability features (such as showing
> currently selected Obj|DbEntity in tab view headers, etc.)
> >
> > My first pass (about 70% done) was not anything visual, but rather
> refactoring the existing messy code to rid it of various architectural
> experiments accumulated over the years (such as auto-bindings) and unifying
> the MVC structure to be as close as possible to vanilla Swing. Ironically,
> Claude was not that helpful in this process. It was good old IDE
> refactoring, manually going through hundreds of files chasing dead code and
> inconsistencies.
> >
> > Anyways, just putting this on the radar.
> >
> > Andrus
>
>

Reply via email to