From 04196db81dfd2fddce415d7986a0d2321cdc2f73 Mon Sep 17 00:00:00 2001 From: Manuel Dobusch Date: Wed, 2 Dec 2015 14:50:02 +0100 Subject: [PATCH] ui: windows installer Created a windows installer (vs deployment project). --- .gitignore | 18 + bin/app/data/gui/icon/coati.ico | Bin 0 -> 74802 bytes bin/app/data/gui/installer/EULA.rtf | 98 + .../{icon => installer}/logo_1024_1024.png | Bin .../installer/windows_installer_banner.jpg | Bin 0 -> 21549 bytes bin/test/data/log/test_log.txt | 170 + deployment/windows/CoatiSetup/CoatiSetup.sln | 46 + .../CoatiSetup/CoatiSetup/CoatiSetup.vdproj | 4308 +++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 + .../SetupApplicationSettings.Designer.cs | 36 + .../SetupApplicationSettings.cs | 45 + .../SetupApplicationSettingsLib.csproj | 60 + .../CreateDesktopShortcut.Designer.cs | 36 + .../CreateDesktopShortcut.cs | 68 + .../Properties/AssemblyInfo.cs | 36 + .../SetupCreateDesktopShortcutLib.csproj | 71 + .../CreateStartMenuShortcut.Designer.cs | 36 + .../CreateStartMenuShortcut.cs | 67 + .../Properties/AssemblyInfo.cs | 36 + .../SetupCreateStartMenuShortcutLib.csproj | 71 + .../Properties/AssemblyInfo.cs | 36 + .../SetupRemoveCacheFiles.Designer.cs | 36 + .../SetupRemoveCacheFiles.cs | 48 + .../SetupRemoveCacheFiles.csproj | 60 + src/app/main.cpp | 4 + src/app/platform_includes/includesDefault.h | 4 + src/app/platform_includes/includesMac.h | 4 + src/app/platform_includes/includesWindows.h | 15 + src/app/qt/window/QtMainWindow.cpp | 10 +- src/app/qt/window/QtMainWindow.h | 4 + src/lib/Application.cpp | 11 +- src/lib/Application.h | 4 + src/lib/utility/logging/FileLogger.cpp | 18 +- src/lib/utility/logging/FileLogger.h | 5 +- 34 files changed, 5491 insertions(+), 6 deletions(-) create mode 100644 bin/app/data/gui/icon/coati.ico create mode 100644 bin/app/data/gui/installer/EULA.rtf rename bin/app/data/gui/{icon => installer}/logo_1024_1024.png (100%) create mode 100644 bin/app/data/gui/installer/windows_installer_banner.jpg create mode 100644 deployment/windows/CoatiSetup/CoatiSetup.sln create mode 100644 deployment/windows/CoatiSetup/CoatiSetup/CoatiSetup.vdproj create mode 100644 deployment/windows/CoatiSetup/SetupApplicationSettingsLib/Properties/AssemblyInfo.cs create mode 100644 deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettings.Designer.cs create mode 100644 deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettings.cs create mode 100644 deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettingsLib.csproj create mode 100644 deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.Designer.cs create mode 100644 deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.cs create mode 100644 deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/Properties/AssemblyInfo.cs create mode 100644 deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/SetupCreateDesktopShortcutLib.csproj create mode 100644 deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.Designer.cs create mode 100644 deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.cs create mode 100644 deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/Properties/AssemblyInfo.cs create mode 100644 deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/SetupCreateStartMenuShortcutLib.csproj create mode 100644 deployment/windows/CoatiSetup/SetupRemoveCacheFiles/Properties/AssemblyInfo.cs create mode 100644 deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.Designer.cs create mode 100644 deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.cs create mode 100644 deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.csproj diff --git a/.gitignore b/.gitignore index ea35a8a8..4d6cde67 100644 --- a/.gitignore +++ b/.gitignore @@ -24,5 +24,23 @@ /ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/obj *.coatidb + +/deployment/windows/CoatiSetup/CoatiSetup/Debug +/deployment/windows/CoatiSetup/CoatiSetup/Release + +/deployment/windows/CoatiSetup/CoatiSetup.v12.suo + +/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/bin/ +/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/obj/ + +/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/bin/ +/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/obj/ + +/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/bin/ +/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/obj/ + +/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/bin/ +/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/obj/ + *.sqlite *.swp diff --git a/bin/app/data/gui/icon/coati.ico b/bin/app/data/gui/icon/coati.ico new file mode 100644 index 0000000000000000000000000000000000000000..90ce2937aa6fad8c40be8b3404dd65b9ff01b5ce GIT binary patch literal 74802 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 E14Euj)&Kwi literal 0 HcmV?d00001 diff --git a/bin/app/data/gui/installer/EULA.rtf b/bin/app/data/gui/installer/EULA.rtf new file mode 100644 index 00000000..283a29e1 --- /dev/null +++ b/bin/app/data/gui/installer/EULA.rtf @@ -0,0 +1,98 @@ +{\rtf1\ansi\ansicpg1252\deff0\deflang3079{\fonttbl{\f0\fnil\fcharset0 Calibri;}} +{\colortbl ;\red0\green0\blue255;} +{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang7\f0\fs22 Coati\par +Software License Agreement\par +Effective 1.1.2016\par +\par +BY INSTALLING OR USING THIS SOFTWARE, YOU ARE BECOMING A PARTY TO, AND ARE CONSENTING TO BE BOUND BY, THIS AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS OF THIS AGREEMENT, DO NOT INSTALL OR USE THIS SOFTWARE.\par +\par +\par +\b DEFINITIONS\b0\par +\par +"Software" means:\par +\bullet\tab A major version of Coati in executable form. The major version is defined by the leading number of the version string (e.g. the major version of Coati 1.x.x.x is version 1); \par +\bullet\tab documentation for that major version of Coati;\par +\bullet\tab minor updates included in software maintenance which are indicated by an increase in the numbers that follow the major version number (e.g. the update from Coati 1.0.0.0 to Coati 1.0.1.4).\par +"Licensor" means:\par +\bullet\tab Coati Software OG, having a place of business at Schlossallee 7/1, 5412 Puch/Hallein, Austria.\par +"Licensee" means:\par +\bullet\tab the individual evaluating the trial version of the Software;\par +\bullet\tab the company, corporation, or organization that purchased a License(s) for the Software;\par +\bullet\tab the individual who purchased a License for the Software.\par +"Activation Key" means:\par +\bullet\tab the name of the Licensee, the kind of license, the major version of the software that is licensed, and a hashcode; the combination of these values allows the Licensee to activate a genuine copy of the Software.\par +"Authorized User" means:\par +\bullet\tab the individual evaluating the Software during a trial;\par +\bullet\tab an employee or independent contractor who might at any time use the Software, of the company, corporation, or organization that purchased a License(s) for the Software; an entity has one Authorized User for each License purchased;\par +\bullet\tab the individual who purchased a License for the Software; the individual is the only Authorized User.\par +\par +\par +\b GRANT\b0\par +\par +Subject to the terms of this Agreement, the Licensor hereby grants the Licensee a non-transferable, non-exclusive, non-sub-licensable, limited license that allows:\par +\bullet\tab the Licensee to distribute (an) Activation Key(s) to Authorized User(s);\par +\bullet\tab Authorized User(s) to install the licensed version of the Software on computer PCs where potential use of the Software is restricted exclusively to Authorized User(s);\par +\bullet\tab Authorized User(s) to use the Software on computer PCs, in virtual machines, in combination with multiple IDEs, and in combination with multiple instances of an IDE;\par +\bullet\tab Authorized User(s) to use the trial version of the software in order to examine the provided example project;\par +\bullet\tab Licensee to make a copy of the Software for archival purposes provided the copy contains all of the proprietary notices of the Software.\par +In case the Licensee of the software is a company, corporation, or organization the Licensor has the right to mention this usage of the Software on its own website.\par +\par +\par +\b RESTRICTIONS\b0\par +\par +Licensee will not, and will have no right to:\par +\bullet\tab use the trial version of the software for any commercial purposes;\par +\bullet\tab distribute, use, or transfer an Activation Key(s) that has been superseded by an Activation Key(s) provided with software maintenance;\par +\bullet\tab modify, translate, reverse engineer, decompile, disassemble (except to the extent applicable laws specifically prohibit such restriction), create derivative works based on, or otherwise attempt to discover the source code or underlying ideas or algorithms of the Software;\par +\bullet\tab sell, rent, lease, distribute, or otherwise transfer rights to the Software without prior written consent from Licensor;\par +\bullet\tab remove any proprietary notices or labels from the Software.\par +\par +\par +\b TITLE AND COPYRIGHT\par +\b0\par +Title, ownership rights, intellectual property rights, and copyright to the Software, and any copies or portions thereof, shall remain in Licensor. The Software is protected by European copyright directives, Austrian copyright laws as well as United States copyright laws and international treaty provisions.\par +\par +\par +\b DISCLAIMER OF WARRANTY\b0\par +\par +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND. LICENSOR HEREBY DISCLAIMS ALL EXPRESS OR IMPLIED WARRANTIES, INCLUDING WITHOUT LIMITATION WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS AGREEMENT. SOME U.S. STATES DO NOT ALLOW EXCLUSIONS OF AN IMPLIED WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO LICENSEE. LICENSEE MAY HAVE OTHER LEGAL RIGHTS THAT VARY FROM STATE TO STATE OR BY JURISDICTION.\par +\par +\par +\b LIMITATION OF LIABILITY\par +\b0\par +LICENSEE ASSUMES THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. LICENSOR ASSUMES NO LIABILITY FOR THE COST OF ANY SERVICE OR REPAIR IF THE SOFTWARE IS DEFECTIVE. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT, STRICT LIABILITY, OR OTHERWISE, SHALL LICENSOR, OR ITS LICENSORS, SUPPLIERS OR RESELLERS, BE LIABLE TO LICENSEE OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES. IN NO EVENT WILL LICENSOR BE LIABLE FOR ANY DAMAGES IN EXCESS OF THE MONEY PAID FOR THE SOFTWARE, EVEN IF LICENSOR SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. FURTHERMORE, SOME U.S. STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION AND EXCLUSION MAY NOT APPLY TO LICENSEE.\par +\par +\par +\b TERMINATION\par +\b0\par +The license granted herein shall be perpetual. If Licensee fails to comply with any of the terms of this Agreement, this Agreement and the rights granted herein will terminate immediately. Licensor may, at its sole discretion and at any time, terminate this Agreement. On termination, Licensee must cease using and destroy all copies of the Software.\par +\par +\par +\b EXPORT CONTROLS\par +\b0\par +Licensee shall comply with all export laws, restrictions and regulations of the United States, the Directive 2009/428/EC of the European Parliament and of the Council and the Austrian Au\'dfenwirtschaftsgesetz 2011, BGBl I No. 26/2011. Licensee shall not export, re-export or otherwise transfer the Software to any country for which the United States or the European Union or Austria maintains an embargo, or to any person or entity on the U.S. Department of Treasury List of Specially Designated Nationals or the U.S. Department of Commerce Denied Persons List or Entity List. Licensee represents and warrants that licensee is not located in, under the control of, or a national or resident of any restricted country or on any such list.\par +\par +\par +\b THIRD PARTY CREDITS\par +\b0\par +Portions of the Software utilize or include third party software and other copyrighted materials. Credits, licensing terms, and disclaimers for such materials are contained in the installation directory for the Software, and are accessible via the \ldblquote Licenses\rdblquote dialog for the Software. Licensee agrees that use of such copyrighted materials is governed by their respective terms.\par +\par +\par +\b ENTIRE AGREEMENT\par +\b0\par +This Agreement represents the complete agreement concerning this license between the parties and supersedes all prior agreements and representations between them. It may be amended only in writing executed by both parties. Coati Software OG reserves the exclusive right to periodically update this EULA at its discretion at any time, with reasonable notice to you by posting the new EULA at the following URL: {\field{\*\fldinst{HYPERLINK "http://www.coati.io/"}}{\fldrslt{\ul\cf1 http://www.coati.io/}}}\f0\fs22 . Any action arising out of or relating to this Agreement may be brought exclusively in Salzburg, Austria, and Coati Software OG and you irrevocably consent to the jurisdiction of such courts and venue in Salzburg, Austria.\par +\par +\par +\b CONTACT\par +\b0\par +If you have questions regarding this agreement, contact:\par +\par +Coati Software OG\par +Schlossallee 7/1\par +5412 Puch/Hallein\par +Austria\par +\par +support@coati.io\par +\par +} + \ No newline at end of file diff --git a/bin/app/data/gui/icon/logo_1024_1024.png b/bin/app/data/gui/installer/logo_1024_1024.png similarity index 100% rename from bin/app/data/gui/icon/logo_1024_1024.png rename to bin/app/data/gui/installer/logo_1024_1024.png diff --git a/bin/app/data/gui/installer/windows_installer_banner.jpg b/bin/app/data/gui/installer/windows_installer_banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ed1818b5af090f89e93b816b908079e59c02a2a GIT binary patch literal 21549 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 + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} \ No newline at end of file diff --git a/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettings.cs b/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettings.cs new file mode 100644 index 00000000..869506e0 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettings.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Configuration.Install; +using System.Linq; +using System.Threading.Tasks; +using System.Xml; + +namespace SetupApplicationSettingsLib +{ + [RunInstaller(true)] + public partial class SetupApplicationSettings : System.Configuration.Install.Installer + { + public SetupApplicationSettings() + { + InitializeComponent(); + } + + public override void Commit(IDictionary savedState) + { + base.Commit(savedState); + + string appDataCoatiPath = Environment.GetEnvironmentVariable("APPDATA") + "\\..\\local\\Coati Software\\Coati\\"; + string appSettingsPath = appDataCoatiPath + "ApplicationSettings.xml"; + string projectsPath = appDataCoatiPath + "projects\\"; + + XmlDocument appSettings = new XmlDocument(); + appSettings.Load(@appSettingsPath); + + XmlNode recentProjects = appSettings.SelectSingleNode("config/user/recent_projects"); + recentProjects.RemoveAll(); + + XmlNode tutorial = appSettings.CreateElement("recent_project"); + tutorial.InnerText = projectsPath + "tutorial\\tutorial.coatiproject"; + recentProjects.AppendChild(tutorial); + + XmlNode tictactoe = appSettings.CreateElement("recent_project"); + tictactoe.InnerText = projectsPath + "tictactoe\\tictactoe.coatiproject"; + recentProjects.AppendChild(tictactoe); + + appSettings.Save(appSettingsPath); + } + } +} diff --git a/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettingsLib.csproj b/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettingsLib.csproj new file mode 100644 index 00000000..56d508f7 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupApplicationSettingsLib/SetupApplicationSettingsLib.csproj @@ -0,0 +1,60 @@ + + + + + Debug + AnyCPU + {DF25B11F-6190-4605-9D32-BA7F545D624B} + Library + Properties + SetupApplicationSettingsLib + SetupApplicationSettingsLib + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Component + + + SetupApplicationSettings.cs + + + + + \ No newline at end of file diff --git a/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.Designer.cs b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.Designer.cs new file mode 100644 index 00000000..d979f8f3 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.Designer.cs @@ -0,0 +1,36 @@ +namespace SetupCreateDesktopShortcutLib +{ + partial class CreateDesktopShortcut + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} \ No newline at end of file diff --git a/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.cs b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.cs new file mode 100644 index 00000000..8c6d8df1 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/CreateDesktopShortcut.cs @@ -0,0 +1,68 @@ +using IWshRuntimeLibrary; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Configuration.Install; +using System.Linq; +using System.Threading.Tasks; + +namespace SetupCreateDesktopShortcutLib +{ + [RunInstaller(true)] + public partial class CreateDesktopShortcut : System.Configuration.Install.Installer + { + public CreateDesktopShortcut() + { + InitializeComponent(); + } + + public override void Commit(IDictionary savedState) + { + base.Commit(savedState); + + string app = System.Reflection.Assembly.GetExecutingAssembly().Location; + + string name = "install\\" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; + int nameIdx = app.LastIndexOf(name); + string appDirectory = app.Substring(0, nameIdx); + + app = appDirectory + "Coati.exe"; + + object shDesktop = (object)"Desktop"; + WshShell shell = new WshShell(); + string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\Coati.lnk"; + IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress); + shortcut.Description = "Fast source code reading and navigation"; + shortcut.TargetPath = app; + shortcut.WorkingDirectory = appDirectory; + shortcut.Save(); + } + + protected override void OnAfterRollback(IDictionary savedState) + { + base.OnAfterRollback(savedState); + + DeleteDesktopShortcut(); + } + + protected override void OnAfterUninstall(IDictionary savedState) + { + base.OnAfterUninstall(savedState); + + DeleteDesktopShortcut(); + } + + private void DeleteDesktopShortcut() + { + object shDesktop = (object)"Desktop"; + WshShell shell = new WshShell(); + string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\Coati.lnk"; + + if (System.IO.File.Exists(shortcutAddress)) + { + System.IO.File.Delete(shortcutAddress); + } + } + } +} diff --git a/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/Properties/AssemblyInfo.cs b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..d0510340 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SetupCreateDesktopShortcutLib")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SetupCreateDesktopShortcutLib")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("27b58167-bcfc-4b0d-8ca8-42bac62416d1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/SetupCreateDesktopShortcutLib.csproj b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/SetupCreateDesktopShortcutLib.csproj new file mode 100644 index 00000000..c560b64e --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateDesktopShortcutLib/SetupCreateDesktopShortcutLib.csproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + {91EE9087-7809-4289-AEC8-4DFB20679A74} + Library + Properties + SetupCreateDesktopShortcutLib + SetupCreateDesktopShortcutLib + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + Component + + + CreateDesktopShortcut.cs + + + + + + {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} + 1 + 0 + 0 + tlbimp + False + True + + + + + \ No newline at end of file diff --git a/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.Designer.cs b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.Designer.cs new file mode 100644 index 00000000..6638c018 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.Designer.cs @@ -0,0 +1,36 @@ +namespace SetupCreateStartMenuShortcutLib +{ + partial class CreateStartMenuShortcut + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} \ No newline at end of file diff --git a/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.cs b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.cs new file mode 100644 index 00000000..e1c8e2a8 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/CreateStartMenuShortcut.cs @@ -0,0 +1,67 @@ +using IWshRuntimeLibrary; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Configuration.Install; +using System.Linq; +using System.Threading.Tasks; + +namespace SetupCreateStartMenuShortcutLib +{ + [RunInstaller(true)] + public partial class CreateStartMenuShortcut : System.Configuration.Install.Installer + { + public CreateStartMenuShortcut() + { + InitializeComponent(); + } + + public override void Commit(IDictionary savedState) + { + base.Commit(savedState); + + string app = System.Reflection.Assembly.GetExecutingAssembly().Location; + + string name = "install\\" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; + int nameIdx = app.LastIndexOf(name); + string appDirectory = app.Substring(0, nameIdx); + + app = appDirectory + "Coati.exe"; + + WshShell shell = new WshShell(); + string shortcutAddress = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu) + "Coati.lnk"; + IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress); + shortcut.Description = "Fast source code reading and navigation"; + shortcut.TargetPath = app; + shortcut.WorkingDirectory = appDirectory; + shortcut.Save(); + } + + protected override void OnAfterRollback(IDictionary savedState) + { + base.OnAfterRollback(savedState); + + DeleteDesktopShortcut(); + } + + protected override void OnAfterUninstall(IDictionary savedState) + { + base.OnAfterUninstall(savedState); + + DeleteDesktopShortcut(); + } + + private void DeleteDesktopShortcut() + { + object shDesktop = (object)"Desktop"; + WshShell shell = new WshShell(); + string shortcutAddress = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu) + "Coati.lnk"; + + if (System.IO.File.Exists(shortcutAddress)) + { + System.IO.File.Delete(shortcutAddress); + } + } + } +} diff --git a/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/Properties/AssemblyInfo.cs b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..5681ceea --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SetupCreateStartMenuShortcutLib")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SetupCreateStartMenuShortcutLib")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d2e0e462-d5da-4270-ba51-02548abbed44")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/SetupCreateStartMenuShortcutLib.csproj b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/SetupCreateStartMenuShortcutLib.csproj new file mode 100644 index 00000000..e53d485b --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupCreateStartMenuShortcutLib/SetupCreateStartMenuShortcutLib.csproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + {962F7DA5-AEA1-4D03-89FD-F9AC42C24E46} + Library + Properties + SetupCreateStartMenuShortcutLib + SetupCreateStartMenuShortcutLib + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + Component + + + CreateStartMenuShortcut.cs + + + + + + {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} + 1 + 0 + 0 + tlbimp + False + True + + + + + \ No newline at end of file diff --git a/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/Properties/AssemblyInfo.cs b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..162d231d --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SetupRemoveCacheFiles")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SetupRemoveCacheFiles")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("226fe6d3-3c0f-417e-94f3-a2c0c3260b0a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.Designer.cs b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.Designer.cs new file mode 100644 index 00000000..27c5758d --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.Designer.cs @@ -0,0 +1,36 @@ +namespace SetupRemoveCacheFiles +{ + partial class SetupRemoveCacheFiles + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} \ No newline at end of file diff --git a/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.cs b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.cs new file mode 100644 index 00000000..e7b017db --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Configuration.Install; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace SetupRemoveCacheFiles +{ + [RunInstaller(true)] + public partial class SetupRemoveCacheFiles : System.Configuration.Install.Installer + { + public SetupRemoveCacheFiles() + { + InitializeComponent(); + } + + protected override void OnAfterRollback(IDictionary savedState) + { + base.OnAfterRollback(savedState); + + DeleteCacheFiles(); + } + + protected override void OnAfterUninstall(IDictionary savedState) + { + base.OnAfterUninstall(savedState); + + DeleteCacheFiles(); + } + + private void DeleteCacheFiles() + { + try + { + string appDataCoatiPath = Environment.GetEnvironmentVariable("APPDATA") + "\\..\\local\\Coati Software\\Coati\\"; + + Directory.Delete(appDataCoatiPath, true); + } + catch(Exception e) + { + // well damn + } + } + } +} diff --git a/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.csproj b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.csproj new file mode 100644 index 00000000..afc96533 --- /dev/null +++ b/deployment/windows/CoatiSetup/SetupRemoveCacheFiles/SetupRemoveCacheFiles.csproj @@ -0,0 +1,60 @@ + + + + + Debug + AnyCPU + {CEA97AC9-7B4C-42D4-9CD3-E05C0A0473F5} + Library + Properties + SetupRemoveCacheFiles + SetupRemoveCacheFiles + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Component + + + SetupRemoveCacheFiles.cs + + + + + \ No newline at end of file diff --git a/src/app/main.cpp b/src/app/main.cpp index c69c558a..960e4309 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -9,6 +9,7 @@ #include "Application.h" #include "includes.h" // defines 'void setup(int argc, char *argv[])' +#include "qt/window/QtMainWindow.h" #include "qt/window/QtSplashScreen.h" #include "qt/network/QtNetworkFactory.h" #include "qt/utility/utilityQt.h" @@ -25,6 +26,7 @@ void init() std::shared_ptr fileLogger = std::make_shared(); fileLogger->setLogLevel(Logger::LOG_ALL); + FileLogger::setFilePath(logPath); LogManager::getInstance()->addLogger(fileLogger); utility::loadFontsFromDirectory("data/fonts", ".otf"); @@ -52,6 +54,8 @@ int main(int argc, char *argv[]) QtViewFactory viewFactory; QtNetworkFactory networkFactory; + QtMainWindow::setWindowSettingsPath(windowSettingsPath); + Application::setAppSettingsPath(appSettingsPath); std::shared_ptr app = Application::create(version, &viewFactory, &networkFactory); if (splash) diff --git a/src/app/platform_includes/includesDefault.h b/src/app/platform_includes/includesDefault.h index 2aa5c7c8..1710b48b 100644 --- a/src/app/platform_includes/includesDefault.h +++ b/src/app/platform_includes/includesDefault.h @@ -1,6 +1,10 @@ #ifndef INCLUDES_DEFAULT_H #define INCLUDES_DEFAULT_H +static std::string appSettingsPath = "data/ApplicationSettings.xml"; +static std::string windowSettingsPath = "data/window_settings.ini"; +static std::string logPath = "data/log/"; + void setup(int argc, char *argv[]) { } diff --git a/src/app/platform_includes/includesMac.h b/src/app/platform_includes/includesMac.h index b7d34bfa..9a15cc7a 100644 --- a/src/app/platform_includes/includesMac.h +++ b/src/app/platform_includes/includesMac.h @@ -5,6 +5,10 @@ #include #include +static std::string appSettingsPath = "data/ApplicationSettings.xml"; +static std::string windowSettingsPath = "data/window_settings.ini"; +static std::string logPath = "data/log/"; + void setup(int argc, char *argv[]) { // ---------------------------------------------------------------------------- diff --git a/src/app/platform_includes/includesWindows.h b/src/app/platform_includes/includesWindows.h index 6b066be3..808848d5 100644 --- a/src/app/platform_includes/includesWindows.h +++ b/src/app/platform_includes/includesWindows.h @@ -1,10 +1,25 @@ #ifndef INCLUDES_WINDOWS_H #define INCLUDES_WINDOWS_H +#include + #include "vld.h" +#define DEPLOY + +#ifdef DEPLOY + static std::string appSettingsPath = std::string(std::getenv("APPDATA")) + "/../local/Coati Software/Coati/ApplicationSettings.xml"; + static std::string windowSettingsPath = std::string(std::getenv("APPDATA")) + "/../local/Coati Software/Coati/window_settings.ini"; + static std::string logPath = std::string(std::getenv("APPDATA")) + "/../local/Coati Software/Coati/log/"; +#else + static std::string appSettingsPath = "data/ApplicationSettings.xml"; + static std::string windowSettingsPath = "data/window_settings.ini"; + static std::string logPath = "data/log/"; +#endif + void setup(int argc, char *argv[]) { + } #endif // INCLUDES_WINDOWS_H diff --git a/src/app/qt/window/QtMainWindow.cpp b/src/app/qt/window/QtMainWindow.cpp index b190c280..62fc254f 100644 --- a/src/app/qt/window/QtMainWindow.cpp +++ b/src/app/qt/window/QtMainWindow.cpp @@ -26,6 +26,7 @@ #include "utility/messaging/type/MessageZoom.h" #include "version.h" +std::string QtMainWindow::m_windowSettingsPath = "data/window_settings.ini"; QtViewToggle::QtViewToggle(View* view, QWidget *parent) : QWidget(parent) @@ -146,7 +147,7 @@ void QtMainWindow::hideView(View* view) void QtMainWindow::loadLayout() { - QSettings settings("data/window_settings.ini", QSettings::IniFormat); + QSettings settings(m_windowSettingsPath.c_str(), QSettings::IniFormat); settings.beginGroup("MainWindow"); resize(settings.value("size", QSize(600, 400)).toSize()); @@ -167,7 +168,7 @@ void QtMainWindow::loadLayout() void QtMainWindow::saveLayout() { - QSettings settings("data/window_settings.ini", QSettings::IniFormat); + QSettings settings(m_windowSettingsPath.c_str(), QSettings::IniFormat); settings.beginGroup("MainWindow"); settings.setValue("maximized", isMaximized()); @@ -484,6 +485,11 @@ void QtMainWindow::updateRecentProjectMenu() } } +void QtMainWindow::setWindowSettingsPath(const std::string& windowSettingsPath) +{ + m_windowSettingsPath = windowSettingsPath; +} + void QtMainWindow::showLicenses() { hideScreens(); diff --git a/src/app/qt/window/QtMainWindow.h b/src/app/qt/window/QtMainWindow.h index b5af182a..f9bbb614 100644 --- a/src/app/qt/window/QtMainWindow.h +++ b/src/app/qt/window/QtMainWindow.h @@ -89,6 +89,8 @@ public slots: void handleEscapeShortcut(); void updateRecentProjectMenu(); + static void setWindowSettingsPath(const std::string& windowSettingsPath); + private: struct DockWidget { @@ -122,6 +124,8 @@ private: QShortcut* m_escapeShortcut; bool m_startScreenWasVisible; + + static std::string m_windowSettingsPath; }; #endif // QT_MAIN_WINDOW_H diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 6200fbb0..216254dd 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -16,6 +16,8 @@ #include "settings/ApplicationSettings.h" #include "settings/ColorScheme.h" +std::string Application::m_appSettingsPath = "data/ApplicationSettings.xml"; + std::shared_ptr Application::create( const Version& version, ViewFactory* viewFactory, NetworkFactory* networkFactory ){ @@ -51,7 +53,7 @@ std::shared_ptr Application::create( void Application::loadSettings() { - ApplicationSettings::getInstance()->load("data/ApplicationSettings.xml"); + ApplicationSettings::getInstance()->load(FilePath(m_appSettingsPath)); ColorScheme::getInstance()->load(ApplicationSettings::getInstance()->getColorSchemePath()); GraphViewStyle::loadStyleSettings(); @@ -111,6 +113,11 @@ void Application::saveProject(const FilePath& projectSettingsFilePath) } } +void Application::setAppSettingsPath(const std::string& appSettingsPath) +{ + m_appSettingsPath = appSettingsPath; +} + void Application::handleMessage(MessageActivateWindow* message) { m_mainView->activateWindow(); @@ -177,5 +184,5 @@ void Application::updateRecentProjects(const FilePath& projectSettingsFilePath) } appSettings->setRecentProjects(recentProjects); - appSettings->save("data/ApplicationSettings.xml"); + appSettings->save(m_appSettingsPath); } diff --git a/src/lib/Application.h b/src/lib/Application.h index 7526f285..7fec3f6a 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -36,6 +36,8 @@ public: void refreshProject(); void saveProject(const FilePath& projectSettingsFilePath); + static void setAppSettingsPath(const std::string& appSettingsPath); + private: Application(); @@ -54,6 +56,8 @@ private: std::shared_ptr m_componentManager; std::shared_ptr m_ideCommunicationController; + + static std::string m_appSettingsPath; }; #endif // APPLICATION_H diff --git a/src/lib/utility/logging/FileLogger.cpp b/src/lib/utility/logging/FileLogger.cpp index bc688f25..a8e2f0d6 100644 --- a/src/lib/utility/logging/FileLogger.cpp +++ b/src/lib/utility/logging/FileLogger.cpp @@ -1,9 +1,10 @@ #include "FileLogger.h" +#include #include #include -const std::string FileLogger::s_filePath = "data/log/"; +std::string FileLogger::s_filePath = "data/log/"; FileLogger::FileLogger() : Logger("FileLogger") @@ -15,6 +16,13 @@ FileLogger::~FileLogger() { } +void FileLogger::setFilePath(const std::string& filePath) +{ + s_filePath = filePath; + + createDirectory(); +} + void FileLogger::logInfo(const LogMessage& message) { logMessage("INFO", message); @@ -44,6 +52,14 @@ void FileLogger::setupFileName() m_fileName = filename.str(); } +void FileLogger::createDirectory() +{ + if (s_filePath.length() > 0) + { + mkdir(s_filePath.c_str()); + } +} + void FileLogger::logMessage(const std::string& type, const LogMessage& message) { std::ofstream fileStream; diff --git a/src/lib/utility/logging/FileLogger.h b/src/lib/utility/logging/FileLogger.h index 0e21a628..1fad80df 100644 --- a/src/lib/utility/logging/FileLogger.h +++ b/src/lib/utility/logging/FileLogger.h @@ -12,12 +12,15 @@ public: FileLogger(); virtual ~FileLogger(); + static void setFilePath(const std::string& filePath); + private: virtual void logInfo(const LogMessage& message); virtual void logWarning(const LogMessage& message); virtual void logError(const LogMessage& message); - static const std::string s_filePath; + static void createDirectory(); + static std::string s_filePath; void setupFileName(); void logMessage(const std::string& type, const LogMessage& message);