/*
* Get Organized - Organize your schedule, course assignments, and grades
* Copyright © 2012 Alex Laird
* getorganized@alexlaird.com
* alexlaird.com
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package adl.go.gui;
import adl.go.resource.LocalUtility;
import adl.go.resource.WorkerThread;
import adl.go.types.Assignment;
import adl.go.types.AssignmentType;
import adl.go.types.Category;
import adl.go.types.Course;
import adl.go.types.Event;
import adl.go.types.EventYear;
import adl.go.types.Instructor;
import adl.go.types.ListItem;
import adl.go.types.Term;
import adl.go.types.Textbook;
import java.awt.Desktop;
import java.awt.dnd.DnDConstants;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
/**
* The domain handles general operations specific to the GUI--it is essentially
* an abstraction method to get excessive code out of the view's class.
*
* @author Alex Laird
*/
public class Domain
{
/**
* The name of the application.
*/
public static final String NAME = "Get Organized";
/**
* The version number, which is used in the JFrame title, the About dialog
* and when checking for updates.
*/
public static final String VERSION = "1.09";
/**
* The current working directory.
*/
public static final String CWD = System.getProperty ("user.dir");
/**
* The user's Domain.HOME directory.
*/
public static final String HOME = System.getProperty ("user.home", ".");
/**
* The location of the source.
*/
public static final String SOURCE_PATH = Domain.class.getProtectionDomain ().getCodeSource ().getLocation ().toString ().replaceAll ("%20", " ");
/**
* The default images folder within the source.
*/
public static final String IMAGES_FOLDER = "/adl/go/images/";
/**
* The name of the operating system being used.
*/
public static final String OS_NAME = System.getProperty ("os.name");
/**
* Represents a patterned regular expression.
*/
public static final Pattern EMAIL_PATTERN = Pattern.compile ("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
/**
* Display for comma-separated big numbers.
*/
public static final NumberFormat NUM_FORMAT = new DecimalFormat ("###,###");
/**
* The hour formatter.
*/
public static final SimpleDateFormat HR_FORMAT = new SimpleDateFormat ("h");
/**
* The minute formatter.
*/
public static final SimpleDateFormat MIN_FORMAT = new SimpleDateFormat ("mm");
/**
* The meridian formatter.
*/
public static final SimpleDateFormat M_FORMAT = new SimpleDateFormat ("a");
/**
* The time formatter.
*/
public static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat ("h:mm a");
/**
* The date formatter.
*/
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat ("MM/dd/yyyy");
/**
* The date formatter excluding day.
*/
public static final SimpleDateFormat MONTH_YEAR_FORMAT = new SimpleDateFormat ("MM/yyyy");
/**
* The date and time formatter.
*/
public static final SimpleDateFormat DATE_AND_TIME_FORMAT = new SimpleDateFormat ("MM/dd/yyyy h:mm a");
/**
* The full time format for debug output.
*/
public static final SimpleDateFormat DATE_AND_FULL_TIME_FORMAT = new SimpleDateFormat ("MM/dd/yyyy h:mm:ss a");
/**
* The number formatted for grade percentages.
*/
public static final NumberFormat PERCENT_FORMAT = new DecimalFormat ("0.00%");
/**
* A reference to the utility, which handles file I/O for the application.
*/
public LocalUtility utility;
/**
* The strings for the current language.
*/
public ResourceBundle language = ResourceBundle.getBundle ("adl.go.resource.languages.bundle_en");
/**
* Today's date.
*/
public Date today = new Date ();
/**
* The error file that keeps track of all errors and their occurrences.
*/
public File logFile;
/**
* The logger captures all errors and saves their messages away for possible
* bug submission or storage in a file.
*/
public static ArrayList<Object> LOGGER = new ArrayList<Object> ();
/**
* A reference to the desktop model (if supported) for launching files and application.
*/
public static Desktop desktop;
/**
* The load/save thread that is continually running unless explicitly paused
* or stopped.
*/
public WorkerThread workerThread;
/**
* True if type details are being loaded/unloaded.
*/
public Stack<Boolean> typeLoading = new Stack<Boolean> ();
/**
* True if instructor details are being loaded/unloaded.
*/
public Stack<Boolean> instructorLoading = new Stack<Boolean> ();
/**
* True if textbook details are being loaded/unloaded.
*/
public Stack<Boolean> textbookLoading = new Stack<Boolean> ();
/**
* True if assignment details are being loaded/unloaded.
*/
public Stack<Boolean> assignmentOrEventLoading = new Stack<Boolean> ();
/**
* True if term details are being loaded/unloaded.
*/
protected Stack<Boolean> termLoading = new Stack<Boolean> ();
/**
* True if course details are being loaded/unloaded.
*/
protected Stack<Boolean> courseLoading = new Stack<Boolean> ();
/**
* True when a category is being loaded/unloaded.
*/
protected Stack<Boolean> categoryLoading = new Stack<Boolean> ();
/**
* True if the preferences dialog is being opened, false otherwise.
*/
protected Stack<Boolean> settingsOpening = new Stack<Boolean> ();
/**
* True if the terms and courses dialog is being opened, false otherwise.
*/
protected Stack<Boolean> termsAndCoursesOpening = new Stack<Boolean> ();
/**
* A reference to the main frame of the application.
*/
private ViewPanel viewPanel;
/**
* The tracking variable that gets set when a change is made to the preferences.
*/
public boolean needsCoursesAndTermsSave = false;
/**
* Set true when the program is quitting and needs to save user details.
*/
public boolean needsUserDetailsSave = false;
/**
* Set true when the program is quitting and needs to save preferences.
*/
public boolean needsPreferencesSave = false;
/**
* The boolean to be set when a key is pressed, marking a change and that a
* save should happen.
*/
public boolean needsSettingsSaveBool = false;
/**
* The currently selected course index in the Settings dialog.
*/
public int currentCourseIndex = -1;
/**
* The currently selected type in the Settings dialog.
*/
public int currentTypeIndex = -1;
/**
* The currently selected instructor in the Settings dialog.
*/
public int currentInstructorIndex = -1;
/**
* The currently selected textbook in the Settings dialog.
*/
public int currentTextbookIndex = -1;
/**
* The currently selected category index.
*/
public int currentCategoryIndex = -1;
/**
* The currently selected assignment's or event's index.
*/
protected int currentIndexFromVector = -1;
/**
* The currently selected term index in the Settings dialog.
*/
protected int currentTermIndex = -1;
/**
* True if an assignment or event is being removed from the
* assignmentsAndEvents list.
*/
protected boolean removingAssignmentOrEvent = false;
/**
* Constructs the domain for the application's interface.
*
* @param viewPanel A reference to the main frame of the application.
*/
public Domain(ViewPanel viewPanel)
{
this.viewPanel = viewPanel;
// if the Desktop object is supported, get the reference
if (Desktop.isDesktopSupported ())
{
desktop = Desktop.getDesktop ();
}
// instantiate the save thread
workerThread = new WorkerThread (viewPanel, this);
}
/**
* Pass in the constructed utility.
*
* @param utility A reference to the utility.
*/
protected void setUtility(LocalUtility utility)
{
this.utility = utility;
}
/**
* Saves the user's preferences to the preferences file.
*/
public synchronized void savePreferences()
{
utility.preferences.width = -1;
utility.preferences.height = -1;
if (viewPanel.mainFrame != null)
{
utility.preferences.width = viewPanel.mainFrame.getWidth ();
utility.preferences.height = viewPanel.mainFrame.getHeight ();
}
utility.preferences.x = -1;
utility.preferences.y = -1;
if (viewPanel.mainFrame != null)
{
utility.preferences.x = viewPanel.mainFrame.getX ();
utility.preferences.y = viewPanel.mainFrame.getY ();
}
utility.savePreferences ();
needsPreferencesSave = false;
}
/**
* Saves the user details to the data file.
*/
public synchronized void saveUserDetails()
{
utility.saveUserDetails ();
needsUserDetailsSave = false;
}
/**
* Updates the displayed values in the term tree (since they may be changed
* from the Settings dialog), then saves all current data in the vectors to
* the data files. This method also ensures that the term tree is fully
* expanded.
*/
public synchronized void saveSettings()
{
int[] selection = viewPanel.termTree.getSelectionRows ();
viewPanel.root.removeAllChildren ();
// add the terms to the term tree (course nodes are already attached
// to their terms)
for (int i = 0; i < utility.terms.size (); ++i)
{
viewPanel.root.add (utility.terms.get (i));
}
refreshTermTree ();
viewPanel.termTree.setSelectionRows (selection);
utility.saveTerms ();
utility.saveCourses ();
utility.saveTypes ();
utility.saveInstructors ();
utility.saveTextbooks ();
viewPanel.expandTermTree (new TreeExpansionEvent (this, null));
}
/**
* Saves changes made to the currently selected assignment to the data file.
*
* @param course
*/
public synchronized void saveAssignments(Course course)
{
utility.saveAssignments (course);
course.saved ();
}
/**
* Saves changes made to the currently selected event to the data file.
*/
public synchronized void saveEvents(EventYear eventYear)
{
utility.saveEvents (eventYear);
eventYear.saved ();
}
/**
* Retrieves the index (relative to the assignmentsAndEvents table) of the
* currently selected assignment or event.
*
* @return The index of the currently selected assignment or event from the
* assignmentsAndEvents table.
*/
public int getSelectedTableIndex()
{
return currentIndexFromVector;
}
/**
* Adds a new, empty term to the list of terms in the Settings dialog. This
* method also launches the Settings dialog (if not already open) to allow
* the user to specify additional attributes to the term. The term is not
* actually added to the term tree until the user saves the changes made in
* the Settings dialog.
*/
protected synchronized void addTerm()
{
if (currentTermIndex != -1)
{
viewPanel.termsAndCoursesDialog.checkTermsAndCoursesChanges (viewPanel.termsAndCoursesDialog.settingsTermsTable.getSelectedRow (), 0);
}
termLoading.push (true);
int index = 0;
for (int i = 0; i < viewPanel.termsAndCoursesDialog.termTableModel.getRowCount (); ++i)
{
if (index == 0)
{
if (viewPanel.termsAndCoursesDialog.termTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newTerm")))
{
++index;
}
}
else
{
if (viewPanel.termsAndCoursesDialog.termTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newTerm") + " " + index))
{
++index;
}
}
}
String termName = language.getString ("newTerm");
if (index != 0)
{
termName += " " + index;
}
Term newTerm = new Term (termName, System.currentTimeMillis (), utility);
utility.terms.add (newTerm);
viewPanel.root.add (newTerm);
viewPanel.termsAndCoursesDialog.termTableModel.addRow (new Object[]
{
termName, newTerm.getUniqueID ()
});
viewPanel.termsAndCoursesDialog.settingsTermsTable.refreshTable ();
viewPanel.termsAndCoursesDialog.settingsTermsTable.setSelectedRow (newTerm.getUniqueID (), 1);
viewPanel.termsAndCoursesDialog.settingsTermsTable.scrollRectToVisible (viewPanel.termsAndCoursesDialog.settingsTermsTable.getCellRect (viewPanel.termsAndCoursesDialog.termTableModel.getRowCount () - 1, 0, false));
viewPanel.termsAndCoursesDialog.removeTermButton.setEnabled (true);
refreshTermTree ();
viewPanel.termTree.getSelectionModel ().setSelectionPath (new TreePath (newTerm.getPath ()));
viewPanel.enableCourseButtons ();
viewPanel.termsAndCoursesDialog.showTermDetails ();
needsCoursesAndTermsSave = true;
termLoading.pop ();
}
/**
* Adds a new, empty course to the list of course in the Settings dialog.
* This course has a reference to the currently selected term in the term
* tree. This method also launches the Settings dialog (if not already open)
* to allow the user to specify additional attributes to the course. The
* course is not actually added to the term tree until the user saves the
* changes made in the Settings dialog.
*/
protected synchronized void addCourse()
{
if (currentCourseIndex != -1)
{
viewPanel.termsAndCoursesDialog.checkTermsAndCoursesChanges (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow (), 1);
}
courseLoading.push (true);
viewPanel.termsAndCoursesDialog.termsComboBox.setEnabled (true);
utility.loadSettingsTermCombo ();
int termIndex = viewPanel.getSelectedTermIndex ();
if (termIndex == -1)
{
viewPanel.findTermWithin ();
termIndex = viewPanel.getSelectedTermIndex ();
}
Term term = utility.terms.get (termIndex);
int index = 0;
for (int i = 0; i < viewPanel.termsAndCoursesDialog.courseTableModel.getRowCount (); ++i)
{
if (index == 0)
{
if (viewPanel.termsAndCoursesDialog.courseTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newCourse")))
{
++index;
}
}
else
{
if (viewPanel.termsAndCoursesDialog.courseTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newCourse") + " " + index))
{
++index;
}
}
}
String courseName = language.getString ("newCourse");
if (index != 0)
{
courseName += " " + index;
}
Course newCourse = new Course (courseName, System.currentTimeMillis (), term, utility);
int courseIndex = findCourseIndex (newCourse);
utility.courses.add (newCourse);
term.addCourse (newCourse);
((ExtendedSettingsTableModel) viewPanel.termsAndCoursesDialog.courseTableModel).insertRowAt (courseIndex, new Object[]
{
courseName, newCourse.getTerm ().getTypeName (), newCourse.getUniqueID ()
});
viewPanel.termsAndCoursesDialog.settingsCoursesTable.refreshTable ();
viewPanel.termsAndCoursesDialog.settingsCoursesTable.setSelectedRow (newCourse.getUniqueID (), 2);
viewPanel.termsAndCoursesDialog.settingsCoursesTable.scrollRectToVisible (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getCellRect (viewPanel.termsAndCoursesDialog.courseTableModel.getRowCount () - 1, 0, false));
viewPanel.termsAndCoursesDialog.removeCourseButton.setEnabled (true);
viewPanel.expandTermTree (new TreeExpansionEvent (this, null));
refreshTermTree ();
viewPanel.termTree.getSelectionModel ().setSelectionPath (new TreePath (newCourse.getPath ()));
viewPanel.termsAndCoursesDialog.courseScrollPane.scrollRectToVisible (viewPanel.termsAndCoursesDialog.courseNameTextField.getBounds ());
viewPanel.enableAssignmentButtons ();
viewPanel.termsAndCoursesDialog.showCourseDetails ();
currentTypeIndex = -1;
currentTextbookIndex = -1;
currentInstructorIndex = -1;
needsCoursesAndTermsSave = true;
courseLoading.pop ();
}
/**
* Retrieve the index in the courses list where this course should be added
* relative to its parent term.
*
* @param course The course to add.
* @return The index for where to add it.
*/
protected int findCourseIndex(Course course)
{
for (int i = utility.courses.size () - 1; i >= 0; --i)
{
if (course != utility.courses.get (i)
&& utility.courses.get (i).getTerm () == course.getTerm ())
{
return i;
}
}
return utility.courses.size ();
}
/**
* Adds a new, empty textbook to the list of textbooks in the Settings
* dialog. This textbook has a reference to the currently selected course in
* the term tree. This method also launches the Settings dialog (if not
* already open) to allow the user to specify additional attributes to the
* textbook.
*/
protected synchronized void addTextbook()
{
if (currentTextbookIndex != -1)
{
viewPanel.termsAndCoursesDialog.checkTermsAndCoursesChanges (currentTextbookIndex, 3);
}
textbookLoading.push (true);
int courseIndex = viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ();
Course course = utility.courses.get (courseIndex);
int index = 0;
for (int i = 0; i < viewPanel.termsAndCoursesDialog.textbookTableModel.getRowCount (); ++i)
{
if (index == 0)
{
if (viewPanel.termsAndCoursesDialog.textbookTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newTextbook")))
{
++index;
}
}
else
{
if (viewPanel.termsAndCoursesDialog.textbookTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newTextbook") + " " + index))
{
++index;
}
}
}
String textbookName = language.getString ("newTextbook");
if (index != 0)
{
textbookName += " " + index;
}
Textbook newTextbook = new Textbook (textbookName, System.currentTimeMillis (), course, utility);
utility.textbooks.add (newTextbook);
course.addTextbook (newTextbook);
viewPanel.termsAndCoursesDialog.textbookTableModel.addRow (new Object[]
{
textbookName, newTextbook.getUniqueID ()
});
viewPanel.termsAndCoursesDialog.settingsTextbooksTable.refreshTable ();
viewPanel.termsAndCoursesDialog.settingsTextbooksTable.setSelectedRow (newTextbook.getUniqueID (), 1);
viewPanel.termsAndCoursesDialog.settingsTextbooksTable.scrollRectToVisible (viewPanel.termsAndCoursesDialog.settingsTextbooksTable.getCellRect (viewPanel.termsAndCoursesDialog.textbookTableModel.getRowCount () - 1, 0, false));
viewPanel.termsAndCoursesDialog.courseTabbedPane.setSelectedIndex (3);
viewPanel.termsAndCoursesDialog.removeTextbookButton.setEnabled (true);
needsCoursesAndTermsSave = true;
viewPanel.termsAndCoursesDialog.showTextbookDetails ();
textbookLoading.pop ();
}
/**
* Adds a new, empty type to the list of types in the Settings dialog. This
* type has a reference to the currently selected course in the term tree.
* This method also launches the Settings dialog (if not already open) to
* allow the user to specify additional attributes to the type.
*/
protected synchronized void addType()
{
if (currentTypeIndex != -1)
{
viewPanel.termsAndCoursesDialog.checkTermsAndCoursesChanges (currentTypeIndex, 2);
}
typeLoading.push (true);
int courseIndex = viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ();
Course course = utility.courses.get (courseIndex);
int index = 0;
for (int i = 0; i < viewPanel.termsAndCoursesDialog.typeTableModel.getRowCount (); ++i)
{
if (index == 0)
{
if (viewPanel.termsAndCoursesDialog.typeTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newType")))
{
++index;
}
}
else
{
if (viewPanel.termsAndCoursesDialog.typeTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newType") + " " + index))
{
++index;
}
}
}
String typeName = language.getString ("newType");
if (index != 0)
{
typeName += " " + index;
}
AssignmentType newType = new AssignmentType (typeName, System.currentTimeMillis (), course, utility);
utility.types.add (newType);
course.addType (newType);
viewPanel.termsAndCoursesDialog.typeTableModel.addRow (new Object[]
{
typeName, "", newType.getUniqueID ()
});
viewPanel.termsAndCoursesDialog.settingsTypesTable.refreshTable ();
viewPanel.termsAndCoursesDialog.setSettingsTypesTableSelection (newType.getUniqueID ());
viewPanel.termsAndCoursesDialog.settingsTypesTable.scrollRectToVisible (viewPanel.termsAndCoursesDialog.settingsTypesTable.getCellRect (viewPanel.termsAndCoursesDialog.typeTableModel.getRowCount () - 1, 0, false));
viewPanel.termsAndCoursesDialog.removeTypeButton.setEnabled (true);
viewPanel.termsAndCoursesDialog.courseTabbedPane.setSelectedIndex (2);
needsCoursesAndTermsSave = true;
viewPanel.termsAndCoursesDialog.showTypeDetails ();
typeLoading.pop ();
}
/**
* Adds a new instructor to the Settings dialog.
*/
protected synchronized void addInstructor()
{
if (currentInstructorIndex != -1)
{
viewPanel.termsAndCoursesDialog.checkTermsAndCoursesChanges (currentInstructorIndex, 4);
}
instructorLoading.push (true);
int courseIndex = viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ();
Course course = utility.courses.get (courseIndex);
int index = 0;
for (int i = 0; i < viewPanel.termsAndCoursesDialog.instructorTableModel.getRowCount (); ++i)
{
if (index == 0)
{
if (viewPanel.termsAndCoursesDialog.instructorTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newInstructor")))
{
++index;
}
}
else
{
if (viewPanel.termsAndCoursesDialog.instructorTableModel.getValueAt (i, 0).toString ().equals (language.getString ("newInstructor") + " " + index))
{
++index;
}
}
}
String instructorName = language.getString ("newInstructor");
if (index != 0)
{
instructorName += " " + index;
}
Instructor newInstructor = new Instructor (instructorName, System.currentTimeMillis (), course, utility);
utility.instructors.add (newInstructor);
course.addInstructor (newInstructor);
viewPanel.termsAndCoursesDialog.instructorTableModel.addRow (new Object[]
{
instructorName, newInstructor.getLectureLab (), newInstructor.getUniqueID ()
});
viewPanel.termsAndCoursesDialog.settingsInstructorsTable.refreshTable ();
viewPanel.termsAndCoursesDialog.setSettingsInstructorsTableSelection (newInstructor.getUniqueID ());
viewPanel.termsAndCoursesDialog.settingsInstructorsTable.scrollRectToVisible (viewPanel.termsAndCoursesDialog.settingsInstructorsTable.getCellRect (viewPanel.termsAndCoursesDialog.instructorTableModel.getRowCount () - 1, 0, false));
viewPanel.termsAndCoursesDialog.removeInstructorButton.setEnabled (true);
viewPanel.termsAndCoursesDialog.courseTabbedPane.setSelectedIndex (1);
needsCoursesAndTermsSave = true;
viewPanel.termsAndCoursesDialog.showInstructorDetails ();
instructorLoading.pop ();
}
/**
* Adds a new, empty event to the list of events/assignmentsAndEvents in the
* middle of the main window. Also makes the Event Details Panel fully
* visible so the user may edit details relating to the assignment.
*/
protected void addEvent(Event event)
{
if (currentIndexFromVector != -1)
{
viewPanel.checkAssignmentOrEventChanges (currentIndexFromVector);
viewPanel.checkRepeatEventChanges (currentIndexFromVector);
}
assignmentOrEventLoading.push (true);
boolean silent = true;
if (event == null)
{
event = new Event (language.getString ("newEvent"), System.currentTimeMillis (), utility, utility.getEventYear (viewPanel.miniCalendar.getYearChooser ().getYear () + ""));
silent = false;
}
event.getEventYear ().addEvent (event);
utility.preferences.categories.get (0).addEvent (event);
if (!silent && viewPanel.middleTabbedPane.getSelectedIndex () == 1 && viewPanel.selectedDayPanel != null)
{
String month = viewPanel.miniCalendar.getMonthChooser ().getMonth () + 1 + "";
if (month.length () == 1)
{
month = "0" + month;
}
String day = viewPanel.getIndexFromDaysArray (viewPanel.selectedDayPanel) + 1 + "";
if (day.length () == 1)
{
day = "0" + day;
}
int year = viewPanel.miniCalendar.getYearChooser ().getYear ();
String newDate = month + "/" + day + "/" + year;
event.setDate (newDate, utility);
}
if (utility.preferences.filter1Index != 1)
{
viewPanel.assignmentsTableModel.addRow (event.getRowObject ());
}
utility.assignmentsAndEvents.add (event);
if (utility.preferences.filter1Index != 1)
{
viewPanel.assignmentsTable.setSelectedRow (viewPanel.assignmentsTableModel.getRowCount () - 1);
viewPanel.cloneButton.setEnabled (true);
viewPanel.removeButton.setEnabled (true);
}
event.getEventYear ().markChanged ();
viewPanel.filter (true);
if (viewPanel.middleTabbedPane.getSelectedIndex () == 1)
{
if (utility.preferences.filter1Index != 1)
{
viewPanel.daysAssignmentsAndEvents[Integer.parseInt (event.getDueDate ().split ("/")[1]) - 1].add (event);
viewPanel.shownEvents.add (event);
}
if (!silent)
{
event.getLabel ().addMouseListener (new MouseAdapter ()
{
@Override
public void mouseReleased(MouseEvent evt)
{
viewPanel.eventMouseReleased (evt);
}
});
}
viewPanel.DRAG_SOURCE.createDefaultDragGestureRecognizer (event.getLabel (), DnDConstants.ACTION_MOVE, viewPanel.DND_LISTENER);
event.refreshText ();
if (utility.preferences.filter1Index != 1)
{
viewPanel.assignmentsTable.setSelectedRowFromVectorIndex (utility.getAssignmentOrEventIndexByID (event.getUniqueID ()));
if (viewPanel.selectedDayPanel != null)
{
viewPanel.selectedDayPanel.setBorder (viewPanel.UNSELECTED_DAY_BORDER);
}
viewPanel.selectedDayPanel = viewPanel.days[Integer.parseInt (event.getDueDate ().split ("/")[1]) - 1];
viewPanel.selectedDayPanel.setBorder (viewPanel.SELECTED_DAY_BORDER);
}
viewPanel.refreshDayInCalendar (Integer.parseInt (event.getDueDate ().split ("/")[1]) - 1);
}
viewPanel.refreshBusyDays ();
if (viewPanel.assignmentsTableModel.getRowCount () == 1)
{
viewPanel.assignmentsTableRowSelected (null);
}
viewPanel.adjustAssignmentTableColumnWidths ();
assignmentOrEventLoading.pop ();
}
/**
* Adds a new, empty assignment to the list of assignmentsAndEvents in the
* middle of the main window. Also makes the Assignment Details panel fully
* visible so the user may edit details relating to the assignment.
*/
protected void addAssignment()
{
if (currentIndexFromVector != -1)
{
viewPanel.checkAssignmentOrEventChanges (currentIndexFromVector);
viewPanel.checkRepeatEventChanges (currentIndexFromVector);
}
assignmentOrEventLoading.push (true);
int courseIndex = 0;
boolean absolute = false;
if (viewPanel.getSelectedCourseIndexFrom (viewPanel.getSelectedTermIndex ()) != -1)
{
courseIndex = viewPanel.getSelectedCourseIndexFrom (viewPanel.getSelectedTermIndex ());
}
else
{
for (int i = 0; i < utility.courses.size (); ++i)
{
Course course = utility.courses.get (i);
Date date = viewPanel.miniCalendar.getDate ();
try
{
if (date.after (Domain.DATE_FORMAT.parse (course.getStartDate ()))
&& date.before (Domain.DATE_FORMAT.parse (course.getEndDate ())))
{
absolute = true;
courseIndex = i;
break;
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
}
}
int termIndex = 0;
if (viewPanel.getSelectedTermIndex () != -1)
{
termIndex = viewPanel.getSelectedTermIndex ();
}
Course course = null;
if (absolute)
{
course = utility.courses.get (courseIndex);
}
else
{
course = utility.terms.get (termIndex).getCourse (courseIndex);
}
Assignment assignment = new Assignment (language.getString ("newAssignment"), System.currentTimeMillis (), course, utility);
course.addAssignment (assignment);
if (viewPanel.middleTabbedPane.getSelectedIndex () == 1 && viewPanel.selectedDayPanel != null)
{
String month = viewPanel.miniCalendar.getMonthChooser ().getMonth () + 1 + "";
if (month.length () == 1)
{
month = "0" + month;
}
String day = viewPanel.getIndexFromDaysArray (viewPanel.selectedDayPanel) + 1 + "";
if (day.length () == 1)
{
day = "0" + day;
}
int year = viewPanel.miniCalendar.getYearChooser ().getYear ();
String newDate = month + "/" + day + "/" + year;
assignment.setDueDate (newDate);
}
if (utility.preferences.filter1Index != 2)
{
viewPanel.assignmentsTableModel.addRow (assignment.getRowObject ());
}
utility.assignmentsAndEvents.add (assignment);
if (utility.preferences.filter1Index != 2)
{
viewPanel.assignmentsTable.setSelectedRow (viewPanel.assignmentsTableModel.getRowCount () - 1);
viewPanel.cloneButton.setEnabled (true);
viewPanel.removeButton.setEnabled (true);
}
course.markChanged ();
viewPanel.filter (true);
if (viewPanel.middleTabbedPane.getSelectedIndex () == 1)
{
if (utility.preferences.filter1Index != 2)
{
viewPanel.daysAssignmentsAndEvents[Integer.parseInt (assignment.getDueDate ().split ("/")[1]) - 1].add (assignment);
viewPanel.shownAssignments.add (assignment);
}
assignment.getLabel ().addMouseListener (new MouseAdapter ()
{
@Override
public void mouseReleased(MouseEvent evt)
{
viewPanel.assignmentMousePressed (evt);
}
});
assignment.getCheckBox ().addItemListener (new ItemListener ()
{
@Override
public void itemStateChanged(ItemEvent evt)
{
viewPanel.assignmentItemStateChanged (evt);
}
});
viewPanel.DRAG_SOURCE.createDefaultDragGestureRecognizer (assignment.getLabel (), DnDConstants.ACTION_MOVE, viewPanel.DND_LISTENER);
assignment.refreshText ();
if (utility.preferences.filter1Index != 2)
{
viewPanel.assignmentsTable.setSelectedRowFromVectorIndex (utility.getAssignmentOrEventIndexByID (assignment.getUniqueID ()));
if (viewPanel.selectedDayPanel != null)
{
viewPanel.selectedDayPanel.setBorder (viewPanel.UNSELECTED_DAY_BORDER);
}
viewPanel.selectedDayPanel = viewPanel.days[Integer.parseInt (assignment.getDueDate ().split ("/")[1]) - 1];
viewPanel.selectedDayPanel.setBorder (viewPanel.SELECTED_DAY_BORDER);
}
viewPanel.refreshDayInCalendar (Integer.parseInt (assignment.getDueDate ().split ("/")[1]) - 1);
}
viewPanel.refreshBusyDays ();
if (viewPanel.assignmentsTableModel.getRowCount () == 1)
{
viewPanel.assignmentsTableRowSelected (null);
}
viewPanel.adjustAssignmentTableColumnWidths ();
assignmentOrEventLoading.pop ();
}
/**
* Create a cloned object of the given toClone object, with the cloned
* object only differing in date by the given date.
*
* @param toClone The event to clone.
* @param utility A reference to the applications utility.
* @param date The date for the newly cloned event.
* @param effectYearAndCat True if the event should be added to the
* year/category upon creation, false if the event should just be created
* and returned
* @return The cloned object.
*/
protected Event createCloneObject(Event toClone, LocalUtility utility, Date date, boolean effectYearAndCat)
{
long uniqueID = System.currentTimeMillis ();
while (utility.getByID (uniqueID) != null)
{
uniqueID = (long) (uniqueID * Math.random ());
}
Event event = new Event (toClone.getItemName (), uniqueID, utility, toClone.getEventYear ());
if (effectYearAndCat)
{
toClone.getCategory ().addEvent (event);
event.getEventYear ().addEvent (event);
event.getEventYear ().markChanged ();
}
event.setCategory (toClone.getCategory ());
event.setDate (Domain.DATE_FORMAT.format (date), utility);
event.setDescription (toClone.getDescription ());
event.setStartTime (0, toClone.getStartTime (0));
event.setStartTime (1, toClone.getStartTime (1));
event.setStartTime (2, toClone.getStartTime (2));
event.setEndTime (0, toClone.getEndTime (0));
event.setEndTime (1, toClone.getEndTime (1));
event.setEndTime (2, toClone.getEndTime (2));
event.setIsAllDay (toClone.isAllDay ());
event.setEventLocation (toClone.getEventLocation ());
event.setRepeating (toClone.getRepeating ().toString ());
event.getRepeating ().setID (toClone.getRepeating ().getID ());
return event;
}
/**
* Duplicates the selected event, making a second (yet unique) instance of
* it in the events list and in the assignmentsAndEvents table.
*
* @param utility
*/
protected void cloneEvent(LocalUtility utility)
{
if (currentIndexFromVector != -1)
{
viewPanel.checkAssignmentOrEventChanges (currentIndexFromVector);
viewPanel.checkRepeatEventChanges (currentIndexFromVector);
}
assignmentOrEventLoading.push (true);
Event toClone = (Event) utility.assignmentsAndEvents.get (currentIndexFromVector);
try
{
Event event = createCloneObject (toClone, utility, Domain.DATE_FORMAT.parse (toClone.getDueDate ()), true);
event.getRepeating ().setID (-1);
if (utility.preferences.filter1Index != 1)
{
viewPanel.assignmentsTableModel.addRow (event.getRowObject ());
}
utility.assignmentsAndEvents.add (event);
viewPanel.assignmentsTable.setSelectedRow (viewPanel.assignmentsTableModel.getRowCount () - 1);
viewPanel.filter (true);
if (viewPanel.middleTabbedPane.getSelectedIndex () == 1)
{
if (utility.preferences.filter1Index != 1)
{
viewPanel.daysAssignmentsAndEvents[Integer.parseInt (event.getDueDate ().split ("/")[1]) - 1].add (event);
viewPanel.shownEvents.add (event);
}
event.getLabel ().addMouseListener (new MouseAdapter ()
{
@Override
public void mouseReleased(MouseEvent evt)
{
viewPanel.eventMouseReleased (evt);
}
});
viewPanel.DRAG_SOURCE.createDefaultDragGestureRecognizer (event.getLabel (), DnDConstants.ACTION_MOVE, viewPanel.DND_LISTENER);
event.refreshText ();
viewPanel.refreshDayInCalendar (Integer.parseInt (event.getDueDate ().split ("/")[1]) - 1);
}
viewPanel.refreshBusyDays ();
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
assignmentOrEventLoading.pop ();
}
/**
* Duplicates the selected assignment, making a second (yet unique) instance
* of it in the assignmentsAndEvents list, to the course, and in the
* assignmentsAndEvents table.
*/
protected void cloneAssignment()
{
if (currentIndexFromVector != -1)
{
viewPanel.checkAssignmentOrEventChanges (currentIndexFromVector);
viewPanel.checkRepeatEventChanges (currentIndexFromVector);
}
assignmentOrEventLoading.push (true);
Assignment toClone = (Assignment) utility.assignmentsAndEvents.get (currentIndexFromVector);
Assignment assignment = new Assignment (toClone.getItemName (), System.currentTimeMillis (), toClone.getCourse (), utility);
toClone.getCourse ().addAssignment (assignment);
assignment.setDueDate (toClone.getDueDate ());
assignment.setDueTime (0, toClone.getDueTime (0));
assignment.setDueTime (1, toClone.getDueTime (1));
assignment.setDueTime (2, toClone.getDueTime (2));
assignment.setComments (toClone.getComments ());
assignment.setGrade (toClone.getGrade ());
assignment.setIsDone (toClone.isDone ());
assignment.setPriority (toClone.getPriority ());
assignment.setTextbook (toClone.getTextbook ());
assignment.setType (toClone.getType ());
if (utility.preferences.filter1Index != 1)
{
viewPanel.assignmentsTableModel.addRow (assignment.getRowObject ());
}
utility.assignmentsAndEvents.add (assignment);
viewPanel.assignmentsTable.setSelectedRow (viewPanel.assignmentsTableModel.getRowCount () - 1);
assignment.getCourse ().markChanged ();
viewPanel.filter (true);
if (viewPanel.middleTabbedPane.getSelectedIndex () == 1)
{
if (utility.preferences.filter1Index != 1)
{
viewPanel.daysAssignmentsAndEvents[Integer.parseInt (assignment.getDueDate ().split ("/")[1]) - 1].add (assignment);
viewPanel.shownAssignments.add (assignment);
}
assignment.getLabel ().addMouseListener (new MouseAdapter ()
{
@Override
public void mouseReleased(MouseEvent evt)
{
viewPanel.assignmentMousePressed (evt);
}
});
assignment.getCheckBox ().addItemListener (new ItemListener ()
{
@Override
public void itemStateChanged(ItemEvent evt)
{
viewPanel.assignmentItemStateChanged (evt);
}
});
viewPanel.DRAG_SOURCE.createDefaultDragGestureRecognizer (assignment.getLabel (), DnDConstants.ACTION_MOVE, viewPanel.DND_LISTENER);
assignment.refreshText ();
viewPanel.refreshDayInCalendar (Integer.parseInt (assignment.getDueDate ().split ("/")[1]) - 1);
}
viewPanel.refreshBusyDays ();
assignmentOrEventLoading.pop ();
}
/**
* Set the name of the category.
*
* @param index The index of the category to set the name for.
*/
protected void setCategoryName(int index)
{
if (categoryLoading.empty () && needsPreferencesSave && !viewPanel.initLoading)
{
Category category = utility.preferences.categories.get (index);
if (utility.getCategoryByName (viewPanel.settingsDialog.categoryNameTextField.getText ()) == null
|| utility.getCategoryByName (viewPanel.settingsDialog.categoryNameTextField.getText ()) == category)
{
category.setName (viewPanel.settingsDialog.categoryNameTextField.getText ());
viewPanel.settingsDialog.categoryTableModel.setValueAt (category.getName (), index, 0);
viewPanel.settingsDialog.settingsCategoriesTable.refreshTable ();
}
else
{
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("categoryDuplicateName"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.settingsDialog, language.getString ("duplicateName"));
optionDialog.setVisible (true);
viewPanel.settingsDialog.categoryNameTextField.setText (category.getName ());
}
}
}
/**
* Refreshes the items in the categories combo box.
*/
public void refreshCategoryComboModel()
{
assignmentOrEventLoading.push (true);
viewPanel.categoryComboModel.removeAllElements ();
for (int i = 0; i < utility.preferences.categories.size (); ++i)
{
viewPanel.categoryComboModel.addElement (utility.preferences.categories.get (i).getName ());
}
viewPanel.categoryComboBox.invalidate ();
if (currentIndexFromVector != -1)
{
ListItem item = utility.assignmentsAndEvents.get (currentIndexFromVector);
if (!item.isAssignment ())
{
viewPanel.categoryComboBox.setSelectedItem (((Event) item).getCategory ().getName ());
}
}
assignmentOrEventLoading.pop ();
}
/**
* Sets the name of the specified term with the value found in the term name
* text field of the Settings dialog.
*
* @param index The index of the term.
*/
protected void setTermName(int index)
{
if (index != -1 && needsCoursesAndTermsSave && termLoading.empty ())
{
Term term = utility.terms.get (index);
String text = viewPanel.termsAndCoursesDialog.termNameTextField.getText ();
if (text.replaceAll (" ", "").equals (""))
{
termLoading.push (true);
viewPanel.termsAndCoursesDialog.termNameTextField.setText (term.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("invalidTermNameText"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidTermName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.termNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.termNameTextField.selectAll ();
termLoading.pop ();
}
else
{
if (!text.equals ("-" + language.getString ("none") + "-"))
{
term.setTypeName (text);
refreshTermTree ();
viewPanel.termsAndCoursesDialog.termTableModel.setValueAt (term.getTypeName (), index, 0);
viewPanel.termsAndCoursesDialog.settingsTermsTable.refreshTable ();
}
else
{
termLoading.push (true);
viewPanel.termsAndCoursesDialog.termNameTextField.setText (term.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("termNameAlreadyExists"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidTermName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.termNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.termNameTextField.selectAll ();
termLoading.pop ();
}
}
}
}
/**
* Refresh the term tree after an item has been changed.
*/
public void refreshTermTree()
{
TreePath node = viewPanel.termTree.getSelectionPath ();
viewPanel.termTree.invalidate ();
((DefaultTreeModel) viewPanel.termTree.getModel ()).reload ();
viewPanel.expandTermTree (new TreeExpansionEvent (this, null));
viewPanel.termTree.setSelectionPath (node);
}
/**
* Sets the name of the specified course with the value found in the course
* name text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseName(int index)
{
if (index != -1 && needsCoursesAndTermsSave && courseLoading.empty ())
{
Course course = utility.courses.get (index);
String text = viewPanel.termsAndCoursesDialog.courseNameTextField.getText ();
if (text.replaceAll (" ", "").equals (""))
{
courseLoading.push (true);
viewPanel.termsAndCoursesDialog.courseNameTextField.setText (course.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("invalidCourseNameText"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidCourseName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.courseNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.courseNameTextField.selectAll ();
courseLoading.pop ();
}
else
{
if (!text.equals ("-" + language.getString ("none") + "-"))
{
course.setTypeName (viewPanel.termsAndCoursesDialog.courseNameTextField.getText ());
refreshTermTree ();
viewPanel.termsAndCoursesDialog.courseTableModel.setValueAt (course.getTypeName (), index, 0);
viewPanel.termsAndCoursesDialog.settingsCoursesTable.refreshTable ();
}
else
{
courseLoading.push (true);
viewPanel.termsAndCoursesDialog.courseNameTextField.setText (course.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("courseNameAlreadyExists"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidCourseName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.courseNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.courseNameTextField.selectAll ();
courseLoading.pop ();
}
}
}
}
/**
* Sets the name of the specified type with the value found in the type name
* text field of the Settings dialog.
*
* @param index The index of the type.
*/
protected void setTypeName(int index)
{
if (index != -1 && needsCoursesAndTermsSave && typeLoading.empty ())
{
AssignmentType type = utility.courses.get (currentCourseIndex).getType (index);
String text = viewPanel.termsAndCoursesDialog.typeNameTextField.getText ();
if (text.replaceAll (" ", "").equals (""))
{
typeLoading.push (true);
viewPanel.termsAndCoursesDialog.typeNameTextField.setText (type.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("invalidTypeNameText"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidTypeName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.typeNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.typeNameTextField.selectAll ();
typeLoading.pop ();
}
else
{
if (!text.equals ("-" + language.getString ("none") + "-"))
{
type.setTypeName (text);
viewPanel.termsAndCoursesDialog.typeTableModel.setValueAt (type.getTypeName (), index, 0);
viewPanel.termsAndCoursesDialog.settingsTypesTable.refreshTable ();
}
else
{
typeLoading.push (true);
viewPanel.termsAndCoursesDialog.typeNameTextField.setText (type.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("typeNameAlreadyExists"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidTypeName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.typeNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.typeNameTextField.selectAll ();
typeLoading.pop ();
}
}
}
}
/**
* Sets the name of the specified textbook with the value found in the
* textbook name text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookName(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
String text = viewPanel.termsAndCoursesDialog.textbookNameTextField.getText ();
if (text.replaceAll (" ", "").equals (""))
{
textbookLoading.push (true);
viewPanel.termsAndCoursesDialog.textbookNameTextField.setText (textbook.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("invalidTextbookNameText"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidTextbookName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.textbookNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.textbookNameTextField.selectAll ();
textbookLoading.pop ();
}
else
{
if (!text.equals ("-" + language.getString ("none") + "-"))
{
textbook.setTypeName (viewPanel.termsAndCoursesDialog.textbookNameTextField.getText ());
viewPanel.termsAndCoursesDialog.textbookTableModel.setValueAt (textbook.getTypeName (), index, 0);
viewPanel.termsAndCoursesDialog.settingsTextbooksTable.refreshTable ();
}
else
{
textbookLoading.push (true);
viewPanel.termsAndCoursesDialog.textbookNameTextField.setText (textbook.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("textbookNameAlreadyExists"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidTextbookName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.textbookNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.textbookNameTextField.selectAll ();
textbookLoading.pop ();
}
}
}
}
/**
* Sets the name of the specified assignment with the value found in the
* assignment name text field of the details right-hand side panel.
*
* @param index The index of the assignment.
*/
protected int setAssignmentName(int index)
{
int response = -1;
try
{
if (index != -1
&& ((Assignment) utility.assignmentsAndEvents.get (index)).getCourse ().isChanged ()
&& assignmentOrEventLoading.empty ()
&& viewPanel.assignmentContentPanel.isVisible ())
{
Assignment assignment = (Assignment) utility.assignmentsAndEvents.get (index);
String text = viewPanel.assignmentNameTextField.getText ();
if (text.replaceAll (" ", "").equals (""))
{
response = 1;
assignmentOrEventLoading.push (true);
viewPanel.assignmentNameTextField.setText (assignment.getItemName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("assignmentLeftEmpty"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel, language.getString ("invalidAssignmentName"));
optionDialog.setVisible (true);
if (viewPanel.dontReselectName.empty ())
{
viewPanel.assignmentNameTextField.requestFocus ();
viewPanel.assignmentNameTextField.selectAll ();
}
assignmentOrEventLoading.pop ();
}
else
{
assignment.setItemName (viewPanel.assignmentNameTextField.getText ());
assignment.refreshText ();
viewPanel.refreshAssignmentsRowAt (index);
assignment.getCourse ().markChanged ();
viewPanel.filter (false);
if (utility.preferences.sortIndex == 1)
{
viewPanel.scrollToItemOrToday (assignment);
}
}
}
}
catch (ClassCastException ex)
{
}
return response;
}
/**
* Sets the name of the specified event with the value found in the event
* name text field of the details right-hand side panel.
*
* @param index The index of the event.
*/
protected int setEventName(int index)
{
int response = -1;
try
{
if (index != -1
&& ((Event) utility.assignmentsAndEvents.get (index)).getEventYear ().isChanged ()
&& assignmentOrEventLoading.empty ()
&& viewPanel.eventContentPanel.isVisible ())
{
Event event = (Event) utility.assignmentsAndEvents.get (index);
String text = viewPanel.eventNameTextField.getText ();
if (text.replaceAll (" ", "").equals (""))
{
response = 1;
assignmentOrEventLoading.push (true);
viewPanel.eventNameTextField.setText (event.getItemName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("eventLeftEmpty"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel, language.getString ("invalidEventName"));
optionDialog.setVisible (true);
if (viewPanel.dontReselectName.empty ())
{
viewPanel.eventNameTextField.requestFocus ();
viewPanel.eventNameTextField.selectAll ();
}
assignmentOrEventLoading.pop ();
}
else
{
if (!text.equals (event.getItemName ()))
{
viewPanel.eventChanges.push (true);
}
event.setItemName (viewPanel.eventNameTextField.getText ());
viewPanel.refreshAssignmentsRowAt (index);
event.refreshText ();
event.getEventYear ().markChanged ();
viewPanel.filter (false);
if (utility.preferences.sortIndex == 1)
{
viewPanel.scrollToItemOrToday (event);
}
}
}
}
catch (ClassCastException ex)
{
}
return response;
}
/**
* Sets the weight of the specified type with the value found in the type
* weight text field of the Settings dialog.
*
* @param index The index of the type.
*/
protected void setTypeWeight(int index)
{
if (index != -1 && needsCoursesAndTermsSave && typeLoading.empty ())
{
AssignmentType type = utility.courses.get (currentCourseIndex).getType (index);
if (verifyWeight (viewPanel.termsAndCoursesDialog.weightTextField.getText (), type) != null && !verifyWeight (viewPanel.termsAndCoursesDialog.weightTextField.getText (), type).equals ("-1"))
{
viewPanel.termsAndCoursesDialog.weightTextField.setText (verifyWeight (viewPanel.termsAndCoursesDialog.weightTextField.getText (), type));
type.setWeight (viewPanel.termsAndCoursesDialog.weightTextField.getText ());
setTotalWeightLabel (currentCourseIndex);
viewPanel.termsAndCoursesDialog.typeTableModel.setValueAt (type.getWeight (), index, 1);
viewPanel.termsAndCoursesDialog.settingsTypesTable.refreshTable ();
}
else
{
if (viewPanel.termsAndCoursesDialog.weightTextField.getText ().replaceAll (" ", "").equals (""))
{
type.setWeight (viewPanel.termsAndCoursesDialog.weightTextField.getText ());
setTotalWeightLabel (currentCourseIndex);
viewPanel.termsAndCoursesDialog.typeTableModel.setValueAt (type.getWeight (), index, 1);
viewPanel.termsAndCoursesDialog.settingsTypesTable.refreshTable ();
}
else
{
if (verifyWeight (viewPanel.termsAndCoursesDialog.weightTextField.getText (), type) == null)
{
viewPanel.termsAndCoursesDialog.weightTextField.setText (type.getWeight ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("enterValidPercentageWeight"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidWeight"));
optionDialog.setVisible (true);
}
else if (verifyWeight (viewPanel.termsAndCoursesDialog.weightTextField.getText (), type).equals ("-1"))
{
viewPanel.termsAndCoursesDialog.weightTextField.setText (type.getWeight ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("typesMustAddToHundred"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidWeight"));
optionDialog.setVisible (true);
}
else
{
viewPanel.termsAndCoursesDialog.weightTextField.setText (type.getWeight ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("typeWeightMustBeValidPercent"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidWeight"));
optionDialog.setVisible (true);
}
viewPanel.termsAndCoursesDialog.weightTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.weightTextField.selectAll ();
}
}
}
}
/**
* Set overall type weight for currently displayed course.
*
* @param index Current course index.
*/
public void setTotalWeightLabel(int index)
{
ArrayList<Double> weights = new ArrayList<Double> ();
Course course = utility.courses.get (index);
for (int i = 0; i < course.getTypeCount (); ++i)
{
AssignmentType type = course.getType (i);
if (!type.getWeight ().equals (""))
{
if (weights.isEmpty ())
{
weights.add (Double.parseDouble (type.getWeight ().replaceAll ("%", "")));
}
else
{
weights.add (Double.parseDouble (type.getWeight ().replaceAll ("%", "")) + weights.get (weights.size () - 1));
}
}
}
if (weights.isEmpty ())
{
viewPanel.termsAndCoursesDialog.typesListLabel.setText (language.getString ("gradingScale"));
}
else
{
double weight = weights.get (weights.size () - 1);
if (weight > 100)
{
weight = 100;
}
viewPanel.termsAndCoursesDialog.typesListLabel.setText (language.getString ("gradingScale") + " (" + language.getString ("total") + ": " + Domain.PERCENT_FORMAT.format (weight / 100) + ")");
}
}
/**
* Verifies a given weight to ensure that it is a valid numerical form for a
* type's weight to be. If so, a formatted weight is returned, otherwise
* null is returned.
*
* @param weight The unformatted weight to be checked.
* @param type The type assigned being reference by this course.
*/
private String verifyWeight(String weight, AssignmentType type)
{
try
{
String newWeight = parseToPercent (weight);
if (newWeight != null)
{
double percent = Double.parseDouble (newWeight.replaceAll ("%", "")) / 100;
if (1 >= (type.getCourse ().getTotalWeightsLess (type)) + percent)
{
newWeight = Domain.PERCENT_FORMAT.format (percent);
}
else
{
newWeight = "-1";
}
if (!newWeight.equals ("-1") && newWeight.split ("\\.")[1].equals ("00%"))
{
newWeight = newWeight.split ("\\.")[0] + "%";
}
}
return newWeight;
}
catch (NumberFormatException ex)
{
return "-1";
}
}
/**
* Sets the author of the specified textbook with the value found in the
* textbook author text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookAuthor(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
textbook.setAuthor (viewPanel.termsAndCoursesDialog.authorTextField.getText ());
}
}
/**
* Sets the publisher of the specified textbook with the value found in the
* textbook publisher text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookPublisher(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
textbook.setPublisher (viewPanel.termsAndCoursesDialog.publisherTextField.getText ());
}
}
/**
* Sets the ISBN of the specified textbook with the value found in the
* textbook ISBN text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookISBN(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
textbook.setISBN (viewPanel.termsAndCoursesDialog.isbnTextField.getText ());
if (!textbook.getISBN ().replaceAll (" ", "").equals (""))
{
viewPanel.termsAndCoursesDialog.searchGoogleButton.setEnabled (true);
}
else
{
viewPanel.termsAndCoursesDialog.searchGoogleButton.setEnabled (false);
}
}
}
/**
* Sets the textbook source of the specified textbook with the value found
* in the textbook source text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookSource(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
if (!viewPanel.termsAndCoursesDialog.textbookSourceTextField.getText ().equals ("")
&& !viewPanel.termsAndCoursesDialog.textbookSourceTextField.getText ().startsWith ("http://"))
{
viewPanel.termsAndCoursesDialog.textbookSourceTextField.setText ("http://" + viewPanel.termsAndCoursesDialog.textbookSourceTextField.getText ());
}
textbook.setSource (viewPanel.termsAndCoursesDialog.textbookSourceTextField.getText ());
}
}
/**
* Sets the price of the specified textbook with the value found in the
* textbook price text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookPrice(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
textbook.setPrice (viewPanel.termsAndCoursesDialog.purchasePriceTextField.getText ());
}
}
/**
* Sets the contact email of the specified textbook with the value found in
* the textbook contact email text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookContactEmail(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Matcher matcher = Domain.EMAIL_PATTERN.matcher (viewPanel.termsAndCoursesDialog.contactEmailTextField.getText ());
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
if (matcher.matches ())
{
textbook.setContactEmail (viewPanel.termsAndCoursesDialog.contactEmailTextField.getText ());
}
else
{
if (viewPanel.termsAndCoursesDialog.contactEmailTextField.getText ().replaceAll (" ", "").equals (""))
{
textbook.setContactEmail (viewPanel.termsAndCoursesDialog.contactEmailTextField.getText ());
}
else
{
viewPanel.termsAndCoursesDialog.contactEmailTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.contactEmailTextField.selectAll ();
}
}
}
}
/**
* Sets the condition of the specified textbook with the value found in the
* textbook condition text field of the Settings dialog.
*
* @param index The index of the textbook.
*/
protected void setTextbookCondition(int index)
{
if (index != -1 && needsCoursesAndTermsSave && textbookLoading.empty ())
{
Textbook textbook = utility.courses.get (currentCourseIndex).getTextbook (index);
textbook.setCondition (viewPanel.termsAndCoursesDialog.conditionTextField.getText ());
}
}
/**
* Sets the grade of the specified assignment with the value found in the
* assignment grade text field of the details right-hand side panel.
*
* @param index The index of the assignment.
*/
protected void setAssignmentGrade(int index)
{
try
{
if (index != -1
&& ((Assignment) utility.assignmentsAndEvents.get (index)).getCourse ().isChanged ()
&& assignmentOrEventLoading.empty ())
{
Assignment assignment = (Assignment) utility.assignmentsAndEvents.get (currentIndexFromVector);
if (parseToPercent (viewPanel.gradeTextField.getText ()) != null)
{
viewPanel.gradeTextField.setText (parseToPercent (viewPanel.gradeTextField.getText ()));
assignment.setGrade (viewPanel.gradeTextField.getText ());
viewPanel.refreshAssignmentsRowAt (currentIndexFromVector);
assignment.getCourse ().markChanged ();
viewPanel.filter (true);
if (utility.preferences.sortIndex == 5)
{
viewPanel.scrollToItemOrToday (assignment);
}
}
else
{
if (viewPanel.gradeTextField.getText ().replaceAll (" ", "").equals (""))
{
assignment.setGrade (viewPanel.gradeTextField.getText ());
viewPanel.refreshAssignmentsRowAt (currentIndexFromVector);
assignment.getCourse ().markChanged ();
viewPanel.filter (true);
if (utility.preferences.sortIndex == 5)
{
viewPanel.scrollToItemOrToday (assignment);
}
}
else
{
assignmentOrEventLoading.push (true);
viewPanel.gradeTextField.setText ("");
assignmentOrEventLoading.pop ();
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("assnMustEnterValidGrade"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel, language.getString ("invalidGrade"));
optionDialog.setVisible (true);
viewPanel.gradeTextField.requestFocus ();
viewPanel.gradeTextField.selectAll ();
}
}
}
}
catch (ClassCastException ex)
{
Domain.LOGGER.add (ex);
}
}
/**
* Sets the location of the specified event with the value found in the
* event location text field of the details right-hand side panel.
*
* @param index The index of the event.
*/
protected void setEventLocation(int index)
{
try
{
if (index != -1
&& ((Event) utility.assignmentsAndEvents.get (index)).getEventYear ().isChanged ()
&& assignmentOrEventLoading.empty ())
{
viewPanel.eventChanges.push (true);
Event event = (Event) utility.assignmentsAndEvents.get (currentIndexFromVector);
event.setEventLocation (viewPanel.locationTextField.getText ());
if (!event.getEventLocation ().replaceAll (" ", "").equals (""))
{
viewPanel.googleMapsButton.setEnabled (true);
}
else
{
viewPanel.googleMapsButton.setEnabled (false);
}
}
}
catch (ClassCastException ex)
{
Domain.LOGGER.add (ex);
}
}
/**
* Parses a grade into a valid String and returns it. If the grade could not
* be parsed, null is returned.
*
* @param string The string to be parsed.
* @return The parsed grade, or null if it could not be parsed.
*/
protected String parseToPercent(String string)
{
String newString = null;
string = string.replaceAll (" ", "");
try
{
double value = Double.parseDouble (string);
if (value != 0)
{
newString = Domain.PERCENT_FORMAT.format (value / 100);
}
else
{
newString = "0%";
}
}
catch (NumberFormatException ex)
{
// already a percentage?
if (string.endsWith ("%"))
{
try
{
double value = Double.parseDouble (string.replaceAll ("%", ""));
newString = Domain.PERCENT_FORMAT.format (value / 100);
}
catch (NumberFormatException innerEx)
{
Domain.LOGGER.add (ex);
}
}
// proper division?
else
{
if (string.contains ("/"))
{
String[] split = string.split ("/");
if (split.length == 2)
{
try
{
double first = Double.parseDouble (split[0]);
if (first != 0)
{
double second = Double.parseDouble (split[1]);
double value = first / second;
newString = Domain.PERCENT_FORMAT.format (value);
}
else
{
newString = "0%";
}
}
catch (NumberFormatException innerEx)
{
Domain.LOGGER.add (ex);
}
}
}
// worded division?
else
{
if (string.contains ("of"))
{
String[] split = string.split ("of");
if (split.length == 2)
{
if (split[0].contains ("out"))
{
split[0] = split[0].substring (0, split[0].indexOf ("out"));
split[0] = split[0].replaceAll (" ", "");
}
try
{
double first = Double.parseDouble (split[0]);
if (first != 0)
{
double second = Double.parseDouble (split[1]);
double value = first / second;
newString = Domain.PERCENT_FORMAT.format (value);
}
else
{
newString = "0%";
}
}
catch (NumberFormatException innerEx)
{
Domain.LOGGER.add (ex);
}
}
}
}
}
}
if (newString != null && !newString.equals ("0%") && newString.split ("\\.")[1].equals ("00%"))
{
newString = newString.split ("\\.")[0] + "%";
}
return newString;
}
/**
* Sets the start time for the lab of the currently selected course.
*
* @param index The currently selected course.
*/
protected void setLabCourseStartHr(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.labEndHrChooser.setValue (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.labEndMinChooser.setValue (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.labEndMChooser.setValue (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (index);
String time = Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ());
course.setLabStartTime (0, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the start time for the lab of the currently selected course.
*
* @param index The currently selected course.
*/
protected void setLabCourseStartMin(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.labEndHrChooser.setValue (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.labEndMinChooser.setValue (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.labEndMChooser.setValue (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (index);
String time = Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ());
course.setLabStartTime (1, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the start time for the lab of the currently selected course.
*
* @param index The currently selected course.
*/
protected void setLabCourseStartM(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.labEndHrChooser.setValue (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.labEndMinChooser.setValue (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.labEndMChooser.setValue (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (index);
String time = Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ());
course.setLabStartTime (2, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the end time for the lab of the currently selected course.
*
* @param index The currently selected course.
*/
protected void setLabCourseEndHr(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.labStartHrChooser.setValue (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.labStartMinChooser.setValue (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.labStartMChooser.setValue (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ());
String time = Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ());
course.setLabEndTime (0, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the end time for the lab of the currently selected course.
*
* @param index The currently selected course.
*/
protected void setLabCourseEndMin(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.labStartHrChooser.setValue (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.labStartMinChooser.setValue (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.labStartMChooser.setValue (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ());
String time = Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ());
course.setLabEndTime (1, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the end time for the lab of the currently selected course.
*
* @param index The currently selected course.
*/
protected void setLabCourseEndM(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labStartMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.labStartHrChooser.setValue (viewPanel.termsAndCoursesDialog.labEndHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.labStartMinChooser.setValue (viewPanel.termsAndCoursesDialog.labEndMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.labStartMChooser.setValue (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ());
String time = Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.labEndMChooser.getValue ());
course.setLabEndTime (2, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the start time of the specified course with the value found in the
* course start time spinner in the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseStartHr(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.startMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.endMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.endHrChooser.setValue (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.endMinChooser.setValue (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.endMChooser.setValue (viewPanel.termsAndCoursesDialog.startMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (index);
String time = Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ());
course.setStartTime (0, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the start time of the specified course with the value found in the
* course start time spinner in the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseStartMin(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.startMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.endMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.endHrChooser.setValue (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.endMinChooser.setValue (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.endMChooser.setValue (viewPanel.termsAndCoursesDialog.startMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (index);
String time = Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ());
course.setStartTime (1, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the start time of the specified course with the value found in the
* course start time spinner in the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseStartM(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.startMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.endMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.endHrChooser.setValue (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.endMinChooser.setValue (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.endMChooser.setValue (viewPanel.termsAndCoursesDialog.startMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (index);
String time = Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.startMChooser.getValue ());
course.setStartTime (2, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the end time of the specified course with the value found in the
* course end time spinner in the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseEndHr(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.startMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.endMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.startHrChooser.setValue (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.startMinChooser.setValue (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.startMChooser.setValue (viewPanel.termsAndCoursesDialog.endMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ());
String time = Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ());
course.setEndTime (0, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the end time of the specified course with the value found in the
* course end time spinner in the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseEndMin(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.startMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.endMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.startHrChooser.setValue (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.startMinChooser.setValue (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.startMChooser.setValue (viewPanel.termsAndCoursesDialog.endMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ());
String time = Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ());
course.setEndTime (1, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the end time of the specified course with the value found in the
* course end time spinner in the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseEndM(int index)
{
if (index != -1 && courseLoading.empty ())
{
try
{
Date startDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.startHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.startMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.startMChooser.getValue ()));
Date endDate = Domain.TIME_FORMAT.parse (Domain.HR_FORMAT.format (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ()) + ":" + Domain.MIN_FORMAT.format (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ()) + " " + Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.endMChooser.getValue ()));
if (startDate.after (endDate))
{
viewPanel.termsAndCoursesDialog.startHrChooser.setValue (viewPanel.termsAndCoursesDialog.endHrChooser.getValue ());
viewPanel.termsAndCoursesDialog.startMinChooser.setValue (viewPanel.termsAndCoursesDialog.endMinChooser.getValue ());
viewPanel.termsAndCoursesDialog.startMChooser.setValue (viewPanel.termsAndCoursesDialog.endMChooser.getValue ());
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
Course course = utility.courses.get (viewPanel.termsAndCoursesDialog.settingsCoursesTable.getSelectedRow ());
String time = Domain.M_FORMAT.format (viewPanel.termsAndCoursesDialog.endMChooser.getValue ());
course.setEndTime (2, time);
needsCoursesAndTermsSave = true;
}
}
/**
* Sets the comments of the specified assignment with the value found in the
* assignment comments text area of the details right-hand side panel.
*
* @param index The index of the assignment.
*/
protected void setAssignmentComments(int index)
{
try
{
if (index != -1
&& ((Assignment) utility.assignmentsAndEvents.get (index)).getCourse ().isChanged ()
&& assignmentOrEventLoading.empty ())
{
Assignment assignment = (Assignment) utility.assignmentsAndEvents.get (currentIndexFromVector);
assignment.setComments (viewPanel.commentsTextArea.getText ());
}
}
catch (ClassCastException ex)
{
Domain.LOGGER.add (ex);
}
}
/**
* Sets the description of the specified event with the value found in the
* event comments text area of the details right-hand side panel.
*
* @param index The index of the event.
*/
protected void setEventDescription(int index)
{
try
{
if (index != -1
&& ((Event) utility.assignmentsAndEvents.get (index)).getEventYear ().isChanged ()
&& assignmentOrEventLoading.empty ())
{
viewPanel.eventChanges.push (true);
Event event = (Event) utility.assignmentsAndEvents.get (currentIndexFromVector);
ViewPanel.OPTION_PANE.setValue (null);
event.setDescription (viewPanel.descriptionTextArea.getText ());
}
}
catch (ClassCastException ex)
{
Domain.LOGGER.add (ex);
}
}
/**
* Sets the name of the instructor for the specified course with the value
* found in the instructor name text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setInstructorName(int index)
{
if (index != -1 && needsCoursesAndTermsSave && instructorLoading.empty ())
{
Instructor instructor = utility.courses.get (currentCourseIndex).getInstructor (index);
String text = viewPanel.termsAndCoursesDialog.instructorNameTextField.getText ();
if (text.replaceAll (" ", "").equals (""))
{
instructorLoading.push (true);
viewPanel.termsAndCoursesDialog.instructorNameTextField.setText (instructor.getTypeName ());
ViewPanel.OPTION_PANE.setOptions (viewPanel.OK_CHOICE);
ViewPanel.OPTION_PANE.setMessage (language.getString ("instructorNameLeftEmpty"));
ViewPanel.OPTION_PANE.setMessageType (JOptionPane.WARNING_MESSAGE);
JDialog optionDialog = ViewPanel.OPTION_PANE.createDialog (viewPanel.termsAndCoursesDialog, language.getString ("invalidInstructorName"));
optionDialog.setVisible (true);
viewPanel.termsAndCoursesDialog.instructorNameTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.instructorNameTextField.selectAll ();
instructorLoading.pop ();
}
else
{
instructor.setTypeName (viewPanel.termsAndCoursesDialog.instructorNameTextField.getText ());
viewPanel.termsAndCoursesDialog.instructorTableModel.setValueAt (instructor.getTypeName (), index, 0);
viewPanel.termsAndCoursesDialog.settingsInstructorsTable.refreshTable ();
}
}
}
/**
* Sets the lab room location of the specified course with the value found
* in the lab room location text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setLabRoomLocation(int index)
{
if (index != -1 && needsCoursesAndTermsSave && courseLoading.empty ())
{
Course course = utility.courses.get (index);
course.setLabRoomLocation (viewPanel.termsAndCoursesDialog.labRoomTextField.getText ());
}
}
/**
* Sets the room location of the specified course with the value found in
* the room location text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setRoomLocation(int index)
{
if (index != -1 && needsCoursesAndTermsSave && courseLoading.empty ())
{
Course course = utility.courses.get (index);
course.setRoomLocation (viewPanel.termsAndCoursesDialog.roomTextField.getText ());
}
}
/**
* Sets the course number of the specified course with the value found in
* the course number text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseNumber(int index)
{
if (index != -1 && needsCoursesAndTermsSave && courseLoading.empty ())
{
Course course = utility.courses.get (index);
course.setCourseNumber (viewPanel.termsAndCoursesDialog.courseNumberTextField.getText ());
}
}
/**
* Sets the course website of the specified course with the value found in
* the course website text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setCourseWebsite(int index)
{
if (index != -1 && needsCoursesAndTermsSave && courseLoading.empty ())
{
Course course = utility.courses.get (index);
if (!viewPanel.termsAndCoursesDialog.courseWebsiteTextField.getText ().equals ("")
&& !viewPanel.termsAndCoursesDialog.courseWebsiteTextField.getText ().startsWith ("http://"))
{
viewPanel.termsAndCoursesDialog.courseWebsiteTextField.setText ("http://" + viewPanel.termsAndCoursesDialog.courseWebsiteTextField.getText ());
}
course.setCourseWebsite (viewPanel.termsAndCoursesDialog.courseWebsiteTextField.getText ());
}
}
/**
* Sets the lab website of the specified course with the value found in the
* lab website text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setLabWebsite(int index)
{
if (index != -1 && needsCoursesAndTermsSave && courseLoading.empty ())
{
Course course = utility.courses.get (index);
if (!viewPanel.termsAndCoursesDialog.labWebsiteTextField.getText ().equals ("")
&& !viewPanel.termsAndCoursesDialog.labWebsiteTextField.getText ().startsWith ("http://"))
{
viewPanel.termsAndCoursesDialog.labWebsiteTextField.setText ("http://" + viewPanel.termsAndCoursesDialog.labWebsiteTextField.getText ());
}
course.setLabWebsite (viewPanel.termsAndCoursesDialog.labWebsiteTextField.getText ());
}
}
/**
* Sets the room location of the specified course with the value found in
* the room location text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setLabNumber(int index)
{
if (index != -1 && needsCoursesAndTermsSave && courseLoading.empty ())
{
Course course = utility.courses.get (index);
course.setLabNumber (viewPanel.termsAndCoursesDialog.labNumberTextField.getText ());
}
}
/**
* Sets the email of the instructor for the specified course with the value
* found in the instructor email text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setInstructorEmail(int index)
{
if (index != -1 && needsCoursesAndTermsSave && instructorLoading.empty ())
{
Matcher matcher = Domain.EMAIL_PATTERN.matcher (viewPanel.termsAndCoursesDialog.instructorEmailTextField.getText ());
Instructor instructor = utility.courses.get (currentCourseIndex).getInstructor (index);
if (matcher.matches ())
{
instructor.setInstructorEmail (viewPanel.termsAndCoursesDialog.instructorEmailTextField.getText ());
viewPanel.checkInstructorButtonState ();
}
else
{
if (viewPanel.termsAndCoursesDialog.instructorEmailTextField.getText ().replaceAll (" ", "").equals (""))
{
instructor.setInstructorEmail (viewPanel.termsAndCoursesDialog.instructorEmailTextField.getText ());
viewPanel.checkInstructorButtonState ();
}
else
{
viewPanel.termsAndCoursesDialog.instructorEmailTextField.requestFocus ();
viewPanel.termsAndCoursesDialog.instructorEmailTextField.selectAll ();
}
}
}
}
/**
* Sets the office hours of the instructor for the specified course with the
* value found in the office hours text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setOfficeHours(int index)
{
if (index != -1 && needsCoursesAndTermsSave && instructorLoading.empty ())
{
Instructor instructor = utility.courses.get (currentCourseIndex).getInstructor (index);
instructor.setOfficeHours (viewPanel.termsAndCoursesDialog.officeHoursTextField.getText ());
}
}
/**
* Sets the phone of the instructor for the specified course with the value
* found in the phone text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setInstructorPhone(int index)
{
if (index != -1 && needsCoursesAndTermsSave && instructorLoading.empty ())
{
Instructor instructor = utility.courses.get (currentCourseIndex).getInstructor (index);
instructor.setInstructorPhone (viewPanel.termsAndCoursesDialog.phoneTextField.getText ());
viewPanel.checkInstructorButtonState ();
}
}
/**
* Sets the office location of the instructor for the specified course with
* the value found in the office location text field of the Settings dialog.
*
* @param index The index of the course.
*/
protected void setOfficeLocation(int index)
{
if (index != -1 && needsCoursesAndTermsSave && instructorLoading.empty ())
{
Instructor instructor = utility.courses.get (currentCourseIndex).getInstructor (index);
instructor.setOfficeLocation (viewPanel.termsAndCoursesDialog.officeLocationTextField.getText ());
}
}
/**
* This method sorts the assignmentsAndEvents list through bubbling every
* assignment up in the model, synchronizing the model with the
* assignmentsAndEvents vector, and saving the data. Since the models
* bubbling methods are called, the assignmentsAndEvents will sort by
* whatever column was last selected for sorting.
*/
protected void sortAssignmentsList()
{
assignmentOrEventLoading.push (true);
long selectedID = -1;
if (viewPanel.assignmentsTable.getSelectedRow () != -1)
{
try
{
selectedID = Long.parseLong (viewPanel.assignmentsTableModel.getValueAt (viewPanel.assignmentsTable.getSelectedRow (), 6).toString ());
}
catch (NullPointerException ex)
{
Domain.LOGGER.add (ex);
}
}
boolean sortAscending = viewPanel.assignmentsTableModel.isSortAscending ();
boolean swapped = true;
switch (viewPanel.assignmentsTableModel.getColumnSorting ())
{
// sort by "done" state
case 0:
{
while (swapped)
{
swapped = false;
for (int i = 0; i < utility.assignmentsAndEvents.size () - 1; ++i)
{
ListItem firstItem = utility.assignmentsAndEvents.get (i);
ListItem secondItem = utility.assignmentsAndEvents.get (i + 1);
int first = -1;
int second = -1;
if (firstItem.isAssignment ())
{
if (((Assignment) firstItem).isDone ())
{
first = 0;
}
else
{
first = 1;
}
}
else
{
first = 2;
}
if (secondItem.isAssignment ())
{
if (((Assignment) secondItem).isDone ())
{
second = 0;
}
else
{
second = 1;
}
}
else
{
second = 2;
}
if ((sortAscending && first < second)
|| (!sortAscending && first > second))
{
swap (i, i + 1);
viewPanel.assignmentsTableModel.swap (i, i + 1);
swapped = true;
}
}
}
break;
}
// sort by task name
case 1:
{
while (swapped)
{
swapped = false;
for (int i = 0; i < utility.assignmentsAndEvents.size () - 1; ++i)
{
String first = utility.assignmentsAndEvents.get (i).getItemName ();
if (first == null)
{
first = "";
}
String second = utility.assignmentsAndEvents.get (i + 1).getItemName ();
if (second == null)
{
second = "";
}
if ((sortAscending && second.toLowerCase ().compareTo (first.toLowerCase ()) < 0) || (!sortAscending && second.toLowerCase ().compareTo (first.toLowerCase ()) > 0))
{
swap (i, i + 1);
viewPanel.assignmentsTableModel.swap (i, i + 1);
swapped = true;
}
}
}
break;
}
// sort by type name
case 2:
{
while (swapped)
{
swapped = false;
for (int i = 0; i < utility.assignmentsAndEvents.size () - 1; ++i)
{
String first = "";
String second = "";
try
{
ListItem item = utility.assignmentsAndEvents.get (i);
if (item.isAssignment ())
{
if (((Assignment) item).getType () != null)
{
first = ((Assignment) item).getType ().getTypeName ();
}
}
else
{
first = ((Event) item).getRowObject ()[2].toString ();
}
}
catch (NullPointerException ex)
{
Domain.LOGGER.add (ex);
}
try
{
ListItem item = utility.assignmentsAndEvents.get (i + 1);
if (item.isAssignment ())
{
if (((Assignment) item).getType () != null)
{
second = ((Assignment) item).getType ().getTypeName ();
}
}
else
{
second = ((Event) item).getRowObject ()[2].toString ();
}
}
catch (NullPointerException ex)
{
Domain.LOGGER.add (ex);
}
if ((sortAscending && second.toLowerCase ().compareTo (first.toLowerCase ()) < 0) || (!sortAscending && second.toLowerCase ().compareTo (first.toLowerCase ()) > 0))
{
swap (i, i + 1);
viewPanel.assignmentsTableModel.swap (i, i + 1);
swapped = true;
}
}
}
break;
}
// sort by course name
case 3:
{
while (swapped)
{
swapped = false;
for (int i = 0; i < utility.assignmentsAndEvents.size () - 1; ++i)
{
String first = "";
String second = "";
try
{
ListItem item = utility.assignmentsAndEvents.get (i);
if (item.isAssignment ())
{
first = ((Assignment) item).getCourse ().getTypeName ();
}
}
catch (NullPointerException ex)
{
Domain.LOGGER.add (ex);
}
try
{
ListItem item = utility.assignmentsAndEvents.get (i + 1);
if (item.isAssignment ())
{
second = ((Assignment) item).getCourse ().getTypeName ();
}
}
catch (NullPointerException ex)
{
Domain.LOGGER.add (ex);
}
if ((sortAscending && second.toLowerCase ().compareTo (first.toLowerCase ()) < 0) || (!sortAscending && second.toLowerCase ().compareTo (first.toLowerCase ()) > 0))
{
swap (i, i + 1);
viewPanel.assignmentsTableModel.swap (i, i + 1);
swapped = true;
}
}
}
break;
}
// sort by due date
case 4:
{
while (swapped)
{
swapped = false;
for (int i = 0; i < utility.assignmentsAndEvents.size () - 1; ++i)
{
try
{
ListItem first = utility.assignmentsAndEvents.get (i);
ListItem second = utility.assignmentsAndEvents.get (i + 1);
Date firstDate = null;
Date secondDate = null;
if (first.isAssignment ())
{
firstDate = Domain.DATE_AND_TIME_FORMAT.parse (first.getDueDate () + " " + ((Assignment) first).getDueTime ());
}
else
{
String startTime = "12:00 AM";
if (!((Event) first).isAllDay ())
{
startTime = ((Event) first).getStartTime (0) + ":" + ((Event) first).getStartTime (1) + " " + ((Event) first).getStartTime (2);
}
firstDate = Domain.DATE_AND_TIME_FORMAT.parse (first.getDueDate () + " " + startTime);
}
if (second.isAssignment ())
{
secondDate = Domain.DATE_AND_TIME_FORMAT.parse (second.getDueDate () + " " + ((Assignment) second).getDueTime ());
}
else
{
String startTime = "12:00 AM";
if (!((Event) second).isAllDay ())
{
startTime = ((Event) second).getStartTime (0) + ":" + ((Event) second).getStartTime (1) + " " + ((Event) second).getStartTime (2);
}
secondDate = Domain.DATE_AND_TIME_FORMAT.parse (second.getDueDate () + " " + startTime);
}
if ((sortAscending && firstDate.after (secondDate)) || (!sortAscending && firstDate.before (secondDate))
|| (firstDate.compareTo (secondDate) == 0 && sortAscending && first.isAssignment () && !second.isAssignment ())
|| (firstDate.compareTo (secondDate) == 0 && !sortAscending && !first.isAssignment () && second.isAssignment ()))
{
swap (i, i + 1);
viewPanel.assignmentsTableModel.swap (i, i + 1);
swapped = true;
}
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
}
}
break;
}
// sort by grade
case 5:
{
while (swapped)
{
swapped = false;
for (int i = 0; i < utility.assignmentsAndEvents.size () - 1; ++i)
{
double first = -1;
double second = -1;
try
{
ListItem item = utility.assignmentsAndEvents.get (i);
if (item.isAssignment ())
{
if (!((Assignment) item).getGrade ().equals (""))
{
first = Double.parseDouble (((Assignment) item).getGrade ().replaceAll ("%", ""));
}
}
else
{
first = -2;
}
}
catch (NumberFormatException ex)
{
Domain.LOGGER.add (ex);
}
try
{
ListItem item = utility.assignmentsAndEvents.get (i + 1);
if (item.isAssignment ())
{
if (!((Assignment) item).getGrade ().equals (""))
{
second = Double.parseDouble (((Assignment) item).getGrade ().replaceAll ("%", ""));
}
}
else
{
second = -2;
}
}
catch (NumberFormatException ex)
{
Domain.LOGGER.add (ex);
}
if ((sortAscending && first > second) || (!sortAscending && first < second))
{
swap (i, i + 1);
viewPanel.assignmentsTableModel.swap (i, i + 1);
swapped = true;
}
}
}
break;
}
}
viewPanel.assignmentsTable.refreshTable ();
if (selectedID != -1)
{
viewPanel.ignoreTableSelection = true;
viewPanel.assignmentsTable.setSelectedRowFromVectorIndex (utility.getAssignmentOrEventIndexByID (selectedID));
viewPanel.ignoreTableSelection = false;
}
assignmentOrEventLoading.pop ();
}
/**
* Swaps to locations in the assignmentsAndEvents vector.
*
* @param first The first swap index.
* @param second The second swap index.
*/
private void swap(int first, int second)
{
ListItem temp = utility.assignmentsAndEvents.get (second);
utility.assignmentsAndEvents.set (second, utility.assignmentsAndEvents.get (first));
utility.assignmentsAndEvents.set (first, temp);
}
/**
* Refreshes all displayed information in the assignmentsAndEvents list.
*/
protected void refreshAssignmentsList()
{
for (int i = 0; i < viewPanel.assignmentsTableModel.getRowCount (); ++i)
{
for (int j = 0; j < viewPanel.assignmentsTableModel.getColumnCount (); ++j)
{
viewPanel.assignmentsTableModel.setRow (utility.assignmentsAndEvents.get (i).getRowObject (), i);
}
}
try
{
viewPanel.assignmentsTable.refreshTable ();
}
catch (NullPointerException ex)
{
Domain.LOGGER.add (ex);
}
}
/**
* Refreshes all shown assignmentsAndEvents and events in Calendar View.
*/
protected void refreshShownAssignmentsAndEvents()
{
for (int i = 0; i < viewPanel.shownAssignments.size (); ++i)
{
viewPanel.shownAssignments.get (i).refreshText ();
}
for (int i = 0; i < viewPanel.shownEvents.size (); ++i)
{
viewPanel.shownEvents.get (i).refreshText ();
}
}
/**
* Calculates the grade for the given term.
*
* @param term The term to calculate the grade for.
* @return The current grade for the given term.
*/
protected double calculateGradeForTerm(Term term)
{
try
{
double total = 0;
int courseCount = 0;
for (int i = 0; i < term.getCourseCount (); ++i)
{
double grade = calculateGradeForCourse (term.getCourse (i));
if (grade != -1)
{
total += grade;
++courseCount;
}
}
if (courseCount == 0)
{
return -1;
}
return total / courseCount;
}
catch (NumberFormatException ex)
{
return -1;
}
}
/**
* Calculates the grade for the given course.
*
* @param course The course to calculate the grade for.
* @return The current grade for the given course.
*/
protected double calculateGradeForCourse(Course course)
{
try
{
course.resetTypeGrades ();
course.resetGradesList ();
for (int i = 0; i < course.getAssignmentCount (); ++i)
{
Assignment assignment = course.getAssignment (i);
if (assignment.isDone () && !assignment.getGrade ().replaceAll (" ", "").equals (""))
{
if (assignment.getType () != null && !assignment.getType ().getWeight ().replaceAll (" ", "").equals (""))
{
assignment.getType ().addGrade (Double.parseDouble (assignment.getGrade ().replaceAll ("%", "")));
try
{
course.addGrade (Double.parseDouble (assignment.getGrade ().replaceAll ("%", "")), assignment.getType (), Domain.DATE_AND_TIME_FORMAT.parse (assignment.getDueDate () + " " + assignment.getDueTime (0) + ":" + assignment.getDueTime (1) + " " + assignment.getDueTime (2)).getTime ());
}
catch (ParseException ex)
{
Domain.LOGGER.add (ex);
}
}
}
}
course.sortGradesListByTime ();
double overallGrade = course.getTypeGrades () / course.getTypePercentComplete ();
if (overallGrade >= 0)
{
return overallGrade;
}
else
{
return -1;
}
}
catch (NumberFormatException ex)
{
return -1;
}
}
/**
* Enable or disable the indeterminate state of the progress bar. Must be
* set to false if you wish to set values manually.
*
* @param progressBar The progress bar to set the state/value for.
* @param indeterminate True if the progress bar should be set
* indeterminate, false otherwise.
* @param string The string to paint in the progress bar.
* @param stringPainted True if the string should be painted, false
* otherwise.
* @param value The value to set the progress bar to. -1 if no value should
* be set. This will only set it indeterminate is set to false.
*/
public void setProgressState(final JProgressBar progressBar, final boolean indeterminate, final String string, final boolean stringPainted, final int value)
{
SwingUtilities.invokeLater (new Runnable ()
{
@Override
public void run()
{
progressBar.setIndeterminate (indeterminate);
progressBar.setStringPainted (stringPainted);
progressBar.setString (string);
if (!indeterminate && value != -1)
{
progressBar.setValue (value);
}
}
});
}
/**
* The minimum value a progress can be. Minimum has been set to 0 by
* default, so only use this accessor if you want to change that value.
*
* @param progressBar The progress bar to set the state/value for.
* @param minValue The minimum value of the progress bar.
*/
public void setProgressMinValue(final JProgressBar progressBar, int minValue)
{
progressBar.setMinimum (minValue);
}
/**
* The maximum value a progress can be. Maximum has been set to 100 by
* default, so only use this accessor if you want to change that value.
*
* @param progressBar The progress bar to set the state/value for.
* @param maxValue The maximum value of the progress bar.
*/
public void setProgressMaxValue(JProgressBar progressBar, int maxValue)
{
progressBar.setMaximum (maxValue);
}
}