/* * Copyright 2008 University of Prince Edward Island * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ca.upei.ic.timetable.client; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; import com.google.gwt.core.client.GWT; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; /** * The controller of a View * * @author felix * */ public class CourseCalendarViewController implements ViewController { private CalendarView view_; private Calendar calendar_; private ApplicationController app_; private Map<Integer, CalendarItem> items_; public CourseCalendarViewController(ApplicationController controller) { app_ = controller; calendar_ = GWT.create(Calendar.class); calendar_.setType(Calendar.FIVE); view_ = new CalendarView(this, calendar_); items_ = new HashMap<Integer, CalendarItem>(); } public View getView() { return view_; } /** * Add a course to the Calendar * * @param id * @param course */ public void addCourse(int id, JSONObject course) { // clear the message first String name = ((JSONString) course.get("name")).stringValue(); String location = ((JSONString) course.get("location")).stringValue(); String date = ((JSONString) course.get("time")).stringValue(); CalendarItem item = new CalendarItem(name); item.setContent(location); // analyze the date and add the item. // filtered out all invalid characters String filteredDate = date.replaceAll("[^MTWHF0-9:-]", ""); Queue<Integer> day = new LinkedList<Integer>(); // begin analysis for (int i=0; i<filteredDate.length(); i++) { switch (filteredDate.charAt(i)) { // weekday case 'M': day.offer(Calendar.MONDAY); break; case 'W': day.offer(Calendar.WEDNESDAY); break; case 'F': day.offer(Calendar.FRIDAY); break; case 'T': if (i+1 < filteredDate.length() && filteredDate.charAt(i+1) == 'H') { day.offer(Calendar.THURSDAY); i++; } else { day.offer(Calendar.TUESDAY); } break; // time case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case '-': // work until the end of time int j = i+1; while (j < filteredDate.length() && (Character.isDigit(filteredDate.charAt(j)) || filteredDate.charAt(j) == ':' || filteredDate.charAt(j) == '-')) { j++; } // grab the time String time = filteredDate.substring(i, j); // check the time format if (!time.matches("^\\d{1,2}:\\d{2,2}-\\d{1,2}:\\d{2,2}")) { i = j; break; } // get the time String[] two = time.split("-"); // get the begin and end int begin = Integer.parseInt(two[0].replaceAll(":", "")); int end = Integer.parseInt(two[1].replaceAll(":", "")); // offer the calendar try { while (day.peek() != null) { int weekday = day.poll(); item.addTimeInterval(weekday, begin, end); } } catch (TimetableException e) { app_.error(ApplicationController.OOPS, e); } // done i = j; break; } } // add the item items_.put(id, item); // add to calendar calendar_.addItem(item); } public void setCellClickListener(CellClickListener listener) { view_.setCellClickListener(listener); } /** * Remove a course from the Calendar * * @param id * @return */ public synchronized boolean removeCourse(int id) { if (items_.containsKey(id)) { calendar_.removeItem(items_.get(id)); items_.remove(id); return true; } else { return false; } } }