From: <jg...@us...> - 2006-10-09 14:27:56
|
Revision: 82 http://svn.sourceforge.net/surveyforge/?rev=82&view=rev Author: jgongo Date: 2006-10-09 07:27:32 -0700 (Mon, 09 Oct 2006) Log Message: ----------- Initial support for saving and browsing samples Issue: 1570024 Modified Paths: -------------- trunk/surveyforge-runner/pom.xml trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunner.java Added Paths: ----------- trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Controller.java trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Frame.java trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/RunnerResourceBundle.java Removed Paths: ------------- trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireFrame.java trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunnerController.java trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunnerResourceBundle.java trunk/surveyforge-runner/src/main/resources/jlfgr-1_0.jar trunk/surveyforge-runner/src/main/resources/org/ Modified: trunk/surveyforge-runner/pom.xml =================================================================== --- trunk/surveyforge-runner/pom.xml 2006-10-09 14:25:26 UTC (rev 81) +++ trunk/surveyforge-runner/pom.xml 2006-10-09 14:27:32 UTC (rev 82) @@ -80,6 +80,10 @@ <artifactId>openinput-tools-swing</artifactId> </dependency> <dependency> + <groupId>org.tango-project</groupId> + <artifactId>tango-icon-theme</artifactId> + </dependency> + <dependency> <groupId>com.jgoodies</groupId> <artifactId>looks</artifactId> </dependency> Copied: trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Controller.java (from rev 78, trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunnerController.java) =================================================================== --- trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Controller.java (rev 0) +++ trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Controller.java 2006-10-09 14:27:32 UTC (rev 82) @@ -0,0 +1,549 @@ +/* + * surveyforge-runner - Copyright (C) 2006 OPEN input - http://www.openinput.com/ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to + * the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + * + * $Id$ + */ +package org.surveyforge.runner; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.Serializable; +import java.text.ParseException; +import java.util.HashMap; +import java.util.Map; +import java.util.ResourceBundle; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.Icon; +import javax.swing.InputVerifier; +import javax.swing.JComponent; +import javax.swing.JFormattedTextField; +import javax.swing.JOptionPane; +import javax.swing.JFormattedTextField.AbstractFormatter; +import javax.swing.text.JTextComponent; + +import org.surveyforge.core.data.ObjectData; +import org.surveyforge.core.data.RegisterData; +import org.surveyforge.core.metadata.ValueDomain; +import org.surveyforge.core.survey.Questionnaire; +import org.surveyforge.core.survey.QuestionnaireElement; +import org.surveyforge.util.beans.Observable; + +import com.openinput.tools.swing.ArrayActionMap; +import com.openinput.tools.swing.ResourceBundleBackedAction; + +/** + * @author jgonzalez + */ +@Observable +public class Controller + { + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle( "org.surveyforge.runner.RunnerResourceBundle" ); + + public static final String MODIFIED_SAMPLE_DIALOG = "org.surveyforge.runner.Controller.modifiedSampleDialog"; + + public static final String NEW_SAMPLE_ACTION_NAME = "org.surveyforge.runner.Controller.newSampleAction"; + public static final String SAVE_SAMPLE_ACTION_NAME = "org.surveyforge.runner.Controller.saveSampleAction"; + + public static final String FIRST_SAMPLE_ACTION_NAME = "org.surveyforge.runner.Controller.firstSampleAction"; + public static final String LAST_SAMPLE_ACTION_NAME = "org.surveyforge.runner.Controller.lastSampleAction"; + public static final String NEXT_SAMPLE_ACTION_NAME = "org.surveyforge.runner.Controller.nextSampleAction"; + public static final String PREVIOUS_SAMPLE_ACTION_NAME = "org.surveyforge.runner.Controller.proviousSampleAction"; + + private Action[] supportedActionsArray; + private ActionMap supportedActions; + + private ValidationController validationController = new Controller.ValidationController( ); + private SelectionController selectionController = new Controller.SelectionController( ); + private RoutingController routingController = new Controller.RoutingController( ); + + private EntityManager entityManager; + private Frame frame; + private Questionnaire questionnaire; + private int currentSampleIndex; + + private Map<QuestionnaireElement, JComponent> elementToComponentMap; + private Map<JComponent, QuestionnaireElement> componentToElementMap; + + + public Controller( EntityManager entityManager, Frame frame ) + { + this.entityManager = entityManager; + this.frame = frame; + this.questionnaire = this.frame.getQuestionnaire( ); + + this.elementToComponentMap = this.frame.getElementToComponentMap( ); + this.componentToElementMap = this.frame.getComponentToElementMap( ); + + this.supportedActionsArray = new Action[] {new Controller.NewSampleAction( ), new Controller.SaveSampleAction( ), + new Controller.FirstSampleAction( ), new Controller.PreviousSampleAction( ), new Controller.NextSampleAction( ), + new Controller.LastSampleAction( )}; + this.supportedActions = new ArrayActionMap( this.supportedActionsArray ); + } + + public ActionMap getActions( ) + { + return this.supportedActions; + } + + public InputVerifier getValidationController( ) + { + return this.validationController; + } + + public FocusListener getSelectionController( ) + { + return this.selectionController; + } + + public ActionListener getRoutingController( ) + { + return this.routingController; + } + + public int getCurrentSampleIndex( ) + { + return this.currentSampleIndex; + } + + public void setCurrentSampleIndex( int currentSampleIndex ) + { + RegisterData registerData = this.questionnaire.getRegister( ).getRegisterData( ); + this.entityManager.refresh( registerData ); + if( currentSampleIndex != registerData.getObjectData( ).size( ) ) + this.frame.setObjectData( registerData.getObjectData( ).get( currentSampleIndex ) ); + this.currentSampleIndex = currentSampleIndex; + } + + /** + * @return <code>true</code> if the calling operation may go on, <code>false</code> otherwise. + */ + private boolean savePossiblyModifiedSample( ) throws RuntimeException + { + String questionTitle = RESOURCE_BUNDLE.getString( MODIFIED_SAMPLE_DIALOG + ".question.title" ); + String questionMessage = RESOURCE_BUNDLE.getString( MODIFIED_SAMPLE_DIALOG + ".question.message" ); + Object[] options = {RESOURCE_BUNDLE.getString( MODIFIED_SAMPLE_DIALOG + ".button.yes" ), + RESOURCE_BUNDLE.getString( MODIFIED_SAMPLE_DIALOG + ".button.no" ), + RESOURCE_BUNDLE.getString( MODIFIED_SAMPLE_DIALOG + ".button.cancel" )}; + + boolean sampleChanged = Controller.this.frame.getDataModel( ).isChanged( ); + int selectedOption; + if( sampleChanged ) + { + selectedOption = JOptionPane.showOptionDialog( Controller.this.frame, questionMessage, questionTitle, + JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, (Icon) Controller.RESOURCE_BUNDLE + .getObject( "icon.dialog.warning" ), options, options[2] ); + } + else + selectedOption = 1; + + switch( selectedOption ) + { + case 0: + ActionMap actions = Controller.this.getActions( ); + SaveSampleAction saveSampleAction = (SaveSampleAction) actions.get( Controller.SAVE_SAMPLE_ACTION_NAME ); + saveSampleAction.saveSample( ); + return true; + + case 1: + ObjectData objectData = Controller.this.frame.getObjectData( ); + if( sampleChanged && objectData.getRegisterData( ) != null ) + { + Controller.this.entityManager.refresh( objectData ); + Controller.this.frame.setObjectData( objectData ); + } + return true; + + default: + return false; + } + } + + /** + * @author jgonzalez + */ + class NewSampleAction extends ResourceBundleBackedAction + { + private static final long serialVersionUID = -7347987080988646268L; + + public NewSampleAction( ) + { + super( Controller.NEW_SAMPLE_ACTION_NAME, Controller.RESOURCE_BUNDLE ); + } + + public void actionPerformed( ActionEvent e ) + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); + try + { + boolean proceed = Controller.this.savePossiblyModifiedSample( ); + if( proceed ) this.newSample( ); + } + catch( RuntimeException exc ) + { + // Do nothing, a dialog showing an error message has been already shown + // TODO: Confirm this + } + finally + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) ); + } + } + + public void newSample( ) + { + Questionnaire questionnaire = Controller.this.questionnaire; + RegisterData registerData = questionnaire.getRegister( ).getRegisterData( ); + ObjectData emptyObjectData = registerData.createEmptyObjectData( ); + Controller.this.frame.setObjectData( emptyObjectData ); + Controller.this.setCurrentSampleIndex( registerData.getObjectData( ).size( ) ); + } + } + + /** + * @author jgonzalez + */ + class SaveSampleAction extends ResourceBundleBackedAction + { + private static final long serialVersionUID = -7347987080988646268L; + + public SaveSampleAction( ) + { + super( Controller.SAVE_SAMPLE_ACTION_NAME, Controller.RESOURCE_BUNDLE ); + Controller.this.frame.getDataModel( ).addPropertyChangeListener( "changed", new PropertyChangeListener( ) + { + public void propertyChange( PropertyChangeEvent event ) + { + SaveSampleAction.this.setEnabled( (Boolean) event.getNewValue( ) ); + } + } ); + this.setEnabled( false ); + } + + public void actionPerformed( ActionEvent e ) + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); + this.setEnabled( false ); + try + { + this.saveSample( ); + ((NewSampleAction) Controller.this.getActions( ).get( Controller.NEW_SAMPLE_ACTION_NAME )).newSample( ); + } + catch( RuntimeException exc ) + { + exc.printStackTrace( ); + this.setEnabled( true ); + } + finally + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) ); + } + } + + public void saveSample( ) throws RuntimeException + { + try + { + EntityTransaction transaction = Controller.this.entityManager.getTransaction( ); + transaction.begin( ); + + // TODO: We should make all the checks, and include this in RegisterData... so just testing + ObjectData objectData = Controller.this.frame.getObjectData( ); + RegisterData registerData = Controller.this.questionnaire.getRegister( ).getRegisterData( ); + if( objectData.getRegisterData( ) == null ) + { + // New sample + Controller.this.entityManager.refresh( registerData ); + registerData.addObjectData( objectData ); + } + else + { + // Modified sample + // TODO: Check correct values + } + transaction.commit( ); + } + catch( RuntimeException exc ) + { + JOptionPane.showMessageDialog( Controller.this.frame, "ERROR SAVING!!!!", "title", JOptionPane.ERROR_MESSAGE, + (Icon) Controller.RESOURCE_BUNDLE.getObject( "icon.dialog.error" ) ); + throw exc; + } + } + } + + /** + * @author jgonzalez + */ + class FirstSampleAction extends ResourceBundleBackedAction + { + private static final long serialVersionUID = -6986950258409902794L; + + public FirstSampleAction( ) + { + super( Controller.FIRST_SAMPLE_ACTION_NAME, Controller.RESOURCE_BUNDLE ); + Controller.this.addPropertyChangeListener( new PropertyChangeListener( ) + { + public void propertyChange( PropertyChangeEvent evt ) + { + Controller.FirstSampleAction.this.setEnabled( Controller.this.getCurrentSampleIndex( ) != 0 ); + } + } ); + } + + public void actionPerformed( ActionEvent event ) + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); + boolean proceed = Controller.this.savePossiblyModifiedSample( ); + if( proceed ) Controller.this.setCurrentSampleIndex( 0 ); + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) ); + } + } + + /** + * @author jgonzalez + */ + class LastSampleAction extends ResourceBundleBackedAction + { + private static final long serialVersionUID = -4626085247870941473L; + + public LastSampleAction( ) + { + super( Controller.LAST_SAMPLE_ACTION_NAME, Controller.RESOURCE_BUNDLE ); + Controller.this.addPropertyChangeListener( new PropertyChangeListener( ) + { + public void propertyChange( PropertyChangeEvent evt ) + { + int registerDataSize = Controller.this.questionnaire.getRegister( ).getRegisterData( ).getObjectData( ).size( ); + Controller.LastSampleAction.this.setEnabled( Controller.this.getCurrentSampleIndex( ) != registerDataSize - 1 ); + } + } ); + } + + public void actionPerformed( ActionEvent event ) + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); + boolean proceed = Controller.this.savePossiblyModifiedSample( ); + if( proceed ) + { + RegisterData registerData = Controller.this.questionnaire.getRegister( ).getRegisterData( ); + Controller.this.entityManager.refresh( registerData ); + int lastIndex = registerData.getObjectData( ).size( ) - 1; + Controller.this.setCurrentSampleIndex( lastIndex ); + } + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) ); + } + } + + /** + * @author jgonzalez + */ + class NextSampleAction extends ResourceBundleBackedAction + { + private static final long serialVersionUID = -2126442792714281158L; + + public NextSampleAction( ) + { + super( Controller.NEXT_SAMPLE_ACTION_NAME, Controller.RESOURCE_BUNDLE ); + Controller.this.addPropertyChangeListener( new PropertyChangeListener( ) + { + public void propertyChange( PropertyChangeEvent evt ) + { + int registerDataSize = Controller.this.questionnaire.getRegister( ).getRegisterData( ).getObjectData( ).size( ); + Controller.NextSampleAction.this.setEnabled( Controller.this.getCurrentSampleIndex( ) < registerDataSize - 1 ); + } + } ); + } + + public void actionPerformed( ActionEvent event ) + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); + boolean proceed = Controller.this.savePossiblyModifiedSample( ); + if( proceed ) Controller.this.setCurrentSampleIndex( Controller.this.getCurrentSampleIndex( ) + 1 ); + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) ); + } + } + + /** + * @author jgonzalez + */ + class PreviousSampleAction extends ResourceBundleBackedAction + { + private static final long serialVersionUID = -9057003601613857118L; + + public PreviousSampleAction( ) + { + super( Controller.PREVIOUS_SAMPLE_ACTION_NAME, Controller.RESOURCE_BUNDLE ); + Controller.this.addPropertyChangeListener( new PropertyChangeListener( ) + { + public void propertyChange( PropertyChangeEvent evt ) + { + Controller.PreviousSampleAction.this.setEnabled( Controller.this.getCurrentSampleIndex( ) != 0 ); + } + } ); + } + + public void actionPerformed( ActionEvent event ) + { + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); + boolean proceed = Controller.this.savePossiblyModifiedSample( ); + if( proceed ) Controller.this.setCurrentSampleIndex( Controller.this.getCurrentSampleIndex( ) - 1 ); + Controller.this.frame.setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) ); + } + } + + /** + * @author jgonzalez + */ + class ValidationController extends InputVerifier + { + // private EntityManagerFactory entityManagerFactory; + private Color errorColor = new Color( 1.0f, 0.625f, 0.625f ); + private Map<JComponent, ValueDomain> validationCache = new HashMap<JComponent, ValueDomain>( ); + private Map<JComponent, Color> defaultBackground = new HashMap<JComponent, Color>( ); + + protected ValueDomain getValueDomain( JComponent component ) + { + if( !this.validationCache.containsKey( component ) ) + { + // EntityManager entityManager = entityManagerFactory.createEntityManager( ); + + QuestionnaireElement questionnaireElement = Controller.this.componentToElementMap.get( component ); + // entityManager.refresh( questionnaireElement ); + this.validationCache.put( component, questionnaireElement.getRegisterDataElement( ).getValueDomain( ) ); + + // entityManager.clear( ); + } + + return this.validationCache.get( component ); + } + + @Override + public boolean verify( JComponent component ) + { + // Get value from component + Object value = null; + if( component instanceof JFormattedTextField ) + { + // We must format the value manually, as the change still hasn't been committed + JFormattedTextField formattedComponent = (JFormattedTextField) component; + AbstractFormatter formatter = formattedComponent.getFormatter( ); + String textValue = formattedComponent.getText( ); + try + { + if( formatter != null ) + value = formatter.stringToValue( textValue ); + else + value = textValue; + } + catch( ParseException exc ) + { + // Cannot parse the value -> invalid value + this.showErrorStatus( component ); + return false; + } + } + else if( component instanceof JTextComponent ) + { + JTextComponent textComponent = (JTextComponent) component; + value = textComponent.getText( ); + } + + // Validate value using value domain + if( this.getValueDomain( component ).isValid( (Serializable) value ) ) + { + // We hava a valid value + this.showValidStatus( component ); + return true; + } + else + { + this.showErrorStatus( component ); + return false; + } + } + + /** + * @param component + */ + protected void showErrorStatus( JComponent component ) + { + if( !this.defaultBackground.containsKey( component ) ) this.defaultBackground.put( component, component.getBackground( ) ); + component.setBackground( this.errorColor ); + Toolkit.getDefaultToolkit( ).beep( ); + + // TODO: Include error messages in value domain + JOptionPane.showMessageDialog( component.getRootPane( ), "El valor introducido no es correcto.", "Error", + JOptionPane.ERROR_MESSAGE, (Icon) Controller.RESOURCE_BUNDLE.getObject( "icon.dialog.error" ) ); + } + + /** + * @param component + */ + protected void showValidStatus( JComponent component ) + { + if( this.defaultBackground.containsKey( component ) ) component.setBackground( this.defaultBackground.remove( component ) ); + } + } + + /** + * @author jgonzalez + */ + class SelectionController implements FocusListener + { + public void focusGained( FocusEvent event ) + { + Component component = event.getComponent( ); + if( component instanceof JTextComponent ) + { + JTextComponent textComponent = (JTextComponent) component; + textComponent.selectAll( ); + } + } + + public void focusLost( FocusEvent event ) + {} + } + + /** + * @author jgonzalez + */ + public class RoutingController implements ActionListener + { + /* + * (non-Javadoc) + * + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ + public void actionPerformed( ActionEvent event ) + {} + } + } Copied: trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Frame.java (from rev 78, trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireFrame.java) =================================================================== --- trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Frame.java (rev 0) +++ trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/Frame.java 2006-10-09 14:27:32 UTC (rev 82) @@ -0,0 +1,417 @@ +/* + * surveyforge-runner - Copyright (C) 2006 OPEN input - http://www.openinput.com/ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to + * the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + * + * $Id$ + */ +package org.surveyforge.runner; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.FlowLayout; +import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; + +import javax.persistence.EntityManager; +import javax.swing.ActionMap; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JFormattedTextField; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.JToolBar; +import javax.swing.border.TitledBorder; + +import org.surveyforge.classification.Item; +import org.surveyforge.classification.Level; +import org.surveyforge.core.data.ObjectData; +import org.surveyforge.core.metadata.DataElement; +import org.surveyforge.core.metadata.RegisterDataElement; +import org.surveyforge.core.metadata.ValueDomain; +import org.surveyforge.core.metadata.domain.ClassificationValueDomain; +import org.surveyforge.core.metadata.domain.QuantityValueDomain; +import org.surveyforge.core.survey.Feed; +import org.surveyforge.core.survey.Questionnaire; +import org.surveyforge.core.survey.QuestionnaireElement; +import org.surveyforge.core.survey.SectionFeed; +import org.surveyforge.util.jgoodies.JXPathPresentationModel; + +import com.jgoodies.binding.PresentationModel; +import com.jgoodies.binding.adapter.BasicComponentFactory; +import com.jgoodies.binding.adapter.ComboBoxAdapter; +import com.jgoodies.binding.value.AbstractConverter; +import com.jgoodies.binding.value.ValueModel; +import com.jgoodies.forms.builder.PanelBuilder; +import com.jgoodies.forms.layout.FormLayout; + +/** + * @author jgonzalez + */ +public class Frame extends JFrame + { + private static final long serialVersionUID = -2135625525102812393L; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle( "org.surveyforge.runner.RunnerResourceBundle" ); + + private Controller controller; + + private Map<QuestionnaireElement, JComponent> elementToComponentMap = new HashMap<QuestionnaireElement, JComponent>( ); + private Map<JComponent, QuestionnaireElement> componentToElementMap = new HashMap<JComponent, QuestionnaireElement>( ); + + private Questionnaire questionnaire; + private ObjectData objectData; + private PresentationModel dataModel; + + /** + * @param entityManagerFactory + * @param questionnaire + * @throws IOException + */ + public Frame( EntityManager entityManager, Questionnaire questionnaire ) throws IOException + { + super( "QuestionnaireRunner - " + questionnaire.getTitle( ) ); + + this.questionnaire = questionnaire; + + this.setObjectData( null ); // Create a presentation model for correct action instantiation + + this.controller = new Controller( entityManager, this ); + ActionMap actions = this.controller.getActions( ); + Controller.NewSampleAction newSampleAction = (Controller.NewSampleAction) actions.get( Controller.NEW_SAMPLE_ACTION_NAME ); + newSampleAction.newSample( ); + + this.createUI( ); + } + + /** + * @return + */ + protected Questionnaire getQuestionnaire( ) + { + return this.questionnaire; + } + + /** + * @return + */ + protected ObjectData getObjectData( ) + { + return this.objectData; + } + + /** + * @param objectData + */ + protected void setObjectData( ObjectData objectData ) + { + this.objectData = objectData; + if( this.dataModel == null ) + this.dataModel = new JXPathPresentationModel( this.objectData ); + else + this.dataModel.setBean( this.objectData ); + } + + /** + * @return + */ + protected PresentationModel getDataModel( ) + { + return this.dataModel; + } + + /** + * @return + */ + protected Map<QuestionnaireElement, JComponent> getElementToComponentMap( ) + { + return this.elementToComponentMap; + } + + /** + * @return + */ + protected Map<JComponent, QuestionnaireElement> getComponentToElementMap( ) + { + return this.componentToElementMap; + } + + /** + * + */ + private void createUI( ) + { + this.createMenuBar( ); + this.createToolBar( ); + this.createQuestionnairePanel( ); + } + + private void createMenuBar( ) + { + JMenuBar menuBar = new JMenuBar( ); + + // Sample menu + JMenu sampleMenu = new JMenu( Frame.RESOURCE_BUNDLE.getString( "sampleMenu.title" ) ); + sampleMenu.setMnemonic( (Integer) Frame.RESOURCE_BUNDLE.getObject( "sampleMenu.mnemonic" ) ); + sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( Controller.NEW_SAMPLE_ACTION_NAME ) ) ); + sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( Controller.SAVE_SAMPLE_ACTION_NAME ) ) ); + menuBar.add( sampleMenu ); + sampleMenu.addSeparator( ); + sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( Controller.FIRST_SAMPLE_ACTION_NAME ) ) ); + sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( Controller.PREVIOUS_SAMPLE_ACTION_NAME ) ) ); + sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( Controller.NEXT_SAMPLE_ACTION_NAME ) ) ); + sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( Controller.LAST_SAMPLE_ACTION_NAME ) ) ); + + + this.setJMenuBar( menuBar ); + } + + private void createToolBar( ) + { + JToolBar toolbar = new JToolBar( ); + + JButton newButton = new JButton( this.controller.getActions( ).get( Controller.NEW_SAMPLE_ACTION_NAME ) ); + newButton.setText( "" ); + toolbar.add( newButton ); + JButton saveButton = new JButton( this.controller.getActions( ).get( Controller.SAVE_SAMPLE_ACTION_NAME ) ); + saveButton.setText( "" ); + toolbar.add( saveButton ); + + toolbar.addSeparator( ); + + JButton firstButton = new JButton( this.controller.getActions( ).get( Controller.FIRST_SAMPLE_ACTION_NAME ) ); + firstButton.setText( "" ); + toolbar.add( firstButton ); + JButton previousButton = new JButton( this.controller.getActions( ).get( Controller.PREVIOUS_SAMPLE_ACTION_NAME ) ); + previousButton.setText( "" ); + toolbar.add( previousButton ); + JButton nextButton = new JButton( this.controller.getActions( ).get( Controller.NEXT_SAMPLE_ACTION_NAME ) ); + nextButton.setText( "" ); + toolbar.add( nextButton ); + JButton lastButton = new JButton( this.controller.getActions( ).get( Controller.LAST_SAMPLE_ACTION_NAME ) ); + lastButton.setText( "" ); + toolbar.add( lastButton ); + + this.getContentPane( ).add( toolbar, BorderLayout.NORTH ); + } + + private void createQuestionnairePanel( ) + { + JTabbedPane pagesPane = new JTabbedPane( ); + this.getContentPane( ).add( pagesPane, BorderLayout.CENTER ); + + int pageNumber = 1; + for( Feed pageFeed : questionnaire.getPageFeeds( ) ) + { + pagesPane.addTab( "Page " + pageNumber, this.createPagePanel( questionnaire, pageFeed ) ); + pageNumber++; + } + } + + private JScrollPane createPagePanel( Questionnaire questionnaire, Feed pageFeed ) + { + JScrollPane pageScrollPane = new JScrollPane( ); + JPanel pagePanel = new JPanel( ); + pageScrollPane.setViewportView( pagePanel ); + pagePanel.setLayout( new BoxLayout( pagePanel, BoxLayout.PAGE_AXIS ) ); + + for( SectionFeed sectionFeed : questionnaire.getSectionsInPage( pageFeed ) ) + { + pagePanel.add( this.createSectionPanel( questionnaire, pageFeed, sectionFeed ) ); + } + pagePanel.add( Box.createVerticalGlue( ) ); + + return pageScrollPane; + } + + private JPanel createSectionPanel( Questionnaire questionnaire, Feed pageFeed, SectionFeed sectionFeed ) + { + StringBuffer rowSpecification = new StringBuffer( ); + for( int elementIndex = 0; elementIndex <= questionnaire.getComponentElements( ).size( ); elementIndex++ ) + rowSpecification.append( "3dlu, top:pref, 3dlu, pref, " ); + FormLayout sectionLayout = new FormLayout( "3dlu, max(150dlu;pref):grow, 5dlu, left:pref, 3dlu:grow", rowSpecification.toString( ) ); + PanelBuilder pageSectionPanelBuilder = new PanelBuilder( sectionLayout ); + pageSectionPanelBuilder.setBorder( BorderFactory.createTitledBorder( BorderFactory.createLineBorder( Color.DARK_GRAY, 1 ), + sectionFeed.getTitle( ), TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, Color.DARK_GRAY ) ); + + boolean firstElement = true; + for( QuestionnaireElement element : questionnaire.getElementsInPageAndSection( pageFeed, sectionFeed ) ) + { + if( !firstElement ) + { + pageSectionPanelBuilder.nextLine( 2 ); + pageSectionPanelBuilder.addSeparator( "" ); + pageSectionPanelBuilder.nextLine( 2 ); + } + else + { + pageSectionPanelBuilder.nextLine( ); + firstElement = false; + } + + pageSectionPanelBuilder.nextColumn( ); // Needed to place cursor in correct column + if( element.getQuestion( ) != null ) + { + JTextArea questionText = new JTextArea( element.getQuestion( ).getText( ) ); + questionText.setFocusable( false ); + questionText.setEditable( false ); + questionText.setLineWrap( true ); + questionText.setWrapStyleWord( true ); + + pageSectionPanelBuilder.add( questionText ); + } + else + pageSectionPanelBuilder.nextColumn( 1 ); + pageSectionPanelBuilder.nextColumn( 2 ); + pageSectionPanelBuilder.add( this.createDataEntryComponent( element ) ); + } + + // JButton cambioModelo = new JButton( "Cambio" ); + // cambioModelo.addActionListener( new ActionListener( ) + // { + // public void actionPerformed( ActionEvent e ) + // { + // QuestionnaireRunner.TempQuestionnaire newData = new QuestionnaireRunner.TempQuestionnaire( ); + // newData.setAnyoNacimiento( 1950 ); + // newData.setMesNacimiento( 8 ); + // Frame.this.dataModel.setBean( newData ); + // } + // } ); + // pageSectionPanelBuilder.nextLine( ); + // pageSectionPanelBuilder.nextLine( ); + // pageSectionPanelBuilder.nextColumn( 3 ); + // pageSectionPanelBuilder.add( cambioModelo ); + + return pageSectionPanelBuilder.getPanel( ); + } + + private JComponent createDataEntryComponent( QuestionnaireElement element ) + { + if( element.getRegisterDataElement( ).getComponentElements( ).isEmpty( ) ) + { + // Simple question + String propertyName = Frame.computePropertyName( element.getRegisterDataElement( ) ); + ValueDomain valueDomain = element.getRegisterDataElement( ).getValueDomain( ); + if( valueDomain instanceof QuantityValueDomain ) + { + QuantityValueDomain quantityValueDomain = (QuantityValueDomain) valueDomain; + // JTextField field = new JTextField( quantityValueDomain.getPrecision( ) ); + JFormattedTextField field = BasicComponentFactory.createIntegerField( this.getDataModel( ).getModel( propertyName ) ); + field.setColumns( quantityValueDomain.getPrecision( ) ); + field.addFocusListener( this.controller.getSelectionController( ) ); + field.setInputVerifier( this.controller.getValidationController( ) ); + + this.elementToComponentMap.put( element, field ); + this.componentToElementMap.put( field, element ); + return field; + } + else if( valueDomain instanceof ClassificationValueDomain ) + { + final ClassificationValueDomain classificationValueDomain = (ClassificationValueDomain) valueDomain; + JPanel classificationPanel = new JPanel( new FlowLayout( FlowLayout.LEFT ) ); + // JComboBox classificationCombo = new JComboBox( classificationValueDomain.getLevel( ).getItems( ).toArray( ) ); + JComboBox classificationCombo = new JComboBox( new ComboBoxAdapter( classificationValueDomain.getLevel( ).getItems( ), + new Frame.ClassificationConverter( classificationValueDomain.getLevel( ), this.dataModel.getModel( propertyName ) ) ) ); + + // JTextField classificationCode = new JTextField( 5 ); + JTextField classificationCode = BasicComponentFactory.createTextField( this.dataModel.getModel( propertyName ) ); + classificationCode.setColumns( 5 ); + + classificationCode.addFocusListener( this.controller.getSelectionController( ) ); + classificationCode.setInputVerifier( this.controller.getValidationController( ) ); + + classificationPanel.add( classificationCombo ); + classificationPanel.add( classificationCode ); + this.elementToComponentMap.put( element, classificationPanel ); + this.componentToElementMap.put( classificationCode, element ); + return classificationPanel; + } + else + { + // TODO: Throw an exception? + return new JTextField( "TODO", 10 ); + } + } + else + { + // Compuond question + return new JTextField( "TODO", 10 ); + } + } + + private static String computePropertyName( RegisterDataElement registerDataElement ) + { + List<String> identifiers = new LinkedList<String>( ); + + DataElement root = registerDataElement.getRootDataElement( ); + DataElement currentDataElement = registerDataElement; + while( !currentDataElement.equals( root ) ) + { + identifiers.add( 0, currentDataElement.getIdentifier( ) ); + currentDataElement = currentDataElement.getVariableStructure( ); + } + + StringBuffer propertyName = new StringBuffer( identifiers.get( 0 ) ); + for( String identifier : identifiers.subList( 1, identifiers.size( ) ) ) + { + propertyName.append( "/" ); + propertyName.append( identifier ); + } + + return propertyName.toString( ); + } + + public static class ClassificationConverter extends AbstractConverter + { + private static final long serialVersionUID = 5430851351776185423L; + + private Level level; + + public ClassificationConverter( Level level, ValueModel subject ) + { + super( subject ); + this.level = level; + } + + @Override + public Object convertFromSubject( Object subjectValue ) + { + return this.level.getItem( (String) subjectValue, false ); + } + + public void setValue( Object value ) + { + this.subject.setValue( value != null ? ((Item) value).getCode( ) : null ); + } + } + } Deleted: trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireFrame.java =================================================================== --- trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireFrame.java 2006-10-09 14:25:26 UTC (rev 81) +++ trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireFrame.java 2006-10-09 14:27:32 UTC (rev 82) @@ -1,398 +0,0 @@ -/* - * surveyforge-runner - Copyright (C) 2006 OPEN input - http://www.openinput.com/ - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to - * the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - * - * $Id$ - */ -package org.surveyforge.runner; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.FlowLayout; -import java.io.IOException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; - -import javax.persistence.EntityManagerFactory; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JFormattedTextField; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.JToolBar; -import javax.swing.UIDefaults; -import javax.swing.UIManager; -import javax.swing.border.TitledBorder; -import javax.swing.plaf.ColorUIResource; - -import org.surveyforge.classification.Item; -import org.surveyforge.classification.Level; -import org.surveyforge.core.data.ObjectData; -import org.surveyforge.core.metadata.DataElement; -import org.surveyforge.core.metadata.RegisterDataElement; -import org.surveyforge.core.metadata.ValueDomain; -import org.surveyforge.core.metadata.domain.ClassificationValueDomain; -import org.surveyforge.core.metadata.domain.QuantityValueDomain; -import org.surveyforge.core.survey.Feed; -import org.surveyforge.core.survey.Questionnaire; -import org.surveyforge.core.survey.QuestionnaireElement; -import org.surveyforge.core.survey.SectionFeed; -import org.surveyforge.util.jgoodies.JXPathPresentationModel; - -import com.jgoodies.binding.PresentationModel; -import com.jgoodies.binding.adapter.BasicComponentFactory; -import com.jgoodies.binding.adapter.ComboBoxAdapter; -import com.jgoodies.binding.value.AbstractConverter; -import com.jgoodies.binding.value.ValueModel; -import com.jgoodies.forms.builder.PanelBuilder; -import com.jgoodies.forms.layout.FormLayout; - -/** - * @author jgonzalez - */ -public class QuestionnaireFrame extends JFrame - { - private static final long serialVersionUID = -2135625525102812393L; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle( "org.surveyforge.runner.QuestionnaireRunnerResourceBundle" ); - - private QuestionnaireRunnerController controller; - - private Map<QuestionnaireElement, JComponent> elementToComponentMap = new HashMap<QuestionnaireElement, JComponent>( ); - private Map<JComponent, QuestionnaireElement> componentToElementMap = new HashMap<JComponent, QuestionnaireElement>( ); - - private EntityManagerFactory entityManagerFactory; - private Questionnaire questionnaire; - private ObjectData objectData; - private PresentationModel dataModel; - - /** - * @param entityManagerFactory - * @param questionnaire - * @throws IOException - */ - public QuestionnaireFrame( EntityManagerFactory entityManagerFactory, Questionnaire questionnaire ) throws IOException - { - super( "QuestionnaireRunner - " + questionnaire.getTitle( ) ); - - this.entityManagerFactory = entityManagerFactory; - this.questionnaire = questionnaire; - - this.setObjectData( questionnaire.getRegister( ).getRegisterData( ).createEmptyObjectData( ) ); - - this.controller = new QuestionnaireRunnerController( this.entityManagerFactory, this ); - - this.createUI( ); - } - - /** - * @return - */ - protected Questionnaire getQuestionnaire( ) - { - return this.questionnaire; - } - - /** - * @return - */ - protected ObjectData getObjectData( ) - { - return this.objectData; - } - - /** - * @param objectData - */ - protected void setObjectData( ObjectData objectData ) - { - this.objectData = objectData; - if( this.dataModel == null ) - this.dataModel = new JXPathPresentationModel( this.objectData ); - else - this.dataModel.setBean( this.objectData ); - } - - /** - * @return - */ - protected PresentationModel getDataModel( ) - { - return this.dataModel; - } - - /** - * @return - */ - protected Map<QuestionnaireElement, JComponent> getElementToComponentMap( ) - { - return this.elementToComponentMap; - } - - /** - * @return - */ - protected Map<JComponent, QuestionnaireElement> getComponentToElementMap( ) - { - return this.componentToElementMap; - } - - /** - * - */ - private void createUI( ) - { - this.createMenuBar( ); - this.createToolBar( ); - this.createQuestionnairePanel( ); - } - - private void createMenuBar( ) - { - JMenuBar menuBar = new JMenuBar( ); - - // Sample menu - JMenu sampleMenu = new JMenu( QuestionnaireFrame.RESOURCE_BUNDLE.getString( "sampleMenu.title" ) ); - sampleMenu.setMnemonic( (Integer) QuestionnaireFrame.RESOURCE_BUNDLE.getObject( "sampleMenu.mnemonic" ) ); - sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( QuestionnaireRunnerController.NEW_SAMPLE_ACTION_NAME ) ) ); - sampleMenu.add( new JMenuItem( this.controller.getActions( ).get( QuestionnaireRunnerController.SAVE_SAMPLE_ACTION_NAME ) ) ); - menuBar.add( sampleMenu ); - - this.setJMenuBar( menuBar ); - } - - private void createToolBar( ) - { - JToolBar toolbar = new JToolBar( ); - - JButton newButton = new JButton( this.controller.getActions( ).get( QuestionnaireRunnerController.NEW_SAMPLE_ACTION_NAME ) ); - newButton.setText( "" ); - toolbar.add( newButton ); - JButton saveButton = new JButton( this.controller.getActions( ).get( QuestionnaireRunnerController.SAVE_SAMPLE_ACTION_NAME ) ); - saveButton.setText( "" ); - toolbar.add( saveButton ); - - this.getContentPane( ).add( toolbar, BorderLayout.NORTH ); - } - - private void createQuestionnairePanel( ) - { - JTabbedPane pagesPane = new JTabbedPane( ); - this.getContentPane( ).add( pagesPane, BorderLayout.CENTER ); - - int pageNumber = 1; - for( Feed pageFeed : questionnaire.getPageFeeds( ) ) - { - pagesPane.addTab( "Page " + pageNumber, this.createPagePanel( questionnaire, pageFeed ) ); - pageNumber++; - } - } - - private JScrollPane createPagePanel( Questionnaire questionnaire, Feed pageFeed ) - { - JScrollPane pageScrollPane = new JScrollPane( ); - JPanel pagePanel = new JPanel( ); - pageScrollPane.setViewportView( pagePanel ); - pagePanel.setLayout( new BoxLayout( pagePanel, BoxLayout.PAGE_AXIS ) ); - - for( SectionFeed sectionFeed : questionnaire.getSectionsInPage( pageFeed ) ) - { - pagePanel.add( this.createSectionPanel( questionnaire, pageFeed, sectionFeed ) ); - } - pagePanel.add( Box.createVerticalGlue( ) ); - - return pageScrollPane; - } - - private JPanel createSectionPanel( Questionnaire questionnaire, Feed pageFeed, SectionFeed sectionFeed ) - { - StringBuffer rowSpecification = new StringBuffer( ); - for( int elementIndex = 0; elementIndex <= questionnaire.getComponentElements( ).size( ); elementIndex++ ) - rowSpecification.append( "3dlu, top:pref, 3dlu, pref, " ); - FormLayout sectionLayout = new FormLayout( "3dlu, max(150dlu;pref):grow, 5dlu, left:pref, 3dlu:grow", rowSpecification.toString( ) ); - PanelBuilder pageSectionPanelBuilder = new PanelBuilder( sectionLayout ); - pageSectionPanelBuilder.setBorder( BorderFactory.createTitledBorder( BorderFactory.createLineBorder( Color.DARK_GRAY, 1 ), - sectionFeed.getTitle( ), TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, Color.DARK_GRAY ) ); - - boolean firstElement = true; - for( QuestionnaireElement element : questionnaire.getElementsInPageAndSection( pageFeed, sectionFeed ) ) - { - if( !firstElement ) - { - pageSectionPanelBuilder.nextLine( 2 ); - pageSectionPanelBuilder.addSeparator( "" ); - pageSectionPanelBuilder.nextLine( 2 ); - } - else - { - pageSectionPanelBuilder.nextLine( ); - firstElement = false; - } - - pageSectionPanelBuilder.nextColumn( ); // Needed to place cursor in correct column - if( element.getQuestion( ) != null ) - { - JTextArea questionText = new JTextArea( element.getQuestion( ).getText( ) ); - questionText.setFocusable( false ); - questionText.setEditable( false ); - questionText.setLineWrap( true ); - questionText.setWrapStyleWord( true ); - - pageSectionPanelBuilder.add( questionText ); - } - else - pageSectionPanelBuilder.nextColumn( 1 ); - pageSectionPanelBuilder.nextColumn( 2 ); - pageSectionPanelBuilder.add( this.createDataEntryComponent( element ) ); - } - - // JButton cambioModelo = new JButton( "Cambio" ); - // cambioModelo.addActionListener( new ActionListener( ) - // { - // public void actionPerformed( ActionEvent e ) - // { - // QuestionnaireRunner.TempQuestionnaire newData = new QuestionnaireRunner.TempQuestionnaire( ); - // newData.setAnyoNacimiento( 1950 ); - // newData.setMesNacimiento( 8 ); - // QuestionnaireFrame.this.dataModel.setBean( newData ); - // } - // } ); - // pageSectionPanelBuilder.nextLine( ); - // pageSectionPanelBuilder.nextLine( ); - // pageSectionPanelBuilder.nextColumn( 3 ); - // pageSectionPanelBuilder.add( cambioModelo ); - - return pageSectionPanelBuilder.getPanel( ); - } - - private JComponent createDataEntryComponent( QuestionnaireElement element ) - { - if( element.getRegisterDataElement( ).getComponentElements( ).isEmpty( ) ) - { - // Simple question - String propertyName = QuestionnaireFrame.computePropertyName( element.getRegisterDataElement( ) ); - ValueDomain valueDomain = element.getRegisterDataElement( ).getValueDomain( ); - if( valueDomain instanceof QuantityValueDomain ) - { - QuantityValueDomain quantityValueDomain = (QuantityValueDomain) valueDomain; - // JTextField field = new JTextField( quantityValueDomain.getPrecision( ) ); - JFormattedTextField field = BasicComponentFactory.createIntegerField( this.getDataModel( ).getModel( propertyName ) ); - field.setColumns( quantityValueDomain.getPrecision( ) ); - field.addFocusListener( this.controller.getSelectionController( ) ); - field.setInputVerifier( this.controller.getValidationController( ) ); - - this.elementToComponentMap.put( element, field ); - this.componentToElementMap.put( field, element ); - return field; - } - else if( valueDomain instanceof ClassificationValueDomain ) - { - final ClassificationValueDomain classificationValueDomain = (ClassificationValueDomain) valueDomain; - JPanel classificationPanel = new JPanel( new FlowLayout( FlowLayout.LEFT ) ); - // JComboBox classificationCombo = new JComboBox( classificationValueDomain.getLevel( ).getItems( ).toArray( ) ); - JComboBox classificationCombo = new JComboBox( new ComboBoxAdapter( classificationValueDomain.getLevel( ).getItems( ), - new QuestionnaireFrame.ClassificationConverter( classificationValueDomain.getLevel( ), this.dataModel - .getModel( propertyName ) ) ) ); - - // JTextField classificationCode = new JTextField( 5 ); - JTextField classificationCode = BasicComponentFactory.createTextField( this.dataModel.getModel( propertyName ) ); - classificationCode.setColumns( 5 ); - - classificationCode.addFocusListener( this.controller.getSelectionController( ) ); - classificationCode.setInputVerifier( this.controller.getValidationController( ) ); - - classificationPanel.add( classificationCombo ); - classificationPanel.add( classificationCode ); - this.elementToComponentMap.put( element, classificationPanel ); - this.componentToElementMap.put( classificationCode, element ); - return classificationPanel; - } - else - { - // TODO: Throw an exception? - return new JTextField( "TODO", 10 ); - } - } - else - { - // Compuond question - return new JTextField( "TODO", 10 ); - } - } - - private static String computePropertyName( RegisterDataElement registerDataElement ) - { - List<String> identifiers = new LinkedList<String>( ); - - DataElement root = registerDataElement.getRootDataElement( ); - DataElement currentDataElement = registerDataElement; - while( !currentDataElement.equals( root ) ) - { - identifiers.add( 0, currentDataElement.getIdentifier( ) ); - currentDataElement = currentDataElement.getVariableStructure( ); - } - - StringBuffer propertyName = new StringBuffer( identifiers.get( 0 ) ); - for( String identifier : identifiers.subList( 1, identifiers.size( ) ) ) - { - propertyName.append( "/" ); - propertyName.append( identifier ); - } - - return propertyName.toString( ); - } - - public static class ClassificationConverter extends AbstractConverter - { - private static final long serialVersionUID = 5430851351776185423L; - - private Level level; - - public ClassificationConverter( Level level, ValueModel subject ) - { - super( subject ); - this.level = level; - } - - @Override - public Object convertFromSubject( Object subjectValue ) - { - return this.level.getItem( (String) subjectValue, false ); - } - - public void setValue( Object value ) - { - this.subject.setValue( value != null ? ((Item) value).getCode( ) : null ); - } - } - } Modified: trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunner.java =================================================================== --- trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunner.java 2006-10-09 14:25:26 UTC (rev 81) +++ trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunner.java 2006-10-09 14:27:32 UTC (rev 82) @@ -27,6 +27,7 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; +import javax.persistence.FlushModeType; import javax.persistence.Persistence; import javax.persistence.Query; import javax.swing.JFrame; @@ -52,7 +53,7 @@ { // Likely PlasticXP is not in the class path; ignore. } - + // Default selection color UIDefaults defaults = UIManager.getDefaults( ); defaults.put( "TextField.selectionBackground", new ColorUIResource( Color.ORANGE ) ); @@ -60,11 +61,12 @@ EntityManager entityManager = null; EntityTransaction transaction = null; - QuestionnaireFrame questionnaireFrame = null; + Frame frame = null; try { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory( "hivudvp" ); entityManager = entityManagerFactory.createEntityManager( ); + entityManager.setFlushMode( FlushModeType.COMMIT ); transaction = entityManager.getTransaction( ); transaction.begin( ); @@ -72,17 +74,16 @@ questionnaireQuery.setParameter( "questionnaireIdentifier", args[0] ); if( !questionnaireQuery.getResultList( ).isEmpty( ) ) { - questionnaireFrame = new QuestionnaireFrame( entityManagerFactory, (Questionnaire) questionnaireQuery.getResultList( ).get( 0 ) ); - questionnaireFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); - questionnaireFrame.pack( ); + frame = new Frame( entityManager, (Questionnaire) questionnaireQuery.getResultList( ).get( 0 ) ); + frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); + frame.pack( ); } } finally { - if( transaction != null ) transaction.commit( ); - if( entityManager != null ) entityManager.close( ); + if( transaction != null && transaction.isActive( ) ) transaction.commit( ); } - if( questionnaireFrame != null ) questionnaireFrame.setVisible( true ); + if( frame != null ) frame.setVisible( true ); } } Deleted: trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunnerController.java =================================================================== --- trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunnerController.java 2006-10-09 14:25:26 UTC (rev 81) +++ trunk/surveyforge-runner/src/main/java/org/surveyforge/runner/QuestionnaireRunnerController.java 2006-10-09 14:27:32 UTC (rev 82) @@ -1,316 +0,0 @@ -/* - * surveyforge-runner - Copyright (C) 2006 OPEN input - http://www.openinput.com/ - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to - * the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - * - * $Id$ - */ -package org.surveyforge.runner; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.Serializable; -import java.text.ParseException; -import java.util.HashMap; -import java.util.Map; -import java.util.ResourceBundle; - -import javax.persistence.EntityManagerFactory; -import javax.swing.Action; -import javax.swing.ActionMap; -import javax.swing.InputVerifier; -import javax.swing.JComponent; -import javax.swing.JFormattedTextField; -import javax.swing.JOptionPane; -import javax.swing.JFormattedTextField.AbstractFormatter; -import javax.swing.text.JTextComponent; - -import org.surveyforge.core.data.ObjectData; -import org.surveyforge.core.metadata.ValueDomain; -import org.surveyforge.core.survey.Questionnaire; -import org.surveyforge.core.survey.QuestionnaireElement; - -import com.openinput.tools.swing.ArrayActionMap; -import com.openinput.tools.swing.ResourceBundleBackedAction; - -/** - * @author jgonzalez - */ -public class QuestionnaireRunnerController - { - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle( "org.surveyforge.runner.QuestionnaireRunnerResourceBundle" ); - - public static final String NEW_SAMPLE_ACTION_NAME = "org.surveyforge.runner.QuestionnaireRunnerController.newSampleAction"; - public static final String SAVE_SAMPLE_ACTION_NAME = "org.surveyforge.runner.QuestionnaireRunnerController.saveSampleAction"; - - private Action[] supportedActionsArray; - private ActionMap supportedActions; - - private ValidationController validationController = new QuestionnaireRunnerController.ValidationController( ); - private SelectionController selectionController = new QuestionnaireRunnerController.SelectionController( ); - private RoutingController routingController = new QuestionnaireRunnerController.RoutingController( ); - - private EntityManagerFactory entityManagerFactory; - private QuestionnaireFrame questionnaireFrame; - private Questionnaire ... [truncated message content] |