001    /* BEE - Book Editing Environment for PAVLOV
002     * Copyright (C) 2004 T.J. Willis
003     * 
004     * This program is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU General Public License
006     * as published by the Free Software Foundation; either version 2
007     * of the License, or (at your option) any later version.
008     * 
009     * This program is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012     * GNU General Public License for more details.
013     * 
014     * You should have received a copy of the GNU General Public License
015     * along with this program; if not, write to the Free Software
016     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
017     *
018     * $Header: /cvsroot/pavlov/net/sourceforge/bee/ChapterTableModel.java,v 1.8 2004/06/24 07:56:15 tj_willis Exp $
019     */
020    package net.sourceforge.bee;
021    
022    import javax.swing.table.*;
023    import java.util.*;
024    import java.lang.reflect.Array;
025    
026    import net.sourceforge.pavlov.library.*;
027    
028    /**
029     * A TableModel for displaying all the questions in a chapter.
030     *
031     * @author <a href="mailto:tj_willis@users.sourceforge.net">T.J. Willis</a>
032     * @version $Id: ChapterTableModel.java,v 1.8 2004/06/24 07:56:15 tj_willis Exp $
033     */
034    public class ChapterTableModel
035    extends AbstractTableModel
036    {
037      private Question qs[];
038    
039        // FIXME: what's all this package-private crap?
040      void sortByID()
041      {
042        Arrays.sort(qs,new QuestionIDComparator());
043        fireTableDataChanged();
044      }
045    
046      void sortByText()
047      {
048        Arrays.sort(qs,new QuestionTextComparator());
049        fireTableDataChanged();
050      }
051      void sortByRightAnswer()
052      {
053        Arrays.sort(qs,new QuestionRightAnswerComparator());
054        fireTableDataChanged();
055      }
056    
057      Question getQuestion(int row)
058      {
059        try {
060          return qs[row];
061        } catch (Exception e) {
062          
063        }
064        return null;
065      }
066    
067      void setQuestion(int row, Question q)
068      {
069         try {
070          qs[row] = q;
071          fireTableDataChanged();
072        } catch (Exception e) {
073          
074        }   
075      }
076    
077    
078      java.util.List<Question> getQuestions()
079      {
080          return (List<Question>)Arrays.asList(qs);
081      }
082    
083      void setQuestions(java.util.List<Question> l)
084      {
085        Vector<Question> v = new Vector<Question>(l);
086        v.trimToSize();
087        qs = null;
088        qs = new Question[l.size()];
089        qs = (Question [])v.toArray(qs);
090        //fireTableRowsInserted(row,row);
091        fireTableDataChanged();
092      }
093    
094      void insertQuestion(int row, Question q)
095      {
096         try {
097           java.util.List<Question> l = Arrays.asList(qs);
098           Vector<Question> v = new Vector<Question>(l);
099           //System.out.println("rc is : " + getRowCount());
100           v.insertElementAt(q,row);
101           v.trimToSize();
102           qs = (Question [])v.toArray(qs);
103           //System.out.println("rc is : " + getRowCount());
104           fireTableRowsInserted(row,row);
105           fireTableDataChanged();
106        } catch (Exception e) {
107          System.out.println(e);
108        }   
109      }
110    
111    
112        // had a nicer implementation, but it didn't work
113      void deleteQuestions(int indices[])
114      {
115          //System.out.println("RC is " + getRowCount());
116          if(indices==null) return;
117          int x = Array.getLength(indices);
118          int y = Array.getLength(qs);
119          if(x>y) return;
120          ArrayList<Question> al = new ArrayList<Question>(y-x);
121          for(int i=0;i<y;i++){
122              if( qs[i]==null) continue;
123              boolean found=false;
124              for(int j=0;j<x;j++){
125                  if(i==indices[j]){
126                      found = true;
127                      break;
128                  }
129              }
130              if(!found) al.add(qs[i]);
131          }
132          qs = null;
133          qs = new Question[y-x];
134          qs = (Question [])(al.toArray(qs));
135          for(int j=0;j<x;j++)
136              fireTableRowsDeleted(indices[j],indices[j]); 
137          fireTableStructureChanged();
138          fireTableDataChanged();
139      }
140    
141      private Vector getQuestions(int indices[])
142      {
143        Vector<Question> v = new Vector<Question>();
144        int x = java.lang.reflect.Array.getLength(indices);
145        for(int i=0;i<x;i++)
146          {
147              v.add(getQuestion(indices[i]));
148          }  
149        
150        return v;
151      }
152    
153      void deleteQuestion(int row)
154      {
155          int foo[] = new int[1];
156          foo[0] = row;
157          deleteQuestions(foo);
158      }
159    
160    
161        /**
162         * Creates a new <code>ChapterTableModel</code> instance.
163         *
164         * @param arr[] a <code>Question</code> value
165         */
166        public ChapterTableModel(Question arr[])
167      {
168        qs=arr;
169      }
170    
171        /**
172         * Describe <code>getColumnClass</code> method here.
173         *
174         * @param i an <code>int</code> value
175         * @return a <code>Class</code> value
176         */
177        public Class getColumnClass(int i) { 
178        String s = new String();
179        return s.getClass();
180      }
181    
182      boolean validEntry(int row, int col)
183      {
184        String s = (String)getValueAt(row,col);
185        if(s==null) return false;
186        if(s.indexOf('<')>0) return false;
187        if(s.indexOf('&')>0) return false;
188        //if(s.indexOf('/')>0) return false;
189        //if(s.indexOf('\"')>0) return false;
190    
191    
192        // KISS Principle
193        // make sure id isn't used anywhere else
194        if(col==0){
195            int x= java.lang.reflect.Array.getLength(qs);
196            for(int i=0;i<x;i++){
197                if(i==row) continue;
198                if(s.equals(getValueAt(i,0)))
199                   return false;
200            }
201        }
202        return true;
203      }
204    
205        /**
206         * Returns number of columns for table.
207         *
208         * @return an <code>int</code> value
209         */
210        public int getColumnCount() { return 7; }
211        /**
212         * Returns number of questions in chapter.
213         *
214         * @return an <code>int</code> value
215         */
216        public int getRowCount() { return Array.getLength(qs);}
217        /**
218         * Implemented to always return true.
219         *
220         * @param rowIndex an <code>int</code> value
221         * @param columnIndex an <code>int</code> value
222         * @return a <code>boolean</code> value
223         */
224        public boolean isCellEditable(int rowIndex, int columnIndex) { return true;} 
225    
226        /**
227         * Picks the appropriate value out of the list of questions to
228         * display in the JTable.
229         *
230         * @param row an <code>int</code> value
231         * @param col an <code>int</code> value
232         * @return an <code>Object</code> value
233         */
234        public Object getValueAt(int row, int col) 
235      { 
236        try {
237          Question q = qs[row];
238          if(col == 0)
239            return q.getID();
240          else if (col == 1)
241            return q.getText();
242          else if (col == 2)
243            return q.getRightAnswer();
244          else if (col == 3)
245            {
246              if(q.getWrongAnswer(0)==null)
247                q.setWrongAnswer("a",0);
248              return q.getWrongAnswer(0);
249            }
250          else if (col == 4)
251            {
252              if(q.getWrongAnswer(1)==null)
253                q.setWrongAnswer(" ",1);
254              return q.getWrongAnswer(1);
255            }
256          else if (col == 5)
257            {
258              if(q.getWrongAnswer(2)==null)
259                q.setWrongAnswer(" ",2);
260              return q.getWrongAnswer(2);
261            }
262          else if (col == 6)
263            {
264              return q.getImageFile();
265            }
266        } catch (Exception e) {
267          System.out.println(e);
268        }
269        return null;
270      }
271    
272    
273        /**
274         * Sets the appropriate value in the question corresponding to the edited
275         * row.
276         *
277         * @param val an <code>Object</code> value
278         * @param row an <code>int</code> value
279         * @param col an <code>int</code> value
280         */
281        public void setValueAt(Object val, int row, int col)
282      { 
283        try {
284          String s = val.toString();
285          Question q = qs[row];
286          if(col == 0)
287            q.setId(s);
288          else if (col == 1)
289            q.setText(s);
290          else if (col == 2)
291            q.setRightAnswer(s);
292          else if (col == 3)
293            q.setWrongAnswer(s,0);
294          else if (col == 4)
295            q.setWrongAnswer(s,1);
296          else if (col == 5)
297            q.setWrongAnswer(s,2);
298          else if (col == 6)
299            q.setImageFile(s);
300        } catch (Exception e) {
301          System.out.println(e);
302        }
303      }
304    
305    
306        /**
307         * Returns user-readable column names for JTable.
308         *
309         * @param i an <code>int</code> value
310         * @return a <code>String</code> value
311         */
312        public String getColumnName(int i)
313      {
314        if(i==0)
315          return "ID";
316        else if (i==1)
317          return "Question Text";
318        else if (i==2)
319          return "Correct Answer";
320        else if (i==3)
321          return "Incorrect Answer";
322        else if (i==4)
323          return "Incorrect Answer";
324        else if (i==5)
325          return "Incorrect Answer";
326        else if (i==6)
327          return "Diagram";
328        return null;
329      }
330      
331    }
332    
333    
334    
335    
336    
337    
338    
339    
340    
341    
342    
343    
344    
345    
346    
347    
348    
349