package com.cedarsoft.spring.rcp.forms;
import com.cedarsoft.spring.SpringSupport;
import com.jgoodies.forms.factories.Borders;
import org.jetbrains.annotations.NotNull;
import org.springframework.richclient.application.event.LifecycleApplicationEvent;
import org.springframework.richclient.command.ActionCommand;
import org.springframework.richclient.command.CommandGroup;
import org.springframework.richclient.core.UIConstants;
import org.springframework.richclient.factory.ControlFactory;
import org.springframework.richclient.form.FormGuard;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import java.awt.BorderLayout;
/**
* Creates a panel with a from that can be added to a view.
*
* @param <T> the type
*/
public class FormPage<T> implements ControlFactory {
@NotNull
private final FormUi<? extends T> formUi;
@NotNull
private final ActionCommand finishCommand = new ActionCommand( "okCommand" ) {
@Override
protected void doExecuteCommand() {
commit();
}
};
@NotNull
private final ActionCommand revertCommand = new ActionCommand( "revertCommand" ) {
@Override
protected void doExecuteCommand() {
formUi.revert();
}
};
private final boolean addScrollPane;
/**
* Creates a new form page
*
* @param formUi the form ui support
*/
public FormPage( @NotNull FormUi<? extends T> formUi ) {
this( formUi, true );
}
public FormPage( @NotNull FormUi<? extends T> formUi, boolean addScrollPane ) {
this.formUi = formUi;
this.addScrollPane = addScrollPane;
}
protected void commit() {
formUi.commit();
SpringSupport.INSTANCE.getApplicationContext().publishEvent( new LifecycleApplicationEvent( LifecycleApplicationEvent.MODIFIED, formUi.getFormObject() ) ); //todo notifying necessary???
}
@Override
public JComponent getControl() {
ExtendedForm<? extends T> form = formUi.getForm();
form.addGuarded( finishCommand, FormGuard.LIKE_COMMITCOMMAND );
form.addGuarded( revertCommand, FormGuard.LIKE_REVERTCOMMAND );
JPanel panel = new JPanel( new BorderLayout( UIConstants.ONE_SPACE, UIConstants.ONE_SPACE ) );
panel.add( form.getControl(), BorderLayout.CENTER );
panel.add( createButtonBar(), BorderLayout.SOUTH );
if ( addScrollPane ) {
JScrollPane scrollPane = SpringSupport.INSTANCE.getComponentFactory().createScrollPane( panel );
scrollPane.setViewportBorder( Borders.DLU7_BORDER );
return scrollPane;
} else {
return panel;
}
}
@NotNull
private JComponent createButtonBar() {
CommandGroup group = CommandGroup.createCommandGroup( null, new Object[]{revertCommand, finishCommand} );
return group.createButtonBar( null, Borders.EMPTY_BORDER );
}
}