package net.wotonomy.test; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JFrame; import net.wotonomy.control.ChildDataSource; import net.wotonomy.control.EODataSource; import net.wotonomy.control.PropertyDataSource; import net.wotonomy.foundation.NSArray; import net.wotonomy.ui.EOAssociation; import net.wotonomy.ui.EODisplayGroup; import net.wotonomy.ui.MasterDetailAssociation; import net.wotonomy.ui.swing.DisplayGroupActionAssociation; import net.wotonomy.ui.swing.ListAssociation; import net.wotonomy.ui.swing.RadioPanelAssociation; import net.wotonomy.ui.swing.TextAssociation; import net.wotonomy.ui.swing.components.ButtonPanel; import net.wotonomy.ui.swing.util.WindowUtilities; /** * A simple editor panel with a few textfields. */ public class EditController { EODisplayGroup group; JDialog dialog; public EditController( EODataSource aDataSource ) { EditPanel editPanel = new EditPanel(); editPanel.infoPanel.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createRaisedBevelBorder(), BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) ) ); editPanel.setBorder( BorderFactory.createEmptyBorder( 0, 0, 0, 0 ) ); ButtonPanel okPanel = new ButtonPanel( new String[] { "Revert", "Refault", "Refresh", "Commit" } ); editPanel.add( okPanel, BorderLayout.SOUTH ); group = new EODisplayGroup(); group.setDataSource( aDataSource ); group.fetch(); group.selectNext(); // text associations EOAssociation ta; ta = new TextAssociation( editPanel.firstNameField ); ta.bindAspect( EOAssociation.ValueAspect, group, "firstName" ); ta.establishConnection(); ta = new TextAssociation( editPanel.middleNameField ); ta.bindAspect( EOAssociation.ValueAspect, group, "middleName" ); ta.establishConnection(); ta = new TextAssociation( editPanel.lastNameField ); ta.bindAspect( EOAssociation.ValueAspect, group, "lastName" ); ta.establishConnection(); // radio panels ta = new RadioPanelAssociation( editPanel.yearRadioPanel ); ta.bindAspect( EOAssociation.ValueAspect, group, "createDate.year" ); EODisplayGroup yearTitles = new EODisplayGroup(); yearTitles.setObjectArray( new NSArray( new Object[] { "1999", "2000", "2001" } ) ); ta.bindAspect( EOAssociation.TitlesAspect, yearTitles, "" ); EODisplayGroup yearObjects = new EODisplayGroup(); yearObjects.setObjectArray( new NSArray( new Object[] { new Integer( 99 ), new Integer( 100 ), new Integer( 101 ) } ) ); ta.bindAspect( EOAssociation.ObjectsAspect, yearObjects, "" ); ta.establishConnection(); // detail group final EODisplayGroup detailGroup = new EODisplayGroup(); detailGroup.setDataSource( new PropertyDataSource( aDataSource.editingContext(), TestObject.class ) ); ta = new MasterDetailAssociation( detailGroup ); ta.bindAspect( EOAssociation.ParentAspect, group, "childList" ); ta.establishConnection(); ta = new ListAssociation( editPanel.list ); ta.bindAspect( EOAssociation.TitlesAspect, detailGroup, "fullName" ); ta.establishConnection(); // display group action associations AbstractButton button = (AbstractButton) editPanel.addPanel.getButton( "Add" ); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { detailGroup.insertNewObjectAtIndex( 0 ); } } ); ta = new DisplayGroupActionAssociation( editPanel.addPanel.getButton( "Remove" ) ); ta.bindAspect( EOAssociation.ActionAspect, detailGroup, "deleteSelection" ); ta.establishConnection(); // ok / cancel buttons button = (AbstractButton) okPanel.getButton( "Commit" ); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { group.dataSource().editingContext().saveChanges(); } } ); button = (AbstractButton) okPanel.getButton( "Refresh" ); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { group.dataSource().editingContext().invalidateAllObjects(); } } ); button = (AbstractButton) okPanel.getButton( "Refault" ); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { /* Object o = group.displayedObjects().objectAtIndex( 0 ); group.dataSource().editingContext().refaultObject( o, group.dataSource().editingContext().globalIDForObject( o ), group.dataSource().editingContext() ); */ group.dataSource().editingContext().revert(); group.dataSource().editingContext().refaultObjects(); } } ); button = (AbstractButton) okPanel.getButton( "Revert" ); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { group.dataSource().editingContext().revert(); } } ); // add mouse listener for list editPanel.list.addMouseListener( new MouseAdapter() { public void mouseClicked(MouseEvent e) { if ( e.getClickCount() == 2 ) { Object item = detailGroup.selectedObject(); if ( item != null ) { // new InspectorController( item ); new EditController( new ChildDataSource( group.dataSource(), item ) ); } } } }); // launch dialog = new JDialog(); // add WindowListener for frame dialog.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE ); dialog.getContentPane().add( editPanel ); dialog.setTitle( "Edit Panel" ); dialog.pack(); // dialog.setSize( 300, dialog.getSize().height ); WindowUtilities.cascade( dialog ); dialog.show(); // workaround for memory issues on jdk1.2.2 dialog.addWindowListener( new WindowAdapter() { // exit on close public void windowClosing(WindowEvent e) { ((JDialog)e.getWindow()).getContentPane().removeAll(); } }); } }