2010-09-19 07:54:35 +02:00
|
|
|
|
|
|
|
//BUG: unselect needs to be triggered when events are dragged+dropped
|
|
|
|
|
|
|
|
function SelectionManager() {
|
|
|
|
var t = this;
|
|
|
|
|
|
|
|
|
|
|
|
// exports
|
|
|
|
t.select = select;
|
|
|
|
t.unselect = unselect;
|
|
|
|
t.reportSelection = reportSelection;
|
|
|
|
t.daySelectionMousedown = daySelectionMousedown;
|
|
|
|
|
|
|
|
|
|
|
|
// imports
|
|
|
|
var opt = t.opt;
|
|
|
|
var trigger = t.trigger;
|
|
|
|
var defaultSelectionEnd = t.defaultSelectionEnd;
|
|
|
|
var renderSelection = t.renderSelection;
|
|
|
|
var clearSelection = t.clearSelection;
|
|
|
|
|
|
|
|
|
|
|
|
// locals
|
|
|
|
var selected = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// unselectAuto
|
|
|
|
if (opt('selectable') && opt('unselectAuto')) {
|
|
|
|
$(document).mousedown(function(ev) {
|
|
|
|
var ignore = opt('unselectCancel');
|
|
|
|
if (ignore) {
|
|
|
|
if ($(ev.target).parents(ignore).length) { // could be optimized to stop after first match
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
unselect(ev);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function select(startDate, endDate, allDay) {
|
|
|
|
unselect();
|
|
|
|
if (!endDate) {
|
|
|
|
endDate = defaultSelectionEnd(startDate, allDay);
|
|
|
|
}
|
|
|
|
renderSelection(startDate, endDate, allDay);
|
|
|
|
reportSelection(startDate, endDate, allDay);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function unselect(ev) {
|
|
|
|
if (selected) {
|
|
|
|
selected = false;
|
|
|
|
clearSelection();
|
|
|
|
trigger('unselect', null, ev);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function reportSelection(startDate, endDate, allDay, ev) {
|
|
|
|
selected = true;
|
|
|
|
trigger('select', null, startDate, endDate, allDay, ev);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function daySelectionMousedown(ev) { // not really a generic manager method, oh well
|
|
|
|
var cellDate = t.cellDate;
|
|
|
|
var cellIsAllDay = t.cellIsAllDay;
|
|
|
|
var hoverListener = t.getHoverListener();
|
2011-01-24 08:10:25 +01:00
|
|
|
var reportDayClick = t.reportDayClick; // this is hacky and sort of weird
|
2010-10-13 06:13:21 +02:00
|
|
|
if (ev.which == 1 && opt('selectable')) { // which==1 means left mouse button
|
2010-09-19 07:54:35 +02:00
|
|
|
unselect(ev);
|
|
|
|
var _mousedownElement = this;
|
|
|
|
var dates;
|
|
|
|
hoverListener.start(function(cell, origCell) { // TODO: maybe put cellDate/cellIsAllDay info in cell
|
|
|
|
clearSelection();
|
|
|
|
if (cell && cellIsAllDay(cell)) {
|
|
|
|
dates = [ cellDate(origCell), cellDate(cell) ].sort(cmp);
|
|
|
|
renderSelection(dates[0], dates[1], true);
|
|
|
|
}else{
|
|
|
|
dates = null;
|
|
|
|
}
|
|
|
|
}, ev);
|
|
|
|
$(document).one('mouseup', function(ev) {
|
|
|
|
hoverListener.stop();
|
|
|
|
if (dates) {
|
|
|
|
if (+dates[0] == +dates[1]) {
|
2011-01-24 08:10:25 +01:00
|
|
|
reportDayClick(dates[0], true, ev);
|
2010-09-19 07:54:35 +02:00
|
|
|
}
|
|
|
|
reportSelection(dates[0], dates[1], true, ev);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|