package com.xoetrope.carousel.survey;
import com.xoetrope.survey.Condition;
import com.xoetrope.survey.Question;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Rectangle2D;
import java.util.Enumeration;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import net.xoetrope.editor.project.XEditorProject;
import net.xoetrope.xui.XProject;
import net.xoetrope.xui.XProjectManager;
/**
* A layer pane containing all survey components views.
*
* <p> Copyright (c) Xoetrope Ltd., 2001-2006, This software is licensed under
* the GNU Public License (GPL), please see license.txt for more details. If
* you make commercial use of this software you must purchase a commercial
* license from Xoetrope.</p>
* <p> $Revision: 1.5 $</p>
*/
public class XRulesEditorPane extends JLayeredPane implements MouseListener, MouseWheelListener
{
private static final int GRID_GAP = 10;
private static final Color GRID_COLOR = new Color( 220, 220, 220 );
public static double SCALE = 1;
public static int WIDTH = 3000;
public static int HEIGHT = 2000;
protected Vector groupViews;
protected XSurveyEditorFrame editorFrame;
protected int gridGap;
protected MouseAdapter changesSaver;
protected JTextField questionIdField;
protected JTextField questionTextField;
protected JComboBox questionTypeField;
protected XQuestionView editQuestionView;
protected JTextField groupIdField;
protected JTextField groupNameField;
protected JComboBox groupTargetField;
protected XGroupView editGroupView;
protected JTextField ruleIdField;
protected JTextField ruleNameField;
protected JComboBox ruleTargetField;
protected XRuleView editRuleView;
protected XAnswersView answersView;
protected XRulesEditorPanel editorPanel;
protected XSurvey survey;
protected JPopupMenu popupMenu;
protected int scale;
protected int width, height;
protected XNotifier scaleNotifier;
public XRulesEditorPane( XRulesEditorPanel ep )
{
super();
XProject project = XProjectManager.getCurrentProject();
survey = ( XSurvey ) project.getObject( "Survey" );
editorFrame = ( XSurveyEditorFrame ) project.getObject( "EditorFrame" );
groupViews = new Vector();
gridGap = GRID_GAP;
width = WIDTH; height = HEIGHT;
editorPanel = ep;
init();
setSize();
createQuestionEditFields();
createGroupEditFields();
createRuleEditFields();
createAnswersEditFields();
createPopupMenu();
changesSaver = new ChangesSaver();
createObservers();
XEditorProject editorProject = ( project instanceof XEditorProject ?
(XEditorProject)project : null );
scaleNotifier = new XNotifier( editorProject, false );
addMouseWheelListener( this );
addMouseListener( this );
addMouseListener( changesSaver );
}
public XNotifier getScaleNotifier()
{
return scaleNotifier;
}
protected void init()
{
setLayout( null );
JPanel backgroundPanel = new JPanel();
backgroundPanel.setBackground( Color.WHITE );
repaint();
}
protected void setSize()
{
Dimension size = new Dimension( getWidth(), getHeight() );
setSize( size );
setPreferredSize( size );
setMinimumSize( size );
}
protected void createPopupMenu()
{
JMenuItem menuItem;
popupMenu = new JPopupMenu();
JLabel header = new JLabel(" General Options");
header.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) ) ;
popupMenu.add( header );
popupMenu.addSeparator();
menuItem = new JMenuItem( "add new group" );
popupMenu.add( menuItem );
menuItem.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
survey.addNewGroup();
}
});
popupMenu.addSeparator();
menuItem = new JMenuItem( "expand all groups" );
popupMenu.add( menuItem );
menuItem.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
expandAllGroups( true );
}
});
menuItem = new JMenuItem( "collapse all groups" );
popupMenu.add( menuItem );
menuItem.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
expandAllGroups( false );
}
});
popupMenu.addSeparator();
menuItem = new JMenuItem( "expand all rules" );
popupMenu.add( menuItem );
menuItem.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
expandAllRules( true );
}
});
menuItem = new JMenuItem( "collapse all rules ");
popupMenu.add( menuItem );
menuItem.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
expandAllRules( false );
}
});
}
public void expandAllGroups( boolean state )
{
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
groupView.setExpanded( state );
}
}
public void expandAllRules( boolean state )
{
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = (XGroupView)enumGroupViews.nextElement();
Vector[] groupRuleLines = groupView.getGroupRuleLines();
for ( int i = 0; i < groupRuleLines.length; i++ ) {
Enumeration enumGroupRuleLines = groupRuleLines[ i ].elements();
while ( enumGroupRuleLines.hasMoreElements() ) {
XGroupRuleLine groupRuleLine = (XGroupRuleLine)enumGroupRuleLines.nextElement();
groupRuleLine.getRuleView().setExpanded( state );
}
}
}
}
public int getWidth()
{
return ( int ) ( SCALE * width );
}
public int getHeight()
{
return ( int ) ( SCALE * height );
}
public MouseAdapter getChangesSaver()
{
return changesSaver;
}
protected void createQuestionEditFields()
{
editQuestionView = null;
Dimension size = new Dimension( 0, 0 );
questionIdField = new JTextField();
questionIdField.setHorizontalAlignment( JTextField.CENTER );
questionIdField.setBorder( null );
add( questionIdField, JLayeredPane.DRAG_LAYER );
questionIdField.setVisible( false );
questionIdField.addKeyListener( new KeyAdapter() {
public void keyPressed( KeyEvent e ) {
if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
disposeQuestionIdField( true );
} else
if ( e.getKeyCode() == KeyEvent.VK_ESCAPE ) {
disposeQuestionIdField( false );
}
}
});
questionTextField = new JTextField();
questionTextField.setBorder( null );
add( questionTextField, JLayeredPane.DRAG_LAYER );
questionTextField.setVisible( false );
questionTextField.addKeyListener( new KeyAdapter() {
public void keyPressed( KeyEvent e ) {
if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
disposeQuestionTextField( true );
} else
if ( e.getKeyCode() == KeyEvent.VK_ESCAPE ) {
disposeQuestionTextField( false );
}
}
} );
String[] types = { "E", "M", "F" };
questionTypeField = new JComboBox( types );
add( questionTypeField, JLayeredPane.DRAG_LAYER );
questionTypeField.setVisible( false );
questionTypeField.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
disposeQuestionTypeField( true );
}
});
}
protected void createGroupEditFields()
{
Dimension size = new Dimension( 0, 0 );
editGroupView = null;
groupIdField = new JTextField();
groupIdField.setHorizontalAlignment( JTextField.CENTER );
groupIdField.setBorder( null );
groupIdField.setSize( size );
groupIdField.setPreferredSize( size );
add( groupIdField, JLayeredPane.DRAG_LAYER );
groupIdField.setVisible( false );
groupIdField.addKeyListener( new KeyAdapter() {
public void keyPressed( KeyEvent e ) {
if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
disposeGroupIdField( true );
} else
if ( e.getKeyCode() == KeyEvent.VK_ESCAPE ) {
disposeGroupIdField( false );
}
}
});
groupNameField = new JTextField();
groupNameField.setHorizontalAlignment( JTextField.LEFT );
groupNameField.setBorder( null );
add( groupNameField, JLayeredPane.DRAG_LAYER );
groupNameField.setVisible( false );
groupNameField.addKeyListener( new KeyAdapter() {
public void keyPressed( KeyEvent e ) {
if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
disposeGroupNameField( true );
} else
if ( e.getKeyCode() == KeyEvent.VK_ESCAPE ) {
disposeGroupNameField( false );
}
}
});
groupTargetField = new JComboBox( survey.getTargetGroups() );
groupTargetField.setSize( size );
groupTargetField.setPreferredSize( size );
add( groupTargetField, JLayeredPane.DRAG_LAYER );
groupTargetField.setVisible( false );
groupTargetField.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
disposeGroupTargetField( true );
}
});
}
protected void createAnswersEditFields()
{
answersView = new XAnswersView( this );
}
protected void createRuleEditFields()
{
Dimension size = new Dimension( 0, 0 );
editRuleView = null;
ruleIdField = new JTextField();
ruleIdField.setHorizontalAlignment( JTextField.CENTER );
ruleIdField.setBorder( null );
ruleIdField.setSize( size );
ruleIdField.setPreferredSize( size );
add( ruleIdField, JLayeredPane.DRAG_LAYER );
ruleIdField.setVisible( false );
ruleIdField.addKeyListener( new KeyAdapter() {
public void keyPressed( KeyEvent e ) {
if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
disposeRuleIdField( true );
} else
if ( e.getKeyCode() == KeyEvent.VK_ESCAPE ) {
disposeRuleIdField( false );
}
}
});
ruleNameField = new JTextField();
ruleNameField.setHorizontalAlignment( JTextField.LEFT );
ruleNameField.setBorder( null );
ruleNameField.setSize( size );
ruleNameField.setPreferredSize( size );
add( ruleNameField, JLayeredPane.DRAG_LAYER );
ruleNameField.setVisible( false );
ruleNameField.addKeyListener( new KeyAdapter() {
public void keyPressed( KeyEvent e ) {
if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
disposeRuleNameField( true );
} else
if ( e.getKeyCode() == KeyEvent.VK_ESCAPE ) {
disposeRuleNameField( false );
}
}
});
ruleTargetField = new JComboBox( survey.getTargetGroups() );
ruleTargetField.setSize( size );
ruleTargetField.setPreferredSize( size );
add( ruleTargetField, JLayeredPane.DRAG_LAYER );
ruleTargetField.setVisible( false );
ruleTargetField.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
disposeRuleTargetField( true );
}
});
}
public void showAnswersView( XConditionView conditionView )
{
SCALE = 1; scaleChanged();
int x = conditionView.getLocation().x;
int y = conditionView.getLocation().y;
int w = conditionView.getWidth() - 1;
int h = conditionView.getHeight() - 1;
int aw = answersView.getWidth() - 1;
int px = x + ( w - aw ) / 2 + 1;
int py = y + h;
answersView.setLocation( px, py );
answersView.setSizeAndShape();
answersView.setConditionView( conditionView );
answersView.setVisible( true );
answersView.moveToFront();
}
public void showQuestionTextField( XQuestionView questionView )
{
editQuestionView = questionView;
int w = editQuestionView.getNameWidth() - 2 * editQuestionView.getTextGap();
int h = editQuestionView.getHeight() - 8;
int x = editQuestionView.getLocation().x + editQuestionView.getIdWidth() +
editQuestionView.getFieldGap() + editQuestionView.getTextGap();
int y = editQuestionView.getLocation().y + 4;
Dimension size = new Dimension( w, h );
questionTextField.setSize( size );
questionTextField.setPreferredSize( size );
questionTextField.setMinimumSize( size );
questionTextField.setFont( editQuestionView.getFont() );
questionTextField.setLocation( x, y );
questionTextField.setBackground( editQuestionView.getBackgroundColor() );
questionTextField.setText( editQuestionView.getQuestion().getText() );
questionTextField.setVisible( true );
questionTextField.requestFocus();
}
public void showGroupNameField( XGroupView groupView )
{
editGroupView = groupView;
XHeaderField header = editGroupView.getHeaderField();
int w = editGroupView.getHeaderNameWidth() - 2 * editGroupView.getHeaderTextGap();
int h = editGroupView.getHeaderHeight() - 8;
int x = header.getLocation().x + editGroupView.getHeaderIdWidth() +
editGroupView.getHeaderFieldGap() + editGroupView.getHeaderTextGap();
int y = header.getLocation().y + 4;
Dimension size = new Dimension( w, h );
groupNameField.setSize( size );
groupNameField.setPreferredSize( size );
groupNameField.setMinimumSize( size );
groupNameField.setFont( editGroupView.getHeaderFont() );
groupNameField.setLocation( x, y );
groupNameField.setBackground( editGroupView.getHeaderBackground() );
groupNameField.setText( editGroupView.getGroup().getName() );
groupNameField.setVisible( true );
groupNameField.requestFocus();
}
public void showRuleNameField( XRuleView ruleView )
{
editRuleView = ruleView;
XHeaderField header = editRuleView.getHeaderField();
int w = editRuleView.getHeaderNameWidth() - 2 * editRuleView.getHeaderTextGap();
int h = editRuleView.getHeaderHeight() - 8;
int x = header.getLocation().x + editRuleView.getHeaderIdWidth() +
editRuleView.getHeaderFieldGap() + editRuleView.getHeaderTextGap();
int y = header.getLocation().y + 4;
Dimension size = new Dimension( w, h );
ruleNameField.setSize( size );
ruleNameField.setPreferredSize( size );
ruleNameField.setMinimumSize( size );
ruleNameField.setFont( editRuleView.getHeaderFont() );
ruleNameField.setLocation( x, y );
ruleNameField.setBackground( editRuleView.getHeaderBackground() );
ruleNameField.setText( editRuleView.getRule().getName() );
ruleNameField.setVisible( true );
ruleNameField.requestFocus();
}
public void showRuleIdField( XRuleView ruleView )
{
editRuleView = ruleView;
XHeaderField header = editRuleView.getHeaderField();
int w = editRuleView.getHeaderIdWidth() - 2 * editRuleView.getHeaderTextGap();
int h = editRuleView.getHeaderHeight() - 10;
int x = header.getLocation().x + editRuleView.getHeaderTextGap();
int y = header.getLocation().y + 5;
Dimension size = new Dimension( w, h );
ruleIdField.setSize( size );
ruleIdField.setPreferredSize( size );
ruleIdField.setMinimumSize( size );
ruleIdField.setFont( editRuleView.getHeaderFont() );
ruleIdField.setLocation( x, y );
ruleIdField.setBackground( editRuleView.getHeaderBackground() );
ruleIdField.setText( String.valueOf( editRuleView.getRule().getId() ) );
ruleIdField.setVisible( true );
ruleIdField.requestFocus();
}
public void showGroupIdField( XGroupView groupView )
{
editGroupView = groupView;
XHeaderField header = groupView.getHeaderField();
int w = editGroupView.getHeaderIdWidth() - 2 * editGroupView.getHeaderTextGap();
int h = editGroupView.getHeaderHeight() - 10;
int x = header.getLocation().x + editGroupView.getHeaderTextGap();
int y = header.getLocation().y + 5;
Dimension size = new Dimension( w, h );
groupIdField.setSize( size );
groupIdField.setPreferredSize( size );
groupIdField.setMinimumSize( size );
groupIdField.setFont( editGroupView.getHeaderFont() );
groupIdField.setLocation( x, y );
groupIdField.setBackground( editGroupView.getHeaderBackground() );
groupIdField.setText( String.valueOf( editGroupView.getGroup().getId() ) );
groupIdField.setVisible( true );
groupIdField.requestFocus();
}
public void showQuestionIdField( XQuestionView questionView )
{
editQuestionView = questionView;
int w = editQuestionView.getIdWidth() - 2 * editQuestionView.getTextGap();
int h = editQuestionView.getHeight() - 10;
int x = editQuestionView.getLocation().x + editQuestionView.getTextGap();
int y = editQuestionView.getLocation().y + 5;
Dimension size = new Dimension( w, h );
questionIdField.setSize( size );
questionIdField.setPreferredSize( size );
questionIdField.setMinimumSize( size );
questionIdField.setFont( editQuestionView.getFont() );
questionIdField.setLocation( x, y );
questionIdField.setBackground( editQuestionView.getBackgroundColor() );
questionIdField.setText( String.valueOf( questionView.getQuestion().getId() ) ) ;
questionIdField.setVisible( true );
questionIdField.requestFocus();
}
public void showQuestionTypeField( XQuestionView questionView )
{
editQuestionView = questionView;
int idx = 0;
switch ( editQuestionView.getQuestion().getQuestionType() ) {
case Question.MUTUALLY_EXCLUSIVE:
idx = 0; break;
case Question.MULTIPLE_CHOICE:
idx = 1; break;
case Question.FREE_TEXT:
idx = 2; break;
}
int x = editQuestionView.getLocation().x + 2 * editQuestionView.getFieldGap() +
editQuestionView.getIdWidth() + editQuestionView.getNameWidth();
int y = ( int ) editQuestionView.getLocation().y;
int w = editQuestionView.getTypeWidth();
int h = editQuestionView.getHeight();
questionTypeField.setLocation( x, y );
Dimension size = new Dimension( w, h );
questionTypeField.setSize( size );
questionTypeField.setPreferredSize( size );
questionTypeField.setMinimumSize( size );
questionTypeField.setVisible( true );
questionTypeField.requestFocus();
questionTypeField.setBorder( null );
questionTypeField.setFont( editQuestionView.getFont() );
questionTypeField.setPopupVisible( true );
questionTypeField.setVisible( false );
}
public void showGroupTargetField( XGroupView groupView )
{
editGroupView = groupView;
XHeaderField header = editGroupView.getHeaderField();
int w = editGroupView.getHeaderTargetWidth() * 6;
int h = editGroupView.getHeaderHeight();
int x = header.getLocation().x + 2 * editGroupView.getHeaderFieldGap() +
editGroupView.getHeaderIdWidth() + editGroupView.getHeaderNameWidth() +
( editGroupView.getHeaderTargetWidth() - w ) / 2;
int y = header.getLocation().y;
Dimension size = new Dimension( w, h );
groupTargetField.setFont( editGroupView.getHeaderFont() );
groupTargetField.setSize( size );
groupTargetField.setPreferredSize( size );
groupTargetField.setMinimumSize( size );
groupTargetField.setLocation( x, y );
groupTargetField.setModel( new DefaultComboBoxModel( survey.getTargetGroups() ) );
groupTargetField.setVisible( true );
groupTargetField.setLocation( x, y );
groupTargetField.requestFocus();
groupTargetField.setBorder( null );
groupTargetField.setPopupVisible( true );
groupTargetField.setVisible( false );
}
public void showRuleTargetField( XRuleView ruleView )
{
editRuleView = ruleView;
XHeaderField header = editRuleView.getHeaderField();
int w = editRuleView.getHeaderTargetWidth() * 6;
int h = editRuleView.getHeaderHeight();
int x = header.getLocation().x + 2 * editRuleView.getHeaderFieldGap() +
editRuleView.getHeaderIdWidth() + editRuleView.getHeaderNameWidth() +
( editRuleView.getHeaderTargetWidth() - w ) / 2;
int y = header.getLocation().y;
Dimension size = new Dimension( w, h );
ruleTargetField.setFont( editRuleView.getHeaderFont() );
ruleTargetField.setSize( size );
ruleTargetField.setPreferredSize( size );
ruleTargetField.setMinimumSize( size );
ruleTargetField.setLocation( x, y );
ruleTargetField.setModel( new DefaultComboBoxModel( survey.getTargetGroups() ) );
ruleTargetField.setVisible( true );
ruleTargetField.setLocation( x, y );
ruleTargetField.requestFocus();
ruleTargetField.setBorder( null );
ruleTargetField.setPopupVisible( true );
ruleTargetField.setVisible( false );
}
public void disposeEditFields( boolean save )
{
disposeQuestionIdField( save );
disposeQuestionTextField( save );
disposeGroupIdField( save );
disposeGroupNameField( save );
disposeRuleIdField( save );
disposeRuleNameField( save );
}
public void hideAnswersView()
{
if ( answersView.isVisible() )
answersView.setVisible( false );
repaint();
}
public void disposeGroupIdField( boolean save )
{
if ( !groupIdField.isVisible() )
return;
if ( editGroupView != null ) {
if ( save ) {
XQuestionGroup group = editGroupView.getGroup();
int newId = group.getId();
try {
newId = new Integer( groupIdField.getText() ).intValue();
} catch ( NumberFormatException e ) {};
group.setId( newId );
}
groupIdField.setVisible( false );
editGroupView = null;
repaint();
}
}
public void disposeRuleIdField( boolean save )
{
if ( !ruleIdField.isVisible() )
return;
if ( editRuleView != null ) {
if ( save ) {
XRule rule = editRuleView.getRule();
int newId = rule.getId();
try {
newId = new Integer( ruleIdField.getText() ).intValue();
} catch ( NumberFormatException e ) {};
rule.setId( newId );
}
ruleIdField.setVisible( false );
editRuleView = null;
repaint();
}
}
public void disposeRuleNameField( boolean save )
{
if ( !ruleNameField.isVisible() )
return;
if ( editRuleView != null ) {
if ( save ) {
XRule rule = editRuleView.getRule();
rule.setName( ruleNameField.getText() );
}
ruleNameField.setVisible( false );
editRuleView = null;
repaint();
}
}
public void disposeQuestionIdField( boolean save )
{
if ( !questionIdField.isVisible() )
return;
if ( editQuestionView != null ) {
if ( save ) {
Question question = editQuestionView.getQuestion();
int newId = question.getId();
try {
newId = new Integer( questionIdField.getText() ).intValue();
} catch ( NumberFormatException e ) {};
if ( newId != question.getId() )
XSurvey.setProjectModified( true );
question.setId( newId );
}
questionIdField.setVisible( false );
editQuestionView = null;
repaint();
}
}
public void disposeGroupNameField( boolean save )
{
if ( !groupNameField.isVisible() )
return;
if ( editGroupView != null ) {
if ( save ) {
XQuestionGroup group = editGroupView.getGroup();
group.setName( groupNameField.getText() );
}
groupNameField.setVisible( false );
editGroupView = null;
repaint();
}
}
public void disposeQuestionTextField( boolean save )
{
if ( !questionTextField.isVisible() )
return;
if ( editQuestionView != null ) {
if ( save ) {
Question question = editQuestionView.getQuestion();
String newText = questionTextField.getText();
if ( !newText.equals( question.getText() ))
XSurvey.setProjectModified( true );
question.setText( newText );
}
questionTextField.setVisible( false );
editQuestionView = null;
repaint();
}
}
public void disposeGroupTargetField( boolean save )
{
if ( editGroupView != null ) {
if ( save ) {
XQuestionGroup targetGroup = ( ( XTargetGroup ) groupTargetField.getSelectedItem() ).getGroup();
XQuestionGroup group = editGroupView.getGroup();
group.changeNextGroupId( targetGroup );
}
groupTargetField.setVisible( false );
editGroupView = null;
repaint();
}
}
public void disposeRuleTargetField( boolean save )
{
if ( editRuleView != null ) {
if ( save ) {
XQuestionGroup targetGroup = ( ( XTargetGroup ) ruleTargetField.getSelectedItem() ).getGroup();
XRule rule = editRuleView.getRule();
rule.changeTarget( targetGroup );
}
ruleTargetField.setVisible( false );
editRuleView = null;
repaint();
}
}
public void disposeQuestionTypeField( boolean save )
{
if ( editQuestionView != null ) {
if ( save ) {
Question question = editQuestionView.getQuestion();
int idx = questionTypeField.getSelectedIndex();
boolean state = false;
switch ( idx ) {
case 0:
state = Question.MUTUALLY_EXCLUSIVE != question.getQuestionType();
question.setQuestionType( Question.MUTUALLY_EXCLUSIVE );
break;
case 1:
state = Question.MULTIPLE_CHOICE != question.getQuestionType();
question.setQuestionType( Question.MULTIPLE_CHOICE );
break;
case 2:
state = Question.FREE_TEXT != question.getQuestionType();
question.setQuestionType( Question.FREE_TEXT );
break;
}
if ( state )
XSurvey.setProjectModified( true );
}
questionTypeField.setVisible( false );
editQuestionView = null;
}
}
public int getGridGap()
{
return gridGap;
}
public void setGridGap( int gg )
{
gridGap = gg;
}
public Component getIntersectedView( Rectangle rect, Class c )
{
Component component = null;
Component[] comps = getComponentsInLayer( JLayeredPane.PALETTE_LAYER );
long max = 0;
for ( int i = 0; i < comps.length; i++ ) {
if ( !comps[ i ].isVisible() || !c.isInstance( comps[ i ] ) ) continue;
Rectangle2D intersectRect = rect.createIntersection( comps[i].getBounds() );
int width = ( int ) Math.max( intersectRect.getWidth(), 0 );
int height = ( int ) Math.max( intersectRect.getHeight(), 0 );
int val = width * height;
if ( val > max ) {
component = comps[ i ];
max = val;
}
}
return component;
}
public XGroupView getIntGroupView ( Point p )
{
XGroupView groupView = null;
int px = ( int ) p.getX();
int py = ( int ) p.getY();
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() && groupView == null ) {
XGroupView gv = ( XGroupView ) enumGroupViews.nextElement();
int x1 = ( int ) gv.getLocation().getX();
int x2 = x1 + ( int ) ( gv.getSize().getWidth() );
int y1 = ( int ) gv.getLocation().getY();
int y2 = y1 + ( int ) gv.getSize().getHeight();
if ( px >= x1 && px <= x2 && py >= y1 && py <= y2 )
groupView = gv;
}
return groupView;
}
protected void paintGrid( Graphics2D g )
{
int w = ( int ) getSize().getWidth();
int h = ( int ) getSize().getHeight();
g.setColor( Color.WHITE );
g.fillRect( 0, 0, w, h );
g.setColor( GRID_COLOR );
int x = 0;
int nvl = ( int ) ( w / GRID_GAP );
while ( nvl-- > 0 ) {
g.drawLine( x, 0, x, h );
x += gridGap;
}
int y = 0;
int nhl = ( int ) ( h / GRID_GAP );
while ( nhl-- > 0 ) {
g.drawLine( 0, y, w, y );
y += gridGap;
}
}
public void paint( Graphics g )
{
Graphics2D g2d = ( Graphics2D ) g;
paintGrid( g2d );
super.paint( g2d );
}
public Vector getGroupViews()
{
return groupViews;
}
protected void addGroupView( XQuestionGroup group )
{
XGroupView groupView = new XGroupView( this, group );
add( groupView, JLayeredPane.PALETTE_LAYER );
groupView.setLocation( 300, 300 );
groupViews.add( groupView );
groupView.moveToFront();
}
protected void createObservers()
{
// add new group
survey.getAddGroupNotifier().addObserver( new Observer() {
public void update( Observable o, Object arg ) {
XQuestionGroup group = ( XQuestionGroup ) arg;
XGroupView groupView = new XGroupView( XRulesEditorPane.this, group );
groupView.createSourceLine();
groupView.setLocation( 300, 300 );
groupViews.add( groupView );
groupView.moveToFront();
repaint();
}
});
// deleteGroup
survey.getDeleteGroupNotifier().addObserver( new Observer() {
public void update( Observable o, Object arg ) {
XQuestionGroup group = ( XQuestionGroup ) arg;
XGroupView groupView = getGroupView( group.getId() );
if ( groupView != null ) {
groupView.remove();
groupViews.remove( groupView );
}
repaint();
}
});
}
public void removeAllGroups()
{
while ( groupViews.size() > 0 ) {
XGroupView groupView = ( XGroupView ) groupViews.get( 0 );
groupView.remove();
}
}
public void refreshComponents()
{
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
groupView.refresh();
Vector[] groupRuleLines = groupView.getGroupRuleLines();
if ( groupRuleLines != null )
for ( int i = 0; i < groupRuleLines.length; i++ ) {
Enumeration enumLines = groupRuleLines[ i ].elements();
while ( enumLines.hasMoreElements() ) {
XGroupRuleLine line = ( XGroupRuleLine ) enumLines.nextElement();
XRuleView ruleView = line.getRuleView();
ruleView.refresh();
}
}
}
}
public void refreshLines()
{
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
Vector[] groupRuleLines = groupView.getGroupRuleLines();
if ( groupRuleLines != null )
for ( int i = 0; i < groupRuleLines.length; i++ ) {
Enumeration enumLines = groupRuleLines[ i ].elements();
while ( enumLines.hasMoreElements() ) {
XGroupRuleLine line = ( XGroupRuleLine ) enumLines.nextElement();
line.setLocation();
}
}
XLine line = groupView.getSourceLine();
if ( line != null ) line.setLocation();
Enumeration enumLines = groupView.getTargetLines().elements();
while ( enumLines.hasMoreElements() ) {
line = ( XLine ) enumLines.nextElement();
line.setLocation();
}
}
}
public XGroupView getGroupView( int groupId )
{
XGroupView groupView = null;
Enumeration enumGroups = groupViews.elements();
while ( enumGroups.hasMoreElements() && groupView == null ) {
XGroupView gv = ( XGroupView ) enumGroups.nextElement();
if ( gv.getGroup().getId() == groupId ) groupView = gv;
}
return groupView;
}
public void createView()
{
int x = 100, y = 100;
Enumeration enumGroups = survey.getGroups().elements();
while ( enumGroups.hasMoreElements() ) {
XQuestionGroup group = ( XQuestionGroup ) enumGroups.nextElement();
XGroupView groupView = new XGroupView( this, group );
groupView.setLocation( x, y );
groupView.moveToFront();
groupViews.add( groupView );
x += 400;
}
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
groupView.createSourceLine();
groupView.createRulesSourceLines();
}
}
private Observer selectionObserver = ( new Observer()
{
public void update( Observable o, Object arg ) {
if ( arg instanceof XGroupView ) {
XGroupView groupView = ( XGroupView ) arg;
editorPanel.showGroupView( groupView );
} else
if ( arg instanceof XRuleView ) {
XRuleView ruleView = ( XRuleView ) arg;
editorPanel.showRuleView( ruleView );
} else
if ( arg instanceof XConditionView ) {
XConditionView conditionView = ( XConditionView ) arg;
editorPanel.showConditionView( conditionView );
} else
if ( arg instanceof XQuestionView ) {
XQuestionView questionView = ( XQuestionView ) arg;
editorPanel.showQuestionView( questionView );
}
}
});
public Observer getSelectionObserver()
{
return selectionObserver;
}
public void selectAllComponents( boolean state )
{
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
groupView.selectRules( state );
groupView.selectXComponents( state );
groupView.isSelected( false );
groupView.repaint();
}
}
public void selectGroup( XQuestionGroup group )
{
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
groupView.selectRules( false );
groupView.selectXComponents( false );
if ( groupView.getGroup().equals( group ) ) {
groupView.isSelected( true );
} else
groupView.isSelected( false );
groupView.repaint();
}
}
public void selectQuestion( Question question )
{
if ( question == null ) return;
XQuestionGroup group = ( XQuestionGroup ) question.getGroup();
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
groupView.selectRules( false );
if ( groupView.getGroup().equals( group ) ) {
groupView.isSelected( true );
groupView.selectQuestion( question );
} else {
groupView.isSelected( false );
groupView.selectXComponents( false );
}
groupView.repaint();
}
}
public void selectCondition( XRule rule, Condition condition )
{
if ( rule == null || condition == null ) return;
XQuestionGroup group = rule.getGroup();
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
if ( groupView.getGroup().equals( group ) )
groupView.selectCondition( rule, condition );
}
}
public void selectRule( XRule rule )
{
if ( rule == null ) return;
XQuestionGroup group = rule.getGroup();
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
groupView.isSelected( false );
groupView.selectXComponents( false );
if ( groupView.getGroup().equals( group ) ) {
groupView.selectRule( rule );
}
groupView.repaint();
}
}
public void mouseClicked(MouseEvent e)
{
}
protected void showPopupMenu( Point p )
{
if ( popupMenu != null )
popupMenu.show( this, p.x, p.y );
}
public void mousePressed(MouseEvent e)
{
selectAllComponents( false );
if ( e.getButton() == MouseEvent.BUTTON3 )
showPopupMenu( e.getPoint() );
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public Point getSelectedPoint()
{
Point point = null;
Enumeration enumGroupViews = groupViews.elements();
while ( enumGroupViews.hasMoreElements() && point == null ) {
XGroupView groupView = ( XGroupView ) enumGroupViews.nextElement();
if ( groupView.isSelected() ) {
int x = groupView.getLocation().x + groupView.getWidth() / 2;
int y = groupView.getLocation().y + groupView.getHeight() / 2;
point = new Point( x, y ); break;
}
Vector[] groupRuleLines = groupView.getGroupRuleLines();
for ( int i = 0; i < groupRuleLines.length && point == null; i++ ) {
Enumeration enumLines = groupRuleLines[ i ].elements();
while ( enumLines.hasMoreElements() && point == null ) {
XGroupRuleLine line = ( XGroupRuleLine ) enumLines.nextElement();
XRuleView ruleView = line.getRuleView();
if ( ruleView.isSelected() ) {
int x = ruleView.getLocation().x + ruleView.getWidth() / 2;
int y = ruleView.getLocation().y + ruleView.getHeight() / 2;
point = new Point( x, y ); break;
}
}
}
}
if ( point == null )
point = new Point( getWidth() / 2, getHeight() / 2 );
return point;
}
protected void centerPosition()
{
Point point = getSelectedPoint();
if ( point == null )
return;
JScrollPane scroll = editorPanel.getRulesEditorScroll();
int x = point.x - scroll.getSize().width / 2;
int y = point.y - scroll.getSize().height / 2;
if ( x < 0 )
x = 0;
if ( y < 0 )
y = 0;
scroll.getViewport().setViewPosition( new Point( x, y ) );
}
protected boolean checkScale( double sc )
{
int w = ( int ) ( sc * width );
int h = ( int ) ( sc * height );
JScrollPane scroll = editorPanel.getRulesEditorScroll();
int sw = scroll.getSize().width;
int sh = scroll.getSize().height;
return ( w > sw && h > sh );
}
public void mouseWheelMoved( MouseWheelEvent e )
{
if ( e.getUnitsToScroll() > 0 ) {
if ( checkScale( 1.1 * SCALE ) ) {
SCALE = 1.1 * SCALE;
scaleChanged();
}
}
if ( e.getUnitsToScroll() < 0 ) {
if ( checkScale( 0.9 * SCALE ) ) {
SCALE = 0.9 * SCALE;
scaleChanged();
}
}
}
protected void scaleChanged()
{
setSize();
disposeEditFields( true );
hideAnswersView();
refreshComponents();
refreshLines();
centerPosition();
repaint();
}
private class ChangesSaver extends MouseAdapter
{
public void mousePressed( MouseEvent e )
{
disposeEditFields( true );
hideAnswersView();
}
}
}
|