XRulesEditorPane.java :  » XML-UI » xui32 » com » xoetrope » carousel » survey » Java Open Source

Java Open Source » XML UI » xui32 
xui32 » com » xoetrope » carousel » survey » XRulesEditorPane.java
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();
    }
  }
  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.