浏览代码

BusinessHourRenderer

Adam Shaw 8 年之前
父节点
当前提交
a308cc4f8e

+ 1 - 0
src.json

@@ -32,6 +32,7 @@
     "component/interaction/ExternalDropping.js",
     "component/interaction/EventPointing.js",
     "component/EventRenderer.js",
+    "component/BusinessHourRenderer.js",
     "component/HelperRenderer.js",
     "component/ChronoComponent.js",
     "component/CoordChronoComponentMixin.js",

+ 12 - 7
src/common/DayGrid.js

@@ -397,16 +397,21 @@ var DayGrid = FC.DayGrid = ChronoComponent.extend(CoordChronoComponentMixin, Seg
 	------------------------------------------------------------------------------------------------------------------*/
 
 
-	renderBusinessHours: function() {
-		var segs = this.buildBusinessHourSegs(true); // wholeDay=true
+	businessHourRendererClass: BusinessHourRenderer.extend({
 
-		this.fillSystem.render('businessHours', segs, 'bgevent');
-	},
+		isWholeDay: true,
 
 
-	unrenderBusinessHours: function() {
-		this.fillSystem.unrender('businessHours');
-	},
+		renderSegs: function(segs) {
+			this.component.fillSystem.render('businessHours', segs, 'bgevent');
+		},
+
+
+		unrender: function() {
+			this.component.fillSystem.unrender('businessHours');
+		}
+
+	}),
 
 
 	/* Fill System (highlight, background events, business hours)

+ 17 - 17
src/common/TimeGrid.js

@@ -664,29 +664,29 @@ var TimeGrid = FC.TimeGrid = ChronoComponent.extend(CoordChronoComponentMixin, S
 	------------------------------------------------------------------------------------------------------------------*/
 
 
-	renderBusinessHours: function() {
-		this.renderBusinessSegs(
-			this.buildBusinessHourSegs()
-		);
-	},
+	businessHourRendererClass: BusinessHourRenderer.extend({
 
 
-	unrenderBusinessHours: function() {
-		this.unrenderBusinessSegs();
-	},
+		renderSegs: function(segs) {
+			var component = this.component;
 
+			segs = component.fillSystem.buildSegEls('businessHours', segs);
 
-	renderBusinessSegs: function(segs) {
-		segs = this.fillSystem.buildSegEls('businessHours', segs);
-		this.updateSegVerticals(segs);
-		this.attachSegsByCol(this.groupSegsByCol(segs), this.businessContainerEls);
-		this.businessSegs = segs;
-	},
+			component.updateSegVerticals(segs);
+			component.attachSegsByCol(
+				component.groupSegsByCol(segs),
+				component.businessContainerEls
+			);
 
+			component.businessSegs = segs;
+		},
 
-	unrenderBusinessSegs: function() {
-		this.unrenderNamedSegs('businessSegs');
-	},
+
+		unrender: function() {
+			this.component.unrenderNamedSegs('businessSegs');
+		}
+
+	}),
 
 
 	/* Selection

+ 66 - 0
src/component/BusinessHourRenderer.js

@@ -0,0 +1,66 @@
+
+var BusinessHourRenderer = Class.extend({
+
+	isWholeDay: false, // subclasses can config
+	component: null,
+
+
+	/*
+	component implements:
+		- eventRangesToEventFootprints
+		- eventFootprintsToSegs
+	*/
+	constructor: function(component) {
+		this.component = component;
+	},
+
+
+	// TODO: eventually pass-in eventFootprints
+	render: function() {
+		this.renderFootprints(this.buildEventFootprints());
+	},
+
+
+	renderFootprints: function(eventFootprints) {
+		this.renderSegs(
+			this.component.eventFootprintsToSegs(eventFootprints)
+		);
+	},
+
+
+	renderSegs: function(segs) {
+		// subclasses must implement
+	},
+
+
+	unrender: function() {
+		// subclasses must implement
+	},
+
+
+	buildEventFootprints: function() {
+		var view = this.component.view;
+		var calendar = view.calendar;
+		var eventInstanceGroup;
+		var eventRanges;
+
+		eventInstanceGroup = calendar.buildBusinessInstanceGroup(
+			this.isWholeDay,
+			calendar.opt('businessHours'),
+			view.renderUnzonedRange
+		);
+
+		if (eventInstanceGroup) {
+			eventRanges = eventInstanceGroup.sliceRenderRanges(
+				view.renderUnzonedRange,
+				calendar
+			);
+		}
+		else {
+			eventRanges = [];
+		}
+
+		return this.component.eventRangesToEventFootprints(eventRanges);
+	}
+
+});

+ 0 - 36
src/component/ChronoComponent.js

@@ -153,42 +153,6 @@ var ChronoComponent = Model.extend({
 	},
 
 
-	// Compute business hour *events* for the grid's current date range.
-	// Caller must ask if whole-day business hours are needed.
-	// FOR RENDERING
-	buildBusinessHourEventFootprints: function(wholeDay) {
-		var calendar = this.view.calendar;
-
-		return this._buildBusinessHourEventFootprints(wholeDay, calendar.opt('businessHours'));
-	},
-
-
-	_buildBusinessHourEventFootprints: function(wholeDay, businessHourDef) {
-		var view = this.view;
-		var calendar = view.calendar;
-		var eventInstanceGroup;
-		var eventRanges;
-
-		eventInstanceGroup = calendar.buildBusinessInstanceGroup(
-			wholeDay,
-			businessHourDef,
-			view.renderUnzonedRange
-		);
-
-		if (eventInstanceGroup) {
-			eventRanges = eventInstanceGroup.sliceRenderRanges(
-				view.renderUnzonedRange,
-				calendar
-			);
-		}
-		else {
-			eventRanges = [];
-		}
-
-		return this.eventRangesToEventFootprints(eventRanges);
-	},
-
-
 	// Event Low-level Rendering
 	// -----------------------------------------------------------------------------------------------------------------
 

+ 18 - 6
src/component/SegChronoComponentMixin.js

@@ -15,14 +15,21 @@ This mixin can depend on ChronoComponent:
 var SegChronoComponentMixin = {
 
 	eventRendererClass: EventRenderer,
+	businessHourRendererClass: null,
 
 	segs: null, // the *event* segments currently rendered in the grid. TODO: rename to `eventSegs`
 	eventRenderer: null,
+	businessHourRenderer: null,
 	fillSystem: null,
 
 
 	initSegChronoComponent: function() {
 		this.eventRenderer = new this.eventRendererClass(this);
+
+		if (this.businessHourRendererClass) {
+			this.businessHourRenderer = new this.businessHourRendererClass(this);
+		}
+
 		this.fillSystem = new this.fillSystemClass(this);
 	},
 
@@ -119,12 +126,17 @@ var SegChronoComponentMixin = {
 	------------------------------------------------------------------------------------------------------------------*/
 
 
-	// Compute business hour segs for the grid's current date range.
-	// Caller must ask if whole-day business hours are needed.
-	buildBusinessHourSegs: function(wholeDay) {
-		return this.eventFootprintsToSegs(
-			this.buildBusinessHourEventFootprints(wholeDay)
-		);
+	renderBusinessHours: function() {
+		if (this.businessHourRenderer) {
+			this.businessHourRenderer.render(); // TODO: eventually pass-in eventFootprints
+		}
+	},
+
+
+	unrenderBusinessHours: function() {
+		if (this.businessHourRenderer) {
+			this.businessHourRenderer.unrender();
+		}
 	},