// now a concept to allow for persistence of selected item abstract concept G22CRUDAndDetailPanel extends Concept { new Ref selected; CollapsibleNorthPanel collapsiblePanel = new(true); transient settable G22Utils g22utils; transient gettable SimpleCRUD_v2 crud; transient SingleComponentPanel scpDetail; abstract SimpleCRUD_v2 makeCRUD(); // a is not null abstract JComponent makeDetailView(A a); cachedVisualize { crud = makeCRUD(); scpDetail = singleComponentPanel(emptyDetailView()); selectAfterUpdate(selected!); var crudVis = crud.visualize(); crudVisualized(); crud.onSelectionChanged(-> { var selected = crud.selected(); this.selected.set(selected); if (selected == null) scpDetail.set(emptyDetailView()); else { var view = makeDetailView(selected); var lvTitle = liveValue_hasChangeListeners( selected, -> crud.entityName() + " " + selected.id + ": " + selected); scpDetail.set(jCenteredRaisedBoldLiveValueSection(lvTitle, view)); } }); /*ret jvsplit( jCenteredSection(crud.entityNamePlural(), crudVis), scpDetail);*/ collapsiblePanel.init( crud.entityName() + " List", jCenteredSection(crud.entityNamePlural(), crudVis), scpDetail); ret collapsiblePanel.visualize(); } JComponent emptyDetailView() { ret jGazelleLogo(); } // override me void crudVisualized {} void addCountToEnclosingTab(bool b) { crud.addCountToEnclosingTab(b); } void updateCount { crud.update(); } void edit(A A) { crud.setSelected(A); } void setSelected(A A) { crud.setSelected(A); } void selectAfterUpdate(A A) { crud.selectAfterUpdate(A); } }