comparison FrmMainWindow.cs @ 21:2cf1af4c9baf

Re #53: Add XML saver * Add initial stub behind "save as" that saves to a fixed location
author IBBoard <dev@ibboard.co.uk>
date Mon, 17 Aug 2009 19:10:37 +0000
parents a191d0655f55
children d661cb257511
comparison
equal deleted inserted replaced
20:1e301a6234fd 21:2cf1af4c9baf
25 using IBBoard.WarFoundry.Plugin.Rollcall; 25 using IBBoard.WarFoundry.Plugin.Rollcall;
26 using IBBoard.Xml; 26 using IBBoard.Xml;
27 using log4net; 27 using log4net;
28 28
29 namespace IBBoard.WarFoundry.GTK 29 namespace IBBoard.WarFoundry.GTK
30 { 30 {
31 public partial class FrmMainWindow: Gtk.Window 31 public partial class FrmMainWindow: Gtk.Window
32 { 32 {
33 private static readonly string AppTitle = "WarFoundry"; 33 private static readonly string AppTitle = "WarFoundry";
34 private const int CATEGORY_BUTTON_SEPARATOR_INDEX = 6; 34 private const int CATEGORY_BUTTON_SEPARATOR_INDEX = 6;
35 35
43 private ObjectAddDelegate UnitAddedMethod; 43 private ObjectAddDelegate UnitAddedMethod;
44 private ObjectRemoveDelegate UnitRemovedMethod; 44 private ObjectRemoveDelegate UnitRemovedMethod;
45 private DoubleValChangedDelegate PointsValueChangedMethod; 45 private DoubleValChangedDelegate PointsValueChangedMethod;
46 private FailedUnitRequirementDelegate FailedUnitRequirementMethod; 46 private FailedUnitRequirementDelegate FailedUnitRequirementMethod;
47 private StringValChangedDelegate UnitNameChangedMethod; 47 private StringValChangedDelegate UnitNameChangedMethod;
48 48
49 private GameSystem system; 49 private GameSystem system;
50 private string loadedArmyPath; 50 private string loadedArmyPath;
51 51
52 private MenuToolButton undoMenuButton, redoMenuButton; 52 private MenuToolButton undoMenuButton, redoMenuButton;
53 53
54 public static void Main (string[] args) 54 public static void Main (string[] args)
55 { 55 {
56 try 56 try
57 { 57 {
58 Application.Init(); 58 Application.Init();
59 FrmMainWindow win = new FrmMainWindow(args); 59 FrmMainWindow win = new FrmMainWindow(args);
60 win.Show(); 60 win.Show();
64 catch(Exception ex) 64 catch(Exception ex)
65 { 65 {
66 LogManager.GetLogger(typeof(FrmMainWindow)).Fatal("("+ex.GetType().Name+") "+ex.Message + Environment.NewLine + ex.StackTrace); 66 LogManager.GetLogger(typeof(FrmMainWindow)).Fatal("("+ex.GetType().Name+") "+ex.Message + Environment.NewLine + ex.StackTrace);
67 } 67 }
68 } 68 }
69 69
70 public FrmMainWindow() : this(new string[0]) 70 public FrmMainWindow() : this(new string[0])
71 { 71 {
72 //Do nothing extra 72 //Do nothing extra
73 } 73 }
74 74
75 public FrmMainWindow (string[] args): base (Gtk.WindowType.Toplevel) 75 public FrmMainWindow (string[] args): base (Gtk.WindowType.Toplevel)
76 { 76 {
77 logger.Info("Opening FrmMainWindow"); 77 logger.Info("Opening FrmMainWindow");
78 Build (); 78 Build ();
79 //Replace the undo/redo buttons with menu versions, which Monodevelop's GUI editor doesn't currently support 79 //Replace the undo/redo buttons with menu versions, which Monodevelop's GUI editor doesn't currently support
88 undoMenuButton.Clicked+= undoTBButtonActivated; 88 undoMenuButton.Clicked+= undoTBButtonActivated;
89 toolbar.Insert(undoMenuButton, CATEGORY_BUTTON_SEPARATOR_INDEX); 89 toolbar.Insert(undoMenuButton, CATEGORY_BUTTON_SEPARATOR_INDEX);
90 toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-1]); 90 toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-1]);
91 toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-2]); 91 toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-2]);
92 toolbar.ShowAll(); 92 toolbar.ShowAll();
93 93
94 Title = AppTitle; 94 Title = AppTitle;
95 TreeViewColumn mainColumn = new TreeViewColumn (); 95 TreeViewColumn mainColumn = new TreeViewColumn ();
96 mainColumn.Title = "Army Categories"; 96 mainColumn.Title = "Army Categories";
97 CellRendererText mainCell = new CellRendererText (); 97 CellRendererText mainCell = new CellRendererText ();
98 mainColumn.PackStart (mainCell, true); 98 mainColumn.PackStart (mainCell, true);
100 mainColumn.SetCellDataFunc(mainCell, new TreeCellDataFunc(RenderCategoryTreeObjectName)); 100 mainColumn.SetCellDataFunc(mainCell, new TreeCellDataFunc(RenderCategoryTreeObjectName));
101 treeUnits.Model = new TreeStore(typeof(WarFoundryObject)); 101 treeUnits.Model = new TreeStore(typeof(WarFoundryObject));
102 logger.Debug("Loading preferences"); 102 logger.Debug("Loading preferences");
103 Preferences = new Preferences("WarFoundryGTK"); 103 Preferences = new Preferences("WarFoundryGTK");
104 logger.Debug("Loading translations"); 104 logger.Debug("Loading translations");
105 105
106 try 106 try
107 { 107 {
108 Translation.InitialiseTranslations(Constants.ExecutablePath, Preferences["language"].ToString()); 108 Translation.InitialiseTranslations(Constants.ExecutablePath, Preferences["language"].ToString());
109 } 109 }
110 catch (TranslationLoadException ex) 110 catch (TranslationLoadException ex)
113 MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, ex.Message); 113 MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, ex.Message);
114 dialog.Title = "Translation loading failed"; 114 dialog.Title = "Translation loading failed";
115 dialog.Run(); 115 dialog.Run();
116 dialog.Destroy(); 116 dialog.Destroy();
117 } 117 }
118 118
119 logger.Debug("Initialising"); 119 logger.Debug("Initialising");
120 commandStack = new CommandStack(); 120 commandStack = new CommandStack();
121 commandStack.CommandStackUpdated+=new MethodInvoker(commandStack_CommandStackUpdated); 121 commandStack.CommandStackUpdated+=new MethodInvoker(commandStack_CommandStackUpdated);
122 WarFoundryCore.GameSystemChanged+= new GameSystemChangedDelegate(OnGameSystemChanged); 122 WarFoundryCore.GameSystemChanged+= new GameSystemChangedDelegate(OnGameSystemChanged);
123 WarFoundryCore.ArmyChanged+= new ArmyChangedDelegate(OnArmyChanged); 123 WarFoundryCore.ArmyChanged+= new ArmyChangedDelegate(OnArmyChanged);
126 UnitAddedMethod = new ObjectAddDelegate(OnUnitAdded); 126 UnitAddedMethod = new ObjectAddDelegate(OnUnitAdded);
127 UnitRemovedMethod = new ObjectRemoveDelegate(OnUnitRemoved); 127 UnitRemovedMethod = new ObjectRemoveDelegate(OnUnitRemoved);
128 PointsValueChangedMethod = new DoubleValChangedDelegate(OnPointsValueChanged); 128 PointsValueChangedMethod = new DoubleValChangedDelegate(OnPointsValueChanged);
129 FailedUnitRequirementMethod = new FailedUnitRequirementDelegate(OnFailedUnitRequirement); 129 FailedUnitRequirementMethod = new FailedUnitRequirementDelegate(OnFailedUnitRequirement);
130 UnitNameChangedMethod = new StringValChangedDelegate(OnUnitNameChanged); 130 UnitNameChangedMethod = new StringValChangedDelegate(OnUnitNameChanged);
131 131
132 //FIXME: Temporary hack to add paths and factories before we get preferences and plugins 132 //FIXME: Temporary hack to add paths and factories before we get preferences and plugins
133 WarFoundryLoader.GetDefault().AddLoadDirectory(new DirectoryInfo(Constants.ExecutablePath + Constants.DirectoryString + "data")); 133 WarFoundryLoader.GetDefault().AddLoadDirectory(new DirectoryInfo(Constants.ExecutablePath + Constants.DirectoryString + "data"));
134 WarFoundryLoader.GetDefault().RegisterFactory(WarFoundryXmlFactory.GetFactory()); 134 WarFoundryLoader.GetDefault().RegisterFactory(WarFoundryXmlFactory.GetFactory());
135 WarFoundryLoader.GetDefault().RegisterNonNativeFactory(RollcallFactory.GetFactory()); 135 WarFoundryLoader.GetDefault().RegisterNonNativeFactory(RollcallFactory.GetFactory());
136 136 WarFoundrySaver.SetFileSaver(new WarFoundryXmlSaver());
137
137 logger.Debug("Initialising complete - seeing if we can load default army or system"); 138 logger.Debug("Initialising complete - seeing if we can load default army or system");
138 139
139 if (args.Length == 1) 140 if (args.Length == 1)
140 { 141 {
141 logger.Debug("Attempting to load from file"); 142 logger.Debug("Attempting to load from file");
142 FileInfo file = new FileInfo(args[0]); 143 FileInfo file = new FileInfo(args[0]);
143 144
144 try 145 try
145 { 146 {
146 ICollection<IWarFoundryObject> objects = WarFoundryLoader.GetDefault().LoadFile(file); 147 ICollection<IWarFoundryObject> objects = WarFoundryLoader.GetDefault().LoadFile(file);
147 148
148 if (objects.Count == 1) 149 if (objects.Count == 1)
149 { 150 {
150 List<IWarFoundryObject> objectList = new List<IWarFoundryObject>(); 151 List<IWarFoundryObject> objectList = new List<IWarFoundryObject>();
151 objectList.AddRange(objects); 152 objectList.AddRange(objects);
152 IWarFoundryObject loadedObject = objectList[0]; 153 IWarFoundryObject loadedObject = objectList[0];
153 154
154 if (loadedObject is Army) 155 if (loadedObject is Army)
155 { 156 {
156 WarFoundryCore.CurrentArmy = (Army)loadedObject; 157 WarFoundryCore.CurrentArmy = (Army)loadedObject;
157 logger.InfoFormat("Loaded army from {0}", file.FullName); 158 logger.InfoFormat("Loaded army from {0}", file.FullName);
158 } 159 }
175 176
176 if (gameSystemID!=null && !"".Equals(gameSystemID)) 177 if (gameSystemID!=null && !"".Equals(gameSystemID))
177 { 178 {
178 logger.Debug("Attempting to load current game system from properties"); 179 logger.Debug("Attempting to load current game system from properties");
179 GameSystem sys = WarFoundryLoader.GetDefault().GetGameSystem(gameSystemID); 180 GameSystem sys = WarFoundryLoader.GetDefault().GetGameSystem(gameSystemID);
180 181
181 if (sys!=null) 182 if (sys!=null)
182 { 183 {
183 WarFoundryCore.CurrentGameSystem = sys; 184 WarFoundryCore.CurrentGameSystem = sys;
184 logger.InfoFormat("Loaded game system {0} from properties", gameSystemID); 185 logger.InfoFormat("Loaded game system {0} from properties", gameSystemID);
185 } 186 }
186 } 187 }
187 } 188 }
188 } 189 }
189 190
190 private void RenderCategoryTreeObjectName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter) 191 private void RenderCategoryTreeObjectName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
191 { 192 {
192 object o = model.GetValue(iter, 0); 193 object o = model.GetValue(iter, 0);
193 194
194 if (o is ArmyCategory) 195 if (o is ArmyCategory)
195 { 196 {
196 ArmyCategory c = (ArmyCategory)o; 197 ArmyCategory c = (ArmyCategory)o;
197 string name = ""; 198 string name = "";
198 199
199 if (Preferences.GetBooleanProperty("ShowCatPercentage")) 200 if (Preferences.GetBooleanProperty("ShowCatPercentage"))
200 { 201 {
201 name = Translation.GetTranslation("categoryTreeCatName", "{0} - {1}pts", c.Name, c.PointsTotal); 202 name = Translation.GetTranslation("categoryTreeCatName", "{0} - {1}pts", c.Name, c.PointsTotal);
202 } 203 }
203 else 204 else
204 { 205 {
205 name = Translation.GetTranslation("categoryTreeCatNamePercentage", "{0} - {1}pts ({2}%)", c.Name, c.PointsTotal, (c.ParentArmy.PointsTotal > 0 ? Math.Round((c.PointsTotal / c.ParentArmy.PointsTotal) * 100) : 0)); 206 name = Translation.GetTranslation("categoryTreeCatNamePercentage", "{0} - {1}pts ({2}%)", c.Name, c.PointsTotal, (c.ParentArmy.PointsTotal > 0 ? Math.Round((c.PointsTotal / c.ParentArmy.PointsTotal) * 100) : 0));
206 } 207 }
207 208
208 (cell as CellRendererText).Text = name; 209 (cell as CellRendererText).Text = name;
209 } 210 }
210 else if (o is IBBoard.WarFoundry.API.Objects.Unit) 211 else if (o is IBBoard.WarFoundry.API.Objects.Unit)
211 { 212 {
212 IBBoard.WarFoundry.API.Objects.Unit u = (IBBoard.WarFoundry.API.Objects.Unit)o; 213 IBBoard.WarFoundry.API.Objects.Unit u = (IBBoard.WarFoundry.API.Objects.Unit)o;
213 string name = Translation.GetTranslation("categoryTreeCatName", "{0} - {1}pts", u.Name, u.PointsValue); 214 string name = Translation.GetTranslation("categoryTreeCatName", "{0} - {1}pts", u.Name, u.PointsValue);
214 (cell as CellRendererText).Text = name; 215 (cell as CellRendererText).Text = name;
215 } 216 }
216 } 217 }
217 218
218 private void OnWindowDestroyed(object source, EventArgs args) 219 private void OnWindowDestroyed(object source, EventArgs args)
219 { 220 {
220 logger.Info("Exiting"); 221 logger.Info("Exiting");
221 Application.Quit(); 222 Application.Quit();
222 } 223 }
223 224
224 private void OnUnitNameChanged(WarFoundryObject val, string oldValue, string newValue) 225 private void OnUnitNameChanged(WarFoundryObject val, string oldValue, string newValue)
225 { 226 {
226 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val; 227 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val;
227 UnitDisplayWidget widget; 228 UnitDisplayWidget widget;
228 unitToWidgetMap.TryGetValue(unit, out widget); 229 unitToWidgetMap.TryGetValue(unit, out widget);
229 230
230 if (widget!=null) 231 if (widget!=null)
231 { 232 {
232 unitsNotebook.SetTabLabelText(widget, newValue); 233 unitsNotebook.SetTabLabelText(widget, newValue);
233 } 234 }
234 } 235 }
235 236
236 private void OnUnitAdded(WarFoundryObject val) 237 private void OnUnitAdded(WarFoundryObject val)
237 { 238 {
238 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val; 239 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val;
239 unit.NameChanged+= UnitNameChangedMethod; 240 unit.NameChanged+= UnitNameChangedMethod;
240 AddUnitToTree(unit); 241 AddUnitToTree(unit);
241 } 242 }
242 243
243 private void AddUnitToTree(IBBoard.WarFoundry.API.Objects.Unit unit) 244 private void AddUnitToTree(IBBoard.WarFoundry.API.Objects.Unit unit)
244 { 245 {
245 TreeStore model = (TreeStore)treeUnits.Model; 246 TreeStore model = (TreeStore)treeUnits.Model;
246 TreeIter iter; 247 TreeIter iter;
247 model.GetIterFirst(out iter); 248 model.GetIterFirst(out iter);
248 249
249 do 250 do
250 { 251 {
251 object obj = model.GetValue(iter, 0); 252 object obj = model.GetValue(iter, 0);
252 253
253 if (obj is ArmyCategory) 254 if (obj is ArmyCategory)
254 { 255 {
255 ArmyCategory cat = (ArmyCategory)obj; 256 ArmyCategory cat = (ArmyCategory)obj;
256 257
257 if (cat.Equals(unit.Category)) 258 if (cat.Equals(unit.Category))
258 { 259 {
259 model.AppendValues(iter, unit); 260 model.AppendValues(iter, unit);
260 TreePath path = model.GetPath(iter); 261 TreePath path = model.GetPath(iter);
261 treeUnits.ExpandToPath(path); 262 treeUnits.ExpandToPath(path);
262 } 263 }
263 } 264 }
264 } 265 }
265 while (model.IterNext(ref iter)); 266 while (model.IterNext(ref iter));
266 } 267 }
267 268
268 private void OnUnitRemoved(WarFoundryObject obj) 269 private void OnUnitRemoved(WarFoundryObject obj)
269 { 270 {
270 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj; 271 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj;
271 unit.NameChanged-= UnitNameChangedMethod; 272 unit.NameChanged-= UnitNameChangedMethod;
272 RemoveUnitFromTree(unit); 273 RemoveUnitFromTree(unit);
273 274
274 //See if unit has a tab open and close it if it does 275 //See if unit has a tab open and close it if it does
275 } 276 }
276 277
277 private void RemoveUnitFromTree(IBBoard.WarFoundry.API.Objects.Unit unit) 278 private void RemoveUnitFromTree(IBBoard.WarFoundry.API.Objects.Unit unit)
278 { 279 {
279 TreeStore model = (TreeStore)treeUnits.Model; 280 TreeStore model = (TreeStore)treeUnits.Model;
280 TreeIter iter; 281 TreeIter iter;
281 model.GetIterFirst(out iter); 282 model.GetIterFirst(out iter);
282 bool removed = false; 283 bool removed = false;
283 284
284 do 285 do
285 { 286 {
286 object obj = model.GetValue(iter, 0); 287 object obj = model.GetValue(iter, 0);
287 288
288 if (obj is ArmyCategory) 289 if (obj is ArmyCategory)
289 { 290 {
290 ArmyCategory cat = (ArmyCategory)obj; 291 ArmyCategory cat = (ArmyCategory)obj;
291 292
292 if (unit.Category == null || cat.Equals(unit.Category)) 293 if (unit.Category == null || cat.Equals(unit.Category))
293 { 294 {
294 TreeIter innerIter; 295 TreeIter innerIter;
295 model.IterChildren(out innerIter, iter); 296 model.IterChildren(out innerIter, iter);
296 297
297 do 298 do
298 { 299 {
299 object innerObj = model.GetValue(innerIter, 0); 300 object innerObj = model.GetValue(innerIter, 0);
300 301
301 if (unit.Equals(innerObj)) 302 if (unit.Equals(innerObj))
302 { 303 {
303 model.Remove(ref innerIter); 304 model.Remove(ref innerIter);
304 removed = true; 305 removed = true;
305 break; 306 break;
306 } 307 }
307 } 308 }
308 while (model.IterNext(ref innerIter)); 309 while (model.IterNext(ref innerIter));
309 310
310 if (removed) 311 if (removed)
311 { 312 {
312 break; 313 break;
313 } 314 }
314 } 315 }
315 } 316 }
316 } 317 }
317 while (model.IterNext(ref iter)); 318 while (model.IterNext(ref iter));
318 } 319 }
319 320
320 private void OnPointsValueChanged(WarFoundryObject obj, double before, double after) 321 private void OnPointsValueChanged(WarFoundryObject obj, double before, double after)
321 { 322 {
322 //Set points in panel 323 //Set points in panel
323 } 324 }
324 325
325 private void OnFailedUnitRequirement(List<FailedUnitRequirement> failedRequirement) 326 private void OnFailedUnitRequirement(List<FailedUnitRequirement> failedRequirement)
326 { 327 {
327 //Show error message in panel 328 //Show error message in panel
328 } 329 }
329 330
330 public Preferences Preferences 331 public Preferences Preferences
331 { 332 {
332 get { return preferences; } 333 get { return preferences; }
333 set { preferences = value; } 334 set { preferences = value; }
334 } 335 }
335 336
336 /*public AbstractNativeWarFoundryFactory Factory 337 /*public AbstractNativeWarFoundryFactory Factory
337 { 338 {
338 get { return WarFoundryFactoryFactory.GetFactoryFactory().GetFactory(Constants.ExecutablePath, factoryType); } 339 get { return WarFoundryFactoryFactory.GetFactoryFactory().GetFactory(Constants.ExecutablePath, factoryType); }
339 }*/ 340 }*/
340 341
341 protected void OnDeleteEvent (object sender, DeleteEventArgs a) 342 protected void OnDeleteEvent (object sender, DeleteEventArgs a)
342 { 343 {
343 Application.Quit (); 344 Application.Quit ();
344 a.RetVal = true; 345 a.RetVal = true;
345 } 346 }
380 381
381 protected virtual void OnSaveArmyActivated(object sender, System.EventArgs e) 382 protected virtual void OnSaveArmyActivated(object sender, System.EventArgs e)
382 { 383 {
383 SaveCurrentArmy(); 384 SaveCurrentArmy();
384 } 385 }
385 386
386 protected virtual void OnAddUnitActivated(object sender, System.EventArgs e) 387 protected virtual void OnAddUnitActivated(object sender, System.EventArgs e)
387 { 388 {
388 if (sender is ToolButton) 389 if (sender is ToolButton)
389 { 390 {
390 Category cat = null; 391 Category cat = null;
391 categoryMap.TryGetValue((ToolButton)sender, out cat); 392 categoryMap.TryGetValue((ToolButton)sender, out cat);
392 393
393 if (cat!=null) 394 if (cat!=null)
394 { 395 {
395 logger.DebugFormat("Show FrmNewUnit for {0}", cat.Name); 396 logger.DebugFormat("Show FrmNewUnit for {0}", cat.Name);
396 FrmNewUnit newUnit = new FrmNewUnit(WarFoundryCore.CurrentArmy.Race, cat, WarFoundryCore.CurrentArmy); 397 FrmNewUnit newUnit = new FrmNewUnit(WarFoundryCore.CurrentArmy.Race, cat, WarFoundryCore.CurrentArmy);
397 ResponseType response = (ResponseType)newUnit.Run(); 398 ResponseType response = (ResponseType)newUnit.Run();
398 newUnit.Hide(); 399 newUnit.Hide();
399 400
400 if (response==ResponseType.Ok) 401 if (response==ResponseType.Ok)
401 { 402 {
402 CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, WarFoundryCore.CurrentArmy.GetCategory(cat)); 403 CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, WarFoundryCore.CurrentArmy.GetCategory(cat));
403 commandStack.Execute(cmd); 404 commandStack.Execute(cmd);
404 } 405 }
405 406
406 newUnit.Dispose(); 407 newUnit.Dispose();
407 } 408 }
408 } 409 }
409 } 410 }
410 411
411 public CommandStack CommandStack 412 public CommandStack CommandStack
412 { 413 {
413 get { return commandStack; } 414 get { return commandStack; }
414 } 415 }
415 416
416 private void SetAppTitle() 417 private void SetAppTitle()
417 { 418 {
418 if (WarFoundryCore.CurrentArmy!=null) 419 if (WarFoundryCore.CurrentArmy!=null)
419 { 420 {
420 Title = AppTitle + " - " + WarFoundryCore.CurrentGameSystem.Name + " - " + WarFoundryCore.CurrentArmy.Name; 421 Title = AppTitle + " - " + WarFoundryCore.CurrentGameSystem.Name + " - " + WarFoundryCore.CurrentArmy.Name;
426 else 427 else
427 { 428 {
428 Title = AppTitle; 429 Title = AppTitle;
429 } 430 }
430 } 431 }
431 432
432 private void OnGameSystemChanged(GameSystem oldSys, GameSystem newSys) 433 private void OnGameSystemChanged(GameSystem oldSys, GameSystem newSys)
433 { 434 {
434 system = newSys; 435 system = newSys;
435 SetAppTitle(); 436 SetAppTitle();
436 miCreateArmy.Sensitive = system!=null; 437 miCreateArmy.Sensitive = system!=null;
437 newArmyButton.Sensitive = system!=null; 438 newArmyButton.Sensitive = system!=null;
438 RemoveCategoryButtons(); 439 RemoveCategoryButtons();
439 440
440 if (system!=null) 441 if (system!=null)
441 { 442 {
442 AddCategoryButtons(system.Categories); 443 AddCategoryButtons(system.Categories);
443 } 444 }
444 } 445 }
445 446
446 private void OnArmyChanged(Army oldArmy, Army newArmy) 447 private void OnArmyChanged(Army oldArmy, Army newArmy)
447 { 448 {
448 loadedArmyPath = null; 449 loadedArmyPath = null;
449 SetAppTitle(); 450 SetAppTitle();
450 SetArmyTree(newArmy); 451 SetArmyTree(newArmy);
451 452
452 if (oldArmy!=null) 453 if (oldArmy!=null)
453 { 454 {
454 oldArmy.UnitAdded-= UnitAddedMethod; 455 oldArmy.UnitAdded-= UnitAddedMethod;
455 oldArmy.UnitRemoved-= UnitRemovedMethod; 456 oldArmy.UnitRemoved-= UnitRemovedMethod;
456 oldArmy.PointsValueChanged-= PointsValueChangedMethod; 457 oldArmy.PointsValueChanged-= PointsValueChangedMethod;
457 oldArmy.FailedRequirement-=FailedUnitRequirementMethod; 458 oldArmy.FailedRequirement-=FailedUnitRequirementMethod;
458 } 459 }
459 460
460 unitToWidgetMap.Clear(); 461 unitToWidgetMap.Clear();
461 462
462 while (unitsNotebook.NPages > 0) 463 while (unitsNotebook.NPages > 0)
463 { 464 {
464 unitsNotebook.RemovePage(0); 465 unitsNotebook.RemovePage(0);
465 } 466 }
466 467
467 if (newArmy==null) 468 if (newArmy==null)
468 { 469 {
469 DisableCategoryButtons(); 470 DisableCategoryButtons();
470 } 471 }
471 else 472 else
481 { 482 {
482 RemoveCategoryButtons(); 483 RemoveCategoryButtons();
483 AddCategoryButtons(newArmy.Race.Categories); 484 AddCategoryButtons(newArmy.Race.Categories);
484 } 485 }
485 } 486 }
486 487
487 miCloseArmy.Sensitive = newArmy!=null; 488 miCloseArmy.Sensitive = newArmy!=null;
488 miSaveArmyAs.Sensitive = newArmy!=null; 489 miSaveArmyAs.Sensitive = newArmy!=null;
489 //New army has no changes, so we can't save it 490 //New army has no changes, so we can't save it
490 miSaveArmy.Sensitive = false; 491 miSaveArmy.Sensitive = false;
491 saveArmyButton.Sensitive = false; 492 saveArmyButton.Sensitive = false;
492 493
493 CommandStack.Reset(); 494 CommandStack.Reset();
494 SetPointsPanelText(); 495 SetPointsPanelText();
495 } 496 }
496 497
497 private void SetArmyTree(Army army) 498 private void SetArmyTree(Army army)
498 { 499 {
499 logger.Debug("Resetting tree"); 500 logger.Debug("Resetting tree");
500 TreeStore store = (TreeStore)treeUnits.Model; 501 TreeStore store = (TreeStore)treeUnits.Model;
501 store.Clear(); 502 store.Clear();
502 TreeIter iter; 503 TreeIter iter;
503 504
504 if (army!=null) 505 if (army!=null)
505 { 506 {
506 logger.Debug("Loading in categories to tree"); 507 logger.Debug("Loading in categories to tree");
507 508
508 foreach (ArmyCategory cat in army.Categories) 509 foreach (ArmyCategory cat in army.Categories)
509 { 510 {
510 logger.DebugFormat("Append category {0}", cat.Name); 511 logger.DebugFormat("Append category {0}", cat.Name);
511 iter = store.AppendValues(cat); 512 iter = store.AppendValues(cat);
512 513
513 foreach (IBBoard.WarFoundry.API.Objects.Unit unit in cat.GetUnits()) 514 foreach (IBBoard.WarFoundry.API.Objects.Unit unit in cat.GetUnits())
514 { 515 {
515 store.AppendValues(iter, unit); 516 store.AppendValues(iter, unit);
516 } 517 }
517 } 518 }
518 519
519 logger.Debug("Finished loading tree categories"); 520 logger.Debug("Finished loading tree categories");
520 } 521 }
521 } 522 }
522 523
523 private void DisableCategoryButtons() 524 private void DisableCategoryButtons()
524 { 525 {
525 SetCategoryButtonsSensitive(false); 526 SetCategoryButtonsSensitive(false);
526 } 527 }
527 528
528 private void EnableCategoryButtons() 529 private void EnableCategoryButtons()
529 { 530 {
530 SetCategoryButtonsSensitive(true); 531 SetCategoryButtonsSensitive(true);
531 } 532 }
532 533
533 private void SetCategoryButtonsSensitive(bool state) 534 private void SetCategoryButtonsSensitive(bool state)
534 { 535 {
535 int toolbarButtonCount = toolbar.Children.Length - 1; 536 int toolbarButtonCount = toolbar.Children.Length - 1;
536 logger.Debug("Last button index: "+toolbarButtonCount); 537 logger.Debug("Last button index: "+toolbarButtonCount);
537 538
538 for (int i = toolbarButtonCount; i > CATEGORY_BUTTON_SEPARATOR_INDEX; i--) 539 for (int i = toolbarButtonCount; i > CATEGORY_BUTTON_SEPARATOR_INDEX; i--)
539 { 540 {
540 logger.DebugFormat("Setting button {0} state to {1}", i, state); 541 logger.DebugFormat("Setting button {0} state to {1}", i, state);
541 toolbar.Children[i].Sensitive = state; 542 toolbar.Children[i].Sensitive = state;
542 } 543 }
543 } 544 }
544 545
545 private void RemoveCategoryButtons() 546 private void RemoveCategoryButtons()
546 { 547 {
547 int toolbarButtonCount = toolbar.Children.Length - 1; 548 int toolbarButtonCount = toolbar.Children.Length - 1;
548 549
549 for (int i = toolbarButtonCount; i > CATEGORY_BUTTON_SEPARATOR_INDEX; i--) 550 for (int i = toolbarButtonCount; i > CATEGORY_BUTTON_SEPARATOR_INDEX; i--)
550 { 551 {
551 toolbar.Remove(toolbar.Children[i]); 552 toolbar.Remove(toolbar.Children[i]);
552 } 553 }
553 554
554 categoryMap.Clear(); 555 categoryMap.Clear();
555 } 556 }
556 557
557 private void AddCategoryButtons(Category[] cats) 558 private void AddCategoryButtons(Category[] cats)
558 { 559 {
559 if (cats!=null && cats.Length > 0) 560 if (cats!=null && cats.Length > 0)
560 { 561 {
561 logger.DebugFormat("Toolbar button count: {0}. Adding {1} categories.", toolbar.Children.Length, cats.Length); 562 logger.DebugFormat("Toolbar button count: {0}. Adding {1} categories.", toolbar.Children.Length, cats.Length);
562 563
563 foreach (Category cat in cats) 564 foreach (Category cat in cats)
564 { 565 {
565 ToolButton button = new ToolButton("gtk-add"); 566 ToolButton button = new ToolButton("gtk-add");
566 button.Label = cat.Name; 567 button.Label = cat.Name;
567 button.TooltipText = "Add unit from "+cat.Name; 568 button.TooltipText = "Add unit from "+cat.Name;
569 categoryMap.Add(button, cat); 570 categoryMap.Add(button, cat);
570 button.Clicked+= new System.EventHandler(OnAddUnitActivated); 571 button.Clicked+= new System.EventHandler(OnAddUnitActivated);
571 toolbar.Insert(button, -1); 572 toolbar.Insert(button, -1);
572 } 573 }
573 } 574 }
574 575
575 toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX].Visible = cats!=null && cats.Length>0; 576 toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX].Visible = cats!=null && cats.Length>0;
576 577
577 toolbar.ShowAll(); 578 toolbar.ShowAll();
578 } 579 }
579 580
580 private void SetPointsPanelText() 581 private void SetPointsPanelText()
581 { 582 {
582 //TODO: Set the points value in the status bar 583 //TODO: Set the points value in the status bar
583 } 584 }
584 585
585 private void commandStack_CommandStackUpdated() 586 private void commandStack_CommandStackUpdated()
586 { 587 {
587 undoMenuButton.Sensitive = commandStack.CanUndo(); 588 undoMenuButton.Sensitive = commandStack.CanUndo();
588 miUndo.Sensitive = undoMenuButton.Sensitive; 589 miUndo.Sensitive = undoMenuButton.Sensitive;
589 redoMenuButton.Sensitive = commandStack.CanRedo(); 590 redoMenuButton.Sensitive = commandStack.CanRedo();
590 miRedo.Sensitive = redoMenuButton.Sensitive; 591 miRedo.Sensitive = redoMenuButton.Sensitive;
591 int redoLength = commandStack.RedoLength; 592 int redoLength = commandStack.RedoLength;
592 //TODO: Build menus for undo/redo and find way of adding tooltips 593 //TODO: Build menus for undo/redo and find way of adding tooltips
593 /*int maxRedo = Math.Min(10, redoLength); 594 /*int maxRedo = Math.Min(10, redoLength);
594 MenuItem[] menuItems = null; 595 MenuItem[] menuItems = null;
595 596
596 if (redoLength > 0) 597 if (redoLength > 0)
597 { 598 {
598 menuItems = new MenuItem[maxRedo]; 599 menuItems = new MenuItem[maxRedo];
599 Command com; 600 Command com;
600 MenuItem mi; 601 MenuItem mi;
603 { 604 {
604 com = commandStack.PeekRedoCommand(i+1); 605 com = commandStack.PeekRedoCommand(i+1);
605 606
606 if (com == null) 607 if (com == null)
607 { 608 {
608 break; 609 break;
609 } 610 }
610 611
611 mi = new MenuItem(com.Description); 612 mi = new MenuItem(com.Description);
612 mi.Click+=new EventHandler(redoMenu_Click); 613 mi.Click+=new EventHandler(redoMenu_Click);
613 menuItems[i] = mi; 614 menuItems[i] = mi;
628 } 629 }
629 630
630 int undoLength = commandStack.UndoLength; 631 int undoLength = commandStack.UndoLength;
631 /*int maxUndo = Math.Min(10, undoLength); 632 /*int maxUndo = Math.Min(10, undoLength);
632 MenuItem[] menuItemsUndo = null; 633 MenuItem[] menuItemsUndo = null;
633 634
634 if (undoLength > 0) 635 if (undoLength > 0)
635 { 636 {
636 menuItemsUndo = new MenuItem[maxUndo]; 637 menuItemsUndo = new MenuItem[maxUndo];
637 Command com; 638 Command com;
638 MenuItem mi; 639 MenuItem mi;
641 { 642 {
642 com = commandStack.PeekUndoCommand(i+1); 643 com = commandStack.PeekUndoCommand(i+1);
643 644
644 if (com == null) 645 if (com == null)
645 { 646 {
646 break; 647 break;
647 } 648 }
648 649
649 mi = new MenuItem(com.UndoDescription); 650 mi = new MenuItem(com.UndoDescription);
650 mi.Click+=new EventHandler(undoMenu_Click); 651 mi.Click+=new EventHandler(undoMenu_Click);
651 menuItemsUndo[i] = mi; 652 menuItemsUndo[i] = mi;
656 657
657 if (menuItemsUndo!=null && menuItemsUndo[0]!=null) 658 if (menuItemsUndo!=null && menuItemsUndo[0]!=null)
658 { 659 {
659 bttnUndo.ToolTipText = menuItemsUndo[0].Text; 660 bttnUndo.ToolTipText = menuItemsUndo[0].Text;
660 undoMenu.MenuItems.AddRange(menuItemsUndo); 661 undoMenu.MenuItems.AddRange(menuItemsUndo);
661 }*/ 662 }*/
662 //TODO: Put above code back when we have a dropdown version of the undo button 663 //TODO: Put above code back when we have a dropdown version of the undo button
663 if (undoLength > 0) 664 if (undoLength > 0)
664 { 665 {
665 //undoMenuButton.Tooltip = CommandStack.PeekUndoCommand().UndoDescription; 666 //undoMenuButton.Tooltip = CommandStack.PeekUndoCommand().UndoDescription;
666 } 667 }
667 668
668 saveArmyButton.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null && CanSave(); 669 saveArmyButton.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null && CanSave();
669 miSaveArmy.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null && CanSave(); 670 miSaveArmy.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null && CanSave();
670 } 671 }
671 672
672 private bool CanSave() 673 private bool CanSave()
673 { 674 {
674 return loadedArmyPath!=null && WarFoundryCore.CurrentArmy!=null && WarFoundrySaver.GetSaver()!=null; 675 return loadedArmyPath!=null && WarFoundryCore.CurrentArmy!=null && WarFoundrySaver.GetSaver()!=null;
675 } 676 }
676 677
678 { 679 {
679 if (CanSave()) 680 if (CanSave())
680 { 681 {
681 return SaveCurrentArmy(); 682 return SaveCurrentArmy();
682 } 683 }
683 else 684 else
684 { 685 {
685 return SaveCurrentArmyAs(); 686 return SaveCurrentArmyAs();
686 } 687 }
687 } 688 }
688 689
689 private bool OpenArmy() 690 private bool OpenArmy()
690 { 691 {
691 //TODO: Open dialog for file selection then open army 692 //TODO: Open dialog for file selection then open army
692 bool success = false; 693 bool success = false;
693 loadedArmyPath = null;//TODO: Set loaded file path 694 loadedArmyPath = null;//TODO: Set loaded file path
695 } 696 }
696 697
697 private bool SaveCurrentArmy() 698 private bool SaveCurrentArmy()
698 { 699 {
699 bool success = false; 700 bool success = false;
700 701
701 if (CanSave()) 702 if (CanSave())
702 { 703 {
703 try 704 try
704 { 705 {
705 if (WarFoundrySaver.GetSaver().Save(WarFoundryCore.CurrentArmy, loadedArmyPath)) 706 if (WarFoundrySaver.GetSaver().Save(WarFoundryCore.CurrentArmy, loadedArmyPath))
715 logger.Error("Saving army failed", ex); 716 logger.Error("Saving army failed", ex);
716 MessageDialog md = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "An error occured while saving the army. Please check the logs for details on what failed"); 717 MessageDialog md = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "An error occured while saving the army. Please check the logs for details on what failed");
717 md.Show(); 718 md.Show();
718 } 719 }
719 } 720 }
720 721
721 return success; 722 return success;
722 } 723 }
723 724
724 private bool SaveCurrentArmyAs() 725 private bool SaveCurrentArmyAs()
725 { 726 {
726 /*if (saveArmyDialog.Filter == "") 727 bool success = false;
727 { 728
728 string savePath = UserDataPath+Constants.DirectoryString+"armies"+Constants.DirectoryString; 729 if (WarFoundrySaver.GetSaver().Save(WarFoundryCore.CurrentArmy, Constants.UserDataPath+Constants.DirectoryString+"test.army"))
729 730 {
730 if (!Directory.Exists(savePath)) 731 miSaveArmy.Sensitive = false;
731 { 732 //bttnSaveArmy.Sensitive = false;
732 Directory.CreateDirectory(savePath); 733 CommandStack.setCleanMark();
733 } 734 loadedArmyPath = Constants.UserDataPath+Constants.DirectoryString+"test.army";
734 735 success = true;
735 saveArmyDialog.InitialDirectory = savePath;
736 saveArmyDialog.Filter = Translation.GetTranslation("armyFileFilter")+"|*.army";
737 saveArmyDialog.Title = Translation.GetTranslation("saveArmyDialog");
738 }
739
740 DialogResult dr = saveArmyDialog.ShowDialog(this);
741
742 if (dr == DialogResult.OK)
743 {
744 if (WarFoundrySaver.GetSaver().Save(WarFoundryCore.CurrentArmy, saveArmyDialog.FileName))
745 {
746 miSaveArmy.Enabled = false;
747 bttnSaveArmy.Enabled = false;
748 CommandStack.setCleanMark();
749 loadedArmyPath = saveArmyDialog.FileName;
750 return true;
751 }
752 else
753 {
754 MessageBox.Show(this, Translation.GetTranslation("SaveFailed"), Translation.GetTranslation("SaveFailedTitle"), MessageBoxButtons.OK, MessageBoxIcon.Error);
755 return false;
756 }
757 } 736 }
758 else 737 else
759 { 738 {
760 return false; 739 //MessageBox.Show(this, Translation.GetTranslation("SaveFailed"), Translation.GetTranslation("SaveFailedTitle"), MessageBoxButtons.OK, MessageBoxIcon.Error);
761 }*/ 740 }
762 return false; 741
763 } 742 return success;
764 743 }
744
765 private bool CloseCurrentArmy() 745 private bool CloseCurrentArmy()
766 { 746 {
767 if (WarFoundryCore.CurrentArmy!=null) 747 if (WarFoundryCore.CurrentArmy!=null)
768 { 748 {
769 bool canClose = false; 749 bool canClose = false;
770 750
771 if (CommandStack.IsDirty()) 751 if (CommandStack.IsDirty())
772 { 752 {
773 MessageDialog dia = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Question, ButtonsType.YesNo | ButtonsType.Cancel, "The army \""+WarFoundryCore.CurrentArmy.Name+"\" has been modified.\r\nSave changes before closing army?"); 753 MessageDialog dia = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Question, ButtonsType.YesNo | ButtonsType.Cancel, "The army \""+WarFoundryCore.CurrentArmy.Name+"\" has been modified.\r\nSave changes before closing army?");
774 ResponseType dr = (ResponseType)dia.Run(); 754 ResponseType dr = (ResponseType)dia.Run();
775 755
776 if (dr == ResponseType.Yes) 756 if (dr == ResponseType.Yes)
777 { 757 {
778 //They want to save so try to save it or prompt for save as 758 //They want to save so try to save it or prompt for save as
787 else 767 else
788 { 768 {
789 //Assume cancel or close with the X button 769 //Assume cancel or close with the X button
790 canClose = false; 770 canClose = false;
791 } 771 }
792 772
793 dia.Dispose(); 773 dia.Dispose();
794 } 774 }
795 else 775 else
796 { 776 {
797 //Nothing has changed so we can safely close 777 //Nothing has changed so we can safely close
820 { 800 {
821 logger.Debug("Create new army"); 801 logger.Debug("Create new army");
822 FrmNewArmy newArmy = new FrmNewArmy(WarFoundryCore.CurrentGameSystem); 802 FrmNewArmy newArmy = new FrmNewArmy(WarFoundryCore.CurrentGameSystem);
823 ResponseType type = (ResponseType)newArmy.Run(); 803 ResponseType type = (ResponseType)newArmy.Run();
824 newArmy.Hide(); 804 newArmy.Hide();
825 805
826 if (type == ResponseType.Ok) 806 if (type == ResponseType.Ok)
827 { 807 {
828 if (CloseCurrentArmy()) 808 if (CloseCurrentArmy())
829 { 809 {
830 WarFoundryCore.CurrentArmy = new Army(newArmy.SelectedRace, newArmy.ArmyName, newArmy.ArmySize); 810 WarFoundryCore.CurrentArmy = new Army(newArmy.SelectedRace, newArmy.ArmyName, newArmy.ArmySize);
832 } 812 }
833 else 813 else
834 { 814 {
835 logger.Debug("Create new army cancelled"); 815 logger.Debug("Create new army cancelled");
836 } 816 }
837 817
838 newArmy.Destroy(); 818 newArmy.Destroy();
839 } 819 }
840 820
841 private void ChangeCurrentGameSystem() 821 private void ChangeCurrentGameSystem()
842 { 822 {
843 logger.Debug("Changing game system"); 823 logger.Debug("Changing game system");
844 FrmChangeGameSystem dialog = new FrmChangeGameSystem(this); 824 FrmChangeGameSystem dialog = new FrmChangeGameSystem(this);
845 ResponseType type = (ResponseType)dialog.Run(); 825 ResponseType type = (ResponseType)dialog.Run();
846 dialog.Hide(); 826 dialog.Hide();
847 827
848 if (type == ResponseType.Ok) 828 if (type == ResponseType.Ok)
849 { 829 {
850 WarFoundryCore.CurrentGameSystem = dialog.SelectedSystem; 830 WarFoundryCore.CurrentGameSystem = dialog.SelectedSystem;
851 } 831 }
852 else 832 else
853 { 833 {
854 logger.Debug("Game system change cancelled"); 834 logger.Debug("Game system change cancelled");
855 } 835 }
856 836
857 dialog.Destroy(); 837 dialog.Destroy();
858 } 838 }
859 839
860 protected virtual void undoTBButtonActivated (object sender, System.EventArgs e) 840 protected virtual void undoTBButtonActivated (object sender, System.EventArgs e)
861 { 841 {
886 { 866 {
887 TreeModel model = treeUnits.Model; 867 TreeModel model = treeUnits.Model;
888 TreeIter iter; 868 TreeIter iter;
889 model.GetIter(out iter, args.Path); 869 model.GetIter(out iter, args.Path);
890 object obj = model.GetValue(iter, 0); 870 object obj = model.GetValue(iter, 0);
891 871
892 if (obj is IBBoard.WarFoundry.API.Objects.Unit) 872 if (obj is IBBoard.WarFoundry.API.Objects.Unit)
893 { 873 {
894 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj; 874 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj;
895 875
896 UnitDisplayWidget widget; 876 UnitDisplayWidget widget;
897 unitToWidgetMap.TryGetValue(unit, out widget); 877 unitToWidgetMap.TryGetValue(unit, out widget);
898 878
899 if (widget!=null) 879 if (widget!=null)
900 { 880 {
901 logger.DebugFormat("Selecting existing page for "+unit.Name); 881 logger.DebugFormat("Selecting existing page for "+unit.Name);
902 unitsNotebook.Page = unitsNotebook.PageNum(widget); 882 unitsNotebook.Page = unitsNotebook.PageNum(widget);
903 } 883 }