From 3238a7f33ecb564d0c962fe61b46872dbd5c5a51 Mon Sep 17 00:00:00 2001 From: "mvl%exedo.nl" Date: Mon, 21 Mar 2005 17:55:24 +0000 Subject: [PATCH] use composite calendar for view. Allows to use multiple calendars. bug 286455, r=stuart,vlad --- .../composite/calCompositeCalendar.js | 28 ++++++---------- calendar/providers/ics/calICSCalendar.js | 14 ++++++++ calendar/resources/content/calendar.js | 16 +++++++++ calendar/resources/content/calendarWindow.js | 33 +++++++++++++++---- calendar/resources/content/dayView.js | 2 +- calendar/resources/content/monthView.js | 9 +++-- calendar/resources/content/multiweekView.js | 2 +- calendar/resources/content/unifinder.js | 8 ++--- calendar/resources/content/weekView.js | 2 +- 9 files changed, 77 insertions(+), 37 deletions(-) diff --git a/calendar/providers/composite/calCompositeCalendar.js b/calendar/providers/composite/calCompositeCalendar.js index 76a06854e770..51fad0423478 100644 --- a/calendar/providers/composite/calCompositeCalendar.js +++ b/calendar/providers/composite/calCompositeCalendar.js @@ -74,32 +74,24 @@ calCompositeCalendar.prototype = { mCalendars: Array(), mDefaultCalendar: null, - addCalendar: function (aServer, aType) { + addCalendar: function (aCalendar) { // check if the calendar already exists for (cal in this.mCalendars) { - if (cal.uri == aServer) { + if (cal.uri == aCalendar.uri) { // throw exception if calendar already exists? return; } } - // construct a new calendar - var cid = "@mozilla.org/calendar/calendar;1?type=" + aType; - var cal = Components.classes[cid].createInstance(Components.interfaces.calICalendar); + this.mCalendars.push(aCalendar); - cal.uri = aServer; - - this.mCalendars.push(cal); - - this.observeCalendarAdded(cal); + this.observeCalendarAdded(aCalendar); // if we have no default calendar, we need one here if (this.mDefaultCalendar == null) { - this.mDefaultCalendar = cal; - this.observeDefaultCalendarChanged(cal); + this.mDefaultCalendar = aCalendar; + this.observeDefaultCalendarChanged(aCalendar); } - - return cal; }, removeCalendar: function (aServer) { @@ -234,7 +226,7 @@ calCompositeCalendar.prototype = { getItems: function (aItemFilter, aCount, aRangeStart, aRangeEnd, aListener) { var cmpListener = new calCompositeGetListenerHelper(this.mCalendars.length, aListener, aCount); for (cal in this.mCalendars) { - cal.getItems (aItemFilter, aCount, aRangeEnd, aRangeEnd, aListener); + this.mCalendars[cal].getItems (aItemFilter, aCount, aRangeStart, aRangeEnd, cmpListener); } }, @@ -254,7 +246,7 @@ calCompositeCalendar.prototype = { observeDefaultCalendarChanged: function (aCalendar) { for (obs in this.mCompositeObservers) obs.onDefaultCalendarChanged (aCalendar); - }, + } }; // composite listener helper @@ -328,9 +320,9 @@ calCompositeGetListenerHelper.prototype = { } // send GetResults to the real listener - this.mRealListener (aCalendar, aStatus, aItemType, aDetail, aCount, aItems); + this.mRealListener.onGetResult (aCalendar, aStatus, aItemType, aDetail, aCount, aItems); this.mItemsReceived += aCount; - }, + } }; diff --git a/calendar/providers/ics/calICSCalendar.js b/calendar/providers/ics/calICSCalendar.js index 07a745d41fb5..a878859e6a04 100644 --- a/calendar/providers/ics/calICSCalendar.js +++ b/calendar/providers/ics/calICSCalendar.js @@ -125,6 +125,7 @@ calICSCalendar.prototype = { { // XXX ?? Is this ok? this.mItems = new Array(); + this.observeOnStartBatch(); var unicodeConverter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"] .createInstance(Components.interfaces.nsIScriptableUnicodeConverter); @@ -176,6 +177,9 @@ calICSCalendar.prototype = { } //} catch(e) { dump(e+"\n");} + + this.observeOnEndBatch(); + this.addObserver(this.mObserver, calICalendar.ITEM_FILTER_TYPE_ALL); this.observeOnLoad(); }, @@ -269,6 +273,16 @@ calICSCalendar.prototype = { this.mObservers[i].observer.onError (aErrNo, aMessage); }, + observeOnStartBatch: function () { + for (var i = 0; i < this.mObservers.length; i++) + this.mObservers[i].observer.onStartBatch (); + }, + + observeOnEndBatch: function () { + for (var i = 0; i < this.mObservers.length; i++) + this.mObservers[i].observer.onEndBatch (); + }, + // nsIInterfaceRequestor impl getInterface: function(iid, instance) { if (iid.equals(Components.interfaces.nsIAuthPrompt)) { diff --git a/calendar/resources/content/calendar.js b/calendar/resources/content/calendar.js index 393e9e9192bf..787d80fbfcf2 100644 --- a/calendar/resources/content/calendar.js +++ b/calendar/resources/content/calendar.js @@ -727,6 +727,22 @@ function getCalendar() } } +var gDisplayComposite; + +function getDisplayComposite() +{ + if (!gDisplayComposite) { + gDisplayComposite = Components.classes["@mozilla.org/calendar/calendar;1?type=composite"] + .createInstance(Components.interfaces.calICompositeCalendar); + var calMgr = getCalendarManager(); + var calList = calMgr.getCalendars({}); + for (i in calList) { + gDisplayComposite.addCalendar(calList[i]); + } + } + return gDisplayComposite; +} + function isEvent(aObject) { return aObject instanceof Components.interfaces.calIEvent; diff --git a/calendar/resources/content/calendarWindow.js b/calendar/resources/content/calendarWindow.js index 3f4deb861027..63f5e3772314 100644 --- a/calendar/resources/content/calendarWindow.js +++ b/calendar/resources/content/calendarWindow.js @@ -148,14 +148,33 @@ function CalendarWindow( ) var savedThis = this; var calendarObserver = { - onStartBatch: function() { }, - onEndBatch: function() { }, - onLoad: function() { }, - onAddItem: function(aItem) { calendarWindow.currentView.refreshEvents(); }, - onModifyItem: function(aNewItem, aOldItem) { calendarWindow.currentView.refreshEvents(); }, - onDeleteItem: function(aDeletedItem) { calendarWindow.currentView.refreshEvents(); }, + mInBatch: false, + + onStartBatch: function() { + this.mInBatch = true; + }, + onEndBatch: function() { + this.mInBatch = false; + calendarWindow.currentView.refreshEvents(); + }, + onLoad: function() { + if (!this.mInBatch) + refreshEventTree(); + }, + onAddItem: function(aItem) { + if (!this.mInBatch) + calendarWindow.currentView.refreshEvents(); + }, + onModifyItem: function(aNewItem, aOldItem) { + if (!this.mInBatch) + calendarWindow.currentView.refreshEvents(); + }, + onDeleteItem: function(aDeletedItem) { + if (!this.mInBatch) + calendarWindow.currentView.refreshEvents(); + }, onAlarm: function(aAlarmItem) {}, - onError: function(aErrNo, aMessage) { } + onError: function(aMessage) {} } var calendar = getCalendar(); calendar.addObserver(calendarObserver, calendar.ITEM_FILTER_TYPE_ALL); diff --git a/calendar/resources/content/dayView.js b/calendar/resources/content/dayView.js index 03f7f3749629..59ad953f33ec 100644 --- a/calendar/resources/content/dayView.js +++ b/calendar/resources/content/dayView.js @@ -131,7 +131,7 @@ DayView.prototype.refreshEvents = function() } }; - var ccalendar = getCalendar(); // XXX Should get the composite calendar here + var ccalendar = getDisplayComposite(); dump("Fetching events from " + this.displayStartDate.toString() + " to " + this.displayEndDate.toString() + "\n"); diff --git a/calendar/resources/content/monthView.js b/calendar/resources/content/monthView.js index 4cfddde69c1d..e7453f2caac7 100644 --- a/calendar/resources/content/monthView.js +++ b/calendar/resources/content/monthView.js @@ -241,7 +241,7 @@ MonthView.prototype.refreshEvents = function() } }; - var ccalendar = getCalendar(); // XXX Should get the composite calendar here + var ccalendar = getDisplayComposite(); dump("Fetching events from " + startDate.toString() + " to " + endDate.toString() + "\n"); @@ -251,6 +251,10 @@ MonthView.prototype.refreshEvents = function() MonthView.prototype.createEventBoxInternal = function(itemOccurrence, startDate, endDate) { + dayBoxItem = this.dayBoxItemArray[this.indexOfDate(startDate.jsDate)]; + if (!dayBoxItem) + return; + var calEvent = itemOccurrence.item.QueryInterface(Components.interfaces.calIEvent); // Make a box item to hold the event @@ -301,7 +305,6 @@ MonthView.prototype.createEventBoxInternal = function(itemOccurrence, startDate, eventBox.appendChild(eventBoxText); // XXX need to look at the number of children here and determine what we're supposed to do - dayBoxItem = this.dayBoxItemArray[this.indexOfDate(startDate.jsDate)]; dayBoxItem.appendChild(eventBox); /* @@ -572,7 +575,7 @@ MonthView.prototype.refreshDisplay = function() var lastDateCol = (firstDateCol + lastDayOfMonth - 1) % 7; this.firstDateOfView = new Date( newYear, newMonth, 1 - firstDateCol, 0, 0, 0 ); - this.lastDateOfView = new Date( newYear, newMonth, 42 - firstDateCol, 23, 59, 59 ); + this.lastDateOfView = new Date( newYear, newMonth, 42 - firstDateCol, 0, 0, 0 ); // hide or unhide columns for days off for(var day = 0; day < 7; day++) { diff --git a/calendar/resources/content/multiweekView.js b/calendar/resources/content/multiweekView.js index cb9b42e935e6..a4796b4b2644 100644 --- a/calendar/resources/content/multiweekView.js +++ b/calendar/resources/content/multiweekView.js @@ -256,7 +256,7 @@ MultiweekView.prototype.refreshEvents = function multiweekView_refreshEvents( ) } }; - var ccalendar = getCalendar(); + var ccalendar = getDisplayComposite(); ccalendar.getItems(ccalendar.ITEM_FILTER_TYPE_EVENT | ccalendar.ITEM_FILTER_CLASS_OCCURRENCES, 0, jsDateToDateTime(startDate), jsDateToDateTime(endDate), diff --git a/calendar/resources/content/unifinder.js b/calendar/resources/content/unifinder.js index 0e2e92328684..39755e84b8c9 100644 --- a/calendar/resources/content/unifinder.js +++ b/calendar/resources/content/unifinder.js @@ -133,10 +133,6 @@ function selectSelectedEventsInTree( EventsToSelect ) * display up to date when the calendar event data is changed */ -/*function unifinderObserver() { -}*/ - - var unifinderObserver = { mInBatch: false, @@ -187,8 +183,8 @@ function prepareCalendarUnifinder( ) // set up our calendar event observer - var ccalendar=getCalendar(); - ccalendar.addObserver(unifinderObserver,ccalendar.ITEM_FILTER_TYPE_EVENT); + var ccalendar = getDisplayComposite(); + ccalendar.addObserver(unifinderObserver, ccalendar.ITEM_FILTER_TYPE_EVENT); refreshEventTree(); //Display something upon first load. onLoad doesn't work properly for observers } diff --git a/calendar/resources/content/weekView.js b/calendar/resources/content/weekView.js index 508bdbb5db09..9310ea26e327 100644 --- a/calendar/resources/content/weekView.js +++ b/calendar/resources/content/weekView.js @@ -154,7 +154,7 @@ WeekView.prototype.refreshEvents = function() } }; - var ccalendar = getCalendar(); // XXX Should get the composite calendar here + var ccalendar = getDisplayComposite(); debug("Fetching events from " + this.displayStartDate.toString() + " to " + this.displayEndDate.toString() + "\n");