summaryrefslogtreecommitdiff
path: root/calendar/base/content/agenda-listbox.xml
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/base/content/agenda-listbox.xml')
-rw-r--r--calendar/base/content/agenda-listbox.xml289
1 files changed, 289 insertions, 0 deletions
diff --git a/calendar/base/content/agenda-listbox.xml b/calendar/base/content/agenda-listbox.xml
new file mode 100644
index 000000000..bc205b7a0
--- /dev/null
+++ b/calendar/base/content/agenda-listbox.xml
@@ -0,0 +1,289 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<bindings id="agenda-list-bindings"
+ xmlns="http://www.mozilla.org/xbl"
+ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:xbl="http://www.mozilla.org/xbl">
+
+ <binding id="agenda-base-richlist-item"
+ extends="chrome://global/content/bindings/richlistbox.xml#richlistitem">
+ <implementation>
+ <field name="mOccurrence">null</field>;
+ <property name="occurrence" readonly="true">
+ <getter><![CDATA[
+ return this.mOccurrence;
+ ]]></getter>
+ </property>
+ </implementation>
+
+ <handlers>
+ <handler event="click" phase="capturing"><![CDATA[
+ if (event.detail == 1) {
+ agendaListbox.onSelect(this);
+ } else if (event.button == 0) {
+ // We only care about button 0 doubleclick events
+ document.getElementById("agenda_edit_event_command").doCommand();
+ event.stopPropagation();
+ event.preventDefault();
+ }
+ ]]></handler>
+ <handler event="mouseover"><![CDATA[
+ event.stopPropagation();
+ onMouseOverItem(event);
+ ]]></handler>
+ </handlers>
+ </binding>
+
+ <binding id="agenda-checkbox-richlist-item"
+ extends="chrome://global/content/bindings/richlistbox.xml#richlistitem">
+ <content>
+ <xul:treenode-checkbox class="agenda-checkbox" anonid="agenda-checkbox-widget"
+ flex="1"
+ xbl:inherits="selected,label,hidden,disabled"/>
+ </content>
+ <implementation>
+ <field name="kCheckbox">null</field>;
+ <constructor><![CDATA[
+ this.kCheckbox = document.getAnonymousElementByAttribute(this, "anonid", "agenda-checkbox-widget");
+ ]]></constructor>
+
+ <method name="getItem">
+ <body><![CDATA[
+ return this.mItem;
+ ]]></body>
+ </method>
+
+ <method name="setItem">
+ <parameter name="synthetic"/>
+ <parameter name="showsToday"/>
+ <body><![CDATA[
+ this.mItem = synthetic;
+ let duration = synthetic.duration;
+ if (showsToday) {
+ this.kCheckbox.label = this.getAttribute("title");
+ if (this.id == "nextweek-header") {
+ if (duration > 7) {
+ this.kCheckbox.label += " (" + unitPluralForm(duration / 7, "weeks") + ")";
+ } else {
+ this.kCheckbox.label += " (" + unitPluralForm(duration, "days") + ")";
+ }
+ }
+ } else if (synthetic.duration == 1) {
+ this.kCheckbox.label = getDateFormatter().formatDate(synthetic.start);
+ } else {
+ this.kCheckbox.label = getDateFormatter().formatInterval(synthetic.start, synthetic.end);
+ }
+ ]]></body>
+ </method>
+
+ <method name="getCheckbox">
+ <body><![CDATA[
+ return this.kCheckbox;
+ ]]></body>
+ </method>
+ </implementation>
+ </binding>
+
+ <binding id="agenda-allday-richlist-item"
+ extends="chrome://calendar/content/agenda-listbox.xml#agenda-base-richlist-item">
+ <content tooltip="itemTooltip">
+ <xul:hbox anonid="agenda-container-box"
+ class="agenda-allday-container-box"
+ xbl:inherits="selected,disabled"
+ flex="1">
+ <xul:vbox pack="center" flex="1">
+ <xul:label anonid="agenda-allDayEvent-date" class="agenda-event-start"
+ crop="end" xbl:inherits="selected" hidden="true"/>
+ <xul:hbox flex="1" align="start">
+ <xul:image anonid="agenda-multiDayEvent-image" class="agenda-multiDayEvent-image"/>
+ <xul:calendar-month-day-box-item anonid="allday-item"
+ flex="1"
+ flat="true"/>
+ </xul:hbox>
+ </xul:vbox>
+ </xul:hbox>
+ </content>
+ <implementation>
+ <field name="mAllDayItem">null</field>;
+
+ <constructor><![CDATA[
+ this.mAllDayItem = document.getAnonymousElementByAttribute(this, "anonid", "allday-item");
+ ]]></constructor>
+
+ <method name="setOccurrence">
+ <parameter name="aOccurrence"/>
+ <parameter name="aPeriod"/>
+ <body><![CDATA[
+ this.mOccurrence = aOccurrence;
+ this.mAllDayItem.occurrence = aOccurrence;
+ let dateFormatter = cal.getDateFormatter();
+ let periodStartDate = aPeriod.start.clone();
+ periodStartDate.isDate = true;
+ let periodEndDate = aPeriod.end;
+ let startDate = this.mOccurrence[calGetStartDateProp(this.mOccurrence)]
+ .getInTimezone(calendarDefaultTimezone());
+ let endDate = this.mOccurrence[calGetEndDateProp(this.mOccurrence)]
+ .getInTimezone(calendarDefaultTimezone());
+ let endPreviousDay = endDate.clone();
+ endPreviousDay.day--;
+ // Show items's date for long periods but also for "Upcoming"
+ // period with one day duration.
+ let showDate = aPeriod.multiday || aPeriod.duration > 1;
+
+ let date = "";
+ let iconType = "";
+ let allDayDateLabel = document.getAnonymousElementByAttribute(this, "anonid", "agenda-allDayEvent-date");
+ setBooleanAttribute(allDayDateLabel, "hidden", !showDate);
+ if (startDate.compare(endPreviousDay) == 0) {
+ // All day event one day duration.
+ date = dateFormatter.formatDate(startDate);
+ } else if (startDate.compare(periodStartDate) >= 0 &&
+ startDate.compare(periodEndDate) <= 0) {
+ // All day event spanning multiple days.
+ iconType = "start";
+ date = dateFormatter.formatDate(startDate);
+ } else if (endDate.compare(periodStartDate) >= 0 &&
+ endDate.compare(periodEndDate) <= 0) {
+ iconType = "end";
+ date = dateFormatter.formatDate(endPreviousDay);
+ } else {
+ iconType = "continue";
+ hideElement(allDayDateLabel);
+ }
+
+ let multiDayImage = document.getAnonymousElementByAttribute(this, "anonid", "agenda-multiDayEvent-image");
+ multiDayImage.setAttribute("type", iconType);
+ // class wrap causes allday items to wrap its text in today-pane
+ let addWrap = document.getAnonymousElementByAttribute(this.mAllDayItem, "anonid", "eventbox");
+ addWrap.classList.add("wrap");
+ addWrap = document.getAnonymousElementByAttribute(this.mAllDayItem, "anonid", "event-detail-box");
+ addWrap.classList.add("wrap");
+ allDayDateLabel.value = date;
+ ]]></body>
+ </method>
+ </implementation>
+
+ <handlers>
+ <handler event="dragstart" phase="capturing"><![CDATA[
+ invokeEventDragSession(this.mAllDayItem.occurrence.clone(), this);
+ event.stopPropagation();
+ event.preventDefault();
+ ]]></handler>
+ </handlers>
+ </binding>
+
+ <binding id="agenda-richlist-item"
+ extends="chrome://calendar/content/agenda-listbox.xml#agenda-base-richlist-item">
+ <content tooltip="itemTooltip">
+ <xul:hbox anonid="agenda-container-box" class="agenda-container-box" xbl:inherits="selected,disabled,current" flex="1">
+ <xul:hbox>
+ <xul:vbox>
+ <xul:image anonid="agenda-calendar-image" class="agenda-calendar-image"/>
+ <xul:spacer flex="1"/>
+ </xul:vbox>
+ </xul:hbox>
+ <xul:vbox anonid="agenda-description" flex="1">
+ <xul:hbox align="start">
+ <xul:image anonid="agenda-multiDayEvent-image" class="agenda-multiDayEvent-image"/>
+ <xul:label anonid="agenda-event-start" class="agenda-event-start" crop="end" flex="1" xbl:inherits="selected"/>
+ </xul:hbox>
+ <xul:label anonid="agenda-event-title" class="agenda-event-title" crop="end" xbl:inherits="selected"/>
+ </xul:vbox>
+ </xul:hbox>
+ </content>
+
+ <implementation>
+ <method name="setOccurrence">
+ <parameter name="aItem"/>
+ <parameter name="aPeriod"/>
+ <body><![CDATA[
+ this.mOccurrence = aItem;
+ this.setAttribute("status", aItem.status);
+ let dateFormatter = Components.classes["@mozilla.org/calendar/datetime-formatter;1"]
+ .getService(Components.interfaces.calIDateTimeFormatter);
+
+ let periodStartDate = aPeriod.start.clone();
+ periodStartDate.isDate = true;
+ let periodEndDate = aPeriod.end.clone();
+ periodEndDate.day--;
+ let start = this.mOccurrence[calGetStartDateProp(this.mOccurrence)]
+ .getInTimezone(calendarDefaultTimezone());
+ let end = this.mOccurrence[calGetEndDateProp(this.mOccurrence)]
+ .getInTimezone(calendarDefaultTimezone());
+ let startDate = start.clone();
+ startDate.isDate = true;
+ let endDate = end.clone();
+ endDate.isDate = true;
+ let endAtMidnight = (end.hour == 0 && end.minute == 0);
+ if (endAtMidnight) {
+ endDate.day--;
+ }
+ // Show items's date for long periods but also for "Upcoming"
+ // period with one day duration.
+ let longFormat = aPeriod.multiday || aPeriod.duration > 1;
+
+ let duration = "";
+ let iconType = "";
+ if (startDate.compare(endDate) == 0) {
+ // event that starts and ends in the same day, midnight included
+ duration = longFormat ? dateFormatter.formatDateTime(start)
+ : dateFormatter.formatTime(start);
+ } else if (startDate.compare(periodStartDate) >= 0 &&
+ startDate.compare(periodEndDate) <= 0) {
+ // event spanning multiple days, start date within period
+ iconType = "start";
+ duration = longFormat ? dateFormatter.formatDateTime(start)
+ : dateFormatter.formatTime(start);
+ } else if (endDate.compare(periodStartDate) >= 0 &&
+ endDate.compare(periodEndDate) <= 0) {
+ // event spanning multiple days, end date within period
+ iconType = "end";
+ if (endAtMidnight) {
+ duration = dateFormatter.formatDate(endDate) + " ";
+ duration = longFormat ? duration + calGetString("dateFormat", "midnight")
+ : calGetString("dateFormat", "midnight");
+ } else {
+ duration = longFormat ? dateFormatter.formatDateTime(end)
+ : dateFormatter.formatTime(end);
+ }
+ } else {
+ iconType = "continue";
+ }
+ let multiDayImage = document.getAnonymousElementByAttribute(this, "anonid", "agenda-multiDayEvent-image");
+ multiDayImage.setAttribute("type", iconType);
+ let durationbox = document.getAnonymousElementByAttribute(this, "anonid", "agenda-event-start");
+ durationbox.textContent = duration;
+
+ // show items with time only (today & tomorrow) as one line.
+ if (longFormat) {
+ let titlebox = document.getAnonymousElementByAttribute(this, "anonid", "agenda-event-title");
+ titlebox.textContent = aItem.title;
+ } else {
+ durationbox.textContent += " " + aItem.title;
+ }
+ this.refreshColor();
+ ]]></body>
+ </method>
+
+ <method name="refreshColor">
+ <body><![CDATA[
+ let calcolor = (this.mOccurrence &&
+ this.mOccurrence.calendar.getProperty("color")) ||
+ "#a8c2e1";
+
+ let imagebox = document.getAnonymousElementByAttribute(this, "anonid", "agenda-calendar-image");
+ imagebox.setAttribute("style", "background-color: " + calcolor + ";");
+ ]]></body>
+ </method>
+ </implementation>
+
+ <handlers>
+ <handler event="dragstart"><![CDATA[
+ invokeEventDragSession(this.mOccurrence.clone(), this);
+ ]]></handler>
+ </handlers>
+ </binding>
+</bindings>