From 33e5675b9ecf778af8961841feeb1a4543e149d5 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Thu, 12 Nov 2015 22:18:18 +0000 Subject: [PATCH] mal weiter gemacht --- svnsync.sln | 26 +++- svnsync/Controllers/ControllersTray.cs | 147 ++++++++++++++++++++++ svnsync/Controllers/ControllersWindow.cs | 53 ++++++++ svnsync/Form1.cs | 14 ++- svnsync/Helpers/Handles.cs | 34 +++++ svnsync/Helpers/StringHelper.cs | 24 ++++ svnsync/{ => Libraries}/Svn.cs | 36 ++++-- svnsync/Models/ModelsTray.cs | 37 ++++++ svnsync/Models/ModelsWindow.cs | 33 +++++ svnsync/Program.cs | 42 +++++++ svnsync/Properties/Resources.Designer.cs | 12 +- svnsync/Properties/Resources.resx | 3 + svnsync/Properties/Settings.Designer.cs | 30 ++--- svnsync/Resources/door_open.png | Bin 0 -> 508 bytes svnsync/Views/ViewsTray.cs | 126 +++++++++++++++++++ svnsync/Views/ViewsWindow.cs | 38 ++++++ svnsync/Views/ViewsWindowForm.Designer.cs | 72 +++++++++++ svnsync/Views/ViewsWindowForm.cs | 31 +++++ svnsync/Views/ViewsWindowForm.resx | 120 ++++++++++++++++++ svnsync/bin/Release/SvnSync.exe | Bin 36352 -> 44032 bytes svnsync/svnsync.csproj | 73 ++++++++++- svnsync/svnsync.csproj.user | 12 +- 22 files changed, 927 insertions(+), 36 deletions(-) create mode 100644 svnsync/Controllers/ControllersTray.cs create mode 100644 svnsync/Controllers/ControllersWindow.cs create mode 100644 svnsync/Helpers/Handles.cs create mode 100644 svnsync/Helpers/StringHelper.cs rename svnsync/{ => Libraries}/Svn.cs (78%) create mode 100644 svnsync/Models/ModelsTray.cs create mode 100644 svnsync/Models/ModelsWindow.cs create mode 100644 svnsync/Resources/door_open.png create mode 100644 svnsync/Views/ViewsTray.cs create mode 100644 svnsync/Views/ViewsWindow.cs create mode 100644 svnsync/Views/ViewsWindowForm.Designer.cs create mode 100644 svnsync/Views/ViewsWindowForm.cs create mode 100644 svnsync/Views/ViewsWindowForm.resx diff --git a/svnsync.sln b/svnsync.sln index d74c976..9b8729d 100644 --- a/svnsync.sln +++ b/svnsync.sln @@ -1,18 +1,40 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "svnsync", "svnsync\svnsync.csproj", "{447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Utils.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Debug|Any CPU.ActiveCfg = Debug|x86 + {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Debug|Mixed Platforms.Build.0 = Debug|x86 {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Debug|x86.ActiveCfg = Debug|x86 {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Debug|x86.Build.0 = Debug|x86 + {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Release|Any CPU.ActiveCfg = Release|x86 + {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Release|Mixed Platforms.Build.0 = Release|x86 {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Release|x86.ActiveCfg = Release|x86 {447D3E59-FD95-47EA-AB2F-AA241EFD6E0C}.Release|x86.Build.0 = Release|x86 + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|x86.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.Build.0 = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/svnsync/Controllers/ControllersTray.cs b/svnsync/Controllers/ControllersTray.cs new file mode 100644 index 0000000..508f85c --- /dev/null +++ b/svnsync/Controllers/ControllersTray.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BlubbFish.Utils; +using svnsync.Views; +using svnsync.Helpers; + +namespace svnsync.Controllers +{ + class ControllersTray : OwnController + { + private static ViewsTray viewTray; + private static ControllersWindow controllerWindow; + private string args; + + /// + /// Controlls a Tray. + /// + public ControllersTray() {} + + protected override void init() { + viewTray = new ViewsTray(); + controllerWindow = new ControllersWindow(); + controllerWindow.setAction(Handles.FormType.Normal); + if(viewTray.Model.Args.HasArgumentType("-cron")) { + if(this.cronJob(0, false)) { + viewTray.ShowSuccess(); + System.Threading.Thread.Sleep(5000); + viewTray.Dispose(); + return; + } + } else { + controllerWindow.execute(); + } + } + + private bool cronJob(int run, bool readyToCommit) { + if(viewTray.Model.Svn == null) { + return HandleError(Handles.SvnType.NotInit, ""); + } + if(run > 10) { + return HandleError(Handles.SvnType.ToMutchChronRuns, ""); + } + if(viewTray.Model.Svn.IsError()) { + return HandleError(Handles.SvnType.UnexpectedError, viewTray.Model.Svn.getError()); + } + try { + viewTray.Model.Svn.CheckStatus(); + } catch(NotImplementedException e) { + return HandleError(Handles.SvnType.UnexpectedError, e.Message); + } catch(Helpers.SvnLockedException e) { + return HandleError(Handles.SvnType.LockedFile, e.Message); + } + if(viewTray.Model.Svn.IsNotOnlyModified()) { + if(viewTray.Model.Svn.IsUncheckedFiles()) { + if(viewTray.Model.Args.HasArgumentType("-autoadd")) { + viewTray.Model.Svn.AddFiles(viewTray.Model.Svn.getNoVersionFiles()); + if(viewTray.Model.Svn.IsError()) { + return HandleError(Handles.SvnType.UnexpectedError, viewTray.Model.Svn.getError()); + } + } else { + return HandleError(Handles.SvnType.HasVersionitedFiles, ""); + } + } + if(viewTray.Model.Svn.IsExternDeletedFiles()) { + if(viewTray.Model.Args.HasArgumentType("-autodelete")) { + viewTray.Model.Svn.DeleteFiles(viewTray.Model.Svn.getWasDeletedFiles()); + if(viewTray.Model.Svn.IsError()) { + return HandleError(Handles.SvnType.UnexpectedError, viewTray.Model.Svn.getError()); + } + } else { + return HandleError(Handles.SvnType.ExternDeletedFiles, ""); + } + } + return this.cronJob(run + 1, true); + } else { + if(readyToCommit) { + viewTray.Model.Svn.SetArgCheckIn("Automatic Cronjob Checkin: " + StringHelper.GetTimeStamp(DateTime.Now)); + if(viewTray.Model.Svn.IsError()) { + return HandleError(Handles.SvnType.UnexpectedError, viewTray.Model.Svn.getError()); + } + } else { + viewTray.Model.Svn.Update(); + if(viewTray.Model.Svn.IsError()) { + return HandleError(Handles.SvnType.UnexpectedError, viewTray.Model.Svn.getError()); + } + return this.cronJob(run + 1, true); + } + } + return true; + } + + private bool HandleError(Handles.SvnType svnType, string p) { + viewTray.ShowError(svnType, p); + switch(svnType) { + case Handles.SvnType.ToMutchChronRuns: + controllerWindow.setAction(Handles.FormType.MuchCronJobs); + break; + case Handles.SvnType.HasVersionitedFiles: + controllerWindow.setAction(Handles.FormType.UnversionFiles); + break; + case Handles.SvnType.UnexpectedError: + controllerWindow.setAction(Handles.FormType.Error); + controllerWindow.setMessage(p); + break; + case Handles.SvnType.ExternDeletedFiles: + controllerWindow.setAction(Handles.FormType.DeletedFiles); + break; + case Handles.SvnType.LockedFile: + controllerWindow.setAction(Handles.FormType.ManualResolve); + controllerWindow.setMessage(p); + break; + } + return false; + } + + /// + /// If you Click on the Tray Icon + /// + /// + /// + public static void Click_Tray(object sender, EventArgs e) + { + controllerWindow.execute(); + } + + /// + /// If you Click on the Tray Ballon + /// + /// + /// + public static void Click_Ballon(object sender, EventArgs e) + { + controllerWindow.execute(); + } + + internal void hideToolTip() { + viewTray.HideToolTip(); + } + + internal static void Click_Quit(object sender, EventArgs e) { + viewTray.Dispose(); + System.Windows.Forms.Application.Exit(); + } + } +} diff --git a/svnsync/Controllers/ControllersWindow.cs b/svnsync/Controllers/ControllersWindow.cs new file mode 100644 index 0000000..78d8d4c --- /dev/null +++ b/svnsync/Controllers/ControllersWindow.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using BlubbFish.Utils; +using svnsync.Views; +using svnsync.Helpers; + +namespace svnsync.Controllers { + public class ControllersWindow : OwnController { + private static ViewsWindow viewWindow; + private Handles.FormType initAction; + private string initMessage; + /// + /// Tray Controller + /// + public ControllersWindow() { } + + override protected void init() { + viewWindow = new ViewsWindow(); + viewWindow.Model.Message = initMessage; + viewWindow.Model.FormType = initAction; + } + + public static void FormClosed(object sender, FormClosedEventArgs e) { + viewWindow.Dispose(); + } + + + internal void setAction(Handles.FormType formType) { + if(viewWindow == null) { + this.initAction = formType; + } else { + viewWindow.Model.FormType = formType; + } + //throw new NotImplementedException(); + //this.CreateSVNOpen("Fehler im Cronjob, mehr als 10 Aufrufe!", ""); + //this.CreateFileList("Hinzufügen", "Diese Daten sind unversioniert:", s.getNoVersionFiles(), new EventHandler(addButton_Click)); + //this.CreateSVNOpen("Es ist ein Unvorhersebarer Fehler aufgetreten", p); + //this.CreateFileList("Löschen", "Diese Daten sind gelöscht worden:", s.getWasDeletedFiles(), new EventHandler(deleteButton_Click)); + } + + internal void setMessage(string p) { + if(viewWindow == null) { + this.initMessage = p; + } else { + viewWindow.Model.Message = p; + } + } + } +} diff --git a/svnsync/Form1.cs b/svnsync/Form1.cs index c4d669a..b93f304 100644 --- a/svnsync/Form1.cs +++ b/svnsync/Form1.cs @@ -6,6 +6,8 @@ using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; +using BlubbFish.Utils; +using svnsync.Libraries; namespace svnsync { @@ -31,7 +33,14 @@ namespace svnsync l.Add("/Blubb/Bla/Foo"); l.Add("/Blubb/Bla/Blubb"); this.CreateFileList("Löschen", "Diese Daten sind gelöscht worden:", l, new EventHandler(deleteButton_Click)); - */this.c = new CmdArgs(args); + */ + Dictionary pargs = new Dictionary(); + pargs.Add("-d", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Touple, true)); + pargs.Add("-cron", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Single)); + pargs.Add("-autoadd", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Single)); + pargs.Add("-autodelete", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Single)); + this.c = CmdArgs.getInstance(); + this.c.setArguments(pargs, args); this.StartSvn(); if (this.s != null) { @@ -485,7 +494,8 @@ namespace svnsync this.ShowToolTip("Svn Sync Fehler", "Kein Argument für \"-d\" angegeben", ToolTipIcon.Error); return; } - this.s = new Svn(this.c.GetArgumentData("-d")); + this.s = Svn.getInstance(); + this.s.setDirectory(this.c.GetArgumentData("-d")); } private void EventHandler_Resize(object sender, System.EventArgs e) diff --git a/svnsync/Helpers/Handles.cs b/svnsync/Helpers/Handles.cs new file mode 100644 index 0000000..c600722 --- /dev/null +++ b/svnsync/Helpers/Handles.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace svnsync.Helpers { + class Handles { + public enum SvnType { + NotInit, + ToMutchChronRuns, + HasVersionitedFiles, + UnexpectedError, + ExternDeletedFiles, + LockedFile, + } + public enum FormType { + MuchCronJobs, + UnversionFiles, + Error, + DeletedFiles, + Normal, + ManualResolve, + } + } + [Serializable()] + public class SvnLockedException : System.Exception { + public SvnLockedException() : base() { } + public SvnLockedException(string message) : base(message) { } + public SvnLockedException(string message, System.Exception inner) : base(message, inner) { } + protected SvnLockedException(System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) { } + } +} diff --git a/svnsync/Helpers/StringHelper.cs b/svnsync/Helpers/StringHelper.cs new file mode 100644 index 0000000..fdcb98a --- /dev/null +++ b/svnsync/Helpers/StringHelper.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace svnsync.Helpers +{ + class StringHelper + { + public static string GetTimeStamp(DateTime dateTime) + { + String ret = ""; + ret += dateTime.Year.ToString().PadLeft(4, '0'); + ret += dateTime.Month.ToString().PadLeft(2, '0'); + ret += dateTime.Day.ToString().PadLeft(2, '0'); + ret += "-"; + ret += dateTime.Hour.ToString().PadLeft(2, '0'); + ret += dateTime.Minute.ToString().PadLeft(2, '0'); + ret += dateTime.Second.ToString().PadLeft(2, '0'); + return ret; + } + } +} diff --git a/svnsync/Svn.cs b/svnsync/Libraries/Svn.cs similarity index 78% rename from svnsync/Svn.cs rename to svnsync/Libraries/Svn.cs index 6683440..c2f3a0e 100644 --- a/svnsync/Svn.cs +++ b/svnsync/Libraries/Svn.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Diagnostics; -namespace svnsync +namespace svnsync.Libraries { class Svn { @@ -17,8 +17,12 @@ namespace svnsync private string SvnError = ""; private string SvnOutput = ""; private List isdeleted; + private List external; + private static Svn instances; - public Svn(string dir) + private Svn() { } + + public void setDirectory(string dir) { this.dir = dir; this.Init(); @@ -41,6 +45,7 @@ namespace svnsync wasdeleted = new List(); isdeleted = new List(); added = new List(); + external = new List(); this.runner("st"); string[] lines = this.SvnOutput.Split('\n'); foreach (String line in lines) @@ -51,7 +56,11 @@ namespace svnsync String file = line.Substring(8).Trim(new Char[] {'\r','\n',' ','\t'}); if (handles[0] == ' ') { - throw new NotImplementedException("SVN Line ' '"); + if(handles[2] == 'L') { + throw new svnsync.Helpers.SvnLockedException("Datei: " + file + " ist gelockt!"); + } else { + throw new NotImplementedException("NOT IMPLEMENTED in SvnClass: SVN Line[0] ' '"); + } } else if (handles[0] == 'A') { @@ -67,19 +76,19 @@ namespace svnsync } else if (handles[0] == 'R') { - throw new NotImplementedException("SVN Line 'R'"); + throw new NotImplementedException("NOT IMPLEMENTED in SvnClass: SVN Line[0] 'R'"); } else if (handles[0] == 'C') { - throw new NotImplementedException("SVN Line 'C'"); + throw new NotImplementedException("NOT IMPLEMENTED in SvnClass: SVN Line[0] 'C'"); } else if (handles[0] == 'X') { - throw new NotImplementedException("SVN Line 'X'"); + external.Add(file); } else if (handles[0] == 'I') { - throw new NotImplementedException("SVN Line 'I'"); + throw new NotImplementedException("NOT IMPLEMENTED in SvnClass: SVN Line[0] 'I'"); } else if (handles[0] == '?') { @@ -91,11 +100,11 @@ namespace svnsync } else if (handles[0] == '~') { - throw new NotImplementedException("SVN Line '~'"); + throw new NotImplementedException("NOT IMPLEMENTED in SvnClass: SVN Line[0] '~'"); } else { - throw new NotImplementedException("Unexpected Symbol!"); + throw new NotImplementedException("NOT IMPLEMENTED in SvnClass: Unexpected Symbol! [0]: \"" + handles[0] + "\""); } } } @@ -206,5 +215,14 @@ namespace svnsync { this.runner("up"); } + + public static Svn getInstance() + { + if (instances == null) + { + instances = new Svn(); + } + return instances; + } } } diff --git a/svnsync/Models/ModelsTray.cs b/svnsync/Models/ModelsTray.cs new file mode 100644 index 0000000..09076b8 --- /dev/null +++ b/svnsync/Models/ModelsTray.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BlubbFish.Utils; +using svnsync.Libraries; + +namespace svnsync.Models +{ + class ModelsTray : OwnModel + { + private ModelsTray() + { + this.init(); + } + + protected override void init() + { + this.Args = CmdArgs.getInstance(); + this.Svn = Svn.getInstance(); + } + + /// + /// Saves the Argument of the Program + /// + public CmdArgs Args { get; private set; } + + /// + /// Save a SVN + /// + public Svn Svn { get; private set; } + } + +} + + + diff --git a/svnsync/Models/ModelsWindow.cs b/svnsync/Models/ModelsWindow.cs new file mode 100644 index 0000000..b731b1b --- /dev/null +++ b/svnsync/Models/ModelsWindow.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using BlubbFish.Utils; +using svnsync.Helpers; + +namespace svnsync.Models { + public class ModelsWindow : OwnModel { + private InIReader networkfile; + private ModelsWindow() { + this.init(); + } + + protected override void init() { + + } + + private string MessageValue = ""; + public string Message { + get { return MessageValue; } + set { MessageValue = value; this.update(); } + } + + private Handles.FormType FormTypeValue; + internal Handles.FormType FormType { + get { return FormTypeValue; } + set { FormTypeValue = value; this.update(); } + } + } +} diff --git a/svnsync/Program.cs b/svnsync/Program.cs index 95854a3..27faaf5 100644 --- a/svnsync/Program.cs +++ b/svnsync/Program.cs @@ -2,6 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Forms; +using svnsync.Controllers; +using BlubbFish.Utils; +using svnsync.Libraries; namespace svnsync { @@ -13,6 +16,29 @@ namespace svnsync [STAThread] static void Main(string[] args) { + if (!cmd(args)) + { + return; + } + ControllersTray t = null; + try + { + Svn.getInstance().setDirectory(CmdArgs.getInstance().GetArgumentData("-d")); + t = new ControllersTray(); + t.execute(); + } + catch (Exception e) + { + t.hideToolTip(); + string text = e.Message+"\n\n"+e.StackTrace; + string title = "Exception in SVNSync: " + CmdArgs.getInstance().GetArgumentData("-d"); + System.Windows.Forms.MessageBox.Show(text, title, MessageBoxButtons.OK, MessageBoxIcon.Error); + + return; + } + Application.Run(); + return; + /*Application.Run();*/ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try @@ -29,5 +55,21 @@ namespace svnsync Application.Exit(); } } + + private static bool cmd(string[] args) + { + Dictionary pargs = new Dictionary(); + pargs.Add("-d", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Touple, true)); + pargs.Add("-cron", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Single)); + pargs.Add("-autoadd", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Single)); + pargs.Add("-autodelete", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Single)); + CmdArgs.getInstance().setArguments(pargs, args); + if (!CmdArgs.getInstance().HasAllRequiredArguments()) + { + System.Windows.Forms.MessageBox.Show(CmdArgs.getInstance().getUsageList("syncsvn.exe:"), "Fehlende Argumente auf der Komandozeile", MessageBoxButtons.OK, MessageBoxIcon.Stop); + return false; + } + return true; + } } } diff --git a/svnsync/Properties/Resources.Designer.cs b/svnsync/Properties/Resources.Designer.cs index 61230eb..b6d601e 100644 --- a/svnsync/Properties/Resources.Designer.cs +++ b/svnsync/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.17929 +// Laufzeitversion:4.0.30319.34209 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. @@ -60,6 +60,16 @@ namespace svnsync.Properties { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap door_open { + get { + object obj = ResourceManager.GetObject("door_open", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). /// diff --git a/svnsync/Properties/Resources.resx b/svnsync/Properties/Resources.resx index b8c408a..467e449 100644 --- a/svnsync/Properties/Resources.resx +++ b/svnsync/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\door_open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\file\Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/svnsync/Properties/Settings.Designer.cs b/svnsync/Properties/Settings.Designer.cs index cb8ebc5..22ace91 100644 --- a/svnsync/Properties/Settings.Designer.cs +++ b/svnsync/Properties/Settings.Designer.cs @@ -1,28 +1,24 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.269 +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.18444 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. // //------------------------------------------------------------------------------ -namespace svnsync.Properties -{ - - +namespace svnsync.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } diff --git a/svnsync/Resources/door_open.png b/svnsync/Resources/door_open.png new file mode 100644 index 0000000000000000000000000000000000000000..64bab57ddd0e95ad9a73a3828ec29b5d0b4dd675 GIT binary patch literal 508 zcmVjv0zFqT|_}Gg5c7fH`2AZ7W59X^b!J!cjQKk5f=?+6Od?2ip|XV za}o2aVlr?zXY)SuzK59<5o~(S-oAM4Zm-OARNqAS>D|jO?sih$KIXi4#zC#p8KB*6 zhr2T^Gn@5ikAoUcb$HCpdndR#asC03%nV>=v|23yQc6ob;v>x`Pk}_f8e)=(a71(& zuqvL;W`>(lMgvR>P$S&_bg(E|oK*{Mf@#6E0Euv?l<^#(s{aI-7D5%5GI0madt{~$%;b@oK6JNMtzMm) + /// Model of the View + /// + public ModelsTray Model { get; private set; } + private NotifyIcon trayicon; + + /// + /// View of a Tray + /// + public ViewsTray() + { + this.init(); + this.Model = ModelsTray.Instance; + this.Model.setObserver(this); + } + + /// + /// Updates the Tray + /// + public override void update() + { + this.trayicon.Text = "SvnSync: " + this.Model.Args.GetArgumentData("-d"); + } + + protected override void init() + { + this.trayicon = new NotifyIcon(); + this.trayicon.Visible = true; + this.trayicon.Icon = new Icon(Resources.Icon, 40, 40); + this.trayicon.Text = "SVN Sync Tool"; + this.trayicon.DoubleClick += ControllersTray.Click_Tray; + this.trayicon.BalloonTipClicked += ControllersTray.Click_Ballon; + this.trayicon.ContextMenuStrip = this.genMenu(); + } + + private ContextMenuStrip genMenu() { + ContextMenuStrip menu = new ContextMenuStrip(); + ToolStripMenuItem m1 = new ToolStripMenuItem("Öffnen"); + m1.Image = Resources.door_open; + m1.Click += ControllersTray.Click_Tray; + m1.Name = "Open"; + menu.Items.Add(m1); + + ToolStripMenuItem m2 = new ToolStripMenuItem("Beenden"); + m2.Image = Resources.door_open; + m2.Click += ControllersTray.Click_Quit; + m2.Name = "Quit"; + menu.Items.Add(m2); + + return menu; + } + + /// + /// Delete the Tray + /// + public override void Dispose() + { + this.trayicon.Visible = false; + Application.ExitThread(); + } + + /// + /// Show a Success Message + /// + public void ShowSuccess() + { + this.showBallonTooltip("Datensicherung Erfolgreich\n" + this.Model.Args.GetArgumentData("-d").Replace("\\\\", "\\"), ToolTipIcon.Info); + } + + private void showBallonTooltip(string text, ToolTipIcon toolTipIcon, string title = "SvnSync") + { + this.trayicon.BalloonTipIcon = toolTipIcon; + this.trayicon.BalloonTipText = text; + this.trayicon.BalloonTipTitle = title; + this.trayicon.ShowBalloonTip(100); + } + + /// + /// Show a Error Message. + /// + /// + /// + public void ShowError(Handles.SvnType svnType, string p) { + switch(svnType) { + case Handles.SvnType.NotInit: + this.showBallonTooltip("Svn wurde noch nicht inizialisiert", ToolTipIcon.Error, "Svn Sync Fehler"); + break; + case Handles.SvnType.ToMutchChronRuns: + this.showBallonTooltip("Fehler im Cronjob, mehr als 10 Aufrufe!", ToolTipIcon.Error, "Svn Sync Fehler"); + break; + case Handles.SvnType.HasVersionitedFiles: + this.showBallonTooltip("Es sind unversionierte Dateien vorhanden (?)", ToolTipIcon.Info, "Svn Sync Fehler"); + break; + case Handles.SvnType.UnexpectedError: + this.showBallonTooltip("Es ist ein Unvorhersebarer Fehler aufgetreten: " + p, ToolTipIcon.Error, "Svn Sync Fehler"); + break; + case Handles.SvnType.ExternDeletedFiles: + this.showBallonTooltip("Es sind extern gelöschte Dateien vorhanden (!)", ToolTipIcon.Info, "Svn Sync Fehler"); + break; + case Handles.SvnType.LockedFile: + this.showBallonTooltip("Es sind blokierte Dateien vorhanden (L)", ToolTipIcon.Info, "Svn Sync Fehler"); + break; + } + } + + internal void HideToolTip() { + this.trayicon.Visible = false; + } + } +} diff --git a/svnsync/Views/ViewsWindow.cs b/svnsync/Views/ViewsWindow.cs new file mode 100644 index 0000000..bbb3ee7 --- /dev/null +++ b/svnsync/Views/ViewsWindow.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Drawing; +using BlubbFish.Utils; +using svnsync.Models; + +namespace svnsync.Views { + public class ViewsWindow : OwnView { + private ViewsWindowForm form; + public ViewsWindow() { + this.form = new ViewsWindowForm(); + this.init(); + this.Model.setObserver(this); + } + + public override void update() { + this.form.UpdateForm(); + } + + protected override void init() { + this.Model = ModelsWindow.Instance; + this.form.SetModel(this.Model); + this.form.Show(); + } + + public override void Dispose() { + this.form.BeginInvoke((Action)(() => { + this.form.Dispose(); + })); + } + + public ModelsWindow Model { get; private set; } + } +} diff --git a/svnsync/Views/ViewsWindowForm.Designer.cs b/svnsync/Views/ViewsWindowForm.Designer.cs new file mode 100644 index 0000000..06ec089 --- /dev/null +++ b/svnsync/Views/ViewsWindowForm.Designer.cs @@ -0,0 +1,72 @@ +namespace svnsync.Views +{ + partial class ViewsWindowForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.messageBox = new System.Windows.Forms.RichTextBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(51, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Meldung:"; + // + // messageBox + // + this.messageBox.Location = new System.Drawing.Point(15, 26); + this.messageBox.Name = "messageBox"; + this.messageBox.ReadOnly = true; + this.messageBox.Size = new System.Drawing.Size(437, 96); + this.messageBox.TabIndex = 2; + this.messageBox.Text = ""; + // + // ViewsWindowForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(464, 262); + this.Controls.Add(this.messageBox); + this.Controls.Add(this.label1); + this.Name = "ViewsWindowForm"; + this.Text = "ViewsWindowsForm"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.RichTextBox messageBox; + } +} \ No newline at end of file diff --git a/svnsync/Views/ViewsWindowForm.cs b/svnsync/Views/ViewsWindowForm.cs new file mode 100644 index 0000000..3afe3b8 --- /dev/null +++ b/svnsync/Views/ViewsWindowForm.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using svnsync.Models; +using svnsync.Controllers; + +namespace svnsync.Views { + public partial class ViewsWindowForm : Form { + private ModelsWindow model; + public ViewsWindowForm() { + InitializeComponent(); + this.FormClosed += ControllersWindow.FormClosed; + } + + public void UpdateForm() { + this.BeginInvoke((Action)(() => { + this.messageBox.Text = this.model.Message; + })); + } + + public void SetModel(ModelsWindow window) { + this.model = window; + } + } +} diff --git a/svnsync/Views/ViewsWindowForm.resx b/svnsync/Views/ViewsWindowForm.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/svnsync/Views/ViewsWindowForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/svnsync/bin/Release/SvnSync.exe b/svnsync/bin/Release/SvnSync.exe index 2957e8bb51689db89481d1f0aea91247f8368e74..19e27b59856493a662b32709ccdef7d09a342d9a 100644 GIT binary patch literal 44032 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 delta 13944 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 O<6-;3UyFf8-~R(q!{oC7 diff --git a/svnsync/svnsync.csproj b/svnsync/svnsync.csproj index 3715631..9b729bf 100644 --- a/svnsync/svnsync.csproj +++ b/svnsync/svnsync.csproj @@ -10,9 +10,25 @@ Properties svnsync SvnSync - v4.0 - Client + v4.5 + + 512 + veröffentlichen\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true x86 @@ -23,6 +39,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -32,6 +49,7 @@ TRACE prompt 4 + false file\Icon.ico @@ -50,16 +68,29 @@ - + + Form Form1.cs + + + + - + + + + + Form + + + ViewsWindowForm.cs + Form1.cs @@ -73,6 +104,9 @@ Resources.resx True + + ViewsWindowForm.cs + SettingsSingleFileGenerator Settings.Designer.cs @@ -92,6 +126,37 @@ + + + {fac8ce64-bf13-4ece-8097-aeb5dd060098} + Utils + + + + + + + + False + Microsoft .NET Framework 4 Client Profile %28x86 und x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + +