File:  [LON-CAPA] / capa / capa51 / JavaTools / TScore.java
Revision 1.5: download - view: text, annotated - select for diffs
Mon Aug 7 20:47:29 2000 UTC (23 years, 9 months ago) by albertel
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_X, version_2_5_99_1, version_2_5_99_0, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_12_X, version_2_11_X, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, version_1_3_X, version_1_3_3, version_1_3_2, version_1_3_1, version_1_3_0, version_1_2_X, version_1_2_99_1, version_1_2_99_0, version_1_2_1, version_1_2_0, version_1_1_X, version_1_1_99_5, version_1_1_99_4, version_1_1_99_3, version_1_1_99_2, version_1_1_99_1, version_1_1_99_0, version_1_1_3, version_1_1_2, version_1_1_1, version_1_1_0, version_1_0_99_3, version_1_0_99_2, version_1_0_99_1, version_1_0_99, version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, version_0_99_3, version_0_99_2, version_0_99_1, version_0_99_0, version_0_6_2, version_0_6, version_0_5_1, version_0_5, version_0_4, stable_2002_spring, stable_2002_july, stable_2002_april, stable_2001_fall, release_5-1-3, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, conference_2003, bz6209-base, bz6209, STABLE, HEAD, GCI_3, GCI_2, GCI_1, CAPA_5-1-6, CAPA_5-1-5, CAPA_5-1-4_RC1, BZ4492-merge, BZ4492-feature_horizontal_radioresponse, BZ4492-feature_Support_horizontal_radioresponse, BZ4492-Support_horizontal_radioresponse
- fixed license notices the reference the GNU GPL rather than the GNU LGPL

    1: /* old score extrapolator widget
    2:    Copyright (C) 1992-2000 Michigan State University
    3: 
    4:    The CAPA system is free software; you can redistribute it and/or
    5:    modify it under the terms of the GNU General Public License as
    6:    published by the Free Software Foundation; either version 2 of the
    7:    License, or (at your option) any later version.
    8: 
    9:    The CAPA system is distributed in the hope that it will be useful,
   10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   12:    General Public License for more details.
   13: 
   14:    You should have received a copy of the GNU General Public
   15:    License along with the CAPA system; see the file COPYING.  If not,
   16:    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   17:    Boston, MA 02111-1307, USA.
   18: 
   19:    As a special exception, you have permission to link this program
   20:    with the TtH/TtM library and distribute executables, as long as you
   21:    follow the requirements of the GNU GPL in regard to all of the
   22:    software in the executable aside from TtH/TtM.
   23: */
   24: 
   25: import java.applet.*;
   26: import java.awt.*;
   27: import java.lang.*;
   28: import java.util.*;
   29: import java.net.*;
   30: import java.awt.event.*;
   31: 
   32: public class TScore extends Applet implements Runnable {
   33:   public float   W[];
   34:   public int     Entry_cnt,  Exam_cnt;
   35:   public float   S[], F[];
   36:   public int     X[], C[], R[];
   37:   public float   SF_ratio[],  SF_percent[];
   38:   public float   Sum_ratio[], Sum_percent[];
   39:   public float   Exam_ratio[], Raw_exam_ratio[], Raw_epc_ratio[];
   40:   public float   Term_score;
   41:      
   42:   ExpPanel     []  HQpanel;
   43:   ExmPanel     []  EXpanel;
   44:   Label            TitleL;
   45:   Label            EqL;
   46: 
   47: public void init() {
   48:    String      p;
   49:    int         fs;
   50:    int         idx;
   51: 
   52:    C       = new int[2];
   53:    R       = new int[2];
   54:    W       = new float[5];
   55: 
   56: //  final exam set number   
   57:    p=getParameter("FS"); 
   58:    fs = (p==null)?1:Integer.valueOf(p).intValue();
   59: // how many entries 
   60:    Entry_cnt= ((fs == 0)? 2 : 1 +  2*fs); 
   61: // how many exams
   62:    Exam_cnt = (Entry_cnt - 3 ) / 2; 
   63: 
   64:    S      = new float[Entry_cnt];
   65:    F      = new float[Entry_cnt];
   66:    X      = new int[Entry_cnt];
   67:    SF_ratio  = new float[Entry_cnt];
   68:    SF_percent= new float[Entry_cnt];
   69:    Sum_ratio = new float[Entry_cnt];
   70:    Sum_percent = new float[Entry_cnt];
   71:    Raw_exam_ratio = new float[Exam_cnt];
   72:    Raw_epc_ratio  = new float[Exam_cnt];
   73:    Exam_ratio = new float[Exam_cnt];
   74: 
   75:    p=getParameter("HW_W");
   76:    W[0] =(p==null)?1:Float.valueOf(p).floatValue(); 
   77:    p=getParameter("QZ_W");
   78:    W[1] =(p==null)?1:Float.valueOf(p).floatValue();
   79:    p=getParameter("EX_W");
   80:    W[2] =(p==null)?1:Float.valueOf(p).floatValue();
   81:    p=getParameter("FE_W");
   82:    W[3] =(p==null)?1:Float.valueOf(p).floatValue();
   83:    p=getParameter("PC_W");
   84:    W[4] =(p==null)?1:Float.valueOf(p).floatValue();
   85:    
   86:    p=getParameter("HW_C");
   87:    C[0] =(p==null)?1:Integer.valueOf(p).intValue();
   88:    p=getParameter("HW_R");
   89:    R[0] =(p==null)?1:Integer.valueOf(p).intValue();
   90:    p=getParameter("QZ_C");
   91:    C[1] =(p==null)?1:Integer.valueOf(p).intValue();
   92:    p=getParameter("QZ_R");
   93:    R[1] =(p==null)?1:Integer.valueOf(p).intValue();
   94: 
   95:    for(idx=0;idx<Entry_cnt;idx++) {
   96:      p=getParameter("X"+idx);
   97:      X[idx]=(p==null)?1:Integer.valueOf(p).intValue();
   98:      if( (idx>1) && (X[idx]==1) ) {  // midterm exam, final extrapolated
   99:        SF_ratio[idx]  = (float)0.0;
  100:        SF_percent[idx]= (float)0.0;
  101:        if( idx == (Entry_cnt - 1) ) {  // final exam extrapolated, from hw
  102:          Sum_ratio[idx] = SF_ratio[0]; 
  103: 	 Sum_percent[idx] = SF_percent[0];
  104:        } 
  105:      } else {
  106:  // homework, quiz extrapolated or not;exam,final not extrapolated 
  107:        p=getParameter("S"+idx);
  108:        S[idx]=(p==null)?1:Float.valueOf(p).floatValue();
  109:        p=getParameter("F"+idx);
  110:        F[idx] =(p==null)?1:Float.valueOf(p).floatValue();
  111:        if ((float)F[idx] < 0.00000001) {
  112: 	   SF_ratio[idx] = (float) 0.0;
  113:        } else {
  114: 	   SF_ratio[idx] = (float) ((float)S[idx] / (float)F[idx]);
  115:        }
  116:        int tmp_i = (int) (10000 * SF_ratio[idx] );
  117:        SF_percent[idx]= (float)tmp_i / (float)100.0;
  118:        if( idx == (Entry_cnt - 1) ) {         // final exam
  119:          Sum_ratio[idx]   = SF_ratio[idx];
  120: 	 Sum_percent[idx] = SF_percent[idx];
  121:        }
  122:      }
  123:    }
  124:    Sum_ratio[0] = (float)(S[0] + ((float)R[0]*F[0]*SF_ratio[0]/(float)C[0])) / (float)(F[0]*(1.0 + (float)R[0]/(float)C[0]));
  125:      int tmp_i = (int)(10000 * Sum_ratio[0]);
  126:      Sum_percent[0] =  (float)tmp_i / (float)100.0;
  127:      Sum_ratio[0]   = Sum_percent[0] / (float)100.0;
  128:      Sum_ratio[1] = (float)(S[1] + (R[1]*F[1]*SF_ratio[1]/C[1])) / (float)(F[1]*(1.0 + R[1]/C[1]));
  129:      tmp_i = (int)(10000 * Sum_ratio[1]);
  130:      Sum_percent[1] =  (float)tmp_i / (float)100.0;
  131:      Sum_ratio[1]   =  Sum_percent[1] / (float)100.0;
  132: 
  133: 
  134:    // if exam 1 is not given, use homework as default to extrapolate 
  135:    //    if epc 1 is not given, use exam 1 as epc 1
  136:    // if exam 2 is not given, use exam 1 to extrapolate
  137:    // if exam 3 is not given, use exam 2 to extrapolate
  138:    // I am lying, I only use the homework score
  139: 
  140:    float exam_sum = (float)0.0;
  141:    for(idx=0;idx<Exam_cnt;idx++) {
  142:      if( X[(idx+1)*2] == 1 ) {
  143: //      taken from homework 
  144:         Raw_exam_ratio[idx] = SF_ratio[0]; 
  145:      } else {
  146:         Raw_exam_ratio[idx] = SF_ratio[(idx+1)*2];
  147:      }
  148:      if( X[(idx+1)*2 + 1] == 1 ) {
  149:         Raw_epc_ratio[idx] = Raw_exam_ratio[idx];
  150:      } else {
  151:         Raw_epc_ratio[idx] = SF_ratio[(idx+1)*2 + 1];
  152:      }
  153:      
  154:      if( Raw_epc_ratio[idx] > Raw_exam_ratio[idx] ) {
  155:          Exam_ratio[idx] = Raw_exam_ratio[idx] + W[4]*( Raw_epc_ratio[idx] - Raw_exam_ratio[idx] ) ;
  156:      } else {
  157:          Exam_ratio[idx] = Raw_exam_ratio[idx];
  158:      }
  159:      //System.out.print("idx="+idx+":Exam_ratio="+Exam_ratio[idx]+"\n");
  160:      Sum_ratio[2*(idx+1)] = Exam_ratio[idx];
  161:      tmp_i = (int)(10000 * Exam_ratio[idx] );
  162:      Sum_percent[2*(idx+1)] = (float)tmp_i / (float)100.0;
  163:      Sum_ratio[2*(idx+1)]   = Sum_percent[2*(idx+1)] / (float)100.0;
  164:      exam_sum += Exam_ratio[idx];
  165:    }
  166:    exam_sum = (float)exam_sum / (float)Exam_cnt;
  167: 
  168:    Term_score = Sum_ratio[0] * W[0] + Sum_ratio[1] * W[1] + exam_sum * W[2] + Sum_ratio[Entry_cnt - 1] * W[3];
  169: 
  170:    tmp_i = (int)(10000 * Term_score);
  171:    Term_score = (float)tmp_i / (float)100.0;
  172: 
  173: 
  174: //    call to setup User Interface
  175: 
  176:    initGUI();
  177: 
  178:     }
  179: public void initGUI() {
  180:        int     row_cnt = Exam_cnt + 4;
  181:        int     idx;
  182:        String  [] title = {"Homework", "Quizz" }; 
  183:        HQpanel = new ExpPanel[2];
  184:        EXpanel = new ExmPanel[Exam_cnt+2];
  185: 
  186:        setLayout(new GridLayout(row_cnt,0,4,4));
  187: 
  188:        String t_str = "Term Score Extrapolation Applet";
  189:        TitleL    = new Label(t_str, Label.CENTER);
  190:        add(TitleL);
  191: 
  192:        for(idx = 0; idx < 2; idx++) {
  193:          HQpanel[idx] = new ExpPanel(this,title[idx],X[idx],
  194:                                S[idx],F[idx],C[idx],R[idx]);
  195:          add(HQpanel[idx]);
  196:        }
  197:        // Midterm Exam
  198:        for(idx =0; idx < Exam_cnt; idx++) {
  199:          EXpanel[idx] = new ExmPanel(this,idx+1,X[2*(idx+1)],1,X[2*idx+3],
  200:              S[2*(idx+1)],F[2*(idx+1)],W[4],S[2*idx+3],F[2*idx+3],Sum_ratio[2*(idx+1)]);
  201:          add(EXpanel[idx]);
  202:        }
  203:        // Final Exam
  204:        EXpanel[Exam_cnt] = new ExmPanel(this,0,X[Entry_cnt-1],0,0,
  205:              S[Entry_cnt-1],F[Entry_cnt-1],W[3],S[Entry_cnt-1],F[Entry_cnt-1],Sum_ratio[Entry_cnt-1]);
  206:        add(EXpanel[Exam_cnt]);
  207: 
  208:        String eq_str = "Term score=" + Sum_percent[0] + "*" + W[0] ;
  209:        eq_str = eq_str + "+" + Sum_percent[1] + "*" + W[1] ;
  210:        eq_str = eq_str + "+" + "(" ; 
  211:        for(idx =1;idx<=Exam_cnt;idx++) {
  212:           if(idx>1) {
  213:              eq_str = eq_str + "+ ";
  214:            }
  215:            eq_str = eq_str + Sum_percent[2*idx] ;
  216:        } 
  217:        eq_str = eq_str + ") *" + W[2] + "/" + Exam_cnt + "+";
  218:        eq_str = eq_str + Sum_percent[2*idx] + "*" + W[3] + " = ";
  219:        eq_str = eq_str + " " + Term_score + "%";
  220:        // EqL    = new Label(eq_str, Label.LEFT);
  221:        // add(EqL);
  222: 
  223:   }
  224: public void recalcTermScore() {
  225:        float  score[];
  226:        int    idx;
  227:        float  term_summ, exam_summ;
  228:  
  229:        score = new float[Exam_cnt+3];
  230:        term_summ = (float)0.0;
  231:        exam_summ = (float)0.0;
  232:        for(idx=0;idx<2;idx++) {
  233:          score[idx] = HQpanel[idx].getSubTotal();
  234:          term_summ = term_summ + score[idx] * W[idx];
  235:        }
  236:        for(idx =0; idx < Exam_cnt; idx++) {
  237:          score[idx+2] = EXpanel[idx].getSubTotal();
  238:          exam_summ = exam_summ + score[idx+2];
  239:        }
  240:        score[Exam_cnt+2] = EXpanel[Exam_cnt].getSubTotal();
  241:        exam_summ = exam_summ * W[2] / Exam_cnt;
  242:        term_summ = term_summ + exam_summ + score[Exam_cnt+2] * W[3];
  243:        int  tmp_i = (int) ((float)100.0*term_summ);
  244:        term_summ  = (float)(tmp_i / (float)100.0);
  245:        String eq_str = "Term score=" + score[0] + "*" + W[0] ;
  246:        eq_str = eq_str + "+" + score[1] + "*" + W[1] ;
  247:        eq_str = eq_str + "+" + "(" ; 
  248:        for(idx=0;idx<Exam_cnt;idx++) {
  249:           if(idx>0) {
  250:              eq_str = eq_str + "+ ";
  251:            }
  252:            eq_str = eq_str + score[idx+2] ;
  253:         } 
  254:         eq_str = eq_str + ") *" + W[2] + "/" + Exam_cnt + "+";
  255:         eq_str = eq_str + score[Exam_cnt+2] + "*" + W[3] + " = ";
  256:         eq_str = eq_str + " " + term_summ + "  %";
  257:         // TitleL.setText("TTT");
  258:         TitleL.setText(eq_str);
  259:   }
  260: public void paint(Graphics g) {
  261:         Dimension d = getSize();
  262:         g.drawRect(0,0, d.width - 1, d.height - 1);
  263:   }
  264: public void run()   {  }
  265: public void start() {
  266:         recalcTermScore();
  267:   }
  268: public void stop()  {  }
  269: 
  270: }
  271: class ExpPanel extends Panel
  272:                      implements ActionListener,
  273:                                  AdjustmentListener {
  274:     TScore     controller;
  275:     TextField  exT;
  276:     Scrollbar  sB;
  277:     Label      sumL;
  278:     int        max = 100;
  279:     int        block = 1;
  280:     float      ff,ss;
  281:     int        rr,cc;
  282: 
  283:     ExpPanel(TScore u,String t,
  284:              int x,float a,float b,int m,int n) {
  285:         GridBagConstraints   c = new GridBagConstraints();
  286:         GridBagLayout        gridbag = new GridBagLayout();
  287:         setLayout(gridbag);
  288:         int tmp_i;
  289: 
  290:         controller = u;
  291:         ss = a; ff = b; cc = m; rr = n;
  292:         float sf_ratio =  (float)ss / (float)ff;
  293:         tmp_i = (int)(10000 * sf_ratio);
  294:         float sf_percent =  (float)tmp_i / (float)100.0;
  295:         float sum_ratio = (float)(ss + ((float)rr*ff*sf_ratio/(float)(cc+rr))) / (float)(ff*(1.0 + (float)rr/(float)(cc+rr)));
  296: 	//System.out.print("ss ="+ss+":rr="+rr+":ff="+ff+":sf_ratio="+sf_ratio+":cc="+cc+":sum_ratio="+sum_ratio+"\n");
  297:         tmp_i = (int)(10000 * sum_ratio);
  298:         float sum_percent =  (float)tmp_i / (float)100.0;
  299: 
  300:         String cs = " " + ss + "/"  + ff; 
  301:         cs = cs + " = " + sf_percent + "%";
  302:         String r = "remaining " + rr + " sets at (%) ";
  303:         String s = " " + sum_percent + "%";
  304: 
  305:         //Set up default layout constraints.
  306:         c.fill = GridBagConstraints.NONE;
  307: 
  308:         Label tL = new Label(t, Label.LEFT);
  309:         // c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row.
  310:         c.gridwidth = 1;
  311:         c.gridx = 0;
  312:         c.gridy = 0;
  313:         gridbag.setConstraints(tL, c);
  314:         add(tL);
  315:         
  316:         Label cL = new Label(cs, Label.CENTER);
  317:         c.gridwidth = 2;
  318:         c.gridx = 1;
  319:         c.gridy = 0;
  320:         gridbag.setConstraints(cL, c);
  321:         add(cL);
  322: 
  323:         Label sL = new Label("subtotal=", Label.RIGHT);
  324:         c.gridwidth = 1;
  325:         c.gridx = 3;
  326:         c.gridy = 0;
  327:         gridbag.setConstraints(sL, c);
  328:         add(sL);
  329: 
  330:         sumL = new Label(s, Label.RIGHT);
  331:         c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row.
  332:         c.gridx = 4;
  333:         c.gridy = 0;
  334:         gridbag.setConstraints(sumL, c);
  335:         add(sumL);
  336:         if(x==1) { 
  337:           Label rL = new Label(r, Label.RIGHT);
  338:           c.gridwidth = 2;
  339:           c.gridx = 0;
  340:           c.gridy = 1;
  341:           gridbag.setConstraints(rL, c);
  342:           add(rL);
  343: 
  344:           exT = new TextField("0", 3);
  345:           c.anchor = GridBagConstraints.EAST;
  346:           c.gridwidth = 1; //The default value.
  347:           c.gridx = 2;
  348:           c.gridy = 1;
  349:           gridbag.setConstraints(exT, c);
  350:           add(exT);
  351:           exT.addActionListener(this);
  352:           c.anchor = GridBagConstraints.CENTER;  // default
  353: 
  354:         //Add the slider.  It's horizontal, and it has the maximum
  355:         //value specified by the instance variable max.  Its initial
  356:         //and minimum values are the default (0).  A click increments
  357:         //the value by block units.
  358:           sB = new Scrollbar(Scrollbar.HORIZONTAL);
  359:           sB.setMaximum(max + 10);
  360:           sB.setBlockIncrement(block);
  361:           // c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row.
  362:           c.fill = GridBagConstraints.HORIZONTAL;
  363:           c.gridwidth = 2;
  364:           c.gridx = 3;
  365:           c.gridy = 1;
  366:           gridbag.setConstraints(sB, c);
  367:           add(sB);
  368:           sB.addAdjustmentListener(this);
  369:           exT.setText(String.valueOf(sf_percent));
  370:           sB.setValue((int)sf_percent);
  371:         }
  372: 
  373:     }
  374:     // Draws a box around this panel. 
  375:     public void paint(Graphics g) {
  376:         Dimension d = getSize();
  377:         g.drawRect(0,0, d.width - 1, d.height - 1);
  378:     }
  379:     public Insets getInsets() {
  380:         return new Insets(5,5,5,8);
  381:     }
  382:     float  getSubTotal() {
  383:         String s_str = sumL.getText().replace('%','\0').trim();
  384:         float  s_real = Float.valueOf(s_str).floatValue();
  385:         return (s_real);
  386:     }
  387:     double getValue() {
  388:         double f;
  389:         try {
  390:             f = (double)Double.valueOf(exT.getText()).doubleValue();
  391: 	    if (f > max) {f=max;}
  392:         } catch (java.lang.NumberFormatException e) {
  393:             f = 0.0;
  394:         }
  395:         return f;
  396:     }
  397:     // entered into exT
  398:     public void actionPerformed(ActionEvent e) {
  399:         int tf = (int) getValue();
  400:         if (tf > max)
  401:             tf = max;
  402:         if (tf < 0)
  403:             tf = 0;
  404:         sB.setValue(tf);
  405:         exT.setText(String.valueOf((int)tf));
  406:         recalcSumm(tf);
  407:     }    
  408:     //  slider sB changed
  409:     public void adjustmentValueChanged(AdjustmentEvent e) {
  410:         Scrollbar source = (Scrollbar)e.getSource();
  411:            int   my_i =  (int)source.getValue();
  412:            exT.setText(String.valueOf(e.getValue()));
  413:            recalcSumm(my_i);
  414:     }
  415:     void  recalcSumm(int tf) {
  416:         float my_r = (float) tf / (float)100.0;
  417:         int  tmp_i= (int)(10000*(ss+((float)rr*ff*my_r/(cc+rr)))/(float)(ff*(1.0+(float)rr/(cc+rr))));
  418: 	//System.out.print("ss ="+ss+":rr="+rr+":ff="+ff+":my_r="+my_r+":cc="+cc+":tmp_i="+((float)tmp_i/10000.0)+"\n");
  419:         float sum  = (float)tmp_i / (float)100.0;
  420:         sumL.setText(sum + "%");
  421:         controller.recalcTermScore();
  422:     }
  423:     // Set the values in the slider and text field. 
  424:     void setValue(double f) {
  425:         setSliderValue(f);
  426:         exT.setText(String.valueOf((float)f));
  427:     }
  428:     void setSliderValue(double f) {
  429:         int sliderValue = (int)f;
  430: 
  431:         if (sliderValue > max)
  432:                sliderValue = max;
  433:         if (sliderValue < 0)
  434:             sliderValue = 0;
  435:         sB.setValue(sliderValue);
  436:         
  437:     }
  438: }
  439: class ExmPanel extends Panel
  440:                      implements ActionListener,
  441:                                 AdjustmentListener {
  442:     TScore     controller;
  443:     TextField  exT_ex, exT_pc;
  444:     Scrollbar  sB_ex,  sB_pc;
  445:     Label      sumL;
  446:     int        max = 100;
  447:     int        block = 1;
  448:     int        show_pc, exam_ex, epc_ex;
  449:     float      s_ex, f_ex, s_pc, f_pc;
  450:     float      c_factor;
  451: 
  452:     // exam_type  0  Final
  453:     //            1, 2, 3, 4 
  454:     ExmPanel(TScore u,int exam_type,int exam_x,int show_epc,int epc_x,
  455:              float a,float b,float w,float m,float n,float ex_default) {
  456:         GridBagConstraints   c = new GridBagConstraints();
  457:         GridBagLayout        gridbag = new GridBagLayout();
  458:         setLayout(gridbag);
  459:         Label  tL;
  460:         float  exam_ratio, epc_ratio;
  461:         float  sum;
  462:         int    tmp_i;
  463: 
  464:         controller = u; 
  465:         c_factor   = w;
  466:         show_pc = show_epc;
  467:         exam_ex = exam_x;
  468:         epc_ex  = epc_x;
  469:         s_ex = a; f_ex = b; s_pc = m; f_pc = n;
  470:         //Set up default layout constraints.
  471:         c.fill = GridBagConstraints.NONE;
  472: 
  473:         //Add the label.  It displays this panel's title, centered.
  474:         if(exam_type == 0 ) { // Final exam
  475:            tL = new Label("Final", Label.LEFT);
  476:         } else {
  477:            tL = new Label("Exam " + exam_type, Label.LEFT);
  478:         }
  479:         c.anchor = GridBagConstraints.WEST;
  480:         c.gridwidth = 1;
  481:         c.gridx = 0;
  482:         c.gridy = 0;
  483:         gridbag.setConstraints(tL, c);
  484:         add(tL);
  485:         c.anchor = GridBagConstraints.CENTER;
  486: 
  487:         if( exam_x == 0 ) {
  488:           // exam not extrapolated
  489: 	  if ((float)f_ex < 0.00000001) {
  490: 	      exam_ratio = (float) 0.0;
  491: 	  } else {
  492: 	      exam_ratio = (float)s_ex / (float)f_ex;
  493: 	  }
  494:           tmp_i = (int) (10000 * exam_ratio );
  495:           float percent = (float)tmp_i / (float)100.0;
  496:           String cs =  " " + a + "/" + b + " = " + percent + " %";
  497:           Label  cL = new Label(cs, Label.CENTER);
  498:           c.gridwidth = 2;
  499:           c.gridx = 1;
  500:           c.gridy = 0;
  501:           gridbag.setConstraints(cL, c);
  502:           add(cL);
  503:         } else {
  504:           // extrapolate exam
  505:           exam_ratio = ex_default;
  506:           exT_ex = new TextField("0", 3);
  507:           exT_ex.setName("EXAM");
  508:           c.gridwidth = 1; //The default value.
  509:           c.gridx = 2;
  510:           c.gridy = 0;
  511:           gridbag.setConstraints(exT_ex, c);
  512:           add(exT_ex);
  513:           exT_ex.addActionListener(this);
  514: 
  515:           sB_ex = new Scrollbar(Scrollbar.HORIZONTAL);
  516:           sB_ex.setName("EXAMS");
  517:           sB_ex.setMaximum(max + 10);
  518:           sB_ex.setBlockIncrement(block);
  519:           c.gridwidth = 2;
  520:           c.gridx = 3;
  521:           c.gridy = 0;
  522:           gridbag.setConstraints(sB_ex, c);
  523:           add(sB_ex);
  524:           sB_ex.addAdjustmentListener(this);
  525:         }
  526:         epc_ratio = exam_ratio;
  527:         if(show_pc == 1) {
  528:           if(epc_x == 1) {
  529:             epc_ratio = exam_ratio;
  530:           } else {
  531:             epc_ratio = (float)s_pc / (float)f_pc;
  532:           }
  533:           if( epc_ratio > exam_ratio ) {
  534:             tmp_i= (int)(10000 * (exam_ratio + c_factor * (epc_ratio - exam_ratio)));
  535:             sum  = (float)tmp_i / (float)100.0;
  536:           } else {
  537:             tmp_i= (int)(10000 * exam_ratio);
  538:             sum  = (float)tmp_i / (float)100.0;
  539:           }
  540:         } else { 
  541:           tmp_i= (int)(10000 * exam_ratio);
  542:           sum  = (float)tmp_i / (float)100.0;
  543:         }
  544: 
  545:         Label sL = new Label("subtotal=", Label.RIGHT);
  546:         c.gridwidth = 1;
  547:         c.gridx = 5;
  548:         c.gridy = 0;
  549:         gridbag.setConstraints(sL, c);
  550:         add(sL);
  551: 
  552:         String  s = " " + sum + "%";
  553:         sumL = new Label(s, Label.CENTER);
  554:         c.anchor = GridBagConstraints.EAST; 
  555:         c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row.
  556:         c.gridx = 6;
  557:         c.gridy = 0;
  558:         gridbag.setConstraints(sumL, c);
  559:         add(sumL);
  560:         c.anchor = GridBagConstraints.CENTER; 
  561: 
  562:         if( show_epc == 1 ) {
  563:            Label eL = new Label("Correction " + exam_type, Label.LEFT);
  564:            c.gridwidth = 1;
  565:            c.gridx = 0;
  566:            c.gridy = 1;
  567:            gridbag.setConstraints(eL, c);
  568:            add(eL);
  569:            if( epc_x == 0 ) {
  570: 	     float ratio;
  571: 	     if ((float)f_pc < 0.00000001) {
  572: 		 ratio = (float) 0.0;
  573: 	     } else {
  574: 		 ratio = (float) ( s_pc / f_pc);
  575: 	     }
  576:              tmp_i = (int) (10000 * ratio );
  577:              float percent = (float)tmp_i / (float)100.0;
  578:              String cs =  " " + s_pc + "/" + f_pc + " = " + percent + " %";
  579:              Label  cL = new Label(cs, Label.CENTER);
  580:              c.gridwidth = 2;
  581:              c.gridx = 1;
  582:              c.gridy = 1;
  583:              gridbag.setConstraints(cL, c);
  584:              add(cL);
  585:            } else {
  586:              exT_pc = new TextField("0", 3);
  587:              exT_pc.setName("PC");
  588:              c.anchor = GridBagConstraints.EAST;
  589:              c.gridwidth = 1; //The default value.
  590:              c.gridx = 2;
  591:              c.gridy = 1;
  592:              gridbag.setConstraints(exT_pc, c);
  593:              add(exT_pc);
  594:              exT_pc.addActionListener(this);
  595: 
  596:              sB_pc = new Scrollbar(Scrollbar.HORIZONTAL);
  597:              sB_pc.setName("PCS");
  598:              sB_pc.setMaximum(max + 10);
  599:              sB_pc.setBlockIncrement(block);
  600:              c.gridwidth = GridBagConstraints.REMAINDER;
  601:              c.anchor = GridBagConstraints.CENTER;
  602:              c.fill = GridBagConstraints.HORIZONTAL;
  603:              // c.gridwidth = 2;
  604:              c.gridx = 3;
  605:              c.gridy = 1;
  606:              gridbag.setConstraints(sB_pc, c);
  607:              add(sB_pc);
  608:              sB_pc.addAdjustmentListener(this);
  609:            }
  610:         }
  611:         setExValue(exam_ratio,epc_ratio);
  612:     }
  613:     // Draws a box around this panel. 
  614:     public void paint(Graphics g) {
  615:         Dimension d = getSize();
  616:         g.drawRect(0,0, d.width - 1, d.height - 1);
  617:     }
  618:     public Insets getInsets() {
  619:         return new Insets(5,5,5,8);
  620:     }
  621:     float  getSubTotal() {
  622:         String s_str = sumL.getText().replace('%','\0').trim();
  623:         float  s_real = Float.valueOf(s_str).floatValue();
  624:         return (s_real);
  625:     }
  626:     // entered into exT
  627:     public void actionPerformed(ActionEvent e) {
  628:         TextField source = (TextField)e.getSource();
  629:         String name = source.getName();
  630:         int tf = (int)Integer.valueOf(source.getText()).intValue();
  631:         if (tf > max)
  632:             tf = max;
  633:         if (tf < 0)
  634:             tf = 0;
  635:         if( name.equals(String.valueOf("EXAM")) ) {
  636:           sB_ex.setValue(tf);
  637:           exT_ex.setText(String.valueOf((int)tf));
  638:         } else {
  639:           sB_pc.setValue(tf);
  640:           exT_pc.setText(String.valueOf((int)tf));
  641:         }
  642:         recalcSumm();
  643:     }    
  644:     //  slider sB changed
  645:     public void adjustmentValueChanged(AdjustmentEvent e) {
  646:         Scrollbar source = (Scrollbar)e.getSource();
  647:         String    name = source.getName();
  648:            int    my_i =  (int)source.getValue();
  649:         
  650:         if( name.equals(String.valueOf("EXAMS")) ) {
  651:           sB_ex.setValue(my_i);
  652:           exT_ex.setText(String.valueOf((int)my_i));
  653:         } else {
  654:           sB_pc.setValue(my_i);
  655:           exT_pc.setText(String.valueOf((int)my_i));
  656:         }
  657:         recalcSumm();
  658:     }
  659:     void  recalcSumm() {
  660:         int   tmp_i;
  661:         float exam , epc, sum;
  662:         
  663:         if( exam_ex == 1 ) {
  664:            tmp_i = (int)Integer.valueOf(exT_ex.getText()).intValue();
  665:            exam = (float) tmp_i / (float)100.0;
  666:         } else {
  667:            exam = (float)s_ex / (float)f_ex;
  668:         }
  669:         if( show_pc == 1 ) {
  670:           if(epc_ex == 1) {
  671:             tmp_i = (int)Integer.valueOf(exT_pc.getText()).intValue();
  672:             epc = (float) tmp_i / (float)100.0;
  673:           } else {
  674:             epc = (float)s_pc / (float)f_pc;
  675:           }
  676:           if( epc > exam ) {
  677:             tmp_i= (int)(10000 * (exam + c_factor * (epc - exam)));
  678:             sum  = (float)tmp_i / (float)100.0;
  679:           } else {
  680:             tmp_i= (int)(10000 * exam);
  681:             sum  = (float)tmp_i / (float)100.0;
  682:           }
  683:         } else {
  684:           tmp_i= (int)(10000 * exam);
  685:           sum  = (float)tmp_i / (float)100.0;
  686:         }
  687:         sumL.setText(sum + "%");
  688:         controller.recalcTermScore();
  689:     }
  690:     void setExValue (float a, float b) {
  691:         int  exm, epc;
  692:         exm = (int) (a*100.0); 
  693:         epc = (int) (b*100.0); 
  694:         if (exm > max)
  695:             exm = max;
  696:         if (exm < 0)
  697:             exm = 0;
  698:         if (epc > max)
  699:             epc = max;
  700:         if (epc < 0)
  701:             epc = 0;
  702:         if( exam_ex ==1 ) {
  703:           sB_ex.setValue(exm);
  704:           exT_ex.setText(String.valueOf(exm));
  705:         }
  706:         if( (show_pc == 1) && (epc_ex==1) ) {
  707:           sB_pc.setValue(epc);
  708:           exT_pc.setText(String.valueOf(epc));
  709:         }
  710:      }
  711: }
  712: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>