1 /* 2 * "GEDKeeper", the personal genealogical database editor. 3 * Copyright (C) 2009-2021 by Sergey V. Zhdanovskih. 4 * 5 * This file is part of "GEDKeeper". 6 * 7 * This program is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation, either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 using System; 22 using System.Collections.Generic; 23 using System.ComponentModel; 24 using System.Drawing; 25 using System.Security.Permissions; 26 using System.Windows.Forms; 27 using BSLib; 28 using BSLib.Design.Handlers; 29 using BSLib.Design.MVP.Controls; 30 using GDModel; 31 using GKCore; 32 using GKCore.Charts; 33 using GKCore.Controllers; 34 using GKCore.Export; 35 using GKCore.Interfaces; 36 using GKCore.MVP.Controls; 37 using GKCore.MVP.Views; 38 using GKCore.Types; 39 using GKUI.Components; 40 using GKUI.Platform; 41 42 namespace GKUI.Forms 43 { 44 public sealed partial class BaseWinSDI : CommonWindow, IBaseWindowView 45 { 46 #region Private fields 47 48 private readonly BaseWinController fController; 49 50 private readonly IBaseContext fContext; 51 52 #endregion 53 54 #region Public properties 55 56 public IBaseContext Context 57 { 58 get { return fContext; } 59 } 60 61 #endregion 62 63 #region View Interface 64 65 ITabControl IBaseWindowView.RecordTabs 66 { 67 get { return GetControlHandler<ITabControl>(tabsRecords); } 68 } 69 70 IMenuItem IBaseWindowView.ReportsItem 71 { 72 get { return GetControlHandler<IMenuItem>(miReports); } 73 } 74 75 IMenuItem IBaseWindowView.PluginsItem 76 { 77 get { return GetControlHandler<IMenuItem>(miPlugins); } 78 } 79 80 #endregion 81 82 #region Instance control 83 BaseWinSDI()84 public BaseWinSDI() 85 { 86 InitializeComponent(); 87 88 Icon = new Icon(GKUtils.LoadResourceStream("Resources.icon_gedkeeper.ico")); 89 tbFileNew.Image = UIHelper.LoadResourceImage("Resources.btn_create_new.gif"); 90 tbFileLoad.Image = UIHelper.LoadResourceImage("Resources.btn_load.gif"); 91 tbFileSave.Image = UIHelper.LoadResourceImage("Resources.btn_save.gif"); 92 tbRecordAdd.Image = UIHelper.LoadResourceImage("Resources.btn_rec_new.gif"); 93 tbRecordEdit.Image = UIHelper.LoadResourceImage("Resources.btn_rec_edit.gif"); 94 tbRecordDelete.Image = UIHelper.LoadResourceImage("Resources.btn_rec_delete.gif"); 95 tbFilter.Image = UIHelper.LoadResourceImage("Resources.btn_filter.gif"); 96 tbTreeAncestors.Image = UIHelper.LoadResourceImage("Resources.btn_tree_ancestry.gif"); 97 tbTreeDescendants.Image = UIHelper.LoadResourceImage("Resources.btn_tree_descendants.gif"); 98 tbTreeBoth.Image = UIHelper.LoadResourceImage("Resources.btn_tree_both.gif"); 99 tbPedigree.Image = UIHelper.LoadResourceImage("Resources.btn_scroll.gif"); 100 tbStats.Image = UIHelper.LoadResourceImage("Resources.btn_table.gif"); 101 tbPrev.Image = UIHelper.LoadResourceImage("Resources.btn_left.gif"); 102 tbNext.Image = UIHelper.LoadResourceImage("Resources.btn_right.gif"); 103 tbDocPreview.Image = UIHelper.LoadResourceImage("Resources.btn_preview.gif"); 104 tbDocPrint.Image = UIHelper.LoadResourceImage("Resources.btn_print.gif"); 105 tbSendMail.Image = UIHelper.LoadResourceImage("Resources.btn_mail.gif"); 106 107 tbDocPrint.Visible = false; 108 tbDocPreview.Visible = false; 109 110 UIHelper.FixToolStrip(ToolBar1); 111 112 AppHost.Instance.LoadWindow(this); 113 114 fController = new BaseWinController(this); 115 fContext = fController.Context; 116 ((BaseContext)fContext).ModifiedChanged += BaseContext_ModifiedChanged; 117 118 CreatePage(LangMan.LS(LSID.LSID_RPIndividuals), GDMRecordType.rtIndividual); 119 CreatePage(LangMan.LS(LSID.LSID_RPFamilies), GDMRecordType.rtFamily); 120 CreatePage(LangMan.LS(LSID.LSID_RPNotes), GDMRecordType.rtNote); 121 CreatePage(LangMan.LS(LSID.LSID_RPMultimedia), GDMRecordType.rtMultimedia); 122 CreatePage(LangMan.LS(LSID.LSID_RPSources), GDMRecordType.rtSource); 123 CreatePage(LangMan.LS(LSID.LSID_RPRepositories), GDMRecordType.rtRepository); 124 CreatePage(LangMan.LS(LSID.LSID_RPGroups), GDMRecordType.rtGroup); 125 CreatePage(LangMan.LS(LSID.LSID_RPResearches), GDMRecordType.rtResearch); 126 CreatePage(LangMan.LS(LSID.LSID_RPTasks), GDMRecordType.rtTask); 127 CreatePage(LangMan.LS(LSID.LSID_RPCommunications), GDMRecordType.rtCommunication); 128 CreatePage(LangMan.LS(LSID.LSID_RPLocations), GDMRecordType.rtLocation); 129 tabsRecords.SelectedIndex = 0; 130 131 SetLocale(); 132 } 133 Dispose(bool disposing)134 protected override void Dispose(bool disposing) 135 { 136 if (disposing) { 137 fController.Dispose(); 138 #if !MONO 139 if (components != null) components.Dispose(); 140 #endif 141 } 142 base.Dispose(disposing); 143 } 144 CreatePage(string pageText, GDMRecordType recType)145 private void CreatePage(string pageText, GDMRecordType recType) 146 { 147 tabsRecords.SuspendLayout(); 148 TabPage sheet = new TabPage(pageText); 149 tabsRecords.Controls.Add(sheet); 150 tabsRecords.ResumeLayout(false); 151 152 var summary = new HyperView(); 153 summary.BorderWidth = 4; 154 summary.Dock = DockStyle.Right; 155 summary.Size = new Size(300, 290); 156 summary.OnLink += mPersonSummaryLink; 157 158 Splitter spl = new Splitter(); 159 spl.Dock = DockStyle.Right; 160 spl.Size = new Size(4, 290); 161 spl.MinExtra = 100; 162 spl.MinSize = 100; 163 164 sheet.Controls.Add(summary); 165 sheet.Controls.Add(spl); 166 167 var recView = UIHelper.CreateRecordsView(sheet, fContext, recType); 168 recView.DoubleClick += miRecordEdit_Click; 169 recView.SelectedIndexChanged += List_SelectedIndexChanged; 170 recView.UpdateContents(); 171 recView.ContextMenuStrip = contextMenu; 172 173 sheet.Controls.SetChildIndex(spl, 1); 174 sheet.Controls.SetChildIndex(summary, 2); 175 176 fController.SetTabPart(recType, recView, summary); 177 } 178 BaseContext_ModifiedChanged(object sender, EventArgs e)179 private void BaseContext_ModifiedChanged(object sender, EventArgs e) 180 { 181 fController.SetMainTitle(); 182 } 183 184 [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode), SecurityPermission(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] WndProc(ref Message m)185 protected override void WndProc(ref Message m) 186 { 187 base.WndProc(ref m); 188 189 if (m.Msg == WFAppHost.WM_KEEPMODELESS) { 190 AppHost.Instance.WidgetsEnable(); 191 } 192 } 193 194 #endregion 195 196 #region Form handlers 197 Form_Activated(object sender, EventArgs e)198 private void Form_Activated(object sender, EventArgs e) 199 { 200 AppHost.Instance.BaseChanged(this); 201 } 202 Form_Deactivate(object sender, EventArgs e)203 private void Form_Deactivate(object sender, EventArgs e) 204 { 205 AppHost.Instance.BaseChanged(null); 206 } 207 Form_Load(object sender, EventArgs e)208 private void Form_Load(object sender, EventArgs e) 209 { 210 try { 211 ((IWorkWindow)this).UpdateSettings(); 212 213 fController.UpdatePluginsItems(); 214 UpdateMRU(); 215 UpdateControls(false); 216 } catch (Exception ex) { 217 Logger.WriteError("BaseWinSDI.Form_Load()", ex); 218 } 219 } 220 Form_Closing(object sender, FormClosingEventArgs e)221 private void Form_Closing(object sender, FormClosingEventArgs e) 222 { 223 e.Cancel = !CheckModified(); 224 if (e.Cancel) return; 225 226 fController.SaveListsSettings(); 227 228 AppHost.Instance.BaseClosed(this); 229 } 230 Form_Closed(object sender, FormClosedEventArgs e)231 private void Form_Closed(object sender, FormClosedEventArgs e) 232 { 233 AppHost.Instance.CloseWindow(this); 234 } 235 Form_KeyDown(object sender, KeyEventArgs e)236 private void Form_KeyDown(object sender, KeyEventArgs e) 237 { 238 switch (e.KeyCode) { 239 /*case Keys.I: 240 ItemAdd(); 241 break; 242 case Keys.D: 243 ItemDelete(); 244 break;*/ 245 246 case Keys.Return: 247 if (e.Control) { 248 EditRecord(); 249 } 250 break; 251 252 case Keys.F12: 253 break; 254 255 /*case Keys.F: 256 if (e.Control) { 257 QuickFind(); 258 } 259 break;*/ 260 } 261 } 262 contextMenu_Opening(object sender, CancelEventArgs e)263 private void contextMenu_Opening(object sender, CancelEventArgs e) 264 { 265 IListView recView = contextMenu.SourceControl as GKListView; 266 267 miContRecordDuplicate.Enabled = (recView == fController.GetRecordsViewByType(GDMRecordType.rtIndividual)); 268 } 269 miRecordAdd_Click(object sender, EventArgs e)270 private void miRecordAdd_Click(object sender, EventArgs e) 271 { 272 AddRecord(); 273 } 274 miRecordEdit_Click(object sender, EventArgs e)275 private void miRecordEdit_Click(object sender, EventArgs e) 276 { 277 EditRecord(); 278 } 279 miRecordDelete_Click(object sender, EventArgs e)280 private void miRecordDelete_Click(object sender, EventArgs e) 281 { 282 DeleteRecord(); 283 } 284 miRecordDuplicate_Click(object sender, EventArgs e)285 private void miRecordDuplicate_Click(object sender, EventArgs e) 286 { 287 DuplicateRecord(); 288 } 289 miRecordMerge_Click(object sender, EventArgs e)290 private void miRecordMerge_Click(object sender, EventArgs e) 291 { 292 var recView = contextMenu.SourceControl as GKListView; 293 if (recView != null) { 294 var items = recView.GetSelectedItems(); 295 fController.ShowRecMerge( 296 items.Count > 0 ? items[0] as GDMRecord : null, 297 items.Count > 1 ? items[1] as GDMRecord : null 298 ); 299 } 300 } 301 List_SelectedIndexChanged(object sender, EventArgs e)302 private void List_SelectedIndexChanged(object sender, EventArgs e) 303 { 304 if (sender != null) { 305 fController.ChangeListItem((IListViewEx)sender); 306 AppHost.Instance.SelectedIndexChanged(this); 307 } 308 } 309 tabsRecords_SelectedIndexChanged(object sender, EventArgs e)310 private void tabsRecords_SelectedIndexChanged(object sender, EventArgs e) 311 { 312 AppHost.Instance.UpdateControls(false); 313 AppHost.Instance.TabChanged(this); 314 } 315 mPersonSummaryLink(object sender, string linkName)316 private void mPersonSummaryLink(object sender, string linkName) 317 { 318 fController.SelectSummaryLink(linkName); 319 } 320 321 #endregion 322 323 #region Basic function 324 GetSelectedRecordType()325 public GDMRecordType GetSelectedRecordType() 326 { 327 return fController.GetSelectedRecordType(); 328 } 329 GetRecordsViewByType(GDMRecordType recType)330 public IListViewEx GetRecordsViewByType(GDMRecordType recType) 331 { 332 return fController.GetRecordsViewByType(recType); 333 } 334 GetHyperViewByType(GDMRecordType recType)335 public IHyperView GetHyperViewByType(GDMRecordType recType) 336 { 337 return fController.GetHyperViewByType(recType); 338 } 339 GetRecordsListManByType(GDMRecordType recType)340 public IListManager GetRecordsListManByType(GDMRecordType recType) 341 { 342 return fController.GetRecordsListManByType(recType); 343 } 344 GetSelectedRecordEx()345 public GDMRecord GetSelectedRecordEx() 346 { 347 return fController.GetSelectedRecordEx(); 348 } 349 GetSelectedPerson()350 public GDMIndividualRecord GetSelectedPerson() 351 { 352 return fController.GetSelectedPerson(); 353 } 354 GetContentList(GDMRecordType recType)355 public List<GDMRecord> GetContentList(GDMRecordType recType) 356 { 357 return fController.GetContentList(recType); 358 } 359 ApplyFilter(GDMRecordType recType = GDMRecordType.rtNone)360 public void ApplyFilter(GDMRecordType recType = GDMRecordType.rtNone) 361 { 362 fController.ApplyFilter(recType); 363 } 364 SetExternalFilter(ExternalFilterHandler filterHandler, GDMRecordType recType = GDMRecordType.rtNone)365 public void SetExternalFilter(ExternalFilterHandler filterHandler, 366 GDMRecordType recType = GDMRecordType.rtNone) 367 { 368 fController.SetExternalFilter(filterHandler, recType); 369 } 370 SaveFileEx(bool saveAs)371 public void SaveFileEx(bool saveAs) 372 { 373 fController.SaveFileEx(saveAs); 374 } 375 CheckAutosave()376 public void CheckAutosave() 377 { 378 fController.CheckAutosave(); 379 } 380 CheckModified()381 public bool CheckModified() 382 { 383 bool result = true; 384 if (!fContext.Modified) return result; 385 386 DialogResult dialogResult = MessageBox.Show(LangMan.LS(LSID.LSID_FileSaveQuery), GKData.APP_TITLE, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); 387 switch (dialogResult) { 388 case DialogResult.Yes: 389 SaveFileEx(false); 390 break; 391 case DialogResult.No: 392 break; 393 case DialogResult.Cancel: 394 result = false; 395 break; 396 } 397 398 return result; 399 } 400 Clear()401 public void Clear() 402 { 403 fController.Clear(); 404 } 405 CreateNewFile()406 public void CreateNewFile() 407 { 408 fController.CreateNewFile(); 409 } 410 LoadFile(string fileName)411 public void LoadFile(string fileName) 412 { 413 fController.LoadFile(fileName); 414 } 415 SaveFile(string fileName)416 public void SaveFile(string fileName) 417 { 418 fController.SaveFile(fileName); 419 } 420 RefreshLists(bool columnsChanged)421 public void RefreshLists(bool columnsChanged) 422 { 423 fController.RefreshLists(columnsChanged); 424 } 425 RefreshRecordsView(GDMRecordType recType)426 public void RefreshRecordsView(GDMRecordType recType) 427 { 428 fController.RefreshRecordsView(recType); 429 } 430 UpdateChangedRecords(GDMRecord select = null)431 public void UpdateChangedRecords(GDMRecord select = null) 432 { 433 fController.UpdateChangedRecords(select); 434 } 435 NotifyRecord(GDMRecord record, RecordAction action)436 public void NotifyRecord(GDMRecord record, RecordAction action) 437 { 438 fController.NotifyRecord(record, action); 439 } 440 AllowFilter()441 public bool AllowFilter() 442 { 443 return true; 444 } 445 SetFilter()446 public void SetFilter() 447 { 448 fController.SetFilter(); 449 } 450 ShowMedia(GDMMultimediaRecord mediaRec, bool modal)451 public void ShowMedia(GDMMultimediaRecord mediaRec, bool modal) 452 { 453 if (mediaRec == null) 454 throw new ArgumentNullException("mediaRec"); 455 456 GDMFileReferenceWithTitle fileRef = mediaRec.FileReferences[0]; 457 if (fileRef == null) return; 458 459 if (!GKUtils.UseEmbeddedViewer(fileRef.MultimediaFormat)) { 460 string targetFile = fContext.MediaLoad(fileRef); 461 GKUtils.LoadExtFile(targetFile); 462 } else { 463 //var mediaViewer = AppHost.Container.Resolve<IMediaViewerWin>(this); 464 MediaViewerWin mediaViewer = new MediaViewerWin(this); 465 try { 466 try { 467 mediaViewer.Multimedia = mediaRec; 468 mediaViewer.FileRef = fileRef; 469 if (modal) { 470 mediaViewer.ShowDialog(); 471 } else { 472 mediaViewer.ShowInTaskbar = true; 473 mediaViewer.Show(); 474 } 475 } finally { 476 if (modal) mediaViewer.Dispose(); 477 } 478 } catch (Exception ex) { 479 if (mediaViewer != null) mediaViewer.Dispose(); 480 Logger.WriteError("BaseWinSDI.ShowMedia()", ex); 481 } 482 } 483 } 484 485 #endregion 486 487 #region ILocalizable implementation 488 SetLocale()489 public override void SetLocale() 490 { 491 miFile.Text = LangMan.LS(LSID.LSID_MIFile); 492 miEdit.Text = LangMan.LS(LSID.LSID_MIEdit); 493 miPedigree.Text = LangMan.LS(LSID.LSID_MIPedigree); 494 miService.Text = LangMan.LS(LSID.LSID_MIService); 495 //miWindow.Text = LangMan.LS(LSID.LSID_MIWindow); 496 miHelp.Text = LangMan.LS(LSID.LSID_MIHelp); 497 498 miFileNew.Text = LangMan.LS(LSID.LSID_MIFileNew); 499 miFileLoad.Text = LangMan.LS(LSID.LSID_MIFileLoad); 500 miMRUFiles.Text = LangMan.LS(LSID.LSID_MIMRUFiles); 501 miFileSave.Text = LangMan.LS(LSID.LSID_MIFileSave); 502 miFileSaveAs.Text = LangMan.LS(LSID.LSID_MIFileSaveAs); 503 miFileClose.Text = LangMan.LS(LSID.LSID_MIFileClose); 504 miFileProperties.Text = LangMan.LS(LSID.LSID_MIFileProperties) + @"..."; 505 miExport.Text = LangMan.LS(LSID.LSID_MIExport); 506 miExportToFamilyBook.Text = LangMan.LS(LSID.LSID_MIExportToFamilyBook); 507 miExportToTreesAlbum.Text = LangMan.LS(LSID.LSID_TreesAlbum); 508 miExportToExcelFile.Text = LangMan.LS(LSID.LSID_MIExportToExcelFile); 509 miExit.Text = LangMan.LS(LSID.LSID_MIExit); 510 511 miRecordAdd.Text = LangMan.LS(LSID.LSID_MIRecordAdd); 512 miRecordEdit.Text = LangMan.LS(LSID.LSID_MIRecordEdit); 513 miRecordDelete.Text = LangMan.LS(LSID.LSID_MIRecordDelete); 514 515 miTreeAncestors.Text = LangMan.LS(LSID.LSID_MITreeAncestors); 516 miTreeDescendants.Text = LangMan.LS(LSID.LSID_MITreeDescendants); 517 miTreeBoth.Text = LangMan.LS(LSID.LSID_MITreeBoth); 518 miPedigreeAscend.Text = LangMan.LS(LSID.LSID_MIPedigreeAscend); 519 miPedigree_dAboville.Text = LangMan.LS(LSID.LSID_MIPedigree_dAboville); 520 miPedigree_Konovalov.Text = LangMan.LS(LSID.LSID_MIPedigree_Konovalov); 521 522 miMap.Text = LangMan.LS(LSID.LSID_MIMap) + @"..."; 523 miStats.Text = LangMan.LS(LSID.LSID_MIStats) + @"..."; 524 miSearch.Text = LangMan.LS(LSID.LSID_Search); 525 miAncestorsCircle.Text = LangMan.LS(LSID.LSID_AncestorsCircle); 526 miDescendantsCircle.Text = LangMan.LS(LSID.LSID_DescendantsCircle); 527 miRelationshipCalculator.Text = LangMan.LS(LSID.LSID_RelationshipCalculator); 528 529 miOrganizer.Text = LangMan.LS(LSID.LSID_MIOrganizer) + @"..."; 530 miSlideshow.Text = LangMan.LS(LSID.LSID_Slideshow) + @"..."; 531 miScripts.Text = LangMan.LS(LSID.LSID_MIScripts); 532 miTreeTools.Text = LangMan.LS(LSID.LSID_MITreeTools); 533 miFilter.Text = LangMan.LS(LSID.LSID_MIFilter) + @"..."; 534 miOptions.Text = LangMan.LS(LSID.LSID_MIOptions) + @"..."; 535 536 //miWinCascade.Text = LangMan.LS(LSID.LSID_MIWinCascade); 537 //miWinHTile.Text = LangMan.LS(LSID.LSID_MIWinHTile); 538 //miWinVTile.Text = LangMan.LS(LSID.LSID_MIWinVTile); 539 //miWinMinimize.Text = LangMan.LS(LSID.LSID_MIWinMinimize); 540 //miWinArrange.Text = LangMan.LS(LSID.LSID_MIWinArrange); 541 542 miContext.Text = LangMan.LS(LSID.LSID_MIContext); 543 miAbout.Text = LangMan.LS(LSID.LSID_MIAbout) + @"..."; 544 miLogSend.Text = LangMan.LS(LSID.LSID_LogSend); 545 miLogView.Text = LangMan.LS(LSID.LSID_LogView); 546 miPlugins.Text = LangMan.LS(LSID.LSID_Plugins); 547 miReports.Text = LangMan.LS(LSID.LSID_Reports); 548 549 SetToolTip(tbFileNew, LangMan.LS(LSID.LSID_FileNewTip)); 550 SetToolTip(tbFileLoad, LangMan.LS(LSID.LSID_FileLoadTip)); 551 SetToolTip(tbFileSave, LangMan.LS(LSID.LSID_FileSaveTip)); 552 SetToolTip(tbRecordAdd, LangMan.LS(LSID.LSID_RecordAddTip)); 553 SetToolTip(tbRecordEdit, LangMan.LS(LSID.LSID_RecordEditTip)); 554 SetToolTip(tbRecordDelete, LangMan.LS(LSID.LSID_RecordDeleteTip)); 555 SetToolTip(tbFilter, LangMan.LS(LSID.LSID_FilterTip)); 556 SetToolTip(tbTreeAncestors, LangMan.LS(LSID.LSID_TreeAncestorsTip)); 557 SetToolTip(tbTreeDescendants, LangMan.LS(LSID.LSID_TreeDescendantsTip)); 558 SetToolTip(tbTreeBoth, LangMan.LS(LSID.LSID_TreeBothTip)); 559 SetToolTip(tbPedigree, LangMan.LS(LSID.LSID_PedigreeTip)); 560 miPedigree_dAboville2.Text = LangMan.LS(LSID.LSID_Pedigree_dAbovilleTip); 561 miPedigree_Konovalov2.Text = LangMan.LS(LSID.LSID_Pedigree_KonovalovTip); 562 SetToolTip(tbStats, LangMan.LS(LSID.LSID_StatsTip)); 563 564 SetToolTip(tbDocPrint, LangMan.LS(LSID.LSID_DocPrint)); 565 SetToolTip(tbDocPreview, LangMan.LS(LSID.LSID_DocPreview)); 566 567 SetToolTip(tbPrev, LangMan.LS(LSID.LSID_PrevRec)); 568 SetToolTip(tbNext, LangMan.LS(LSID.LSID_NextRec)); 569 570 int num = miPlugins.DropDownItems.Count; 571 for (int i = 0; i < num; i++) { 572 ToolStripItem mi = miPlugins.DropDownItems[i]; 573 IPlugin plugin = (IPlugin)mi.Tag; 574 mi.Text = plugin.DisplayName; 575 } 576 577 tabsRecords.TabPages[ 0].Text = LangMan.LS(LSID.LSID_RPIndividuals); 578 tabsRecords.TabPages[ 1].Text = LangMan.LS(LSID.LSID_RPFamilies); 579 tabsRecords.TabPages[ 2].Text = LangMan.LS(LSID.LSID_RPNotes); 580 tabsRecords.TabPages[ 3].Text = LangMan.LS(LSID.LSID_RPMultimedia); 581 tabsRecords.TabPages[ 4].Text = LangMan.LS(LSID.LSID_RPSources); 582 tabsRecords.TabPages[ 5].Text = LangMan.LS(LSID.LSID_RPRepositories); 583 tabsRecords.TabPages[ 6].Text = LangMan.LS(LSID.LSID_RPGroups); 584 tabsRecords.TabPages[ 7].Text = LangMan.LS(LSID.LSID_RPResearches); 585 tabsRecords.TabPages[ 8].Text = LangMan.LS(LSID.LSID_RPTasks); 586 tabsRecords.TabPages[ 9].Text = LangMan.LS(LSID.LSID_RPCommunications); 587 tabsRecords.TabPages[10].Text = LangMan.LS(LSID.LSID_RPLocations); 588 589 miContRecordAdd.Text = LangMan.LS(LSID.LSID_MIRecordAdd); 590 miContRecordEdit.Text = LangMan.LS(LSID.LSID_MIRecordEdit); 591 miContRecordDelete.Text = LangMan.LS(LSID.LSID_MIRecordDelete); 592 miContRecordDuplicate.Text = LangMan.LS(LSID.LSID_RecordDuplicate); 593 miContRecordMerge.Text = LangMan.LS(LSID.LSID_ToolOp_4); 594 595 miTreeCompare.Text = LangMan.LS(LSID.LSID_ToolOp_1); 596 miTreeMerge.Text = LangMan.LS(LSID.LSID_ToolOp_2); 597 miTreeSplit.Text = LangMan.LS(LSID.LSID_ToolOp_3); 598 miRecMerge.Text = LangMan.LS(LSID.LSID_ToolOp_4); 599 miFamilyGroups.Text = LangMan.LS(LSID.LSID_ToolOp_6); 600 miTreeCheck.Text = LangMan.LS(LSID.LSID_ToolOp_7); 601 miPatSearch.Text = LangMan.LS(LSID.LSID_ToolOp_8); 602 miPlacesManager.Text = LangMan.LS(LSID.LSID_ToolOp_9); 603 } 604 605 #endregion 606 607 #region IWorkWindow implementation 608 IWorkWindow.UpdateControls()609 void IWorkWindow.UpdateControls() 610 { 611 string statusLine = ""; 612 GDMRecordType recType = GetSelectedRecordType(); 613 IListViewEx rView = GetRecordsViewByType(recType); 614 if (rView != null) { 615 var listMan = rView.ListMan; 616 statusLine = LangMan.LS(LSID.LSID_SBRecords) + ": " + listMan.TotalCount.ToString(); 617 statusLine = statusLine + ", " + LangMan.LS(LSID.LSID_SBFiltered) + ": " + listMan.FilteredCount.ToString(); 618 } 619 620 StatusBar.Panels[0].Text = statusLine; 621 } 622 IWorkWindow.UpdateSettings()623 void IWorkWindow.UpdateSettings() 624 { 625 fController.UpdateSettings(); 626 } 627 IWorkWindow.NavNext()628 void IWorkWindow.NavNext() 629 { 630 fController.NavNext(); 631 } 632 IWorkWindow.NavPrev()633 void IWorkWindow.NavPrev() 634 { 635 fController.NavPrev(); 636 } 637 IWorkWindow.NavCanBackward()638 bool IWorkWindow.NavCanBackward() 639 { 640 return fController.NavCanBackward(); 641 } 642 IWorkWindow.NavCanForward()643 bool IWorkWindow.NavCanForward() 644 { 645 return fController.NavCanForward(); 646 } 647 AllowQuickSearch()648 public bool AllowQuickSearch() 649 { 650 return true; 651 } 652 IWorkWindow.FindAll(string searchPattern)653 IList<ISearchResult> IWorkWindow.FindAll(string searchPattern) 654 { 655 return fController.FindAll(searchPattern); 656 } 657 IWorkWindow.SelectByRec(GDMRecord record)658 void IWorkWindow.SelectByRec(GDMRecord record) 659 { 660 fController.SelectByRec(record); 661 } 662 IWorkWindow.QuickSearch()663 void IWorkWindow.QuickSearch() 664 { 665 if (!AllowQuickSearch()) return; 666 667 QuickSearchDlg qsDlg = new QuickSearchDlg(this); 668 669 Rectangle client = ClientRectangle; 670 qsDlg.Location = PointToScreen(new Point(client.Left, client.Bottom - qsDlg.Height)); 671 672 qsDlg.Show(); 673 } 674 675 #endregion 676 677 #region Record Management 678 DuplicateRecord()679 public void DuplicateRecord() 680 { 681 fController.DuplicateRecord(); 682 } 683 AddRecord()684 public void AddRecord() 685 { 686 fController.AddRecord(); 687 } 688 EditRecord()689 public void EditRecord() 690 { 691 fController.EditRecord(); 692 } 693 DeleteRecord()694 public void DeleteRecord() 695 { 696 fController.DeleteRecord(); 697 } 698 ShowRecordsTab(GDMRecordType recType)699 public void ShowRecordsTab(GDMRecordType recType) 700 { 701 tabsRecords.SelectedIndex = (int)recType - 1; 702 tabsRecords_SelectedIndexChanged(null, null); 703 } 704 SelectRecordByXRef(string xref, bool delayedTransition = false)705 public void SelectRecordByXRef(string xref, bool delayedTransition = false) 706 { 707 fController.SelectRecordByXRef(xref, delayedTransition); 708 } 709 GetRecordContent(GDMRecord record)710 public StringList GetRecordContent(GDMRecord record) 711 { 712 return fController.GetRecordContent(record); 713 } 714 RecordIsFiltered(GDMRecord record)715 public bool RecordIsFiltered(GDMRecord record) 716 { 717 return fController.RecordIsFiltered(record); 718 } 719 720 #endregion 721 722 #region From MainWin 723 tbDocPrint_Click(object sender, EventArgs e)724 private void tbDocPrint_Click(object sender, EventArgs e) 725 { 726 // obsolete 727 } 728 tbDocPreview_Click(object sender, EventArgs e)729 private void tbDocPreview_Click(object sender, EventArgs e) 730 { 731 // obsolete 732 } 733 Form_Resize(object sender, EventArgs e)734 private void Form_Resize(object sender, EventArgs e) 735 { 736 StatusBar.Panels[0].Width = Width - 50; 737 } 738 Restore()739 public void Restore() 740 { 741 if (WindowState == FormWindowState.Minimized) { 742 WindowState = FormWindowState.Normal; 743 } 744 } 745 Form_DragEnter(object sender, DragEventArgs e)746 private void Form_DragEnter(object sender, DragEventArgs e) 747 { 748 e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; 749 } 750 Form_DragDrop(object sender, DragEventArgs e)751 private void Form_DragDrop(object sender, DragEventArgs e) 752 { 753 try { 754 try { 755 AppHost.Instance.BeginLoading(); 756 757 var files = e.Data.GetData(DataFormats.FileDrop) as string[]; 758 if (files == null) return; 759 760 for (int i = 0; i < files.Length; i++) { 761 string fn = files[i]; 762 AppHost.Instance.LoadBase(this, fn); 763 } 764 } finally { 765 AppHost.Instance.EndLoading(); 766 } 767 } catch (Exception ex) { 768 Logger.WriteError("BaseWinSDI.Form_DragDrop()", ex); 769 } 770 } 771 StatusBar_DrawItem(object sender, StatusBarDrawItemEventArgs sbdevent)772 private void StatusBar_DrawItem(object sender, StatusBarDrawItemEventArgs sbdevent) 773 { 774 UpdateShieldState(sbdevent); 775 } 776 UpdateShieldState(StatusBarDrawItemEventArgs sbdevent)777 private void UpdateShieldState(StatusBarDrawItemEventArgs sbdevent) 778 { 779 Bitmap img = (Bitmap)((ImageHandler)fController.GetShieldImage()).Handle; 780 if (img != null) { 781 sbdevent.Graphics.DrawImage(img, sbdevent.Bounds.Left, sbdevent.Bounds.Top); 782 } 783 } 784 StatusBar_PanelClick(object sender, StatusBarPanelClickEventArgs e)785 private void StatusBar_PanelClick(object sender, StatusBarPanelClickEventArgs e) 786 { 787 if (e.StatusBarPanel == StatusBarPanel2 && e.Clicks == 2) { 788 fContext.SwitchShieldState(); 789 StatusBar.Invalidate(); 790 } 791 } 792 MRUFileClick(object sender, EventArgs e)793 private void MRUFileClick(object sender, EventArgs e) 794 { 795 int idx = (int)((MenuItemEx)sender).Tag; 796 AppHost.Instance.LoadBase(this, AppHost.Options.MRUFiles[idx].FileName); 797 } 798 UpdateMRU()799 public void UpdateMRU() 800 { 801 try { 802 miMRUFiles.Enabled = (AppHost.Options.MRUFiles.Count > 0); 803 miMRUFiles.DropDownItems.Clear(); 804 MenuMRU.Items.Clear(); 805 806 int num = AppHost.Options.MRUFiles.Count; 807 for (int i = 0; i < num; i++) { 808 string fn = AppHost.Options.MRUFiles[i].FileName; 809 810 MenuItemEx mi = new MenuItemEx(fn, i); 811 mi.Click += MRUFileClick; 812 miMRUFiles.DropDownItems.Add(mi); 813 814 MenuItemEx tsmi = new MenuItemEx(fn, i); 815 tsmi.Click += MRUFileClick; 816 MenuMRU.Items.Add(tsmi); 817 } 818 } catch (Exception ex) { 819 Logger.WriteError("BaseWinSDI.UpdateMRU()", ex); 820 } 821 } 822 UpdateNavControls()823 public void UpdateNavControls() 824 { 825 try { 826 IWorkWindow workWin = this; 827 828 tbPrev.Enabled = (workWin != null && workWin.NavCanBackward()); 829 tbNext.Enabled = (workWin != null && workWin.NavCanForward()); 830 } catch (Exception ex) { 831 Logger.WriteError("BaseWinSDI.UpdateNavControls()", ex); 832 } 833 } 834 UpdateControls(bool forceDeactivate, bool blockDependent = false)835 public void UpdateControls(bool forceDeactivate, bool blockDependent = false) 836 { 837 try { 838 IWorkWindow workWin = AppHost.Instance.GetWorkWindow(); 839 IBaseWindow curBase = ((forceDeactivate) ? null : AppHost.Instance.GetCurrentFile()); 840 IChartWindow curChart = ((workWin is IChartWindow) ? ((IChartWindow) workWin) : null); 841 842 GDMRecordType rt = (curBase == null) ? GDMRecordType.rtNone : curBase.GetSelectedRecordType(); 843 bool baseEn = (rt != GDMRecordType.rtNone); 844 845 miFileSave.Enabled = baseEn || (curChart != null); 846 miFileSaveAs.Enabled = miFileSave.Enabled; 847 tbFileSave.Enabled = miFileSave.Enabled; 848 849 miRecordAdd.Enabled = baseEn; 850 tbRecordAdd.Enabled = miRecordAdd.Enabled; 851 miRecordEdit.Enabled = baseEn; 852 tbRecordEdit.Enabled = miRecordEdit.Enabled; 853 miRecordDelete.Enabled = baseEn; 854 tbRecordDelete.Enabled = miRecordDelete.Enabled; 855 miStats.Enabled = baseEn; 856 tbStats.Enabled = miStats.Enabled; 857 858 miFilter.Enabled = (workWin != null && workWin.AllowFilter()); 859 tbFilter.Enabled = miFilter.Enabled; 860 861 miSearch.Enabled = (workWin != null && workWin.AllowQuickSearch()); 862 863 tbDocPrint.Enabled = (curChart != null && curChart.AllowPrint()); 864 tbDocPreview.Enabled = (curChart != null && curChart.AllowPrint()); 865 866 miTreeTools.Enabled = baseEn; 867 miExportToFamilyBook.Enabled = baseEn; 868 miExportToTreesAlbum.Enabled = baseEn; 869 miExportToExcelFile.Enabled = baseEn; 870 miFileClose.Enabled = baseEn; 871 miFileProperties.Enabled = baseEn; 872 miOrganizer.Enabled = baseEn; 873 miSlideshow.Enabled = baseEn; 874 miScripts.Enabled = baseEn; 875 876 bool indivEn = baseEn && rt == GDMRecordType.rtIndividual; 877 878 miTreeAncestors.Enabled = indivEn; 879 tbTreeAncestors.Enabled = miTreeAncestors.Enabled; 880 miTreeDescendants.Enabled = indivEn; 881 tbTreeDescendants.Enabled = miTreeDescendants.Enabled; 882 miTreeBoth.Enabled = indivEn; 883 tbTreeBoth.Enabled = miTreeBoth.Enabled; 884 miPedigree.Enabled = indivEn; 885 tbPedigree.Enabled = miPedigree.Enabled; 886 miPedigree_dAboville.Enabled = indivEn; 887 miPedigree_Konovalov.Enabled = indivEn; 888 889 UpdateNavControls(); 890 891 if (workWin != null && !blockDependent) { 892 workWin.UpdateControls(); 893 } 894 } catch (Exception ex) { 895 Logger.WriteError("BaseWinSDI.UpdateControls()", ex); 896 } 897 } 898 miExit_Click(object sender, EventArgs e)899 private void miExit_Click(object sender, EventArgs e) 900 { 901 AppHost.Instance.Quit(); 902 } 903 miUndo_Click(object sender, EventArgs e)904 private void miUndo_Click(object sender, EventArgs e) 905 { 906 fController.Undo(); 907 } 908 miRedo_Click(object sender, EventArgs e)909 private void miRedo_Click(object sender, EventArgs e) 910 { 911 fController.Redo(); 912 } 913 miExportToFamilyBook_Click(object sender, EventArgs e)914 private void miExportToFamilyBook_Click(object sender, EventArgs e) 915 { 916 fController.ExportToFamilyBook(); 917 } 918 miExportToTreesAlbum_Click(object sender, EventArgs e)919 private void miExportToTreesAlbum_Click(object sender, EventArgs e) 920 { 921 fController.ExportToTreesAlbum(); 922 } 923 miExportToExcelFile_Click(object sender, EventArgs e)924 private void miExportToExcelFile_Click(object sender, EventArgs e) 925 { 926 fController.ExportToExcelFile(); 927 } 928 miFileProperties_Click(object sender, EventArgs e)929 private void miFileProperties_Click(object sender, EventArgs e) 930 { 931 fController.ShowFileProperties(); 932 } 933 miScripts_Click(object sender, EventArgs e)934 private void miScripts_Click(object sender, EventArgs e) 935 { 936 fController.ShowScripts(); 937 } 938 miTTTreeSplit_Click(object sender, EventArgs e)939 private void miTTTreeSplit_Click(object sender, EventArgs e) 940 { 941 fController.ShowTreeSplit(); 942 } 943 miTTTreeMerge_Click(object sender, EventArgs e)944 private void miTTTreeMerge_Click(object sender, EventArgs e) 945 { 946 fController.ShowTreeMerge(); 947 } 948 miTTTreeCompare_Click(object sender, EventArgs e)949 private void miTTTreeCompare_Click(object sender, EventArgs e) 950 { 951 fController.ShowTreeCompare(); 952 } 953 miTTTreeCheck_Click(object sender, EventArgs e)954 private void miTTTreeCheck_Click(object sender, EventArgs e) 955 { 956 fController.ShowTreeCheck(); 957 } 958 miTTRecMerge_Click(object sender, EventArgs e)959 private void miTTRecMerge_Click(object sender, EventArgs e) 960 { 961 fController.ShowRecMerge(null, null); 962 } 963 miTTPlacesManager_Click(object sender, EventArgs e)964 private void miTTPlacesManager_Click(object sender, EventArgs e) 965 { 966 fController.ShowPlacesManager(); 967 } 968 miTTPatSearch_Click(object sender, EventArgs e)969 private void miTTPatSearch_Click(object sender, EventArgs e) 970 { 971 fController.ShowPatSearch(); 972 } 973 miTTFamilyGroups_Click(object sender, EventArgs e)974 private void miTTFamilyGroups_Click(object sender, EventArgs e) 975 { 976 fController.ShowFamilyGroups(); 977 } 978 miOptions_Click(object sender, EventArgs e)979 private void miOptions_Click(object sender, EventArgs e) 980 { 981 AppHost.Instance.ShowOptions(); 982 } 983 miFileClose_Click(object sender, EventArgs e)984 private void miFileClose_Click(object sender, EventArgs e) 985 { 986 Close(); 987 } 988 miFileNew_Click(object sender, EventArgs e)989 private void miFileNew_Click(object sender, EventArgs e) 990 { 991 fController.NewFile(); 992 } 993 miFileLoad_Click(object sender, EventArgs e)994 private void miFileLoad_Click(object sender, EventArgs e) 995 { 996 fController.LoadFileEx(); 997 } 998 miFileSaveAs_Click(object sender, EventArgs e)999 private void miFileSaveAs_Click(object sender, EventArgs e) 1000 { 1001 SaveFileEx(true); 1002 } 1003 miFileSave_Click(object sender, EventArgs e)1004 private void miFileSave_Click(object sender, EventArgs e) 1005 { 1006 SaveFileEx(false); 1007 } 1008 miSearch_Click(object sender, EventArgs e)1009 private void miSearch_Click(object sender, EventArgs e) 1010 { 1011 (this as IWorkWindow).QuickSearch(); 1012 } 1013 miFilter_Click(object sender, EventArgs e)1014 private void miFilter_Click(object sender, EventArgs e) 1015 { 1016 fController.SetFilter(); 1017 } 1018 tbPrev_Click(object sender, EventArgs e)1019 private void tbPrev_Click(object sender, EventArgs e) 1020 { 1021 fController.NavPrev(); 1022 } 1023 tbNext_Click(object sender, EventArgs e)1024 private void tbNext_Click(object sender, EventArgs e) 1025 { 1026 fController.NavNext(); 1027 } 1028 tbSendMail_Click(object sender, EventArgs e)1029 private void tbSendMail_Click(object sender, EventArgs e) 1030 { 1031 fController.SendMail(); 1032 } 1033 miMap_Click(object sender, EventArgs e)1034 private void miMap_Click(object sender, EventArgs e) 1035 { 1036 fController.ShowMap(); 1037 } 1038 miOrganizer_Click(object sender, EventArgs e)1039 private void miOrganizer_Click(object sender, EventArgs e) 1040 { 1041 fController.ShowOrganizer(); 1042 } 1043 miRelationshipCalculator_Click(object sender, EventArgs e)1044 private void miRelationshipCalculator_Click(object sender, EventArgs e) 1045 { 1046 fController.ShowRelationshipCalculator(); 1047 } 1048 miSlideshow_Click(object sender, EventArgs e)1049 private void miSlideshow_Click(object sender, EventArgs e) 1050 { 1051 fController.ShowSlideshow(); 1052 } 1053 miStats_Click(object sender, EventArgs e)1054 private void miStats_Click(object sender, EventArgs e) 1055 { 1056 fController.ShowStats(); 1057 } 1058 miPedigreeAscend_Click(object sender, EventArgs e)1059 private void miPedigreeAscend_Click(object sender, EventArgs e) 1060 { 1061 fController.GeneratePedigree(PedigreeExporter.PedigreeKind.Ascend); 1062 } 1063 miPedigree_dAbovilleClick(object sender, EventArgs e)1064 private void miPedigree_dAbovilleClick(object sender, EventArgs e) 1065 { 1066 fController.GeneratePedigree(PedigreeExporter.PedigreeKind.Descend_dAboville); 1067 } 1068 miPedigree_KonovalovClick(object sender, EventArgs e)1069 private void miPedigree_KonovalovClick(object sender, EventArgs e) 1070 { 1071 fController.GeneratePedigree(PedigreeExporter.PedigreeKind.Descend_Konovalov); 1072 } 1073 miTreeAncestors_Click(object sender, EventArgs e)1074 private void miTreeAncestors_Click(object sender, EventArgs e) 1075 { 1076 fController.ShowTreeChart(TreeChartKind.ckAncestors); 1077 } 1078 miTreeDescendants_Click(object sender, EventArgs e)1079 private void miTreeDescendants_Click(object sender, EventArgs e) 1080 { 1081 fController.ShowTreeChart(TreeChartKind.ckDescendants); 1082 } 1083 miTreeBoth_Click(object sender, EventArgs e)1084 private void miTreeBoth_Click(object sender, EventArgs e) 1085 { 1086 fController.ShowTreeChart(TreeChartKind.ckBoth); 1087 } 1088 miAncestorsCircle_Click(object sender, EventArgs e)1089 private void miAncestorsCircle_Click(object sender, EventArgs e) 1090 { 1091 fController.ShowCircleChart(CircleChartType.Ancestors); 1092 } 1093 miDescendantsCircle_Click(object sender, EventArgs e)1094 private void miDescendantsCircle_Click(object sender, EventArgs e) 1095 { 1096 fController.ShowCircleChart(CircleChartType.Descendants); 1097 } 1098 miLogSend_Click(object sender, EventArgs e)1099 private void miLogSend_Click(object sender, EventArgs e) 1100 { 1101 fController.SendLog(); 1102 } 1103 miLogView_Click(object sender, EventArgs e)1104 private void miLogView_Click(object sender, EventArgs e) 1105 { 1106 fController.ShowLog(); 1107 } 1108 miAbout_Click(object sender, EventArgs e)1109 private void miAbout_Click(object sender, EventArgs e) 1110 { 1111 fController.ShowAbout(); 1112 } 1113 miContext_Click(object sender, EventArgs e)1114 private void miContext_Click(object sender, EventArgs e) 1115 { 1116 AppHost.Instance.ShowHelpTopic(""); 1117 } 1118 1119 #endregion 1120 } 1121 } 1122