/* * File : TextListEditor.java * Created : 23-may-2003 11:19 * 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.beans; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.swing.DefaultListModel; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.29 */ public class TextListEditor extends javax.swing.JPanel implements javax.swing.event.ListSelectionListener{ public static final String PROP_LIST="list"; Options options; DefaultListModel listModel; boolean modified; int maxItems=999; int minItems=0; boolean upperCase; /** Creates new form TextListEditor */ public TextListEditor() { this(null); } /** Creates new form TextListEditor */ public TextListEditor(Options options) { this.options=options; listModel=new DefaultListModel(); initComponents(); list.addListSelectionListener(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 java.awt.GridBagConstraints gridBagConstraints; javax.swing.JScrollPane listScroll; listScroll = new javax.swing.JScrollPane(); list = new javax.swing.JList(); btnPanel = new javax.swing.JPanel(); addBtn = new javax.swing.JButton(); removeBtn = new javax.swing.JButton(); editBtn = new javax.swing.JButton(); upBtn = new javax.swing.JButton(); downBtn = new javax.swing.JButton(); setLayout(new java.awt.GridBagLayout()); listScroll.setPreferredSize(new java.awt.Dimension(100, 60)); list.setModel(listModel); list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); listScroll.setViewportView(list); 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); add(listScroll, gridBagConstraints); btnPanel.setLayout(new javax.swing.BoxLayout(btnPanel, javax.swing.BoxLayout.X_AXIS)); addBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/plus16.gif"))); addBtn.setToolTipText(options==null ? "" : options.getMsg("edit_list_newElement_tooltip")); addBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); addBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addBtnActionPerformed(evt); } }); btnPanel.add(addBtn); removeBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/minus16.gif"))); removeBtn.setToolTipText(options==null ? "" : options.getMsg("edit_list_deleteElement_tooltip")); removeBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); removeBtn.setEnabled(false); removeBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeBtnActionPerformed(evt); } }); btnPanel.add(removeBtn); editBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/edit.gif"))); editBtn.setToolTipText(options==null ? "" : options.getMsg("edit_list_editElement_tooltip")); editBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); editBtn.setEnabled(false); editBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editBtnActionPerformed(evt); } }); btnPanel.add(editBtn); upBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/up.gif"))); upBtn.setToolTipText(options==null ? "" : options.getMsg("edit_list_upBtn_tooltip")); upBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); upBtn.setEnabled(false); upBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { upBtnActionPerformed(evt); } }); btnPanel.add(upBtn); downBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/down.gif"))); downBtn.setToolTipText(options==null ? "" : options.getMsg("edit_list_downBtn_tooltip")); downBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); downBtn.setEnabled(false); downBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { downBtnActionPerformed(evt); } }); btnPanel.add(downBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 2, 2, 2); add(btnPanel, gridBagConstraints); }//GEN-END:initComponents private void addBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addBtnActionPerformed int v=list.getSelectedIndex(); if(options!=null){ //String s=options.getMessages().showInputDlg(this, (String)null, "edit_list_newValue", "", "edit_list_addElement", false); Object s=editItem(null, true); if(s!=null && s.toString().length()>0){ if(upperCase) s=s.toString().toUpperCase(); listModel.add(v+1, s); list.setSelectedIndex(v+1); firePropertyChange(PROP_LIST, "", s); modified=true; } } }//GEN-LAST:event_addBtnActionPerformed private void editBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editBtnActionPerformed int v=list.getSelectedIndex(); if(v>=0 && options!=null){ Object s=listModel.getElementAt(v); //String r=options.getMessages().showInputDlg(this, (String)null, "edit_list_newValue", s, "edit_list_modifyValue", false); Object r=editItem(s, false); if(r!=null && r.toString().length()>0 && !r.equals(s)){ if(upperCase) r=r.toString().toUpperCase(); listModel.setElementAt(r, v); firePropertyChange(PROP_LIST, s, r); modified=true; } } }//GEN-LAST:event_editBtnActionPerformed private void downBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downBtnActionPerformed int i=list.getSelectedIndex(); if(i>=0 && i<listModel.getSize()-1){ listModel.add(i+1, listModel.remove(i)); list.setSelectedIndex(i+1); firePropertyChange(PROP_LIST, i, i+1); modified=true; } }//GEN-LAST:event_downBtnActionPerformed private void upBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upBtnActionPerformed int i=list.getSelectedIndex(); if(i>0){ listModel.add(i-1, listModel.remove(i)); list.setSelectedIndex(i-1); firePropertyChange(PROP_LIST, i, i-1); modified=true; } }//GEN-LAST:event_upBtnActionPerformed private void removeBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeBtnActionPerformed Object o=list.getSelectedValue(); if(o!=null){ listModel.removeElement(o); firePropertyChange(PROP_LIST, o, null); modified=true; checkEnabled(); } }//GEN-LAST:event_removeBtnActionPerformed /** Getter for property options. * @return Value of property options. */ public edu.xtec.util.Options getOptions() { return options; } /** Setter for property options. * @param options New value of property options. */ public void setOptions(edu.xtec.util.Options options) { this.options = options; } public void valueChanged(javax.swing.event.ListSelectionEvent listSelectionEvent) { if(listSelectionEvent==null || !listSelectionEvent.getValueIsAdjusting()){ checkEnabled(); } } protected void checkEnabled(){ boolean enabled=isEnabled(); int v=list.getSelectedIndex(); int c=listModel.size(); addBtn.setEnabled(enabled && c<maxItems); upBtn.setEnabled(enabled && v>0); downBtn.setEnabled(enabled && v>=0 && v<list.getModel().getSize()-1); removeBtn.setEnabled(enabled && v>=0 && c>minItems); editBtn.setEnabled(enabled && v>=0); } /** Getter for property listData. * @return Value of property listData. */ public List<Object> getListData() { Enumeration en=listModel.elements(); List<Object> result=new ArrayList<Object>(listModel.getSize()); while(en.hasMoreElements()){ Object o=en.nextElement(); // In some cases, DefaultListModel returns elements as a "list of elements" // with only one object inside if(o instanceof List){ List al=(List)o; o=al.get(0); } result.add(o); } return result; } /** Setter for property listData. * @param listData New value of property listData. */ public void setListData(List<Object> listData) { listModel.removeAllElements(); if(listData!=null){ for(Object o : listData){ if(upperCase) o=o.toString().toUpperCase(); listModel.addElement(o); } } modified=false; checkEnabled(); } /** Setter for property listData. * @param textList String array with the list values. */ public void setTextList(String[] textList) { listModel.removeAllElements(); if(textList!=null){ for(int i=0; i<textList.length && i<maxItems; i++){ String s=textList[i]; if(upperCase) s=s.toUpperCase(); listModel.addElement(s); } } modified=false; checkEnabled(); } public String[] getTextList(){ List v=getListData(); int n=v.size(); String[] result=new String[n]; for(int i=0; i<n; i++) result[i]=v.get(i).toString(); return result; } /** Getter for property modified. * @return Value of property modified. */ public boolean isModified() { return modified; } /** Setter for property modified. * @param modified New value of property modified. */ public void setModified(boolean modified) { this.modified = modified; } @Override public void setEnabled(boolean enabled){ super.setEnabled(enabled); checkEnabled(); } /** Getter for property maxItems. * @return Value of property maxItems. */ public int getMaxItems() { return maxItems; } /** Setter for property maxItems. * @param maxItems New value of property maxItems. */ public void setMaxItems(int maxItems) { this.maxItems = maxItems; checkEnabled(); } /** Getter for property minItems. * @return Value of property minItems. */ public int getMinItems() { return minItems; } /** Setter for property minItems. * @param minItems New value of property minItems. */ public void setMinItems(int minItems) { this.minItems = minItems; checkEnabled(); } protected Object editItem(Object currentValue, boolean newValue){ Object result; if(newValue) result=options.getMessages().showInputDlg(this, (String)null, "edit_list_newValue", "", "edit_list_addElement", false); else result=options.getMessages().showInputDlg(this, (String)null, "edit_list_newValue", StrUtils.nullableString(currentValue), "edit_list_modifyValue", false); return result; } @Override public void setToolTipText(String text){ super.setToolTipText(text); list.setToolTipText(text); btnPanel.setToolTipText(text); } /** Getter for property upperCase. * @return Value of property upperCase. * */ public boolean isUpperCase() { return upperCase; } /** Setter for property upperCase. * @param upperCase New value of property upperCase. * */ public void setUpperCase(boolean upperCase) { this.upperCase = upperCase; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addBtn; private javax.swing.JPanel btnPanel; private javax.swing.JButton downBtn; private javax.swing.JButton editBtn; private javax.swing.JList list; private javax.swing.JButton removeBtn; private javax.swing.JButton upBtn; // End of variables declaration//GEN-END:variables }