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