package tripvisModel.controllers { import flash.events.EventDispatcher; import mx.collections.ArrayCollection; import tripvisModel.CostsPerDayItem; import tripvisModel.MoneyAmount; import tripvisModel.TripItem; import tripvisModel.TripItemType; [Event(name="totalLandmarkCostsChanged", type="tripvisModel.controllers.CostControllerEvent")] [Event(name="totalRestaurantCostsChanged", type="tripvisModel.controllers.CostControllerEvent")] [Event(name="totalHotelCostsChanged", type="tripvisModel.controllers.CostControllerEvent")] [Event(name="costsPerDayChanged", type="tripvisModel.controllers.CostControllerEvent")] public class CostController extends EventDispatcher { private var _visController: VisController; private var _totalLandmarkCosts: MoneyAmount; private var _totalRestaurantCosts: MoneyAmount; private var _totalHotelcosts: MoneyAmount; private var _costsPerDay: ArrayCollection; public function CostController(visController: VisController) { _visController = visController; _visController.addEventListener(VisControllerEvent.TRIP_ITEM_ADDED, visController_tripItemsChanged); _visController.addEventListener(VisControllerEvent.TRIP_ITEM_REMOVED, visController_tripItemsChanged); _visController.addEventListener(VisControllerEvent.TRIP_ITEM_UPDATED, visController_tripItemsChanged); //allemaal initialiseren op 0: _totalLandmarkCosts = new MoneyAmount(); _totalRestaurantCosts = new MoneyAmount(); _totalHotelcosts = new MoneyAmount(); _costsPerDay = new ArrayCollection(); } // Getters: public function get totalLandmarkCosts(): MoneyAmount { return _totalLandmarkCosts; } public function get totalRestaurantCosts(): MoneyAmount { return _totalRestaurantCosts; } public function get totalHotelcosts(): MoneyAmount { return _totalHotelcosts; } public function get costsPerDay(): ArrayCollection { return _costsPerDay; } private function visController_tripItemsChanged(event: VisControllerEvent): void { // er is iets veranderd aan de trip items: // totale kosten opnieuw berekenen: updateTotalCosts(); // kosten per dag opnieuw berekenen: updateCostsPerDay(); } private function updateTotalCosts(): void { var newTotalLandmarkCosts: MoneyAmount = new MoneyAmount(); var newTotalRestaurantCosts: MoneyAmount = new MoneyAmount(); var newTotalHotelCosts: MoneyAmount = new MoneyAmount(); // alle trip items aflopen: for each (var tripItem: TripItem in _visController.tripItemList) { switch(tripItem.type) { case TripItemType.LANDMARK: newTotalLandmarkCosts = newTotalLandmarkCosts.add(tripItem.cost); break; case TripItemType.EATINGPLACE: newTotalRestaurantCosts = newTotalRestaurantCosts.add(tripItem.cost); break; case TripItemType.HOTEL: newTotalHotelCosts = newTotalHotelCosts.add(tripItem.cost); break; } } // checken of er iets is veranderd tov oude kosten en events sturen if so if ( !newTotalLandmarkCosts.equals(_totalLandmarkCosts) ) { _totalLandmarkCosts = newTotalLandmarkCosts; dispatchEvent( new CostControllerEvent('totalLandmarkCostsChanged') ); } if ( !newTotalRestaurantCosts.equals(_totalRestaurantCosts) ) { _totalRestaurantCosts = newTotalRestaurantCosts; dispatchEvent( new CostControllerEvent('totalRestaurantCostsChanged') ); } if ( !newTotalHotelCosts.equals(_totalHotelcosts) ) { _totalHotelcosts = newTotalHotelCosts; dispatchEvent( new CostControllerEvent('totalHotelCostsChanged') ); } } private function updateCostsPerDay(): void { var newCostsPerDay: ArrayCollection = new ArrayCollection(); for each (var tripItem: TripItem in _visController.tripItemList) { if (tripItem.timePeriod.isSet) { var costsPerDayItem: CostsPerDayItem = getCostsPerDayItem(tripItem.timePeriod.startDate, newCostsPerDay); switch(tripItem.type) { case TripItemType.LANDMARK: costsPerDayItem.landmarkCost = costsPerDayItem.landmarkCost.add(tripItem.cost); break; case TripItemType.EATINGPLACE: costsPerDayItem.restaurantCost = costsPerDayItem.restaurantCost.add(tripItem.cost); break; case TripItemType.HOTEL: costsPerDayItem.hotelCost = costsPerDayItem.hotelCost.add(tripItem.cost); break; } } } // checken of de oude array enig verschil toont met de nieuwe: if (_costsPerDay.length != newCostsPerDay.length) { this._costsPerDay = newCostsPerDay; dispatchEvent( new CostControllerEvent('costsPerDayChanged') ); } else { // alle elementen één voor één aflopen: for (var i: uint = 0; i < _costsPerDay.length; i++) { if ( !(_costsPerDay[i] as CostsPerDayItem).equals( (newCostsPerDay[i] as CostsPerDayItem) ) ) { this._costsPerDay = newCostsPerDay; dispatchEvent( new CostControllerEvent('costsPerDayChanged') ); break; } } } } private function getCostsPerDayItem(day: Date, costsPerDayCollection: ArrayCollection): CostsPerDayItem { for each (var costsPerDayItem: CostsPerDayItem in costsPerDayCollection) { if ( costsPerDayItem.hasAsDay(day) ) { return costsPerDayItem; break; } } // if no match is found, create a new entry: var date: Date = new Date(day.getTime()); date.hours = 0; date.minutes = 0; date.seconds = 0; date.milliseconds = 0; var newCostsPerDayItem: CostsPerDayItem = new CostsPerDayItem(date); costsPerDayCollection.addItem(newCostsPerDayItem); return newCostsPerDayItem; } } }