/* * File : ActivitySequenceEditorPanel.java * Created : 10-jun-2002 16:36 * 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.bags; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import edu.xtec.util.SmallButton; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Font; import java.awt.event.FocusEvent; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ActivitySequenceEditorPanel extends EditorPanel implements ListSelectionListener, ListDataListener { public static final int ICON_WIDTH=20; public ActivitySequenceElementEditor currentItem; protected SeqTableModel tableModel; /** Creates new form ProjectLibraryEditorPanel */ public ActivitySequenceEditorPanel(Options options) { super(options); tableModel=new SeqTableModel(); ActivitySequenceEditor.createActions(options); ActivitySequenceElementEditor.createActions(options); initComponents(); initTable(); postInit(250, false, true); setEnabled(false); } private void initTable(){ TableColumn column; for(int i=2; i<4; i++){ column=seqTable.getColumnModel().getColumn(i); column.setMaxWidth(ICON_WIDTH); column.setPreferredWidth(ICON_WIDTH); column.setWidth(ICON_WIDTH); column.setHeaderRenderer(headerIcoCellRenderer); } seqTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); seqTable.getSelectionModel().addListSelectionListener(ActivitySequenceEditorPanel.this); } private TableCellRenderer headerIcoCellRenderer=new TableCellRenderer(){ JLabel lb; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){ if(lb==null){ lb=new JLabel(); Object o=UIManager.get("TableHeader.background"); if(o instanceof Color) lb.setBackground((Color)o); o=UIManager.get("TableHeader.cellBorder"); if(o instanceof Border) lb.setBorder((Border)o); o=UIManager.get("TableHeader.font"); if(o instanceof Font) lb.setFont((Font)o); o=UIManager.get("TableHeader.foreground"); if(o instanceof Color) lb.setForeground((Color)o); } if("prev".equals(value)){ lb.setText(""); lb.setIcon(ResourceManager.getImageIcon("icons/prev.gif")); lb.setToolTipText(options.getMsg("action_prev_tooltip")); } else if("next".equals(value)){ lb.setText(""); lb.setIcon(ResourceManager.getImageIcon("icons/next.gif")); lb.setToolTipText(options.getMsg("action_next_tooltip")); } return lb; } }; protected void currentItemChanged(){ if(!isInitializing()){ ActivitySequenceElementEditorPanel asep=(ActivitySequenceElementEditorPanel)edit; //asep.removeEditor(true); //if(currentItem!=null) asep.attachEditor(currentItem, true); } } public void valueChanged(ListSelectionEvent ev) { if(ev.getValueIsAdjusting() || getActivitySequenceEditor()==null) return; ActivitySequenceElementEditorPanel asep=(ActivitySequenceElementEditorPanel)edit; //if(currentItem!=null) // modified|=asep.dataChanged(); int row=seqTable.getSelectionModel().getAnchorSelectionIndex(); if(row>=0 && row<getActivitySequenceEditor().getChildCount()){ currentItem=(ActivitySequenceElementEditor)getActivitySequenceEditor().getChildAt(row); } else currentItem=null; currentItemChanged(); } public void contentsChanged(ListDataEvent e){ if(tableModel!=null) tableModel.fireTableDataChanged(); } public void intervalAdded(ListDataEvent e){ if(tableModel!=null) tableModel.fireTableDataChanged(); } public void intervalRemoved(ListDataEvent e) { if(tableModel!=null) tableModel.fireTableDataChanged(); } @Override public void focusGained(FocusEvent focusEvent) { //if(currentItem!=null) // currentItem.setActionsOwner(); ((ActivitySequenceElementEditorPanel)edit).focusGained(focusEvent); } /** 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.JScrollPane scroll; split = new javax.swing.JSplitPane(); scroll = new javax.swing.JScrollPane(); seqTable = new ActivitySequenceTable(tableModel); edit = new ActivitySequenceElementEditorPanel(options); setLayout(new java.awt.BorderLayout()); scroll.setMinimumSize(new java.awt.Dimension(300, 50)); scroll.setViewportView(seqTable); split.setLeftComponent(scroll); split.setRightComponent(edit); add(split, java.awt.BorderLayout.CENTER); }//GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof ActivitySequenceEditor; } protected ActivitySequence getActivitySequence(){ if(editor==null) return null; else return ((ActivitySequenceEditor)editor).getActivitySequence(); } /* public void clear() { super.clear(); ActivitySequenceElementEditorPanel asep=(ActivitySequenceElementEditorPanel)edit; asep.removeEditor(true); ActivitySequenceEditor ased=getActivitySequenceEditor(); if(ased!=null) ased.setListSelectionModel(null); } */ @Override public void setEnabled(boolean enabled){ super.setEnabled(enabled); edit.setEnabled(enabled); seqTable.setEnabled(enabled); } public void fillData(){ ActivitySequenceEditor ased=getActivitySequenceEditor(); if(ased==null){ ActivitySequenceElementEditorPanel asep=(ActivitySequenceElementEditorPanel)edit; asep.removeEditor(true); } else{ ased.setListSelectionModel(seqTable.getSelectionModel()); if(ased.getChildCount()>0){ seqTable.getSelectionModel().setSelectionInterval(0, 0); ActivitySequenceElementEditorPanel asep=(ActivitySequenceElementEditorPanel)edit; asep.attachEditor((Editor)ased.getChildAt(0), true); } tableModel.fireTableDataChanged(); } } public void saveData(){ ActivitySequence as=getActivitySequence(); if(as!=null){ //p.settings.title=checkEmptyString(titleText.getText(), true, "UNNAMED"); //titleText.setText(p.settings.title); } } /* public boolean isModified(){ boolean result=super.isModified(); if(!result){ ActivitySequenceElementEditorPanel asep=(ActivitySequenceElementEditorPanel)edit; result=asep.isModified(); } return result; } */ @Override protected Icon getIcon(){ return ActivitySequenceEditor.getIcon(); } @Override protected String getTitle(){ return "Activity sequence"; //return options.getMsg("library_dlg_title"); } public ActivitySequenceEditor getActivitySequenceEditor(){ return (ActivitySequenceEditor)getEditor(); } @Override protected void setEditor(Editor e){ if(getEditor()!=null) getEditor().getListModel().removeListDataListener(this); super.setEditor(e); if(getEditor()!=null) getEditor().getListModel().addListDataListener(this); } @Override protected void addActionsTo(Container cnt){ cnt.add(new SmallButton(ActivitySequenceEditor.newActivitySequenceElementAction)); cnt.add(new SmallButton(ActivityBagElementEditor.testActivityAction)); cnt.add(new SmallButton(Editor.moveUpAction)); cnt.add(new SmallButton(Editor.moveDownAction)); cnt.add(new SmallButton(Editor.copyAction)); cnt.add(new SmallButton(Editor.cutAction)); cnt.add(new SmallButton(Editor.pasteAction)); cnt.add(new SmallButton(Editor.deleteAction)); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel edit; protected javax.swing.JTable seqTable; private javax.swing.JSplitPane split; // End of variables declaration//GEN-END:variables class SeqTableModel extends AbstractTableModel{ public boolean drawDivider(int row){ boolean result=false; ActivitySequenceEditor ase=getActivitySequenceEditor(); if(ase!=null){ //ActivitySequence as=ase.getActivitySequence(); ActivitySequenceElementEditor ased1=(ActivitySequenceElementEditor)ase.getChildAt(row); //ActivitySequenceElement e1 = as==null ? null : as.getElement(row, false); ActivitySequenceElementEditor ased2= (row==ase.getChildCount()-1) ? null : (ActivitySequenceElementEditor)ase.getChildAt(row+1); //ActivitySequenceElement e2 = (as==null || row==as.getSize()-1) ? null : as.getElement(row+1, false); result=(ased1!=null && ased1.getActivitySequenceElement().fwdJump!=null) ||(ased2!=null && ased2.getActivitySequenceElement().backJump!=null); //result=(e1!=null && e1.fwdJump!=null)||(e2!=null && e2.backJump!=null); } return result; } public int getRowCount(){ Editor e=getEditor(); return e==null ? 0 : e.getChildCount(); } public int getColumnCount(){ return 4; } @Override public Class getColumnClass(int columnIndex){ if(columnIndex==2 || columnIndex==3) return ImageIcon.class; else return java.lang.String.class; } public Object getValueAt(int row, int column){ Object result=null; ActivitySequenceEditor ase=getActivitySequenceEditor(); if(ase!=null){ ActivitySequenceElementEditor ased=(ActivitySequenceElementEditor)ase.getChildAt(row); if(ased!=null){ switch(column){ case 0: result=ased.getTag(); break; case 1: result=ased.getActivitySequenceElement().getActivityName(); break; case 2: case 3: result=ActivitySequenceElementEditor.getElementIcon(ased.getActivitySequenceElement(), column==3); break; /* case 4: result=ActivitySequenceElementEditor.getElementJumpDescription(asel); break; */ } } } return result; } @Override public String getColumnName(int column){ String result=""; switch(column){ case 0: result=options.getMsg("edit_seq_tag_header"); break; case 1: result=options.getMsg("edit_seq_activity_header"); break; case 2: result="prev"; break; case 3: result="next"; break; } return result; } } }