/******************************************************************* * * DESCRIPTION: This applet is a handy Calculator for AT times * * AUTHOR: Tom Janofsky * * HISTORY: 0.1 Initial Revision * gui initially crafted in netbeans * * DATE:11/29/1999 * * Copyright (C) 1999 Tom Janofsky * * 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * *******************************************************************/ import java.util.Date; import java.awt.event.*; import java.text.NumberFormat; /** This applet uses a corresponding dat object to do handy calculations about how long it would take to complete the Appalachian Trail * * @version 0.1 */ public class ATDateApplet extends java.applet.Applet { // Applet Variables declaration /** * */ private java.awt.Label TitleLabel; /** */ private java.awt.Panel centerPanel; private java.awt.Panel bottomPanel; /** */ private java.awt.Panel StartPanel; /** */ private java.awt.Panel MilesPerDayPanel; /** */ private java.awt.Panel DaysOffPanel; /** */ private java.awt.Panel EndDatePanel; /** */ private java.awt.Panel leftPanel; /** */ private java.awt.Label label2; /** */ private java.awt.Label label3; /** */ private java.awt.Label label4; /** */ private java.awt.Label label5; /** */ private java.awt.TextField daysOffTextField; /** */ private java.awt.Choice endMonth; /** */ private java.awt.Choice endDay; /** */ private java.awt.Choice endYear; /** */ private java.awt.Choice StartMonth; /** */ private java.awt.Choice startDay; /** */ private java.awt.Choice startYear; private java.awt.Choice hikeDistance; /** * */ private java.awt.TextField milesPerDay; private java.awt.TextField totalMiles; /** * */ private java.awt.Scrollbar daysSB; /** * */ private java.awt.Scrollbar milesSB; //Data Related /** * */ private java.util.Date startDate, endDate; /** */ private double milesPerDouble; /** */ private int daysOffInt; /** */ private ATThruHikeData at; /** internal debugging only * */ private static final boolean DEBUG = true; // End of variables declaration /** Initializes the Form */ public void init () { initComponents (); } /** This method is called from within the init() method to * initialize the form. */ private void initComponents () { //Initialize the applet setBackground (java.awt.Color.lightGray); setName ("ATDateAppletPanel"); setLayout (new java.awt.BorderLayout ()); //Initialize the data object Date st = new Date(99, 3, 1); at = new ATThruHikeData(st, 12, 2160.0); //Add in a title label TitleLabel = new java.awt.Label (); TitleLabel.setText ("Long Distance Hiking Calculator"); TitleLabel.setAlignment (java.awt.Label.CENTER); TitleLabel.setFont (new java.awt.Font ("SansSerif", 1, 18)); add (TitleLabel, "North"); //All major components will go in a center panel centerPanel = new java.awt.Panel (); centerPanel.setName ("centerPanel"); centerPanel.setLayout (new java.awt.GridLayout (4, 1)); //The topmost (of 4) is start date StartPanel = new java.awt.Panel (); StartPanel.setName ("StartPanel"); StartPanel.setLayout (new java.awt.FlowLayout ()); //Start with the month StartMonth = new java.awt.Choice (); StartMonth.setName ("StartMonth"); addMonths(StartMonth); StartMonth.select("April"); StartMonth.addItemListener (new java.awt.event.ItemListener () { /** */ public void itemStateChanged (java.awt.event.ItemEvent evt) { startMonthItemStateChanged (evt); } } ); StartPanel.add (StartMonth); //Follow with Days startDay = new java.awt.Choice (); startDay.setName ("startDay"); addDays(startDay); startDay.addItemListener (new java.awt.event.ItemListener () { /** */ public void itemStateChanged (java.awt.event.ItemEvent evt) { startDayItemStateChanged (evt); } } ); StartPanel.add (startDay); //add years startYear = new java.awt.Choice (); startYear.setName ("startYear"); addYears(startYear); startYear.select("2000"); startYear.addItemListener (new java.awt.event.ItemListener () { /** */ public void itemStateChanged (java.awt.event.ItemEvent evt) { startYearItemStateChanged (evt); } } ); StartPanel.add (startYear); //and put that panel in play centerPanel.add (StartPanel); //2nd panel in the center panel - miles per day MilesPerDayPanel = new java.awt.Panel (); MilesPerDayPanel.setName ("MilesPerDayPanel"); MilesPerDayPanel.setLayout (new java.awt.FlowLayout ()); milesPerDay = new java.awt.TextField ("12",6); milesPerDay.setName ("milesPerDay"); milesPerDay.addFocusListener(new java.awt.event.FocusListener(){ /** * Invoked when a component gains the keyboard focus. */ public void focusGained(FocusEvent e) { } /** * Invoked when a component loses the keyboard focus. */ public void focusLost(FocusEvent e) { milesPerDayFocusChanged( e); } } ); MilesPerDayPanel.add (milesPerDay); milesSB = new java.awt.Scrollbar(java.awt.Scrollbar.HORIZONTAL, 60, 10, 1, 250); milesSB.addAdjustmentListener(new java.awt.event.AdjustmentListener(){ /** * Invoked when the value of the adjustable has changed. */ public void adjustmentValueChanged(AdjustmentEvent e) { //update the text sliderMilesChanged(e); } }); MilesPerDayPanel.add(milesSB); centerPanel.add (MilesPerDayPanel); //3rd panel in the center panel - days off DaysOffPanel = new java.awt.Panel (); DaysOffPanel.setName ("DaysOffPanel"); DaysOffPanel.setLayout (new java.awt.FlowLayout ()); daysOffTextField = new java.awt.TextField ("0",6); daysOffTextField.setName ("daysOff"); daysOffTextField.addFocusListener(new java.awt.event.FocusListener (){ /** * Invoked when a component gains the keyboard focus. */ public void focusGained(FocusEvent e) { } /** * Invoked when a component loses the keyboard focus. */ public void focusLost(FocusEvent e) { daysOffFocusChanged(e); } } ); DaysOffPanel.add (daysOffTextField); daysSB = new java.awt.Scrollbar(java.awt.Scrollbar.HORIZONTAL, 0, 1, 0, 25); daysSB.addAdjustmentListener(new java.awt.event.AdjustmentListener(){ /** * Invoked when the value of the adjustable has changed. */ public void adjustmentValueChanged(AdjustmentEvent e) { //update the text sliderDaysOffChanged(e); } }); DaysOffPanel.add(daysSB); //done playing around centerPanel.add (DaysOffPanel); //4th panel in the center panel - ending date EndDatePanel = new java.awt.Panel (); EndDatePanel.setName ("EndDatePanel"); EndDatePanel.setLayout (new java.awt.FlowLayout ()); endMonth = new java.awt.Choice (); endMonth.setName ("endMonth"); addMonths(endMonth); endMonth.addItemListener (new java.awt.event.ItemListener () { /** */ public void itemStateChanged (java.awt.event.ItemEvent evt) { endMonthItemStateChanged (evt); } } ); EndDatePanel.add (endMonth); endDay = new java.awt.Choice (); endDay.setName ("endDay"); addDays(endDay); endDay.addItemListener (new java.awt.event.ItemListener () { /** */ public void itemStateChanged (java.awt.event.ItemEvent evt) { endDayItemStateChanged (evt); } } ); EndDatePanel.add (endDay); endYear = new java.awt.Choice (); endYear.setName ("endYear"); addYears(endYear); endYear.select("2000"); endYear.addItemListener (new java.awt.event.ItemListener () { /** */ public void itemStateChanged (java.awt.event.ItemEvent evt) { endYearItemStateChanged (evt); } } ); EndDatePanel.add (endYear); centerPanel.add (EndDatePanel); add (centerPanel, "Center"); //And set up a list of labels on the left side to label the component groups leftPanel = new java.awt.Panel (); leftPanel.setName ("leftPanel"); leftPanel.setLayout (new java.awt.GridLayout (4, 1)); label2 = new java.awt.Label (); label2.setText ("Start Date:"); leftPanel.add (label2); label3 = new java.awt.Label (); label3.setText ("Miles Per Day:"); leftPanel.add (label3); label4 = new java.awt.Label (); label4.setText ("Days Off:"); leftPanel.add (label4); label5 = new java.awt.Label (); label5.setText ("End Date:"); leftPanel.add (label5); add (leftPanel, "West"); //Distacne selector will go in a bootom panel //bottomPanel = new java.awt.Panel (); //bottomPanel.setName ("bottomPanel"); //bottomPanel.setLayout(new java.awt.FlowLayout ()); //hikeDistance = new java.awt.Choice(); //hikeDistance.add("Appalachian Trail"); //hikeDistance.add("Pacific Crest Trail"); //hikeDistance.add("Other (or section)"); //bottomPanel.add(hikeDistance); //add(bottomPanel, "South"); } // //A full set of event handlers to accoutn for data changing // /** */ private void daysOffFocusChanged (java.awt.event.FocusEvent evt) { grabData(); if (daysOffInt != at.getDaysOff()) { at.setDaysOff(daysOffInt); updatePanel(); } if (DEBUG) System.out.println("daysOffTextValueChanged"); } /** */ private void milesPerDayFocusChanged (java.awt.event.FocusEvent evt) { grabData(); if (milesPerDouble != at.getMilesPerDay()) { at.setMilesPerDay(milesPerDouble); updatePanel(); } if (DEBUG) System.out.println("milesPerDayTextValueChanged"); } /** */ private void endYearItemStateChanged (java.awt.event.ItemEvent evt) { grabData(); if (!(endDate.equals(at.getEndDate() ) ) ) { at.setEndDate(endDate); updatePanel(); } if (DEBUG) System.out.println("endYearItemStateChanged"); } /** */ private void endDayItemStateChanged (java.awt.event.ItemEvent evt) { grabData(); if (!(endDate.equals(at.getEndDate() ) ) ) { at.setEndDate(endDate); updatePanel(); } if (DEBUG) System.out.println("endDayItemStateChanged"); } /** */ private void endMonthItemStateChanged (java.awt.event.ItemEvent evt) { grabData(); if (!(endDate.equals(at.getEndDate() ) ) ) { at.setEndDate(endDate); updatePanel(); } if (DEBUG) System.out.println("endMonthItemStateChanged"); } /** */ private void startYearItemStateChanged (java.awt.event.ItemEvent evt) { grabData(); if (!(startDate.equals(at.getStartDate() ) ) ) { at.setStartDate(startDate); updatePanel(); } if (DEBUG) System.out.println("startYearItemStateChanged"); } /** */ private void startDayItemStateChanged (java.awt.event.ItemEvent evt) { grabData(); if (!(startDate.equals(at.getStartDate() ) ) ) { at.setStartDate(startDate); updatePanel(); } if (DEBUG) System.out.println("startDayItemStateChanged"); } /** */ private void startMonthItemStateChanged (java.awt.event.ItemEvent evt) { grabData(); if (!(startDate.equals(at.getStartDate() ) ) ) { at.setStartDate(startDate); updatePanel(); } if (DEBUG) System.out.println("startMonthItemStateChanged"); } /** */ private void sliderMilesChanged (java.awt.event.AdjustmentEvent evt){ double dist = (double) evt.getValue(); at.setMilesPerDay(dist/5); updatePanel(); } /** */ private void sliderDaysOffChanged (java.awt.event.AdjustmentEvent evt){ at.setDaysOff(evt.getValue()); updatePanel(); } // //A full set of choice box loaders // /** */ private void addMonths(java.awt.Choice choice){ choice.add("January"); choice.add("February"); choice.add("March"); choice.add("April"); choice.add("May"); choice.add("June"); choice.add("July"); choice.add("August"); choice.add("September"); choice.add("October"); choice.add("November"); choice.add("December"); } /** */ private void addDays(java.awt.Choice choice){ for (int i=1; i<=31; i++) { choice.add(""+i); } } /** */ private void addYears(java.awt.Choice choice){ for (int i=1985; i<=2006; i++) { choice.add(""+i); } } // // Methods to get data from the applet into a usable form // /** */ private void grabData(){ String stMon, stDay, stYr, milesPer, daysOff, endMon, endDy, endYr; //get the values from the applet stDay = startDay.getSelectedItem(); stYr = startYear.getSelectedItem(); milesPer = milesPerDay.getText(); daysOff = daysOffTextField.getText(); endDy = endDay.getSelectedItem(); endYr = endYear.getSelectedItem(); //convert the start to a date //no validation necessary, because they're choice boxes //int stMonInt = parseMonthStringToInt(stMon); int stMonInt = StartMonth.getSelectedIndex(); int stDayInt = Integer.parseInt(stDay); int stYearInt = (Integer.parseInt(stYr)) - 1900; startDate = new Date(stYearInt, stMonInt, stDayInt); //convert the end to a date //no validation necessary, because they're choice boxes //int endMonInt = parseMonthStringToInt(endMon); int endMonInt = endMonth.getSelectedIndex(); int endDayInt = Integer.parseInt(endDy); int endYearInt = (Integer.parseInt(endYr)) -1900; endDate = new Date(endYearInt, endMonInt, endDayInt); //get the milesPerDay, and validate try { milesPerDouble = Double.valueOf(milesPer).doubleValue(); } catch (Exception e) { milesPerDouble = 10; milesPerDay.setText ("Must be a number"); } if (milesPerDouble <= 0) { milesPerDouble = 0.1; milesPerDay.setText ("Must be positive"); } //get the days off try { daysOffInt = Integer.parseInt(daysOff); } catch (Exception e) { daysOffInt = 0; //daysOffTextField.setText("Must be a number"); } if (daysOffInt < 0) { daysOffInt =0; //daysOffTextField.setText("Must >= 0"); } if (false) { System.out.println("Grabbing Data..."); System.out.println("Start: " + startDate.toString()); System.out.println("End: " + endDate.toString()); System.out.println("Miles per / days off: ("+milesPer+"/"+daysOff+")"); } } /** */ private void updatePanel(){ //set the miles per day NumberFormat nf = NumberFormat.getInstance(); nf.setMinimumFractionDigits(2); String mpd = nf.format( at.getMilesPerDay() ); milesPerDay.setText(""+ at.getMilesPerDay()); //set the days off daysOffTextField.setText(""+ at.getDaysOff()); //set the starting date StartMonth.select(at.getStartDate().getMonth()); startDay.select(""+at.getStartDate().getDate()); startYear.select(""+ (at.getStartDate().getYear()+1900)); //set the ending date endMonth.select(at.getEndDate().getMonth()); endDay.select(""+at.getEndDate().getDate()); endYear.select(""+ (at.getEndDate().getYear()+1900)); } }