|
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] |