From aeaf019741c5e4d3e405059be9b4c7589ef6610d Mon Sep 17 00:00:00 2001 From: iluvadev <76512587+iluvadev@users.noreply.github.com> Date: Tue, 13 Dec 2022 17:52:14 +0100 Subject: [PATCH] Search messages missing feature --- src/XstReader.Api/XstMessage.cs | 8 +++ src/XstReader.Api/XstReader.Api.csproj | 6 +- .../XstMessageListControl.Designer.cs | 56 +++++++++++++++++- .../Controls/XstMessageListControl.cs | 30 ++++++++++ .../Controls/XstMessageListControl.resx | 3 + .../Properties/Resources.Designer.cs | 30 ++++++++++ src/XstReader/Properties/Resources.resx | 9 +++ .../Resources/close-circle-outline_16.png | Bin 0 -> 491 bytes src/XstReader/Resources/magnify.png | Bin 0 -> 492 bytes src/XstReader/Resources/magnify_18.png | Bin 0 -> 472 bytes src/XstReader/XstReader.App.csproj | 4 +- 11 files changed, 139 insertions(+), 7 deletions(-) create mode 100644 src/XstReader/Resources/close-circle-outline_16.png create mode 100644 src/XstReader/Resources/magnify.png create mode 100644 src/XstReader/Resources/magnify_18.png diff --git a/src/XstReader.Api/XstMessage.cs b/src/XstReader.Api/XstMessage.cs index daed01a..73e3346 100644 --- a/src/XstReader.Api/XstMessage.cs +++ b/src/XstReader.Api/XstMessage.cs @@ -92,6 +92,14 @@ public override string DisplayName [Description(@"Contains a list of carbon copy (Cc) recipient display names.")] public virtual string Cc => Properties[PropertyCanonicalName.PidTagDisplayCc]?.ValueAsStringSanitized; + /// + /// The Cc Summary of the Message + /// + [DisplayName("Display Bcc")] + [Category(@"Message Properties")] + [Description(@"Contains a list of clind carbon copy (Bcc) recipient display names.")] + public virtual string Bcc => Properties[PropertyCanonicalName.PidTagDisplayBcc]?.ValueAsStringSanitized; + /// /// The To Summary of the Message /// diff --git a/src/XstReader.Api/XstReader.Api.csproj b/src/XstReader.Api/XstReader.Api.csproj index f525b46..1e8a863 100644 --- a/src/XstReader.Api/XstReader.Api.csproj +++ b/src/XstReader.Api/XstReader.Api.csproj @@ -3,9 +3,9 @@ netstandard2.0 XstReader - 1.0.5 - 1.0.5 - 1.0.5 + 1.0.6 + 1.0.6 + 1.0.6 Properties True iluvadev diff --git a/src/XstReader/Controls/XstMessageListControl.Designer.cs b/src/XstReader/Controls/XstMessageListControl.Designer.cs index 3c766ca..2fdfc6f 100644 --- a/src/XstReader/Controls/XstMessageListControl.Designer.cs +++ b/src/XstReader/Controls/XstMessageListControl.Designer.cs @@ -28,8 +28,16 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.ObjectListView = new BrightIdeasSoftware.ObjectListView(); + this.HeaderPanel = new Krypton.Toolkit.KryptonPanel(); + this.SearchTextBox = new Krypton.Toolkit.KryptonTextBox(); + this.SearchTextButton = new Krypton.Toolkit.ButtonSpecAny(); + this.SearchTextCancelButton = new Krypton.Toolkit.ButtonSpecAny(); + this.TimerSearchText = new System.Windows.Forms.Timer(this.components); ((System.ComponentModel.ISupportInitialize)(this.ObjectListView)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.HeaderPanel)).BeginInit(); + this.HeaderPanel.SuspendLayout(); this.SuspendLayout(); // // ObjectListView @@ -40,26 +48,65 @@ private void InitializeComponent() this.ObjectListView.FullRowSelect = true; this.ObjectListView.GridLines = true; this.ObjectListView.IncludeColumnHeadersInCopy = true; - this.ObjectListView.Location = new System.Drawing.Point(0, 0); + this.ObjectListView.Location = new System.Drawing.Point(0, 32); this.ObjectListView.MultiSelect = false; this.ObjectListView.Name = "ObjectListView"; this.ObjectListView.ShowGroups = false; this.ObjectListView.ShowItemToolTips = true; - this.ObjectListView.Size = new System.Drawing.Size(633, 404); + this.ObjectListView.Size = new System.Drawing.Size(633, 372); this.ObjectListView.TabIndex = 0; this.ObjectListView.UseFilterIndicator = true; this.ObjectListView.UseFiltering = true; this.ObjectListView.View = System.Windows.Forms.View.Details; // + // HeaderPanel + // + this.HeaderPanel.Controls.Add(this.SearchTextBox); + this.HeaderPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.HeaderPanel.Location = new System.Drawing.Point(0, 0); + this.HeaderPanel.Name = "HeaderPanel"; + this.HeaderPanel.PanelBackStyle = Krypton.Toolkit.PaletteBackStyle.ControlGroupBox; + this.HeaderPanel.Size = new System.Drawing.Size(633, 32); + this.HeaderPanel.TabIndex = 1; + // + // SearchTextBox + // + this.SearchTextBox.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.SearchTextBox.ButtonSpecs.AddRange(new Krypton.Toolkit.ButtonSpecAny[] { + this.SearchTextButton, + this.SearchTextCancelButton}); + this.SearchTextBox.Location = new System.Drawing.Point(5, 5); + this.SearchTextBox.Name = "SearchTextBox"; + this.SearchTextBox.Size = new System.Drawing.Size(300, 23); + this.SearchTextBox.TabIndex = 0; + // + // SearchTextButton + // + this.SearchTextButton.Image = global::XstReader.App.Properties.Resources.magnify_18; + this.SearchTextButton.UniqueName = "1a634cb36357467a847069f7b81a5559"; + // + // SearchTextCancelButton + // + this.SearchTextCancelButton.Image = global::XstReader.App.Properties.Resources.close_circle_outline_16; + this.SearchTextCancelButton.UniqueName = "af041d7b1aac4bada07043a284a2bc48"; + // + // TimerSearchText + // + this.TimerSearchText.Interval = 500; + // // XstMessageListControl // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.ObjectListView); + this.Controls.Add(this.HeaderPanel); this.MinimumSize = new System.Drawing.Size(200, 100); this.Name = "XstMessageListControl"; this.Size = new System.Drawing.Size(633, 404); ((System.ComponentModel.ISupportInitialize)(this.ObjectListView)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.HeaderPanel)).EndInit(); + this.HeaderPanel.ResumeLayout(false); + this.HeaderPanel.PerformLayout(); this.ResumeLayout(false); } @@ -67,5 +114,10 @@ private void InitializeComponent() #endregion private BrightIdeasSoftware.ObjectListView ObjectListView; + private Krypton.Toolkit.KryptonPanel HeaderPanel; + private Krypton.Toolkit.KryptonTextBox SearchTextBox; + private Krypton.Toolkit.ButtonSpecAny SearchTextButton; + private System.Windows.Forms.Timer TimerSearchText; + private Krypton.Toolkit.ButtonSpecAny SearchTextCancelButton; } } diff --git a/src/XstReader/Controls/XstMessageListControl.cs b/src/XstReader/Controls/XstMessageListControl.cs index 5e05e88..17c6b55 100644 --- a/src/XstReader/Controls/XstMessageListControl.cs +++ b/src/XstReader/Controls/XstMessageListControl.cs @@ -18,6 +18,8 @@ public partial class XstMessageListControl : UserControl, IXstDataSourcedControl>, IXstElementSelectable { + private string _LastSearchedText = string.Empty; + public XstMessageListControl() { InitializeComponent(); @@ -31,8 +33,11 @@ private void Initialize() ObjectListView.Columns.Add(new OLVColumn("Subject", nameof(XstMessage.Subject)) { WordWrap = true, FillsFreeSpace = true }); ObjectListView.Columns.Add(new OLVColumn("From", nameof(XstMessage.From)) { Width = 150 }); ObjectListView.Columns.Add(new OLVColumn("To", nameof(XstMessage.To)) { Width = 150 }); + ObjectListView.Columns.Add(new OLVColumn("Cc", nameof(XstMessage.Cc)) { Width = 150 }); + //ObjectListView.Columns.Add(new OLVColumn("Bcc", nameof(XstMessage.Bcc)) { Width = 150 }); ObjectListView.Columns.Add(new OLVColumn("Date", nameof(XstMessage.Date)) { Width = 150 }); + ObjectListView.FormatRow += (s, e) => { if (e.Item.RowObject is XstMessage message) @@ -48,6 +53,30 @@ private void Initialize() ObjectListView.ItemSelectionChanged += (s, e) => RaiseSelectedItemChanged(); SetDataSource(null); + + SearchTextButton.Click += (s, e) => + { + TimerSearchText.Stop(); + _LastSearchedText = SearchTextBox.Text; + ObjectListView.ModelFilter = TextMatchFilter.Contains(ObjectListView, _LastSearchedText); + }; + SearchTextCancelButton.Click += (s, e) => + { + SearchTextBox.Clear(); + SearchTextButton.PerformClick(); + }; + SearchTextBox.TextChanged += (s, e) => + { + TimerSearchText.Start(); + SearchTextCancelButton.Enabled = string.IsNullOrEmpty(SearchTextBox.Text) ? ButtonEnabled.False : ButtonEnabled.Container; + }; + + TimerSearchText.Tick += (s, e) => + { + TimerSearchText.Stop(); + if (SearchTextBox.Text != _LastSearchedText) + SearchTextButton.PerformClick(); + }; } protected override void OnLoad(EventArgs e) @@ -68,6 +97,7 @@ protected override void OnLoad(EventArgs e) public void SetDataSource(IEnumerable? dataSource) { + SearchTextBox.Clear(); _DataSource = dataSource; ObjectListView.Objects = dataSource; RaiseSelectedItemChanged(); diff --git a/src/XstReader/Controls/XstMessageListControl.resx b/src/XstReader/Controls/XstMessageListControl.resx index f298a7b..586cc23 100644 --- a/src/XstReader/Controls/XstMessageListControl.resx +++ b/src/XstReader/Controls/XstMessageListControl.resx @@ -57,4 +57,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/src/XstReader/Properties/Resources.Designer.cs b/src/XstReader/Properties/Resources.Designer.cs index 6f058fa..e6af95b 100644 --- a/src/XstReader/Properties/Resources.Designer.cs +++ b/src/XstReader/Properties/Resources.Designer.cs @@ -130,6 +130,16 @@ internal static System.Drawing.Bitmap application_export { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap close_circle_outline_16 { + get { + object obj = ResourceManager.GetObject("close_circle_outline_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -440,6 +450,26 @@ internal static System.Drawing.Bitmap link { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap magnify { + get { + object obj = ResourceManager.GetObject("magnify", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap magnify_18 { + get { + object obj = ResourceManager.GetObject("magnify_18", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/src/XstReader/Properties/Resources.resx b/src/XstReader/Properties/Resources.resx index 66eb4d6..fcbc063 100644 --- a/src/XstReader/Properties/Resources.resx +++ b/src/XstReader/Properties/Resources.resx @@ -139,6 +139,9 @@ ..\Resources\application-export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\close-circle-outline_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\cog.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -232,6 +235,12 @@ ..\Resources\link.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\magnify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\magnify_18.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\microsoft-outlook.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/src/XstReader/Resources/close-circle-outline_16.png b/src/XstReader/Resources/close-circle-outline_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2345307aebfdb5907422219969688274ecc2c6 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?d}4kf#9d}?s_1_ zS>O>_45Sml_(QhSc_8Dhr;B5V#p$J&4gHuMc~~zTmuoQD(!wXm$L#X5nB8j1ZU@1R zpx_Awybex+ww%)wTsFpKM!aR25-}_3?ce+N>uughvbX-R)GL&_FJE!wcYKTOnTZ>Y z35(ru$rJl8axnkL5z$p^!V)ExthachG=u#|Mfah)33tlR&RJwElQ`$<@rlA-LTr`? zRd$6-Dm=9EJH@g3!xJ_29fvn9UBzhTQfc#e+I_dTqLU5Mp9@L}xBoXNY{{RqHS~;= zYkl{n$uI2QYJI!ny@^ltt*aF457)$rE)Nxt-CU8M*13LyZEmx7e`Z5>&bg_-4A++J zSyJ?ep?a;2zAGo^cA&>qOI#yLQW8s2t&)pUffR$0fsv7}ArKjd7@Aobm{}Q{Y8x0> k85k5Ab>BhJkei>9nO2Eg14F)X0#E~kr>mdKI;Vst06;XU^8f$< literal 0 HcmV?d00001 diff --git a/src/XstReader/Resources/magnify.png b/src/XstReader/Resources/magnify.png new file mode 100644 index 0000000000000000000000000000000000000000..77e5cec0ef6f0ce2697fb243f591e564ca83522b GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?d}4kf#9d}?s_1_ zS>O>_45Sml_(QhSc_8DRr;B5V$MLt59l4quMB40CUI__JY%f^I8oT)1Bf~|~Q!09_ z+&xowZ_~{Q?yfwf^1@_R_agbW_D}o&PyT58V|A;V15ZqY%!vkGfo;6+7_}b+7EgPW zy+r8`o67--7v8;3Y8f|P3*r8*ZL^P!Gly}bi5pwI%D%0-50rY7o6if!r*WTHx-tI) z?~&=VndV;l9J(s|MX~q4?TpbYxt;IFygK)-%jwOsj3jOb)BC^VDpu4#`nZeTb8<_#uiql2HFM& lRt5(5Tc$UlXvob^$xN%ntzq3weNYrIc)I$ztaD0e0s#64t=Iqn literal 0 HcmV?d00001 diff --git a/src/XstReader/Resources/magnify_18.png b/src/XstReader/Resources/magnify_18.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8c4709e63b2f79550afd09386eaced605e73a6 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweEpc6R~NK=9LfcRi5e zEbxdd2GR*&{2|-vJdknA)5S5w;`G^z8@-$oMc6;g7vCCKke8KJS|}hj>$RX%bWBuL z|2B@6CGH#4cLZ09taWu(aoOg%-0P-U#gb4MwFx^ zmZVxG7o`Fz1|tI_BV9uvG7d2`vobKUGBDFNFt9Q(IKI#928xE<{FKbJO57T@J?={Z PYGCkm^>bP0l+XkK-p`(H literal 0 HcmV?d00001 diff --git a/src/XstReader/XstReader.App.csproj b/src/XstReader/XstReader.App.csproj index 3a4dd9e..38f5308 100644 --- a/src/XstReader/XstReader.App.csproj +++ b/src/XstReader/XstReader.App.csproj @@ -13,8 +13,8 @@ https://github.com/iluvadev/XstReader git pst-file-viewer;outlook - 2.0.0 - 2.0.0 + 2.1.0 + 2.1.0 MS-PL XstReader 2.2.0