/* * File : ActiveBoxContentEditor.java * Created : 02-oct-2002 12:53 * 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.boxes; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.beans.*; import edu.xtec.jclic.media.MediaContentEditor; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import java.awt.Dimension; import java.util.EventObject; import java.util.HashMap; import java.util.Map; import javax.swing.event.DocumentEvent; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class ActiveBoxContentEditor extends edu.xtec.util.CtrlPanel { Options options; ActiveBoxContent abc; MediaBagEditor mbe; boolean eventsEnabled=true; public static final String PROP_ABC="activeBoxContent"; ActiveBox preview; /** Creates new form ActiveBoxContentEditor */ public ActiveBoxContentEditor(Options options, ActiveBoxContent abc, MediaBagEditor mbe, ActiveBox ab) { this.options=options; initComponents(); setMediaBagEditor(mbe); setActiveBoxContent(abc); textArea.getDocument().addDocumentListener(this); setPreview(ab); } /** 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 java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel imgLb; javax.swing.JSeparator sep1; javax.swing.JSeparator sep11; javax.swing.JSeparator sep2; javax.swing.JLabel textLb; hAlignGrp = new javax.swing.ButtonGroup(); vAlignGrp = new javax.swing.ButtonGroup(); textLb = new javax.swing.JLabel(); textScroll = new javax.swing.JScrollPane(); textArea = new javax.swing.JTextArea(); textCompass = new edu.xtec.jclic.beans.Compass(); sep1 = new javax.swing.JSeparator(); imgLb = new javax.swing.JLabel(); imgButton = new edu.xtec.jclic.beans.ImgButton(); imgButton.setOptions(options); overlapChk = new javax.swing.JCheckBox(); imgCompass = new edu.xtec.jclic.beans.Compass(); sep2 = new javax.swing.JSeparator(); styleLb = new javax.swing.JLabel(); boxBaseButton = new edu.xtec.jclic.beans.BoxBaseButton(); boxBaseButton.setOptions(options); borderChk = new javax.swing.JCheckBox(); sep11 = new javax.swing.JSeparator(); mcLb = new javax.swing.JLabel(); mcButton = new edu.xtec.jclic.beans.MediaContentButton(); mcButton.setOptions(options); sizeSep = new javax.swing.JSeparator(); sizeLb = new javax.swing.JLabel(); sizePanel = new javax.swing.JPanel(); widthLb = new javax.swing.JLabel(); widthEdit = new edu.xtec.jclic.beans.SmallIntEditor(); heightLb = new javax.swing.JLabel(); heightEdit = new edu.xtec.jclic.beans.SmallIntEditor(); setLayout(new java.awt.GridBagLayout()); setBorder(new javax.swing.border.EtchedBorder()); textLb.setLabelFor(textArea); textLb.setText(options.getMsg("edit_act_text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; add(textLb, gridBagConstraints); textScroll.setPreferredSize(new java.awt.Dimension(300, 3)); textArea.setWrapStyleWord(true); textArea.setLineWrap(true); textScroll.setViewportView(textArea); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(textScroll, gridBagConstraints); textCompass.addPropertyChangeListener(Compass.PROP_DIRECTION, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(textCompass, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep1, gridBagConstraints); imgLb.setText(options.getMsg("edit_act_image")); imgLb.setLabelFor(imgButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(imgLb, gridBagConstraints); imgButton.setToolTipText(options.getMsg("edit_act_image_tooltip")); imgButton.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(imgButton, gridBagConstraints); overlapChk.setToolTipText(options.getMsg("edit_act_overlap_tooltip")); overlapChk.setText(options.getMsg("edit_act_overlap")); overlapChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(overlapChk, gridBagConstraints); imgCompass.addPropertyChangeListener(Compass.PROP_DIRECTION, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = 2; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(imgCompass, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep2, gridBagConstraints); styleLb.setText(options.getMsg("edit_act_style")); styleLb.setLabelFor(boxBaseButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(styleLb, gridBagConstraints); boxBaseButton.setToolTipText(options.getMsg("edit_style_tooltip")); boxBaseButton.addPropertyChangeListener(BoxBaseButton.PROP_BOX_BASE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(boxBaseButton, gridBagConstraints); borderChk.setToolTipText(options.getMsg("edit_act_border_tooltip")); borderChk.setText(options.getMsg("edit_act_border")); borderChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(borderChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep11, gridBagConstraints); mcLb.setLabelFor(mcButton); mcLb.setText(options.getMsg("edit_mc_label")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(mcLb, gridBagConstraints); mcButton.addPropertyChangeListener(MediaContentButton.PROP_MEDIA_CONTENT, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(mcButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sizeSep, gridBagConstraints); sizeLb.setLabelFor(sizePanel); sizeLb.setText(options.getMsg("edit_cell_size")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(sizeLb, gridBagConstraints); sizePanel.setLayout(new java.awt.GridBagLayout()); widthLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_width.gif"))); widthLb.setLabelFor(widthEdit); widthLb.setText(":"); widthLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; sizePanel.add(widthLb, gridBagConstraints); widthEdit.setToolTipText(options.getMsg("edit_act_cell_width_tooltip")); widthEdit.setMax(999); widthEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); widthEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 2, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; sizePanel.add(widthEdit, gridBagConstraints); heightLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_height.gif"))); heightLb.setLabelFor(widthEdit); heightLb.setText(":"); heightLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 12, 3, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; sizePanel.add(heightLb, gridBagConstraints); heightEdit.setToolTipText(options.getMsg("edit_act_cell_height_tooltip")); heightEdit.setMax(999); heightEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); heightEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 2, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; sizePanel.add(heightEdit, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(sizePanel, gridBagConstraints); }//GEN-END:initComponents public void setPreview(ActiveBox ab){ preview=ab; boxBaseButton.setPreview(ab); } @Override public boolean genericEvent(Object event){ Object src=(event instanceof EventObject) ? ((EventObject)event).getSource() : (event instanceof DocumentEvent) ? textArea : null; if(eventsEnabled && src!=null){ eventsEnabled=false; ActiveBoxContent oldAbc=getAbcClone(); boolean resetPreviewFont=false; if(src==textArea){ String txt=textArea.getText(); if(!StrUtils.compareTrimStringsIgnoreCase(txt, abc.rawText)){ abc.setTextContent(txt!=null && txt.length()>0 ? txt : null); if(abc.bb!=null) abc.bb.resetFont(); } } else if(src==imgButton){ if(abc.imgName!=null) abc.img=null; abc.imgName=imgButton.getImgName(); } else if(src==borderChk) abc.border=borderChk.isSelected(); else if(src==overlapChk){ abc.avoidOverlapping=overlapChk.isSelected(); resetPreviewFont=true; } else if(src==textCompass){ abc.txtAlign=textCompass.getDoubleDirection(); resetPreviewFont=true; } else if(src==imgCompass){ abc.imgAlign=imgCompass.getDoubleDirection(); resetPreviewFont=true; } else if(src==boxBaseButton){ abc.bb=boxBaseButton.getBoxBase(); resetPreviewFont=true; } else if(src==mcButton){ abc.mediaContent=mcButton.getMediaContent(); //resetPreviewFont=true; } else if(abc.dimension!=null && src==widthEdit ||src==heightEdit){ abc.setDimension(new Dimension(widthEdit.getValue(), heightEdit.getValue())); } if(mbe!=null && (src==textArea || src==imgButton)){ try{ abc.realizeContent(mbe.getMediaBag()); } catch(Exception ex){ options.getMessages().showErrorWarning(this, "ERROR", ex); } } if(preview!=null){ BoxBase bb=abc.bb; if(resetPreviewFont && bb!=null) bb.resetFont(); preview.setCurrentContent(abc); } checkAndFirePropertyChange(oldAbc); eventsEnabled=true; } return true; } public void setActiveBoxContent(ActiveBoxContent c){ if(c==null) c=new ActiveBoxContent(); eventsEnabled=false; abc=(ActiveBoxContent)c.clone(); textArea.setText(abc.text); imgButton.clear(); imgButton.setImgName(abc.imgName); borderChk.setSelected(abc.border==null ? false : abc.border.booleanValue()); textCompass.setDoubleDirection(abc.txtAlign); imgCompass.setDoubleDirection(abc.imgAlign); overlapChk.setSelected(abc.avoidOverlapping); boxBaseButton.setBoxBase(abc.bb); mcButton.clear(); mcButton.setMediaContent(abc.mediaContent); Dimension size=abc.getDimension(); sizeSep.setVisible(size!=null); sizeLb.setVisible(size!=null); sizePanel.setVisible(size!=null); widthEdit.setValue(size==null ? 0 : size.width); heightEdit.setValue(size==null ? 0 : size.height); if(preview!=null) preview.setCurrentContent(abc); eventsEnabled=true; } public ActiveBoxContent getAbc(){ if(abc.dimension!=null){ abc.setDimension(new Dimension(widthEdit.getValue(), heightEdit.getValue())); } return abc; } public ActiveBoxContent getAbcClone(){ return abc==null ? null : (ActiveBoxContent)abc.clone(); } private void checkAndFirePropertyChange(ActiveBoxContent oldAbc){ ActiveBoxContent currentAbc=getAbc(); boolean eq=((oldAbc==null && currentAbc==null) || (oldAbc!=null && oldAbc.equals(currentAbc))); if(!eq) firePropertyChange(PROP_ABC, oldAbc, currentAbc); } public void setMediaBagEditor(MediaBagEditor mbe){ this.mbe=mbe; imgButton.setMediaBagEditor(mbe); mcButton.setMediaBagEditor(mbe); } private static Map<Options, ActiveBoxContentEditor> panels=new HashMap<Options, ActiveBoxContentEditor>(); public static ActiveBoxContent getActiveBoxContent(ActiveBoxContent initialAbc, Component parent, Options options, MediaBagEditor mbe, ActiveBox preview){ if(initialAbc==null) initialAbc=new ActiveBoxContent(); Messages msg=options.getMessages(); ActiveBoxContentEditor abce=panels.get(options); if(abce==null){ abce=new ActiveBoxContentEditor(options, initialAbc, mbe, preview); panels.put(options, abce); } else{ abce.setPreview(null); abce.setMediaBagEditor(mbe); abce.setActiveBoxContent(initialAbc); abce.setPreview(preview); } ActiveBoxContent abcBackup=null, abcOriginal=null; if(preview!=null){ abcOriginal=preview.getCurrentContent(); if(abcOriginal!=null) abcBackup=(ActiveBoxContent)abcOriginal.clone(); } boolean b=msg.showInputDlg(parent, abce, "edit_cell_title"); if(!b && preview!=null){ //preview.setCurrentContent(abcBackup); if(abcOriginal!=null && abcBackup!=null){ abcOriginal.copyRawDataFrom(abcBackup); } preview.setCurrentContent(abcOriginal); } return b ? abce.getAbc() : null; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox borderChk; private edu.xtec.jclic.beans.BoxBaseButton boxBaseButton; private javax.swing.ButtonGroup hAlignGrp; private edu.xtec.jclic.beans.SmallIntEditor heightEdit; private javax.swing.JLabel heightLb; private edu.xtec.jclic.beans.ImgButton imgButton; private edu.xtec.jclic.beans.Compass imgCompass; private edu.xtec.jclic.beans.MediaContentButton mcButton; private javax.swing.JLabel mcLb; private javax.swing.JCheckBox overlapChk; private javax.swing.JLabel sizeLb; private javax.swing.JPanel sizePanel; private javax.swing.JSeparator sizeSep; private javax.swing.JLabel styleLb; private javax.swing.JTextArea textArea; private edu.xtec.jclic.beans.Compass textCompass; private javax.swing.JScrollPane textScroll; private javax.swing.ButtonGroup vAlignGrp; private edu.xtec.jclic.beans.SmallIntEditor widthEdit; private javax.swing.JLabel widthLb; // End of variables declaration//GEN-END:variables // Utility functions public static boolean nameChanged(ActiveBoxContent abc, int type, String oldName, String newName){ boolean result=false; if((type & Constants.T_IMAGE)!=0 && oldName.equals(abc.imgName)){ abc.imgName=newName; result=true; } if(abc.mediaContent!=null) result|=MediaContentEditor.nameChanged(abc.mediaContent, type, oldName, newName); return result; } }