00001 using System;
00002 using System.Collections.Generic;
00003 using Gtk;
00004 using Foodolini.BusinessLogic;
00005 using Foodolini.Activities;
00006
00007 namespace Foodolini.Activities.Ingredients
00008 {
00009 [FoodoliniActivity("Ingredients", false, "Ingredient.png")]
00010 [System.ComponentModel.ToolboxItem(true)]
00011 public partial class IngredientsActivity : Gtk.Bin, IActivity
00012 {
00013 private NodeStore ingredientStore = new NodeStore(typeof(IngredientAdapter));
00014 ListStore categoryStore = new ListStore(typeof(string));
00015
00016 public IngredientsActivity()
00017 {
00018 this.Build();
00019 this.LoadData();
00020 }
00021
00022 public IngredientsActivity(Ingredient defaultSelection) : this()
00023 {
00024 SelectIngredient(defaultSelection);
00025 }
00026
00027 private IngredientAdapter SelectedNode{
00028 get{
00029 return this.ingredientsView.NodeSelection.SelectedNode as IngredientAdapter;
00030 }
00031 }
00032
00033 internal Ingredient SelectedIngredient
00034 {
00035 get
00036 {
00037 Ingredient ret = null;
00038 if (this.SelectedNode != null)
00039 ret = SelectedNode.Ingredient;
00040 return ret;
00041 }
00042 }
00043
00044 public void Register(IOwner owner)
00045 {
00046
00047 }
00048
00049 void LoadData()
00050 {
00051
00052 List<string> categories = new List<string>(Ingredient.Categories);
00053 categories.Sort();
00054 categoryStore.AppendValues("Any category (first 500 results)");
00055 foreach (string category in categories) {
00056 categoryStore.AppendValues(category);
00057 }
00058 this.CategoryCombobox.Model = categoryStore;
00059 this.CategoryCombobox.QueueResize();
00060 TreeIter first;
00061 this.CategoryCombobox.Model.GetIterFirst(out first);
00062 this.CategoryCombobox.SetActiveIter(first);
00063
00064 LoadIngredients();
00065
00066 this.ingredientsView.AppendColumn("Ingredient", new CellRendererText(), "text", 0);
00067 this.ingredientsView.AppendColumn("Protein (g)", new CellRendererText(), (column, cell, node) =>
00068 {
00069 IngredientAdapter n = (IngredientAdapter)node;
00070 CellRendererText c = (CellRendererText)cell;
00071 c.Text = n.Protein.ToString("0.00");
00072 });
00073
00074 this.ingredientsView.AppendColumn("Carbohydrates (g)", new CellRendererText(), (column, cell, node) =>
00075 {
00076 IngredientAdapter n = (IngredientAdapter)node;
00077 CellRendererText c = (CellRendererText)cell;
00078 c.Text = n.Carbohydrates.ToString("0.00");
00079 });
00080
00081 this.ingredientsView.AppendColumn("Fat (g)", new CellRendererText(), (column, cell, node) =>
00082 {
00083 IngredientAdapter n = (IngredientAdapter)node;
00084 CellRendererText c = (CellRendererText)cell;
00085 c.Text = n.Fat.ToString("0.00");
00086 });
00087
00088 this.ingredientsView.NodeStore = ingredientStore;
00089 }
00090
00091 void LoadIngredients()
00092 {
00093 if (this.ingredientsView.NodeStore != null)
00094 this.ingredientsView.NodeStore.Clear();
00095
00096 List<Ingredient> ingredients = new List<Ingredient>();
00097
00098 if(this.CategoryCombobox.Active > 0)
00099 ingredients = new List<Ingredient>(Ingredient.ListByCategory(this.CategoryCombobox.ActiveText, this.SearchEntry.Text));
00100 else
00101 ingredients = new List<Ingredient>(Ingredient.ListByLongDescription(this.SearchEntry.Text));
00102
00103 ingredients.Sort((i1, i2) => i1.LongDescription.CompareTo(i2.LongDescription));
00104 foreach (var ingredient in ingredients) {
00105 ingredientStore.AddNode(new IngredientAdapter(ingredient));
00106 }
00107 }
00108
00109 public void Unregister()
00110 {
00111
00112 }
00113
00114 protected virtual void OnSearchEntryChanged(object sender, System.EventArgs e)
00115 {
00116
00117 LoadIngredients();
00118
00119 this.EditIngredientButton.Sensitive = (this.SelectedNode!=null);
00120 if(OnIngredientSelectionChanged!=null)
00121 OnIngredientSelectionChanged(this,new EventArgs());
00122 }
00123
00124 private void OpenEditDialog(IngredientAdapter selectedNode){
00125
00126
00127 IngredientDialog diag = new IngredientDialog(selectedNode.Ingredient);
00128
00129 ResponseType res = (ResponseType)diag.Run();
00130
00131 if (res == ResponseType.Ok) {
00132 diag.SaveIngredient();
00133 SelectIngredient(diag.Ingredient);
00134 } else if(res == ResponseType.Reject){
00135
00136 MessageDialog confirm = new MessageDialog(null,
00137 DialogFlags.DestroyWithParent,
00138 MessageType.Warning,
00139 ButtonsType.OkCancel,
00140 "Are you sure you want to delete this ingredient?");
00141 if(confirm.Run()==(int)ResponseType.Ok) {
00142 Ingredient ingredient = selectedNode.Ingredient;
00143 ingredientStore.RemoveNode(selectedNode);
00144 ingredient.Delete();
00145 }
00146 confirm.Destroy();
00147 }
00148 diag.Destroy();
00149 }
00150
00151 protected virtual void OnIngredientsViewRowActivated(object o, Gtk.RowActivatedArgs args)
00152 {
00153 var selectedNode = (IngredientAdapter)ingredientStore.GetNode(args.Path);
00154 OpenEditDialog(selectedNode);
00155 }
00156
00157 [GLib.ConnectBeforeAttribute()]
00158 protected virtual void OnIngredientsViewButtonPressEvent(object o, Gtk.ButtonPressEventArgs args)
00159 {
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 }
00177
00178 internal void SelectIngredient(Ingredient savedIngredient)
00179 {
00180
00181 int i = 0;
00182
00183 foreach (object[] obj in categoryStore) {
00184 string cat = obj[0].ToString();
00185 if (cat == savedIngredient.Category) {
00186 TreeIter it;
00187 if (CategoryCombobox.Model.GetIterFromString(out it, i.ToString()))
00188 CategoryCombobox.SetActiveIter(it);
00189 break;
00190 }
00191 i++;
00192 }
00193
00194 LoadIngredients();
00195
00196
00197 foreach (IngredientAdapter node in ingredientsView.NodeStore) {
00198 if (Ingredient.Compare(node.Ingredient,savedIngredient)) {
00199 ingredientsView.NodeSelection.SelectNode(node);
00200 break;
00201 }
00202 }
00203 }
00204
00205 protected virtual void OnCreateIngredientButtonClicked(object sender, System.EventArgs e)
00206 {
00207 IngredientDialog dialog = new IngredientDialog(this.CategoryCombobox.ActiveText);
00208 ResponseType res = (ResponseType)dialog.Run();
00209 if (res == ResponseType.Ok) {
00210 dialog.SaveIngredient();
00211 SelectIngredient(dialog.Ingredient);
00212 }
00213 dialog.Destroy();
00214 }
00215
00216 public event EventHandler OnIngredientSelectionChanged;
00217
00227 protected virtual void OnIngredientsViewCursorChanged (object sender, System.EventArgs e)
00228 {
00229 this.EditIngredientButton.Sensitive = (this.SelectedNode!=null);
00230
00231 if(OnIngredientSelectionChanged!=null)
00232 OnIngredientSelectionChanged(this,new EventArgs());
00233 }
00234
00235
00236 protected virtual void OnEditIngredientButtonClicked (object sender, System.EventArgs e)
00237 {
00238 if(this.SelectedNode != null)
00239 {
00240 OpenEditDialog(this.SelectedNode);
00241 }
00242 }
00243
00244
00245
00246 public Widget Widget
00247 {
00248 get { return this; }
00249 }
00250
00251 }
00252 }