From 5adfd83627d8cd5ef69326dba6e219c6ddb053c1 Mon Sep 17 00:00:00 2001 From: Waldi Date: Fri, 15 Sep 2017 09:49:32 +0200 Subject: [PATCH 1/2] =?UTF-8?q?ein=20par=20kleinigkeiten=20fixes=20und=20n?= =?UTF-8?q?euer=20wait=20layer=20f=C3=BCr=20den=20chat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChatController/ChatControlWaitLayer.xaml | 165 ++++++++++++++++++ ChatController/ChatControlWaitLayer.xaml.cs | 15 ++ ChatController/ChatController.csproj | 8 + .../ChatKlassen/ChatControlExtensions.cs | 16 ++ ChatController/ChatMainControl.xaml | 15 +- ChatController/ChatMainControl.xaml.cs | 74 ++++++-- ChatController/HauptKlassen/Chat.cs | 11 +- ChatController/LoginControl.xaml.cs | 42 ++--- PrototypChat/.vs/PrototypChat/v15/.suo | Bin 97280 -> 90624 bytes PrototypChat/MainWindow.xaml.cs | 4 +- 10 files changed, 309 insertions(+), 41 deletions(-) create mode 100644 ChatController/ChatControlWaitLayer.xaml create mode 100644 ChatController/ChatControlWaitLayer.xaml.cs create mode 100644 ChatController/ChatKlassen/ChatControlExtensions.cs diff --git a/ChatController/ChatControlWaitLayer.xaml b/ChatController/ChatControlWaitLayer.xaml new file mode 100644 index 0000000..4feacf5 --- /dev/null +++ b/ChatController/ChatControlWaitLayer.xaml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ChatController/ChatControlWaitLayer.xaml.cs b/ChatController/ChatControlWaitLayer.xaml.cs new file mode 100644 index 0000000..496b153 --- /dev/null +++ b/ChatController/ChatControlWaitLayer.xaml.cs @@ -0,0 +1,15 @@ +using System.Windows.Controls; + +namespace BeWo.View +{ + /// + /// Interaction logic for WaitLayer.xaml + /// + public partial class ChatControlWaitLayer : UserControl + { + public ChatControlWaitLayer() + { + this.InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/ChatController/ChatController.csproj b/ChatController/ChatController.csproj index 683b040..5a38ec1 100644 --- a/ChatController/ChatController.csproj +++ b/ChatController/ChatController.csproj @@ -58,6 +58,7 @@ ChatEmojiiControl.xaml + @@ -76,6 +77,9 @@ + + ChatControlWaitLayer.xaml + @@ -90,6 +94,10 @@ Designer MSBuild:Compile + + MSBuild:Compile + Designer + diff --git a/ChatController/ChatKlassen/ChatControlExtensions.cs b/ChatController/ChatKlassen/ChatControlExtensions.cs new file mode 100644 index 0000000..0207ef9 --- /dev/null +++ b/ChatController/ChatKlassen/ChatControlExtensions.cs @@ -0,0 +1,16 @@ +using System; +using System.Windows.Threading; +using System.Windows; + +namespace ChatController.ChatKlassen +{ + public static class ChatControlExtensions + { + private static Action EmptyDelegatee = delegate() { }; + + public static void RefreshChatUI(this UIElement uiElement) + { + uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegatee); + } + } +} \ No newline at end of file diff --git a/ChatController/ChatMainControl.xaml b/ChatController/ChatMainControl.xaml index 8c12616..a89bb75 100644 --- a/ChatController/ChatMainControl.xaml +++ b/ChatController/ChatMainControl.xaml @@ -181,7 +181,7 @@ - + @@ -254,7 +254,7 @@ - + @@ -276,11 +276,12 @@ - + + diff --git a/ChatController/ChatMainControl.xaml.cs b/ChatController/ChatMainControl.xaml.cs index 4f2f9e6..1698f00 100644 --- a/ChatController/ChatMainControl.xaml.cs +++ b/ChatController/ChatMainControl.xaml.cs @@ -18,6 +18,7 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; +using BeWo.View; using ChatController.ChatKlassen; using ChatController.HauptKlassen; using ChatController.Klassen; @@ -77,7 +78,7 @@ namespace ChatController HorcheAlleGruppenNachrichten(); } - + public AktuellerKontakt GetAktuellenKontakt() { if (AktChatUser != null) @@ -129,7 +130,10 @@ namespace ChatController private void Clientlist_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { - if(Clientlist.SelectedItem != null) { + if(Clientlist.SelectedItem != null) + { + + StartWaiting(); Cursor = Cursors.Wait; scrollPrueferAktivieren = false; @@ -163,6 +167,8 @@ namespace ChatController HorcheAktivNachNachrichten(); Cursor = Cursors.Arrow; + + EndWaiting(); } } @@ -211,11 +217,9 @@ namespace ChatController var kontakt = (AktuellerKontakt)AktChatUser.Items[0]; _chat.Einfuegen(kontakt.GroupId); } - - //Bug Wegen Klient und so + private void Chat_OnContextMenuOpening(object sender, ContextMenuEventArgs e) { - //prüfe ob ein Bild angeclickt wurde var chatItems = Chat.SelectedItems; if (chatItems.Count > 0) @@ -274,15 +278,21 @@ namespace ChatController ContextItemSpeichernUnter.Visibility = Visibility.Collapsed; } - - //Bug prüfe ob der aktulle Chat partner ein Klient ist + //prüfe ob dokumentation erlaubt var kontakt = (AktuellerKontakt)AktChatUser.Items[0]; - if (true && Chat.ContextMenu.Items.Count > 2) + if (kontakt.CustomerPersonOid == null && Chat.ContextMenu.Items.Count > 2) { var contextItems = Chat.ContextMenu.Items; var ContextItemSpeichernUnter = (MenuItem)contextItems[2]; ContextItemSpeichernUnter.Visibility = Visibility.Collapsed; } + else if(Chat.ContextMenu.Items.Count > 2) + { + var contextItems = Chat.ContextMenu.Items; + var ContextItemSpeichernUnter = (MenuItem)contextItems[2]; + ContextItemSpeichernUnter.Visibility = Visibility.Visible; + } + if (Chat.ContextMenu.Items.Count == 0) { @@ -476,7 +486,9 @@ namespace ChatController //nix } else - { + { + Cursor = Cursors.Wait; + //StartWaiting(); scrollPrueferAktivieren = false; Chat.Items.MoveCurrentToFirst(); @@ -490,7 +502,9 @@ namespace ChatController Chat.ItemsSource = xy; - Chat.ScrollIntoView(item); + Chat.ScrollIntoView(item); + //EndWaiting(); + Cursor = Cursors.Arrow; } } } @@ -714,7 +728,7 @@ namespace ChatController #endregion - #region Zeige Erhaltene Daten An In Dem Fall Bilder Zurzeit + #region Zeige Erhaltene Daten per doppelclick An In Dem Fall Bilder Zurzeit private void Chat_OnMouseDoubleClick(object sender, MouseButtonEventArgs e) { @@ -774,5 +788,43 @@ namespace ChatController #endregion + #region Wait Layer + + private ChatControlWaitLayer _waitLayer = null; + + public void StartWaiting() + { + Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)StartWaitingImmediately); + } + + public void StartWaitingImmediately() + { + if (_waitLayer == null) + { + _waitLayer = new ChatControlWaitLayer(); + //Grid.SetColumnSpan(_waitLayer, 3); + Grid.SetRowSpan(_waitLayer, 3); + GridRechts.Children.Add(_waitLayer); + Panel.SetZIndex(_waitLayer, int.MaxValue); + _waitLayer.RefreshChatUI(); + } + } + + public void EndWaiting() + { + Dispatcher.BeginInvoke( + DispatcherPriority.Background, + (Action)delegate + { + if (_waitLayer != null) + { + GridRechts.Children.Remove(_waitLayer); + _waitLayer = null; + } + }); + } + + #endregion + } } diff --git a/ChatController/HauptKlassen/Chat.cs b/ChatController/HauptKlassen/Chat.cs index cb2e0af..4261a6a 100644 --- a/ChatController/HauptKlassen/Chat.cs +++ b/ChatController/HauptKlassen/Chat.cs @@ -64,6 +64,7 @@ namespace ChatController.HauptKlassen var lastMS = value.LastMessage; + if (lastMS != null) { if (lastMS.Text != null) @@ -72,6 +73,12 @@ namespace ChatController.HauptKlassen timestamp = DateTime.Parse(lastMS.Timestamp.Date); } } + + if (message.Equals("") && value.LastMessage != null && !value.LastMessage.File.Equals("")) + { + message = Path.GetFileName(value.LastMessage.File); + } + //null steht für employee Kontaktliste.Add(new KontaktlistBuilder(value.Name, AvatarToImageSourceConverter(value.Avatar), message, timestamp, value.Oid, null)); @@ -169,7 +176,7 @@ namespace ChatController.HauptKlassen if (DokumentExtension.Contains(Path.GetExtension(ChatMessage.File).ToUpperInvariant())) { - Messages.Add(new KontaktMessageBuilder(ChatMessage.User_Name, ChatMessage.Text, + Messages.Add(new KontaktMessageBuilder(ChatMessage.User_Name, Path.GetFileName(ChatMessage.File), timeformated.ToString("dd MMMM yyyy HH:mm:ss"), true,ChatMessage.File, timeformated)); } @@ -201,7 +208,7 @@ namespace ChatController.HauptKlassen if (DokumentExtension.Contains(Path.GetExtension(ChatMessage.File).ToUpperInvariant())) { //Dokument - Messages.Add(new KontaktMessageBuilder(ChatMessage.User_Name, ChatMessage.Text, + Messages.Add(new KontaktMessageBuilder(ChatMessage.User_Name,Path.GetFileName(ChatMessage.File), timeformated.ToString("dd MMMM yyyy HH:mm:ss"), false, ChatMessage.File, timeformated)); } diff --git a/ChatController/LoginControl.xaml.cs b/ChatController/LoginControl.xaml.cs index 771bec5..bf27fa0 100644 --- a/ChatController/LoginControl.xaml.cs +++ b/ChatController/LoginControl.xaml.cs @@ -142,35 +142,37 @@ namespace ChatController private void SpeichereDatenInDatei() { try - { - using (StreamWriter sw = new StreamWriter(_dateiPfad)) - { + { + if (!File.Exists(_dateiPfad)) { + using (StreamWriter sw = new StreamWriter(_dateiPfad)) + { - Encoding enc = new UTF8Encoding(); - var byt = enc.GetBytes(TextBoxKundennummer.Text); - var bytes = Convert.ToBase64String(byt); + Encoding enc = new UTF8Encoding(); + var byt = enc.GetBytes(TextBoxKundennummer.Text); + var bytes = Convert.ToBase64String(byt); - var byt2 = enc.GetBytes(TextBoxChatCode.Text); - var bytes2 = Convert.ToBase64String(byt2); + var byt2 = enc.GetBytes(TextBoxChatCode.Text); + var bytes2 = Convert.ToBase64String(byt2); - var byt3 = enc.GetBytes(TextBoxBenutzerName.Text); - var bytes3 = Convert.ToBase64String(byt3); + var byt3 = enc.GetBytes(TextBoxBenutzerName.Text); + var bytes3 = Convert.ToBase64String(byt3); - var byt4 = enc.GetBytes(TextBoxPasswort.Password); - var bytes4 = Convert.ToBase64String(byt4); + var byt4 = enc.GetBytes(TextBoxPasswort.Password); + var bytes4 = Convert.ToBase64String(byt4); - var byt5 = enc.GetBytes(Merken.IsChecked.ToString()); - var bytes5 = Convert.ToBase64String(byt5); + var byt5 = enc.GetBytes(Merken.IsChecked.ToString()); + var bytes5 = Convert.ToBase64String(byt5); - sw.WriteLine(bytes); - sw.WriteLine(bytes2); - sw.WriteLine(bytes3); - sw.WriteLine(bytes4); - sw.WriteLine(bytes5); + sw.WriteLine(bytes); + sw.WriteLine(bytes2); + sw.WriteLine(bytes3); + sw.WriteLine(bytes4); + sw.WriteLine(bytes5); - File.SetAttributes(_dateiPfad, FileAttributes.ReadOnly); + File.SetAttributes(_dateiPfad, FileAttributes.ReadOnly); + } } } catch (Exception e) diff --git a/PrototypChat/.vs/PrototypChat/v15/.suo b/PrototypChat/.vs/PrototypChat/v15/.suo index 70c3754f7f7cf9ac8b24b9fbc7ca7c02c5b48986..55dd87bddb19fa346faa1f6d8e24bac38c7df6fa 100644 GIT binary patch delta 3093 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 Q@}gC>8{3~9^d?*AAHY(`tN;K2 diff --git a/PrototypChat/MainWindow.xaml.cs b/PrototypChat/MainWindow.xaml.cs index 96f3ac7..c318b13 100644 --- a/PrototypChat/MainWindow.xaml.cs +++ b/PrototypChat/MainWindow.xaml.cs @@ -71,6 +71,7 @@ namespace PrototypChat ChatMainControl.InitMitChatdaten(x); + //ChatMainControl.AddContextMenu("In Dokumentation übernehmen", ChatMainControl_OnClickContextMenuItem); } @@ -106,7 +107,8 @@ namespace PrototypChat } } } - + + //private void ChatMainControl_OnClickContextMenuItem(String menuItem) //{ From ea64707439c1f2004c43e76cbeb3e3f4803b36fb Mon Sep 17 00:00:00 2001 From: Waldi Date: Fri, 15 Sep 2017 11:23:03 +0200 Subject: [PATCH 2/2] mini fixes --- ChatController/ChatMainControl.xaml | 13 +++++++++---- ChatController/ChatMainControl.xaml.cs | 6 +++++- ChatController/HauptKlassen/Chat.cs | 6 ++++++ PrototypChat/.vs/PrototypChat/v15/.suo | Bin 90624 -> 141824 bytes 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ChatController/ChatMainControl.xaml b/ChatController/ChatMainControl.xaml index a89bb75..03123f2 100644 --- a/ChatController/ChatMainControl.xaml +++ b/ChatController/ChatMainControl.xaml @@ -278,10 +278,15 @@ - + diff --git a/ChatController/ChatMainControl.xaml.cs b/ChatController/ChatMainControl.xaml.cs index 1698f00..979244a 100644 --- a/ChatController/ChatMainControl.xaml.cs +++ b/ChatController/ChatMainControl.xaml.cs @@ -676,7 +676,8 @@ namespace ChatController { if (liste.GroupId == neu.GroupId) { - if (!liste.ReceiveMs.Equals(neu.ReceiveMs)) { + if (!liste.ReceiveMs.Equals(neu.ReceiveMs)) { + liste.ReceiveMs = neu.ReceiveMs; if (neu.GroupId == aktuellerKontakt.GroupId) @@ -752,6 +753,7 @@ namespace ChatController #region Lade Dokument Herunter und Zeige es an private void OpenDokument_OnClick(object sender, RoutedEventArgs e) { + Cursor = Cursors.Wait; var btn = sender as System.Windows.Controls.Button; if (btn.Tag != null) @@ -762,6 +764,8 @@ namespace ChatController LoadDokument(link.ToString(),filename); } + + Cursor = Cursors.Arrow; } private void LoadDokument(string link, String filename) diff --git a/ChatController/HauptKlassen/Chat.cs b/ChatController/HauptKlassen/Chat.cs index 4261a6a..31f1b1a 100644 --- a/ChatController/HauptKlassen/Chat.cs +++ b/ChatController/HauptKlassen/Chat.cs @@ -733,6 +733,12 @@ namespace ChatController.HauptKlassen timestamp = DateTime.Parse(lastMS.Timestamp.Date); } } + + if (message.Equals("") && value.LastMessage != null && !value.LastMessage.File.Equals("")) + { + message = Path.GetFileName(value.LastMessage.File); + } + //null steht für employee Kontakt.Add(new KontaktlistBuilder(value.Name, AvatarToImageSourceConverter(value.Avatar), message, timestamp, value.Oid, null)); diff --git a/PrototypChat/.vs/PrototypChat/v15/.suo b/PrototypChat/.vs/PrototypChat/v15/.suo index 55dd87bddb19fa346faa1f6d8e24bac38c7df6fa..c6ee189eb522c53e33b1e1e305a9970059cca244 100644 GIT binary patch delta 4321 zcmeHKe@v9;9e=;~gL@B8IF94^4KE;-q8^+mGCan?9m)^|4ywgD239*`n9@kI;uH?l zxTLtkeWP!iT7tvXWnFE{+i*!^^-M|AOw-oRc3EcDtXr44{s32Mhpn*h_kJ`87Tabn z`(sbuPoD4d`*}X!AJ6-EMzx;HVqbo?5KcxxSV*#pFf~0r&DB82AXt?1)>7ziYxSyH zquRP2`h(i~JGh5?nZYY4n^-pN#dOZs%dS zPQ%tApG$}?j=0Qic^X5je`5jdg0(1YXIMl?$KieGZTaEcwwyvwk@S!SJM zZR+EOpOUbTz?I5GszJ40MGB+Bw3>1aK}(1r=m;V~PlzNeAQ%V>2|PNQawFH#Y&<@e z%OU4z_vU-h_Fk6J*!VPzB^|yur@Q&;#KS-8LtBPfZu%kQ;8=bP`m-IhZ3|j*8#9C! zpX}d%IQZgeDEuL)0XeGyrKtY%tBzsv;!oJ;H3FpuwjNO z6&)*AXrG|E!&n!;4qfqfuc=ZqgWnoGET-lqq479jsuh<}A*{PF^>@-;jaJB`VFBG5 zDo8p^;N(r)k0lvmf18N?+Y1zbngi|<8UInu#f3G8j>4Vz))EV=UC4(Q)WZZY_n?7l|+fD{?{Ja}L=HZ9Nrw zu;Z!2-h|P4U3porw~{QA-9Q(bU}(Y)5o~H_pTQd?RRQ162(>BgYiaG?PX}o+dCeyG?^Kx%P92xSvF(C#LEv!rekH~ePT%><~Eq|Vxw`WuK~a@w~x}bQ4RA>U4Y~7x|Nz(93a-9UpN^#ALxkJ}Zsg#d9mV@e`+k554H&MX8Vp0H`#qAXU?_whTq`#{|W%-p;epMUf;_6?*dgfS#`-k>5k5;(~LR6H2L$KA+75S>S81!EYi)lHfJK6Pse?Kdy%CV=0g$e>Vkk z`6VLA7Lt7a6ll_@>Cy_^6|h=9FF~oAo1JA)B6~8x6Iq-Td_w63-^=A-0=X{-?DCch z_=)cgCsb) zCQK>UPCW-BYamfIV-uvF^vD>dKA1B7P7?BbU%26IwX7)uiPdVB)kTmIlwMyC&bj)O zNuLUOq%^!oiq=>k*pnYF_+G4qRjOMw%~u-#bbc*OA8P^!7<^?-@RSO+;h+Chg7!iY zw{%)?SGP!ij;xNYf%=lPMY5v>{9&_r9OI>>{PR8cy+>w(4#|UOvR7l5WWpoa1+Wz% O&90`$l;X+tz`p@+w)CX{ delta 2473 zcmbVOdr*{B6#ve*55C1scbBIKvMzxu0s%UaM6s}|vjdZ^fM|_5Y>xSegh9+FvPn(O zM3d|VuZ`L;D#(N)xW<=hLgS8EI$=iBA5MQ&_D78{6FqQ7w{yO4!N*uucjouqd(M5G z-#O==UEi?e3+nb}+eIPVOo9-FLz3@=LLt&>5Q&I#L}0143;bgBRMW`jcYn?N8d6a? zXlL8S?Qod=CN@DW+ooxR4QyPK(l`SrBM}mUPBUO{Md%S`#8iY45skoUrNxEEw^5=! z)X*qpetNi{iT#xDI4Rt#E7k8Z)Xf$Ic0k)^UmTuag1rZ^6j6qtv*`|MO(?f`yA)o< z4UgazF+<^{?!5b*u+@rZk@i7;{`kdWn+Ep zur^~-h7PxDzt^-~cugaMbUY_sjAfN6&$AkvS@zjQA3Vxkh0T7~PUv9`t~?VRaT1T}MNmri zc?-aA^O=e+?`!+r8f2*scWCS7pSyU=9B~1+ehz7D#Ac=h#*Io#$5>xyro2(V#q~h! z*=EaP1JJ4`aD(a?%kV>!ArQ*L2s)p7k+mP-)R%~$JVS}ztLHd{a#h8qUSwXoc|&{^&Y zKvxJ_YNPyar$Kp|*6@x%eNQuVwt`5d#;uxt4a?TOW~b{fWd67&IG649G$VsQwSkv+ z8@0T71-RMq6=m$)3yT7-l{c&`p*#Ljywd0J6Gy=&-)sj9bnXMOzZH%}@Y@H#DC(p6 z$Oug5Uygt)*+6wu0x%GN?4>CK!|{d602PID&Ot~4-g*e4VzzzR@f-46_yD+G!9K%JO z3zsl1zHabEmSOHuybS^$9e{w`*#nuthfY8N$y>OwAENnBC&Av&hFVaQ*`uSf