package calendar; import java.awt.Color; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Calendar; import java.util.Locale; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; /** * This class will format the view on the main calendar panel * to show any events for a single day on a particular month. This will * be partnered with the month view. * * @author James Alfei (631989) * @date 22/02/2012 * @brief This class will display the day events on the main calendar * interface */ @SuppressWarnings({ "serial", "unused" }) public class DayPanel extends JPanel{ /** * An array list of events to be displayed on the day panel */ ArrayList<Event> m_events; /** * Main Constructor * * @param date The date of the day to show events for * @param showing_month The month of the date * @param showing_year The year of the date */ public DayPanel(final Calendar date, final int showing_month, final int showing_year, ActionListener CalListener) { super(); final int day = date.get(Calendar.DAY_OF_MONTH); final int month = date.get(Calendar.MONTH); final int year = date.get(Calendar.YEAR); String print_day = new Integer(day).toString(); //if day is 1, print month as well if(day == 1) print_day += " "+date.getDisplayName(Calendar.MONTH,Calendar.SHORT, new Locale(Data.GetSettings().Get("locale"))); print_day = " "+print_day+" "; //getting the events m_events = Data.GetEvents().GetEventsByDay(date); EtchedBorder temp_border; //highlight todays date if(Data.GetCurrentDay() == date.get(Calendar.DAY_OF_MONTH) && Data.GetCurrentMonth() == date.get(Calendar.MONTH) && Data.GetCurrentYear() == date.get(Calendar.YEAR)){ temp_border = new EtchedBorder(EtchedBorder.LOWERED, Color.black, Color.black); } else { temp_border = new EtchedBorder(EtchedBorder.LOWERED); } //set layout for each day final TitledBorder border = new TitledBorder(temp_border, print_day); if(month == showing_month && year == showing_year) border.setTitleColor(Color.black); else border.setTitleColor(Color.GRAY); setBackground(Color.WHITE); setBorder(border); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); //sort the events by hour sortEvents(); for(int i = 0; i < m_events.size(); i++) { add(new EventPanel(m_events.get(i),CalListener)); } } /** * This method will sort the events which are displayed on the day panel * by hour */ private boolean sortEvents() { // (overall complexity is O(m*n*n), where m = the number of days in // the view and n is the maximum number of events in a day) boolean found; do { found = false; for(int i = 0; i < m_events.size() - 1; i++) { if(m_events.get(i).GetStart_date() .compareTo(m_events.get(i+1).GetStart_date()) > 0) { final Event temp = m_events.get(i); m_events.set(i, m_events.get(i+1)); m_events.set(i+1, temp); found = true; } } }while(found); return true; } /* * This class will be mainly used for testing and will be commented * out in the final submission * @param args command line arguments * @throws Exception Any exceptions thrown with making events */ /* public static void main (String[] args) throws Exception{ Data.Init(); //make new frame JFrame test = new JFrame(); Calendar cal = Calendar.getInstance(); cal.add(cal.HOUR, 2); // add a SECOND event (time) Data.AddEvent("This should come after", Calendar.getInstance(), cal, "Test", 0); Calendar cal2 = Calendar.getInstance(); cal2.add(cal.HOUR, -1); //Add a FIRST event (time wise) Data.AddEvent("First", cal2, cal, "Test", 1); //Make a new frame with panel for events //This will also test the sort method to ensure the events // are displayed in order DayPanel testPan = new DayPanel(cal, 2, 2012); test.getContentPane().add(testPan); test.pack(); test.setVisible(true); } */ }