/*
* File : TextTargetEditorPanel.java
* Created : 23-mai-2003 10:25
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* 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 (see the LICENSE file).
*/
package edu.xtec.jclic.activities.text;
import edu.xtec.jclic.bags.MediaBagEditor;
import edu.xtec.jclic.beans.SmallIntEditor;
import edu.xtec.jclic.beans.TextListEditor;
import edu.xtec.jclic.boxes.ActiveBoxContent;
import edu.xtec.jclic.boxes.ActiveBoxContentEditor;
import edu.xtec.jclic.boxes.JPanelActiveBox;
import edu.xtec.util.Options;
import edu.xtec.util.Resizer;
import edu.xtec.util.ResizerPanel;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComponent;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.16
*/
public class TextTargetEditorPanel extends javax.swing.JPanel implements java.beans.PropertyChangeListener, java.awt.event.ActionListener, Resizer.ResizerListener {
protected Options options;
TextTarget textTarget;
//protected boolean modified;
JPanelActiveBox jpab;
Resizer resizer;
//TextActivityEditorTextPanel parentPanel;
MediaBagEditor mbe;
protected static final int[] popValues={TextTarget.NO_INFO,
TextTarget.INFO_ALWAYS, TextTarget.INFO_ON_ERROR, TextTarget.INFO_ON_DEMAND};
protected static final String[] popKeys={"no", "always", "onError", "onDemand"};
protected String[] popItems;
protected static final Map<Options, TextTargetEditorPanel> panels=new HashMap<Options, TextTargetEditorPanel>(1);
/** Creates new form TextTargetPanel */
public TextTargetEditorPanel(Options options, MediaBagEditor mbe) {
this.options=options;
this.mbe=mbe;
popItems=new String[popKeys.length];
for(int i=0; i<popItems.length; i++)
popItems[i]=options.getMsg("edit_text_act_popup_"+popKeys[i]);
initComponents();
jpab=new JPanelActiveBox(null, null, popupPreview);
jpab.catchMouseEvents=false;
jpab.setPreferredSize(popupPreview.getPreferredSize());
popupPreview.setBounds(0, 0, popupPreview.getPreferredSize().width, popupPreview.getPreferredSize().height);
popupPreview.add(jpab);
resizer=new Resizer(jpab, null, true, this);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
javax.swing.JPanel editPanel;
javax.swing.JPanel formatPanel;
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.JPanel nullPanel;
javax.swing.JPanel popupPanel;
javax.swing.JScrollPane popupPreviewScroll;
popupOptions = new javax.swing.ButtonGroup();
formatPanel = new javax.swing.JPanel();
answerLb = new javax.swing.JLabel();
answerListEditor = new TextListEditor(options);
maxlenLb = new javax.swing.JLabel();
maxLenEditor = new edu.xtec.jclic.beans.SmallIntEditor();
fillingChLb = new javax.swing.JLabel();
fillingCh = new javax.swing.JTextField();
iniLenLb = new javax.swing.JLabel();
iniLenEditor = new edu.xtec.jclic.beans.SmallIntEditor();
iniTextLb = new javax.swing.JLabel();
iniText = new javax.swing.JTextField();
listChk = new javax.swing.JCheckBox();
listEditor = new TextListEditor(options);
popupPanel = new javax.swing.JPanel();
typeCombo = new javax.swing.JComboBox(popItems);
cardPanel = new javax.swing.JPanel();
nullPanel = new javax.swing.JPanel();
editPanel = new javax.swing.JPanel();
popupPreviewScroll = new javax.swing.JScrollPane();
popupPreview = new ResizerPanel();
onlyPlayChk = new javax.swing.JCheckBox();
delayLb = new javax.swing.JLabel();
delayEditor = new edu.xtec.jclic.beans.SmallIntEditor();
maxTimeLb = new javax.swing.JLabel();
maxTimeEditor = new edu.xtec.jclic.beans.SmallIntEditor();
setLayout(new java.awt.GridBagLayout());
formatPanel.setLayout(new java.awt.GridBagLayout());
answerLb.setText(options.getMsg("edit_text_act_answer_label"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(answerLb, gridBagConstraints);
answerListEditor.setPreferredSize(new java.awt.Dimension(180, 100));
answerListEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
formatPanel.add(answerListEditor, gridBagConstraints);
maxlenLb.setText(options.getMsg("edit_text_act_maxLen"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(maxlenLb, gridBagConstraints);
maxLenEditor.setToolTipText(options.getMsg("edit_text_act_maxLen_tooltip"));
maxLenEditor.setMax(999);
maxLenEditor.setMin(1);
maxLenEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(maxLenEditor, gridBagConstraints);
fillingChLb.setText(options.getMsg("edit_text_act_fillingChar"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(fillingChLb, gridBagConstraints);
fillingCh.setToolTipText(options.getMsg("edit_text_act_maxLen_tooltip"));
fillingCh.setColumns(1);
fillingCh.setText("_");
fillingCh.addActionListener(this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(fillingCh, gridBagConstraints);
iniLenLb.setText(options.getMsg("edit_text_act_iniLen"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(iniLenLb, gridBagConstraints);
iniLenEditor.setToolTipText(options.getMsg("edit_text_act_iniLen_tooltip"));
iniLenEditor.setMax(999);
iniLenEditor.setMin(1);
iniLenEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(iniLenEditor, gridBagConstraints);
iniTextLb.setText(options.getMsg("edit_text_act_iniText"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(iniTextLb, gridBagConstraints);
iniText.setToolTipText(options.getMsg("edit_text_act_iniText_tooltip"));
iniText.setPreferredSize(new java.awt.Dimension(140, 21));
iniText.addActionListener(this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
formatPanel.add(iniText, gridBagConstraints);
listChk.setToolTipText(options.getMsg("edit_text_act_list_tooltip"));
listChk.setText(options.getMsg("edit_text_act_list"));
listChk.addActionListener(this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 0, 2);
formatPanel.add(listChk, gridBagConstraints);
listEditor.setPreferredSize(new java.awt.Dimension(180, 100));
listEditor.setEnabled(false);
listEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
formatPanel.add(listEditor, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(formatPanel, gridBagConstraints);
popupPanel.setLayout(new java.awt.GridBagLayout());
popupPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_text_act_popup")));
typeCombo.addActionListener(this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
popupPanel.add(typeCombo, gridBagConstraints);
cardPanel.setLayout(new java.awt.CardLayout());
cardPanel.add(nullPanel, "card2");
editPanel.setLayout(new java.awt.GridBagLayout());
popupPreviewScroll.setPreferredSize(new java.awt.Dimension(200, 40));
popupPreview.setLayout(null);
popupPreview.setPreferredSize(new java.awt.Dimension(300, 300));
popupPreviewScroll.setViewportView(popupPreview);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
editPanel.add(popupPreviewScroll, gridBagConstraints);
onlyPlayChk.setText(options.getMsg("edit_text_act_popup_onlyPlay"));
onlyPlayChk.addActionListener(this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
editPanel.add(onlyPlayChk, gridBagConstraints);
delayLb.setText(options.getMsg("edit_text_act_popup_delay"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
editPanel.add(delayLb, gridBagConstraints);
delayEditor.setMax(9999);
delayEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 2, 4, 2);
editPanel.add(delayEditor, gridBagConstraints);
maxTimeLb.setText(options.getMsg("edit_text_act_popup_maxTime"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
editPanel.add(maxTimeLb, gridBagConstraints);
maxTimeEditor.setMax(9999);
maxTimeEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 2, 4, 2);
editPanel.add(maxTimeEditor, gridBagConstraints);
cardPanel.add(editPanel, "card3");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
popupPanel.add(cardPanel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(popupPanel, gridBagConstraints);
}//GEN-END:initComponents
/** Getter for property textTarget.
* @return Value of property textTarget.
*/
public edu.xtec.jclic.activities.text.TextTarget getTextTarget() {
collectData();
return textTarget;
}
/** Setter for property textTarget.
* @param textTarget New value of property textTarget.
*/
public void setTextTarget(edu.xtec.jclic.activities.text.TextTarget textTarget) {
//if(textTarget!=this.textTarget){
//collectData();
this.textTarget = textTarget;
answerListEditor.setTextList(textTarget!=null ? textTarget.answer : null);
listChk.setSelected(textTarget!=null && textTarget.isList);
maxLenEditor.setValue(textTarget!=null ? textTarget.maxLenResp : 1);
fillingCh.setText(textTarget!=null ? new String(new char[]{textTarget.iniChar}) : "_");
iniLenEditor.setValue(textTarget!=null ? textTarget.numIniChars : 1);
iniText.setText(textTarget!=null ? (textTarget.iniText!=null ? textTarget.iniText : "") : "");
listEditor.setTextList(textTarget!=null ? textTarget.options : null);
int v=0;
if(textTarget!=null)
v=Math.max(Arrays.binarySearch(popValues, textTarget.infoMode), 0);
typeCombo.setSelectedIndex(v);
delayEditor.setValue(textTarget!=null ? textTarget.popupDelay : 0);
maxTimeEditor.setValue(textTarget!=null ? textTarget.popupMaxTime : 0);
onlyPlayChk.setSelected(textTarget!=null && textTarget.onlyPlay);
ActiveBoxContent abc=textTarget!=null ? textTarget.popupContent : null;
if(abc==null && textTarget!=null){
abc=new ActiveBoxContent();
abc.setDimension(new Dimension(100, 40));
}
jpab.setActiveBoxContent(abc);
if(abc!=null && abc.dimension!=null){
jpab.setBounds(0, 0, abc.dimension.width, abc.dimension.height);
}
checkEnabled();
//setModified(false);
//}
}
/*
public boolean isModified(){
return modified || answerListEditor.isModified() || listEditor.isModified();
}
public void setModified(boolean value){
modified=value;
if(value)
parentPanel.setModified(true);
}
*/
public void propertyChange(java.beans.PropertyChangeEvent ev) {
//setModified(true);
}
public void actionPerformed(java.awt.event.ActionEvent evt) {
if(evt!=null){
checkEnabled();
//setModified(true);
}
}
public void checkEnabled(){
answerListEditor.setEnabled(textTarget!=null);
maxLenEditor.setEnabled(textTarget!=null && !listChk.isSelected());
fillingCh.setEnabled(textTarget!=null && !listChk.isSelected());
iniLenEditor.setEnabled(textTarget!=null && !listChk.isSelected());
iniText.setEnabled(textTarget!=null);
listChk.setEnabled(textTarget!=null);
listEditor.setEnabled(textTarget!=null && listChk.isSelected());
typeCombo.setEnabled(textTarget!=null);
int v=typeCombo.getSelectedIndex();
delayEditor.setEnabled(textTarget!=null && v>0);
maxTimeEditor.setEnabled(textTarget!=null && v>0);
onlyPlayChk.setEnabled(textTarget!=null && v>0);
resizer.setEnabled(textTarget!=null && v>0);
if(typeCombo.isEnabled() && typeCombo.getSelectedIndex()>0)
((CardLayout)cardPanel.getLayout()).last(cardPanel);
else
((CardLayout)cardPanel.getLayout()).first(cardPanel);
}
public void collectData(){
if(textTarget!=null /*&& isModified()*/){
String[] answers=answerListEditor.getTextList();
if(answers.length>0)
textTarget.answer=answers;
if(listChk.isSelected()){
String[] textList=listEditor.getTextList();
if(textList.length>0){
textTarget.isList=true;
textTarget.options=textList;
}
}
else{
textTarget.isList=false;
textTarget.options=null;
textTarget.numIniChars=Math.max(1, iniLenEditor.getValue());
textTarget.maxLenResp=Math.max(1, maxLenEditor.getValue());
textTarget.iniText=edu.xtec.util.StrUtils.nullableString(iniText.getText());
String s=fillingCh.getText();
textTarget.iniChar= (s!=null && s.length()>0) ? s.charAt(0) : '_';
}
/*
textTarget.infoMode
= popupAlwaysOption.isSelected() ? TextTarget.INFO_ALWAYS
: popupOnErrorOption.isSelected() ? TextTarget.INFO_ON_ERROR
: popupOnDemandOption.isSelected() ? TextTarget.INFO_ON_DEMAND
: TextTarget.NO_INFO;
**/
textTarget.infoMode=popValues[Math.max(0, typeCombo.getSelectedIndex())];
textTarget.popupDelay=delayEditor.getValue();
textTarget.popupMaxTime=maxTimeEditor.getValue();
textTarget.onlyPlay=onlyPlayChk.isSelected();
if(textTarget.infoMode!=TextTarget.NO_INFO){
textTarget.popupContent=jpab.getActiveBoxContent();
}
}
}
public void resizeObjectTo(Rectangle r, JComponent jc){
if(jc==jpab){
jpab.setBounds(r.x, r.y, r.width, r.height);
Dimension d=new Dimension(r.width, r.height);
jpab.getActiveBoxContent().setDimension(d);
jpab.setPreferredSize(d);
jpab.setMaximumSize(d);
//setModified(true);
}
}
public void editObject(Rectangle r, JComponent jc, Point pt){
if(jc==jpab){
ActiveBoxContent abc=ActiveBoxContentEditor.getActiveBoxContent(
jpab.ab.getContent(), jpab, options,
mbe, jpab.ab);
if(abc!=null){
Dimension d=abc.getDimension();
jpab.setActiveBoxContent(abc);
if(d!=null)
jpab.setBounds(0, 0, d.width, d.height);
//setModified(true);
}
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel answerLb;
private edu.xtec.jclic.beans.TextListEditor answerListEditor;
private javax.swing.JPanel cardPanel;
private edu.xtec.jclic.beans.SmallIntEditor delayEditor;
private javax.swing.JLabel delayLb;
private javax.swing.JTextField fillingCh;
private javax.swing.JLabel fillingChLb;
private edu.xtec.jclic.beans.SmallIntEditor iniLenEditor;
private javax.swing.JLabel iniLenLb;
private javax.swing.JTextField iniText;
private javax.swing.JLabel iniTextLb;
private javax.swing.JCheckBox listChk;
private edu.xtec.jclic.beans.TextListEditor listEditor;
private edu.xtec.jclic.beans.SmallIntEditor maxLenEditor;
private edu.xtec.jclic.beans.SmallIntEditor maxTimeEditor;
private javax.swing.JLabel maxTimeLb;
private javax.swing.JLabel maxlenLb;
private javax.swing.JCheckBox onlyPlayChk;
private javax.swing.ButtonGroup popupOptions;
private javax.swing.JPanel popupPreview;
private javax.swing.JComboBox typeCombo;
// End of variables declaration//GEN-END:variables
public static boolean editTextTarget(TextTarget tt, Options options, MediaBagEditor mbe, Component parent){
TextTargetEditorPanel ttep=panels.get(options);
if(ttep==null){
ttep=new TextTargetEditorPanel(options, mbe);
panels.put(options, ttep);
}
ttep.setTextTarget(tt);
boolean result=options.getMessages().showInputDlg(parent, ttep, "edit_text_act_target");
if(result)
ttep.collectData();
ttep.setTextTarget(null);
return result;
}
}