00001 using System;
00002 using Gtk;
00003 using Foodolini.BusinessLogic;
00004 using Foodolini.Activities;
00005 using Foodolini.Activities.FoodRegistration;
00006 using System.Collections.Generic;
00007
00008 namespace Foodolini.Activities.Inventory
00009 {
00014 [FoodoliniActivity("Inventory",false,"Frigde.png")]
00015 [System.ComponentModel.ToolboxItem(true)]
00016 public partial class InventoryActivity : Gtk.Bin, IActivity
00017 {
00018 private NodeStore storage = new NodeStore (typeof(FoodItemAdapter));
00019
00023 public InventoryActivity ()
00024 {
00025 this.Build ();
00026 this.Shown += HandleShown;
00027 this.Editbnt.Sensitive = false;
00028 this.Deletebnt .Sensitive = false;
00029 this.ConsumeBnt.Sensitive = false;
00030
00031 this.foodItemView.AppendColumn ("Food", new CellRendererText (), "text", 0);
00032 this.foodItemView.AppendColumn ("Quantity (g)", new CellRendererText (), "text", 1);
00033 this.foodItemView.AppendColumn ("Expiration date", new CellRendererText (), (column, cell, node) =>
00034 {
00035 FoodItemAdapter n = (FoodItemAdapter)node;
00036 CellRendererText c = (CellRendererText)cell;
00037 c.Text = n.ExpirationDate.ToShortDateString();
00038 });
00039
00040 this.foodItemView.AppendColumn ("Open/Closed", new CellRendererText(), "text", 3);
00041 this.foodItemView.NodeStore = storage;
00042 }
00043
00044 private IOwner owner;
00045 public void Register (IOwner owner){
00046 this.owner = owner;
00047 }
00048
00058 void HandleShown(object sender, EventArgs e)
00059 {
00060 storage.Clear();
00061 var foodItems = new List<FoodItem>(FoodItem.ListFoodItems ());
00062 foodItems.Sort((f1, f2) => f1.ExpirationDate.CompareTo(f2.ExpirationDate));
00063 foreach (var item in foodItems)
00064 storage.AddNode (new FoodItemAdapter (item));
00065 }
00066
00067
00068 public void Unregister (){
00069 this.owner = null;
00070 }
00071
00081 protected virtual void OnRegisterBtnClicked (object sender, System.EventArgs e)
00082 {
00083 this.owner.PushActivity<FoodRegistrationActivity>();
00084 }
00085
00095 protected virtual void OnDeletebntClicked (object sender, System.EventArgs e)
00096 {
00097 OpenDeleteDialog();
00098 }
00099
00103 private void OpenEditDialog(){
00104 if(this.foodItemView.NodeSelection.SelectedNode != null){
00105 var node = (FoodItemAdapter)this.foodItemView.NodeSelection.SelectedNode;
00106 if (node.FoodItem != null){
00107 EditFoodItemDialog dia = new EditFoodItemDialog(node.FoodItem);
00108 ResponseType res = (ResponseType)dia.Run();
00109
00110 if (res == ResponseType.Ok)
00111 dia.Food.Save();
00112 else
00113 dia.DontSave();
00114
00115 dia.Destroy();
00116 }
00117 }
00118 UpdateFoodItem();
00119 }
00120
00130 protected virtual void OnEditbntClicked (object sender, System.EventArgs e)
00131 {
00132 OpenEditDialog();
00133 }
00134
00138 private void OpenDeleteDialog(){
00139 var food = (FoodItemAdapter)this.foodItemView.NodeSelection.SelectedNode;
00140 if (food != null){
00141 DeleteDialog dia = new DeleteDialog();
00142
00143 ResponseType res = (ResponseType)dia.Run();
00144
00145 if (res == ResponseType.Ok){
00146 storage.RemoveNode(food);
00147 food.FoodItem.Delete();
00148 }
00149 dia.Destroy();
00150 }
00151 UpdateFoodItem();
00152 }
00157 private void UpdateGrey()
00158 {
00159 var food = (FoodItemAdapter)this.foodItemView.NodeSelection.SelectedNode;
00160 if (food != null){
00161 this.Editbnt.Sensitive = true;
00162 this.Deletebnt.Sensitive = true;
00163 this.ConsumeBnt.Sensitive = true;
00164 }else{
00165 this.Editbnt.Sensitive = false;
00166 this.Deletebnt.Sensitive = false;
00167 this.ConsumeBnt.Sensitive = false;
00168 }
00169 }
00170
00180 protected virtual void OnConsumeBntClicked (object sender, System.EventArgs e)
00181 {
00182 var food = (FoodItemAdapter)this.foodItemView.NodeSelection.SelectedNode;
00183 if (food != null){
00184 ConsumeFoodItem dia = new ConsumeFoodItem(food.FoodItem,owner.CurrentUser);
00185
00186 ResponseType res = (ResponseType)dia.Run();
00187
00188 if (res == ResponseType.Ok){
00189 if(dia.Quantity == food.FoodItem.Quantity){
00190 food.FoodItem.Consume(owner.CurrentUser);
00191
00192 food.FoodItem.Save();
00193
00194 storage.Clear();
00195 foreach (var item in FoodItem.ListFoodItems ())
00196 storage.AddNode (new FoodItemAdapter (item));
00197 this.foodItemView.NodeStore = storage;
00198 }else{
00199 food.FoodItem.Consume(owner.CurrentUser,dia.Quantity);
00200 food.FoodItem.Save();
00201 }
00202 }
00203 dia.Destroy();
00204 UpdateFoodItem();
00205
00206 }
00207 }
00208
00209 protected virtual void OnFoodItemViewCursorChanged (object sender, System.EventArgs e)
00210 {
00211 UpdateFoodItem();
00212 }
00213
00214 private void UpdateFoodItem(){
00215 if (foodItemView.NodeSelection.SelectedNode != null ){
00216 FoodItemAdapter item = (FoodItemAdapter)foodItemView.NodeSelection.SelectedNode;
00217 this.lbAmount.Text = string.Format("Quantity: {0} g",item.FoodItem.Quantity);
00218 TimeSpan timeRemaining = item.FoodItem.ExpirationDate - System.DateTime.Now;
00219 if(timeRemaining.Days < 0) {
00220 this.lbExpire.Markup = "<i>Expired</i>";
00221 } else
00222 this.lbExpire.Text = string.Format("Expires in {0} days",Math.Ceiling(timeRemaining.TotalDays));
00223 this.lbIngre.Markup = string.Format("<b>{0}</b>",item.FoodItem.Ingredient.LongDescription);
00224 this.lbshelf.Text = string.Format("Shelf life: {0} days", item.FoodItem.Ingredient.ShelfLife.Days);
00225 }
00226 else{
00227 this.lbAmount.Text = "";
00228 this.lbExpire.Text = "";
00229 this.lbIngre.Markup = "";
00230 this.lbshelf.Text = "";
00231 }
00232 UpdateGrey();
00233 }
00234
00235 protected virtual void OnFoodItemViewRowActivated (object o, Gtk.RowActivatedArgs args)
00236 {
00237 OpenEditDialog();
00238 }
00239
00240
00241
00242 public Widget Widget {
00243 get { return this; }
00244 }
00245 }
00246 }