Compare commits

...

5123 Commits

Author SHA1 Message Date
Dimitrij
8f26d57f40 NB release 2025-10-08 00:01:23 +01:00
Dimitrij
3bd2fe889a upd to for check x64 vc++ 2025-10-07 23:56:48 +01:00
Dimitrij
492a2629c2 Replace to x64 version 2025-10-07 23:32:21 +01:00
Dimitrij
b64ddf32ff fix 2025-10-07 23:31:28 +01:00
Dimitrij
e86a550985 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-10-07 23:31:12 +01:00
Dimitrij
fcccdacb99 Remove to update 2025-10-07 23:31:05 +01:00
Dimitrij
487de4c29b Merge pull request #2871 from simonai1254/v1.78.2-dev
Update README.md featuring Icon Project
2025-10-07 22:36:13 +01:00
Dimitrij
d36c6cb067 Merge pull request #2869 from mRemoteNG/copilot/fix-color-selection-for-panel-tabs
Fix Color property converter and add missing Display category attributes for TabColor
2025-10-07 22:31:30 +01:00
Simon Monai
a4b704252b Update README.md
Include Link to Fancy Icon Collection of @bearlikelion
2025-10-07 23:29:12 +02:00
Dimitrij
93e8d26a75 Merge branch 'v1.78.2-dev' into copilot/fix-color-selection-for-panel-tabs 2025-10-07 22:26:04 +01:00
copilot-swe-agent[bot]
0a3ecaac64 Fix Color property converter and add missing category attributes
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 21:17:26 +00:00
Simon Monai
ea6b762021 Update README.md
Add Visual C++ Dependency back in
2025-10-07 23:16:12 +02:00
Dimitrij
265a43e31c fix 2025-10-07 22:12:15 +01:00
copilot-swe-agent[bot]
6d156586ac Initial plan 2025-10-07 21:11:51 +00:00
Simon Monai
68e3f607a3 Update README.md
Fix Formatting Issue with Dependency Link
2025-10-07 22:40:48 +02:00
Dimitrij
0b240a3902 Merge pull request #2864 from mRemoteNG/copilot/add-color-support-for-connection-folders
Add Color property to connections and folders with inheritance support
2025-10-07 21:25:20 +01:00
Dimitrij
4082761606 Merge branch 'v1.78.2-dev' into copilot/add-color-support-for-connection-folders 2025-10-07 21:24:50 +01:00
Dimitrij
e68c42ba64 Merge pull request #2867 from mRemoteNG/copilot/fix-tab-color-selection-error
[WIP] Fix tab color dropdown selection error
2025-10-07 21:17:04 +01:00
copilot-swe-agent[bot]
347546ee0e Add TabColorConverter to fix Color to String conversion issue
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 20:15:32 +00:00
Dimitrij
ca717d6b80 Merge pull request #2863 from mRemoteNG/copilot/add-ard-connection-support
Add ARD (Apple Remote Desktop) protocol support for macOS connections
2025-10-07 21:12:17 +01:00
copilot-swe-agent[bot]
5d623d80eb Initial plan 2025-10-07 20:10:54 +00:00
Dimitrij
a2edbd9934 Merge pull request #2865 from mRemoteNG/copilot/add-connection-tab-colors
Add configurable connection tab colors to distinguish environments
2025-10-07 21:02:05 +01:00
copilot-swe-agent[bot]
5830f39d50 Add documentation for Tab Color feature
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:51:26 +00:00
copilot-swe-agent[bot]
0aa0b59635 Add documentation for Color property in folders and inheritance
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:50:10 +00:00
copilot-swe-agent[bot]
3c6a485647 Add TabColor property to connection info and implement tab coloring
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:49:32 +00:00
copilot-swe-agent[bot]
bbe1fa8416 Add Color property to Language.Designer.cs and add inheritance tests
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:49:21 +00:00
copilot-swe-agent[bot]
ac4469bb4a Add ARD protocol support to UI, port scanning, and tests
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:48:57 +00:00
copilot-swe-agent[bot]
9e61e8eafa Add Color property to connections and folders with inheritance support
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:47:07 +00:00
copilot-swe-agent[bot]
b193199268 Add ARD protocol to VNC property attributes and default port handling
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:45:38 +00:00
copilot-swe-agent[bot]
f8b7d37af1 Add ARD (Apple Remote Desktop) protocol support
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:42:31 +00:00
Dimitrij
b3e9202d72 Merge pull request #2862 from mRemoteNG/copilot/fix-unhandled-exception-panel-closure
Fix unhandled exception when closing panel with active connections
2025-10-07 20:40:35 +01:00
copilot-swe-agent[bot]
0f819ade56 Initial plan 2025-10-07 19:39:14 +00:00
copilot-swe-agent[bot]
d682afcde2 Initial plan 2025-10-07 19:39:03 +00:00
copilot-swe-agent[bot]
e67754ee9f Fix unhandled exception when closing panel with connections
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:35:18 +00:00
copilot-swe-agent[bot]
4897771fbf Initial plan 2025-10-07 19:35:06 +00:00
copilot-swe-agent[bot]
4128f3404a Initial plan 2025-10-07 19:31:35 +00:00
Dimitrij
7bc25ceb38 Merge pull request #2861 from mRemoteNG/copilot/add-autofocus-to-password-field
[WIP] Add autofocus to password field on startup
2025-10-07 20:29:40 +01:00
Dimitrij
f77f0f5e04 Merge pull request #2859 from mRemoteNG/copilot/fix-username-field-visibility
Fix Username field visibility for External Tool protocol
2025-10-07 20:28:48 +01:00
copilot-swe-agent[bot]
0e666efaad Add autofocus to password field in FrmPassword form
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:26:14 +00:00
copilot-swe-agent[bot]
e2893b9516 Add IntApp to Username property supported protocols
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:24:01 +00:00
copilot-swe-agent[bot]
fb86b13948 Initial plan 2025-10-07 19:22:15 +00:00
copilot-swe-agent[bot]
e22cc6921d Initial plan 2025-10-07 19:19:17 +00:00
Dimitrij
42fdd91206 Merge pull request #2857 from mRemoteNG/copilot/fix-default-panel-opening
Fix Update panel auto-loading on startup
2025-10-07 20:14:21 +01:00
copilot-swe-agent[bot]
2329d95002 Remove automatic Update panel display at startup
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 16:49:36 +00:00
copilot-swe-agent[bot]
8dda6ba13f Fix Update panel auto-checking on load
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 16:47:29 +00:00
copilot-swe-agent[bot]
156e2b8056 Initial plan 2025-10-07 16:41:34 +00:00
Dimitrij
aa48324b6d NB release 2025-10-07 17:10:32 +01:00
Dimitrij
d2b05ef7c3 renaming of folder to better represent its purpose 2025-10-07 17:01:48 +01:00
Dimitrij
75545e60b3 Merge pull request #2855 from mRemoteNG/copilot/fix-login-name-display-issue
Fix missing Username field for HTTP and HTTPS protocols
2025-10-07 17:00:27 +01:00
Dimitrij
b3d0b30b56 Merge pull request #2854 from mRemoteNG/copilot/refactor-settings-popup-to-panel
Refactor settings dialog to dockable panel for consistency
2025-10-07 16:54:54 +01:00
Dimitrij
3ed3729fc2 Merge pull request #2852 from mRemoteNG/copilot/fix-object-deserialization-vulnerability
Fix XML External Entity (XXE) vulnerability in XML deserialization
2025-10-07 16:51:36 +01:00
copilot-swe-agent[bot]
cb7ba46be6 Add comprehensive security tests for SecureXmlHelper
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 15:24:35 +00:00
copilot-swe-agent[bot]
933b21598e Add Username field support for HTTP and HTTPS protocols
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 15:23:46 +00:00
copilot-swe-agent[bot]
7a8442d9ea Handle FrmOptions visibility and window lifecycle
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 15:23:39 +00:00
copilot-swe-agent[bot]
c405186533 Update test files to use SecureXmlHelper for consistency
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 15:23:39 +00:00
copilot-swe-agent[bot]
5d150115a8 Create OptionsWindow for docked settings panel
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 15:22:20 +00:00
copilot-swe-agent[bot]
26bc38cf8c Add SecureXmlHelper and update all XML deserialization to prevent XXE attacks
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 15:20:14 +00:00
copilot-swe-agent[bot]
8f769cdda3 Initial plan 2025-10-07 15:16:42 +00:00
copilot-swe-agent[bot]
6b35cd3aee Initial plan 2025-10-07 15:16:03 +00:00
copilot-swe-agent[bot]
4ae1281a3a Initial plan 2025-10-07 15:06:32 +00:00
Dimitrij
9984d4bc8f Merge pull request #2850 from mRemoteNG/copilot/fix-d3d20276-2cee-4d8f-af65-24f3320db36a
Fix password dialog appearing behind splash screen on startup
2025-10-07 16:05:53 +01:00
Dimitrij
c987ee9fd3 Merge pull request #2851 from mRemoteNG/copilot/fix-3efd67f4-15e3-43e9-9b58-50941b183621
Fix path traversal vulnerability in file operations
2025-10-07 16:04:10 +01:00
copilot-swe-agent[bot]
a031e6f5f7 Add path validation to prevent path traversal attacks
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 14:04:00 +00:00
copilot-swe-agent[bot]
da386c3119 Close splash screen before loading connections to fix password dialog z-order
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 14:02:00 +00:00
copilot-swe-agent[bot]
bfd29fc0fc Initial plan 2025-10-07 13:57:18 +00:00
copilot-swe-agent[bot]
9617776be1 Initial plan 2025-10-07 13:55:19 +00:00
Dimitrij
765f2abc40 Merge pull request #2848 from mRemoteNG/renovate/softprops-action-gh-release-digest
chore(deps): update softprops/action-gh-release digest to aec2ec5
2025-10-07 08:12:44 +01:00
Dimitrij
519bc42e0a Merge pull request #2847 from mRemoteNG/renovate/nunit3testadapter-5.x
chore(deps): update dependency nunit3testadapter to 5.2.0
2025-10-07 08:12:03 +01:00
Dimitrij
6537e6bce6 Merge pull request #2846 from mRemoteNG/renovate/reportgenerator-5.x
chore(deps): update dependency reportgenerator to 5.4.17
2025-10-07 08:11:47 +01:00
renovate[bot]
494aff1bd3 chore(deps): update softprops/action-gh-release digest to aec2ec5 2025-10-07 04:37:18 +00:00
renovate[bot]
927527b888 chore(deps): update dependency nunit3testadapter to 5.2.0 2025-10-06 22:40:49 +00:00
renovate[bot]
08054e4873 chore(deps): update dependency reportgenerator to 5.4.17 2025-10-06 22:40:43 +00:00
Dimitrij
a092fef575 Merge pull request #2845 from mRemoteNG/renovate/microsoft.web.webview2-1.x
chore(deps): update dependency microsoft.web.webview2 to 1.0.3537.50
2025-10-06 17:35:02 +01:00
renovate[bot]
2808b3d3da chore(deps): update dependency microsoft.web.webview2 to 1.0.3537.50 2025-10-06 16:28:54 +00:00
Dimitrij
ef3b236d73 fix element placement for #2842 2025-10-06 17:27:25 +01:00
Dimitrij
26f0365026 Upd translation 2025-10-06 13:51:34 +01:00
Dimitrij
25ebfee6e2 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-10-06 13:51:16 +01:00
Dimitrij
c1ada03db1 Fix for #2841 - verify if vc++ distributed x86 installed 2025-10-06 13:51:08 +01:00
Dimitrij
0b17360346 Update README.md
upd
2025-10-06 11:54:40 +01:00
Dimitrij
da18b37a54 Fix markdown formatting for Nightly release badge
upd
2025-10-06 11:52:36 +01:00
Dimitrij
4cf040c01e Update README.md
upd
2025-10-06 11:50:38 +01:00
Dimitrij
95b77515dc Update Nightly build link and download badge
upd
2025-10-06 11:47:59 +01:00
Dimitrij
65bbd8ca05 Update README.md
upd
2025-10-06 11:44:36 +01:00
Dimitrij
dbba954522 small fixes 2025-10-03 22:19:39 +01:00
Dimitrij
26d46be243 dependencies are deprecated 2025-10-03 22:18:08 +01:00
Dimitrij
135f8290ec Merge pull request #2839 from mRemoteNG/fix/aikido-security-sast-8173389-4nsd
[Aikido] AI Fix for Possible command injection via Process.Start
2025-10-03 22:00:36 +01:00
Dimitrij
a8b4e1178d Merge pull request #2837 from mRemoteNG/renovate/cucumber.messages-30.x
chore(deps): update dependency cucumber.messages to v30
2025-10-03 22:00:14 +01:00
Dimitrij
8bdf66ef02 Merge pull request #2838 from mRemoteNG/fix/aikido-security-sast-8173368-kjEd
[Aikido] AI Fix for Potential SQL injection via string-based query concatenation
2025-10-03 21:59:48 +01:00
aikido-autofix[bot]
5209b08709 fix(security): autofix Possible command injection via Process.Start 2025-10-03 20:58:27 +00:00
aikido-autofix[bot]
933247dc2f fix(security): autofix Potential SQL injection via string-based query concatenation 2025-10-03 20:57:07 +00:00
renovate[bot]
4e43bf9d8f chore(deps): update dependency cucumber.messages to v30 2025-10-03 16:58:47 +00:00
Dimitrij
0f6a5816db Merge pull request #2835 from mRemoteNG/renovate/aws-sdk-net-monorepo
chore(deps): update aws-sdk-net monorepo
2025-10-02 22:31:54 +01:00
Dimitrij
8021678995 Merge pull request #2836 from mRemoteNG/renovate/major-vstest-monorepo
chore(deps): update dependency microsoft.net.test.sdk to v18
2025-10-02 22:24:41 +01:00
renovate[bot]
147b5edec4 chore(deps): update dependency microsoft.net.test.sdk to v18 2025-10-02 11:24:09 +00:00
renovate[bot]
2edbf3222e chore(deps): update aws-sdk-net monorepo 2025-10-01 22:05:23 +00:00
Dimitrij
f6bf8c229c Merge pull request #2834 from mRemoteNG/renovate/aws-sdk-net-monorepo
chore(deps): update aws-sdk-net monorepo
2025-09-30 10:16:42 +01:00
renovate[bot]
c30b90af44 chore(deps): update aws-sdk-net monorepo 2025-09-29 21:07:53 +00:00
Dimitrij
3b72e7af3d Merge pull request #2832 from mRemoteNG/renovate/aws-sdk-net-monorepo
chore(deps): update dependency awssdk.ec2 to 4.0.40.1
2025-09-29 22:07:17 +01:00
renovate[bot]
37004647eb chore(deps): update dependency awssdk.ec2 to 4.0.40.1 2025-09-29 16:46:13 +00:00
Dimitrij
c85cb84e31 Merge pull request #2829 from mRemoteNG/renovate/configure
chore: Configure Renovate
2025-09-29 17:45:28 +01:00
renovate[bot]
d504143d7e Add renovate.json 2025-09-26 18:08:44 +00:00
Dimitrij
db1c7b9708 Merge pull request #2827 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-arm64-140.x
chore(deps): update dependency chromiumembeddedframework.runtime.win-arm64 to v140
2025-09-25 09:36:29 +01:00
Dimitrij
064cb34705 Merge pull request #2828 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-x64-140.x
chore(deps): update dependency chromiumembeddedframework.runtime.win-x64 to v140
2025-09-25 09:36:09 +01:00
Dimitrij
02c442ef99 Merge pull request #2825 from mRemoteNG/renovate/reportgenerator-5.x
chore(deps): update dependency reportgenerator to 5.4.16
2025-09-25 09:35:54 +01:00
renovate[bot]
e358cafb3f chore(deps): update dependency reportgenerator to 5.4.16 2025-09-24 20:44:07 +00:00
renovate[bot]
40e447bc05 chore(deps): update dependency chromiumembeddedframework.runtime.win-x64 to v140 2025-09-24 15:31:30 +00:00
renovate[bot]
f0bac9ee78 chore(deps): update dependency chromiumembeddedframework.runtime.win-arm64 to v140 2025-09-24 15:31:22 +00:00
Dimitrij
a75fbad0ea Merge pull request #2823 from mRemoteNG/renovate/awssdk.core-4.x
chore(deps): update dependency awssdk.core to 4.0.0.29
2025-09-23 23:57:32 +01:00
renovate[bot]
ae5a919421 chore(deps): update dependency awssdk.core to 4.0.0.29 2025-09-23 22:57:10 +00:00
Dimitrij
749cb7578a Merge pull request #2824 from mRemoteNG/renovate/awssdk.ec2-4.x
chore(deps): update dependency awssdk.ec2 to 4.0.40
2025-09-23 23:56:38 +01:00
renovate[bot]
622ea20819 chore(deps): update dependency awssdk.ec2 to 4.0.40 2025-09-23 22:08:58 +00:00
Dimitrij
a9374a5eb1 Merge pull request #2822 from mRemoteNG/copilot/fix-3abc8ac6-985e-4856-8afb-a91a0dca6d12
Remove insecure pull_request_target trigger from add_PR_2_chlog.yml workflow
2025-09-23 16:25:10 +01:00
copilot-swe-agent[bot]
1b78b68e33 Remove insecure pull_request_target trigger from workflow
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-09-23 09:30:17 +00:00
copilot-swe-agent[bot]
3e97fe0490 Initial plan 2025-09-23 09:26:03 +00:00
Dimitrij
2bb34607cc Merge pull request #2813 from mRemoteNG/renovate/gherkin-35.x
chore(deps): update dependency gherkin to 35.1.0
2025-09-21 22:08:02 +01:00
Dimitrij
fe7fca180e Merge pull request #2814 from mRemoteNG/renovate/reportgenerator-5.x
chore(deps): update dependency reportgenerator to 5.4.14
2025-09-21 22:07:49 +01:00
renovate[bot]
0a86b45d59 chore(deps): update dependency reportgenerator to 5.4.14 2025-09-21 13:56:20 +00:00
Dimitrij
62e0dd365b Merge pull request #2788 from mRemoteNG/renovate/reportgenerator-5.x
chore(deps): update dependency reportgenerator to 5.4.14
2025-09-21 14:55:49 +01:00
renovate[bot]
b39c561b72 chore(deps): update dependency gherkin to 35.1.0 2025-09-20 13:43:33 +00:00
Dimitrij
02d099629f Merge pull request #2812 from ciis0/cschulz/fix-refocus
Fix RDP refocus issues
2025-09-19 18:12:15 +01:00
Dimitrij
0f55cd2395 Update mRemoteNG/Connection/Protocol/RDP/RdpProtocol.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-19 11:39:23 +01:00
Christoph Schulz
119451e4f6 Fix RDP refocus issues
Fixes #1535
2025-09-19 09:25:40 +02:00
Dimitrij
0f6d4e5760 Merge pull request #2811 from mRemoteNG/renovate/awssdk.ec2-4.x
chore(deps): update dependency awssdk.ec2 to 4.0.39
2025-09-18 23:43:55 +01:00
renovate[bot]
452ed6a754 chore(deps): update dependency awssdk.ec2 to 4.0.39 2025-09-18 22:07:33 +00:00
Dimitrij
40928b8ab0 Merge pull request #2808 from mRemoteNG/renovate/awssdk.ec2-4.x
chore(deps): update dependency awssdk.ec2 to 4.0.38
2025-09-17 21:46:43 +01:00
renovate[bot]
f1ed380b42 chore(deps): update dependency awssdk.ec2 to 4.0.38 2025-09-17 20:34:27 +00:00
Dimitrij
e28ae8f2ba Merge pull request #2805 from mRemoteNG/renovate/awssdk.core-4.x
chore(deps): update dependency awssdk.core to 4.0.0.28
2025-09-17 10:57:26 +01:00
renovate[bot]
d8c6d9d558 chore(deps): update dependency awssdk.core to 4.0.0.28 2025-09-17 09:56:31 +00:00
Dimitrij
607123f0be Merge pull request #2806 from mRemoteNG/renovate/awssdk.ec2-4.x
chore(deps): update dependency awssdk.ec2 to 4.0.37.1
2025-09-17 10:56:00 +01:00
Dimitrij
0ff72ae665 Merge pull request #2807 from Greenie0701/arm64_dotnet
Add ARM64 support for .NET runtime detection
2025-09-17 10:55:37 +01:00
Dimitrij
552cee1c24 Update mRemoteNG/App/Update/DotNetRuntimeCheck.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-17 10:55:28 +01:00
MS-GITS
44f05a2968 Add ARM64 support for .NET runtime detection 2025-09-17 14:52:54 +05:30
MS-GITS
244fbf56d1 Add ARM64 support for .NET runtime detection 2025-09-17 14:50:41 +05:30
renovate[bot]
24845039f1 chore(deps): update dependency awssdk.ec2 to 4.0.37.1 2025-09-16 21:07:05 +00:00
Dimitrij
2e5be847ce Merge pull request #2804 from mRemoteNG/fix/aikido-security-sast--7464421-c51u
[Aikido] AI Fix for Path traversal attack possible
2025-09-16 20:44:12 +01:00
Dimitrij
9e947f7a36 Merge pull request #2803 from mRemoteNG/fix/aikido-security-sast--7464399-kZ9j
[Aikido] AI Fix for Path traversal attack possible
2025-09-16 20:43:59 +01:00
Dimitrij
87a3c60330 Merge pull request #2802 from mRemoteNG/fix/aikido-security-sast--7464375-mF7U
[Aikido] AI Fix for Path traversal attack possible
2025-09-16 20:43:47 +01:00
Dimitrij
0d460d543b Merge pull request #2801 from mRemoteNG/fix/aikido-security-sast--7464275-6ovw
[Aikido] AI Fix for Path traversal attack possible
2025-09-16 20:43:33 +01:00
Dimitrij
eb535cad2c Merge pull request #2800 from mRemoteNG/fix/aikido-security-sast--7464234-hobo
[Aikido] AI Fix for Path traversal attack possible
2025-09-16 20:43:01 +01:00
Dimitrij
eff00033b0 Merge pull request #2799 from mRemoteNG/fix/aikido-security-sast--7464163-cUFL
[Aikido] AI Fix for 3rd party Github Actions should be pinned
2025-09-16 20:42:19 +01:00
aikido-autofix[bot]
b591f97297 fix(security): autofix Path traversal attack possible 2025-09-16 16:09:27 +00:00
aikido-autofix[bot]
9501bb4428 fix(security): autofix Path traversal attack possible 2025-09-16 16:09:01 +00:00
aikido-autofix[bot]
4e9757c743 fix(security): autofix Path traversal attack possible 2025-09-16 16:08:34 +00:00
aikido-autofix[bot]
8f35b2ef71 fix(security): autofix Path traversal attack possible 2025-09-16 16:05:48 +00:00
aikido-autofix[bot]
3782eeeaf1 fix(security): autofix Path traversal attack possible 2025-09-16 16:04:39 +00:00
aikido-autofix[bot]
ec78de7a74 fix(security): autofix 3rd party Github Actions should be pinned 2025-09-16 16:02:43 +00:00
Dimitrij
bd1f311d09 CET compatibility
NB release
2025-09-16 12:03:15 +01:00
Dimitrij
31bf36db89 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-09-16 11:09:45 +01:00
Dimitrij
a96d344c22 adding missed தமிழ் (ta) Translation update #2690 from 1.77.3 branch 2025-09-16 11:09:37 +01:00
Dimitrij
dac4988514 Merge pull request #2797 from mRemoteNG/renovate/newtonsoft.json-13.x
chore(deps): update dependency newtonsoft.json to 13.0.4
2025-09-16 10:33:04 +01:00
renovate[bot]
a1f50f152c chore(deps): update dependency newtonsoft.json to 13.0.4 2025-09-16 08:54:55 +00:00
Dimitrij
06a47f4a06 Merge pull request #2795 from simonai1254/patch-1
Update minimum requirements
2025-09-16 09:40:32 +01:00
Simon Monai
f7aa9f7b92 Update README.md - Minimum Requirements
Update minimum Requirements to properly show .Net 9.0 and clarify Terminal Service Client requirements
2025-09-16 02:11:41 +02:00
Simon Monai
894b11704c Update README.md
Update .NET Runtime Requirements (9.0) for new version and remove Visual C++ Redistributables as the appear to no longer be necessary
2025-09-16 02:04:51 +02:00
Dimitrij
5b1b6ddc73 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-09-15 23:40:21 +01:00
Dimitrij
baa5abab2e clenup 2025-09-15 23:40:13 +01:00
Dimitrij
1b2ae29f4a Merge pull request #2793 from mRemoteNG/renovate/gherkin-35.x
chore(deps): update dependency gherkin to v35
2025-09-15 23:34:18 +01:00
Dimitrij
99a2b968d5 Merge pull request #2792 from mRemoteNG/renovate/actions-checkout-5.x
chore(deps): update actions/checkout action to v5
2025-09-15 23:34:04 +01:00
Dimitrij
029672a907 lib update, NB release 2025-09-15 23:32:42 +01:00
Dimitrij
31ecbaa977 .Net version detection fix
optimization
2025-09-15 23:32:06 +01:00
Dimitrij
6580e1b6db Enhance Build_mR-NB.yml with workflow_dispatch
Add manual dispatch option with release flag to workflow
2025-09-15 21:14:20 +01:00
renovate[bot]
16bbe4ccc0 chore(deps): update dependency gherkin to v35 2025-09-14 09:57:40 +00:00
renovate[bot]
6ea3642700 chore(deps): update actions/checkout action to v5 2025-09-14 09:57:36 +00:00
renovate[bot]
b8270d2264 chore(deps): update dependency reportgenerator to 5.4.13 2025-09-13 21:15:42 +00:00
Dimitrij
7b7fe1b062 Merge pull request #2787 from mRemoteNG/renovate/google.protobuf-3.x
chore(deps): update dependency google.protobuf to 3.32.1
2025-09-13 21:44:52 +01:00
Dimitrij
e67c97cc21 Update workflow to trigger on specific branch 2025-09-13 21:40:37 +01:00
Dimitrij
1033214658 Merge pull request #2786 from mRemoteNG/renovate/awssdk.core-4.x
chore(deps): update dependency awssdk.core to 4.0.0.27
2025-09-13 21:38:16 +01:00
Dimitrij
55552ad118 Update workflow to handle default branch and PR merges 2025-09-13 21:32:40 +01:00
renovate[bot]
552c53b15d chore(deps): update dependency google.protobuf to 3.32.1 2025-09-13 19:30:23 +00:00
renovate[bot]
278fc30ae8 chore(deps): update dependency awssdk.core to 4.0.0.27 2025-09-13 19:30:19 +00:00
Dimitrij
80fb676763 Merge pull request #2779 from mRemoteNG/renovate/system.io.pipelines-9.x
chore(deps): update dependency system.io.pipelines to 9.0.9
2025-09-13 15:31:41 +01:00
Dimitrij
c511fd1895 Merge branch 'v1.78.2-dev' into renovate/system.io.pipelines-9.x 2025-09-13 15:31:35 +01:00
Dimitrij
e43a644eb0 Merge pull request #2777 from mRemoteNG/renovate/system.drawing.common-9.x
chore(deps): update dependency system.drawing.common to 9.0.9
2025-09-13 15:30:57 +01:00
Dimitrij
70c16caf6b Merge branch 'v1.78.2-dev' into renovate/system.drawing.common-9.x 2025-09-13 15:30:50 +01:00
Dimitrij
21dcfc9435 Merge pull request #2775 from mRemoteNG/renovate/system.diagnostics.eventlog-9.x
chore(deps): update dependency system.diagnostics.eventlog to 9.0.9
2025-09-13 15:29:45 +01:00
Dimitrij
56ff019185 Merge branch 'v1.78.2-dev' into renovate/system.diagnostics.eventlog-9.x 2025-09-13 15:29:39 +01:00
Dimitrij
44a6cb31aa Merge pull request #2780 from mRemoteNG/renovate/system.management-9.x
chore(deps): update dependency system.management to 9.0.9
2025-09-13 15:28:14 +01:00
Dimitrij
a01ebdaa9d Merge pull request #2781 from mRemoteNG/renovate/system.reflection.metadata-9.x
chore(deps): update dependency system.reflection.metadata to 9.0.9
2025-09-13 15:27:57 +01:00
Dimitrij
651b742cc2 Merge pull request #2778 from mRemoteNG/renovate/system.formats.asn1-9.x
chore(deps): update dependency system.formats.asn1 to 9.0.9
2025-09-13 15:27:46 +01:00
Dimitrij
e2b1eb6e4a Merge pull request #2783 from mRemoteNG/renovate/system.security.cryptography.protecteddata-9.x
chore(deps): update dependency system.security.cryptography.protecteddata to 9.0.9
2025-09-13 15:27:25 +01:00
Dimitrij
2546620c8d Merge pull request #2784 from mRemoteNG/renovate/system.security.permissions-9.x
chore(deps): update dependency system.security.permissions to 9.0.9
2025-09-13 15:26:46 +01:00
Dimitrij
826f75348c Merge pull request #2776 from mRemoteNG/renovate/system.directoryservices-9.x
chore(deps): update dependency system.directoryservices to 9.0.9
2025-09-13 15:26:33 +01:00
Dimitrij
b27462da05 Merge pull request #2774 from mRemoteNG/renovate/system.diagnostics.diagnosticsource-9.x
chore(deps): update dependency system.diagnostics.diagnosticsource to 9.0.9
2025-09-13 15:26:04 +01:00
renovate[bot]
ad0ade5dd4 chore(deps): update dependency system.security.permissions to 9.0.9 2025-09-10 12:52:32 +00:00
renovate[bot]
6e3cf4630e chore(deps): update dependency system.security.cryptography.protecteddata to 9.0.9 2025-09-10 12:52:28 +00:00
renovate[bot]
6f3768db4b chore(deps): update dependency system.reflection.metadata to 9.0.9 2025-09-10 09:01:05 +00:00
renovate[bot]
98220ccf93 chore(deps): update dependency system.management to 9.0.9 2025-09-10 09:01:01 +00:00
renovate[bot]
52688d7145 chore(deps): update dependency system.io.pipelines to 9.0.9 2025-09-10 06:31:41 +00:00
renovate[bot]
b24edae66b chore(deps): update dependency system.formats.asn1 to 9.0.9 2025-09-10 06:31:37 +00:00
renovate[bot]
ac39ce26ee chore(deps): update dependency system.drawing.common to 9.0.9 2025-09-10 03:14:02 +00:00
renovate[bot]
cf041c661b chore(deps): update dependency system.directoryservices to 9.0.9 2025-09-10 03:13:59 +00:00
Dimitrij
9d173d0bdc Refactor GitHub Actions workflow for changelog updates 2025-09-10 00:07:43 +01:00
Dimitrij
aafb608149 Update GitHub Actions workflow for Renovate PRs 2025-09-09 23:27:09 +01:00
renovate[bot]
04dd125ee6 chore(deps): update dependency system.diagnostics.eventlog to 9.0.9 2025-09-09 22:25:19 +00:00
renovate[bot]
e501235b2e chore(deps): update dependency system.diagnostics.diagnosticsource to 9.0.9 2025-09-09 22:25:15 +00:00
Dimitrij
7c6a322787 Refactor GitHub Actions workflow for changelog updates 2025-09-09 23:16:32 +01:00
Dimitrij
eed729181b Update workflow for changelog generation 2025-09-09 22:48:02 +01:00
Dimitrij
ce9d42d304 Merge pull request #2773 from mRemoteNG/renovate/system.configuration.configurationmanager-9.x
chore(deps): update dependency system.configuration.configurationmanager to 9.0.9
2025-09-09 22:30:13 +01:00
Dimitrij
733e31e54b Merge branch 'v1.78.2-dev' into renovate/system.configuration.configurationmanager-9.x 2025-09-09 22:30:02 +01:00
Dimitrij
f1714f3228 Update workflow to modify changelog after PR merge 2025-09-09 21:17:05 +01:00
Dimitrij
44c90f0de4 Fix variable interpolation in changelog update
upd
2025-09-09 21:01:48 +01:00
Dimitrij
8268310685 added new section 2025-09-09 20:58:56 +01:00
Dimitrij
d64eaf6234 Refactor PR title extraction and changelog update
upd
2025-09-09 20:57:26 +01:00
Dimitrij
4d0b848676 Update workflow to handle Renovate PRs on push
upd
2025-09-09 20:53:23 +01:00
Dimitrij
d508ca33c8 Merge pull request #2772 from mRemoteNG/renovate/system.collections.immutable-9.x
chore(deps): update dependency system.collections.immutable to 9.0.9
2025-09-09 20:29:34 +01:00
renovate[bot]
86fdea129b chore(deps): update dependency system.configuration.configurationmanager to 9.0.9 2025-09-09 18:30:04 +00:00
renovate[bot]
79af98845a chore(deps): update dependency system.collections.immutable to 9.0.9 2025-09-09 18:29:59 +00:00
Dimitrij
2c15c6b0ed Merge pull request #2771 from mRemoteNG/renovate/microsoft.extensions.dependencymodel-9.x
chore(deps): update dependency microsoft.extensions.dependencymodel to 9.0.9
2025-09-09 18:18:31 +01:00
Dimitrij
52ee10efda Merge branch 'v1.78.2-dev' into renovate/microsoft.extensions.dependencymodel-9.x 2025-09-09 18:18:19 +01:00
Dimitrij
2da7d02a2c Update GitHub Actions workflow for PRs
update
2025-09-09 17:50:38 +01:00
Dimitrij
7af4ba27f3 Merge pull request #2770 from mRemoteNG/renovate/microsoft.extensions.configuration.usersecrets-9.x
chore(deps): update dependency microsoft.extensions.configuration.usersecrets to 9.0.9
2025-09-09 17:42:16 +01:00
Dimitrij
46cd974a58 Update changelog update workflow
Fix sed command to append entries in CHANGELOG.md
2025-09-09 17:35:32 +01:00
renovate[bot]
3d791b7f78 chore(deps): update dependency microsoft.extensions.dependencymodel to 9.0.9 2025-09-09 14:33:54 +00:00
renovate[bot]
29e27c1283 chore(deps): update dependency microsoft.extensions.configuration.usersecrets to 9.0.9 2025-09-09 14:33:49 +00:00
Dimitrij
8434ab460c Merge pull request #2768 from mRemoteNG/renovate/cucumber.messages-29.x
chore(deps): update dependency cucumber.messages to v29
2025-09-08 18:02:21 +01:00
Dimitrij
561d073bba Merge pull request #2767 from mRemoteNG/renovate/microsoft.web.webview2-1.x
chore(deps): update dependency microsoft.web.webview2 to 1.0.3485.44
2025-09-08 18:02:09 +01:00
renovate[bot]
d46d37acb9 chore(deps): update dependency cucumber.messages to v29 2025-09-08 14:50:37 +00:00
renovate[bot]
4f4d841137 chore(deps): update dependency microsoft.web.webview2 to 1.0.3485.44 2025-09-08 14:50:33 +00:00
Dimitrij
b7e80ceee9 Merge pull request #2766 from Greenie0701/fix_win_ci
ci: fix T4 template transform by adding EnvDTE & Interop references
2025-09-08 09:20:00 +01:00
Wise Man
8a3112c71f ci: fix T4 template transform by adding EnvDTE & Interop references 2025-09-07 09:28:45 +05:30
Dimitrij
4276b1439b Merge pull request #2765 from mRemoteNG/renovate/awssdk.ec2-4.x
Update dependency AWSSDK.EC2 to 4.0.37
2025-09-05 10:38:42 +01:00
renovate[bot]
3f626149f4 Update dependency AWSSDK.EC2 to 4.0.37 2025-09-04 20:57:09 +00:00
Dimitrij
30b674f8f5 .net check 2025-08-31 01:12:03 +01:00
Dimitrij
fe3fb46e94 undo 2025-08-28 18:15:07 +01:00
Dimitrij
99c524c7b6 fix? 2025-08-28 18:08:26 +01:00
Dimitrij
5da7a582bf Fix indentation and formatting in Build_mR-NB.yml
try to fix
2025-08-28 18:07:27 +01:00
Dimitrij
229c46a0c1 temporary disable Platform variable 2025-08-28 17:17:15 +01:00
Dimitrij
78d347889b Merge pull request #2762 from mRemoteNG/renovate/awssdk.ec2-4.x
Update dependency AWSSDK.EC2 to 4.0.33
2025-08-27 10:01:59 +01:00
renovate[bot]
244741ba15 Update dependency AWSSDK.EC2 to 4.0.33 2025-08-26 22:45:48 +00:00
Dimitrij
015fa601a3 Merge pull request #2761 from mRemoteNG/renovate/awssdk.ec2-4.x
Update dependency AWSSDK.EC2 to 4.0.32
2025-08-26 08:48:27 +01:00
renovate[bot]
1bd9e44ecb Update dependency AWSSDK.EC2 to 4.0.32 2025-08-25 22:33:55 +00:00
Dimitrij
dc7cfdb762 Merge pull request #2759 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-arm64-139.x
Update dependency chromiumembeddedframework.runtime.win-arm64 to v139
2025-08-25 00:09:27 +01:00
Dimitrij
36afbae5af Merge pull request #2760 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-x64-139.x
Update dependency chromiumembeddedframework.runtime.win-x64 to v139
2025-08-25 00:09:05 +01:00
Dimitrij
89d56a10f0 Merge pull request #2758 from mRemoteNG/renovate/log4net-3.x
Update dependency log4net to 3.2.0
2025-08-25 00:08:51 +01:00
Dimitrij
8dcc6031e6 Merge pull request #2757 from mRemoteNG/renovate/awssdk.core-4.x
Update dependency AWSSDK.Core to 4.0.0.25
2025-08-25 00:08:37 +01:00
renovate[bot]
b524a5424a Update dependency chromiumembeddedframework.runtime.win-x64 to v139 2025-08-23 08:58:53 +00:00
renovate[bot]
f06ad99658 Update dependency chromiumembeddedframework.runtime.win-arm64 to v139 2025-08-23 08:58:48 +00:00
renovate[bot]
f4ad61a41b Update dependency log4net to 3.2.0 2025-08-22 23:46:53 +00:00
renovate[bot]
3c948aca96 Update dependency AWSSDK.Core to 4.0.0.25 2025-08-22 23:46:49 +00:00
Dimitrij
57ee792198 Merge pull request #2755 from mRemoteNG/renovate/awssdk.ec2-4.x
Update dependency AWSSDK.EC2 to 4.0.31.1
2025-08-22 00:51:18 +01:00
renovate[bot]
6d84364cec Update dependency AWSSDK.EC2 to 4.0.31.1 2025-08-21 23:51:10 +00:00
Dimitrij
d74fc16cfd Merge pull request #2754 from mRemoteNG/renovate/awssdk.core-4.x
Update dependency AWSSDK.Core to 4.0.0.24
2025-08-22 00:50:48 +01:00
renovate[bot]
56d72cb30b Update dependency AWSSDK.Core to 4.0.0.24 2025-08-21 23:40:29 +00:00
Dimitrij
2f6f03ce8f Merge pull request #2740 from mRemoteNG/renovate/nunit.console-3.x
Update dependency NUnit.Console to 3.20.1
2025-08-21 13:10:46 +01:00
renovate[bot]
b437ff3dcc Update dependency NUnit.Console to 3.20.1 2025-08-21 12:09:49 +00:00
Dimitrij
93d17c2c35 Merge pull request #2741 from mRemoteNG/renovate/nunit.consolerunner-3.x
Update dependency NUnit.ConsoleRunner to 3.20.1
2025-08-21 13:09:37 +01:00
Dimitrij
b70ea04f02 Merge pull request #2749 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-x64-138.x
Update dependency chromiumembeddedframework.runtime.win-x64 to v138
2025-08-21 13:09:23 +01:00
Dimitrij
89cde8b518 Merge pull request #2748 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-arm64-138.x
Update dependency chromiumembeddedframework.runtime.win-arm64 to v138
2025-08-21 13:09:07 +01:00
Dimitrij
8d78623730 Merge pull request #2747 from mRemoteNG/renovate/actions-checkout-5.x
Update actions/checkout action to v5
2025-08-21 13:08:54 +01:00
Dimitrij
4a5b05f669 Merge pull request #2751 from mRemoteNG/renovate/softprops-action-gh-release-2.x
Update softprops/action-gh-release action to v2
2025-08-21 13:08:40 +01:00
Dimitrij
c4f2b7ed2e Merge pull request #2745 from mRemoteNG/renovate/nunit3testadapter-5.x
Update dependency NUnit3TestAdapter to 5.1.0
2025-08-21 13:08:21 +01:00
renovate[bot]
e296c77b14 Update dependency chromiumembeddedframework.runtime.win-x64 to v138 2025-08-21 12:06:56 +00:00
Dimitrij
56611c6e41 Merge pull request #2752 from mRemoteNG/renovate/microsoft.extensions.dependencymodel-9.x
Update dependency Microsoft.Extensions.DependencyModel to 9.0.8
2025-08-21 13:06:56 +01:00
renovate[bot]
1e216b8cb3 Update dependency chromiumembeddedframework.runtime.win-arm64 to v138 2025-08-21 12:06:52 +00:00
renovate[bot]
302700ac80 Update dependency Microsoft.Extensions.DependencyModel to 9.0.8 2025-08-21 12:06:45 +00:00
Dimitrij
cc5d943a86 Merge pull request #2753 from mRemoteNG/renovate/microsoft.net.test.sdk-17.x
Update dependency Microsoft.NET.Test.Sdk to 17.14.1
2025-08-21 13:06:32 +01:00
Dimitrij
7942f93649 Merge pull request #2744 from mRemoteNG/renovate/nunit-4.x
Update dependency NUnit to 4.4.0
2025-08-21 13:05:51 +01:00
Dimitrij
270c6dd64b Merge pull request #2750 from mRemoteNG/renovate/gherkin-34.x
Update dependency Gherkin to v34
2025-08-21 13:05:33 +01:00
Dimitrij
9f1633bc63 Merge pull request #2746 from mRemoteNG/renovate/actions-cache-4.x
Update actions/cache action to v4
2025-08-21 13:05:20 +01:00
Dimitrij
8953ec0e1f Merge pull request #2738 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-x64-92.x
Update dependency chromiumembeddedframework.runtime.win-x64 to 92.0.26
2025-08-21 13:05:03 +01:00
Dimitrij
8f5dd3bc93 Merge pull request #2737 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-arm64-92.x
Update dependency chromiumembeddedframework.runtime.win-arm64 to 92.0.26
2025-08-21 13:04:45 +01:00
renovate[bot]
97ee6e6ee0 Update dependency Microsoft.NET.Test.Sdk to 17.14.1 2025-08-21 12:04:12 +00:00
renovate[bot]
ae626294f3 Update softprops/action-gh-release action to v2 2025-08-21 11:39:30 +00:00
renovate[bot]
842a45aa17 Update dependency Gherkin to v34 2025-08-21 11:39:26 +00:00
renovate[bot]
686936e7b2 Update actions/checkout action to v5 2025-08-21 11:39:15 +00:00
renovate[bot]
8ac8ad6ed9 Update actions/cache action to v4 2025-08-21 11:39:12 +00:00
renovate[bot]
e7eda49676 Update dependency NUnit3TestAdapter to 5.1.0 2025-08-21 11:39:09 +00:00
renovate[bot]
faae8c7a77 Update dependency NUnit to 4.4.0 2025-08-21 11:39:05 +00:00
renovate[bot]
5cb67a6e09 Update dependency NUnit.ConsoleRunner to 3.20.1 2025-08-21 11:38:52 +00:00
renovate[bot]
06747dc38d Update dependency chromiumembeddedframework.runtime.win-x64 to 92.0.26 2025-08-21 11:38:41 +00:00
renovate[bot]
c3813fd87b Update dependency chromiumembeddedframework.runtime.win-arm64 to 92.0.26 2025-08-21 11:38:34 +00:00
Dimitrij
901584a2e4 upd 2025-08-21 01:21:42 +01:00
Dimitrij
f9e33c7fca fix 2025-08-21 00:49:09 +01:00
Dimitrij
ea36ca37f0 Merge pull request #2736 from asherbiny/v1.78.2-dev
Change Default RDP Version to v10
2025-08-21 00:18:39 +01:00
Dimitrij
2ea06f3096 add include 2025-08-21 00:16:13 +01:00
Dimitrij
dc208973c8 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-21 00:03:44 +01:00
Dimitrij
18ddb1001b one more fix 2025-08-21 00:03:37 +01:00
Dimitrij
567bc4a112 Update Build_mR-NB.yml
fix step 1
2025-08-20 23:29:46 +01:00
Dimitrij
c5dbf5a412 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-20 23:21:00 +01:00
Dimitrij
c084e66db5 fix path attribute (finger cross) 2025-08-20 23:20:53 +01:00
Ahmed ElSherbiny
bb6d35f91f Change Default RDP Version to v10
Problem I'm solving:
When importing RDP files, mRemoteNG defaults to RDPv6 (which is extremely old, and particularly does not support Gateway access tokens). Thus I would have to manually change the config to a newer RDP protocol, so that I could initiate  the connection.

It is safe to assume that the majority of Windows PCs on the internet today are running Windows 10 or above, and by keeping the default at RDP6 we are causing more unnecessary friction to those majority users.

I've changed the default to Rdp10 (released in Windows 10).
https://en.wikipedia.org/wiki/Remote_Desktop_Protocol#Version_10.0
2025-08-20 15:05:09 -07:00
Dimitrij
ac59bc2999 Update Build_mR-NB.yml
upd
2025-08-20 23:03:30 +01:00
Dimitrij
7dfb1d395d Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-20 22:59:49 +01:00
Dimitrij
46672ca976 adjustment 2025-08-20 22:59:42 +01:00
Dimitrij
94e7e23cda Update Build_mR-NB.yml
extend t4 step
2025-08-20 22:58:08 +01:00
Dimitrij
2fa0ca41d6 adjustment 2025-08-20 22:51:50 +01:00
Dimitrij
2ebe35c6d6 amendments 2025-08-20 22:42:42 +01:00
Dimitrij
354066de0b corrections 2025-08-20 22:39:22 +01:00
Dimitrij
3d3c1f8f23 fix to local 2025-08-20 22:31:09 +01:00
Dimitrij
24448d604d fix path 2025-08-20 22:25:16 +01:00
Dimitrij
7d8e530ebf add EnvDTE 2025-08-20 22:22:29 +01:00
Dimitrij
5db88040cc lib update 2025-08-20 22:06:21 +01:00
Dimitrij
d9de6e78d7 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-20 21:54:55 +01:00
Dimitrij
da136bfebd update .tt template to include platform type 2025-08-20 21:54:47 +01:00
Dimitrij
6657063441 Update Build_mR-NB.yml
upd
2025-08-19 22:38:42 +01:00
Dimitrij
47e6d4d711 test 2025-08-19 22:32:07 +01:00
Dimitrij
32c7bd2627 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-19 22:12:06 +01:00
Dimitrij
3422d064ac change to set platform type 2025-08-19 22:11:58 +01:00
Dimitrij
0b01d40a85 Update Build_mR-NB.yml
override platform depending on build platform
2025-08-19 22:11:20 +01:00
Dimitrij
7f79dc6098 upd 2025-08-19 19:22:46 +01:00
Dimitrij
ac7590f23c Merge pull request #2734 from Mugundanmcw/fix_x64
fix native build for Windows-x64
2025-08-19 19:20:07 +01:00
Mugu~~
998bd3a1a9 fix native build for windows-x64 2025-08-19 23:43:53 +05:30
Dimitrij
0f62f1d72c update to signed version 2025-08-19 00:28:14 +01:00
Dimitrij
cb1b1a5cac lib updates 2025-08-18 08:29:03 +01:00
Dimitrij
63ccdd0a23 Merge pull request #2728 from Mugundanmcw/win_arm64
Add support for building mRemoteNG on Windows ARM64
2025-08-18 08:25:40 +01:00
Dimitrij
ead809cc90 Update mRemoteNG/mRemoteNG.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-18 08:23:54 +01:00
Dimitrij
dfd4851bf1 Update ObjectListView/ObjectListView.NetCore.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-18 08:23:44 +01:00
Mugu~~
e50f11697f Add support for building mRemoteNG on Windows ARM64 2025-08-17 20:23:35 +05:30
Dimitrij
4800ad53dc Create post_2_Reddit.yml
bump
2025-08-15 13:08:32 +01:00
Dimitrij
9349c3f055 Lib update 2025-08-15 12:19:35 +01:00
Dimitrij
d7a82ae911 Update Build_mR-NB.yml
fix
2025-08-15 11:06:28 +01:00
Dimitrij
b3354fb033 Update Build_mR-NB.yml
fix
2025-08-15 10:51:18 +01:00
Dimitrij
9b56b11c9b Update Build_mR-NB.yml
upd
2025-08-15 10:41:58 +01:00
Dimitrij
15247c3637 Update Build_mR-NB.yml
update actions
2025-08-14 22:37:37 +01:00
Dimitrij
4311d3b057 Update Build_mR-NB.yml
update action
2025-08-14 22:26:37 +01:00
Dimitrij
076db0637f Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-14 22:04:38 +01:00
Dimitrij
8a7108910d Update Change log 2025-08-14 22:04:30 +01:00
Dimitrij
be12600094 Update Build_mR-NB.yml
upd
2025-08-14 21:48:17 +01:00
Dimitrij
988305100d Update Build_mR-NB.yml
Update Action
2025-08-14 21:38:17 +01:00
Dimitrij
16ae28ee62 Update Build_mR-NB.yml
upd
2025-08-14 21:16:09 +01:00
Dimitrij
30aab57bc9 Update Build_mR-NB.yml
fix
2025-08-14 21:04:34 +01:00
Dimitrij
a573914668 Update Build_mR-NB.yml
test
2025-08-14 20:50:12 +01:00
Dimitrij
83771cc2e6 Update Build_mR-NB.yml
text
2025-08-14 20:28:09 +01:00
Dimitrij
d8eaba75d2 Update Build_mR-NB.yml
test
2025-08-14 13:06:34 +01:00
Dimitrij
96f917a1ab Update Build_mR-NB.yml
fix
2025-08-14 12:47:43 +01:00
Dimitrij
44d81a6bdf Update Build_mR-NB.yml
test
2025-08-14 12:33:12 +01:00
Dimitrij
1b0e8440ae Update Build_mR-NB.yml
test
2025-08-14 12:22:48 +01:00
Dimitrij
e236dbe661 Update Build_mR-NB.yml
test
2025-08-14 12:14:45 +01:00
Dimitrij
2ba7d09c21 Update Build_mR-NB.yml
test
2025-08-14 12:09:44 +01:00
Dimitrij
2b937689bd Update Build_mR-NB.yml
fix
2025-08-14 12:01:51 +01:00
Dimitrij
eeb7eb7ad2 Update Build_mR-NB.yml
test
2025-08-14 11:43:13 +01:00
Dimitrij
c8e29211eb Update Build_mR-NB.yml
test
2025-08-14 11:35:03 +01:00
Dimitrij
57cce7ec22 Update Build_mR-NB.yml
test
2025-08-14 11:23:18 +01:00
Dimitrij
78af721250 Update Build_mR-NB.yml
tst
2025-08-14 11:09:40 +01:00
Dimitrij
cba6c2dacc Update Build_mR-NB.yml
test
2025-08-14 11:08:56 +01:00
Dimitrij
b4b12cdbdc Update Build_mR-NB.yml
fix
2025-08-14 03:20:48 +01:00
Dimitrij
e7c86c95fe Update Build_mR-NB.yml
fix
2025-08-14 03:17:03 +01:00
Dimitrij
f28d96e91a Update Build_mR-NB.yml
fix
2025-08-14 03:09:46 +01:00
Dimitrij
b25217dd38 Update Build_mR-NB.yml
fix token
2025-08-14 02:53:55 +01:00
Dimitrij
f60da8665b Update Build_mR-NB.yml
add token
2025-08-14 02:47:39 +01:00
Dimitrij
3d8daff050 Update Build_mR-NB.yml
fix
2025-08-14 02:43:14 +01:00
Dimitrij
c41f3c21c1 Update Build_mR-NB.yml
fix
2025-08-14 02:29:19 +01:00
Dimitrij
8e7897bf76 Update Build_mR-NB.yml
fix
2025-08-14 02:17:48 +01:00
Dimitrij
050bf75fdd Update Build_mR-NB.yml
fix
2025-08-14 02:13:49 +01:00
Dimitrij
1bbfcd0a7c Update Build_mR-NB.yml
fix
2025-08-14 01:51:43 +01:00
Dimitrij
30106d0006 Update Build_mR-NB.yml
fix
2025-08-14 01:46:26 +01:00
Dimitrij
16974068d7 Update Build_mR-NB.yml
fix
2025-08-14 01:41:53 +01:00
Dimitrij
08d0f67062 Update Build_mR-NB.yml
fix
2025-08-14 01:23:26 +01:00
Dimitrij
2edcb5863c Update Build_mR-NB.yml
fix
2025-08-14 01:19:57 +01:00
Dimitrij
44b9e49a54 Update Build_mR-NB.yml
fix
2025-08-14 01:13:33 +01:00
Dimitrij
0175903f51 Update Build_mR-NB.yml
fix date
2025-08-14 00:52:28 +01:00
Dimitrij
0ef282f89c Update Build_mR-NB.yml
fix
2025-08-14 00:51:48 +01:00
Dimitrij
b4eec7d44c Update Build_mR-NB.yml
fix and upd
2025-08-14 00:39:41 +01:00
Dimitrij
2e040a39db Update Build_mR-NB.yml
upd
2025-08-14 00:30:37 +01:00
Dimitrij
7e0ee705ff Update Build_mR-NB.yml
upd
2025-08-14 00:28:37 +01:00
Dimitrij
361005e242 Update Build_mR-NB.yml
fix
2025-08-14 00:17:37 +01:00
Dimitrij
2ea26f7319 Update Build_mR-NB.yml
fix
2025-08-14 00:04:56 +01:00
Dimitrij
44c4ca232f Update Build_mR-NB.yml
fix 11
2025-08-13 23:57:16 +01:00
Dimitrij
f7bb45288e Update Build_mR-NB.yml
fix10
2025-08-13 23:50:46 +01:00
Dimitrij
c99aa41744 Update Build_mR-NB.yml
fix 9
2025-08-13 23:43:09 +01:00
Dimitrij
4eb1cc939c Update Build_mR-NB.yml
remove raw
2025-08-13 23:32:33 +01:00
Dimitrij
d4c51f18f5 Update Build_mR-NB.yml
fix8
2025-08-13 22:14:35 +01:00
Dimitrij
af89c8bba7 Update Build_mR-NB.yml
fix 6
2025-08-13 22:12:02 +01:00
Dimitrij
2e951ef0db Update Build_mR-NB.yml
fix5
2025-08-13 22:06:33 +01:00
Dimitrij
80b82366c4 Update Build_mR-NB.yml
fix4
2025-08-13 22:00:23 +01:00
Dimitrij
3d75eae9c0 Update Build_mR-NB.yml
fix3
2025-08-13 21:52:19 +01:00
Dimitrij
0bd8d9c4ca Update Build_mR-NB.yml
fix2
2025-08-13 19:55:06 +01:00
Dimitrij
b3c1132a25 Update Build_mR-NB.yml
fix
2025-08-13 19:07:42 +01:00
Dimitrij
bddcb16e8a Update Build_mR-NB.yml
fix folder path
2025-08-13 18:57:49 +01:00
Dimitrij
3cb2ba6fa3 Update Build_mR-NB.yml
correct path
2025-08-13 18:47:50 +01:00
Dimitrij
205c8914ed Update Build_mR-NB.yml
upd
2025-08-13 18:38:50 +01:00
Dimitrij
76e0b67599 Update Build_mR-NB.yml
removed !!!
2025-08-13 18:26:51 +01:00
Dimitrij
2c617b230a Update and rename Build mR-NB.yml to Build_mR-NB.yml
update a name
2025-08-13 18:23:26 +01:00
Dimitrij
72d3268d39 lib update 2025-08-13 18:19:40 +01:00
Dimitrij
a093a77610 Merge pull request #2723 from asherbiny/v1.78.2-dev
Read keyboardhook, gatewayaccesstoken and gatewaycredentialssource from RDP File
2025-08-12 10:03:24 +01:00
asherbiny
a9c6443c18 Merge branch 'v1.78.2-dev' into v1.78.2-dev 2025-08-08 11:45:29 -05:00
Ahmed ElSherbiny
757932ed4a Add comment for duplicate cases
Cases 3 & 4 both require the user to manually enter Gateway credentials. Comment added for code readability.
2025-08-08 09:43:03 -07:00
Dimitrij
55aad85bdd Update Build mR-NB.yml
debug
2025-08-08 03:24:14 +01:00
Dimitrij
952d87f858 Update Build mR-NB.yml
add debug
2025-08-08 03:11:46 +01:00
Dimitrij
81fbe68e3b Update Build mR-NB.yml
fix
2025-08-08 02:58:11 +01:00
Dimitrij
c82cd15f24 Update Build mR-NB.yml
fix
2025-08-08 02:56:06 +01:00
Dimitrij
9991f7015f Update Build mR-NB.yml
fix
2025-08-08 02:53:39 +01:00
Dimitrij
e94fac0459 Update Build mR-NB.yml
fix permission
2025-08-08 02:52:00 +01:00
Dimitrij
816833c9f3 Update Build mR-NB.yml
fix 403
2025-08-08 02:51:17 +01:00
Dimitrij
a202d72cd6 Update Build mR-NB.yml
release fix
2025-08-08 02:44:53 +01:00
Dimitrij
0558b0621a Update Build mR-NB.yml
fix
2025-08-08 02:31:05 +01:00
Dimitrij
6e12b398d4 Update Build mR-NB.yml
fix
2025-08-08 02:24:21 +01:00
Dimitrij
cce9aa5e97 Update Build mR-NB.yml
fix
2025-08-08 02:19:47 +01:00
Dimitrij
6020122297 Update Build mR-NB.yml
another fix
2025-08-08 02:13:00 +01:00
Dimitrij
bed11116fe Update Build mR-NB.yml
zip name
2025-08-08 02:01:23 +01:00
Dimitrij
66cf93ffdd Update Build mR-NB.yml
upd
2025-08-08 01:45:09 +01:00
Dimitrij
8f1ca7dee2 Update Build mR-NB.yml
upd
2025-08-08 01:40:01 +01:00
Dimitrij
b24eac52ae Update Build mR-NB.yml
upd
2025-08-08 01:31:12 +01:00
Dimitrij
5aaa3a00b4 upd 2025-08-08 01:22:03 +01:00
Dimitrij
0d737228b0 upd tt 2025-08-08 01:18:15 +01:00
Dimitrij
f57c862c3c Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-08 01:15:40 +01:00
Dimitrij
ba476533ed upd template 2025-08-08 01:15:33 +01:00
Dimitrij
28b39688ec Update Build mR-NB.yml
fix
2025-08-08 01:10:31 +01:00
Dimitrij
fd8b1a8807 Update Build mR-NB.yml
fix prj name
2025-08-08 01:07:37 +01:00
Dimitrij
bff44b5d74 Update Build mR-NB.yml
upd
2025-08-08 01:06:02 +01:00
Dimitrij
a9ee32d020 Update and rename mR-NB.yml to Build mR-NB.yml
upd env
2025-08-08 01:03:26 +01:00
Dimitrij
4fd1864eef Update mR-NB.yml
replace texttransform wiht dotnet-t4
2025-08-08 01:01:14 +01:00
Dimitrij
3775279659 upd prj 2025-08-08 00:55:21 +01:00
Dimitrij
5bba633ab1 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-08-08 00:54:27 +01:00
Dimitrij
900cc0afe3 lib update 2025-08-08 00:54:19 +01:00
Dimitrij
29fa64825e Update mR-NB.yml
add TextTransform
2025-08-08 00:13:21 +01:00
Dimitrij
1c59404299 Update mR-NB.yml
fix
2025-08-07 23:59:25 +01:00
Dimitrij
563613be6b Update mR-NB.yml
upd to new build structure
2025-08-07 23:52:46 +01:00
Dimitrij
5ae2296400 Update mR-NB.yml
upd to latest VS
2025-08-07 23:31:44 +01:00
Dimitrij
9534ceccd9 Update and rename build-x86_64.yml to mR-NB.yml
update to latest and switch to new branch
2025-08-07 23:30:51 +01:00
asherbiny
878845941d Merge branch 'v1.78.2-dev' into v1.78.2-dev 2025-08-06 16:29:34 -05:00
Ahmed ElSherbiny
a5be2bb5b5 Read keyboardhook, gatewayaccesstoken and gatewaycredentialssource from RDP File
With this commit mRemoteNG, upon importing an RDP file, will read and apply those fields to the connection being imported.

Tested by verifying that the properties are reflected correctly in the UI (Config panel) and influence the behavior of the connection as expected.
2025-08-06 14:11:10 -07:00
Dimitrij
19c954f972 lib update 2025-08-05 15:33:16 +01:00
Dimitrij
576f9db387 lib upgrade 2025-07-29 22:33:30 +01:00
Dimitrij
28ff02f8cb Merge pull request #2715 from jcefoli/FixObjectListViewSerializerWarnings
Disable WinForms analyzers and suppress WFO1000 build errors for ObjectListView
2025-07-02 09:51:52 +01:00
Joe Cefoli
d4a590d292 Disable WinForms analyzers and suppress WFO1000 build errors 2025-07-01 15:01:44 -04:00
Dimitrij
25f928fc8a Merge pull request #2712 from caspChristian/imp2321
VNCEvent_Disconnected send the ProtocolBase based object reference
2025-06-26 13:31:53 +01:00
Christian Iwata Nilsson
5dd3d927d6 VNCEvent_Disconnected send the ProtocolBase based object reference
Fixes the exception mostly mentioned in #2321, but not the actual connection issues
2025-06-26 09:08:07 +02:00
Dimitrij
77950632f8 lib update 2025-06-23 14:08:48 +01:00
Dimitrij
e85cee752d few more 2025-06-11 23:38:36 +01:00
Dimitrij
5c48f13a27 fix warnings about null-able 2025-06-11 23:34:35 +01:00
Dimitrij
18b283db0a Lib updates 2025-06-11 20:14:52 +01:00
Dimitrij
ca7888a537 Lib update 2025-06-04 23:55:33 +01:00
Dimitrij
246e90acd1 lib update 2025-05-29 18:49:41 +01:00
Dimitrij
e58e33974a cosmetic changes 2025-05-29 18:49:20 +01:00
Dimitrij
5cb07d003c UI changes for DB Setup 2025-05-29 18:48:10 +01:00
Dimitrij
3ecedc8fcf Lib updates 2025-05-13 19:34:57 +01:00
Dimitrij
a88ed5d3a9 UI Changes related SQL server 2022 configuration
(partially done)
2025-04-10 01:03:56 +01:00
Dimitrij
37fead2076 Lib updates
(temporary removed test projects from solution)
2025-04-10 01:01:53 +01:00
Dimitrij
2770c761b2 fix for current version and released version comparison
small fixes in Language
amazon lib update
2025-04-02 13:19:10 +01:00
Dimitrij
4b28eb6758 patch to remove secure-string implementation (will need to be implemented differently)
what will temporary allow to type-in and edit passwords
2025-03-30 13:56:38 +01:00
Dimitrij
ba45b44f45 lib update 2025-03-30 13:04:24 +01:00
Dimitrij
f5186cbadd lib updates 2025-03-19 12:09:39 +00:00
Dimitrij
807924c51e fix for NETSDK1137 (https://learn.microsoft.com/en-us/dotnet/core/tools/sdk-errors/netsdk1137) 2025-03-10 10:59:11 +00:00
Dimitrij
155d849201 Lib update 2025-03-10 09:55:11 +00:00
Dimitrij
e9efd2705c Lib update 2025-03-01 15:24:00 +00:00
Dimitrij
204e0d041c fix to make _mRIdentifier class-level 2025-02-18 02:45:07 +00:00
Dimitrij
227d75d956 Add new method to generate a unique identifier for the machine 2025-02-18 02:20:37 +00:00
Dimitrij
d2706c8748 Switch to use central package version management 2025-02-18 01:58:43 +00:00
Dimitrij
2518b8600f System.Data.SqlClient package is now deprecated, migrated to Microsoft.Data.SqlClient. 2025-02-17 15:23:38 +00:00
Dimitrij
9300839d59 switch to .net9 2025-02-17 14:43:51 +00:00
Dimitrij
a069d1f057 lib update 2025-02-17 14:21:00 +00:00
Dimitrij
7557733b81 Update to PuTTYNG 83.0.1 #2670 2025-02-11 11:17:20 +00:00
Dimitrij
59ac3020fe lib updates 2025-02-05 14:10:32 +00:00
tecxx
f0e4cee613 AssemblyInfo Conflict 2025-02-04 16:11:37 +01:00
tecxx
0f395dad9e Rebase on 1.77.3-dev 2025-02-04 16:10:53 +01:00
tecxx
7e59362b5c fix ssh quickconnect exception 2025-02-04 16:06:15 +01:00
Dimitrij
e69492e94f version naming correction 2025-02-04 16:06:15 +01:00
Dimitrij
2b31b173c0 lib updates 2025-02-04 16:05:35 +01:00
Robert Rostek
8d3a1ab3a7 .net 8.0.12 update 2025-02-04 16:05:35 +01:00
Robert Rostek
0349c5b402 fix null exception in GetDiskIdentifier 2025-02-04 16:05:27 +01:00
Robert Rostek
0b7be8b0c6 .net 8 upgrade (with unsafebinaryformatter) 2025-02-04 16:05:27 +01:00
Dimitrij
3a8ca5fb4a Merge pull request #2668 from tecxx/v1.78.1-dev
fix ssh quickconnect exception
2025-02-04 14:36:08 +00:00
tecxx
c88b50ad89 fix ssh quickconnect exception 2025-02-04 15:31:39 +01:00
Dimitrij
3746ba1819 fix year 2025-02-01 17:21:19 +00:00
Dimitrij
945bff3c17 Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2025-02-01 17:01:13 +00:00
Dimitrij
d7e318b1f8 lib update 2025-02-01 16:59:53 +00:00
Dimitrij
eb3db198a1 Update build-x86_64.yml
update vs to 17.12.4
2025-02-01 16:34:00 +00:00
Dimitrij
b380d32ce1 version naming correction 2025-01-27 10:57:08 +00:00
Dimitrij
7a6056c95f lib updates 2025-01-27 10:56:47 +00:00
Dimitrij
a908a783be lib update 2025-01-24 13:25:58 +00:00
Dimitrij
1ae02885cf Merge pull request #2660 from tecxx/develop-orig
.net 8 upgrade code changes
2025-01-16 22:19:38 +00:00
Robert Rostek
8ea210e14f .net 8.0.12 update 2025-01-15 19:50:39 +01:00
Dimitrij
1ae9960e82 lib update 2025-01-14 14:54:54 +00:00
Robert Rostek
bed946988a fix null exception in GetDiskIdentifier 2025-01-14 13:17:08 +01:00
Robert Rostek
e42632b82d .net 8 upgrade (with unsafebinaryformatter) 2025-01-12 21:51:43 +01:00
Dimitrij
5aa8425209 Lib updates 2024-12-23 14:27:58 +00:00
Dimitrij
b794aa8089 update puttyng to ver. 0.82 2024-12-23 14:09:07 +00:00
Dimitrij
e8bb0bffaa lib upgrade + update
Some version should be not upgraded due .net limitation, what will be done once .net will be upgraded
2024-11-23 15:51:32 +00:00
Dimitrij
e1e0661f25 lib upgrade 2024-11-23 13:12:36 +00:00
Dimitrij
7848c83c72 lib updates 2024-11-23 12:50:16 +00:00
Dimitrij
2de37ed9c7 Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2024-11-21 11:17:24 +00:00
Dimitrij
425b433cd2 lib updates 2024-11-21 11:17:15 +00:00
Dimitrij
44e07e3cdb Merge pull request #2652 from kursataktas/mremoteng-guru
Introducing mRemoteNG Guru on Gurubase.io
2024-11-12 21:46:23 +00:00
Kursat Aktas
689f882104 Introducing mRemoteNG Guru on Gurubase.io
Signed-off-by: Kursat Aktas <kursat.ce@gmail.com>
2024-11-13 00:17:19 +03:00
Dimitrij
207beaee12 Lib updates + small changes 2024-11-12 11:47:47 +00:00
Dimitrij
bd21b85de7 Lib update 2024-11-01 11:17:54 +00:00
Dimitrij
2e7579cac5 Moved all language files into Language folder. To keep root folder clean
On language change new language will not apply, need more work on that later
2024-10-18 15:40:50 +01:00
Dimitrij
ec63812af0 lib update 2024-10-18 11:02:27 +01:00
Dimitrij
8dfe1a22c9 Moved packages dll's into Assembly folder to keep root folder cleaner 2024-10-18 10:58:49 +01:00
Dimitrij
c0e3f547ec Introducing Local settings manager class and example of default settings json schema
Idea to create json file with defaults settings, what will be automatically loaded into new local settings db at creating process.
Group 'default' means its comes from json file and if user change it later - we will have user id there, that allow us to have different settings for different users but at same time keeping "original" ones in case user decide to reset.

What one of the basic steps of transition all settings into local db. Once application is running - will be possible to import already existing settings into local db, as well as switch where to have save them: to windows registery or to local db.

Settings file also could be encrypted, and file will be locked on current machine, that allow all users to use it, but not allow to transfer it to another machine. (If they do it will not work)
mR don't use any hard-coded passwords for such, only hdd id + machine name (what is hashed by SHA256) so couldn't be traceable from memory dump. Later will be possible to lock by user with own password, but that will required to enter on every start as mR will not save it.
2024-10-16 11:37:31 +01:00
Dimitrij
dafb1b364c lib updates 2024-10-15 13:41:41 +01:00
Dimitrij
7d1b9d8635 Merge pull request #2643 from xRushG/asyncRegSetting
Registry Settings: enhancements and new settings implementation
2024-10-01 22:51:52 +01:00
xRushG
8041f58ffd feat: Add registry settings for Security Page and encryption key generator
- Added new registry settings for managing security-related configurations on the Security Page.
- Implemented an encryption key generator to securely generate a password for store in the registry.
- Passwords are placed encrypted on the clipboard for 30 seconds.
- Update documents and finalize comments
2024-10-01 16:02:59 +02:00
xRushG
d018fdbace feat: Add registry settings for Connections and SQL Server settings
- Added registry settings for the Connection Page.
- Added registry settings for the SQL Serverl Page.
- All settings implemented with async registry logic
- Comment unused settings for Connection Page
- Update documents
2024-10-01 12:35:34 +02:00
xRushG
489602ffb3 feat: Add registry settings forTabs and Panel settings
- Added registry settings for the Tabs and Panel Page.
- All settings implemented with async registry logic
- Comment unused settings
- Update documents
2024-10-01 12:32:16 +02:00
xRushG
600ba73f5f Removed the deprecated SaveConnectionsOnExit option from the registry settings related to startup and exit. 2024-10-01 12:29:01 +02:00
xRushG
88600ae6df feat: Add registry settings for Notification Page, Appearance Page, and Startup and Exit Page with async logic
- Added registry settings for the Notification Page.
- Added registry settings for the Appearance Page.
- Added registry settings for the Startup and Exit Page.
- All settings implemented with async registry logic
2024-10-01 12:27:33 +02:00
xRushG
5e3bce9a92 refactor: Apply the async logic for Credentials and Updates registry settings, remove obsolete code
- Moved async registry loading logic to OptRegistryCredentialsPage and OptRegistryUpdatesPage to improve structure and maintainability.
- Removed obsolete logic and redundant code that is no longer needed due to the new asynchronous architecture.
- Enhanced settings management to take advantage of the just-in-time loading mechanism.
- Improved performance by ensuring registry settings are loaded asynchronously right before they are needed by the UI or application logic, minimizing unnecessary loads.
- Update documents
2024-10-01 12:19:41 +02:00
xRushG
9b28b7057d feat: Introduce RegistryLoader class with Lazy<T> and async registry settings loading
- Added the RegistryLoader class to handle loading of registry settings.
- Implemented Lazy<T> for singleton pattern to ensure only one instance of RegistryLoader is created.
- Added support for asynchronous loading of registry settings to improve performance in async workflows.
- Designed the class with thread safety in mind, leveraging ConcurrentDictionary for storage.
- Included logging of debug messages to track the load process and timing.
2024-10-01 12:08:52 +02:00
Dimitrij
0a17220446 lib updates 2024-09-29 17:05:51 +01:00
Dimitrij
7684b19d13 lib updates 2024-09-18 10:32:34 +01:00
Dimitrij
47baf3b662 fix case 2024-08-28 11:35:56 +01:00
Dimitrij
bc5e2b9437 add project line name 2024-08-28 11:29:40 +01:00
Dimitrij
cf0ef6d9d0 remove older schemes from distribution 2024-08-28 09:54:49 +01:00
Dimitrij
b6f3047f82 lib updates 2024-08-28 09:39:02 +01:00
Dimitrij
0a418561d7 Merge pull request #2629 from ianselmi/v1.77.3-dev
Made the specflow compatible with net6
2024-08-27 11:29:10 +01:00
ianselmi
6da79a41df made the specflow compatible with net6 2024-08-18 10:12:16 +02:00
Dimitrij
3ddeac6c74 lib update 2024-08-05 13:35:58 +01:00
Dimitrij
98f97c442d fix build number calculation 2024-08-05 13:33:50 +01:00
Dimitrij
472d33ba12 Merge pull request #2550 from Risae/v1.77.3-dev
CI: Add GitHub Actions workflow
2024-08-01 16:08:44 +01:00
Dimitrij
d906cfcc1e lib updates 2024-07-31 10:24:44 +01:00
Dimitrij
0f0d8bdcdb Merge pull request #2623 from magriggs/issue-2622
issue-2622: mRemoteNGInstaller - remove explicit PuTTyNG fragment, as…
2024-07-30 13:09:31 +01:00
23439176+magriggs@users.noreply.github.com
005b2485f6 issue-2622: mRemoteNGInstaller - remove explicit PuTTyNG fragment, as PuttyNG is copied implicitly by FilesFragment. Fixes #2622. 2024-07-30 09:07:55 +08:00
Dimitrij
ffd90bed70 Merge pull request #2621 from magriggs/issue-726
Issue 726 - SecureString for ConnectionInfo.Password
2024-07-29 09:05:05 +01:00
23439176+magriggs@users.noreply.github.com
70264a24ab Fix null password handling 2024-07-28 21:30:10 +08:00
23439176+magriggs@users.noreply.github.com
ad3a37fde3 Move ConnectionInfo.Password to use SecureString. Only decrypt when required for connecting. Update tests to skip tests of password values where necessary. 2024-07-28 19:56:36 +08:00
Dimitrij
9dac0eeaac Updating due https://github.com/mRemoteNG/mRemoteNG/issues/243 2024-07-16 20:55:18 +01:00
Dimitrij
8dac393bb4 libs update 2024-07-10 10:26:50 +01:00
Dimitrij
287d1a5575 Merge pull request #2611 from Wolvverine/v1.77.3-dev
correct registry path
2024-07-05 22:31:42 +01:00
Michał Panasiewicz
20278e0e53 correct registry path 2024-07-05 20:50:41 +02:00
Dimitrij
a3c3ec8c5c lib updates 2024-06-20 10:22:13 +01:00
Dimitrij
3039b25a66 versioning fix 2024-06-11 14:11:52 +01:00
Dimitrij
0b7ce92af8 libs update 2024-06-11 11:36:17 +01:00
Dimitrij
e3ec521a1d Merge pull request #2601 from xRushG/RegSettings
Enhancement of Registry Settings capabilities
2024-06-11 11:21:39 +01:00
xRushG
88999263a7 Finalize Update Options Page
This commit finalizes the Update Options Page with the following changes:
- Removed unnecessary methods due to new features of the registry handler class.
- Updated and added comments to improve code readability and understanding.
- Implemented UI optimizations such as disabling the frequency control and showing "Never" in the combobox.
- Enabled the password storing ability, making it functional but not yet usable.
- Applied some code optimizations for improved efficiency.
2024-06-11 10:07:33 +02:00
xRushG
9687ccd01d Finalize Credentials Options Page
This commit finalizes the Credentials Options Page with the following changes:
- Updated and added comments to improve code readability and understanding.
- Enabled the password storing ability, making it functional but not yet usable.
- Applied some code optimizations for improved efficiency.
2024-06-11 09:44:20 +02:00
xRushG
ca62502499 Update dependent registry options settings to use new WindowsRegistryEntry class. 2024-06-11 09:08:37 +02:00
xRushG
8b3a68f58e Removing all unnecessary old files 2024-06-11 09:07:04 +02:00
xRushG
08eb35a360 Refactor registry settings interaction classes.
This commit refactors the registry settings interaction classes by consolidating the multiple entry classes for int, string, bool, etc., into a single class that supports multiple data types. This change simplifies the code and enhances readability.

- Consolidate multiple entry classes (int, string, bool, etc.) into a single class
- Introduce WindowsRegistryEntry<T> to support multiple data types
2024-06-11 09:03:34 +02:00
Dimitrij
dec82b41f2 lib update 2024-06-10 21:14:52 +01:00
Dimitrij
b9ab5c76f7 Merge pull request #2597 from CodeCasterNL/v1.77.3-dev
Remember the opened connection file on relaunch
2024-06-07 13:33:53 +01:00
Dimitrij
6de0c536e8 Merge pull request #2591 from tecxx/develop-orig
add Clickstudios Passwordstate API connector
2024-06-07 13:32:56 +01:00
tecxx
3f0aca97bf Merge branch 'mRemoteNG:v1.77.3-dev' into develop-orig 2024-06-06 09:17:37 +02:00
Dimitrij
ccb51a2603 Merge pull request #2599 from xRushG/fix2592
Fix for #2592 compiler issue
2024-05-30 10:03:35 +01:00
xRushG
99d9e70921 Fix #2592: Prevent GeneralAppInfo.ApplicationVersion from being set in Unit Tests. Not needed for tests. 2024-05-29 15:20:56 +02:00
CodeCasterNL
b8b54271dd Save ConnectionFilePath, fix typo in identifier 2024-05-25 17:13:11 +02:00
Dimitrij
49a1549e5a Merge pull request #2596 from xRushG/OpenLogBug
Log File Opening Fails on Notification Settings Page
2024-05-24 09:12:38 +01:00
xRushG
b3f936c194 - Added my missed comment for outlined LocalSettingsManager
- Fixed a bug that occurred when trying to open the log file on the Notification settings page.
- Removed unnecessary file association when user tries to open the log file on the Notification page. The "choose file" dialog handles the extension as it is fixed on .log
- Implemented fallback to open file explorer to the specified file location if mRem fails to open the log file.
2024-05-23 21:29:35 +02:00
Robert Rostek
f3b10d4c20 update credential vault documentation 2024-05-04 18:05:28 +02:00
Robert Rostek
94b17037d0 add Clickstudios Passwordstate API connector 2024-05-04 13:49:17 +02:00
Dimitrij
83f3846ce6 lib updates
correct build number calculations - now its days from last release + hour + minute of build
some changes to migrate to json schema + preparation of using db to save settings
2024-05-03 14:40:52 +01:00
Dimitrij
711a751117 Merge pull request #2589 from xRushG/Fix-2540
LocalSettingsManager class implementation is missing (#2540)
2024-04-29 13:56:53 +01:00
xRushG
e013e32792 Fix #2540
LocalSettingsManager class implementation is missing
2024-04-29 14:34:36 +02:00
Dimitrij
6e64b09256 Merge pull request #2571 from mRemoteNG/dependabot/nuget/mRemoteNG/System.Data.SqlClient-4.8.6
Bump System.Data.SqlClient from 4.8.5 to 4.8.6 in /mRemoteNG
2024-03-11 14:31:41 +00:00
dependabot[bot]
e32d268587 Bump System.Data.SqlClient from 4.8.5 to 4.8.6 in /mRemoteNG
Bumps [System.Data.SqlClient](https://github.com/dotnet/corefx) from 4.8.5 to 4.8.6.
- [Release notes](https://github.com/dotnet/corefx/releases)
- [Commits](https://github.com/dotnet/corefx/commits)

---
updated-dependencies:
- dependency-name: System.Data.SqlClient
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-11 14:30:32 +00:00
Dimitrij
05635dec93 Merge pull request #2559 from xRushG/v1.77.3-dev
Configuration via windows registry (updates and credentials)
2024-02-19 18:20:44 +00:00
Schmitti91
e694923d33 Merge branch 'v1.77.3-dev' of https://github.com/xRushG/mRemoteNG into v1.77.3-dev 2024-01-28 10:16:30 +01:00
Schmitti91
7322683465 Fix AppVeyor CA2200 and optimize CreateOrSetRegistryValue method 2024-01-28 10:15:34 +01:00
Schmitti91
64688f3512 Add documentation page for registry settings (credentials) 2024-01-27 21:01:38 +01:00
Schmitti91
762760af2f Adding the configuration capability for the Credentials page through the Windows Registry. 2024-01-27 20:55:12 +01:00
Schmitti91
48e6881401 Merge branch 'v1.77.3-dev' of https://github.com/xRushG/mRemoteNG into v1.77.3-dev 2024-01-26 21:13:22 +01:00
Schmitti91
95c958136f Add Dokupage for registry settings (update) 2024-01-26 21:12:24 +01:00
Schmitti91
53a6be0f82 remove placeholder code by commenting it out in its current state. (needed for later commit) 2024-01-26 21:07:04 +01:00
Schmitti91
0b4d95be1c Renameing the common setting name "CheckForUpdate Asked" to "AllowPromptForUpdates Preference" for consistency in naming conventions. 2024-01-23 21:43:29 +01:00
Schmitti91
aad3948475 make ProxyAuthPass not usable, placeholder code 2024-01-23 16:24:28 +01:00
Schmitti91
093370081e Add capability to set Update Settings via Registry
This commit enhances the functionality of the WindowsRegistryAdvanced class to provide the capability to set up Update Settings through the Windows Registry. The changes include the addition of methods or modifications that allow users to configure update-related settings using the Registry.
2024-01-23 16:14:36 +01:00
Schmitti91
33426ceee9 Add GetDwordValue method to WindowsRegistryAdvanced
This commit introduces the GetDwordValue method in the WindowsRegistryAdvanced class, allowing the retrieval of DWORD values from the Windows Registry. The implementation uses int.TryParse for efficient parsing and handles default values gracefully.
2024-01-23 14:29:07 +01:00
Schmitti91
5f5700b948 extend Registry handling capabilities in preparation for Registry settings
Enhanced the functionality of Registry handling in preparation for managing Registry settings
2024-01-23 12:54:43 +01:00
Risae
802e9abfef CI: Create build-x86_64.yml 2024-01-11 17:46:08 +01:00
Dimitrij
45149d6547 Merge pull request #2549 from magriggs/issue-2487
Issue 2487
2024-01-05 12:07:05 +00:00
23439176+magriggs@users.noreply.github.com
595681a982 Remove boilerplate code 2024-01-05 14:28:33 +08:00
23439176+magriggs@users.noreply.github.com
e1cac723d6 First commit of SecureCRT import functionality. 2024-01-05 13:59:36 +08:00
Dimitrij
683f84f053 Merge pull request #2545 from magriggs/issue-1308
Some fixes for issue mRemoteNG#1308. Inspired by dockpanelsuite/dockp…
2024-01-03 13:15:15 +00:00
23439176+magriggs@users.noreply.github.com
b6d882a06f Some fixes for issue mRemoteNG#1308. Inspired by dockpanelsuite/dockpanelsuite#526 (comment). Main change is to enable minimize and close buttons 2024-01-03 20:39:36 +08:00
Dimitrij
9d4bfbcb1c lib updates 2023-12-13 21:56:25 +00:00
Dimitrij
b563747046 Merge pull request #2534 from jcefoli/v1.77.3-dev
Handle case where COM object becomes separated from RCW
2023-12-13 21:47:47 +00:00
Joe Cefoli
1ebd0a430f Remove unnecessary line break 2023-12-13 14:42:13 -05:00
Joe Cefoli
ef4366be4d Handle case where COM object becomes sepatated from Runtime Callable Wrapper (resizing main window after disconnecting from fit to panel session) 2023-12-13 14:34:33 -05:00
Dimitrij
484283fef8 Merge pull request #2533 from tommwq/v1.77.3-dev
support local PowerShell connection
2023-12-13 11:02:10 +00:00
tommwq
b546a48a5f support local PowerShell connection 2023-12-12 23:26:58 +08:00
Dimitrij
51bd64d005 Merge pull request #2530 from BestiaPL/v1.77.3-dev
Update Language.pl.resx
2023-12-11 10:32:02 +00:00
Andrzej Rudnik
2c65d12b92 Update Language.pl.resx 2023-12-05 21:17:59 +01:00
Dimitrij
c43a3b5115 Merge pull request #2529 from xRushG/v1.77.3-dev
Pre-build event powershell code update #2524
2023-12-04 17:47:04 +00:00
Schmitti91
515778b13d Pre-build event powershell code update/fix 2023-12-02 21:59:56 +01:00
Dimitrij
bb4b9ce9e7 Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2023-11-29 09:42:06 +00:00
Dimitrij
1d6707fecd #2528
fix typo
2023-11-29 09:41:56 +00:00
Dimitrij
5b2a46ed91 Merge pull request #2523 from zeze0556/v1.77.3-dev
fixed mysql error
2023-11-20 09:27:46 +00:00
unknown
24fa97da4c fixed mysql error 2023-11-20 10:21:59 +08:00
Dimitrij
b0109c2581 lib update 2023-11-10 11:29:18 +00:00
Dimitrij
20f237ec4c Merge pull request #2519 from BestiaPL/v1.77.3-dev
Update Language.pl.resx
2023-11-04 23:38:09 +00:00
Andrzej Rudnik
6ea535ae29 Update Language.pl.resx 2023-11-04 16:59:46 +01:00
Dimitrij
57ca8a3eee Merge pull request #2514 from Schmitti91/v1.77.3-dev
Update Registry interaction capabilities.
2023-10-24 13:33:12 +01:00
Schmitti91
307ea42a0f Cleanup of references and correction of comments. 2023-10-23 07:58:13 +02:00
Schmitti91
ac41c04f67 mRemoteNG tools WindowsRegistry has been revised and the Windows Registry reading capabilities have been expanded in preparation for working with Registry Keys options. The "RegistryHive" enum was deleted because it is contained in "Microsoft.Win32". 2023-10-22 12:18:42 +02:00
Dimitrij
b3496e79de lib update 2023-10-17 16:05:09 +01:00
Dimitrij
4f7aa755e3 Merge pull request #2508 from RFC1920/v1.77.3-dev-putty
bugfix for Putty import
2023-10-17 09:30:56 +01:00
Dimitrij
d3af50f009 lib updates 2023-10-16 13:59:04 +01:00
RFC1920
ba77a7b7c0 Update Putty registry import to fix connection name, username, and port setting 2023-10-16 05:32:34 -05:00
Dimitrij
666a0e1537 Merge pull request #2507 from RFC1920/v1.77.3-dev-putty
Add Putty registry import
2023-10-16 11:32:21 +01:00
RFC1920
96f4307910 Add Putty registry import 2023-10-16 04:50:35 -05:00
Dimitrij
81e997eb60 Merge pull request #2506 from Schmitti91/v1.77.3-dev
Enhancing the PowerShell Connection.
2023-10-16 09:56:50 +01:00
Schmitti91
7132c6e7c2 Removing the "-NoProfile" option from PowerShell.exe parameters. 2023-10-15 21:48:01 +02:00
Schmitti91
cb01e92fe2 Enhancing the PowerShell Connection. The PowerShell script is designed to simplify multiple login attempts to a remote host using user-provided credentials, or not. In addition, granular error handling has been added to prevent errors, such as the conversion of empty or null strings to SecureString. Furthermore, hostname, username, and password are now passed as parameters in the PowerShell script block (#2195). 2023-10-15 21:13:36 +02:00
Dimitrij
2c9c512d74 Merge pull request #2503 from WojciechNagorski/new-sshnet
Update SSH.NET to 2023.0.0
2023-10-11 13:55:07 +01:00
Wojciech Nagórski
8d05c9040b Update SSH.NET to 2023.0.0 2023-10-11 14:45:01 +02:00
Dimitrij
4e994fb202 Merge pull request #2502 from BestiaPL/v1.77.3-dev
Updated Polish translation
2023-10-09 16:45:55 +01:00
Dimitrij
ab2a778694 Merge pull request #2496 from tecxx/develop-orig
use pwfile instead of cleartext password for putty connections
2023-10-09 09:27:00 +01:00
Andrzej Rudnik
115375820d Update Language.pl.resx 2023-10-08 20:51:22 +02:00
Andrzej Rudnik
8cb753916b Update Language.pl.resx 2023-10-05 23:36:45 +02:00
Robert Rostek
ec3a0cee9b remove unnecessary usings 2023-10-03 10:55:27 +02:00
Robert Rostek
13f8f82537 update changelog 2023-10-03 10:53:34 +02:00
Robert Rostek
54544dd2aa use pwfile instead of pw for puttyng 2023-10-03 10:52:41 +02:00
Dimitrij
ac99115424 Merge pull request #2482 from simonai1254/fix-2195
Fix 2195
2023-08-31 16:37:41 +01:00
Simon Monai
d6c6038193 Update CHANGELOG.md 2023-08-30 23:55:40 +02:00
Simon Monai
c97b84e4a2 Quote variable for #2195
In order to interpret variable as string and not arbitrary code
2023-08-30 23:46:42 +02:00
Dimitrij
6698ec0b06 Update README.md 2023-08-02 13:14:28 +01:00
Dimitrij
290b1c4de5 Update README.md 2023-08-02 13:14:02 +01:00
Dimitrij
d497a50727 Update README.md 2023-08-02 13:13:23 +01:00
Dimitrij
2837c91f5e Update README.md 2023-08-02 13:12:34 +01:00
Dimitrij
9a717f28c6 upd 2023-08-02 13:03:14 +01:00
Dimitrij
e416c2c9c9 upd 2023-08-02 13:01:21 +01:00
Dimitrij
331cdaa6ce upd 2023-08-02 12:54:27 +01:00
Dimitrij
aa329b1a9a upd 2023-08-02 12:51:30 +01:00
Dimitrij
16c080942d upd table 2023-08-02 12:47:15 +01:00
Dimitrij
4acc111b3d upd 2023-08-02 12:39:29 +01:00
Dimitrij
afe453d371 upd 2023-08-02 12:37:25 +01:00
Dimitrij
e93c120dac update table 2023-08-02 12:34:16 +01:00
Dimitrij
2f701458f4 mistype fix 2023-08-02 12:27:30 +01:00
Dimitrij
6a35961dfb Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2023-08-02 12:24:16 +01:00
Dimitrij
1a90095ba3 add add-ons list 2023-08-02 12:24:05 +01:00
Dimitrij
5dc87213b5 Merge pull request #2462 from jurepurgar/rdgw-access-token
Support for gatewayaccesstoken
2023-07-18 16:24:49 +01:00
Jure Purgar
ff8044b09b Delete resx 2023-07-18 16:23:48 +02:00
Jure Purgar
f1fa40f6fd Initial implementation of gatewayaccesstoken support 2023-07-18 16:07:06 +02:00
Dimitrij
9bc5b62828 enable signing 2023-07-15 22:44:26 +01:00
Dimitrij
5aae586812 lib update 2023-07-15 22:11:03 +01:00
Dimitrij
bc5e5be42e update cert 2023-07-15 22:06:47 +01:00
Dimitrij
be68573378 lib updates 2023-07-05 14:33:39 +01:00
Dimitrij
cf0bc3d270 fix links 2023-07-05 12:00:14 +01:00
Dimitrij
d5773eb2e9 doc update
adding image, fix link
2023-07-05 09:29:19 +01:00
Dimitrij
50523e5b67 update docs 2023-07-04 15:59:48 +01:00
Dimitrij
feeca86c6a small fix 2023-06-21 21:03:57 +01:00
Dimitrij
a2e2671483 update links 2023-06-21 20:55:35 +01:00
Dimitrij
0b4d6ef8ef update index 2023-06-21 20:48:23 +01:00
Dimitrij
bdf0e532a5 #2447
add screenshots for themes
2023-06-21 20:46:37 +01:00
Dimitrij
d8cf72d09b Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2023-06-21 12:08:25 +01:00
Dimitrij
6c3ec8f058 update puttyng to actual version 2023-06-21 12:08:07 +01:00
Dimitrij
fbd9b76a09 Merge pull request #2449 from simonai1254/update_documentation
Improve PuttyNG Issue Description
2023-06-21 09:41:55 +01:00
Simon Monai
bee216220a Improve PuttyNG Issue Description
Update PuttyNG Documentation
Do not recommend insecure changes
2023-06-21 09:29:05 +02:00
Dimitrij
4ca7f34989 code corrections 2023-06-16 19:24:33 +01:00
Dimitrij
51015e6b51 lib update 2023-06-16 19:24:00 +01:00
Dimitrij
46100d6d94 lib update 2023-06-08 10:58:05 +01:00
Dimitrij
c94eac3863 Merge pull request #2416 from BlueBlock/streamline_build_scripts_for_appveyor
modify build scripts for appveyor
2023-04-07 15:19:44 +01:00
BlueBlock
965b0e5b6d Update update_and_upload_assemblyinfocs.ps1
enable assemblyinfo.cs update when not (CI)
2023-03-31 11:27:49 -04:00
BlueBlock
000cea1dda test repo name 2023-03-31 11:16:40 -04:00
BlueBlock
6d4d60e3b1 Update postbuild.ps1
fix if matching
2023-03-31 11:02:49 -04:00
BlueBlock
9957282bfa Update postbuild_installer.ps1
disable assemblyinfo.cs update temporarily
2023-03-31 11:01:48 -04:00
BlueBlock
9b603dd956 Update postbuild.ps1
check variables
2023-03-31 10:10:10 -04:00
BlueBlock
759ee55780 modify build scripts for appveyor 2023-03-31 09:14:35 -04:00
Dimitrij
93b2edb5a5 Merge pull request #2415 from BlueBlock/fix_window_restore_resize
Update RdpProtocol8.cs
2023-03-28 14:59:36 +01:00
BlueBlock
4d49c14bb9 Update RdpProtocol8.cs
resize when restored from minimize
2023-03-28 08:49:52 -04:00
Dimitrij
6398808a0a corrected slashes 2023-03-25 22:29:53 +00:00
Dimitrij
64e20f3665 update 2023-03-25 21:45:22 +00:00
Dimitrij
3b542d8868 excluding AssemblyInfo from accidental update in repo 2023-03-25 21:40:42 +00:00
Dimitrij
d5af0e43a5 add condition 2023-03-25 18:44:40 +00:00
Dimitrij
7a8ef87dc7 run string as a command 2023-03-25 18:33:50 +00:00
Dimitrij
7a5293cde3 add wrapping ' 2023-03-25 18:24:08 +00:00
Dimitrij
26400631a0 replace " by ' to avoid path brake 2023-03-25 18:20:46 +00:00
Dimitrij
97a5c584be increase build number only then release in appveyor 2023-03-25 18:16:03 +00:00
Dimitrij
0700b6573c Merge pull request #2413 from BlueBlock/fix_running_of_unit_tests
Fix running of unit tests
2023-03-25 17:17:32 +00:00
Dimitrij
d8f66a4188 Merge pull request #2412 from BlueBlock/update_build_script
Update find_vstool.ps1
2023-03-25 16:39:49 +00:00
BlueBlock
c22971cf54 add unit test references
unit tests were not able to run since the refs were missing
2023-03-25 12:08:52 -04:00
BlueBlock
9d2dd5dd93 remove variable not used 2023-03-25 12:08:02 -04:00
BlueBlock
c19d512631 Update Logger.cs
code formatting and using adjustment
2023-03-25 12:07:28 -04:00
BlueBlock
9efda5fef3 lib update 2023-03-25 12:06:53 -04:00
BlueBlock
a27cdcfdb5 Update find_vstool.ps1
Do not attempt to verify the fingerprint since it changes often. It seems to be overkill to check it.
2023-03-25 12:03:37 -04:00
Dimitrij
5667a07b25 Merge pull request #2411 from BlueBlock/fix_log4net_logging
fix log4net logging
2023-03-25 07:04:21 +00:00
BlueBlock
7d0bd85466 fix log4net logging 2023-03-24 14:49:27 -04:00
Dimitrij
4f269442a6 Merge pull request #2410 from BlueBlock/fix_notificiation_bug_introduced
Fix notification bug introduced
2023-03-24 18:09:14 +00:00
BlueBlock
16d182fca2 Update NotificationPanelMessageWriter.cs
fix notification bug, text not displaying
2023-03-24 11:53:05 -04:00
BlueBlock
6d1a206cc9 code formatting 2023-03-24 11:51:33 -04:00
Dimitrij
d8a7fdbf4f lib update 2023-03-24 15:22:10 +00:00
Dimitrij
516b365ebc Merge pull request #2401 from BlueBlock/fix_options_ui_sizing
options pages size and position fixes
2023-03-24 07:16:15 +00:00
BlueBlock
6da6a5ede9 options pages size and position fixes
- options page was too small
- some tabs needed adjustment for spacing
2023-03-24 03:02:27 -04:00
Dimitrij
67244f1957 Merge pull request #2400 from BlueBlock/fix_database_columns_and_some_tests
Fix database columns and some tests
2023-03-24 06:08:48 +00:00
BlueBlock
0a304e9a03 add missing objects needed in tests 2023-03-24 01:35:37 -04:00
BlueBlock
05154af606 code formatting 2023-03-24 01:34:51 -04:00
BlueBlock
7454b15ec9 adjust app to use 2.8 xsd schema 2023-03-24 01:33:30 -04:00
BlueBlock
38f435f639 Update RemoteDesktopConnectionDeserializer.cs
add missing serializer
2023-03-24 01:32:21 -04:00
BlueBlock
5f38ec7210 Update SqlVersion29To30Upgrader.cs
add missing DB column UserViaAPI
2023-03-24 01:31:41 -04:00
BlueBlock
ca143bf969 Update mremoteng_confcons_v2_8.xsd
inherit should be boolean
2023-03-24 01:29:39 -04:00
BlueBlock
402e5c3665 Create mRemoteNG.lutconfig
live test runner config file
2023-03-24 01:27:52 -04:00
BlueBlock
290dbcc3ed Update SqlDatabaseMetaDataRetriever.cs
- add missing db column UserViaAPI
- formatting and remove commented code
2023-03-24 01:26:44 -04:00
Dimitrij
a7749c70e7 Merge pull request #2399 from BlueBlock/fix_database_use
Fix database use
2023-03-23 22:01:40 +00:00
BlueBlock
9f0cfd5f22 Update CsvConnectionsDeserializerMremotengFormatTests.cs
fix test
2023-03-23 17:47:27 -04:00
BlueBlock
f47434c09e Merge remote-tracking branch 'upstream/v1.77.3-dev' into fix_database_use 2023-03-23 17:44:39 -04:00
BlueBlock
795a4b571e Update AbstractConnectionRecord.cs
defaults set not needed
2023-03-23 17:26:11 -04:00
BlueBlock
f71727e05e Update SqlConnectionsUpdateChecker.cs
code formatting
2023-03-23 16:34:37 -04:00
BlueBlock
d2fa8e86b1 Update DatabaseConnectorFactory.cs
add TODO
2023-03-23 16:34:15 -04:00
BlueBlock
23dcd9d30f Update MySqlDatabaseConnector.cs
add TODO
2023-03-23 16:33:55 -04:00
BlueBlock
d6890c6ecd refactor to newer c# code statements 2023-03-23 16:32:14 -04:00
BlueBlock
b1a6ba78d4 fix database upgrades
- fix tested db upgrading for each version
- fix version check for 3.0
2023-03-23 16:31:28 -04:00
BlueBlock
e6abe3f3a1 simple code reformatting 2023-03-23 16:30:04 -04:00
BlueBlock
6c32540ecb refactor class mssql to sql
refactor class mssql to sql
code formatting
refactor null check
use db TRUNCATE instead of DELETE (mysql warns about mass DELETE)
2023-03-23 16:27:17 -04:00
BlueBlock
951ad5cd0a Update ConnectionsService.cs
use universal time for db time
2023-03-23 16:23:45 -04:00
BlueBlock
5f56477123 Update MiscTools.cs
- add GetBooleanValue method for getting bool from databases
- use universal time for db time
2023-03-23 16:22:38 -04:00
BlueBlock
3180f38a1d Update AbstractConnectionRecord.cs
fix to add redirectdiskdrives default value
2023-03-23 16:21:34 -04:00
BlueBlock
07f15993e5 Update SettingsLoader.cs
refactor null check
2023-03-23 16:20:55 -04:00
BlueBlock
fc8e9c7689 rename class from mssql to sql
This class is not dedicated to mssql but is used by all sql databases. Rename to reflect this.
2023-03-23 16:20:01 -04:00
BlueBlock
7cb20b9e28 Update Runtime.cs
use universal time for stored DB time since users can span time zones
2023-03-23 15:16:28 -04:00
BlueBlock
ffc2351d64 Update ConnectionsFileInfo.cs
latest db version should be 3.0
2023-03-23 15:15:36 -04:00
Dimitrij
f10fec61ac Merge pull request #2398 from BlueBlock/fix_deserializer_test
Update CsvConnectionsDeserializerMremotengFormatTests.cs
2023-03-23 16:39:01 +00:00
BlueBlock
e41200067c Update CsvConnectionsDeserializerMremotengFormatTests.cs
fix test, missing changes needed for RedirectDrives PR
2023-03-23 12:18:28 -04:00
Dimitrij
30f6d3dde7 Merge pull request #2397 from BlueBlock/fix_remove_exception_test
Update ProgramRoot.cs
2023-03-21 20:59:32 +00:00
BlueBlock
7f9dcb11f0 Update ProgramRoot.cs
remove exception test
2023-03-21 16:49:59 -04:00
Dimitrij
d5fa2f62c0 Merge pull request #2396 from BlueBlock/fix_load_misssing_localconnectionproperties_xml_file
Fix load misssing localconnectionproperties xml file
2023-03-21 20:44:59 +00:00
Dimitrij
fa7967190d Merge pull request #2395 from integratorbit/v1.77.3-dev
Improve Disk Drive Redirection
2023-03-21 20:33:33 +00:00
BlueBlock
20e04c0d75 resolve conflicts 2023-03-21 16:04:32 -04:00
BlueBlock
d5eea9db20 Merge remote-tracking branch 'upstream/v1.77.3-dev' into pr/2395 2023-03-21 16:00:50 -04:00
BlueBlock
8cb598ce25 Update FileDataProvider.cs
fix creation of file LocalConnectionProperties.xml if it does not exist
2023-03-21 15:26:01 -04:00
BlueBlock
f3a57d7f23 move filename value LocalConnectionProperties.xml into settings file 2023-03-21 15:25:32 -04:00
BlueBlock
14e47def9d Update SqlDatabaseMetaDataRetriever.cs
fix exception casting int64 to int32, unbox and cast to int
2023-03-21 15:24:49 -04:00
Dimitrij
7573081d7a Merge pull request #2394 from BlueBlock/fix_rdp_operation
Fix RDP operation
2023-03-21 18:48:56 +00:00
Dimitrij
aaca581324 Merge pull request #2393 from BlueBlock/do_not_display_splash_on_taskbar
Do not show splash on taskbar
2023-03-21 18:06:52 +00:00
BlueBlock
43c2797a51 Update ProgramRoot.cs
do not show splash on taskbar
2023-03-21 13:56:55 -04:00
integratorbit
da6bbf65f0 Improve Disk Drive Redirection 2023-03-21 14:31:15 -03:00
BlueBlock
7d0cbf423e add resize fallback
Add resize fallback if the target OS fails to resize using the most current method. (for example, this occurs with Server2008R2)
2023-03-21 13:03:21 -04:00
BlueBlock
d94eab71da Update RdpProtocol8.cs
remove test code
2023-03-21 12:58:58 -04:00
BlueBlock
b0a8ccc5b6 multiple RDP issues fixed
- fix scale of RDP session when moving between 4k and 1080 monitors etc.
- fix inefficient continuous RDP screen resizing while the window size is changed
- add a RDP version check before attempting to use each RDP version and properties
2023-03-21 12:23:59 -04:00
BlueBlock
5cbf1f1568 adjust method access level of common protocol methods 2023-03-21 12:22:20 -04:00
BlueBlock
22cde74db2 Delete RdpProtocol6.cs
class renamed to RdpProtocol
2023-03-21 12:07:18 -04:00
BlueBlock
cdc3759c04 Update Optional.cs
- use more efficient empty assignments
- use string interpolation
- adjust method access to minimal needed
2023-03-21 12:06:38 -04:00
BlueBlock
38abc8a167 Update NotificationPanelMessageWriter.cs
check for object _messageWindow before using it to avoid an exception
2023-03-21 12:04:52 -04:00
BlueBlock
7c7c7086ce Update RdpProtocolFactory.cs
class RdpProtocol6 renamed to RdpProtocol
2023-03-21 12:04:03 -04:00
BlueBlock
50daf64025 Update ProtocolBase.cs
- add check for object _interfaceControl before using it
- adjust methods to protected where appropriate
- remove unused using
2023-03-21 12:03:28 -04:00
BlueBlock
dc38df5389 Update ConnectionsService.cs
use object initializer and remove unused using
2023-03-21 12:00:54 -04:00
BlueBlock
a46b2c9d98 Update ProtocolFactory.cs
remove unused usings
2023-03-21 11:57:34 -04:00
BlueBlock
200756361c rename base class of RDP
So it is consistent with other protocols, rename the RDP base class to not reflect a version.
2023-03-21 11:55:17 -04:00
Dimitrij
877a1e4cd0 Merge pull request #2391 from BlueBlock/add_set_devenvdir_to_prebuild
Update mRemoteNG.csproj
2023-03-20 21:16:18 +00:00
BlueBlock
a382206f5a Update mRemoteNG.csproj
add setting of DevEnvDir in prebuild
2023-03-20 16:31:22 -04:00
Dimitrij
1af7a622a6 Merge pull request #2388 from BlueBlock/fix_remove_unsused_class
Delete RDPVersions.cs
2023-03-17 17:54:50 +00:00
Dimitrij
3f95b2aa7e Merge pull request #2387 from BlueBlock/fix_exception_in_disposeinterface
Update ProtocolBase.cs
2023-03-17 17:48:43 +00:00
BlueBlock
b7871e2e04 Delete RDPVersions.cs
Class is unused and not needed.
2023-03-17 13:18:14 -04:00
BlueBlock
6b6ceda497 Update ProtocolBase.cs
check if object is disposed before working with it
2023-03-17 13:07:58 -04:00
Dimitrij
b01b8e4bc8 adjust installer script 2023-03-17 00:42:46 +00:00
Dimitrij
20f7cb1cd0 update move installer 2023-03-17 00:17:52 +00:00
Dimitrij
3e1ee0056d small amendments 2023-03-16 23:01:06 +00:00
Dimitrij
a3a851e57f Merge pull request #2383 from BlueBlock/fix_null_check_not_needed
Update PuttySessionsRegistryProvider.cs
2023-03-16 20:10:57 +00:00
BlueBlock
cf650d4318 use more efficient array 2023-03-16 16:10:01 -04:00
Dimitrij
58e7420f04 Merge pull request #2386 from BlueBlock/fix_suppress_com_warnings_on_release_build
Update mRemoteNG.csproj
2023-03-16 19:24:18 +00:00
Dimitrij
aedaf084d9 Merge pull request #2382 from BlueBlock/fix_more_CA1416_warnings
fix more CA1416 warnings
2023-03-16 19:04:47 +00:00
BlueBlock
c18f638989 Update mRemoteNG.csproj
suppress com warnings on release build, but display warnings on debug builds
2023-03-16 15:00:46 -04:00
BlueBlock
fb50cdc058 Update PuttySessionsRegistryProvider.cs
remove unreachable code
- no need to test for null, PuttySessionsKey is a const with a value set on instantiation
2023-03-16 14:35:39 -04:00
BlueBlock
68e702c344 fix more CA1416 warnings 2023-03-16 14:15:44 -04:00
Dimitrij
651b18a8b3 Merge pull request #2381 from BlueBlock/fix_obsolete_SHA1CryptoServiceProvider
Update PuttyKeyFileGenerator.cs
2023-03-16 17:11:53 +00:00
BlueBlock
2174e56407 Update PuttyKeyFileGenerator.cs
Replace use of obsolete SHA1CryptoServiceProvider with replacement call.
2023-03-16 12:59:28 -04:00
Dimitrij
ea27a4da02 Merge pull request #2380 from BlueBlock/fix_appveyor_bulk_of_changes
appveyor build automation
2023-03-16 16:50:53 +00:00
BlueBlock
321fd1162b appveyor build automation
bulk of the changes for appveyor automation
2023-03-16 11:08:27 -04:00
Dimitrij
c51f38ddc7 Merge pull request #2379 from BlueBlock/fix_appveyor
additional appveyor change
2023-03-15 19:05:36 +00:00
BlueBlock
b34cd1acc5 additional appveyor change 2023-03-15 14:51:04 -04:00
Dimitrij
43f20bb83a Merge pull request #2378 from BlueBlock/fix_adj_appveyor_build
appveyor build adjustment
2023-03-15 16:57:16 +00:00
Dimitrij
79b8ddef15 Merge pull request #2377 from BlueBlock/fix_putty_registry_watcher
Fix putty registry watcher
2023-03-15 16:49:29 +00:00
BlueBlock
2642ea0601 appveyor build adjustment
Further work to test appveyor builds
2023-03-15 12:46:37 -04:00
Dimitrij
7a2f934f6a Merge pull request #2376 from BlueBlock/add_rdp_protocol_rdc11
add rdp protocol rdc11
2023-03-15 12:49:03 +00:00
BlueBlock
f299fefcdc Update PuttySessionsRegistryProvider.cs
Remove previous fixes return statement
2023-03-15 08:22:29 -04:00
BlueBlock
209319f460 Update PuttySessionsRegistryProvider.cs
Update the latest fix for the putty registry watcher, to create the registry path if it does not exist, so the watcher is able to always run.
2023-03-15 08:14:52 -04:00
BlueBlock
5ec4f4dcea add rdp rdc11 2023-03-15 08:04:01 -04:00
Dimitrij
16f67d58d1 Merge pull request #2372 from BlueBlock/fix_exception_when_no_putty_sessions_exist
fix exception when no putty sessions exist
2023-03-14 19:32:10 +00:00
Dimitrij
542d794ab4 Merge pull request #2373 from BlueBlock/fix_exception_with_notification_on_app_closing
Update MessageFocusDecorator.cs
2023-03-14 17:03:33 +00:00
Dimitrij
ede1573b56 Merge pull request #2375 from BlueBlock/fix_exception_for_protocolbase_when_closing_app
Update ProtocolBase.cs
2023-03-14 16:24:43 +00:00
Dimitrij
bc8eec8887 Merge pull request #2374 from BlueBlock/add_rdp_protocol_rdc10
add rdc10 protocol
2023-03-14 15:35:38 +00:00
Dimitrij
59b0654b95 Merge pull request #2371 from BlueBlock/fix_installer_build_order
Update mRemoteNG.sln
2023-03-14 15:24:05 +00:00
Dimitrij
cae3477591 Merge pull request #2370 from BlueBlock/fix_file_fragments
Update FilesFragment.wxs
2023-03-14 15:22:30 +00:00
BlueBlock
6a3115b80a Update ProtocolBase.cs
Do not attempt to dispose the control if the control is already closed, closing or disposed.
2023-03-14 04:44:42 -04:00
BlueBlock
1232d7c288 add rdc10 protocol 2023-03-13 22:38:13 -04:00
BlueBlock
8e1b4c9271 Update MessageFocusDecorator.cs
do not attempt to focus the notification panel if the application is closing, otherwise exceptions will occur since _frmMain is closing
2023-03-13 20:08:48 -04:00
BlueBlock
0f8810e22a fix exception when no putty sessions exist
When putty is not installed or no sessions exist in the registry, an exception is thrown when starting the eventwatcher. Only start the eventwatcher if sessions registry path exists.
2023-03-13 18:53:00 -04:00
BlueBlock
7bbff38b6b Update mRemoteNG.sln
fix install build order by also including building mremoteng
2023-03-13 18:47:14 -04:00
BlueBlock
4a7b8fa250 Update FilesFragment.wxs
fix some dll paths and remove unused dll
2023-03-13 18:44:26 -04:00
Dimitrij
53acc94976 Merge pull request #2369 from BlueBlock/fix_find_vstool.ps1
Update find_vstool.ps1
2023-03-13 14:11:00 +00:00
BlueBlock
ab8d83b12d Update find_vstool.ps1
add vs2022 cert thunbprint
fix function which tests if a file is executable
2023-03-13 09:46:27 -04:00
Dimitrij
713a0a6174 more fixes for CA1416 2023-03-11 13:13:19 +00:00
Dimitrij
a3b9695b81 lib replace 2023-03-11 12:38:53 +00:00
Dimitrij
85dd381bd9 lib update 2023-03-11 12:21:17 +00:00
Dimitrij
05b418e9b6 more fix for Warning CA1416 2023-03-11 12:20:19 +00:00
Dimitrij
40af584afe fix for Warning CA1416 2023-03-11 01:46:11 +00:00
Dimitrij
93fe32491b couple of fixes 2023-03-10 23:00:05 +00:00
Dimitrij
4b67fcb0d4 fix splash screen version logo 2023-03-09 09:12:40 +00:00
Dimitrij
0b0c92717d fix format to avoid error on file name 2023-03-08 22:15:25 +00:00
Dimitrij
4564cafa85 more fixes for CA1416 2023-03-08 21:50:23 +00:00
Dimitrij
2e21f8d03a add form 2023-03-08 20:51:58 +00:00
Dimitrij
4336254d56 fix naming after rename 2023-03-08 20:36:00 +00:00
Dimitrij
bc5e9279a5 fix naming to be inline with Others 2023-03-08 20:28:31 +00:00
Dimitrij
1bfbb956c2 fix CA1416: Validate platform compatibility
https://learn.microsoft.com/en-gb/dotnet/fundamentals/code-analysis/quality-rules/ca1416
2023-03-08 20:23:38 +00:00
Dimitrij
b336db773c Merge pull request #2367 from BlueBlock/update_build_scripts
Update build scripts
2023-03-08 19:32:06 +00:00
BlueBlock
30e7d2424c Merge remote-tracking branch 'upstream/v1.77.3-dev' into update_build_scripts 2023-03-08 14:08:46 -05:00
kmscode
cbb8c0234d fixed a few warnings 2023-03-05 20:10:32 -05:00
kmscode
95469107fd don't need to manually editbin for large address aware on x64 targets 2023-03-05 15:37:49 -05:00
Dimitrij
ba0058c0b9 fix installer paths 2023-03-04 22:49:23 +00:00
Dimitrij
8f35afe353 fix for portable version 2023-03-04 21:02:19 +00:00
Dimitrij
aaf219eb90 revert check due set variable explicitly in appveyor 2023-03-04 20:32:22 +00:00
Dimitrij
1167794d58 fix condition to work in appveyor env. 2023-03-04 18:38:12 +00:00
Dimitrij
929babd69a Update change log 2023-03-04 00:35:35 +00:00
Dimitrij
870b7c1ffd update links 2023-03-04 00:07:19 +00:00
Dimitrij
9ed9d835b9 file harvester update 2023-03-04 00:06:55 +00:00
Dimitrij
985feb4b91 name space sync 2023-03-03 23:25:18 +00:00
Dimitrij
c43c85bb21 lib Update
correction for update window
2023-03-03 22:19:38 +00:00
Dimitrij
038074131c add template for build versioning 2023-03-03 20:45:40 +00:00
Dimitrij
ab9156a7d3 Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2023-03-03 15:44:34 +00:00
Dimitrij
f4b76818e8 lib update 2023-03-03 15:42:33 +00:00
Dimitrij
12a399a354 Merge pull request #2364 from BlueBlock/update_sql_usage_instructions
update sql usage doc
2023-03-02 13:55:24 +00:00
BlueBlock
dfdbbea85c sql usage doc updated 2023-03-02 08:32:07 -05:00
BlueBlock
5fad5ec4c7 Merge remote-tracking branch 'upstream/v1.77.3-dev' into update_build_scripts 2023-03-02 08:28:10 -05:00
Dimitrij
fe94da4727 lib update 2023-03-02 09:42:43 +00:00
Dimitrij
361ae3af50 Merge pull request #2362 from BlueBlock/fix_use_of_sql_database
Fix use of sql database
2023-03-02 09:34:06 +00:00
BlueBlock
a2e302ebfa add check for appveyor only actions in scripts 2023-03-01 15:31:54 -05:00
BlueBlock
186ab9c00e Merge remote-tracking branch 'upstream/v1.77.3-dev' into update_build_scripts 2023-03-01 14:50:49 -05:00
BlueBlock
9a2453524a update db to 2.9 2023-03-01 14:19:41 -05:00
BlueBlock
3a2e128e98 add missing columns to serializer 2023-03-01 11:22:18 -05:00
BlueBlock
1bd2dbf9f0 modify schema to be consistent 2023-03-01 11:21:55 -05:00
BlueBlock
b7f880e7f8 modify sql bit columns to be consistent 2023-03-01 11:21:26 -05:00
BlueBlock
13cd926b4f add missing columns 2023-03-01 09:37:10 -05:00
BlueBlock
6fb7b1c6e4 update docs to reflect auto-schema generation 2023-03-01 07:29:31 -05:00
BlueBlock
8f35015a6c fix db upgrade
fix db upgrade 2.8->2.9
2023-03-01 07:11:45 -05:00
BlueBlock
a926bccb97 fix db upgrade
fix db upgrade 2.7->2.8
2023-03-01 07:11:30 -05:00
BlueBlock
b9f2abf5eb add db schema initialization on a new empty database 2023-03-01 07:10:29 -05:00
BlueBlock
8dc5bda171 Update SqlDatabaseVersionVerifier.cs
fix CRLF of file
2023-03-01 07:09:33 -05:00
Dimitrij
d24bdb543b lib update 2023-02-26 21:40:14 +00:00
BlueBlock
dc921161e4 Merge remote-tracking branch 'upstream/v1.77.3-dev' into update_build_scripts 2023-02-25 17:37:58 -05:00
Dimitrij
8e248cb545 lib update 2023-02-21 21:48:20 +00:00
BlueBlock
ae93be4cfb make website update optional 2023-02-20 12:39:29 -05:00
BlueBlock
42949fbe91 update build scripts to create update files 2023-02-20 05:21:11 -05:00
Dimitrij
21dd175456 lib update 2023-02-17 19:49:47 +00:00
BlueBlock
a3df0da26b widen the version label further 2023-02-16 16:55:40 -05:00
BlueBlock
6b9d4fd107 increase label width for version on splashscreen
Widen to support longer version numbers such as 1.77.3.1234
2023-02-16 16:27:17 -05:00
BlueBlock
fac2ae6399 Merge remote-tracking branch 'upstream/v1.77.3-dev' into update_build_scripts 2023-02-16 15:47:57 -05:00
Dimitrij
46732803c3 Merge pull request #2356 from BlueBlock/improve_options_page_speed
improve speed for the display of the options page
2023-02-16 20:16:47 +00:00
BlueBlock
39d205bd4d improve speed for the display of the options page
rather than create the options page on demand, instantiate the options page immediately upon app start though in the background using idle time.
2023-02-16 14:57:11 -05:00
Dimitrij
8e2bd7997e update "Known Issues" regarding how-to update PuttyNG to latest 2023-02-16 11:12:44 +00:00
Dimitrij
76db9a6c62 Merge pull request #2352 from pakass/SSH.NET-update
SSH.NET Update
2023-02-16 09:45:30 +00:00
pakass
c03d5e891d update Changelog 2023-02-15 15:15:55 +01:00
pakass
b21f6e8ce7 update SSH.NET 2023-02-15 15:11:22 +01:00
BlueBlock
4b916f1888 update build scripts 2023-02-14 19:38:08 -05:00
Dimitrij
1f80e5339b Merge pull request #2348 from BlueBlock/remove_mat_kit
Remove mat kit included unintentionally
2023-02-13 09:30:48 +00:00
BlueBlock
dc616f8ea1 remove mat kit included unintentionally
It appears the mat kit config was included along with some .xlf definitions on the csproj

Remove th mat kit and references
2023-02-12 16:39:30 -05:00
Dimitrij
dc6588243f libs update 2023-02-11 21:31:12 +00:00
Dimitrij
690d3b0d4e Merge pull request #2347 from savornicesei/simo/gh-2344-docs-log4net-patching
Documented manual patching of  log4net CVE-2018-1285 vulnerability #2344
2023-02-11 12:41:09 +00:00
Dimitrij
4bc5dffabb Merge pull request #2346 from BlueBlock/add_feature_to_auto_reconnect_without_clicking_check
Modify "auto reconnect" to have the ability to really auto-reconnect
2023-02-11 12:35:02 +00:00
Simona Avornicesei
55a1e4a544 Documented manual patching of log4net CVE-2018-1285 vulnerability #2344 2023-02-10 21:17:26 +02:00
BlueBlock
5cb32dd75a change reconnect timer from 2s to 5s
Change and increase the reconnect timer to avoid too frequent connection attempts.
2023-02-10 04:40:55 -05:00
BlueBlock
f858c9fe48 fix checkbox state 2023-02-10 04:39:13 -05:00
BlueBlock
0ac39af404 modify "auto reconnect" to really auto-reconnect
The auto-reconnect does not automatically reconnect but instead displays a reconnect dialog. A second Options checkbox is added to allow true auto-reconnect.
2023-02-09 13:41:31 -05:00
Dimitrij
fc757b236f lib update 2023-02-04 16:42:12 +00:00
Dimitrij
a921e6e3d4 Merge pull request #2340 from BlueBlock/set_default_theme_on_first_run
set the default theme setting
2023-02-04 16:28:34 +00:00
Dimitrij
8cf0f50565 Merge pull request #2341 from BlueBlock/fix_broken_tests
Fix broken tests
2023-02-04 16:26:34 +00:00
Dimitrij
575ad7664f Merge pull request #2343 from savornicesei/simo/gh-2342-installer-in-debug-mode
Build installer in Debug mode #2342
2023-02-04 16:23:51 +00:00
Dimitrij
be17488070 Merge pull request #2339 from BlueBlock/add_missing_settings
Add 2 missing settings
2023-02-04 16:23:07 +00:00
Simona Avornicesei
f504107928 Build installer in Debug mode #2342 2023-02-04 10:10:51 +02:00
BlueBlock
0113f549c5 fix remaining unit tests 2023-02-03 17:35:09 -05:00
BlueBlock
9ff831faab fix additional tests 2023-02-03 17:05:36 -05:00
BlueBlock
a9ca243c0b fix protocol config unit tests 2023-02-03 16:53:29 -05:00
BlueBlock
553bbef45f set the default theme setting
On the initial start of a fresh install, if the options are opened the theme is then set from an empty string to the default. This causes the user to see the "must restart app" dialog when closing the options.

This only occurs on the initial run of the app. If the app is closed and run again, the theme will have been set.
2023-02-03 14:34:38 -05:00
BlueBlock
8f713f861b Add 2 missing settings
Two settings are missing in the settings but do exist in the Designer class.  These settings are used in code so they do need to exist.
ConDefaultRDGatewayUserViaAPI
ConDefaultRDGatewayExternalCredentialProvider
2023-02-03 14:12:02 -05:00
Dimitrij
324054b9d7 Merge pull request #2337 from BlueBlock/set_language_resx_to_autogen_language_class
set language.resx to auto generate the designer class
2023-02-03 10:10:20 +00:00
BlueBlock
d3fc9404ee set language.resx to auto generate the designer class
This avoids the need to manually regenerate the Language.Designer.cs file.

Note that in VS the file Language.Designer.cs will appear under Language.resx but the actual file locations have not changed.
2023-02-02 10:25:27 -05:00
Dimitrij
5bb780439b add autodate as was suggested by @savornicese 2023-02-01 12:56:43 +00:00
Dimitrij
f0e6008441 lib update 2023-02-01 12:44:37 +00:00
Dimitrij
39dd69f15e Merge pull request #2334 from BlueBlock/fix_build_order
Fix the dependencies for the Installer project build
2023-02-01 12:37:47 +00:00
Dimitrij
7b2e89df26 Merge pull request #2335 from BlueBlock/update_packages
Update project packages
2023-02-01 12:36:14 +00:00
BlueBlock
aa853f8481 Update project packages 2023-01-31 14:44:37 -05:00
BlueBlock
83bba75af6 Fix the dependencies for the Installer project build
The Installer project fails to build without also specifying the ExternalConnectors and mRemoteNG projects as dependencies.
2023-01-31 10:46:51 -05:00
Dimitrij
23889aa5b1 lib update 2023-01-08 11:57:03 +00:00
Dimitrij
5e6094fc42 lib update 2022-11-15 15:16:03 +00:00
Dimitrij
a4181cb6d6 Merge pull request #2301 from bartuszekj/splash_screen_fix
Fix for splash screen to appear on the primary screen.
2022-11-14 09:29:06 +00:00
Jerzy Bartuszek
88c49f0722 Fix for splash screen to appear on the primary screen. 2022-11-11 17:06:50 -06:00
Dimitrij
513d9e199c lib update 2022-11-09 14:34:02 +00:00
Dimitrij
e80975c56e lib update 2022-10-20 11:53:32 +01:00
Dimitrij
9051ac102c Merge pull request #2298 from SOlangsam/patch-2
Update mysql_db_setup.sql
2022-10-19 19:13:44 +01:00
SOlangsam
39a9b2e619 Update mysql_db_setup.sql
Added missing fields
Fix Issue for mysql #2292
2022-10-11 16:40:08 +02:00
Dimitrij
dbc55d248f add version color overwrite 2022-10-06 18:58:52 +01:00
Dimitrij
2b46180bfb clear inherited max-width 2022-10-06 18:41:31 +01:00
Dimitrij
5abe6c7e27 empty css 2022-10-06 18:30:31 +01:00
Dimitrij
4595ebeb9a next try to fix theme 2022-10-06 17:36:45 +01:00
Dimitrij
815c08e6d4 fix colors of sidebar 2022-10-05 21:31:30 +01:00
Dimitrij
a72ad218a0 fix for menu links color 2022-10-05 21:14:46 +01:00
Dimitrij
944ad1f769 Merge pull request #2295 from CrunchyBlue/v1.77.3-dev
*Updates hyperlink style to make links more visible to end users
2022-10-05 19:40:07 +01:00
PRINTABLE\dgagliardi
e17a68f61c *Updates hyperlink style to make links more visible to end users 2022-10-05 11:40:30 -05:00
Dimitrij
0b8196be68 Merge pull request #2285 from tecxx/develop-orig
support extraction of SSH private keys from external cred prov
2022-09-07 13:59:21 +01:00
tecxx
d9c01148b7 support extraction of SSH private keys from external credential provider (DSS)
supported formats: rsa, rsa with passphrase, putty private key
2022-09-07 14:08:29 +02:00
Dimitrij
2b3cfd992f Merge pull request #2275 from tecxx/develop-orig
external connectors improvement
2022-08-25 21:36:27 +01:00
tecxx
7e4bd7a6f3 add UI property selectors for external connectors
add support for external credential provider in remote desktop gateway
rename TSS to DSS
fix tests and property naming issues
2022-08-25 21:58:16 +02:00
Dimitrij
161e0ed637 fix for #2208 2022-08-22 10:31:54 +01:00
Dimitrij
1ee03e863c Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2022-07-29 23:26:59 +01:00
Dimitrij
2411481d8b lib upd 2022-07-29 23:26:14 +01:00
Dimitrij
0314a627ed Merge pull request #2259 from luciusagarthy/patch-1
Update Language.cs-CZ.resx
2022-07-27 23:39:09 +01:00
Dimitrij
4d339a0b09 Merge pull request #2261 from maxshlain/v1.77.3-hide-filemenu
Implement Show/Hide file menu in view menu
2022-07-27 23:38:37 +01:00
Dimitrij
c171e7f94b Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2022-07-17 23:14:21 +01:00
Dimitrij
eac4d966d9 remove not needed reference to old ObjectListView 2.7 2022-07-17 23:11:36 +01:00
Dimitrij
c20868c20c lib update 2022-07-17 22:42:17 +01:00
maxim-shlain
bb74d46f1f Implement Show/Hide file menu in view menu 2022-07-08 19:34:42 +03:00
luciusagarthy
152d48c583 Update Language.cs-CZ.resx
Thank you for a great app. I will contribute more. Here is some translation.
2022-07-07 16:19:48 +02:00
Dimitrij
b7a0155ba4 lib update 2022-06-25 06:39:19 +01:00
Dimitrij
0414724b21 update 2022-06-13 13:34:21 +01:00
Dimitrij
469f21db8d lib update 2022-06-13 10:35:41 +01:00
Dimitrij
b6c9d30195 Merge pull request #2244 from tecxx/develop-orig
save RCG and RestrictedAdmin fields correctly in connections file
2022-06-11 11:30:26 +01:00
tecxx
7b89430317 quickfix to save application settings correctly 2022-06-10 21:31:55 +02:00
tecxx
5bd854116a rcg/restrictedadmin fixes: schema file and defaults to false 2022-06-08 21:22:59 +02:00
tecxx
3fb7575529 save RCG and RestrictedAdmin fields correctly in connections file 2022-06-08 20:55:06 +02:00
Dimitrij
a3a868c2ce Merge pull request #2235 from jafin/fix/topmenu
fix (Toolbar): Remove unused `modeToolStripmenuItem` from Main toolbar
2022-06-03 09:59:26 +01:00
Jason Finch
1eb6fc2235 fix (Toolbar): Remove unused modeToolStripmenuItem from Main toolbar 2022-06-02 17:01:06 +10:00
Dimitrij
5ff4502f0a Merge pull request #2231 from simonai1254/patch-1
Specify "Desktop Runtime" in Requirements
2022-05-23 21:24:38 +01:00
Simon Monai
3126b8d4b0 Specify "Desktop Runtime" in Requirements 2022-05-23 22:15:00 +02:00
Dimitrij
dfb1d34b8a cleaning redundant blocks 2022-05-14 20:39:00 +01:00
Dimitrij
ace62c07be lib update 2022-05-13 01:55:18 +01:00
Dimitrij
ec2f3024b6 implement DPIAware, change splash screen to wpf 2022-05-13 01:39:00 +01:00
Dimitrij
25543f6561 Add acl controls to backupOptions 2022-05-02 00:31:00 +01:00
Dimitrij
3278657da7 fix missing values 2022-05-01 20:44:38 +01:00
Dimitrij
90c4d12688 lib updates 2022-05-01 20:10:22 +01:00
Dimitrij
4ceaea99f7 Merge pull request #2211 from nilsjonsson/new-lang
Add Swedish translation
2022-04-27 13:32:51 +01:00
Nils Jonsson
585de34ef1 Add Swedish translation 2022-04-27 14:18:53 +02:00
Dimitrij
60e1a3ce93 Merge pull request #2208 from Pwnoz0r/MR-887_rdm_import
Add Remote Desktop Manager (Devolutions) Importer
2022-04-23 21:02:32 +01:00
Jonathan Rainier
413d77ff1a Add Comments and Icon Support / Fix Unsorted
- Add Comments
- Add icon support for supported connection types
- Fix empty unsorted folder from being added
2022-04-23 15:53:25 -04:00
Jonathan Rainier
d8bb561063 Add Remote Desktop Manager (Devolutions) Importer
- Add RDM Importer mRemoteNG/mRemoteNG#887
2022-04-23 15:22:08 -04:00
Dimitrij
5dff2c20b2 Merge pull request #2204 from tecxx/develop-orig
fix for otp token renewal in TSS api
2022-04-19 12:53:06 +01:00
tecxx
27803e7787 fix for otp token renewal in TSS api 2022-04-19 11:44:12 +02:00
Dimitrij
58f9c1575f Merge pull request #2203 from tecxx/develop-orig
enable remote credential guard option
2022-04-15 16:45:33 +01:00
tecxx
7b909665b9 enable remote credential guard option
enable restricted admin mode option
2022-04-15 17:08:49 +02:00
Dimitrij
11eee991a1 fix visibility 2022-04-03 16:37:45 +01:00
Dimitrij
7056a859ef add acl for option pages 2022-04-03 16:25:04 +01:00
Dimitrij
2455f0d73e lib update 2022-04-03 15:35:56 +01:00
Dimitrij
943d36e23e add rbac to hide menu page + lang updates 2022-04-03 14:38:06 +01:00
Dimitrij
b563ac6e0c add basic rbac (acl) implementation as example for backup options + Language modification 2022-03-31 19:22:56 +01:00
Dimitrij
ed37a8ca2a fix #1015 2022-03-30 15:27:55 +01:00
Dimitrij
55bee8b0d8 add rbac settings 2022-03-30 12:30:59 +01:00
Dimitrij
6bd18c29e3 lib update 2022-03-29 10:38:27 +01:00
Dimitrij
37fc611767 Merge pull request #2188 from Trellmor/UpdateSessionDisplaySettings
Update session display settings
2022-03-19 12:57:09 +00:00
Daniel Triendl
f95fe351e2 Updated changelog and documentation 2022-03-18 20:27:54 +01:00
Daniel Triendl
2fb0ab1d91 Enable size change without reconnect
Use IMsRdpClient9::UpdateSessionDisplaySettings to dynamically update the
session display settings without reconnecting. RDP Version needs to be
Rdc9 or Highest for this to work.

Fixes #1546
2022-03-18 19:33:10 +01:00
Dimitrij
85f7be1d79 refactoring menu (preparation for RBAC) 2022-03-16 22:33:16 +00:00
Dimitrij
b3e5c1abc2 lib update 2022-03-16 09:55:34 +00:00
Dimitrij
9e216c0020 remove spaces 2022-03-11 17:53:05 +00:00
Dimitrij
a9f00b6a8c remove spaces 2022-03-11 17:04:51 +00:00
Dimitrij
46e7b02da2 lib update 2022-03-11 12:36:52 +00:00
Dimitrij
8db0bc6e6f refactoring options
each settings page from now will have separate options file, a bit later that helps to migrate into modular structure, then admin can control access to options and external modules may add may options independently
2022-03-10 13:48:39 +00:00
Dimitrij
1702b5867a update 2022-02-24 01:17:02 +00:00
Dimitrij
c03a6452ef update link 2022-02-24 01:14:14 +00:00
Dimitrij
69b840fb12 update 2022-02-24 01:11:44 +00:00
Dimitrij
9385ab287f update 2022-02-24 00:58:36 +00:00
Dimitrij
d2b2c39b97 fixing link 2022-02-24 00:54:01 +00:00
Dimitrij
f8ff978738 fix link 2022-02-24 00:49:43 +00:00
Dimitrij
d50b32236c update 2022-02-24 00:43:59 +00:00
Dimitrij
88d1db2840 Add howto for CyberArk psm 2022-02-24 00:35:00 +00:00
Dimitrij
b1dbe562d6 Merge pull request #2176 from AndyX90/sql-fix
Create missing columns
2022-02-23 23:56:56 +00:00
Andy Binder
e95b6f1b5d Update mysql_db_setup.sql 2022-02-23 21:57:24 +01:00
Andy Binder
1cbb7bb5dd Create missing columns 2022-02-23 21:46:10 +01:00
Dimitrij
34f3ffa129 Add version number to splash screen 2022-02-22 23:26:04 +00:00
Dimitrij
ecd25a673e lib updates 2022-02-15 17:27:57 +00:00
Dimitrij
58d0778c3d Merge pull request #2145 from jacko873/Dev
External Connectors, Default Options updated
2022-01-28 13:50:31 +00:00
Dimitrij
81a5422974 Merge pull request #2144 from tecxx/develop-orig
TSS improve refresh token / otp request handling
2022-01-28 13:04:40 +00:00
jacko873
eb859e5ede External Connectors, Default Options updated
Updated options form to fix UI bug where domain was pushout of range,
Added saving of  default User API ID
adjusted RDP and SHH to check for default User API ID,
also adjusted code here for consistancey
2022-01-28 13:50:13 +01:00
tecxx
c8035b5071 TSS improve refresh token / otp request handling 2022-01-28 11:18:44 +01:00
Dimitrij
a98a336e52 Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2022-01-21 23:58:25 +00:00
Dimitrij
d7f6535b85 update putty to v0.76 2022-01-21 23:54:28 +00:00
Faryan Rezagholi
f9d4e3152b Update README.md
Added  installation via winget
2022-01-19 23:49:16 +01:00
Dimitrij
69bd816aeb Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2022-01-19 19:44:19 +00:00
Dimitrij
783810749c change log update 2022-01-19 19:42:43 +00:00
Dimitrij
92c3c967ba Merge pull request #2138 from ThoGoetz/v1.77.3-dev
Improve compatibility with Remote Desktop Connection Manager v2.83
2022-01-19 19:41:05 +00:00
Thomas Götzinger
c632ba4306 Allow importing connections from Remote Desktop Connection Manager v2.83 2022-01-19 16:59:42 +01:00
Thomas Götzinger
e29d2c25ba Fixing Null value exception, when saving imported connections from Remote Desktop Connection Manager 2022-01-19 16:59:16 +01:00
Dimitrij
5cfdc96cd2 Merge pull request #2132 from tecxx/develop-orig
fix refresh token issue in TSS API
2022-01-18 15:48:20 +00:00
tecxx
a20e10b342 fix refresh token issue in TSS API 2022-01-18 16:28:03 +01:00
Dimitrij
39b7414553 correction 2022-01-18 10:50:09 +00:00
Dimitrij
0eef20caf6 Merge pull request #2131 from mRemoteNG/v1.77.2-dev
V1.77.2 dev
2022-01-18 10:44:50 +00:00
Dimitrij
859d12b450 Merge branch 'v1.77.3-dev' into v1.77.2-dev 2022-01-18 10:44:40 +00:00
Dimitrij
cd7c594b76 lib update 2022-01-18 10:38:14 +00:00
Dimitrij
39862e15f6 lib update 2022-01-18 10:37:49 +00:00
Dimitrij
87b0cf5c3f Merge pull request #2130 from simonai1254/patch-1
Patch 1
2022-01-18 10:35:37 +00:00
Simon Monai
a14219e1e2 Fix typo 2022-01-18 11:33:51 +01:00
Dimitrij
ee4660707c correction 2022-01-18 10:31:50 +00:00
Simon Monai
ccdf15c79c Update location for older versions
x64 and x86 builds behave differently on a x64 windows
2022-01-18 11:31:47 +01:00
Dimitrij
b31362afab correction 2022-01-18 10:30:49 +00:00
Dimitrij
74d6c88565 Merge branch 'v1.77.2-dev' into v1.77.3-dev 2022-01-18 10:24:33 +00:00
Dimitrij
638f64b888 Merge branch 'v1.77.3-dev' into v1.77.2-dev 2022-01-18 10:23:54 +00:00
Simon Monai
ffff9c1529 Add programm registry key 2022-01-18 11:23:26 +01:00
Dimitrij
39968c7c6e update changes 2022-01-18 10:16:42 +00:00
Simon Monai
2c3edf0ff2 Add Windows Desktop Runtime to removal list 2022-01-18 11:09:05 +01:00
Simon Monai
2c4445a2d9 Update wording 2022-01-18 10:59:06 +01:00
Simon Monai
09114a5ed3 Improve uninstall documentation
Addin AppData\Roaming as well as updating the Registry path for the new 64bit builds
2022-01-18 10:48:37 +01:00
Dimitrij
22e7825d65 Merge pull request #2126 from david-sway/v1.77.2-dev-RefactorConnectionInitiator
Combined instances of ConnectionInitiator to help with issue #2119
2022-01-18 09:47:36 +00:00
Dimitrij
62862141a8 update change log 2022-01-18 09:37:17 +00:00
Dimitrij
920461920c Merge pull request #2125 from david-sway/v1.77.2-dev
Fixed string parsing logic for Quick Connect toolbar.
2022-01-18 09:32:56 +00:00
david-sway
f5d0e93ecd Combined instances of ConnectionInitiator 2022-01-17 17:40:02 -05:00
david-sway
952a2f536b Fixed string parsing logic for Quick Connect toolbar. 2022-01-17 16:05:22 -05:00
Dimitrij
fbb9d849b4 update change log 2022-01-17 15:07:36 +00:00
Dimitrij
65a13dee68 fix tests 2022-01-17 15:01:35 +00:00
Dimitrij
09d26b37c7 fix year for copyright note 2022-01-17 14:54:12 +00:00
Dimitrij
47de6905df add check if xml return empty to address #2122 2022-01-17 14:53:38 +00:00
Dimitrij
c0cf316c16 update readme 2022-01-14 17:44:10 +00:00
Dimitrij
c055f8069d remove unnecessary files 2022-01-14 17:42:55 +00:00
Dimitrij
575356214f update readme 2022-01-14 17:42:16 +00:00
Dimitrij
4b5dc4152a Merge branch 'v1.77.3-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.77.3-dev 2022-01-14 17:20:39 +00:00
Dimitrij
a023409fe9 update change log 2022-01-14 17:20:10 +00:00
Dimitrij
d36c59658d Merge pull request #2123 from jacko873/develop
Thycotic Secret Server -  Added 2FA OTP support
2022-01-14 17:14:37 +00:00
jacko873
4f832ee70b Added 2FA OTP support
Added support for 2FA OTP
token managment and use if refresh token
2022-01-14 17:29:07 +01:00
Dimitrij
7b97097515 Merge pull request #2121 from tecxx/develop-orig
update documentation regarding external connectors feature
2022-01-14 10:47:49 +00:00
tecxx
86b3cb8d5d update documentation regarding external connectors feature 2022-01-14 11:11:15 +01:00
Dimitrij
33e007ad48 update changelog 2022-01-12 16:44:49 +00:00
Dimitrij
efea9f0857 fix extensions (2 step) 2022-01-12 16:39:11 +00:00
Dimitrij
aa755a0093 fix normalize extension to lower case (1 step) 2022-01-12 16:38:11 +00:00
Dimitrij
807e80acbe Add missed credits file
Fix opening link in about form for .net 6
2022-01-12 16:32:40 +00:00
Dimitrij
4096247ee8 add default settings for channel
fix missing options
2022-01-12 16:29:16 +00:00
Dimitrij
782d09ddbc fix for ProgramWorkDir option name 2022-01-12 16:28:15 +00:00
Dimitrij
4c304e11f3 update version number to 1.77.3 2022-01-12 10:53:48 +00:00
Faryan Rezagholi
aee497de03 nuget updates 2022-01-11 23:31:13 +01:00
Dimitrij
823f8614e5 lib update 2022-01-11 21:04:53 +00:00
Dimitrij
b54afb8823 Merge pull request #2115 from Vest/fix_2100
Fix tests that were broken by PR #2100
2022-01-11 20:16:00 +00:00
Dimitrij
22e611c63b Update ConfigWindowGeneralTests.cs
add one more ','
2022-01-11 19:37:22 +00:00
Dimitrij
3deb01a65d Update ConfigWindowGeneralTests.cs
add ','
2022-01-11 19:23:52 +00:00
Dimitrij
6f24b0bb71 Update ConfigWindowGeneralTests.cs
add missing fileds
2022-01-11 19:07:29 +00:00
Dimitrij
9d7921f538 Update ConfigWindowGeneralTests.cs
fixes for username field add
2022-01-11 15:14:28 +00:00
Vest
a4e66b3d11 Fix tests that were broken by PR #2100.
Signed-off-by: Vest <Vest@users.noreply.github.com>
2022-01-11 15:47:18 +01:00
Faryan Rezagholi
3866ff76f9 Merge pull request #2114 from david-sway/fix_toolbar_toggles
Fixed behavior of toolbar visibility toggles in the View menu
2022-01-11 00:02:14 +01:00
david-sway
82f947abdd Fixed behavior of toolbar visibility toggles in the View menu 2022-01-10 13:06:18 -05:00
Dimitrij
47c6f53b43 fix image link 2022-01-07 16:57:13 +00:00
Dimitrij
606657524e update build badges, paypal 2022-01-07 16:33:23 +00:00
Dimitrij
168285944c fix path 2022-01-07 15:46:04 +00:00
Dimitrij
1746af927b lib updates 2022-01-07 09:46:31 +00:00
Dimitrij
2eca8ffba2 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2022-01-04 10:43:12 +00:00
Dimitrij
6ef0c06a19 lib updates 2022-01-04 10:43:00 +00:00
Faryan Rezagholi
af68f1a16e Merge pull request #2104 from tecxx/develop-orig
fix test cases caused by new fields
2021-12-26 13:11:03 +01:00
tecxx
f429839a17 fix test cases caused by new fields 2021-12-25 19:53:31 +01:00
Dimitrij
66770e602a Merge pull request #2103 from tecxx/develop-orig
improve SS api credential handling
2021-12-25 18:52:04 +00:00
tecxx
f760131cf5 remove dead function call 2021-12-25 18:55:59 +01:00
tecxx
cdc1d5064f improve handling of invalid api credentials 2021-12-25 18:52:54 +01:00
Faryan Rezagholi
3b707d29b9 Updated PuTTYNG to v0.76 (fixes #2012) 2021-12-25 16:11:22 +01:00
Dimitrij
df632bb1f0 Merge pull request #2102 from Vest/issue_2057
Extended the field [RenderingEngine] from 10 chars to 16
2021-12-25 13:12:22 +00:00
Vest
74cb453995 Updated changelog.md 2021-12-25 11:33:56 +01:00
Vest
f8eec94b04 Extended the field [RenderingEngine] from 10 chars to 16.
This is not the full fix of issue #2057, because the scripts are not "migration" scripts.
2021-12-25 11:31:05 +01:00
Faryan Rezagholi
697efacc58 Merge pull request #2101 from Vest/fix_mssql_type
Fix typo in mssql_db_setup.sql
2021-12-24 19:12:20 +01:00
Vest
ff9cff8f44 Fix typo in mssql_db_setup.sql
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-24 16:59:31 +01:00
Dimitrij
d78388646d Merge pull request #2100 from tecxx/develop
external connectors update #2
2021-12-23 17:42:49 +00:00
tecxx
05ffcdeef7 fix null object bug in ec2 connector 2021-12-23 16:54:54 +01:00
Dimitrij
3b8e347a9e Merge pull request #2098 from Vest/fix_large
Fix failed BinaryFileTest
2021-12-23 11:18:55 +00:00
Dimitrij
37f160f698 Merge branch 'develop' into fix_large 2021-12-23 11:18:46 +00:00
tecxx
6f1446339c new fields for external connectors
add ec2 instance connector
2021-12-23 09:59:29 +01:00
Dimitrij
fed44dc366 Merge pull request #2097 from Vest/fix_gui
Fix failed tests related to mRemoteNGTests.UI.Window.ConfigWindowTests
2021-12-23 02:36:17 +00:00
Vest
c71ec34998 Updated changelog
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:40:10 +01:00
Vest
157bda8f51 Fix BinaryFileTest
mRemoteNGTests doesn't define "DEBUG" and "PORTABLE", but defines "DEBUG_PORTABLE" macro.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:36:38 +01:00
Vest
d80e5bc792 Updated changelog.md
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:33:30 +01:00
Vest
f9669e8158 Fix failed tests related to mRemoteNGTests.UI.Window.ConfigWindowTests.
The menu item OpeningCommand is related to SSH1/SSH2. Previously it was tested for RDP.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:26:53 +01:00
Faryan Rezagholi
04c83c608b removed deprecated/unhandled features 2021-12-20 17:37:19 +01:00
Faryan Rezagholi
9f50037e11 Merge pull request #2096 from Vest/fix_2081
Fixed crypto provider test
2021-12-20 17:09:44 +01:00
Faryan Rezagholi
33fd741ba7 Merge branch 'develop' into fix_2081 2021-12-20 17:06:14 +01:00
Vest
035c3f9319 Updated changelog.md
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-20 16:21:43 +01:00
Vest
3df922340d Fixed the test that was broken with the PR #2081
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-20 16:17:39 +01:00
Dimitrij
72b9190e2f fix for failing tests due missing path to schema 2021-12-20 11:28:01 +00:00
Dimitrij
8fe1bdf39a Merge pull request #2089 from Vest/fix_help_menu
Fixes the exception thrown by menu buttons "Documentation" and "Website"
2021-12-17 10:14:57 +00:00
Vest
f78bf2bc8a Updated CHANGELOG.md
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 21:52:56 +01:00
Vest
a1f0a69874 Menu button "Documentation" and "Website" threw an exception.
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 21:46:10 +01:00
Faryan Rezagholi
8a26b2f433 Merge pull request #2088 from Vest/issue_2087
Launch updates from shell (fixes #2087)
2021-12-16 20:57:56 +01:00
Vest
a18784d2c7 Updated changelog.
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 19:04:49 +01:00
Vest
3c25a987fd Fix the issue #2087
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 19:02:25 +01:00
Dimitrij
7cebc4ef42 Merge pull request #2086 from Vest/refactor_webclient
Use async HttpClient instead of obsolete WebClient
2021-12-16 17:31:06 +00:00
Faryan Rezagholi
a8ab46d5c8 remove app.comfig 2021-12-16 17:09:03 +01:00
Vest
8bac5a8c54 Removed unused imports for UpdateWindow.cs 2021-12-16 17:05:05 +01:00
Faryan Rezagholi
801a41ae10 removed log4net leftover 2021-12-16 17:04:11 +01:00
Vest
47e37afe12 Removed unused imports for AppUpdater.cs
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 17:03:56 +01:00
Faryan Rezagholi
942bf7d8cb moved log4net config into its own file 2021-12-16 17:01:45 +01:00
Vest
0e8d573819 Updated changelog 2021-12-16 17:00:49 +01:00
Vest
2bdfd7401e Corrected warnings related to async event handlers
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 16:41:00 +01:00
Vest
68dd6b1e23 Removed unused code
Added the checksum verification.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 15:57:18 +01:00
Vest
2fe85ae0e5 Added the progress handling;
Now API (AppUpdater) is async.
Cancellation token hasn't been tested yet, because UI doesn't allow to cancel the update.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 15:37:56 +01:00
Vest
e9fa1c3b5e Added Initial async support for AppUpdater
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 12:30:12 +01:00
Faryan Rezagholi
f543b83cfc added missing issue (#870) 2021-12-16 00:41:57 +01:00
Faryan Rezagholi
2d917ca11a set lang version to latest 2021-12-15 22:54:08 +01:00
Faryan Rezagholi
2c830627ef removed orphaned paths, added missing ones 2021-12-15 21:11:22 +01:00
Faryan Rezagholi
46003a3509 removed orphaned path from harvest dir 2021-12-15 20:18:10 +01:00
Faryan Rezagholi
6b0412586e Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-15 19:50:03 +01:00
Faryan Rezagholi
36ca7ffbdb removed credits file from installer 2021-12-15 19:48:23 +01:00
Dimitrij
e5244f1fec Merge pull request #2085 from tecxx/develop
fix issue 2075
2021-12-15 18:41:57 +00:00
Faryan Rezagholi
359a7272e8 build external connectors on 'release portable' 2021-12-15 19:38:33 +01:00
Dimitrij
82cd3a7e56 swap runtime and configSections as per below https://stackoverflow.com/questions/13623896 2021-12-15 16:01:40 +00:00
tecxx
a2e78fd08a fix issue 2075 by standardizing "StartProgram" Property to "RDPStartProgram" and "StartProgramWorkDir" to "RDPStartProgramWorkDir" 2021-12-15 15:11:56 +01:00
Faryan Rezagholi
a48b5e9d65 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-15 02:42:00 +01:00
Faryan Rezagholi
f4c4d9ea8c removed 'en-US' specific translation in favor of default (en) 2021-12-15 02:41:50 +01:00
Dimitrij
02ed45fa61 added file exist check and null check 2021-12-15 01:31:26 +00:00
Dimitrij
ad227ea2ee add check if no removable files to don't throw null error 2021-12-15 01:02:13 +00:00
Dimitrij
d7e2358d3e Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-14 23:50:13 +00:00
Faryan Rezagholi
196e98e4a7 Merge pull request #2084 from tecxx/develop
fixed some tests around "StartProgramWorkDir"
2021-12-14 22:04:09 +01:00
tecxx
00bc45fba1 fix some more inconsistencies with "StartProgramWorkDir" 2021-12-14 21:45:39 +01:00
Dimitrij
62c0d3f07f Merge pull request #2083 from tecxx/develop
fix a test case caused by property named "Prop_StartProgram" instead …
2021-12-14 20:37:16 +00:00
Faryan Rezagholi
d42574a16c updated sql scripts (fixes #1436) 2021-12-14 21:36:14 +01:00
tecxx
a854b04293 fix a test case caused by property named "Prop_StartProgram" instead of "StartProgram" 2021-12-14 21:07:06 +01:00
Faryan Rezagholi
96632da4d7 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-14 20:00:10 +01:00
Faryan Rezagholi
cf18d6b1e9 reordered "added" section 2021-12-14 20:00:02 +01:00
Faryan Rezagholi
262e2e1b85 Merge pull request #1451 from mRemoteNG/push_settings_recursively
Added option to push inheritance settings to children recursively
2021-12-14 19:51:10 +01:00
Faryan Rezagholi
743c46de70 merge from develop 2021-12-14 19:48:10 +01:00
Faryan Rezagholi
9624bc96c9 Merge pull request #2081 from Vest/refactor_rijndael
Fixed compiler warning
2021-12-14 19:36:32 +01:00
Vest
1643bb7d59 Corrected "obsolete" warnings for objects RijndaelManaged and MD5CryptoServiceProvider
Added several "using" statements for all disposable objects.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-14 16:55:14 +01:00
Faryan Rezagholi
edad5a838f removed credits file 2021-12-14 13:40:35 +01:00
Faryan Rezagholi
fb35226e20 update nuget packages 2021-12-14 13:37:40 +01:00
Faryan Rezagholi
40605737b1 Merge pull request #2080 from Vest/issue_2079
Copy theme files to target dir
2021-12-14 13:31:13 +01:00
Faryan Rezagholi
01a62e099e updated changelog (#2079) 2021-12-14 13:27:23 +01:00
Faryan Rezagholi
80748bb66b copy theme files to output dir (fixes #2079) 2021-12-14 13:25:40 +01:00
Faryan Rezagholi
c6c77e9bc4 Revert "Solve issue #2079"
This reverts commit 1f462648c4.
2021-12-14 13:23:31 +01:00
Vest
1f462648c4 Solve issue #2079
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-14 13:10:02 +01:00
Faryan Rezagholi
099256e5d4 code cleanup 2021-12-14 01:14:51 +01:00
Dimitrij
8735d24122 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-12 19:37:12 +00:00
Dimitrij
b2fc3967d3 update to move dll and lang to subfolders, not supported fully in net 6.0 2021-12-12 19:36:47 +00:00
Faryan Rezagholi
0ec02cfa56 removed left over project files from #2076 2021-12-09 20:29:45 +01:00
Faryan Rezagholi
ade36d6876 re-add .net framework 2 as supported runtimefor installer 2021-12-09 20:25:48 +01:00
Faryan Rezagholi
73313d7dae fixes/simplified postbuild installer scripts 2021-12-09 20:11:45 +01:00
Faryan Rezagholi
7db9865ffa build installer for .net framework 4.8 only 2021-12-09 18:27:29 +01:00
Faryan Rezagholi
40656cb70b Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-09 18:20:27 +01:00
Faryan Rezagholi
b5a07f3e79 Update README.MD 2021-12-09 18:20:20 +01:00
Faryan Rezagholi
66877ce9b1 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-09 18:16:00 +01:00
Faryan Rezagholi
57b067b4e2 don't convert license file to rich text format on installer build 2021-12-09 18:14:35 +01:00
Faryan Rezagholi
74999e9394 removed obsolete files 2021-12-09 18:14:05 +01:00
Faryan Rezagholi
f4d6f1e5ee Condensed README.MD 2021-12-09 18:09:22 +01:00
Faryan Rezagholi
096f670eb3 hide disc cost button in installer (#1363) 2021-12-09 00:22:00 +01:00
Faryan Rezagholi
bceaca49bf imported templates from wix sources to be able to make modifications. 2021-12-09 00:21:04 +01:00
Faryan Rezagholi
5e94c84516 spelling fix 2021-12-08 23:08:35 +01:00
Faryan Rezagholi
28dc14e739 improved feature tree in installer 2021-12-08 23:06:56 +01:00
Faryan Rezagholi
d5d28e80cb removed any cpu configurations from solution file 2021-12-07 01:22:49 +01:00
Faryan Rezagholi
f1eea76249 added build configs for external conectors project 2021-12-07 01:12:20 +01:00
Faryan Rezagholi
0976404eda merged from develop 2021-12-07 01:10:02 +01:00
Faryan Rezagholi
8074c9a7c6 re 2021-12-07 01:06:31 +01:00
Dimitrij
513af43fca Merge pull request #2076 from tecxx/develop
rework TSS api to use .net6 compatible code
2021-12-06 21:59:58 +00:00
tecxx
afd5d76992 rework TSS api to use .net6 compatible code
rename dll to ExternalConnectors.dll for possible other future implementations
refactor namespaces in dll
2021-12-06 21:54:35 +01:00
Faryan Rezagholi
a31da5f880 update build configuration 2021-12-06 00:57:00 +01:00
Faryan Rezagholi
be470f50ec rounded corners 2021-12-04 15:17:24 +01:00
Faryan Rezagholi
a04494346e rounded corners 2021-12-04 15:15:25 +01:00
Faryan Rezagholi
797533459e Update README.MD
updated .net version requirement
2021-12-04 14:39:19 +01:00
Faryan Rezagholi
22e879ef18 Update README.MD
added server 2022
2021-12-04 14:37:19 +01:00
Faryan Rezagholi
dc6bc5b4d6 fixed appveyor badges 2021-12-04 14:34:07 +01:00
Faryan Rezagholi
a6c7457c59 updated VncSharp nuget 2021-12-02 23:20:20 +01:00
Dimitrij
b609cfba2a Merge pull request #1848 from johnwc/feature/RemoteDesktopServices
Feature/remote desktop services
2021-12-02 09:02:56 +00:00
John Carew
345980f457 Removed duplicate StartProgram property set 2021-12-02 01:27:27 -06:00
John Carew
5a86a0a8cb Merge from develop 2021-12-02 00:32:40 -06:00
John Carew
24c1ce3f4a Correct saving StartProgramWorkDir 2021-12-02 00:17:26 -06:00
Faryan Rezagholi
fc65c2583e hopefully fixed all installer build issues 2021-12-02 01:15:22 +01:00
Faryan Rezagholi
1df3c33f69 removed developer note from license file 2021-12-02 00:11:07 +01:00
Faryan Rezagholi
98a9cc7436 Update README.MD 2021-12-01 23:51:06 +01:00
Faryan Rezagholi
ff88d4649c more adjustments to the build configuration 2021-12-01 23:42:16 +01:00
Faryan Rezagholi
8c61306a8d Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-01 23:25:52 +01:00
Faryan Rezagholi
6496e34868 fixed installer paths 2021-12-01 23:25:42 +01:00
Faryan Rezagholi
7d6c9d517c unified different project configurations 2021-12-01 23:25:17 +01:00
Faryan Rezagholi
d918d8ffd1 Update README.MD 2021-12-01 22:53:18 +01:00
Dimitrij
ca61ea09d0 --update test libs 2021-12-01 20:55:15 +00:00
Faryan Rezagholi
faff230d42 applied fix from @reox22 2021-12-01 21:09:57 +01:00
Faryan Rezagholi
c288c3d071 fixed project style of pr 2021-12-01 21:07:18 +01:00
Faryan Rezagholi
500a22b0b6 merged from develop 2021-12-01 21:07:00 +01:00
Faryan Rezagholi
ba1317d245 replaced newly introduced backup icon with one that matches the programs ui 2021-12-01 20:25:00 +01:00
Dimitrij
5cfbfc5071 --correction
test cases
2021-12-01 10:04:38 +00:00
Dimitrij
bf4b9d5355 --lib updates 2021-11-26 09:41:32 +00:00
Dimitrij
904f0bc202 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-11-26 09:20:56 +00:00
Dimitrij
94c546bd0f -- fix for tests 2021-11-26 09:20:45 +00:00
Dimitrij
64f1e10a5e Merge pull request #2024 from mRemoteNG/dotnet
Migrate Project to .NET6
2021-11-26 09:14:55 +00:00
Faryan Rezagholi
8b20da78ff merge from develop 2021-11-25 22:40:32 +01:00
Faryan Rezagholi
1be4ef437d merged from develop 2021-11-25 22:40:20 +01:00
Dimitrij
76da9c3247 -fix
fix serializers for OpeningCommand
2021-11-17 23:30:57 +00:00
Dimitrij
1e4dcc23d7 -fix
more fix regarding adding new option
2021-11-17 11:41:06 +00:00
Dimitrij
9c95e7fd96 -fix after nunit update 2021-11-16 22:29:00 +00:00
Dimitrij
cea5f57c60 --fix
better way to set of defaults
2021-11-16 19:10:09 +00:00
Dimitrij
19e6d37b62 -- fix
Set CustomToolNamespace to avoid overwrite on change
2021-11-16 19:02:29 +00:00
Dimitrij
018979d17f #2064 fix, to avoid failure then null, set by default to be empty 2021-11-16 17:19:06 +00:00
Dimitrij
8bd398cbd6 update to VS 2022 2021-11-16 13:29:14 +00:00
Dimitrij
59872b14cf #1297
little fix of logic
2021-11-16 13:28:45 +00:00
Dimitrij
c5240d72e1 Merge pull request #2065 from merarischroeder/503_ssh-execute-single-command-after-login
Added Null/Empty check for OpeningCommand
2021-11-16 09:08:39 +00:00
Todd Hubers
77b54f9a10 Added Null/Empty check for OpeningCommand 2021-11-15 13:38:56 +11:00
Dimitrij
b5bcb5b3bb libupdate 2021-11-13 16:42:33 +00:00
Dimitrij
87c500138b update .net framework to version 4.8 2021-11-13 16:32:47 +00:00
Dimitrij
f3f384ebcc Merge pull request #2064 from merarischroeder/503_ssh-execute-single-command-after-login
503 SSH Execute a single command after login
2021-11-13 16:16:54 +00:00
Todd Hubers
08de2eacd6 Amended changelog 2021-11-13 03:25:03 +11:00
Todd Hubers
b763d968fe Support for saving OpeningCommand and the InheritedOpeningCommand. Tested for stock saving only. 2021-11-13 03:22:35 +11:00
Todd Hubers
3b05eba2e2 Use SendKeys to Execute the Opening Command on the Putty window after logged in + NEWLINE. Tested and working. 2021-11-13 03:05:02 +11:00
Todd Hubers
b6d2c72a40 Added new SSH Property "Opening Command" 2021-11-13 02:47:16 +11:00
Dimitrij
e6d2c9791d Merge pull request #2063 from tecxx/SecretServerInterface
Thycotic Secret Server Interface
2021-11-05 13:00:45 +00:00
tecxx
91a0eeb29a add changelog entry 2021-11-04 21:30:48 +01:00
tecxx
8c9c4865f2 add secret server handler to RDP and SSH 2021-11-04 21:13:37 +01:00
tecxx
6fbd4a7c88 add secret server interface library 2021-11-04 21:09:23 +01:00
Dimitrij
239adaa129 add 'Languages' folder as alternative for translation assemblies (to move from root all translations into it) 2021-11-02 23:08:09 +00:00
Dimitrij
9f8c82b649 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-11-02 22:53:56 +00:00
Dimitrij
7875bb6ebd lib update 2021-11-02 22:53:14 +00:00
Dimitrij
a33abf3f56 Merge pull request #2061 from horizontti/patch-1
Create Language.fi-FI.resx
2021-11-02 10:05:33 +00:00
horizontti
1fadadcdb5 Create Language.fi-FI.resx 2021-11-01 23:59:46 +02:00
Faryan Rezagholi
a294dec0dc merged from develop 2021-10-30 15:58:32 +02:00
Dimitrij
5de75e6a8a downgrade DockPanelSuite to 3.0.6 due reference error in 3.1.0 2021-10-30 01:04:39 +01:00
Dimitrij
4b44be2e54 libs update 2021-10-28 17:57:48 +01:00
Dimitrij
b5f1d63175 Merge pull request #2058 from LightningSt0rm/develop
Fix a break in the Windows Clipboard Chain
2021-10-28 17:24:33 +01:00
Adrian
1c5695df7e Update changelog 2021-10-20 17:52:50 -05:00
Adrian
1808ad9ad7 Correct issues with the Windows Clipboard Chain, where the chain was broken when messages to WM_CHANGECBCHAIN weren't handled appropriately as well unregister self from the clipboard chain when closing. 2021-10-20 17:10:24 -05:00
Dimitrij
8dc5e81374 Update French translation #2045 2021-09-21 22:46:49 +01:00
Dimitrij
b899056a8e lib update 2021-09-17 23:12:47 +01:00
Dimitrij
f884c47ad8 set Language as resource 2021-09-17 22:58:58 +01:00
Dimitrij
07eae639b6 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-09-14 12:13:58 +01:00
Dimitrij
d2349bd713 merge with new options 2021-09-14 12:03:01 +01:00
Faryan Rezagholi
28ee3c6e8f merged from develop 2021-08-30 00:36:28 +02:00
Faryan Rezagholi
4430f269f7 Merge pull request #2033 from IDDesigns/id/net5
Id/net5
2021-08-29 23:04:55 +02:00
Faryan Rezagholi
a72f7d63f6 Added <LangVersion>preview</LangVersion> to test project 2021-08-29 22:59:38 +02:00
Faryan Rezagholi
859b6f8ac5 set target framework to "net6.0-windows" instead of "net6.0-windows7.0" 2021-08-29 22:55:19 +02:00
Faryan Rezagholi
a7f238aba3 merge from dotnet 2021-08-29 22:51:29 +02:00
Faryan Rezagholi
e0cff27aae addded <LangVersion>preview</LangVersion> to project file 2021-08-29 18:55:21 +02:00
Faryan Rezagholi
d9c4a6ec76 Merge branch 'dotnet' into dotnet6 2021-08-29 18:45:29 +02:00
Faryan Rezagholi
4d95bc4255 merge from develop 2021-08-29 18:45:02 +02:00
Faryan Rezagholi
fdea0144b0 removed test output from script 2021-08-29 18:44:08 +02:00
Faryan Rezagholi
7398a373c2 Squashed commit of the following:
commit 84b28316d01d158891d909e90fe428e48d5566e3
Author: Faryan Rezagholi <faryan.rezagholi@siedle.de>
Date:   Sun Aug 29 13:08:31 2021 +0200

    r

commit 7375b4a5456a615b36c4fbf0eda7a8d56762de85
Author: Faryan Rezagholi <faryan.rezagholi@siedle.de>
Date:   Sun Aug 29 12:54:40 2021 +0200

    ...

commit 96aa9d809131c8277bd62cb90fdfa4fd07f1940e
Author: Faryan Rezagholi <faryan.rezagholi@siedle.de>
Date:   Fri Aug 20 15:12:03 2021 +0200

    j
2021-08-29 18:41:50 +02:00
Faryan Rezagholi
c88e45cde8 fixed app.config for dotnet6 2021-08-29 12:47:31 +02:00
Ian Dunkerly
f77848e3d9 Fixing up unit tests 2021-08-27 21:20:50 +01:00
Ian Dunkerly
5ed78cc3b6 Swapped BouncyCastle for Portable.BouncyCastle which support .net standard 2.0 2021-08-22 17:25:55 +01:00
Ian Dunkerly
1b4593bb62 Removed system.web reference - these are not supported in .Net 5 2021-08-22 15:28:47 +01:00
Ian Dunkerly
c620e26644 Import MSTC as ActiveX control removing need for dependency on Windows Simulator 2021-08-22 14:27:58 +01:00
Faryan Rezagholi
74af24c3db appveyor test 2021-08-20 13:14:16 +02:00
Faryan Rezagholi
ac1f32f773 setting workdir for 7z 2021-08-20 13:03:22 +02:00
Faryan Rezagholi
99c7dbb332 trying -sfp2 option on 7z for appveyor 2021-08-20 12:17:14 +02:00
Faryan Rezagholi
b0632b8910 trying to fix appveyor no 7z-ing portable release 2021-08-20 00:36:09 +02:00
Faryan Rezagholi
d26a9615c0 updated nuget 2021-08-19 23:47:46 +02:00
Faryan Rezagholi
f609d6e0b2 removed cefsharp nuget 2021-08-19 23:47:37 +02:00
Faryan Rezagholi
e5042712b6 nuget update 2021-08-19 23:29:13 +02:00
Faryan Rezagholi
bf93d3af04 fixed ambigous call 2021-08-19 22:36:41 +02:00
Faryan Rezagholi
ea43abe392 updated projects to .net6 2021-08-19 22:36:32 +02:00
Faryan Rezagholi
0e74314ddc fixed port scan and external tools window not showing 2021-08-15 21:53:10 +02:00
Faryan Rezagholi
54eabd6a74 some property display names were not showing, fixes #1990 2021-08-15 20:53:52 +02:00
Faryan Rezagholi
2f52473566 Allow setting Port when using MSSQL, fixes #1884 2021-08-15 20:13:59 +02:00
Faryan Rezagholi
98e7250b3c trying to fix 7z creating archives wrong on appveyor 2021-08-15 19:51:25 +02:00
Faryan Rezagholi
882438f5e0 replaced logo in readme 2021-08-15 19:16:17 +02:00
Faryan Rezagholi
bb93dddd39 copy PUTTYNG.exe to output dir 2021-08-15 17:05:13 +02:00
Faryan Rezagholi
59f6a8a933 fixed wix installer 2021-08-15 16:36:55 +02:00
Faryan Rezagholi
8ce83f3cd0 removed orphaned path from project 2021-08-15 16:32:50 +02:00
Faryan Rezagholi
745e402da9 Removed VNC Smart Size feature. This allows the use of VNCSharp via nuget instead of distributing our own version of it) 2021-08-15 16:32:31 +02:00
Faryan Rezagholi
6cbe1c92d5 fix for Proces.Start() on .net5 2021-08-15 16:28:38 +02:00
Faryan Rezagholi
54fc2fb4c6 updated readme 2021-08-15 16:20:23 +02:00
Faryan Rezagholi
adc2815ab5 fixed some failing tests 2021-08-15 16:20:09 +02:00
Faryan Rezagholi
75f9f647ee migrated projects to .net5 2021-08-15 16:16:30 +02:00
Faryan Rezagholi
f14f7dbb72 removed assembly info classes as they are no longer needed 2021-08-15 16:15:34 +02:00
Faryan Rezagholi
4978618e9a merged from develp 2021-08-15 14:08:40 +02:00
Faryan Rezagholi
59b9f4f15b moved resharper logo 2021-08-15 02:17:40 +02:00
Faryan Rezagholi
7ff0ce5369 tring to fix 7z duplicate file error on appveyor builds 2021-08-15 00:41:59 +02:00
Faryan Rezagholi
93bd278819 removed assembly bindings 2021-08-14 18:30:49 +02:00
Faryan Rezagholi
b97b1f3690 added sigcheck back 2021-08-14 18:24:36 +02:00
Faryan Rezagholi
307f374be1 fixed renaming of installer not working 2021-08-14 18:17:17 +02:00
Faryan Rezagholi
17f701824e encore un test 2021-08-14 17:05:21 +02:00
Faryan Rezagholi
c7b89dcf71 another test 2021-08-14 16:57:42 +02:00
Faryan Rezagholi
fc527a947f appveyor build script fixes 2021-08-14 16:49:23 +02:00
Faryan Rezagholi
d0520690a2 appveyor build script fixes 2021-08-14 16:45:06 +02:00
Faryan Rezagholi
315d020b6f appveyor build script fixes 2021-08-14 13:55:42 +02:00
Faryan Rezagholi
8a4bcdef52 appveyor build script fixes 2021-08-14 13:48:38 +02:00
Faryan Rezagholi
727ef34c6d appveyor build script fixes 2021-08-14 13:46:43 +02:00
Faryan Rezagholi
d8bc06d05d ? 2021-08-14 13:41:09 +02:00
Faryan Rezagholi
def214dde2 maybe this time 2021-08-14 13:39:10 +02:00
Faryan Rezagholi
219f948c4a again... 2021-08-14 13:35:13 +02:00
Faryan Rezagholi
72193eccf0 appveyor fix 2021-08-14 13:30:54 +02:00
Faryan Rezagholi
7eb85c6a3d trying to fix appveyor not zipping 2021-08-14 13:26:35 +02:00
Faryan Rezagholi
954c667173 cleanup 2021-08-14 13:16:09 +02:00
Faryan Rezagholi
33c738df5f unified/simplified/accelerated zip file creation 2021-08-14 13:07:14 +02:00
Faryan Rezagholi
2141fe298f let appveyor use project scripts 2021-08-14 12:15:13 +02:00
Faryan Rezagholi
8e73f512b4 moved puttyng.exe to project root 2021-08-14 01:55:51 +02:00
Faryan Rezagholi
92dddb8fd8 removed unused scripts 2021-08-13 02:20:34 +02:00
Faryan Rezagholi
e9869f4c88 cleaned up resource structure 2021-08-13 02:06:21 +02:00
Faryan Rezagholi
52597d4dcb removed 7zip binarys from project 2021-08-13 01:44:26 +02:00
Faryan Rezagholi
dc7ce27b81 fixed designer error 2021-08-13 01:17:27 +02:00
Faryan Rezagholi
4242595a66 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-08-13 01:12:45 +02:00
Faryan Rezagholi
50b9a11503 change searchbar placement default property 2021-08-13 01:12:20 +02:00
Faryan Rezagholi
621a723602 Merge pull request #2022 from mRemoteNG/webview2
Replace CefSharp with Webview2
2021-08-12 23:46:04 +02:00
Faryan Rezagholi
6260cc3655 fixed tests 2021-08-12 23:35:19 +02:00
Faryan Rezagholi
300e668327 updated wix file fragments 2021-08-12 23:26:18 +02:00
Faryan Rezagholi
3cf274c37a updated changelog 2021-08-12 23:11:55 +02:00
Faryan Rezagholi
2ca356ee5c removed CefSharp from credits 2021-08-12 22:55:40 +02:00
Faryan Rezagholi
ca8751c40c little code cleanup 2021-08-12 22:54:20 +02:00
Faryan Rezagholi
3c7e97d2d9 replaced CefSharp with WebView2 2021-08-12 22:46:07 +02:00
Faryan Rezagholi
dbe2d690da removed majority of cefsharp related code 2021-08-12 21:00:26 +02:00
Faryan Rezagholi
949410e2cc unified release channel names across program 2021-08-11 03:21:16 +02:00
Faryan Rezagholi
100f856b5f cleaned up view menu and made all properties saveable 2021-08-11 03:08:20 +02:00
Faryan Rezagholi
d7bee01454 removed orphaned templates dir 2021-08-10 01:17:15 +02:00
Faryan Rezagholi
5566081986 update nuget packages 2021-08-10 00:59:27 +02:00
Faryan Rezagholi
29f7dd93f3 optimized form closing event 2021-08-10 00:56:14 +02:00
Faryan Rezagholi
3dd8db5728 updated icons in connection tree 2021-08-08 22:30:55 +02:00
Dimitrij
17e70d11f5 Merge pull request #2016 from xjoker/develop
Cannot connect to the database when the password has special characters
2021-08-06 14:59:15 +01:00
wuwenjing
f8afd439b2 When the password contains special characters, it will be unable to connect to the database. Using "SqlConnectionStringBuilder" to construct "ConnectionString" can solve the problem 2021-08-06 16:35:01 +08:00
Faryan Rezagholi
0dc61b1c26 Merge pull request #2014 from mRemoteNG/revised_icons
Revised icons
2021-08-04 02:39:03 +02:00
Faryan Rezagholi
de6c4fcb17 updated readme 2021-08-04 02:18:53 +02:00
Faryan Rezagholi
57f5c854ff moved logo 2021-08-04 02:13:17 +02:00
Faryan Rezagholi
4f4523ab77 removed old form icons 2021-08-04 02:11:29 +02:00
Faryan Rezagholi
e34e632519 removed ICOs from project 2021-08-04 01:49:06 +02:00
Faryan Rezagholi
f810b902a6 added image converter class to get ico from resources (get rid of redundant image resources) 2021-08-04 01:48:08 +02:00
Faryan Rezagholi
fd5bdc1484 replaced remaining icons 2021-08-04 01:11:34 +02:00
Faryan Rezagholi
e3a12ae6c5 you guessed it... ICONS! 2021-08-04 00:51:54 +02:00
Faryan Rezagholi
c9c5664ec6 icons icons icons 2021-08-04 00:39:33 +02:00
Faryan Rezagholi
75cff549ce more icons changed 2021-08-03 23:53:08 +02:00
Faryan Rezagholi
885cb6915d Merge branch 'develop' into revised_icons 2021-08-03 23:13:27 +02:00
Faryan Rezagholi
f9396a4ecf moved photoshop image templates out of project folder 2021-08-03 22:43:57 +02:00
Faryan Rezagholi
f1a03329e5 removed ultravnc icon 2021-08-03 22:38:15 +02:00
Faryan Rezagholi
f65be671a3 moved icons that will stay the same 2021-08-03 22:36:34 +02:00
Faryan Rezagholi
fa9e8f6cba merged develop 2021-08-03 22:27:51 +02:00
Faryan Rezagholi
67a3e76cfe removed icons that are obsolete since #2011 and #2013 2021-08-03 22:16:53 +02:00
Faryan Rezagholi
e4569c0bb8 Merge pull request #2013 from mRemoteNG/remove_components_check
Remove components check
2021-08-03 22:11:10 +02:00
Faryan Rezagholi
6f1a62e917 Merge branch 'develop' into remove_components_check 2021-08-03 21:57:06 +02:00
Faryan Rezagholi
3f6e21f15a Merge pull request #2011 from mRemoteNG/remove_screenshot_manager
removed screenshot manager
2021-08-03 21:54:52 +02:00
Faryan Rezagholi
46c4287c67 updated changelog 2021-08-03 21:51:09 +02:00
Faryan Rezagholi
1ea1826a27 removed leftovers from components check 2021-08-03 21:46:00 +02:00
Faryan Rezagholi
151457daf0 removed components check options page 2021-08-03 21:39:07 +02:00
Faryan Rezagholi
38cc21fa3a first wave of icons changed 2021-08-03 21:36:03 +02:00
Faryan Rezagholi
77f759f258 more icons cleaned up 2021-08-03 18:50:47 +02:00
Faryan Rezagholi
07c04061c2 more unused icons removed 2021-08-03 01:30:06 +02:00
Faryan Rezagholi
d4bf6ed0c8 added icons that were no part of the resource file 2021-08-03 01:21:11 +02:00
Faryan Rezagholi
ebd46efe81 Merge branch 'develop' into remove_screenshot_manager 2021-08-03 01:11:28 +02:00
Faryan Rezagholi
24d193efb0 revised host status icons 2021-08-03 00:59:59 +02:00
Faryan Rezagholi
3b2a63178f removed unused images/duplicate resources 2021-08-03 00:52:28 +02:00
Faryan Rezagholi
78f60afb85 Removed famfamfam folder and obsolete icons from images folder 2021-08-03 00:49:11 +02:00
Faryan Rezagholi
52a7957789 Update README.MD
Embedded new logo
2021-08-02 12:56:04 +02:00
Faryan Rezagholi
6870583b1c new logo 2021-08-02 12:50:00 +02:00
Faryan Rezagholi
9ffe514350 fixed error from previous merge 2021-08-02 00:29:15 +02:00
Faryan Rezagholi
fc6e04497a updated changelog 2021-08-02 00:16:14 +02:00
Faryan Rezagholi
cfb3f9a3ca merged from develop 2021-08-02 00:13:33 +02:00
Faryan Rezagholi
d47fac791e removed unused language strings 2021-08-02 00:05:10 +02:00
Faryan Rezagholi
490b70c2d3 removed cef scheme handler for obsolete in-app documentation 2021-08-02 00:01:48 +02:00
Faryan Rezagholi
3eecdd9ada Merge pull request #2010 from mRemoteNG/redesign_menus
Redesigned Menus
2021-08-01 23:51:22 +02:00
Faryan Rezagholi
7bdbc5417c update changelog 2021-08-01 23:28:32 +02:00
Faryan Rezagholi
2cd07dcb72 Merge branch 'develop' into redesign_menus 2021-08-01 23:01:53 +02:00
Faryan Rezagholi
adb83ade67 Merge pull request #2005 from mRemoteNG/remove_in_app_documentation
Remove in-app documentation
2021-08-01 23:00:21 +02:00
Faryan Rezagholi
a90f5da8b0 updated changelog 2021-08-01 22:45:39 +02:00
Faryan Rezagholi
38937a4f83 more rearrangements 2021-08-01 22:43:59 +02:00
Faryan Rezagholi
31f35a23ee removed some icons from file menu 2021-08-01 22:39:16 +02:00
Faryan Rezagholi
74de010d3c cleaned up icons in view menu 2021-08-01 22:32:27 +02:00
Faryan Rezagholi
a9e4c880df redesigned help menu 2021-08-01 22:29:04 +02:00
Faryan Rezagholi
b7fe265604 rearranged view menu 2021-08-01 21:45:15 +02:00
Faryan Rezagholi
25c4af5a9f cleaned up file menu 2021-08-01 21:40:14 +02:00
Faryan Rezagholi
b3ecf702e1 removed developer notice 2021-07-28 21:31:59 +02:00
Faryan Rezagholi
c34a3cc7e7 Added back sphinx documentation files 2021-07-26 01:22:31 +02:00
Faryan Rezagholi
158783f2d1 removed screenshot manager 2021-07-26 01:11:01 +02:00
Faryan Rezagholi
624192d301 Added featured project 2021-07-26 00:51:21 +02:00
Faryan Rezagholi
e9be139ed0 removed HelpWindows from code 2021-07-24 19:40:52 +02:00
Faryan Rezagholi
2b9195ed9c fixed typo 2021-07-24 19:38:09 +02:00
Faryan Rezagholi
dfdfecba57 open help in external browsr instead of in-app 2021-07-24 19:37:38 +02:00
Faryan Rezagholi
2d6fec13fb added url to documentation 2021-07-24 19:37:22 +02:00
Faryan Rezagholi
216f340468 removed sphinx documentation files 2021-07-24 19:35:00 +02:00
Faryan Rezagholi
a4211a7e55 removed postbuild sphinx script 2021-07-24 19:34:04 +02:00
Faryan Rezagholi
d6a2488fde removed obsolete citrix reference from minimum requirements section 2021-07-22 22:33:58 +02:00
Faryan Rezagholi
d4d60439b6 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-07-22 22:12:02 +02:00
Faryan Rezagholi
75edd0d8ef round corners on splash screen 2021-07-22 22:11:05 +02:00
Dimitrij
b4e6e21094 Merge pull request #2001 from radiosti/patch-1
added optional but helpful winscp arguments
2021-07-20 09:54:42 +01:00
radiosti
8c48bc926e Update external_tools_cheat_sheet.rst 2021-07-19 20:56:26 +02:00
Dimitrij
031b6fb30d set AutoGenerateBindingRedirects 2021-07-05 20:17:39 +01:00
Dimitrij
647542e462 update supported os list 2021-07-04 14:51:00 +01:00
Dimitrij
dbf28d83f3 update PuTTY to v.0.75 2021-07-04 14:42:03 +01:00
Dimitrij
142acdd42f cleanup unused files 2021-06-29 12:18:02 +01:00
Dimitrij
ce103d30d3 update lib 2021-06-29 10:11:16 +01:00
Kvarkas
556d65e8b4 upd README.MD 2021-06-24 23:47:14 +01:00
Kvarkas
e0cf070bd0 fx mistypo 2021-06-24 23:45:52 +01:00
Kvarkas
70c5a336c2 upd 2021-06-24 23:43:52 +01:00
Kvarkas
f82d5fbd2d nb 2021-06-24 23:26:34 +01:00
Kvarkas
31418ba6f7 added nb 2021-06-24 23:09:08 +01:00
Kvarkas
3c10bb2669 activate Start in full screen mode 2021-06-24 23:03:32 +01:00
Kvarkas
0e009a2762 add option to run in full screen mode 2021-06-24 22:09:50 +01:00
Kvarkas
cfd718872b version update 2021-06-22 11:11:00 +01:00
Kvarkas
f57b278ef8 lib update 2021-06-22 11:10:10 +01:00
Dimitrij
730833feff Merge pull request #1958 from dimithras/patch-1
Powershell (non ISE) added to common external tools with a handful argument. Several edits.
2021-06-19 10:08:31 +01:00
Dimitrij
4168dda535 Merge pull request #1851 from vardars/feature/minify_xml
feature/minify_xml - Minifying xml config file
2021-06-19 10:06:27 +01:00
Dimitrij
639261a5a4 Merge pull request #1899 from ianselmi/develop
Enable multi items drag&drop
2021-06-19 09:31:13 +01:00
Dimitrij
c4db6fac13 Merge pull request #1849 from vardars/feature/alternate_shell
feature/alternate_shell - alternate shell implemented as Start Program
2021-06-19 09:19:55 +01:00
Dimitrij
264ac7662d Merge pull request #1898 from jobarner/bug/RDP-local-scale-factor
Fix RDP local desktop scale not taking effect on remote
2021-06-17 13:19:43 +01:00
Dimitrij
8237ed1a1d Merge pull request #1960 from jdmcnair/develop
Fix for failed update-info parse crash (issue #1959)
2021-06-17 13:13:28 +01:00
Dimitrij
f82cb73100 Merge pull request #1878 from GentlemanRabbit/develop
Fix Portable version build failed
2021-06-17 13:07:41 +01:00
Dimitrij
15fc27681f Merge pull request #1872 from Fyers/develop
Update German translations
2021-06-17 13:02:19 +01:00
Dimitrij
81beb3285e Merge pull request #1918 from tony1661/develop
Raspberry Pi Icon added
2021-06-17 12:58:46 +01:00
Kvarkas
39ff3798ca lib update 2021-06-17 11:58:31 +01:00
Kvarkas
8826b0dba0 add missed collection 2021-06-17 10:57:28 +01:00
David Sparer
e56884c1d8 updated readme with notice about project being stalled 2021-06-05 09:24:51 -05:00
Jason McNair
95b81193e7 fix for failed update-info parse crash 2021-05-14 18:32:56 -04:00
Dmitriy Perepelkin
508e93483e Powershell (non ISE) added. Several edits.
Added Powershell example connecting to a remote host using credentials saved in mRemoteNG. Took me several hours to figure out how to do this without a password prompt. Extremely helpful indeed. Also a good showcase on how to use mRemoteNG variables.

Other edits: Powershell (ISE) link was obsolete leading to 404, provided a new one. Added description to IE instead of a dummy.
2021-05-14 15:31:34 +03:00
Antonio Fernandez
c55d9b4042 Raspberry PI Icon added
The Raspberry Pi is becoming more and more used and having a dedicated icon would help :)
2021-01-06 10:52:17 -05:00
ianselmi
aef47609a3 enable multi item drag&drop 2020-11-15 17:13:32 +01:00
Jonathan Barner
5bb3c077b0 Update changelog 2020-11-15 11:04:32 +02:00
Jonathan Barner
501304c51f Fix RDP local desktop scale not taking effect on remote 2020-11-15 10:47:23 +02:00
GentlemanRabbit
d9c1a385e0 Fix Portable version build failed 2020-10-09 22:27:46 +08:00
Fyers
d6c51427a0 german translations 2020-10-05 01:17:40 +02:00
Faryan Rezagholi
2cf5a4317d fixed syntax style inconsistencies 2020-09-27 15:11:29 +02:00
Faryan Rezagholi
b344e3a749 fixed formatting errors 2020-09-27 15:06:08 +02:00
Faryan Rezagholi
6751ff1af3 removed unused using directives 2020-09-27 15:04:28 +02:00
Faryan Rezagholi
7006796f6b Specflow: Generating Code Behind Files using MSBuild 2020-09-27 14:53:53 +02:00
Faryan Rezagholi
1d11d4bca8 updated log4net nuget package 2020-09-27 14:46:12 +02:00
Faryan Rezagholi
43af32585a updated nuget packages 2020-09-16 01:31:23 +02:00
Faryan Rezagholi
7aa5d399e9 updated nuget packages 2020-09-16 01:30:58 +02:00
Faryan Rezagholi
004e161895 Merge pull request #1861 from yurayko/develop
Fix incorrect russian translation
2020-09-15 22:15:14 +02:00
yurayko
ba1c6d44c6 Fix incorrect translation 2020-09-14 10:33:00 +03:00
vardars
87a08077ed feature/minify_xml - Inserted change to "Added" section of changelog 2020-08-30 22:33:14 +03:00
vardars
33b6a4e6cd feature/minify_xml - Changed inheritance behaviour to not writing to disk if inheritance value is false, changed one test according to null xml attribute 2020-08-30 22:23:26 +03:00
vardars
29b0af1d62 feature/alternate_shell - Fixed serialization tests 2020-08-30 19:49:40 +03:00
vardars
7e3b0f7aed feature/alternate_shell - StartProgram marked as AttributeUsedInProtocol(ProtocolType.RDP) 2020-08-30 19:30:14 +03:00
vardars
135c5988ba feature/alternate_shell - alternate shell implemented as Start Program 2020-08-30 19:00:47 +03:00
John Carew
67dfd6b036 Update change log 2020-08-29 17:56:18 -05:00
John Carew
162eb0c958 Add missing db updates for Favorite & ICAEncryptionStrength columns.
Misc vs project automated updates.
2020-08-29 17:44:45 -05:00
John Carew
a2dcc42f68 Update to support reading/writing from config
Update db version to 2.9
Change version tracking from double to Version, to support revision changes between minor versions in db
2020-08-29 17:43:11 -05:00
John Carew
6b7f6dcb19 Add Remote Desktop Services group
Add StartProgram & StartProgramWorkDir properties to Remote Desktop Services group
Corrected Redirect Drives & Smart Cards display names
2020-08-29 17:26:46 -05:00
Faryan Rezagholi
fbcf9ccbd6 Merge pull request #1763 from mRemoteNG/removecitrix
Remove ICA (Citrix) support
2020-07-25 19:49:50 +02:00
Faryan Rezagholi
02e4e71b5d merge develop into removecitrix 2020-07-25 19:25:40 +02:00
Faryan Rezagholi
a71ba82521 Merge pull request #1817 from kevinduongcalabrio/patch-1
Update troubleshooting.rst
2020-07-25 19:23:11 +02:00
Faryan Rezagholi
cda0e3cee3 Merge pull request #1821 from bold-gman/patch-1
Update README.MD
2020-07-25 19:21:54 +02:00
Faryan Rezagholi
1218638794 Do not try to set column width for tinyint, fixes #1819 2020-07-25 19:05:58 +02:00
R
761694cdcc Update README.MD 2020-07-22 12:19:19 +02:00
kevinduongcalabrio
bb63e3a1f1 Update troubleshooting.rst 2020-07-15 07:10:49 -05:00
Faryan Rezagholi
a9b1d84b6e added missing comma in sql script (#1801) 2020-06-27 18:52:26 +02:00
Faryan Rezagholi
a465614506 fixed wording in polish translation (#1803) 2020-06-27 18:44:48 +02:00
Faryan Rezagholi
3055ef208e set AutoScale Mode to DPI 2020-06-20 11:31:26 +02:00
Faryan Rezagholi
e6cf9dce1c return from closed event when form is already disposed. possible fix for #1794 2020-06-19 23:00:02 +02:00
Faryan Rezagholi
9232535763 Update README.MD 2020-06-14 13:15:01 +02:00
Faryan Rezagholi
091c44bb45 Update README.MD 2020-06-14 13:05:48 +02:00
Faryan Rezagholi
f088249260 Update CREDITS.md 2020-06-14 01:48:49 +02:00
Faryan Rezagholi
dc108576e1 Update CREDITS.md 2020-06-14 01:47:12 +02:00
Faryan Rezagholi
5c4da38a52 Update CREDITS.md 2020-06-14 01:25:26 +02:00
Faryan Rezagholi
1e0a19f865 merged from develop 2020-06-13 22:37:17 +02:00
Faryan Rezagholi
390e84a96a moved images linked in readme file 2020-06-13 22:35:17 +02:00
Faryan Rezagholi
4a91a8e4c3 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2020-06-13 22:28:19 +02:00
Faryan Rezagholi
0b1d6d5e04 removed obsolete github templates 2020-06-13 22:27:44 +02:00
Faryan Rezagholi
a5eed483e5 Update README.MD 2020-06-13 22:04:43 +02:00
Faryan Rezagholi
4e9622fde7 Update README.MD 2020-06-13 21:56:38 +02:00
Faryan Rezagholi
f6447c3343 Update README.MD 2020-06-13 21:51:54 +02:00
Faryan Rezagholi
605d4a89ac Update README.MD 2020-06-13 21:42:14 +02:00
Faryan Rezagholi
b5d4b8514a Update README.MD 2020-06-13 21:29:02 +02:00
Faryan Rezagholi
5470a3d808 removed unused appveyor scripts 2020-06-13 19:32:22 +02:00
Faryan Rezagholi
d845e6b520 attempt to fix appveyor build error trying to zip debug symbols 2020-06-13 18:52:38 +02:00
Faryan Rezagholi
ee4d8a1939 removed unresolvable reference 2020-06-13 18:36:01 +02:00
Faryan Rezagholi
acbd233345 removed installation.rst, as 585de5db made it obsolete 2020-06-13 18:35:21 +02:00
Faryan Rezagholi
77d1e51ce4 removed about.rst, as 585de5db made it obsolete 2020-06-13 18:34:04 +02:00
Faryan Rezagholi
af7e75c2df merged develop into removecitrix 2020-06-13 18:31:12 +02:00
Faryan Rezagholi
9b4519978b fixed wrong paths in project file after 6bc22fe0 2020-06-13 18:25:49 +02:00
Faryan Rezagholi
8244b3d731 fixed some typos 2020-06-13 18:12:31 +02:00
Faryan Rezagholi
0d721900f9 merged develop into removecitrix 2020-06-13 18:07:35 +02:00
Faryan Rezagholi
585de5dbc6 moved install information from documentation into readme 2020-06-13 18:05:06 +02:00
Faryan Rezagholi
7b85394a8b added sphinx conf.py to solution 2020-06-13 16:29:28 +02:00
Faryan Rezagholi
3b842798b8 Merge branch 'develop' into removecitrix 2020-06-13 16:20:21 +02:00
Faryan Rezagholi
1aaf3c1cb5 escaped all field names in mssql script 2020-06-13 16:20:00 +02:00
Faryan Rezagholi
84206f701a merged develop into removecitrix 2020-06-13 16:13:52 +02:00
Faryan Rezagholi
9e62c3df7e removed ICA cleint from minimum requirements in documentation 2020-06-13 15:03:16 +02:00
Faryan Rezagholi
430a2529db renamed user controlls to start with capital letter 2020-06-13 14:10:25 +02:00
Faryan Rezagholi
6911a928af moved FullscreenHandler from UI.Forms to UI namespace 2020-06-13 14:05:56 +02:00
Faryan Rezagholi
cf9b7f1cb5 moved classes that do not represent a user control from UI.Controls namepsace into UI namespace 2020-06-13 14:04:13 +02:00
Faryan Rezagholi
f695bbdc8b moved all user controls into same namespace 2020-06-13 13:57:17 +02:00
Faryan Rezagholi
40a4291b07 Removed TextBox class and using NGTextBox instead 2020-06-13 13:43:48 +02:00
Faryan Rezagholi
97bd0a11f3 revised FrmUnhandledException 2020-06-13 13:35:59 +02:00
Faryan Rezagholi
9b77d390c0 Renamed UI classes, that did not follow naming scheme 2020-06-13 13:35:19 +02:00
Faryan Rezagholi
c0a6240764 adjusted namespace 2020-06-13 01:06:41 +02:00
Faryan Rezagholi
86e0b058e5 fixed sphinx error 2020-06-13 00:20:23 +02:00
Faryan Rezagholi
c0a107cbfd merged develop into removecitrix 2020-06-12 23:55:20 +02:00
Faryan Rezagholi
7912623810 fixed about window object bein disposed on second call 2020-06-11 23:54:35 +02:00
Faryan Rezagholi
b72b740d7a removed double entry from sql scripts 2020-06-11 18:09:15 +02:00
Faryan Rezagholi
395ab7ff9e removed obsolete and empty help folder from resources 2020-06-11 17:08:23 +02:00
Faryan Rezagholi
bb75b3ea75 merged from develop 2020-06-11 17:06:33 +02:00
Faryan Rezagholi
6bc22fe060 added COPYING.TXT and README.MD to solution 2020-06-11 17:05:39 +02:00
Faryan Rezagholi
7e634e75cd merged from develop 2020-06-11 17:02:19 +02:00
Faryan Rezagholi
3770bf44ed Update README.MD 2020-06-11 16:26:41 +02:00
Faryan Rezagholi
30914437b2 Update README.MD 2020-06-11 16:26:02 +02:00
Faryan Rezagholi
892a9b98fa Update README.MD 2020-06-11 16:18:09 +02:00
Faryan Rezagholi
a791befd49 updated badges 2020-06-11 15:59:13 +02:00
Faryan Rezagholi
76812b3233 Update README.MD 2020-06-11 15:35:02 +02:00
Faryan Rezagholi
3b000189fd updateed logo 2020-06-11 15:22:55 +02:00
Faryan Rezagholi
b066feeb7e updated logo 2020-06-11 15:18:22 +02:00
Faryan Rezagholi
f7872d0d84 added logo 2020-06-11 15:03:09 +02:00
Faryan Rezagholi
46e5d8e669 renamed SQL property "DomainName" to "Domain" for consistency reasons 2020-06-09 16:25:15 +02:00
Faryan Rezagholi
57018bfba7 Added missing inheritance properties to SQL scripts, fixes #1783 2020-06-09 16:19:34 +02:00
Faryan Rezagholi
3f7e7c50b3 ordered sql scripts alphabetically 2020-06-09 15:37:28 +02:00
Faryan Rezagholi
90065605a9 added missing properties to sql scripts 2020-06-09 15:23:20 +02:00
Faryan Rezagholi
956128683a renamed MainFileMenu class to FIleMenu 2020-06-06 23:57:15 +02:00
Faryan Rezagholi
a0dd270578 improved lenovo autoscroll utility check log output 2020-06-06 23:32:12 +02:00
Faryan Rezagholi
d71067d246 improved FIPS policy check log output 2020-06-06 23:26:40 +02:00
Faryan Rezagholi
f8567bca79 removed xming sessions provider, fixes #1514 2020-06-06 23:15:53 +02:00
Faryan Rezagholi
455e417a70 added missing default setting property 2020-06-06 02:20:54 +02:00
Faryan Rezagholi
99b525d42f check for putty event handler only when trying to send command instead of on any key press, fixes #1756 2020-06-03 22:20:22 +02:00
Faryan Rezagholi
41ccb34bd4 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2020-06-03 01:27:13 +02:00
Faryan Rezagholi
277d6fdd45 generate dummy html help file when python/sphinx is not set up 2020-06-03 01:25:35 +02:00
Faryan Rezagholi
f40b8e9a75 do not use log4net default repository 2020-06-02 22:48:00 +02:00
Faryan Rezagholi
eb580ab82b avoid using AppDomains as they are unsupported by .net core 2020-06-02 22:40:03 +02:00
Faryan Rezagholi
7eaa7f6f29 merged develop into removecitrix 2020-06-02 13:50:21 +02:00
Faryan Rezagholi
358f92e720 Merge pull request #1777 from mRemoteNG/cleanup_project_structure
Cleanup project structure
2020-06-02 13:11:38 +02:00
Faryan Rezagholi
fde3699ebc fixed path to installer project 2020-06-02 11:56:01 +02:00
Faryan Rezagholi
705525cc1d fixed paths in installer project 2020-06-02 11:26:57 +02:00
Faryan Rezagholi
38fed7b55e replaced occurences of mRemoteV! with mRemoteNG in installer project 2020-06-02 11:09:03 +02:00
Faryan Rezagholi
ec494c2e0f updated changelog 2020-06-02 09:42:01 +02:00
Faryan Rezagholi
fd80dcee61 updated CustomActions installer project to .net 4.7.2 2020-06-02 09:37:50 +02:00
Faryan Rezagholi
366d87e6ec fixed failing test 2020-06-02 09:18:14 +02:00
Faryan Rezagholi
f7e2685213 removed obsolete files from tools dir 2020-06-02 09:13:59 +02:00
Faryan Rezagholi
c2ef8fc188 fixed powershell scripts 2020-06-02 09:13:22 +02:00
Faryan Rezagholi
8ea8c411d6 renamed/moved project files 2020-06-02 09:11:01 +02:00
Faryan Rezagholi
09f82a6079 updated documentation for #319 2020-06-01 14:10:49 +02:00
Faryan Rezagholi
91106be934 Override quick connect username when using user@domain, fixes #319 2020-06-01 14:06:07 +02:00
Faryan Rezagholi
772a1527f0 replaced system.drawing with system.drawing.common nuget #1705 2020-06-01 00:45:19 +02:00
Faryan Rezagholi
e39db26c13 get rid of system.web and system.web.extensions #1705 2020-06-01 00:38:52 +02:00
Faryan Rezagholi
56bb513bdc updated copyright string 2020-05-31 23:10:39 +02:00
Faryan Rezagholi
0d511c58ed fixed merge errors 2020-05-31 19:28:01 +02:00
Faryan Rezagholi
7ddd6fa22a merged develop into removecitrix 2020-05-31 19:14:14 +02:00
Faryan Rezagholi
256ea606ed Merge pull request #1332 from wangxuepeng/develop
Add show/hide main menu function to connection tree toolbar.
2020-05-31 19:04:17 +02:00
Faryan Rezagholi
e767dcc5cf fixed null pointer reference due to missing parantheses 2020-05-31 18:51:11 +02:00
Faryan Rezagholi
381850ec4b updated documentation 2020-05-31 18:43:06 +02:00
Faryan Rezagholi
382af99ade fixed merge errors 2020-05-31 18:26:36 +02:00
Faryan Rezagholi
d719a0d52a merged develop into pr/1332 2020-05-31 18:24:49 +02:00
Faryan Rezagholi
68d2bd7ea9 Merge pull request #1776 from mRemoteNG/lang_files_cleanup
Language files cleanup
2020-05-31 18:17:32 +02:00
Faryan Rezagholi
d30c10f9dc merged develop into lang_files_cleanup 2020-05-31 18:00:18 +02:00
Faryan Rezagholi
9da9616cc4 do not automatically check components on entering options page 2020-05-31 16:41:12 +02:00
Faryan Rezagholi
87ca31fc45 fixed some wrong strings used in connection record 2020-05-31 15:59:35 +02:00
Faryan Rezagholi
193cbdb7aa removed entries that are already alike in the neutral language 2020-05-31 15:44:11 +02:00
Faryan Rezagholi
55e7df18f5 the cleaning never stops 2020-05-31 14:44:56 +02:00
Faryan Rezagholi
f850635260 even more cleanup 2020-05-31 14:22:50 +02:00
Faryan Rezagholi
aecaf3fae9 fixed typo 2020-05-31 02:12:36 +02:00
Faryan Rezagholi
fe4c687bdf merged develop into pr/1332 2020-05-31 02:06:32 +02:00
Faryan Rezagholi
c5f185462a do not log to roaming appdata folder on default settings 2020-05-31 01:48:16 +02:00
Faryan Rezagholi
0b80ffa1d0 more cleanup 2020-05-31 01:30:13 +02:00
Faryan Rezagholi
5cafdcd4ee removed unused strings 2020-05-31 00:47:04 +02:00
Faryan Rezagholi
57d72d2cf6 updated changelog 2020-05-31 00:34:16 +02:00
Faryan Rezagholi
5ccc2b1d2a fixed calls to language class in code 2020-05-31 00:18:20 +02:00
Faryan Rezagholi
ea654cf9e6 removed duplicate entries from resx files 2020-05-31 00:02:58 +02:00
Faryan Rezagholi
cb926c4178 removed "str" prefix 2020-05-30 23:31:05 +02:00
Faryan Rezagholi
d7b47ab8b1 updated changelog to include #1720 2020-05-30 22:06:49 +02:00
Faryan Rezagholi
5fe0ef3646 pass config file name to password form on startup, fixes #1720 2020-05-30 22:05:31 +02:00
Faryan Rezagholi
1a10acbb90 Merge pull request #1690 from leaskovski/1071_CEFSharp_HTTP_Rendering
Replace GeckoFX with CefSharp
2020-05-30 21:48:06 +02:00
Faryan Rezagholi
b565a0375c added AdHelper back to solution (was lost during merge) 2020-05-30 21:42:05 +02:00
Faryan Rezagholi
87f842203c fixed merge errors 2020-05-30 19:52:09 +02:00
Faryan Rezagholi
b03b5830b1 merged develop into removecitix 2020-05-30 19:51:50 +02:00
Faryan Rezagholi
9577bb77da merged develop into pr/1690 2020-05-30 19:06:32 +02:00
Faryan Rezagholi
431172515a reinstalled nuget packages 2020-05-30 18:50:29 +02:00
Faryan Rezagholi
2c64625eac changed cef settings cache and cef log file path 2020-05-30 18:39:45 +02:00
Faryan Rezagholi
9687847630 made chromium the default rendering engine 2020-05-30 18:18:38 +02:00
Faryan Rezagholi
c9239e2d87 updated 7zip 2020-05-30 17:58:19 +02:00
Faryan Rezagholi
3931174890 set item check state in view menu after resetting layout 2020-05-30 17:27:11 +02:00
Faryan Rezagholi
a9b062a9d5 merged develop into pr/1690 2020-05-30 16:17:23 +02:00
Faryan Rezagholi
8578df57c6 Update README.MD 2020-05-30 15:43:17 +02:00
Faryan Rezagholi
7b621afa98 relocated user.config output folder to %localappdata%\mRemoteNG\ 2020-05-30 15:38:21 +02:00
Faryan Rezagholi
ef83160308 Updated troubleshooting section in documentation on how to find user.config file 2020-05-30 15:35:38 +02:00
Faryan Rezagholi
fad42f373e Merge pull request #1772 from mRemoteNG/missing_rdp_settings
Missing RDP settings
2020-05-28 12:10:44 +02:00
Faryan Rezagholi
d3f66dd7bb Merge pull request #1773 from SOlangsam/patch-1
update mysql_db_setup.sql - add SSH fields
2020-05-28 11:59:56 +02:00
Faryan Rezagholi
85fefdfabd fixed translation 2020-05-28 11:59:11 +02:00
Faryan Rezagholi
e36fb09ce5 Fixed order in changelog 2020-05-28 11:12:52 +02:00
SOlangsam
bdcb8da2db Update CHANGELOG.md 2020-05-27 17:20:54 +02:00
SOlangsam
4be7385628 update mysql_db_setup.sql - add SSH fields
For using mysql with the new dev version - four fields are missing in table tblCons:
   - SSHTunnelConnectionName
   - SSHOptions
   - InheritSSHTunnelConnectionName
   - InheritSSHOptions

Perhaps you can add a new section on your documation site.
2020-05-27 16:50:24 +02:00
Faryan Rezagholi
7ed4bf46d7 fixed failing tests 2020-05-26 22:28:31 +02:00
Faryan Rezagholi
98dd451502 implemented missing RDP settings #1770 2020-05-26 20:48:58 +02:00
Faryan Rezagholi
c5ded4ceac removed leftover ADTree.dll from project folder 2020-05-26 17:11:54 +02:00
Faryan Rezagholi
8ba2bf39ff referenced local VncSharp.dll instead of the nuget package, because local is v1.2.1.0 and nuget is v1.0.7 2020-05-26 14:48:40 +02:00
Faryan Rezagholi
0bafacbee3 fixed most of the dependencies not being found by vs 2020-05-26 13:29:46 +02:00
Faryan Rezagholi
ff9292bc42 migrated to PackageReference 2020-05-26 12:22:24 +02:00
Faryan Rezagholi
4df334ae86 updated nugets 2020-05-26 11:37:34 +02:00
Faryan Rezagholi
7e10a613b6 reinstalled nugets and removed gecko leftovers 2020-05-26 11:28:35 +02:00
Faryan Rezagholi
eece2a13c5 updated credits 2020-05-26 11:18:12 +02:00
Faryan Rezagholi
1165e639fd updated changelog 2020-05-26 11:14:03 +02:00
Faryan Rezagholi
ab9ffb45fd removed gecko components check 2020-05-26 11:09:53 +02:00
Faryan Rezagholi
e2cf3095e4 removed obsolete language entries 2020-05-26 11:05:29 +02:00
Faryan Rezagholi
0caa0ee004 fixed failing tests 2020-05-26 11:02:40 +02:00
Faryan Rezagholi
464fcc54ce merged develop into pr/1690 2020-05-26 10:52:52 +02:00
Faryan Rezagholi
049374b8ad removed gecko 2020-05-26 10:47:50 +02:00
Faryan Rezagholi
6b392f55c6 revised help window to use cefsharp instead of gecko 2020-05-26 10:39:05 +02:00
Faryan Rezagholi
421076062c added cefsharp scheme to be able to display local html files, e.g. the readthedocs documentation 2020-05-26 10:38:44 +02:00
Faryan Rezagholi
9b86b92a65 added request ahnbdler for cefsharp 2020-05-26 10:37:56 +02:00
Faryan Rezagholi
ec0e733fc6 added download handler for cefsharp 2020-05-26 10:37:42 +02:00
Faryan Rezagholi
a62b8103a0 fixed error on build 2020-05-26 10:28:17 +02:00
Faryan Rezagholi
1eedc99114 Merge pull request #1766 from mRemoteNG/move_component_check
Converted components check page into options page
2020-05-26 10:26:21 +02:00
Faryan Rezagholi
c8774abbab merged develop into move_component_check 2020-05-26 10:03:09 +02:00
Faryan Rezagholi
8d2217aa88 Merge pull request #1767 from mRemoteNG/aboutscreen
Revised about screen
2020-05-26 10:01:11 +02:00
Faryan Rezagholi
85d0a88420 Merge branch 'develop' into move_component_check 2020-05-26 09:56:02 +02:00
Faryan Rezagholi
a66b6d7392 Merge pull request #1762 from mRemoteNG/mergeadtree
Merge ADTree project classes into mRemoteNG
2020-05-26 09:53:28 +02:00
Faryan Rezagholi
0ebcc3c06d updated changelog 2020-05-26 09:49:59 +02:00
Faryan Rezagholi
f534883d62 revised about screen 2020-05-26 09:36:12 +02:00
Faryan Rezagholi
4726671035 updated documentation 2020-05-25 20:59:48 +02:00
Faryan Rezagholi
bdd54afc8a updated changelog 2020-05-25 20:57:38 +02:00
Faryan Rezagholi
d511976ba6 converted components check page into options page 2020-05-25 20:51:57 +02:00
Faryan Rezagholi
f83ed6dfb2 fixed spelling error 2020-05-25 00:22:32 +02:00
Faryan Rezagholi
4137e7f25e code cleanup 2020-05-24 22:45:15 +02:00
Faryan Rezagholi
aca46b76b1 added back theming 2020-05-24 22:40:05 +02:00
Faryan Rezagholi
4c773738d7 moved ADTree classes into mremoteng project 2020-05-24 22:37:47 +02:00
Faryan Rezagholi
eb8ab94e01 added ADTree project to solution 2020-05-24 21:24:06 +02:00
Faryan Rezagholi
11f5fb4aa2 fixed merging error 2020-05-24 17:59:04 +02:00
Faryan Rezagholi
f025733926 merged from develop 2020-05-24 17:57:53 +02:00
Faryan Rezagholi
9e2b8e2003 moved Settings class to its proper location 2020-05-24 17:35:46 +02:00
Faryan Rezagholi
ef081848b0 removed duplicate Console icon 2020-05-24 17:35:07 +02:00
Faryan Rezagholi
6aa1eea2fd updated nuget packages 2020-05-24 17:31:36 +02:00
Faryan Rezagholi
ab5aa4d83b fixed path to visual tiles manifest to be independant from release build 2020-05-24 17:31:25 +02:00
Faryan Rezagholi
a8005293af tried to remove all occurnces of the ica protocol in the code 2020-05-24 16:02:36 +02:00
Faryan Rezagholi
81891e0976 removed obsolete language entries 2020-05-24 13:39:22 +02:00
Faryan Rezagholi
fcf146fccc removed citrix dependencies 2020-05-24 13:39:11 +02:00
Faryan Rezagholi
8729e3f040 removed copying.md license file 2020-05-24 12:18:10 +02:00
Faryan Rezagholi
10673362a6 more guids 2020-05-24 11:08:08 +02:00
Faryan Rezagholi
a8a70e43cb added guids to prevent build error 2020-05-24 02:15:45 +02:00
Faryan Rezagholi
369b3402be updated link to documentation 2020-05-24 00:57:02 +02:00
Faryan Rezagholi
bc70548627 moved Console.ico into Icons folder 2020-05-21 18:18:27 +02:00
Faryan Rezagholi
39245b93d9 Merge pull request #1568 from fmcontrib/issue_420_proxy_aka_jumphost_support
SSH tunneling aka jumphost implemented
2020-05-21 11:16:15 +02:00
Faryan Rezagholi
1f8582b8fa fixed failing tests 2020-05-21 10:55:12 +02:00
Faryan Rezagholi
acb1bdc8e1 Updated documentation 2020-05-21 10:24:21 +02:00
Faryan Rezagholi
cd7a102dc9 Readded icons with PreserveNewest option 2020-05-21 00:21:54 +02:00
Faryan Rezagholi
58ed22a326 merged develop into pr/1568 2020-05-21 00:18:06 +02:00
Faryan Rezagholi
5771c7f798 Merge pull request #1729 from Hizzi/patch-1
Change "Crypter" to "Chiffrer"
2020-05-20 23:20:29 +02:00
Faryan Rezagholi
9598927dec Merge pull request #1714 from GurliGebis/fix-redirection-issues
Corrected how clipboard redirection is done
2020-05-20 23:18:15 +02:00
Hizzi
abffbb8598 Change "Crypter" to "Chiffrer"
"Crypter" is'nt french "Chiffrer" is.
2020-04-03 13:59:02 +02:00
Bjarke Istrup Pedersen
36b9d01917 Corrected how clipboard redirection is done
Previously DisableRdpdr was used, which broke smartcard and sound redirection.
By changing it to use AdvancedSettings6.RedirectClipboard, it works without breaking other stuff.
2020-03-17 09:56:19 +01:00
David Sparer
417eec1d45 Merge pull request #1689 from nLeonardt95/develop
ConnectionFileVersion from 2.7 to 2.8
2020-03-15 11:11:08 -05:00
David Sparer
0eb823ef89 Merge pull request #1687 from IPv777/develop
French localization typo fixing
2020-03-15 11:04:30 -05:00
Leaskovski
56c9435512 Fixed the HTTP CEF render engine not being localised properly. 2020-02-11 12:18:41 +00:00
Leaskovski
98bd901545 Updated CEF from 73 to release 79. 2020-02-10 17:16:34 +00:00
Leaskovski
e9607c30fb Updated CHANGELOG.md to include reference to new feature #1071 2020-02-10 16:43:43 +00:00
Leaskovski
281e3f0c79 Updated CEF Settings to set the logging location to that of the normal logs, and also set its logging level to a matching level as main logs as well. Also updated to now include a cache location so that revisits to previous pages (such as chrome remote desktop) retain logins. 2020-02-10 16:36:09 +00:00
Leaskovski
4f98b59e4f Removed cefBrowser_InitializedChanged event handling because this actually had no use to the browser loading and being usable. Fixed the issue of the CEF Browser not loading the requested URL on connect. Changed the loading logic of the CEF Browser to wait for cefBrowser_LoadingStateChanged to trigger and to look at if it is still loading before logging that the browser is initialised. Altered cefBrowser_LoadingStateChanged to register itself as an event once the browser is loaded as we don't care for any more events once we know it is safe to issue the Browser.Load() method. Updated Connect to record when it has been requested so that if the browser initialises after this request, it can retrigger the code to load the required URL automatically. Removed the dispose code, though this might need to be reimplemented after testing. Updated App.config and .csproj with settings defined in CEF user documentation. Updated some of the CEF Settings to recommended values. 2020-02-10 16:36:09 +00:00
Leaskovski
1d40791557 Added a new property that defines if the browser object has finished initialising, browserInitialised. Moved the URL construction code out to its own private method. Added in browser initialisation hook for CEF browser. Changed how the browser control is hooked in to its parent control. This fixes the CEF browser from not rendering. Enabled verbose logging for the CEF browser temporarily. 2020-02-10 16:36:08 +00:00
Leaskovski
212cd8378c Added in CEF Browser Navigation event handler and removed Gecko Title change handler as the generic one was handling it. Added in CEF settings code to main window. 2020-02-10 16:33:58 +00:00
Leaskovski
ae108f1e14 #1071 - Started to add the CEFSharp Browser Engine (Chromium) 2020-02-10 16:26:53 +00:00
leonardt.neugebauer
e7ed902f24 Set ConnectionsFileInfoSql.ConnectionFileVersion from 2.7 to 2.8 after fixes #1669 2020-02-06 17:49:44 +01:00
IPv777
3d93f793d5 typo fixing 2020-02-05 13:47:05 +01:00
Faryan Rezagholi
9257b7ac52 Merge pull request #1669 from Filippo125/sql_update#1589
Sql fixes
2020-01-16 16:36:31 +01:00
Faryan Rezagholi
28d131f74d fixed typo 2020-01-16 16:23:12 +01:00
Faryan Rezagholi
76e1ae3596 updated changelog 2020-01-16 15:16:08 +01:00
Filippo Ferrazini
8357cfc9b5 Add database migration
Update changelog and credits
2020-01-09 23:41:18 +01:00
Filippo Ferrazini
1250f389af Remove unnecessary code 2020-01-05 16:18:50 +01:00
Filippo Ferrazini
d0ae6ee21a Add check if sql row has to be updated 2020-01-04 14:15:02 +01:00
Filippo Ferrazini
40f5bd9444 Implement crud on mssql 2019-12-29 16:56:34 +01:00
Filippo Ferrazini
c3ea05b862 Fix mssql creation tblCons query 2019-12-29 16:56:15 +01:00
Filippo Ferrazini
488c6f5f64 Change tblCons primary key sql setup 2019-12-28 16:33:23 +01:00
Filippo Ferrazini
a1940e3ab9 Optimize code remove 2019-12-28 16:11:39 +01:00
Filippo Ferrazini
eda873911a Change behaviour in sql save, don't rewrite all database 2019-12-28 16:03:18 +01:00
Faryan Rezagholi
048f890dcb Merge pull request #1622 from wwj402/develop
update chinese simplified language 2019/10/16
2019-11-10 12:15:57 +01:00
Faryan Rezagholi
28c31fc101 fixed failing test 2019-11-10 12:05:24 +01:00
Faryan Rezagholi
852c6576cf Merge branch 'develop' into pr/1622 2019-11-09 19:32:50 +01:00
David Sparer
00a5fc0142 created user documentation for default connection properties 2019-10-16 11:46:33 -05:00
wwj402
48cca34055 update chinese simplified language 2019/10/16 2019-10-16 14:59:41 +08:00
Faryan Rezagholi
b2c5298400 removed incomplete variable example table 2019-10-07 22:23:34 +02:00
Faryan Rezagholi
cf5d5e6974 Merge pull request #1567 from mRemoteNG/powershell_remoting
Powershell remoting
2019-10-06 11:01:26 +02:00
Faryan Rezagholi
3266485307 Updated translated string, fixes #1611 2019-10-05 01:07:19 +02:00
Faryan Rezagholi
d27ae45512 fixed wrongly negated if statement 2019-10-04 21:48:00 +02:00
Faryan Rezagholi
c9f0ea47b7 merged develop into powershell_remoting 2019-10-04 00:59:24 +02:00
Faryan Rezagholi
d5100660fb added missing translation 2019-10-03 18:59:03 +02:00
Faryan Rezagholi
5c07327467 initialize settingsLoader earlier in code to prevent ui elements from being created before the language culture is propeperly set, part of #1497 2019-10-03 18:52:48 +02:00
Faryan Rezagholi
1e374d3a25 minimal code refractoring 2019-10-03 18:14:18 +02:00
Faryan Rezagholi
d68c419bab access language resources with nameof, part 2 2019-10-03 17:06:15 +02:00
Faryan Rezagholi
a9c4d0dee5 simply close options form instead of reverting settings, fixes #1610 2019-10-03 16:56:57 +02:00
Faryan Rezagholi
75a453e598 Merge pull request #1608 from Mant1kor/develop
Update Ukrainian translation
2019-10-03 12:13:44 +02:00
Faryan Rezagholi
404f23e7e6 fixed line break in credits 2019-10-03 11:49:30 +02:00
Mantikor
104be16061 Fixes 2019-10-03 10:33:23 +03:00
Mantikor
742301edf8 Update CREDITS.md 2019-10-03 10:31:57 +03:00
Mantikor
c3734f2e09 Add files via upload 2019-10-03 10:31:34 +03:00
Mantikor
e0cd4f2e0a Add files via upload 2019-10-03 10:30:22 +03:00
Faryan Rezagholi
db6042a30e updated nuget packages 2019-10-03 00:22:45 +02:00
Faryan Rezagholi
0e233e7027 Updated .NET to 4.7.2 2019-10-03 00:18:27 +02:00
Faryan Rezagholi
8e5d41bfea removed https in credits 2019-10-02 19:50:08 +02:00
Mantikor
8bb03195b5 Update CREDITS.md 2019-10-02 17:44:43 +03:00
Mantikor
de2bafd5a0 Update translation and fix errors 2019-10-02 17:28:01 +03:00
Faryan Rezagholi
4c08d06e93 fixed error where mrng would never close when set to "minimize to tray on close" 2019-10-01 14:01:10 +02:00
Faryan Rezagholi
ab5b58f3ae Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2019-10-01 09:31:36 +02:00
Faryan Rezagholi
31f637bc51 Added option to minimize to system tray on closing, fixes #545 2019-10-01 09:31:11 +02:00
Faryan Rezagholi
fbcfdb3fea Merge pull request #1601 from ryno2121/develop
Increased VNC test connection timeout from 150ms to 500ms
2019-09-30 14:13:58 +02:00
ryno2121
b1c650bb72 Increased VNC test connection timeout from 150ms to 500ms
It has been found at times that when connecting to a VNC host that the connection times-out even though the host is powered on. This happens mostly when you are connected to the network through WiFi. The time out value for the VNC test connection has been increased from 150ms to 500ms.
2019-09-30 06:05:42 +02:00
Faryan Rezagholi
209a3fb381 Merge pull request #1596 from ryno2121/develop
Handle VNC timeout
2019-09-27 23:51:37 +02:00
Faryan Rezagholi
772a11cb1d small code improvements and formatting 2019-09-27 23:29:44 +02:00
Faryan Rezagholi
758f7770a1 updated changelog 2019-09-27 23:02:52 +02:00
ryno2121
b319eb188a Update CHANGELOG.md 2019-09-27 18:56:37 +02:00
ryno2121
8ad7547640 Added code to report within 150ms a timeout error if no connection can be made on the VNC port for 150ms. 2019-09-27 17:26:45 +02:00
Faryan Rezagholi
8b060745ef do not try to display multi ssh command from history when there are none, fixes #1595 2019-09-27 09:50:01 +02:00
Faryan Rezagholi
baf2037ca1 Merge pull request #1583 from ng3727/fix_about_window_click
Fix about window url click, updated CREDITS.md
2019-09-19 14:38:11 +02:00
Faryan Rezagholi
7bf00e30e6 minor code formatting 2019-09-19 14:12:22 +02:00
ng3727
55c983c565 Update AboutWindow.cs
fix if the clicked isn't a link, i.e. empty status bar text caused the process start
to cause an exception
2019-09-17 21:45:48 +01:00
ng3727
6a4cd70811 Update CREDITS.md
changed gibhub.com urls to be http:// this allows the urls to be clickable
2019-09-17 21:43:25 +01:00
Fred Fred
851f8dedec Resolved conflicts with develop branch. 2019-09-14 22:10:26 +04:00
Faryan Rezagholi
652a580ec6 fixed typo 2019-09-14 12:04:12 +02:00
Faryan Rezagholi
0d2a2134b9 Merge branch 'develop' into powershell_remoting 2019-09-14 12:03:12 +02:00
Faryan Rezagholi
a330d3e943 fixed copy-paste error 2019-09-12 13:05:39 +02:00
Faryan Rezagholi
0034f78edc merged develop into powershell_remoting 2019-09-10 00:13:23 +02:00
Faryan Rezagholi
27e71ebfc7 get protocol type descriptions by nameof instead of accessing them directly 2019-09-09 23:50:36 +02:00
Faryan Rezagholi
f0f3ddef87 Set localized attributes values by nameof instead of accessing them directly
Makes tracking of used/unused items and renaming items easier
2019-09-09 23:40:04 +02:00
Faryan Rezagholi
f65478ee36 added missing translations 2019-09-09 23:37:48 +02:00
Faryan Rezagholi
4bd7d63d9c merged develop into powershell_remoting 2019-09-09 23:04:48 +02:00
Faryan Rezagholi
bf31b23878 more changelog updates 2019-09-09 21:46:57 +02:00
Faryan Rezagholi
c2ba6d87b2 updated changelog 2019-09-09 21:31:36 +02:00
Faryan Rezagholi
978a53852a some code formatting 2019-09-09 21:24:36 +02:00
Faryan Rezagholi
d20a186e5e removed duplicate icon 2019-09-09 21:05:59 +02:00
Faryan Rezagholi
c384ec373a fixed remaining failing tests 2019-09-09 21:05:28 +02:00
Faryan Rezagholi
c5e0a18dfa fixed some tests 2019-09-09 20:31:56 +02:00
Faryan Rezagholi
4d1ab9ee9f removed duplicate property after merge 2019-09-09 20:11:50 +02:00
Faryan Rezagholi
02384dc26f merged develop into pr/1568 2019-09-09 19:59:09 +02:00
Faryan Rezagholi
e46a53f188 removed db version upgrader to 2.8 and reimplemented new properties into 2.7 upgrader 2019-09-09 18:38:54 +02:00
Faryan Rezagholi
0343254cad Merge pull request #1569 from damianszczepanik/translations-pl
Add translations for Polish language
2019-09-09 09:03:36 +02:00
Damian Szczepanik
9aaafa5015 Add translations for Polish language 2019-09-08 23:15:53 +02:00
Faryan Rezagholi
04bd78e91a Merge pull request #1565 from mRemoteNG/vmid_enhancedmode
Added option to set enhanced mode
2019-09-08 15:57:29 +02:00
Faryan Rezagholi
7ce17c7fb3 added powershell connection icon 2019-09-08 15:27:56 +02:00
Faryan Rezagholi
2a796d3bf5 Update PULL_REQUEST_TEMPLATE.md 2019-09-08 14:58:25 +02:00
Faryan Rezagholi
944aa6b13e Changed background color to native powershell color 2019-09-08 14:56:52 +02:00
Faryan Rezagholi
58add600d6 Update PULL_REQUEST_TEMPLATE.md 2019-09-08 14:30:06 +02:00
Faryan Rezagholi
b1089de1ad Revert "Set language version to C#7.1"
This reverts commit 69c1e2ccc2.
2019-09-08 14:07:22 +02:00
Faryan Rezagholi
69c1e2ccc2 Set language version to C#7.1 2019-09-08 13:43:13 +02:00
Faryan Rezagholi
6ec23d9d69 removed unnecessary usings 2019-09-08 13:07:14 +02:00
Faryan Rezagholi
de3072c67e Added ConsoleControl, since it seems that the powershell.exe cannot be integrated 2019-09-08 13:02:58 +02:00
Faryan Rezagholi
35f6d3eb90 updated documentation 2019-09-08 02:30:55 +02:00
Faryan Rezagholi
f0ffcc6944 updated changelog 2019-09-08 02:25:42 +02:00
Faryan Rezagholi
5ab3f71551 removed redundant language resources 2019-09-08 02:23:53 +02:00
Faryan Rezagholi
cef3b9294d cleanup 2019-09-08 02:22:19 +02:00
Fred Fred
11e3075347 issue #420 sshtunnel aka jumphost implemented 2019-09-07 22:10:03 +04:00
Faryan Rezagholi
0008631771 Added PowerShell Protocol for remote PS-Sessions 2019-09-07 18:16:36 +02:00
Faryan Rezagholi
8e5caaca55 Merge branch 'develop' into vmid_enhancedmode 2019-09-07 16:46:57 +02:00
Faryan Rezagholi
8c962e8b60 Merge pull request #1555 from mRemoteNG/update_geckofx
Updated GeckoFX
2019-09-07 16:42:02 +02:00
Faryan Rezagholi
7ebcba3c21 fixed enhancedMode value not being translated 2019-09-07 06:08:24 +02:00
Faryan Rezagholi
7ac45dbd32 fixed failing tests 2019-09-06 21:02:15 +02:00
Faryan Rezagholi
b83488d08a Added option to det enhanced mode as requested in #1564 2019-09-06 14:59:41 +02:00
Faryan Rezagholi
5528b701fb fixed installer build error 2019-09-03 16:09:36 +02:00
Faryan Rezagholi
8767d103f0 Updated Changelog 2019-09-02 23:15:05 +02:00
Faryan Rezagholi
ca66656a8e updated geckofx from 45 to 60 2019-09-02 22:55:09 +02:00
David Sparer
41e299aaaf dev channel badge updated in readme 2019-09-02 12:33:27 -05:00
Faryan Rezagholi
c3f44ef70a corrected wrongly negated if-statement, fixes #1337 2019-09-02 19:31:08 +02:00
Faryan Rezagholi
fa44e66bd9 Revert "do not automatically enable inheritance on connections imported from AD, fixes #1518"
This reverts commit c1b6bd4679.
2019-09-02 19:25:31 +02:00
Faryan Rezagholi
0b944c4222 added lithuanian language dummy file (copy from default one) as a template to be translated #878 2019-09-02 18:33:10 +02:00
David Sparer
11abc789a0 fixed nunit runner path in publish script 2019-09-02 10:20:41 -05:00
David Sparer
15e2cdaad0 release date set in changelog 2019-09-02 10:03:01 -05:00
David Sparer
10b6973f0d updated changelog and bumped minor version 2019-09-02 09:59:21 -05:00
Faryan Rezagholi
24cd9f257c Moved port property from 'protocol' to 'connection' section, fixes #718 2019-09-01 18:30:30 +02:00
Faryan Rezagholi
8ecb49709e Added missing description for password protect field in root node, fixes #617 2019-09-01 18:00:39 +02:00
Faryan Rezagholi
e12d20ab85 Added option to start mRemoteNG minimized, fixes #1385 2019-09-01 15:52:05 +02:00
Faryan Rezagholi
8b7f7b16a8 revised sort button in connection tree to be able to sort in both orders, fixes #1434 2019-09-01 15:04:16 +02:00
Faryan Rezagholi
117e57d7b0 Allow for sorting in port scan results, fixes #841 2019-08-30 21:57:47 +02:00
Faryan Rezagholi
56b3f9355a Set browser language when using geckofx, fixes #553 2019-08-30 21:41:57 +02:00
Faryan Rezagholi
70af08616f Changed rendering engine of documentation to gecko. Open external links in os default browser, fixes #1378 2019-08-30 18:01:18 +02:00
Faryan Rezagholi
6066cb708e set protocol type when importing from ad, possible fix for #759 2019-08-30 16:28:42 +02:00
Faryan Rezagholi
c1b6bd4679 do not automatically enable inheritance on connections imported from AD, fixes #1518 2019-08-30 16:21:13 +02:00
Faryan Rezagholi
88617759f6 Merge pull request #1508 from Airthee/patch-1
Delete Readme.txt
2019-08-30 15:46:19 +02:00
Faryan Rezagholi
3df98602ee Merge pull request #1551 from ng3727/origin/fix_MsSql_RdpVersion_null
Update DataTableDeserializer.cs handle null values in column RdpVersion
2019-08-30 15:35:19 +02:00
Faryan Rezagholi
3da989e37f Merge pull request #1532 from Filippo125/db_structure#1493
Fixed DB setup scripts, fixes #1493
2019-08-30 15:33:13 +02:00
Faryan Rezagholi
f735237b3a removed README.TXT from installer 2019-08-30 15:29:16 +02:00
david-sway
125330b695 Added handling of Gecko.LauncherDialog.Download (#1548)
* Added handling of Gecko.LauncherDialog.Download
Code lifted from https://stackoverflow.com/questions/27368791/how-to-handle-downloading-in-geckofx-29
This code addition addresses https://github.com/mRemoteNG/mRemoteNG/issues/1400
* updated changelog for #1400
* refractored launcher dialog method
2019-08-30 15:15:45 +02:00
Faryan Rezagholi
11199eabf3 Merge pull request #1544 from damianszczepanik/translate
Add translations for Polish language
2019-08-30 14:22:12 +02:00
ng3727
12b4eb64ba Update DataTableDeserializer.cs
Table allows for null values which must be handled so as not to create an error
2019-08-27 15:19:09 +01:00
Damian Szczepanik
d62fd25db5 Add translations for Polish language 2019-08-22 23:47:17 +02:00
Faryan Rezagholi
58851aadb0 fixed another occurence of a spelling mistake like mentioned in #1458 2019-08-22 14:50:04 +02:00
Faryan Rezagholi
322049196c Merge pull request #1524 from wwj402/develop
update chinese simplified language 2019/07/23
2019-08-17 19:09:02 +02:00
David Sparer
ce85801dcf removed the no-longer used option "automatically get session info" from settings 2019-08-14 08:52:54 -05:00
Filippo Ferrazini
04ad29d7c9 Fix table tblCons structure 2019-08-01 17:42:54 +02:00
Filippo Ferrazini
92f532c694 Fix database issue, column duplicate and absent 2019-08-01 17:26:58 +02:00
wwj402
9188979367 update chinese simplified language 2019/07/23 2019-07-23 10:55:25 +08:00
Faryan Rezagholi
b21379952b Added option to close panel from right click menu, fixes #1512 2019-07-13 18:31:07 +02:00
Raphaël
900c5c8351 Delete Readme.txt
I think this file is no longer maintained and has been replaced by the README.md
2019-07-08 08:41:57 +02:00
Faryan Rezagholi
5cab342c8c do not try to show an exception windows when main form is already disposed 2019-07-01 22:24:46 +02:00
Faryan Rezagholi
69e4bc2650 set html colors of about screen based on current color theme, fixes #1505 2019-07-01 21:56:39 +02:00
Faryan Rezagholi
cabd712b75 updated sql upgrader class to reflect recent changes, fixes #1501 2019-07-01 00:41:58 +02:00
Faryan Rezagholi
fe4266a41e updated nuget packages 2019-07-01 00:38:00 +02:00
Faryan Rezagholi
07fa8232e4 Revert "migrate package.config to PackageReference"
This reverts commit 17e227236f.
2019-07-01 00:16:32 +02:00
Faryan Rezagholi
d02ec9bec6 Revert "updated nuget packages"
This reverts commit 91b1007083.
2019-07-01 00:16:10 +02:00
Faryan Rezagholi
47a508b9ea Merge pull request #1498 from mRemoteNG/feature/rdp_version_selection
Add option to choose RDP protocol version
2019-06-29 12:20:27 +02:00
Faryan Rezagholi
6c620b09c9 updated german translation 2019-06-27 23:21:36 +02:00
Faryan Rezagholi
cb822c44ce Merge branch 'develop' into feature/rdp_version_selection 2019-06-27 23:08:38 +02:00
Faryan Rezagholi
aa9d5ce04e fixed failing tests 2019-06-27 23:08:09 +02:00
Faryan Rezagholi
8876cb91c9 Merge branch 'develop' into feature/rdp_version_selection 2019-06-26 15:03:36 +02:00
Faryan Rezagholi
91b1007083 updated nuget packages 2019-06-26 09:08:24 +02:00
Faryan Rezagholi
17e227236f migrate package.config to PackageReference 2019-06-26 00:39:08 +02:00
David Sparer
22ba4c86bb fixed bug with opening ssh connections
introduced in 65edebc
2019-06-25 08:01:14 -05:00
David Sparer
017d9c8290 updated db init scripts for RdpVersion property 2019-06-24 09:43:06 -05:00
David Sparer
2f7c930859 removed the option for Rdc10 since it is not available for general use yet 2019-06-24 09:36:42 -05:00
David Sparer
983637973b fixed failing tests 2019-06-24 09:30:10 -05:00
David Sparer
bb2e0f0b7d renamed more items to RdpVersion as suggested in code review 2019-06-24 08:31:38 -05:00
David Sparer
0d8a3b84fe simplified RDP version property name and description 2019-06-23 18:15:44 -05:00
David Sparer
3503652df3 added documentation note to rdp 7 warning about performance flag support 2019-06-23 15:34:27 -05:00
David Sparer
1a82e48b3d minor cleanup 2019-06-23 15:29:06 -05:00
David Sparer
f5a86814a9 removed rdp KBs from the install requirements 2019-06-23 15:28:50 -05:00
David Sparer
bde3b691ff updated changelog 2019-06-23 15:15:13 -05:00
David Sparer
ed53db1bdc added an error message for when the rdp client class doesn't exist 2019-06-23 14:11:54 -05:00
David Sparer
ecbd62676b Merge branch 'develop' into feature/rdp_version_selection
# Conflicts:
#	mRemoteV1/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsSerializerMremotengFormat.cs
#	mRemoteV1/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs
#	mRemoteV1/Connection/Protocol/RDP/RdpProtocol6.cs
#	mRemoteV1/Properties/Settings.Designer.cs
#	mRemoteV1/Properties/Settings.settings
#	mRemoteV1/app.config
2019-06-23 13:33:40 -05:00
David Sparer
b343ebec15 minor cleanup 2019-06-23 13:15:15 -05:00
David Sparer
99e1de2503 fixed issue where performance flags were not being honored on newer versions of windows
fixes #323
2019-06-23 13:15:08 -05:00
Faryan Rezagholi
94f8c495d2 updated changelog 2019-06-23 17:12:31 +02:00
Faryan Rezagholi
1fc11c65a5 merged develop into pr/1332 2019-06-23 17:05:43 +02:00
Faryan Rezagholi
f7700b9279 Update README.MD 2019-06-21 21:28:49 +02:00
Faryan Rezagholi
4007568d93 Merge pull request #1422 from mRemoteNG/hyperv
Support for Hyper-V VMRDP
2019-06-21 14:59:02 +02:00
Faryan Rezagholi
208134e970 merged develop into hyperv 2019-06-21 13:58:51 +02:00
Faryan Rezagholi
bda5d481b2 Enable enhanced mode by default 2019-06-21 13:55:03 +02:00
Faryan Rezagholi
00609f5a5d removed trailing slash from URLs, fixes #1496 2019-06-20 22:34:27 +02:00
David Sparer
066e783a37 changed the Edit sub-menu to Inheritance in the connection context menu 2019-06-18 09:16:17 -05:00
David Sparer
3e1bf001c7 Merge branch 'develop' into push_settings_recursively
# Conflicts:
#	mRemoteV1/Resources/Language/Language.Designer.cs
#	mRemoteV1/Resources/Language/Language.resx
2019-06-18 09:10:23 -05:00
Faryan Rezagholi
09f52a32a6 Update connections.rst
fixed typo
2019-06-18 01:33:46 +02:00
Faryan Rezagholi
73c14a9ad0 updated help to include info about PuTTY menu #1209 2019-06-18 00:28:15 +02:00
Faryan Rezagholi
8cc826a57b Merge pull request #1491 from cguadall/patch-1
Update Language.es.resx
2019-06-17 22:27:50 +02:00
cguadall
02e17f9845 Update Language.es.resx
Fix "dle" typo
2019-06-16 09:00:59 +02:00
David Sparer
3e18a25ed3 Merge pull request #1489 from wwj402/develop
update chinese simplified language 2019/06/13
2019-06-15 20:05:58 -05:00
David Sparer
4c31106839 modified RTD theme to prevent scroll bars on list-table cells 2019-06-15 17:59:15 -05:00
David Sparer
2b8ff1d090 added a protocols/rdp page to the documentation 2019-06-15 17:57:58 -05:00
David Sparer
9e7690054d fixed a sphinx warning 2019-06-15 17:56:30 -05:00
David Sparer
2e6fdce592 removed unnecessary files 2019-06-15 17:56:14 -05:00
wwj402
eee40c2130 update chinese simplified language 2019/06/13 2019-06-13 17:08:23 +08:00
David Sparer
818fe3adfc removed pre-install check for RDP KBs
These should no longer be required since we can now dynamically select
which RDP protocol version to use.
2019-06-12 07:59:33 -05:00
David Sparer
f6bfaf415f finished updating serializers and added a default setting for the rdp protocol version property 2019-06-11 15:47:07 -05:00
David Sparer
35a3190b28 updated the component check window to check all supported RDP versions 2019-06-11 14:13:01 -05:00
David Sparer
65edebca2e finished splitting up rdp functionality between classes 2019-06-11 10:44:26 -05:00
David Sparer
aef9be8d9b began re-splitting rdp into different classes by version 2019-06-10 19:34:26 -05:00
Faryan Rezagholi
3acb9f1842 local attribute "favorite not getting serialized", fixes #1470 2019-06-09 23:50:15 +02:00
David Sparer
9f7271178f Merge pull request #1469 from Glober777/FixGetArchitectureData
Improve startup time
2019-06-09 12:45:29 -05:00
Faryan Rezagholi
5038deaf97 updated changelog 2019-06-09 13:23:34 +02:00
Faryan Rezagholi
d6e04156f1 Merge pull request #1473 from suggestable/patch-1
corrected spelling mistake
2019-06-04 22:53:45 +02:00
Faryan Rezagholi
07d7f10622 fixed spellling mistake 2019-06-04 21:57:21 +02:00
Sarah Van der Veken
78a1058aa1 Update sql_configuration.rst
Correcting English syntax
2019-06-04 11:56:42 +01:00
Ivan Seriavin
f16894869a Resolves https://github.com/mRemoteNG/mRemoteNG/issues/1468 2019-05-30 14:27:27 +03:00
David Sparer
31240fa50d moved most RDP enums to their own files 2019-05-27 12:22:26 -05:00
Faryan Rezagholi
0f7c2c83b3 fixed wrong word in russian tranlation #1458 2019-05-25 12:43:10 +02:00
David Sparer
22e43c84fc fixes #1456 2019-05-24 08:31:15 -05:00
Faryan Rezagholi
f9160677c3 Update README.MD
updated stale link, fixes #1457
2019-05-23 21:15:08 +02:00
David Sparer
0b1f04abe3 fixes #1379 2019-05-21 07:51:41 -05:00
David Sparer
c28b4d39ad moved sql scripts to separate files to ease management 2019-05-20 07:41:36 -05:00
David Sparer
519efe633f updated changelog 2019-05-18 15:14:40 -05:00
David Sparer
cf680eba4a fixed issue with collection-changed exception when iterating over items to save 2019-05-18 15:10:51 -05:00
David Sparer
63c78f986d added button to test encryption settings on the security page 2019-05-18 15:10:08 -05:00
David Sparer
57d8b0c803 default kdf iteration count is now 10000 2019-05-18 15:09:24 -05:00
David Sparer
722e18c07d updated changelog 2019-05-15 10:41:00 -05:00
David Sparer
a66ec00587 put the ''apply to children" menu options in a sub-menu 2019-05-15 10:09:08 -05:00
David Sparer
2b5100c019 Merge branch 'develop' into push_settings_recursively 2019-05-15 09:29:02 -05:00
David Sparer
cae906d226 simplified connection initiator method overloads 2019-05-13 14:07:10 -05:00
David Sparer
1ebe773b6e minor cleanup of ng search box 2019-05-13 13:30:13 -05:00
David Sparer
594f005476 fixed a few more cases where default text wouldn't behave correctly 2019-05-13 13:28:25 -05:00
David Sparer
027e37545b added a "defaulttext" mode to the ng search box
This will prevent a bug when users want to perform a real search
using the same term as Language.strSearchPrompt
2019-05-13 12:54:36 -05:00
David Sparer
4fc82ab7c1 fixes #1439 2019-05-13 12:17:50 -05:00
David Sparer
565e163b3e fixes #1447 2019-05-13 09:31:17 -05:00
Faryan Rezagholi
e6c26dde7b Merge pull request #1443 from wwj402/develop
update chinese simplified language base on commit 9fdcffd
2019-05-12 15:36:57 +02:00
Faryan Rezagholi
6e8acc0f4c Merge branch 'develop' into develop 2019-05-12 15:00:25 +02:00
Faryan Rezagholi
b7fff50d31 updated changelog 2019-05-12 14:58:33 +02:00
Faryan Rezagholi
a2d240ee4a Merge pull request #1437 from petterjohanolsen/develop
Updated Norwegian translation
2019-05-12 14:55:55 +02:00
Faryan Rezagholi
a69f6925e9 updated changelog file 2019-05-12 14:42:00 +02:00
Faryan Rezagholi
c4544832d2 Update PULL_REQUEST_TEMPLATE.md 2019-05-12 14:24:20 +02:00
David Sparer
74da05e6e8 fixed tests 2019-05-10 15:47:11 -05:00
David Sparer
af24e3b284 the inheritance button will now be shown on items whose parent is the root node 2019-05-10 15:41:43 -05:00
David Sparer
fb68d0bff3 added a button to apply default inheritance to the selected node 2019-05-10 13:57:58 -05:00
David Sparer
d3a2ba26ba only allow pushing inheritance from containers 2019-05-10 08:10:37 -05:00
David Sparer
2f70ec5cb6 Merge branch 'develop' into push_settings_recursively 2019-05-10 08:04:15 -05:00
wwj402
e9dcb986f9 update chinese simplified language base on commit 9fdcffd 2019-05-08 14:36:02 +08:00
Petter Johan Olsen
93b6fe7aab Updated Norwegian translation 2019-05-05 20:13:49 +02:00
Faryan Rezagholi
d6aadef2b8 Update CONTRIBUTING.md
fixed spelling
2019-05-03 00:01:44 +02:00
Faryan Rezagholi
4e0fb6bf65 updated changelog 2019-05-02 23:54:37 +02:00
Faryan Rezagholi
93c4f99619 Merge branch 'develop' into hyperv 2019-05-02 10:00:31 +02:00
Faryan Rezagholi
7c489cb9aa fixed error where connecting to vm on localhost
fixed error where rdp pre connection blob would not work if mrng is also running on localhost in a console session
2019-05-02 09:57:52 +02:00
Faryan Rezagholi
1d74cc8225 updated collapse/expand icons 2019-05-01 22:40:25 +02:00
Faryan Rezagholi
8021529a41 added back github health files 2019-05-01 22:27:54 +02:00
Faryan Rezagholi
2791f60a58 fixed the rest of the failing tests 2019-05-01 20:43:02 +02:00
Faryan Rezagholi
88e88be756 fixed some failing tests 2019-05-01 16:29:16 +02:00
Faryan Rezagholi
13d42ae288 moved and revised documentation 2019-05-01 01:16:39 +02:00
Faryan Rezagholi
5408cc6015 merged 'develop' into hyperv 2019-05-01 00:23:12 +02:00
Faryan Rezagholi
c97fbba173 Merge pull request #1430 from sli-pro/develop
Minor changes to option pages for russian language
2019-05-01 00:12:37 +02:00
Faryan Rezagholi
79d9e806d5 Merge branch 'develop' into develop 2019-04-30 23:59:27 +02:00
Faryan Rezagholi
12589ffbe0 more little improvements 2019-04-30 23:57:18 +02:00
Faryan Rezagholi
f21b62241a updated changelog 2019-04-30 23:03:48 +02:00
Faryan Rezagholi
b6cd10b51e removed pr template in favor of community-health repository 2019-04-30 21:52:50 +02:00
Faryan Rezagholi
e7344cdc24 updated changelog 2019-04-30 21:52:08 +02:00
Faryan Rezagholi
4e118493d2 Sphinx docs (#1384)
* included changes from @nmat from separate repo into mrng

* added sphinx-doc build dir

* fixed error on non-appveyor builds

* removed unneccesary variable

* added post-build script for sphinx documenatation

* retired "move_help_files" post build script

* added sphinx-documentation files to project

* display spinx docs

* changed theme to read the docs

* fixed typo

* restructured sphinx dir

* added documentation forr keyboard shortcuts and command line switches

* more hierarchy fixes

* added known issues

* added images for sphinx docs to project

* added quick connect documentation

* added port scan documentation

* added screenshot manager documentation

* added notifications documentation

* added import/export documentation

* added ssh file transfer documentation

* added connection config documentation

* added options documentation

* added menus documentation

* converted remaining help files and tidied up resources

* fixed formatting error

* modified sphinx script to automatically grab assembly details from assembly file

* modified copyright string for automated sphinx builds

* splitted toctree

* added RTD configuration file

* added RTD badge

* use default values if assembly file cannot be found

* removed colons from headings

* Minor fixes

* Remove source link so its not confusing for users

* Fix minor spelling

* Add editorconfig for rst files

* added external tools cheat sheet

* extended known issues segment

* added contact information

* Fix list item in document:

* Under "Opening and Closing Connections"

* added infor on how to migrate from pre-NG versions

* fixed list not being rendered properly

* removed markup guide from help to move it to the github wiki

* added missing information from github wiki

* removed contributing document from repository itself to move it to the wiki

* fixed formatting error

* Add more information for import/export

* minor wording fixes

* moved troubleshooting and known issues to its own support section

* moved "folders and inheritance" under "application handling"

* Minor formatting fixes

* Formatting fixes

* Updated docs for ssh file transfer:

* Added screenshot

* Updated documentation a little

* added FAQ

* revised external tools

* fixed sphinx build errors

* changed heading format

* do not output images for sphinx docs to build dir

* removed issue/pr templates

* updated appveyer configuration

* added missing variables

* added python to path

* output PATH for debugging

* sphinx build tests

* Minor cleanup

* added sql script changes into sphinx docs

* removed unused appveyor.xml
2019-04-30 21:42:32 +02:00
sli-pro
590b526079 Minor changes and forms of the Russian language 2019-04-30 21:22:48 +03:00
Faryan Rezagholi
b051e8cc46 Update PULL_REQUEST_TEMPLATE.md
added changelog to pr template checklist
2019-04-30 19:59:32 +02:00
David Sparer
952c2e570e updated changelog 2019-04-30 12:48:53 -05:00
David Sparer
d9834eae6d safer cast in the fips checker
fixes #1428
2019-04-30 12:46:47 -05:00
David Sparer
1901686a2a updated changelog 2019-04-30 10:33:31 -05:00
David Sparer
9efe4f41bf refactored to removed some casts 2019-04-30 10:28:58 -05:00
David Sparer
3fad296e3f use panel setting from connection info unless empty or overriden
fixes #1425
2019-04-30 10:28:03 -05:00
David Sparer
100b101e60 fixed update check file script to point to changelog.md 2019-04-30 08:03:19 -05:00
David Sparer
b66022fb64 fixed #1426 2019-04-30 07:10:06 -05:00
David Sparer
3e354868ea also fix installer project cert password reference 2019-04-29 17:54:11 -05:00
David Sparer
a6fda6c76a get cert password from build args rather than environment
change this back once appveyor is working
2019-04-29 17:37:08 -05:00
David Sparer
7ea08a0f6b fixed changelog and credits links in the csproj 2019-04-29 17:00:36 -05:00
David Sparer
dda6726a43 removed the unreleased section of the changelog for release 2019-04-29 15:03:16 -05:00
Faryan Rezagholi
70deb278e5 removed stale code and small code refractoring 2019-04-29 21:53:58 +02:00
Faryan Rezagholi
017934ab8e open links in about form with system default browser 2019-04-29 21:46:47 +02:00
Faryan Rezagholi
c8c98ebc02 updated changelog 2019-04-29 19:50:38 +02:00
David Sparer
939d49db57 Merge pull request #1419 from mRemoteNG/markdown
Move CHANGELOG.TXT to CHANGELOG.md
2019-04-29 12:21:07 -05:00
Faryan Rezagholi
9994a214b5 Jump between octet fields with tab, fixes #1423 2019-04-29 19:03:53 +02:00
Faryan Rezagholi
5d44ff8ca5 updated vmrdp documentation 2019-04-29 18:46:54 +02:00
David Sparer
60cef9fa49 fixed installer for markdown files 2019-04-29 11:16:35 -05:00
David Sparer
dda98b2902 Merge branch 'develop' into markdown 2019-04-29 08:53:04 -05:00
David Sparer
19ddc9de97 set the release date for 1.77.0 2019-04-29 08:42:41 -05:00
David Sparer
7985344042 updated changelog for #1389 2019-04-29 08:41:20 -05:00
David Sparer
9173e9e56a added a context menu item to push inheritance to child nodes 2019-04-29 08:39:06 -05:00
Faryan Rezagholi
259768f92f updated (de)serializers 2019-04-28 22:30:13 +02:00
Faryan Rezagholi
e61716e25c added german translation for ne connection properties 2019-04-28 16:36:40 +02:00
Faryan Rezagholi
99d747aabe make it possible to connect to vm via id 2019-04-28 15:57:36 +02:00
Faryan Rezagholi
d789e0d5a4 do not hide user/pass/domain when connecting via vm id 2019-04-28 15:04:19 +02:00
Faryan Rezagholi
6524bbed43 added necessary properties to connect to hyper-v virtual machine via VM ID 2019-04-27 19:21:14 +02:00
David Sparer
11ad8a8398 simplified how inheritance is globally disabled/enabled 2019-04-25 10:21:09 -05:00
Faryan Rezagholi
9b9dfbe46a fix display of copyright sign 2019-04-25 11:52:42 +02:00
Faryan Rezagholi
12c67f4244 added link to full changelog 2019-04-25 11:31:17 +02:00
Faryan Rezagholi
cd66d335e8 code-cleanup 2019-04-25 11:07:35 +02:00
Faryan Rezagholi
20a33eb69f removed implementation instructions, fixes #1153 2019-04-25 03:58:26 +02:00
Faryan Rezagholi
ee0fabca8e revised about window to show markdown file as html in gecko web browser 2019-04-25 03:38:41 +02:00
Faryan Rezagholi
527d0b85ad Added Markdig markdown parser 2019-04-25 03:37:10 +02:00
Faryan Rezagholi
4a72a0535b beautified file 2019-04-25 03:36:41 +02:00
Faryan Rezagholi
361d2246ed merged develop into markdown 2019-04-24 23:15:19 +02:00
Faryan Rezagholi
ffd8a9e87b Added new markdown files to project 2019-04-24 23:10:37 +02:00
David Sparer
0d518e44c7 Merge branch 'develop' into push_settings_recursively 2019-04-24 12:26:21 -05:00
David Sparer
be347da9f2 Merge pull request #1389 from mRemoteNG/refactor_config_window
Refactored config window to make property management easier
2019-04-24 12:08:12 -05:00
David Sparer
c01b2ca4be Merge branch 'develop' into refactor_config_window
# Conflicts:
#	mRemoteV1/UI/Window/ConfigWindow.cs
2019-04-24 10:27:27 -05:00
David Sparer
12ad4d2a22 improved the description of the remote audio capture property 2019-04-24 10:18:54 -05:00
David Sparer
18d992b96d updated changelog for #1414 2019-04-24 10:15:51 -05:00
David Sparer
59c74c6101 Merge pull request #1414 from bllkrkmz/develop
Add "Remote Audio Capture" option #383
2019-04-24 10:13:40 -05:00
David Sparer
cf4f552595 moved some theming code from the connection tree window to the connection tree itself 2019-04-23 15:11:50 -05:00
David Sparer
c6a16823b0 fixed ugly unthemed border around connection search box 2019-04-23 14:46:09 -05:00
David Sparer
0eb6185b6c made the connection tree theming code slightly more readable 2019-04-23 14:45:45 -05:00
David Sparer
d11e99b918 removed dead code 2019-04-23 14:30:57 -05:00
David Sparer
ff721ae820 properly theme the password dialog 2019-04-23 14:28:00 -05:00
Bennett Blodinger
dab605f50d Update CHANGELOG.md 2019-04-19 19:16:13 -05:00
David Sparer
cd40f04443 close the splash screen if it exists when an unhandled exception occurs 2019-04-19 10:33:41 -05:00
David Sparer
160e5696fe updated app manifest so we can correctly retrieve win10 version numbers 2019-04-19 10:33:17 -05:00
David Sparer
e98cd4ef55 our unhandled exception window now displays relevant environment info 2019-04-19 10:32:49 -05:00
David Sparer
79fddf1395 updated changelog with some missing items for v1.77 2019-04-18 15:48:00 -05:00
David Sparer
753e8bc049 Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Config/Serializers/MiscSerializers/RemoteDesktopConnectionManagerDeserializer.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
2019-04-18 08:34:59 -05:00
bllkrkmz
2ae59b049c solved some problem according to test case 2019-04-18 09:00:07 +03:00
bllkrkmz
140429c931 Merge branch 'develop' of https://github.com/bllkrkmz/mRemoteNG into develop 2019-04-17 14:33:05 +03:00
bllkrkmz
ad756617dd Add "Remote Audio Capture" option #383 2019-04-17 14:32:37 +03:00
bllkrkmz
8812cd18ad Added "Remote Audio Capture" option 2019-04-17 14:27:46 +03:00
Faryan Rezagholi
ce71fe2b06 Merge pull request #1342 from mRemoteNG/disable_trimming
Added option to disable username trimming
2019-04-16 20:08:42 +02:00
Faryan Rezagholi
360366b9f5 merged from develop 2019-04-16 18:47:39 +02:00
Faryan Rezagholi
29f4123ab8 Merge pull request #1353 from wwj402/develop
update chinese simplified language 2019/03/15
2019-04-16 18:00:15 +02:00
Faryan Rezagholi
9fdcffda2f Merge branch 'develop' into develop 2019-04-16 17:39:20 +02:00
David Sparer
52d1b9a270 Merge branch 'release/v1.76' 2019-04-12 09:14:26 -05:00
David Sparer
068f5942e7 updated changelog and bumped version to 1.76.20 2019-04-12 08:38:06 -05:00
David Sparer
703cefaf19 ensure rdcman import never sets properties to null. fixes #1401 2019-04-12 08:24:05 -05:00
David Sparer
b9d326e9de Merge pull request #1404 from carrtohu/develop
Correct the Chinese translation in https://github.com/mRemoteNG/mRemoteNG/issues/1403
2019-04-12 07:15:30 -05:00
carrothu
06917327d8 Update Language.zh-CN.resx 2019-04-12 13:03:02 +08:00
carrothu
df92aaae56 Update Language.zh-CN.resx 2019-04-12 13:01:42 +08:00
carrothu
cafb03393c Update Language.zh-CN.resx 2019-04-12 12:58:54 +08:00
Sean Kaim
3d32557177 Merge pull request #1390 from mRemoteNG/release/v1.76
Release/v1.76
2019-04-04 15:51:02 -04:00
Sean Kaim
ea1f72b8b7 bump version and changelog update 2019-04-04 15:44:34 -04:00
Sean Kaim
993b6759cc Update PuTTYNG.exe
Reference #1374
2019-04-04 15:41:55 -04:00
Sean Kaim
b89ff616f0 Update ADTree.dll
Fixes #1383

@farosch had some refactoring done in the dll which required some minor updates in the calling code as well...
2019-04-04 15:40:34 -04:00
Sean Kaim
9e37959a50 Update PuTTYNG
Reference #1374
2019-04-04 15:39:25 -04:00
Sean Kaim
40f740de59 fixed typo and unmatched tag 2019-04-03 16:47:38 -04:00
David Sparer
500608b383 fixed a few more bugs in the config window 2019-04-02 15:21:45 -05:00
David Sparer
02c05a6c63 added more config window tests and fixed a bug 2019-04-02 14:39:21 -05:00
David Sparer
4b4444e8d7 added some more tests for the config window 2019-04-02 09:39:57 -05:00
David Sparer
bbeaf76a68 fixed some tests 2019-04-02 07:48:17 -05:00
David Sparer
82c289b2f5 fixed inheritance property display issue 2019-04-01 15:18:58 -05:00
David Sparer
fd461b8e9e mode now correctly switches to connection properties when inheritance isnt a valid selection 2019-04-01 15:02:40 -05:00
David Sparer
7d8a5a2bdf added methods on the container info to push settings to children recursively 2019-04-01 13:26:25 -05:00
David Sparer
edda670b4f refactored the config window property grid logic
Extracted the mapping of properties to the protocols that use them. We can now
declare the mapping directly within the AbstractConnectionInfo class. Created
a new class to handle the specific way we are using the FilteredPropertyGrid
to show connection info / inheritance data.
2019-04-01 13:24:05 -05:00
David Sparer
ccfac74cc3 fixed minor bug in the test value ranomizer 2019-04-01 13:18:38 -05:00
David Sparer
0359e75de7 added tests of the filtered property grid 2019-04-01 13:15:20 -05:00
David Sparer
f709ea2a95 refactored test helper to reduce code duplication 2019-04-01 11:56:09 -05:00
David Sparer
1cd7e27911 changed some asset files from copyalways to presevenewest
this should help alleviate build time issues
2019-04-01 11:55:00 -05:00
David Sparer
e17d0e990d strongly typed the clone method for inheritance info objects 2019-04-01 11:54:03 -05:00
David Sparer
43169bc512 Merge pull request #1339 from mRemoteNG/clear_searchbox
Add button to clear searchbox
2019-03-21 13:42:13 -05:00
David Sparer
0015300b19 Merge branch 'develop' into clear_searchbox 2019-03-21 12:04:49 -05:00
David Sparer
a52c59a36b Merge pull request #1361 from mRemoteNG/feature/896_rdp_view_only
Implemented a view only mode for RDP
2019-03-21 10:58:28 -05:00
David Sparer
6ce89a9f57 Merge pull request #1340 from mRemoteNG/rdp_import
added missing properties when deserializing .rdp file
2019-03-21 10:54:32 -05:00
David Sparer
78d2c42bdd updated credits and changelog 2019-03-21 08:16:47 -05:00
David Sparer
fce7fdbee5 Merge branch 'mjbnz-mysql' into develop 2019-03-21 07:45:36 -05:00
Faryan Rezagholi
a717ec0ae7 added functionality to window menu items 2019-03-20 21:20:34 +01:00
David Sparer
0ce8eafe6c Merge branch 'develop' into mjbnz-mysql 2019-03-20 10:45:43 -05:00
David Sparer
c0b07307f5 Merge branch 'release/v1.76' 2019-03-20 10:38:31 -05:00
David Sparer
8751bd75da Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Connection/Protocol/PuttyBase.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
2019-03-20 10:35:38 -05:00
David Sparer
15f23769d6 bumped version to v1.76.18 and updated changelog 2019-03-20 09:33:21 -05:00
Sean Kaim
2d175fd575 border fix for puttyng 0.70.0.1+ -- backported from develop 2019-03-20 10:21:56 -04:00
David Sparer
01bfdf52ff Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Resources/PuTTYNG.exe
2019-03-20 07:50:38 -05:00
David Sparer
bdeb4b4dcc bumped version to v1.76.17 and updated changelog 2019-03-20 07:32:27 -05:00
David Sparer
bdfbb57504 updated puttyng to 0.71
fixes #1362
2019-03-20 07:29:13 -05:00
David Sparer
c0eebdf74b Merge branch 'mysql' of https://github.com/mjbnz/mRemoteNG into mjbnz-mysql
# Conflicts:
#	mRemoteV1/Config/Connections/SqlConnectionsSaver.cs
#	mRemoteV1/Properties/Settings.Designer.cs
#	mRemoteV1/Properties/Settings.settings
#	mRemoteV1/Resources/Help/ui_sql_configuration.htm
#	mRemoteV1/app.config
2019-03-20 07:22:56 -05:00
Faryan Rezagholi
851b460a32 renamed class 2019-03-20 00:40:27 +01:00
Faryan Rezagholi
aca775a96e Added entry to window menu to hide/show toolstrips 2019-03-20 00:34:11 +01:00
Faryan Rezagholi
41750808f0 Merge branch 'develop' into pr/1332 2019-03-19 23:25:42 +01:00
Faryan Rezagholi
b0458ddda5 Revert "Add show/hide main menu function to connection tree toolbar."
This reverts commit 95f60c78b3.
2019-03-19 23:25:21 +01:00
Faryan Rezagholi
5a317c5d3e Added/unified german language resources 2019-03-19 21:12:09 +01:00
David Sparer
af7c14b2f2 implemented a view only mode for RDP 2019-03-19 14:24:11 -05:00
David Sparer
d151524ed9 updated vncsharp dll 2019-03-19 12:42:20 -05:00
David Sparer
175acc86e2 Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
2019-03-16 11:53:00 -05:00
wwj402
bb07acf45e update chinese simplified language 2019/03/15 2019-03-15 18:53:34 +08:00
David Sparer
38d1c756f3 Merge branch 'release/v1.76' 2019-03-14 18:01:20 -05:00
David Sparer
6c89913bc6 updated changelog 2019-03-14 17:58:53 -05:00
David Sparer
efa72cb697 bumped version to 1.76.16 2019-03-14 17:58:43 -05:00
David Sparer
a31fec5fb9 encrypt correct db field
fixes #1347
2019-03-14 17:35:28 -05:00
David Sparer
2349d2320f use nameof to ensure refactoring is safe 2019-03-13 08:05:55 -05:00
David Sparer
166e5b73fa Merge pull request #1344 from mRemoteNG/help_file_cleanup
Help file cleanup
2019-03-12 07:54:44 -05:00
Faryan Rezagholi
a39b87f9fd reviewed documentation and fixed some layout/grammar mistakes 2019-03-12 10:03:57 +01:00
Faryan Rezagholi
162f945a9e unified design of help pages 2019-03-12 00:07:59 +01:00
Faryan Rezagholi
5be5f54351 improved line-spacing on headings for better readability 2019-03-11 23:09:27 +01:00
Faryan Rezagholi
dfe9f5b05c removed intruduction.htm and included information in index.html 2019-03-11 23:00:19 +01:00
Faryan Rezagholi
4c1e28fe39 added class to indent text parts 2019-03-11 22:44:05 +01:00
Faryan Rezagholi
bf67168c7a updated document title to show breadcrumbs 2019-03-11 21:28:37 +01:00
Faryan Rezagholi
b30ed702d3 underline hyperlinks 2019-03-11 20:27:16 +01:00
Faryan Rezagholi
9c33caf74e beautified html code and made it xhtml conform 2019-03-11 20:19:03 +01:00
Faryan Rezagholi
65e1ab616b removed unused, old screenshots 2019-03-11 20:18:26 +01:00
Faryan Rezagholi
13c5dd7b72 removed tags from initial author 2019-03-11 19:26:06 +01:00
Sean Kaim
abeb546116 Add total downloads badge 2019-03-10 21:59:17 -04:00
Faryan Rezagholi
b37dc9900c Added option to disable username trimming #907 2019-03-11 00:40:00 +01:00
Faryan Rezagholi
b27cd0c914 added missing properties when deserializing .rdp file 2019-03-10 21:13:18 +01:00
Faryan Rezagholi
446b40d8a6 some design improvements 2019-03-10 20:16:02 +01:00
Faryan Rezagholi
6ba1d28f13 added logic for clear button 2019-03-10 18:20:15 +01:00
David Sparer
5a226ff95a replaced the Rename icon
This version is easier to see in dark themes
2019-03-10 11:57:01 -05:00
Faryan Rezagholi
01f4af6876 fixed background color of picturebox 2019-03-10 16:51:46 +01:00
Faryan Rezagholi
0ee173475e introduced new user control 2019-03-10 16:31:55 +01:00
David Sparer
1e36112c06 fixed bug with starting ext tool on folder when nothing selected 2019-03-09 15:43:43 -06:00
David Sparer
c149701f3f Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/App/CompatibilityChecker.cs
#	mRemoteV1/App/Import.cs
#	mRemoteV1/Config/Serializers/MiscSerializers/RemoteDesktopConnectionManagerDeserializer.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Properties/Settings.Designer.cs
#	mRemoteV1/Properties/Settings.settings
#	mRemoteV1/app.config
#	mRemoteV1/mRemoteV1.csproj
2019-03-09 12:10:10 -06:00
David Sparer
752a36d88a Update README.MD 2019-03-09 11:38:17 -06:00
David Sparer
ed81030976 bumped v1.76.15 release date 2019-03-09 11:21:21 -06:00
David Sparer
54322ca949 updated changelog 2019-03-08 10:41:57 -06:00
David Sparer
738b159e95 handle sql first-run case
fixes #1303
2019-03-08 10:31:39 -06:00
David Sparer
e43302b821 Merge pull request #1336 from konpl/develop
Added ability to run External tools on folders
2019-03-08 07:43:01 -06:00
konpl
4f5b9233f4 Merge branch 'develop' into develop 2019-03-08 14:51:52 +03:00
Kirill Trifonov
149778000a Fix bug when run ExternalApp with multifolder structure 2019-03-08 14:49:22 +03:00
David Sparer
3641da1faa abtracted clipboard usage and added tests
fixes #1335
2019-03-07 11:25:23 -06:00
Kirill Trifonov
7c4df9b1c4 Copy Hostname fix #1335 2019-03-06 20:50:13 +03:00
Kirill Trifonov
7260678620 Ability to run External tools on folders, close #375 2019-03-06 17:25:44 +03:00
Sean Kaim
292c20d317 remove unneeded file 2019-03-05 14:19:04 -05:00
Sean Kaim
8fe8739897 use the correct script 2019-03-04 17:37:13 -05:00
Sean Kaim
75bd285f5c remove cert password reference from manual builds 2019-03-04 17:22:31 -05:00
Sean Kaim
822766c831 minimize commands during post-build step 2019-03-04 16:55:06 -05:00
Sean Kaim
8440bde9d7 hide some build output and more consistent cert checks in post build 2019-03-04 16:25:22 -05:00
Sean Kaim
6c792b208c typo and actually use solution dir... 2019-03-04 15:45:48 -05:00
Sean Kaim
a4b869a381 SolutionDir, not TargetDir... 😕 2019-03-04 14:30:34 -05:00
Sean Kaim
db0b48f1ad fulll cert path on AV builds 2019-03-04 13:44:18 -05:00
David Sparer
e8f2e4f50c bumped patch version 2019-03-04 11:45:07 -06:00
David Sparer
5cd201440e added tests for the disposable action class 2019-03-04 11:44:30 -06:00
David Sparer
5c6c76b898 one more parse bug fix 2019-03-04 11:30:34 -06:00
Sean Kaim
5b1486cb6f Update AV publish build 2019-03-04 12:23:28 -05:00
David Sparer
4847ce054b resolved several parsing bugs in the rdcman deserializer 2019-03-04 11:17:45 -06:00
David Sparer
ec42fe7d7d improved testability of the import class 2019-03-04 11:17:19 -06:00
Sean Kaim
116e405ae3 I has teh dumb... 2019-03-04 11:49:55 -05:00
Sean Kaim
202a92998a testing 2019-03-04 11:42:01 -05:00
Sean Kaim
f06618fdaf fix minor syntax 2019-03-04 11:36:54 -05:00
Sean Kaim
a8bd031935 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2019-03-04 11:23:57 -05:00
Sean Kaim
d0dd92578b Updated deployment AV scripts 2019-03-04 11:23:21 -05:00
David Sparer
07a20ed5ad batch saves when importing connection files
This reduces saves/backup overwrites when importing multiple files
2019-03-04 08:41:27 -06:00
mkw-ssd
95f60c78b3 Add show/hide main menu function to connection tree toolbar. 2019-03-01 16:22:12 +08:00
David Sparer
b5228e547c Merge pull request #1320 from mRemoteNG/favorites2
Add connection tree favorites
2019-02-28 08:55:46 -06:00
Faryan Rezagholi
29be020e32 added missing tooltips 2019-02-28 10:04:49 +01:00
Faryan Rezagholi
8b443ed10b added favorites to the quick connect drop down 2019-02-28 10:01:35 +01:00
mjbnz
ae5abbd039 Merge branch 'develop' into mysql 2019-02-28 09:12:32 +13:00
Faryan Rezagholi
9d24c6091b fixed remaining failing test 2019-02-27 20:53:39 +01:00
Faryan Rezagholi
6d2b6259a9 merge from develop 2019-02-27 20:28:41 +01:00
Faryan Rezagholi
2c7425bc51 corrected order of connection info favorite property 2019-02-27 19:54:25 +01:00
David Sparer
6c75fc3506 fixed several tests that assume english localization 2019-02-27 12:17:44 -06:00
Faryan Rezagholi
46ab5829b7 fixed some failing tests 2019-02-26 12:53:05 +01:00
David Sparer
5c5daf053b fixes #1329 2019-02-25 13:59:52 -06:00
Sean Kaim
3cb9bf984b fix the deployment name 2019-02-24 22:18:52 -05:00
Sean Kaim
4b59d79977 appveyor publish changes 2019-02-24 21:23:09 -05:00
Sean Kaim
7fc987f1a2 update appveyor build options 2019-02-24 21:07:10 -05:00
Sean Kaim
f14fd6bf5a Fixes #1314 - hide elements until they are needed
Fixes #1314
2019-02-24 19:26:50 -05:00
Sean Kaim
d3f3a14b1f update appveyor config to exclude portable pdbs 2019-02-24 18:59:59 -05:00
Sean Kaim
b812a1b06f update appveyor config to exclude pdbs 2019-02-24 18:35:59 -05:00
mjbnz
4f95722915 Merge branch 'develop' into mysql 2019-02-22 19:04:38 +13:00
Sean Kaim
2282c19f46 Add 2 strings to resouce file 2019-02-20 23:32:53 -05:00
Sean Kaim
ccc28ba54c Fix CS0649 2019-02-20 23:17:56 -05:00
Sean Kaim
a512465d07 fix CA2213 warnings 2019-02-20 23:15:26 -05:00
Sean Kaim
1bb18abf5a Update tab text for HTTP(S) connections 2019-02-20 23:03:31 -05:00
Sean Kaim
1fec4b33b2 update other nuget packages 2019-02-20 22:53:21 -05:00
Sean Kaim
6266aab466 update gecko nuget 2019-02-20 22:32:48 -05:00
Sean Kaim
31bff169a2 update bouncycastle nuget 2019-02-20 22:30:33 -05:00
Sean Kaim
2f956ed400 update NUnit NuGet packages 2019-02-20 22:25:09 -05:00
Sean Kaim
b16831fc86 implement IDisposable / fix CA1001 warnings 2019-02-20 22:08:03 -05:00
Sean Kaim
ee74a25eae Translation updates
* All files updated via Zeta Editor
* Removed some incorrectly added objects (typos)
* Updated Russian translation (mostly via Google Translate but with some native speaker validation)
2019-02-20 21:32:22 -05:00
Sean Kaim
80eb314d03 fix a typo 2019-02-18 19:15:50 -05:00
Sean Kaim
fd6478c7f5 remove waffle.io 2019-02-18 19:13:59 -05:00
Faryan Rezagholi
56ba332dc5 fixed copy&paste error 2019-02-18 19:14:12 +01:00
Faryan Rezagholi
14deac00f6 updated comment 2019-02-18 19:13:27 +01:00
Faryan Rezagholi
481ca5194a reapplied changes from old PR 2019-02-18 12:57:34 +01:00
David Sparer
0cb4a2cfcc Merge pull request #1309 from mRemoteNG/lang_fix
German language fixes
2019-02-17 14:15:13 -06:00
Faryan Rezagholi
c6d6c2323c fixed genus of Logfile 2019-02-17 19:38:34 +01:00
Faryan Rezagholi
d65c52f6ea merge develop into lang_fix 2019-02-17 19:36:38 +01:00
Mike Beattie
fb7095f2d3 Update SqlUpgrade tests for new Connector class name. 2019-02-17 18:27:00 +13:00
Mike Beattie
c16689d936 Updated Help for SQL Databases.
* Included SQL for creating MySQL tables.

Signed-off-by: Mike Beattie <mike@ethernal.org>
2019-02-17 18:27:00 +13:00
Mike Beattie
9f3bf545bf Implement MySQL support
* Uses MySQL Connector/NET from nuget
* Adds SQL Server type to configuration.
* Hostname for MySQL connections can include port
  - Format:  <hostname>[:<port>]
* Abstracted a bundle of stuff to be generic for both
  MSSQL and MySQL, including a number of variable and method names.
  (Mostly went from "sql..." -> "db..."
* Changed MiscTools.DBDate() string building for MSSQL,
  uses DateTime.ToString() with a format which seemed simpler.
* Unsure about which lines in .csproj are actually required,
  and which are auto-munged by Visual Studio.
* ... This is my first C# (and VS!) work, be gentle!

Signed-off-by: Mike Beattie <mike@ethernal.org>
2019-02-17 18:27:00 +13:00
Mike Beattie
09c8c97b4e Update ConnectionFileVersion to match SQL version
Also add missing columns to SQL script in Help for 2.7

Signed-off-by: Mike Beattie <mike@ethernal.org>
2019-02-17 14:23:32 +13:00
Bennett Blodinger
4cb6c9e2e8 Plaintext to Markdown
Moves CHANGELOG.TXT and CREDITS.TXT to Markdown
2019-02-16 08:54:46 -06:00
Faryan Rezagholi
aef9f98095 some more tweaks 2019-02-15 23:14:50 +01:00
Sean Kaim
e143c6b5b4 resharper code reformat (to allow standard code style going forward) 2019-02-15 16:47:56 -05:00
Faryan Rezagholi
c570c1c0eb replaced "Protokolldatei" with "Logfile" 2019-02-15 22:02:58 +01:00
Sean Kaim
4bc3fe0c1b Use .editorconfig to code style/formatting 2019-02-15 15:59:09 -05:00
Faryan Rezagholi
1f46339900 removed newline 2019-02-15 21:57:09 +01:00
Faryan Rezagholi
a4f354161d removed "..." 2019-02-15 21:55:17 +01:00
Faryan Rezagholi
8a7bc4583b fixed typo in language resource string 2019-02-14 19:08:02 +01:00
Faryan Rezagholi
8468a3de7c fixed unnatural wording 2019-02-14 18:53:07 +01:00
Faryan Rezagholi
e4ff7b43f2 fixed capitalization on one word; translated overlooked word 2019-02-13 23:14:38 +01:00
Faryan Rezagholi
220396d016 renamed proxy settings category from miscellaneous to proxy as there was already a categroy named miscellaneous 2019-02-13 21:24:53 +01:00
Faryan Rezagholi
91f01abbae fixed some more inconsistencies/missing strings in german translation 2019-02-13 09:57:28 +01:00
Faryan Rezagholi
7eda617af9 added/fixed german translation 2019-02-12 22:53:24 +01:00
Faryan Rezagholi
595a22efc3 made hardcoded text on buttons translatable 2019-02-12 22:53:10 +01:00
Faryan Rezagholi
d2578e5be5 made hardcoded strings on updates options page translatable, fixes #785 2019-02-12 22:18:51 +01:00
Sean Kaim
0cd1485f85 Merge pull request #1243 from farosch/rearrange_menu_items
rearranged items and added/replaced icons
2019-02-11 17:26:29 -05:00
Sean Kaim
ab1dcd0e45 Merge branch 'develop' into pr/1243 2019-02-11 17:23:10 -05:00
Sean Kaim
8281f488f3 Merge pull request #1258 from mRemoteNG/RemoveMagicLib
Remove magic lib
2019-02-09 19:24:03 -05:00
Camilo Alvarez
c4a1879ae9 Remove IsSimpleDropSink restores item sorting for #1266
#1266 was generated by OLV ignoring some sink cusotmizations by using the  IsSimpleDropSink flag
2019-02-08 23:55:04 -05:00
Sean Kaim
fcc51b591e Merge branch 'develop' into RemoveMagicLib 2019-02-08 17:22:15 -05:00
Sean Kaim
1b44334361 Merge pull request #1276 from farosch/quick_connect
Set focus to textbox instead of connecting,
2019-02-08 17:21:04 -05:00
Sean Kaim
7ec677f021 conditinally focus 2019-02-08 17:20:30 -05:00
Sean Kaim
08201b0f00 Port FIPS override back to 1.76
Fixes #222
2019-02-08 16:51:58 -05:00
Sean Kaim
89055d2ae9 Remove outdated/incorrect translations for strErrorFipsPolicyIncompatible
These will need to be re-translated.
2019-02-08 16:43:43 -05:00
Sean Kaim
7393159f26 Missed the settings file from previous commit 2019-02-08 16:42:50 -05:00
Sean Kaim
dda2b4af11 Allow FIPS check to be overridden.
Fixes #222
2019-02-08 16:42:21 -05:00
Sean Kaim
7e1bc19a13 cleanup white space 2019-02-08 16:02:11 -05:00
Sean Kaim
650f1df0ee break out expand/collapse on connection tree
Fixes #1273
2019-02-08 15:59:52 -05:00
Sean Kaim
f7bfa82517 Dispose calls Close & Whitespace cleanup 2019-02-08 12:09:31 -05:00
Camilo Alvarez
b0bf31b29c Remove deadlock in #1247
#1247 was caused by a loop of the putty control calling the tab dispose and back again. Created a flag to indicate the ConnectionTab that the closing process was called by the protocol and not the user.
2019-02-07 17:39:40 -05:00
Sean Kaim
54bb9a8f5a minor code cleanup 2019-02-07 15:58:01 -05:00
Sean Kaim
7a38c1055a typo and link fix 2019-02-07 14:38:14 -05:00
Camilo Alvarez
cda557b6fb Avoid null pointers when race conditions or faults are present in protocol closing
Avoid some of the detected faults
2019-02-06 17:53:05 -05:00
Camilo Alvarez
e1fc272e1c new tabs are created in current panel
Added current panel to TabHelper, new tabs are created in the current panel
2019-02-06 11:58:24 -05:00
Camilo Alvarez
aa9b32a383 Changed refocusing method for rdp tabs
Solve bug reported by Joe Cefoli on gitter
2019-02-06 11:27:40 -05:00
Camilo Alvarez
c836e29d2f Screenshots correctly taken from windowed tab
Screenshots can be taken from undock tabs, created helper tab singleton class to make it easy to determine the current tab in the DPS - mremote model
2019-02-05 20:50:13 -05:00
Camilo Alvarez
39b919c38a Improves RDP tab focus
Improves rdp tab focus by passing active to focus event between rdp client and DPS  tab
2019-02-05 20:24:39 -05:00
Camilo Alvarez
4b8d06dfe8 Improvement in protocol to tab focus
Tabs are focused now when mouse is clicked inside of the connetiontab, before clicking inside ssh window, for example, will not highlight the tab.
2019-01-29 23:30:40 -05:00
Camilo Alvarez
b3cfcc1a5e Screenshot only taken from ConnectionTab area
Screenshots contained dockstrip area (the tab name with the x icon), now they are only limited to the ConnectionTab area
2019-01-29 23:19:33 -05:00
Faryan Rezagholi
41f1a65ce6 fixed position of ok button (was 1px off) 2019-01-28 20:16:39 +01:00
Sean Kaim
f8800384e0 Merge branch 'develop' into RemoveMagicLib 2019-01-25 17:15:57 -05:00
Sean Kaim
765bb3886d full path to cert 2019-01-25 16:53:17 -05:00
Sean Kaim
1768104d47 add rlease config and decrypt cert later 2019-01-25 16:46:17 -05:00
Sean Kaim
ab2f4b339a faster build targets? 2019-01-25 16:26:52 -05:00
Sean Kaim
531b1dfa33 build script for signing 2019-01-25 15:50:49 -05:00
Sean Kaim
935719fd43 Merge branch 'develop' into RemoveMagicLib 2019-01-25 15:29:08 -05:00
Sean Kaim
120d928402 use relative path 2019-01-25 15:28:54 -05:00
Sean Kaim
6ad29aaf3c Merge branch 'develop' into RemoveMagicLib 2019-01-25 14:55:14 -05:00
Sean Kaim
ea48c6d68c appveyor publish 2019-01-25 14:54:52 -05:00
Sean Kaim
34c8f21cc6 update with appveor publish build 2019-01-25 13:43:14 -05:00
Sean Kaim
18913eedae Merge branch 'develop' into RemoveMagicLib 2019-01-24 17:04:40 -05:00
Sean Kaim
9b159268bd whitespace clean up 2019-01-24 17:04:11 -05:00
Sean Kaim
a6cd5656f8 no borders for puttyng integrated processes
fixes  #1265
2019-01-23 21:05:15 -05:00
Camilo Alvarez
c93deb7696 Screenshot method change
Some screenshots were blank because DrawToBitmap uses the tab drawing graphics, New method uses screen buffer that brings the pixels from the final screen render.
2019-01-22 15:44:10 -05:00
Camilo Alvarez
0699e895fd Fix for #1249 screenshot X
Corrected casting for disposing the form
2019-01-21 23:49:35 -05:00
Camilo Alvarez
1f700f7842 Fix for #1257
CreateGraphics was the function being disposed in the using, the form handle was still floating around. Suggestion to optimize the dpi function
2019-01-21 23:29:26 -05:00
David Sparer
3db50096c5 Merge pull request #1281 from V0174/patch-1
Typo correction in czech translation
2019-01-17 07:32:31 -06:00
V0174
36bb614a27 Typo correction
Heso -> Heslo.
2019-01-17 08:31:58 +01:00
Sean Kaim
968471ec4a white space clean up 2019-01-16 22:38:31 -05:00
Sean Kaim
401a518f0f Theme page label text update
All theme changes require a restart.
2019-01-16 22:35:08 -05:00
Sean Kaim
96af6b252a themeing fix & update comments 2019-01-16 11:18:34 -05:00
Sean Kaim
6bac9c2432 Disable AlwaysShowConnectionTabs functinoality
This will not work with DPS currently.  Reference https://github.com/dockpanelsuite/dockpanelsuite/issues/559
2019-01-15 17:16:18 -05:00
Sean Kaim
ad44a6ccee Merge branch 'develop' into RemoveMagicLib 2019-01-15 17:04:04 -05:00
David Sparer
d7f6f28413 Merge pull request #1204 from leaskovski/develop
Added a new option to toggle Connection Tabs
2019-01-15 14:23:43 -06:00
Leaskovski
6161307cbb Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop
# Conflicts:
#	mRemoteV1/Properties/Settings.Designer.cs
#	mRemoteV1/Properties/Settings.settings
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/UI/Forms/OptionsPages/TabsPanelsPage.Designer.cs
#	mRemoteV1/app.config
2019-01-15 17:22:43 +00:00
Faryan Rezagholi
96952817c1 Merge branch 'develop' into rearrange_menu_items 2019-01-13 01:42:33 +01:00
Faryan Rezagholi
c8d4a9a671 Set focus to textbox instead of connecting, fixes #1271 2019-01-13 01:30:23 +01:00
Sean Kaim
f059a7732f Fix some theming issues. New IsExtended propery
Done with theme stuff... Or at least I want to be...
2019-01-11 13:30:39 -05:00
Sean Kaim
adefd95fb6 undo a line that was added for testing... Sorry. 2019-01-11 11:29:41 -05:00
Sean Kaim
a0935e8613 missed 2 files in last commit 2019-01-11 11:29:15 -05:00
Sean Kaim
bebc9c9dd4 check themeing active AND/OR IsExtendable
Lots of small changes as a result of this

other minor clean up

Tests should pass now.

And if \Themes\vs2015light.vstheme can't ben loaded, we should be OK now...
2019-01-11 11:28:57 -05:00
Sean Kaim
82507aabcb additional saftey checks and no extended palette for "raw" default theme 2019-01-11 10:48:03 -05:00
Sean Kaim
4e8d336527 remove enable themes and default accordingly
additional error handling attempts for theme loading.
Though, if we can't load \Themes\vs2015light.vstheme we're going to have a bad time...
2019-01-11 10:07:09 -05:00
Sean Kaim
9977f33461 whitespace 2019-01-11 09:25:58 -05:00
Sean Kaim
4e11baa579 designer generated change 2019-01-11 09:03:57 -05:00
Sean Kaim
ef82df5e72 minor cleanup/refactoring 2019-01-10 17:19:02 -05:00
Sean Kaim
506ae1cbc6 Merge branch 'develop' into RemoveMagicLib 2019-01-10 16:10:25 -05:00
Sean Kaim
6156ce48ac rename ONLY the 4 vsthemes
DPS themes are back to their default names.

The *.vsthemes provided on the file system get named in memory to *NG

If we don't find the the theme name pulled from settings, blank it out. This should ONLY happen after upgrading from previous releases for users of the 4 *.vsthemes providedon the file system:  "darcula", "vs2015blue", "vs2015dark" , "vs2015light"

The 3 vs2015* ones are NOT to be confsed with the DPS provided versions of the almost identical name.

Jumping through hoops rather than renaming files/theme names to avoid unexpected theme changes for as many users as possible.
2019-01-10 16:08:56 -05:00
David Sparer
cd32b69d86 Merge pull request #1267 from farosch/overlay_icon_fix
Fixed connection icon overlay sizing
2019-01-10 14:27:55 -06:00
Faryan Rezagholi
1ca38386b7 always resize connection icon to 16x16 before adding overlay icon, fixes #1264 2019-01-10 20:48:26 +01:00
Sean Kaim
ef48f51834 move base.SaveSettings to top like other pages 2019-01-10 14:44:27 -05:00
Sean Kaim
8bcd6b9e53 save settings should only be called on OK/Apply 2019-01-10 14:43:46 -05:00
Sean Kaim
7c22ea6b01 Add apply button 2019-01-10 14:41:25 -05:00
Sean Kaim
b5034fd925 whitespace cleanup 2019-01-10 14:39:27 -05:00
Sean Kaim
a765a71474 minor cleanup 2019-01-10 14:22:58 -05:00
Sean Kaim
f3ad6e66e8 whitepsace clean up 2019-01-10 14:17:06 -05:00
Sean Kaim
3713f98f7b whitespace 2019-01-10 14:00:26 -05:00
Sean Kaim
0c6778b5a3 minor clean up 2019-01-10 13:57:51 -05:00
David Sparer
f56f1160ba safer cast and value access when creating float window 2019-01-10 10:22:00 -06:00
Camilo Alvarez
cc184b7c58 Float window customization for size
It will undock to the original size when it was docked
2019-01-10 10:14:31 -05:00
Sean Kaim
53fdf2bbbf minor clean up 2019-01-10 09:24:42 -05:00
Sean Kaim
033635fb43 copyright 2019
reference #1261
2019-01-09 22:49:20 -05:00
Sean Kaim
40682bc842 create empty panel on startup not working
Reference #1261
2019-01-09 22:46:59 -05:00
Sean Kaim
9da26358ba copy hostname on folder causes exception
Reference #1261
2019-01-09 22:27:14 -05:00
Sean Kaim
2f0550de8e doubleclick on running connection in tree should bring tab to focus
Reference #1261
2019-01-09 22:21:12 -05:00
Sean Kaim
f6a1d603a9 avoid duplicate close() on reconnect 2019-01-09 21:30:03 -05:00
David Sparer
764521414f double include switch-to handler for doubleclick yet 2019-01-09 19:08:17 -06:00
David Sparer
ffe44706c2 fixed issue with connection handlers not updating when settings change 2019-01-09 19:02:17 -06:00
David Sparer
41cab2f652 resolved exception when closing a connection group (top-level dps tab) 2019-01-09 18:03:24 -06:00
David Sparer
35fada7fcd prevent exception when removing connection from list 2019-01-09 16:46:21 -06:00
David Sparer
5b8fb68f65 Merge branch 'develop' into RemoveMagicLib
# Conflicts:
#	mRemoteV1/UI/Forms/OptionsPages/ConnectionsPage.cs
2019-01-09 15:50:53 -06:00
David Sparer
f5e668b716 added user setting for TrackActiveConnectionInConnectionTree 2019-01-09 15:48:11 -06:00
David Sparer
acbc03dc82 Merge pull request #1231 from SeanTMill/feature/trackintree
Tracks the active tab in the treeview
2019-01-09 15:22:35 -06:00
David Sparer
294281e0ac fixed page font 2019-01-09 15:19:44 -06:00
David Sparer
2d450d4dbd Merge branch 'help-updates' of https://github.com/nmat/mRemoteNG into develop
# Conflicts:
#	mRemoteV1/UI/Window/HelpWindow.cs
2019-01-09 15:19:24 -06:00
Sean Kaim
e2865fafde update changelog 2019-01-09 13:57:33 -05:00
Sean Kaim
aa546d87ff safety checks 2019-01-09 10:35:28 -05:00
Sean Kaim
72e637d389 Merge branch 'develop' into RemoveMagicLib 2019-01-09 10:17:38 -05:00
Sean Kaim
842f7045f8 update ADTree.dll
DPI scaling and other minor fixes
2019-01-09 10:17:26 -05:00
Sean Kaim
4f4f3a0370 Merge branch 'develop' into RemoveMagicLib 2019-01-09 09:46:28 -05:00
Sean Kaim
6a354f8757 don't default to a dummy domain
This causes the control to timeout and takes nearly 30 seconds to load
2019-01-09 09:46:14 -05:00
David Sparer
abd9aaa567 close splashscreen when error occurs while loading connections 2019-01-09 07:29:59 -06:00
Sean Kaim
32c4f984e9 theming updates and minor UI changes 2019-01-08 17:10:36 -05:00
Sean Kaim
86e806d021 code cleanup 2019-01-08 13:17:30 -05:00
Sean Kaim
32cff8af6d remove old code 2019-01-08 13:10:20 -05:00
Sean Kaim
40ac2124d8 whitespace clean up 2019-01-08 13:09:41 -05:00
Sean Kaim
a107d0586f close the protocol properly, just not the DockContent... 2019-01-08 12:16:50 -05:00
Sean Kaim
8a94000d98 clean up / refactoring 2019-01-08 12:02:43 -05:00
Sean Kaim
bb90261521 designer generated update 2019-01-08 11:57:45 -05:00
Sean Kaim
fd246bc83b Update title bar on connection change 2019-01-08 11:52:38 -05:00
Sean Kaim
018a97fb8e whitespace cleanup 2019-01-08 11:46:22 -05:00
Sean Kaim
9d10ee2da5 saftey checks 2019-01-08 11:45:41 -05:00
Sean Kaim
8a62942894 whitespace cleanup 2019-01-08 11:16:27 -05:00
Sean Kaim
71cabea03e minor cleanup 2019-01-08 11:15:25 -05:00
Sean Kaim
a37cd62d7e more updates to change themes on restart only 2019-01-08 10:49:32 -05:00
Sean Kaim
f180a5cd70 do nothing if double click on close is not set 2019-01-08 10:14:57 -05:00
Sean Kaim
4405a1fbf7 clean up / resharper fixes 2019-01-08 10:10:07 -05:00
Camilo Alvarez
7603587ce3 Reubicated the custom dock strip initialization
Now it work with all the themes and no theme enabled
2019-01-07 21:31:16 -05:00
Camilo Alvarez
27a06f6cfa Partial fix of double clic
Missing behavior on no theme scenario. Themes including default tested.
2019-01-07 21:03:08 -05:00
Camilo Alvarez
190204a47f Reverted the double click
Reverted the double click as it brokes the tab looks with themes
2019-01-07 20:01:21 -05:00
Camilo Alvarez
7e4003968d Fix broken test
Try #1 -.-
2019-01-07 19:28:03 -05:00
Camilo Alvarez
174dfbe95e Double click to close tab initial implementation
With the setting DoubleClickOnTabClosesIt it will close the tab, otherwise it will undock it. Missing do nothing implementation
2019-01-07 19:07:53 -05:00
Sean Kaim
9fef6dd2d3 minor clean up 2019-01-07 17:34:44 -05:00
Sean Kaim
4ac51a7e58 Tab ICONS!!!! 2019-01-07 17:01:41 -05:00
Sean Kaim
8487dde026 move connectiontab.designer to proper location in project
also make sure it has proper DPI settings
2019-01-07 16:35:02 -05:00
Sean Kaim
52bdf64cdb removed unused variable 2019-01-07 16:24:16 -05:00
Sean Kaim
e254d6978e ActiveTheme is only saved in setting and applied on restart 2019-01-07 15:33:14 -05:00
Sean Kaim
9eb15a25a5 designer generated change 2019-01-07 15:29:19 -05:00
Sean Kaim
8a63200ab9 handle events only when theming is active 2019-01-07 15:28:20 -05:00
Sean Kaim
b18ffc350f clean up 2019-01-07 14:53:24 -05:00
Sean Kaim
1340bc9902 apply themes after restart 2019-01-07 14:50:06 -05:00
Sean Kaim
df36523d6c minor cleanup 2019-01-07 14:27:24 -05:00
Sean Kaim
e626b65f5d speed up Options Page load 2019-01-07 14:03:38 -05:00
Sean Kaim
3ea8a75b3f minor fixes/cleanup 2019-01-07 11:46:14 -05:00
Sean Kaim
6fed9375d3 minor theming fix 2019-01-07 10:52:00 -05:00
Sean Kaim
7764c60797 Merge branch 'develop' into RemoveMagicLib 2019-01-07 10:37:53 -05:00
Sean Kaim
141567f303 Merge pull request #1253 from mRemoteNG/hidpi_fixes
Hidpi fixes
2019-01-07 10:37:35 -05:00
Sean Kaim
ecb2b05c5a connection panel rename not working
other misc fixes/cleanup
2019-01-07 10:17:52 -05:00
Sean Kaim
eda60a7142 resharper fixes & exception logging 2019-01-07 09:27:19 -05:00
nmat
e5fc8bfb2c Merge remote-tracking branch 'upstream/develop' into help-updates 2019-01-07 11:07:41 +01:00
Camilo Alvarez
d8cdba262b Remove tabcontroller references
Remove commented tab controller references
2019-01-06 22:43:57 -05:00
Camilo Alvarez
20f3b19f29 Restored reconnect all, correct tab collection now used instaed of custom one
Reconnect all from main file menu restored, tabsReferences in ConnectionWindow deleted in favor of connDock.DocumentsToArray()
2019-01-06 22:32:16 -05:00
Camilo Alvarez
52ef0c8bcb Fix darcula theme tab colors
Fix color to match theme
2019-01-06 21:17:12 -05:00
Sean Kaim
85aeb059fc find the correct InterfaceControl on conn change 2019-01-05 20:47:33 -05:00
Sean Kaim
edfbad2432 Implement screen shot functionality. 2019-01-05 19:58:56 -05:00
Sean Kaim
ea5b0362df more DPI scaling fixes + frmChoosePnl fixes
frmChoosePanel button layout was off a bit.
Exception when clicking "new" when no panels exist.
2019-01-05 14:34:02 -05:00
David Sparer
1c7d5a5803 fix scaling mode on options pages 2019-01-05 08:20:50 -06:00
Sean Kaim
adb7035f3e Merge branch 'develop' into RemoveMagicLib 2019-01-04 20:33:54 -05:00
Sean Kaim
31f9611478 update external references
ADTree from mRemoteNG/ADTree
VncSharp from mRemoteNG/VncSharp with upstream changes included
2019-01-04 17:19:39 -05:00
Sean Kaim
543da46457 Merge branch 'develop' into RemoveMagicLib 2019-01-04 14:06:19 -05:00
Sean Kaim
6409cb276f minor theme related fixes 2019-01-04 13:58:17 -05:00
Sean Kaim
c07e2e48d0 RDP resize (fit and smartsize) are working now 2019-01-03 22:07:28 -05:00
Sean Kaim
df8613f6be minor refactoring 2019-01-03 21:46:33 -05:00
Sean Kaim
3b35e5a44d minor clean up and default to modern theme 2019-01-03 17:06:44 -05:00
Sean Kaim
69216c8902 minor cleanup 2019-01-03 16:23:31 -05:00
Sean Kaim
3fcafbd76b code clean up 2019-01-03 16:06:59 -05:00
Sean Kaim
a45772bceb remove the magiclib dll... 2019-01-03 15:41:03 -05:00
Sean Kaim
aa0be76c6b remove old MagicLib related code 2019-01-03 15:36:31 -05:00
Sean Kaim
3581f2c818 code cleanup 2019-01-03 14:58:57 -05:00
Sean Kaim
469e6b301c code clean up 2019-01-03 13:13:56 -05:00
Sean Kaim
854af92f3d Merge branch 'develop' into RemoveMagicLib 2019-01-03 12:12:39 -05:00
Sean Kaim
bacf832158 More Segoe UI 2019-01-03 12:08:33 -05:00
Sean Kaim
31744be691 Window -> Segoe UI
and cleanup
2019-01-03 12:04:49 -05:00
Sean Kaim
59155b9f6c TaskDailog -> Segoe UI
and minor cleanup
2019-01-03 11:46:14 -05:00
Sean Kaim
9692e67aab minor cleanup 2019-01-03 11:42:35 -05:00
Sean Kaim
3ab3b79bc7 minor cleanup 2019-01-03 11:41:30 -05:00
Sean Kaim
132713f274 more Forms -> Segoe UI 2019-01-03 11:38:09 -05:00
Sean Kaim
62f7347178 Forms -> Segoe UI 2019-01-03 11:24:04 -05:00
Sean Kaim
3dcb0b2c69 PageSequence -> Segoe UI
and some cleanup
2019-01-03 11:20:10 -05:00
Sean Kaim
9e962b468e FilteredPropertyGrid -> Segoe UI 2019-01-03 11:11:08 -05:00
Sean Kaim
d87283b7d7 UI.ConnTree -> Segoe UI 2019-01-03 11:09:17 -05:00
Sean Kaim
e442cacf5f Controls.Base -> Segoe UI 2019-01-03 09:28:48 -05:00
Sean Kaim
f8ed5b37ac controls -> Segoe UI 2019-01-03 09:24:50 -05:00
Sean Kaim
c36d873636 clean up 2019-01-03 09:21:58 -05:00
nmat
ca2f45fc41 Merge remote-tracking branch 'upstream/develop' into help-updates 2019-01-03 12:21:37 +01:00
nmat
3a3f8546d1 Cleanup and finalize some updates
Added and removed some help. Nothing big but trying to finalize some parts of help.
2019-01-03 12:21:17 +01:00
Sean Kaim
42befd9ce7 count open documents on main form close 2019-01-02 17:40:31 -05:00
Sean Kaim
0f315f414d typo 2019-01-02 17:11:23 -05:00
Sean Kaim
44c35c7fb3 changelog update 2019-01-02 16:06:28 -05:00
Sean Kaim
b1a4d839ac Merge branch 'develop' into RemoveMagicLib 2019-01-02 15:57:01 -05:00
Sean Kaim
1ad46b484f NGNumericUpDown Theming fix
Fixes #1240
2019-01-02 15:40:46 -05:00
Sean Kaim
67420e5416 Segoe UI font on Connections Option page 2019-01-02 15:39:53 -05:00
Sean Kaim
166cec0483 minor clean up 2019-01-02 12:48:47 -05:00
Camilo Alvarez
2c3aace7a9 Tool forms restricted from entering document area
Avoid mixing tool and connection forms in the document area, as they behave and look different.
2019-01-02 12:40:55 -05:00
Sean Kaim
d3e40d7c3d Speed up Theme Option Page load
Fixes #1245

The CheckChanged event was causing load settings to be called more than once on form load.
2019-01-02 10:43:33 -05:00
Sean Kaim
efad824fe3 Speed up Theme Option Page load
Fixes #1245

The CheckChanged event was causing load settings to be called more than once on form load.
2019-01-02 10:42:01 -05:00
Sean Kaim
3bb6962ccc minor cleanup 2019-01-02 10:40:32 -05:00
Sean Kaim
6edb94758e minor cleanup 2019-01-02 08:57:59 -05:00
Camilo Alvarez
e8e70bc81b Resolved broken build, references to drag events
Removed event handlers caused broken build.
2019-01-01 20:38:49 -05:00
Camilo Alvarez
269bbb71f3 Removed drag events
Drag events are already implemented in the MDI mode of DockPanelSuite.
2019-01-01 19:37:40 -05:00
Camilo Alvarez
5cfee0974e Cleanup unused code in CloseOtherTabsToTheRight
Cleanup unused code in CloseOtherTabsToTheRight
2019-01-01 19:30:20 -05:00
Camilo Alvarez
a08454a09a Tab close , other and right restored
Reorganized the close event to the connectionTab class, restore the close from the tab X icon functionality , close all other and close left
2019-01-01 19:26:52 -05:00
David Sparer
ce371e45ae xml deserialization can now tolerate missing attributes 2019-01-01 13:50:00 -06:00
David Sparer
82808be0c7 deleted confcons 2.8 schema since this version doesnt exist 2019-01-01 13:43:03 -06:00
David Sparer
f124ec7131 fixed failing test of the PreviousSessionOpener and readded necessary interface property 2019-01-01 11:55:14 -06:00
Sean Kaim
3ea94fc5e0 fixed failing tests 2018-12-31 14:53:22 -05:00
Sean Kaim
afac6a9a89 Merge branch 'RemoveMagicLib' of https://github.com/mRemoteNG/mRemoteNG into RemoveMagicLib 2018-12-31 12:39:23 -05:00
Sean Kaim
80864c7ca4 code clean up / fix invalid cast
exception would be thrown when attempting to start an external app as a connection.
2018-12-31 12:39:05 -05:00
Camilo Alvarez
19765848d5 Update ConnectionWindow.cs
Restored rename tab functionality
2018-12-31 12:31:50 -05:00
Sean Kaim
21b3ca0b2f cleanup 2018-12-31 12:01:02 -05:00
Sean Kaim
710fdef0fb avoid exception
When clicking on a cell after switching from an extensable theme to a non-extensable one.
2018-12-31 11:38:56 -05:00
Sean Kaim
4f0237209a Enable DPS 2015 Themes
Rename themes to show that they are the DPS out of the box themes.
2018-12-31 11:37:57 -05:00
Sean Kaim
8f5c40487c minor fixes/cleanup 2018-12-31 11:05:53 -05:00
Sean Kaim
5cecd2be81 enable more right click methods 2018-12-31 10:47:33 -05:00
Sean Kaim
c24b79cb9d FindInterfaceControl(DockPanel DockPnl) 2018-12-31 10:34:44 -05:00
David Sparer
0e804d0bba ngradiobutton now scales correctly for hidpi 2018-12-31 09:23:26 -06:00
Sean Kaim
c749f9ead4 Merge branch 'RemoveMagicLib' of https://github.com/mRemoteNG/mRemoteNG into RemoveMagicLib 2018-12-31 10:19:18 -05:00
Camilo Alvarez
87f8317b97 Update ConnectionWindow.cs
Resolved tabs getting into dock panel positions . Tabs are now restricted to  DockAreas.Document | DockAreas.Float. Menu hook no on opening event insteaed of mouse events .
2018-12-31 10:12:32 -05:00
David Sparer
e6e4ecacaf improved display of ngcheckbox on hidpi devices 2018-12-31 08:48:44 -06:00
Sean Kaim
d458bb9a45 minor cleanup 2018-12-31 09:39:07 -05:00
Sean Kaim
362bf7b141 Close is successful - so at least we can reelase some resources for now...
Added a log message also...
2018-12-31 09:16:01 -05:00
Sean Kaim
9c81766b78 Find the correct connection and switch to it
If a connection is open, double clicking on it in the connection tree should switch to that connection...
2018-12-30 22:27:42 -05:00
Sean Kaim
28580103f3 Initial tab close implemtnation
PuttyProcess.Dispose() seems to hang in my initial testing, so it's been disabled for now...
2018-12-30 21:50:23 -05:00
Sean Kaim
1f93ca1cf8 white space and log message 2018-12-30 21:47:06 -05:00
Sean Kaim
2778175752 minor cleanup 2018-12-30 20:21:48 -05:00
Sean Kaim
3e0ed5b0af minor clean up 2018-12-30 20:18:38 -05:00
Sean Kaim
325bd510ff minor clean up 2018-12-30 20:14:55 -05:00
Sean Kaim
2b5a327e53 auto properties 2018-12-30 20:10:41 -05:00
Sean Kaim
c322946c32 minor cleanup 2018-12-30 20:06:42 -05:00
Sean Kaim
aefee9c92b code cleanup 2018-12-30 20:04:57 -05:00
Sean Kaim
172f7f7085 minor code cleanup 2018-12-30 20:01:43 -05:00
Sean Kaim
bb9d2a0a69 move to correct namespace 2018-12-30 19:58:58 -05:00
Sean Kaim
2d9cc286f0 syntax clean up and null checks
mostly from ReSharper
2018-12-30 19:53:05 -05:00
David Sparer
6629faa4d5 ngcheckbox now scales correctly with dpi 2018-12-30 15:32:32 -06:00
nmat
d3d397cf70 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-29 19:37:17 +01:00
Camilo Alvarez
8c91b37dc8 First removal
Magic library is removed, basic tabbing functions are on, but all other functions are commented.

Some code is lifted from DockPanelSuite in MremoteNGAutoHideStrip to change the behavior and looks for Mremote .
2018-12-29 01:40:18 -05:00
Sean Kaim
fc4b33f7f0 changelog update 2018-12-28 17:08:25 -05:00
Sean Kaim
918da6e0ee minor code clean up 2018-12-28 16:51:36 -05:00
Sean Kaim
963f487648 update to latest dockpanelsuite
Fixes #269
2018-12-28 13:48:45 -05:00
Faryan Rezagholi
ba1c49e23a rearranged items and added/replaced icons 2018-12-28 18:11:26 +01:00
Sean Kaim
95a27fe2c9 Fix CA1063 2018-12-28 12:05:47 -05:00
Sean Kaim
2951f96daf Fix CA1063 2018-12-28 11:58:44 -05:00
Sean Kaim
9bf2e07006 Fix CA1063 2018-12-28 11:37:34 -05:00
Sean Kaim
332274f2a8 forgot the IDisposable 2018-12-28 11:33:28 -05:00
Sean Kaim
35c052e605 fix CA1001 and code cleanup 2018-12-28 11:20:03 -05:00
Sean Kaim
91de1dbd27 fix CA2229 build warning 2018-12-28 11:09:14 -05:00
Sean Kaim
3bc392fdc4 minor code cleanup 2018-12-28 11:02:54 -05:00
Sean Kaim
79c14ad801 Update changelog 2018-12-28 10:46:57 -05:00
Sean Kaim
0f7503875c Merge pull request #1241 from farosch/issue_fixes
Two issues fixed
2018-12-28 10:41:03 -05:00
Sean Kaim
75e1eac785 Minor code clean up. Ensure a single port scan when selecting first port only. 2018-12-28 10:15:55 -05:00
Sean Kaim
f77b0a51f4 best attempt to cancel pings/scan
And some minor code clean up...
2018-12-28 09:45:03 -05:00
Sean Kaim
8cef1dd51a move localization to ctor and fix minor themeing issue 2018-12-27 17:20:34 -05:00
Faryan Rezagholi
8bdc1590dd Only Scan default ports, when no specific ports are given. Fixes #765 2018-12-27 23:06:41 +01:00
nmat
ea0cf96a4a Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-27 22:25:25 +01:00
nmat
1bd96f6a88 not sure if this fixes it
test
2018-12-27 22:25:10 +01:00
Faryan Rezagholi
5f4bd19dcc Merge branch 'develop' into issue_fixes 2018-12-27 21:21:16 +01:00
Faryan Rezagholi
843f59b492 Give Focus to FrmMain when clicking on it, fixes #1044 2018-12-27 21:13:44 +01:00
Sean Kaim
f9ccf9e6aa fix monor themeing issue and remove unused component 2018-12-27 15:05:20 -05:00
Sean Kaim
3275c03a21 Merge pull request #1232 from farosch/redesign
App redesign proposal
2018-12-27 14:37:53 -05:00
Sean Kaim
a1a9229852 Credits text not filling form height 2018-12-27 14:34:25 -05:00
Sean Kaim
fc09245cdb Merge branch 'develop' into pr/1232 2018-12-27 14:28:18 -05:00
Sean Kaim
6ac6646ac2 fix line terminators for credits/changelog on about window 2018-12-27 11:39:35 -05:00
Faryan Rezagholi
db8ebcc3d5 removed redundand methods to return page icon in all option pages 2018-12-27 17:11:46 +01:00
Faryan Rezagholi
e0aa053e95 moved mRemoteNG png into subfolder images 2018-12-27 17:11:17 +01:00
Faryan Rezagholi
c8a24374fb merged develop into redisign 2018-12-27 17:10:44 +01:00
Sean Kaim
cde9ac63aa move localization into the ctor 2018-12-27 10:11:11 -05:00
nmat
b2d3aa8c11 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-27 15:07:37 +01:00
David Sparer
ed786dfb11 Merge pull request #1200 from sk82jack/develop
Fix and refactor CreateBulkConnections_ConfCons2_6.ps1
2018-12-27 07:35:07 -06:00
nmat
cc93f008a4 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-26 23:16:34 +01:00
David Sparer
2284432057 Merge pull request #1222 from farosch/gui_fixes
gui fixes
2018-12-26 16:00:21 -06:00
David Sparer
c623748d27 moved Config window localization into the ctor 2018-12-26 15:54:54 -06:00
Faryan Rezagholi
954f905c8c Merge branch 'redesign' of https://github.com/farosch/mRemoteNG into redesign 2018-12-26 22:54:14 +01:00
Faryan Rezagholi
f23d1faa33 removed pixelated version of app icon 2018-12-26 22:53:53 +01:00
Faryan Rezagholi
1f8bfdac5f make all option pages load their icon in their public constructor 2018-12-26 22:34:27 +01:00
Sean Kaim
b580da9e9f update appveyor config 2018-12-26 16:25:54 -05:00
David Sparer
46a188093a fixed #1238 2018-12-26 13:19:03 -06:00
Faryan Rezagholi
1c7f6438ff Windows Form Designer regenerated code after merge 2018-12-26 19:34:09 +01:00
Faryan Rezagholi
f9da7afd75 merged rebase of upstream/develop onto gui_fixes 2018-12-26 19:31:13 +01:00
Faryan Rezagholi
9d49dd2f40 fixed column being set to an absolute value 2018-12-26 19:25:43 +01:00
Faryan Rezagholi
fb8e19285b redesign of the port scan form, addresses #990 2018-12-26 19:25:43 +01:00
Faryan Rezagholi
505abb3029 fixed gap between elements on the credential settings page and the page border to be consisten with other pages 2018-12-26 19:25:43 +01:00
Faryan Rezagholi
2014598eaf Fixed padding and margin for menustrips 2018-12-26 19:25:42 +01:00
Faryan Rezagholi
1b39c345af Merge remote-tracking branch 'upstream/develop' into develop
mering upstream into develop
2018-12-26 19:21:16 +01:00
David Sparer
bdb1812705 return a default options page icon if no icon exists for page 2018-12-26 10:33:49 -06:00
David Sparer
0b8bcafb72 added unit tests for the DisplayProperties utility class. made class more testable 2018-12-26 10:31:02 -06:00
Sean Kaim
c0c699eab6 remove installer from being built in debug config
intorduced in c7d42305a3
2018-12-26 10:55:33 -05:00
Faryan Rezagholi
5a99c2dcef moved screenshots to extras menu #1234 2018-12-25 20:05:39 +01:00
Faryan Rezagholi
cbce5729fd fixed input box form never returning dialog result "ok".panels/tabs could not be renamed and new themes could not be created 2018-12-25 19:31:28 +01:00
Faryan Rezagholi
7290245729 removed mRemoteNG theme, was accidentely commited 2018-12-25 17:56:11 +01:00
Faryan Rezagholi
5c1bb564f2 Group boxes in notification settings form were default winforms instead of NGGroupBoxes (themes didn't apply) 2018-12-25 17:49:54 +01:00
Faryan Rezagholi
94ee854196 renamed classes under UI\Forms to begin with a capital letter 2018-12-25 16:22:56 +01:00
Faryan Rezagholi
91602c0be5 dispaly wait cursor when options are loading 2018-12-25 16:04:34 +01:00
Faryan Rezagholi
a31f287b2b renamed AppIcon to mRemoteNG_Icon for consistency 2018-12-25 15:57:25 +01:00
Faryan Rezagholi
f3a0d82304 updated classes to properly return their page icon 2018-12-25 15:53:22 +01:00
Faryan Rezagholi
f2669bb875 altered theme page layout, so the scrollbar doesn't get cut off when page is loaded into options window 2018-12-25 15:52:43 +01:00
Faryan Rezagholi
4801559edc cleaned up loactions of all used icons to be under \resources\icons with consitens naming (_Icons) at the end 2018-12-25 15:51:29 +01:00
nmat
9496b71bb7 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-25 10:27:35 +01:00
Sean Kaim
ba1e8cc448 update changelog 2018-12-24 15:08:33 -05:00
Sean Kaim
d307adbbef Merge pull request #1228 from farosch/external_links
External links
2018-12-24 15:02:14 -05:00
Faryan Rezagholi
933bc0a9e3 Added ico version of pixelated icon for main form, help button and notify icon 2018-12-24 01:17:59 +01:00
Faryan Rezagholi
ee7319c702 introduced pixelated version of logo to be easier readable in 16x16 2018-12-24 01:07:01 +01:00
Faryan Rezagholi
aa63d11816 added "text file fragment" block to wix configuration so that the tile manifest gets included in the installer 2018-12-24 01:06:35 +01:00
Faryan Rezagholi
b1b402b011 added needed minimum arguments for tile manifest to work 2018-12-24 01:05:04 +01:00
Faryan Rezagholi
5931e8f813 replaced icon for connection tree 2018-12-24 01:04:27 +01:00
Faryan Rezagholi
52a5a54bb3 corrected positioning of letters in icon 2018-12-24 01:03:42 +01:00
Faryan Rezagholi
7ca987fb1c corrected positioning of letters in icon 2018-12-24 01:03:21 +01:00
Faryan Rezagholi
66dbf21df0 fixed missing icon in windows control panel 2018-12-23 23:35:21 +01:00
Faryan Rezagholi
cc0d42f34f fixed "Launch mRemoteNG now" string, was falsely change in an earlier commit 2018-12-23 23:23:16 +01:00
Faryan Rezagholi
38a79d8d3e excluded tile manifest from postbuild "tidy"-script 2018-12-23 23:17:29 +01:00
Faryan Rezagholi
9420420622 added post-build script to copy tiles and manifest 2018-12-23 23:17:02 +01:00
Faryan Rezagholi
ce1139f114 added tiles and tile manifest to resources 2018-12-23 23:16:32 +01:00
Faryan Rezagholi
d8ce0416fa added images and manifest for windows tiles 2018-12-23 23:15:23 +01:00
Faryan Rezagholi
a0e696eca4 updated splash screen 2018-12-23 22:00:25 +01:00
Faryan Rezagholi
6b20ffeeba Merge branch 'develop' into redesign 2018-12-23 21:39:32 +01:00
Faryan Rezagholi
ac1c0c90e7 Merge remote-tracking branch 'upstream/develop' into develop
update fork from original repository
2018-12-23 21:35:58 +01:00
Faryan Rezagholi
3663384ccf removed default colors from the manager class (was added in a commit earlier) 2018-12-23 21:29:52 +01:00
Faryan Rezagholi
ecf8d437c7 removed edition label in favor of adding the edition string to the title label 2018-12-23 21:22:31 +01:00
Faryan Rezagholi
3c07fc0387 removed illegal cast 2018-12-23 21:19:10 +01:00
Faryan Rezagholi
8bd2b9d7a7 replaced logo in about screen 2018-12-23 21:17:22 +01:00
Faryan Rezagholi
b2b78c67f4 new app icon as png for help menu 2018-12-23 21:17:08 +01:00
Faryan Rezagholi
94147c23b1 Replaced old mRemoteNG icon with new one 2018-12-23 20:40:04 +01:00
Faryan Rezagholi
ba588c9edf Removed unnecessary translation files for installer 2018-12-23 20:39:41 +01:00
Faryan Rezagholi
8810f453df Removed unnecessary party from licence file, see #1153 2018-12-23 19:42:40 +01:00
Faryan Rezagholi
c7d42305a3 Tidied up Resources folder, added new Photoshop templates for images and replaced installer images 2018-12-23 19:38:11 +01:00
Sean Milligan
40025db415 Tracks the active tab in the treeview 2018-12-23 09:19:05 -08:00
Faryan Rezagholi
c0b8a8b8eb redesign of the port scan form, addresses #990 2018-12-23 15:58:48 +01:00
Sean Kaim
92416b4661 test build for running with FIPS enabled
Reference #222
2018-12-22 19:19:11 -05:00
Faryan Rezagholi
aaa93b1bcc external links to open in browser instead of mremote itself 2018-12-23 00:56:09 +01:00
sk82jack
b328331d7c Add prompt for decryption password only if necessary 2018-12-22 22:24:39 +00:00
sk82jack
f51079e065 Add credential parameters 2018-12-22 22:24:39 +00:00
sk82jack
534c622980 Add folder selection for portable installation 2018-12-22 22:24:39 +00:00
sk82jack
6cc1cb5afa Fix registry key locations 2018-12-22 22:24:39 +00:00
sk82jack
2372d5ca92 Fix and refactor code 2018-12-22 22:24:39 +00:00
David Sparer
331af8cd24 Merge pull request #1218 from farosch/splashscreen
Splashscreen
2018-12-22 16:16:39 -06:00
Faryan Rezagholi
d58b8fffdc Merge pull request #2 from mRemoteNG/develop
update
2018-12-22 23:10:45 +01:00
David Sparer
e5d05b88bc Merge pull request #1227 from farosch/searchbar2top
Position of search bar configurable via settings
2018-12-22 16:07:47 -06:00
Faryan Rezagholi
61f823b6be Made position of the search bar configurable vias settings 2018-12-22 17:20:32 +01:00
David Sparer
06f23d5754 Merge pull request #1220 from farosch/appleicon
Added Apple Icon
2018-12-22 09:29:09 -06:00
Faryan Rezagholi
e567f1386a Merge pull request #1 from mRemoteNG/develop
update
2018-12-22 15:38:21 +01:00
nmat
15a734ace6 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-22 10:45:48 +01:00
nmat
6f0309b6a7 Some fixes after comment from dev 2018-12-22 10:00:13 +01:00
Faryan Rezagholi
08191278d7 Chnaged splash screen form to display correctly on a high DPI device 2018-12-21 18:19:13 +01:00
Faryan Rezagholi
6a4b31ffe6 fixed gap between elements on the credential settings page and the page border to be consisten with other pages 2018-12-21 16:21:25 +01:00
Faryan Rezagholi
a150757a97 fixed checkbox in connection settings being 1px off 2018-12-21 16:09:48 +01:00
Faryan Rezagholi
8eded14f85 Fixed padding and margin for menustrips 2018-12-21 16:08:09 +01:00
David Sparer
b311f85ca0 Merge pull request #1217 from farosch/searchbar2top
Moved searchbar in connection tree to top
2018-12-21 07:37:10 -06:00
Faryan Rezagholi
9423c8135f Added Apple Icon 2018-12-21 14:21:40 +01:00
Faryan Rezagholi
5221907ef8 added my name to my github link :P 2018-12-21 00:43:32 +01:00
Faryan Rezagholi
4cc1847ea6 added mRemoteNG Logo to splash screen 2018-12-21 00:41:02 +01:00
Faryan Rezagholi
2a0032a199 Splash screen shown on startup and hiding after completion of the load method of the main form 2018-12-21 00:10:59 +01:00
Faryan Rezagholi
9b722eacdb Added form for spash screen 2018-12-20 23:42:11 +01:00
Faryan Rezagholi
c6f15411e3 Moved searchbar in connection tree to top 2018-12-20 15:48:22 +01:00
nmat
90a16b7149 Add more options and some cleaning 2018-12-18 22:23:29 +01:00
David Sparer
2df9741cd6 loadbalanceinfo property now imported from rdp files
fixes #1132
2018-12-17 11:47:15 -06:00
David Sparer
497b8bfce5 updated readme badges 2018-12-17 09:38:10 -06:00
nmat
0fdbb8d8a1 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-15 18:28:24 +01:00
David Sparer
7a8a2fbf77 Merge pull request #1191 from mRemoteNG/929_server_name_in_notification
Host names are now displayed in some notifications
2018-12-15 10:12:33 -06:00
nmat
1e48cb831a Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-15 02:22:12 +01:00
Sean Kaim
9e96732b73 Update SSH.NET package
* Code clean up
* Notify users of exceptions/failed uploads
2018-12-14 17:09:30 -05:00
David Sparer
e863906eaa added test validating that an empty password cannot be passed to an encryptor 2018-12-14 07:31:50 -06:00
nmat
13ec6e2dca More cleanup and add tabs and panels 2018-12-09 19:51:57 +01:00
nmat
968e7222fd Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-05 23:34:23 +01:00
David Sparer
a84159ee70 Merge pull request #1159 from mRemoteNG/1123_handle_unhandled_exceptions
Added unhandled exception window
2018-12-05 16:31:36 -06:00
David Sparer
703f9deb9a added a version property to the ISerializer interface. switch to using confcons v2.7 serializer in production and tests. this resolved an issue with serializing the RedirectClipboard property 2018-12-05 16:07:59 -06:00
nmat
07147f13a8 Added keyboardshortcuts and removed configuration file. 2018-12-04 23:52:47 +01:00
nmat
a57d9d41c3 Help updates
Some help updates
2018-12-04 21:39:57 +01:00
Leaskovski
a40f66fc94 Added a new option to the Appearance and Tabs configuration page to allow the user to toggle if connection windows display tabs or not as per #1171. 2018-12-03 15:46:14 +00:00
nmat
097c97ca32 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-11-16 00:35:57 +01:00
David Sparer
3e1d418269 Merge branch 'develop' into 929_server_name_in_notification 2018-11-15 15:44:24 -06:00
David Sparer
5ee7b3fcbf fixed failing test 2018-11-15 15:44:04 -06:00
David Sparer
15adf97174 refactored some protocol base events to standardize how disconnect/error events are raised 2018-11-15 15:31:38 -06:00
David Sparer
4bd5befaaa refactored force flag checks to be simpler to read 2018-11-15 14:18:45 -06:00
nmat
5fe6272915 Replaced mRemote with mRemoteNG in help 2018-11-15 00:46:30 +01:00
nmat
7a01a1f33f Add updated screenshot 2018-11-15 00:32:40 +01:00
David Sparer
92759aa9dc refactored connection initiator a bit to reduce unnecessary code
the conForm arg was always null, we didnt need it
2018-11-14 07:06:25 -06:00
David Sparer
65e21190b9 extracted rdp error codes to new class 2018-11-12 18:54:54 -06:00
David Sparer
f6877631d9 updated changelog 2018-11-12 17:23:58 -06:00
David Sparer
1e4fa8432b task dialog now properly localizes its buttons 2018-11-12 17:11:25 -06:00
David Sparer
ed5423368e use the task dialog for confirming node deletions, Esc key now closes dialog
related to #1064
2018-11-12 17:07:07 -06:00
David Sparer
673acad72c NBLabel now respects the TextAlignment property when in theming mode 2018-11-12 17:05:10 -06:00
David Sparer
efc04cc82d refactored task dialog to use am NGLabel instead of custom string drawing for the main instruction 2018-11-12 16:56:49 -06:00
David Sparer
b880f7c946 NGLabel now attempts to wrap text like default labels when theme mode is active 2018-11-12 16:51:45 -06:00
David Sparer
7304de0102 Esc key now cancels options window changes
related to #1064
2018-11-11 18:18:46 -06:00
David Sparer
a64601afcc fixed some visual issues with the notificaiton panel date label 2018-11-11 11:22:06 -06:00
David Sparer
79ce3c0d74 fixed issue with notification panel internal layout 2018-11-11 10:27:59 -06:00
David Sparer
83c31ad2b4 created sql version upgrader for confcons v2.7 2018-11-08 17:16:33 -06:00
David Sparer
3bcb769965 Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/mRemoteV1.csproj
2018-11-08 16:38:51 -06:00
David Sparer
75e0b8f4c2 set release date in changelog 2018-11-08 15:09:08 -06:00
David Sparer
78ef0fdaf4 Merge pull request #1107 from mRemoteNG/321_hidpi
Implement HiDPI support
2018-11-08 07:36:44 -06:00
David Sparer
8d29ff2d61 fixes #1168 2018-11-04 19:13:10 -06:00
David Sparer
eea79da1ae updated changelog 2018-11-04 18:06:14 -06:00
David Sparer
cb5447f86e fixes #1181 2018-11-04 18:03:39 -06:00
David Sparer
8cb31ad524 slight cleanup of Runtime class 2018-11-04 18:03:29 -06:00
David Sparer
6ca52a0db1 updated changelog 2018-11-04 16:39:25 -06:00
David Sparer
25e30672c8 bumped version to v1.76.12 2018-11-04 16:38:14 -06:00
David Sparer
abcab2aadf sql now encrypts and decrypts passwords 2018-11-03 18:28:53 -05:00
David Sparer
19bb8f7595 refactored db classes to expose tblRoot data 2018-11-03 11:02:26 -05:00
David Sparer
0427956e8b we can now prevent saving to the database when a save was triggered for a local-only property change
this will prevent unnecessary db saves
2018-11-03 10:34:30 -05:00
David Sparer
78bf40282a the IsExapnded property is no longer saved to the DB 2018-11-02 11:30:39 -05:00
David Sparer
6c6a82f8e6 minor cleanup 2018-11-02 11:03:25 -05:00
David Sparer
4b9cc7be08 Merge branch 'release/v1.76' into 1134_dont_save_connection_status_to_db
# Conflicts:
#	mRemoteV1/Connection/ConnectionsService.cs
2018-11-02 10:56:49 -05:00
David Sparer
dc2d6b8160 added a few debug messages to track db connection loading events 2018-11-02 10:45:18 -05:00
David Sparer
083456e33a fixed several event handle leaks #1173 2018-11-02 10:29:09 -05:00
David Sparer
80e43e8634 added a safety check to the previous session opener to only open sessions that aren't already open 2018-11-02 09:30:18 -05:00
David Sparer
e99b8ed453 hooked up the local settings serializer 2018-11-01 19:14:25 -05:00
David Sparer
4aba36b756 added classes to handle local connection properties when dealing with the DB 2018-11-01 16:37:30 -05:00
David Sparer
2ebf654973 added a ForEach extension for enumerables 2018-11-01 16:36:56 -05:00
David Sparer
f560fb86d8 moved database serializers to more logical place 2018-11-01 15:00:51 -05:00
David Sparer
981689aa26 resolved #1170 2018-11-01 08:50:27 -05:00
David Sparer
b3fd266c31 Merge branch 'develop' into 1123_handle_unhandled_exceptions
# Conflicts:
#	mRemoteV1/Resources/Language/Language.resx
2018-10-31 09:10:14 -05:00
David Sparer
062b7a5986 removed test exception 2018-10-30 08:32:52 -05:00
David Sparer
088b1ee1c2 updated changelog and credits for v1.77 2018-10-29 17:12:25 -05:00
David Sparer
1d572bb4b6 Merge pull request #1160 from MitchellBot/develop
Feature Request: Right click option to copy hostname #1141
2018-10-29 17:01:11 -05:00
MitchellBot
cf8e033831 QuickConnect uses exact case of input
https://github.com/mRemoteNG/mRemoteNG/issues/1121
2018-10-28 20:59:40 -07:00
MitchellBot
43977a74cc Feature Request: Right click option to copy hostname #1141
Feature Request: Right click option to copy hostname #1141
2018-10-28 20:06:03 -07:00
David Sparer
d67e96539b added an unhandled exception window that will be displayed when unhandeled exceptions occur 2018-10-28 14:46:30 -05:00
David Sparer
09d1aff6a8 rdp connections now properly scale for hidpi 2018-10-27 16:09:12 -05:00
David Sparer
41c5a49abc began investigating how to set rdp desktop scaling for hidpi 2018-10-20 18:29:34 -05:00
David Sparer
eacff9025e Merge branch 'develop' into 321_hidpi
# Conflicts:
#	mRemoteV1/Connection/Protocol/PuttyBase.cs
2018-10-20 09:56:26 -05:00
David Sparer
f56b8f8e42 Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	CREDITS.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
2018-10-20 09:48:50 -05:00
David Sparer
8ab221e5a8 Merge branch 'release/v1.76' 2018-10-18 17:29:11 -05:00
David Sparer
21e51c8455 updated changelog and credits 2018-10-18 17:08:30 -05:00
David Sparer
3234896caf bumped version 2018-10-18 17:08:22 -05:00
David Sparer
b00dd1c5f5 fixes #1136 2018-10-17 17:48:16 -05:00
David Sparer
992a3f9d1c cherrypicked pr #1145
Fixing "Reconnect to previously opened sessions on startup"
2018-10-17 16:52:22 -05:00
David Sparer
6b280b5aa4 Merge pull request #1145 from st-schuler/reconnect-patch
Fixing "Reconnect to previously opened sessions on startup"
2018-10-17 16:46:39 -05:00
st-schuler
e6713520c7 Fixing "Reconnect to previously opened sessions on startup" 2018-10-17 20:01:51 +02:00
David Sparer
4f75b0343e Merge pull request #1120 from Fyers/develop
Improved German translations
2018-10-10 08:22:34 -05:00
David Sparer
097ebccdcd Merge pull request #1129 from pablomh/patch-1
Update Language.es.resx
2018-10-10 06:48:49 -05:00
pablomh
954e1de4da Update Language.es.resx
Misc fixes.
2018-10-10 09:22:31 +02:00
Fyers
63dc79699d Merge pull request #2 from Fyers/merge
Merge
2018-10-08 23:31:54 +02:00
Fyers
63f342bbdb resolved conflicts 2018-10-08 23:31:01 +02:00
Fyers
7c9b90ed7d Merge remote-tracking branch 'upstream/develop' into merge 2018-10-08 23:21:31 +02:00
David Sparer
00e45b60ad Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Resources/Language/Language.resx
2018-10-08 15:23:25 -05:00
David Sparer
d1a7a37909 Merge branch 'release/v1.76' 2018-10-07 18:42:03 -05:00
David Sparer
1c12b52ada extension to the fix for #1124 2018-10-07 18:32:17 -05:00
David Sparer
722fe40899 updated changelog and bumped version 2018-10-07 16:33:29 -05:00
David Sparer
b2e7ebf43d fixed #1124 2018-10-07 16:28:09 -05:00
David Sparer
3ed8e768aa bumped patch version 2018-10-07 09:04:48 -05:00
David Sparer
d362691389 updated build scripts to include debug symbols and normalized github
asset names

cherrypicked from the develop branch
2018-10-07 07:53:31 -05:00
David Sparer
4b7c54d5b5 updated changelog 2018-10-07 07:28:57 -05:00
David Sparer
fbd0407863 added redirect clipboard to xml schema for v2.7 confcons 2018-10-03 21:05:12 -05:00
David Sparer
7bab1b4297 created a confcons v2.7 serializer 2018-10-03 21:00:23 -05:00
David Sparer
cfce9e9887 Merge pull request #951 from CrAbelleira/develop
Clipboard sharing setting implementation for RDP protocol
2018-10-03 20:51:19 -05:00
Fyers
9df2a96027 improved german translations 2018-10-01 19:26:26 +02:00
Cristian Abelleira Olañeta
d967c719f5 Added "RedirectClipboard" to ConnectionSerializers/Xml and MiscSerializers 2018-10-01 00:52:31 +02:00
David Sparer
ec80a5aa70 fixed #1117 2018-09-30 13:19:35 -05:00
David Sparer
0c95f178ca updated changelog 2018-09-30 11:04:03 -05:00
David Sparer
e0405b15df fixes #1110 2018-09-30 11:02:01 -05:00
David Sparer
e029f30acf added a few try/catch blocks around some rdp code. related to #853 2018-09-30 10:44:22 -05:00
David Sparer
44ed836b7c fixed #1115 2018-09-29 12:14:44 -05:00
David Sparer
00401201d1 fixed Spanish translation issue. fixes #1112 2018-09-27 08:23:17 -05:00
Cristian Abelleira Olañeta
726491feee Completed BuildExpectedConnectionInfoPropertyList 2018-09-24 18:19:33 +02:00
Cristian Abelleira
36a94e1399 Merge branch 'develop' into develop 2018-09-24 11:39:32 +02:00
David Sparer
855c83a325 Merge branch 'develop' into 321_hidpi
# Conflicts:
#	mRemoteV1/UI/Controls/MultiSshToolStrip.cs
#	mRemoteV1/UI/Window/AboutWindow.cs
#	mRemoteV1/UI/Window/ComponentsCheckWindow.cs
2018-09-22 17:51:00 -05:00
David Sparer
d9e65719d3 Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
2018-09-22 17:40:42 -05:00
David Sparer
c774070feb fixed putty placement within connection window 2018-09-22 17:22:01 -05:00
David Sparer
5aeff8c9c0 fixed some more ctaskdialog scaling issues 2018-09-22 16:37:02 -05:00
David Sparer
4d5f5cf04b fixed textbox width scaling of quick connect and multissh toolbar controls 2018-09-22 16:01:53 -05:00
David Sparer
1d6b87ffa7 fixed about window scaling 2018-09-22 15:36:22 -05:00
David Sparer
3b82435740 fixed ad import window scaling 2018-09-22 15:35:19 -05:00
David Sparer
17499abfd0 fixed uvnc window scaling 2018-09-22 15:35:03 -05:00
David Sparer
9a57deb9ab fixed scaling of export form 2018-09-22 15:31:09 -05:00
David Sparer
089c58310c fixed scaling of screenshot window 2018-09-22 15:30:59 -05:00
David Sparer
647de5d473 fixed scaling of message window 2018-09-22 15:26:01 -05:00
David Sparer
b223b121d1 minor visual fix 2018-09-22 14:38:22 -05:00
David Sparer
49fbb37542 fixed scaling of the external tools window 2018-09-22 14:36:01 -05:00
David Sparer
1496192756 fixed port scan window scaling 2018-09-22 13:22:31 -05:00
David Sparer
f34cd50b9c fixed ssh transfer window scaling 2018-09-22 13:22:20 -05:00
David Sparer
20f46bea61 fixes #1106 2018-09-20 15:10:43 -05:00
David Sparer
f4ff8d37d5 component check window layout fixed for hidpi 2018-09-15 15:30:41 -05:00
David Sparer
15108645d4 updated the update screen to layout correctly on higher dpi screens 2018-09-15 15:23:51 -05:00
David Sparer
b5e8f32f1f removed dead code 2018-09-15 13:29:02 -05:00
David Sparer
4027c41c73 made password form respect dpi scaling 2018-09-15 13:20:33 -05:00
David Sparer
7037139ab3 removed the now-unused input class 2018-09-08 14:27:58 -05:00
David Sparer
b976fe4bad rewrote the input box class to be more display-responsive 2018-09-08 14:26:03 -05:00
David Sparer
d674a201ee options page icons now scale correctly 2018-09-08 10:48:45 -05:00
David Sparer
d4a3e292ed correct the appearance page icon 2018-09-08 09:24:06 -05:00
David Sparer
50084e47f7 themes page now displays correctly on hidpi 2018-09-08 09:21:40 -05:00
David Sparer
6e0a16a4d1 task dialog now works in scaled displays 2018-09-07 18:16:44 -05:00
David Sparer
5e87d8de18 scale the putty image on the advanced page 2018-09-03 10:02:57 -05:00
David Sparer
9a6c2fa7c8 added a bitmap scaling function 2018-09-03 10:01:06 -05:00
David Sparer
f440f91233 made appearance options page scale correctly 2018-09-03 09:10:34 -05:00
David Sparer
ccf364f2dd added func for calculating scaled width 2018-09-03 09:06:27 -05:00
David Sparer
3c5baae568 added class to calculate desktop scaling factor. connection tree icons are now scaled appropriately 2018-09-03 07:51:40 -05:00
David Sparer
7710ff32a6 scale search image size 2018-09-02 18:09:26 -05:00
David Sparer
e081d2b73a set window scaling to DPI 2018-09-02 18:07:14 -05:00
David Sparer
0c77fa43ff initial redesign of connection tree window using table layout panel 2018-09-02 17:56:10 -05:00
David Sparer
6ee4353bbd better to just remove the max size setting on the custom controls than override it in frmmain 2018-09-02 17:29:34 -05:00
David Sparer
bddab24d48 explicitly set the max size of toolbar items to infinite
i guess the default max size is height:25. When we don't explicitly set this to 0 it doesn't scale correctly
2018-09-02 17:15:16 -05:00
David Sparer
45f9a32e59 remove max size constraint from quick connect and ext tools toolbars 2018-09-02 17:10:40 -05:00
David Sparer
39b297fd00 set EnableWindowsFormsHighDpiAutoResizing config 2018-08-31 18:54:36 -05:00
David Sparer
fd2167d679 set dpi scale on frmmain 2018-08-31 18:37:21 -05:00
David Sparer
d07249e1b2 custom scaling of quick connect toolbar 2018-08-31 17:45:08 -05:00
David Sparer
31dc59c9d5 suspend layout of all menu controls when creating form 2018-08-31 17:28:37 -05:00
David Sparer
f3e82dac19 dont set max size on tool strip menu controls 2018-08-31 17:21:51 -05:00
David Sparer
41db80dba8 try different renderer 2018-08-31 17:13:44 -05:00
David Sparer
8efe922b50 set manifest entry to enable dpi scaling 2018-08-31 16:26:41 -05:00
Sean Kaim
a5d22d287c Fixed #1091 2018-08-28 14:59:07 -04:00
Sean Kaim
793095900b fix #1092
parse enums properly
2018-08-28 09:35:08 -04:00
David Sparer
ee63292e55 Merge branch 'update-asset-labels' into develop 2018-08-26 12:49:18 -05:00
David Sparer
9fbcde3ca0 simplify labels 2018-08-26 12:46:17 -05:00
David Sparer
9e48c8e359 changed labels to be more enduser appropriate 2018-08-26 12:21:59 -05:00
David Sparer
da07f50e49 Merge branch 'label-github-assets' into develop 2018-08-25 18:27:39 -05:00
David Sparer
cc872cd2b4 fixed powershell script 2018-08-25 17:03:28 -05:00
David Sparer
a3fa1e541c modified build to label assets 2018-08-25 17:02:54 -05:00
David Sparer
b579e823bd updated credits 2018-08-25 11:42:11 -05:00
David Sparer
fc5b1ec85e adjusted a few english strings that were added in #928 2018-08-25 11:39:25 -05:00
David Sparer
e0c2037831 set assembly version to 1.77.0 2018-08-25 11:38:40 -05:00
David Sparer
9f44d6b75b added changelog items for v1.77 updates 2018-08-25 10:56:30 -05:00
David Sparer
b6f2fff42b Merge branch 'release/v1.76' into develop 2018-08-25 10:46:10 -05:00
David Sparer
f10e54e47b bumped assembly version to 1.76.8 2018-08-25 10:31:35 -05:00
David Sparer
704e0c1dc1 updated changelog 2018-08-25 10:29:43 -05:00
David Sparer
067ac8fb56 Merge branch 'areytsman-Advanced_closing_tabs' into develop 2018-08-25 09:51:09 -05:00
David Sparer
4428089146 Merge branch 'Advanced_closing_tabs' of https://github.com/areytsman/mRemoteNG into areytsman-Advanced_closing_tabs
# Conflicts:
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/Resources/Language/Language.ru.resx
2018-08-25 09:24:58 -05:00
David Sparer
44ce674166 Merge branch 'release/v1.76' into develop 2018-08-24 17:20:56 -05:00
David Sparer
0c79a9acde fixes #1088 2018-08-24 14:43:08 -05:00
David Sparer
ebfc2715e7 updated changelog 2018-08-24 13:24:23 -05:00
David Sparer
b0dbc9dc18 only delete reg key value if the value exists 2018-08-24 13:23:52 -05:00
David Sparer
507cdf75a5 fixes #1087 2018-08-24 13:23:02 -05:00
David Sparer
8f8492b0be xml deserializer now gives connections an ID if the ID string in xml is empty
fixes #1082
2018-08-24 10:37:54 -05:00
David Sparer
457e715188 set assembly version to 1.76.7 and set release date in changelog 2018-08-22 10:59:45 -05:00
David Sparer
3fad827b9f Merge branch 'release/v1.76' into develop
# Conflicts:
#	Tools/zip_portable_files.ps1
#	mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs
2018-08-22 10:39:09 -05:00
David Sparer
8bd571c78d added a wrapper around the windows registry api so we can better unit test classes that use the registry 2018-08-22 09:41:32 -05:00
David Sparer
1724521ebf added some null guards to methods 2018-08-22 07:06:44 -05:00
David Sparer
b0fb3596aa added some safety checks around accessing putty registry settings 2018-08-22 07:06:16 -05:00
David Sparer
38ff8340e4 Merge pull request #1016 from wwj402/develop
Chinese simplified language update for latest commit 05c96da
2018-08-19 12:01:31 -05:00
David Sparer
f759ea4bc2 Merge pull request #1072 from sli-pro/develop
Update the Russian language
2018-08-19 11:54:19 -05:00
David Sparer
fb228d72b1 resolved bug #1076 2018-08-19 11:44:43 -05:00
David Sparer
916361a3be update changelog 2018-08-11 20:03:27 -05:00
sli-pro
011d0cad8c Update the Russian language
- Update the Russian language (Language.ru.resx)

- Update Language.resx
2018-08-11 18:34:11 +03:00
David Sparer
408c40f699 fixed a few toolbar location loading edge cases
related to #1068
2018-08-11 10:02:07 -05:00
David Sparer
4173f6d775 swapped direct calls to Monitor with a lock statement and added a few method comments 2018-08-11 06:47:31 -05:00
Sean Kaim
e6f3c22064 code clean up / add'l checks
related to #1061
2018-08-03 10:13:31 -04:00
David Sparer
a013518eac bump assembly version 2018-08-03 08:51:44 -05:00
David Sparer
9c88cacb3d hopefully a fix for #1061 2018-08-03 08:33:51 -05:00
David Sparer
d49bf04b15 fixes #1062 2018-08-03 08:13:39 -05:00
David Sparer
1dbd5dc5bc set 1.76.5 release date in changelog 2018-08-02 18:15:33 -05:00
David Sparer
c103706a54 added test to verify #1057 2018-08-02 17:55:36 -05:00
David Sparer
b0a027df52 updated changelog 2018-08-02 17:49:50 -05:00
David Sparer
868641378a Merge pull request #1055 from mRemoteNG/647_save_symbols
647 save symbols
2018-08-02 16:34:04 -05:00
David Sparer
11baae3107 applying patch provided by Toomix in #1057 and merged in 7dbef77 2018-08-01 07:01:45 -05:00
David Sparer
7526bb430f Merge pull request #1057 from Toomix/patch-1
Fixing NullReferenceException when renaming node
2018-08-01 06:45:42 -05:00
Toomix
7dbef77687 Fixing NullReferenceExcepction in renaming Node
When I have no selected node and I press F2 key, NullReferenceException appears in method RenameSelectedNode(). I added not null condition, it is working now. Debugged in VS2017.
2018-08-01 08:50:55 +02:00
David Sparer
ed8125042e make portable symbols zip file name easier to distinguish from regular symbols 2018-07-30 17:02:08 -05:00
David Sparer
25b2655d0f log which files are uploaded to github release 2018-07-30 16:55:09 -05:00
David Sparer
145a264154 handle wildcard in github asset upload file path 2018-07-30 16:45:55 -05:00
David Sparer
3e33170ae0 handle non-auto hidden notification panel focusing too 2018-07-30 15:23:59 -05:00
David Sparer
d18bf68f0e fix release tests 2018-07-30 14:12:17 -05:00
David Sparer
368917e108 accidentally left off the variable identifier for msbuild 2018-07-30 11:16:04 -05:00
David Sparer
cdea4c3911 missed a groovy var 2018-07-30 11:02:05 -05:00
David Sparer
b4b9b55bbf updated jenkins publish script to target msbuild15 2018-07-30 10:59:21 -05:00
David Sparer
6092c63df4 fix zipping symbols 2018-07-30 08:03:40 -05:00
David Sparer
fda5132184 zip symbols 2018-07-29 22:22:13 -05:00
Sean Kaim
6a9fb25a18 fixes #868
DialogResult is not currently checked, so it's a minimal/non-impact bug currently. But it's fixed now in case it's used in the future...
2018-07-29 21:30:11 -04:00
Sean Kaim
18d7344690 fixes #762
Increased button size by about 150%
2018-07-29 21:16:19 -04:00
Sean Kaim
ba50cf20a0 update changelog 2018-07-29 21:03:54 -04:00
Sean Kaim
7bd6e126e2 Fix #893
Disabled ClickOnce/Publish wihtin the project options.
2018-07-29 21:02:33 -04:00
Sean Kaim
f7521c81d5 Fixes #1052
and some code clean up
2018-07-29 19:03:21 -04:00
David Sparer
f483a2dc2f replaced Timer implementation with Task async call
fixes #1052
2018-07-29 12:02:41 -05:00
Sean Kaim
9769d5af06 changelog update 2018-07-28 22:31:26 -04:00
Sean Kaim
0a2dc3563e fixes #1040
clicking close would have the same effect. Check return code and don't open the connection unless user input has been provided.
2018-07-28 22:30:06 -04:00
Sean Kaim
e9f0157b2b code clean up 2018-07-28 22:15:11 -04:00
Sean Kaim
e8e566fcdd localization fixes 2018-07-28 22:10:17 -04:00
Sean Kaim
72b7d22cef localization fixes 2018-07-28 22:09:27 -04:00
Sean Kaim
f79da476fd options pages code clean up 2018-07-28 21:59:24 -04:00
Sean Kaim
ef31b7844c Merge pull request #1053 from mRemoteNG/cherry
Cherry picked commits for 1.76
2018-07-28 13:54:34 -04:00
Sean Kaim
f1ed1bf115 appveyor post build tests 2018-07-28 13:11:56 -04:00
Sean Kaim
23ea028965 don't run post build zip in appveyor 2018-07-28 13:11:10 -04:00
Sean Kaim
42046a614f Solution config was building wrong projects 2018-07-28 13:05:37 -04:00
Sean Kaim
36055f56e6 the post publish job in the appveyor.yaml in ps1 form 2018-07-28 13:05:28 -04:00
Sean Kaim
b693cb30fc Trim ConfigurationName 2018-07-28 13:03:27 -04:00
Sean Kaim
20377d4ff5 zip portable directly via powershell
Trying to fix appveyor artifact build
2018-07-28 13:03:16 -04:00
Sean Kaim
570d732b0e latest 7-zip 2018-07-28 13:03:00 -04:00
Sean Kaim
d9d2b1de70 code clean up (convert to expression body) 2018-07-28 13:02:36 -04:00
Sean Kaim
0a7eaaf36f minor code clean up 2018-07-28 13:02:25 -04:00
Sean Kaim
36dd3e496d minor code clean up 2018-07-28 13:02:14 -04:00
Sean Kaim
83fd914d7b code clean up 2018-07-28 13:01:41 -04:00
Sean Kaim
281c6b13fa minor code clean up
* No need to kick off the registry provider here (it's done already in PuttySessionsManager#StartWatcher())

* if (Directory.Exists(sessionsFolderPath)) thows an exception even though it should have just fallen through... but if (!Directory.Exists(sessionsFolderPath)) doesn't throw and logs a message with a graceful return????

IDK... I had a Uri.IsWellFormedUriString test in there to avoid the exception, but it seems unnecessary...
2018-07-28 13:01:06 -04:00
David Sparer
00b7b1221c fixes #1051 2018-07-28 09:03:57 -05:00
David Sparer
56cbf0ff3f fixes #1050 2018-07-28 07:52:57 -05:00
Sean Kaim
f852a4d341 minor code clean up 2018-07-27 17:02:51 -04:00
Sean Kaim
7c8c7d482a frmChoosePanel was not properly themed 2018-07-27 16:58:25 -04:00
Sean Kaim
9e95ae2cb0 code clean up 2018-07-27 16:45:38 -04:00
Sean Kaim
0d2d935f17 set default theme when themes disabled
Fixes #1039
Also some code clean up
2018-07-27 16:04:42 -04:00
Sean Kaim
eeb320a825 more clean up (use .ToString) 2018-07-27 14:50:44 -04:00
Sean Kaim
9452d4dbe3 Theme code clean up 2018-07-27 14:45:07 -04:00
Sean Kaim
03d2387cdd appveyor build for 1.76 branch 2018-07-27 14:44:35 -04:00
Sean Kaim
61b325ccb9 code clean up 2018-07-27 14:26:01 -04:00
Sean Kaim
e57de9a4de localized strings 2018-07-27 14:24:42 -04:00
Sean Kaim
a259ab9541 fix typo 2018-07-27 14:16:14 -04:00
Sean Kaim
96946f3a1e porting fix for #971 to 1.76 branch 2018-07-27 14:15:23 -04:00
Sean Kaim
08569276eb Revert "fixing changelog item"
This reverts commit edc4be2d44.
2018-07-27 14:11:43 -04:00
David Sparer
edc4be2d44 fixing changelog item 2018-07-27 07:49:00 -05:00
David Sparer
8cd6fb7ae2 updated changelog 2018-07-26 13:40:53 -05:00
David Sparer
a5afa90790 fixes #1045 2018-07-26 13:39:12 -05:00
David Sparer
f634eb8d37 created tests for the config window to ensure property grid items correctly display for certain object types 2018-07-26 13:38:53 -05:00
David Sparer
694b61a67b added a property to expose the list of object properties being shown by the property grid
this will help a lot with testing the property grid/config window
2018-07-26 09:12:47 -05:00
David Sparer
88f0d00a15 minor style cleanup 2018-07-26 08:55:55 -05:00
David Sparer
e31088fd2e ensure that quick connect items always have a panel set, even if the con default Panel setting is empty
related to #802
2018-07-25 14:39:23 -05:00
David Sparer
1d7bb63710 ensure ConDefaultPanel has a default value
related to #802
2018-07-25 14:21:44 -05:00
Sean Kaim
64422c60bb update changelog 2018-07-25 14:08:05 -04:00
Sean Kaim
a8b082ed4b fix test failures 2018-07-25 13:46:54 -04:00
Sean Kaim
5a5ade0d60 fix build failure 2018-07-25 13:10:39 -04:00
Sean Kaim
7e24e2dcfb fixes #971
Remove the "machineNode" XML node so that settings are portable to all systems
2018-07-25 13:02:30 -04:00
Sean Kaim
930579d983 PortableSettingsProvider code clean up 2018-07-25 12:35:53 -04:00
David Sparer
af1ed5349f updated changelog 2018-07-25 08:08:35 -05:00
David Sparer
9dcf71dc31 new connection tree nodes will survive filtering until they exit edit mode
resolves #1038
2018-07-25 08:05:48 -05:00
David Sparer
8bf9af0ed8 updated changelog 2018-07-24 14:49:33 -05:00
David Sparer
aecfad5871 only access first array item if array has any items
resolves #1036
2018-07-24 14:49:01 -05:00
David Sparer
3edd155898 updated changelog 2018-07-24 12:55:27 -05:00
David Sparer
2c419c0b2e minor cleanup 2018-07-24 12:54:34 -05:00
David Sparer
2fb67e7042 fixed issue where the connection context menu wasn't using translated strings
The ctor for the context menu was being called before we loaded the desired culture, leading to the use of the English default strings. Resolves #1034
2018-07-24 12:54:20 -05:00
David Sparer
82847f07b2 Merge branch 'release/v1.76' into develop 2018-07-23 13:22:39 -05:00
David Sparer
29483b2625 attached the file backup pruner to listen to connection file save events
resolves #1020
2018-07-23 12:53:03 -05:00
David Sparer
7fc59e79f3 bumped assembly version in preparation for next alpha release 2018-07-23 12:03:53 -05:00
David Sparer
79b3e21148 updated changelog 2018-07-23 12:02:09 -05:00
David Sparer
ee91117010 renamed function to be a bit more accurate 2018-07-23 11:54:49 -05:00
David Sparer
0548037ff3 added a few method summaries 2018-07-23 11:53:50 -05:00
David Sparer
46002632bb removed duplicate code 2018-07-23 11:52:38 -05:00
David Sparer
9659ac1611 added a dialog to prompt for action when decrypting a connection file fails 2018-07-23 11:51:58 -05:00
David Sparer
bbc497e68d added some quality of life methods to Optional 2018-07-23 08:03:03 -05:00
David Sparer
d7ec7574ad updated changelog 2018-07-20 14:54:42 -05:00
David Sparer
2f476d9e61 fix a null ref exception when importing from port scan without selecting a tree node. resolves #1030 2018-07-20 14:52:12 -05:00
David Sparer
c74f37f0de confirmer should return false if deletion target is null. found during regression testing 2018-07-20 12:31:59 -05:00
David Sparer
d27a62cbfc added some extra null checks in the rdcman importer 2018-07-20 07:26:38 -05:00
David Sparer
8029e491a3 Merge branch 'auto_save_during_sort' into release/v1.76 2018-07-18 14:53:26 -05:00
David Sparer
fe56268421 added a simple system to batch saves in the connection service 2018-07-18 14:53:02 -05:00
David Sparer
2db6fabbe9 reverted 3bdcf65 2018-07-18 14:52:12 -05:00
David Sparer
035e89801a reduce FrmMain minimum size to prevent issues with other system features. resolves #1024 2018-07-17 08:07:10 -05:00
Sean Kaim
a7280da30c Solution config was building wrong projects 2018-07-07 14:10:18 -04:00
Sean Kaim
ac2920820d the post publish job in the appveyor.yaml in ps1 form 2018-07-03 17:04:11 -04:00
Sean Kaim
fcecc4b31e post build zip artifact test 2018-07-03 14:24:12 -04:00
Sean Kaim
4abef50ca0 appveyor post build tests 2018-07-03 13:38:22 -04:00
Sean Kaim
5e16445b08 testing post build appveyor script 2018-07-03 13:11:10 -04:00
Sean Kaim
be593b8185 don't run post build zip in appveyor 2018-07-03 13:10:52 -04:00
Sean Kaim
ca27cb9981 Trim ConfigurationName 2018-07-03 12:34:20 -04:00
Sean Kaim
5b64e629c9 zip portable directly via powershell
Trying to fix appveyor artifact build
2018-07-03 11:59:02 -04:00
Sean Kaim
18640826b6 latest 7-zip 2018-07-03 11:48:26 -04:00
Sean Kaim
e4d3239831 appveyor build installer 2018-07-02 17:34:08 -04:00
Sean Kaim
e834eadbe1 appveyor artifacts test 2018-07-02 17:03:23 -04:00
Sean Kaim
0ec8f66972 Revert "test appveyor artifacts"
This reverts commit 458c462f49.
2018-07-02 15:31:17 -04:00
Sean Kaim
28b49aab70 fix quotes 2018-07-02 15:29:27 -04:00
Sean Kaim
458c462f49 test appveyor artifacts 2018-07-02 15:29:05 -04:00
Sean Kaim
6f6e2a1254 code clean up (convert to expression body) 2018-07-02 15:12:01 -04:00
Sean Kaim
f46a3d69e1 minor code clean up 2018-07-02 14:57:10 -04:00
Sean Kaim
fa787ed082 minor code clean up 2018-07-02 14:34:22 -04:00
wwj402
b5b748f993 Chinese simplified language update for latest commit 05c96da 2018-07-02 11:02:48 +08:00
David Sparer
3bdcf655fd suspend tree model events during sort, since this can produce a lot of changes 2018-06-25 15:15:46 -05:00
David Sparer
284755f298 fix tab ordering on port scan page 2018-06-23 09:03:25 -05:00
David Sparer
ad5eed96e7 fixed visual bug when filtering connection tree. resolves #993 2018-06-22 15:09:53 -05:00
David Sparer
431c830ea0 resize connection tree column width when calling expand all. related to #993 2018-06-22 13:56:22 -05:00
David Sparer
da047427a5 fix test 2018-06-21 20:33:32 -05:00
David Sparer
69da1dca5f added some tests of the connection tree duplicate function. related to #1004 2018-06-21 18:04:29 -05:00
David Sparer
cc61501f63 dont attempt to delete selected node if it is not a valid deletion target. resolves #1004 2018-06-21 17:35:42 -05:00
David Sparer
4ced2d3392 accidentally put a few changelog items under the wrong version 2018-06-21 16:51:41 -05:00
David Sparer
7c72bfdf6b connection tree now removes filtering when 'use filtering' option turned off. resolves #1002 2018-06-21 15:33:43 -05:00
David Sparer
b8878e1458 updated changelog 2018-06-21 08:35:29 -05:00
David Sparer
abd40cec1b removed duplicate disable/enable shortcut calls that was causing an issue. resolves #1001 2018-06-21 08:34:26 -05:00
David Sparer
cc18da4f28 updated changelog 2018-06-20 16:43:24 -05:00
David Sparer
1a39039162 reenable all hotkeys once file menu closes. Resolves #999 2018-06-20 16:42:58 -05:00
David Sparer
cf9dd72ea5 dont allow folder/connections to be added to the putty root node in connection tree. Resolves #998 2018-06-20 16:25:08 -05:00
David Sparer
b7cdf81665 ensure putty root node returns correct tree node type. Related to #998 2018-06-20 16:20:51 -05:00
David Sparer
8497a05fd1 resolves #991
fixed bug when deleting connection tree node when in filtered view
2018-06-13 14:34:05 -05:00
David Sparer
7db4eec45c fixed bug where the export screen was using new credential manager code that shouldn't be active yet 2018-06-03 10:45:29 -05:00
David Sparer
cd822b545a random stuff the ui designer regenerated 2018-06-03 10:45:06 -05:00
David Sparer
e872581d3c updated changelog 2018-06-03 09:50:42 -05:00
David Sparer
defe9e094c made opening an empty panel on startup configurable in options 2018-05-31 06:26:43 -05:00
David Sparer
5662735cb8 bumped assembly version for next pre-release 2018-05-25 18:01:32 -05:00
David Sparer
05c96da98f Merge branch 'release/v1.76' into develop 2018-05-20 11:08:14 -05:00
David Sparer
8646dce21b update jenkins build to use newest msbuild (enables c# 7 lang features) 2018-05-20 11:07:43 -05:00
David Sparer
ea53fc190b Merge branch 'release/v1.76' into develop 2018-05-20 09:08:41 -05:00
David Sparer
99a3eabbaf updated changelog 2018-05-19 17:00:57 -05:00
David Sparer
c57bd386f2 dont try to connect to folders in quick connect menu. resolves #924 2018-05-19 16:57:34 -05:00
David Sparer
f2a52b03df menu bar can be moved when "lock toolbar position" is turned off. closes #902 2018-05-19 12:57:29 -05:00
David Sparer
860e1ccfaa fix a mismerged language item 2018-05-18 21:33:16 -05:00
David Sparer
49967b38d4 update changelog 2018-05-18 21:32:51 -05:00
David Sparer
36038fff6d fix minor code typo 2018-05-18 20:52:17 -05:00
David Sparer
c5958954b0 apply language later in app startup 2018-05-18 20:45:27 -05:00
David Sparer
d0d63016ca Merge branch 'pr_948_target' into release/v1.76
# Conflicts:
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/UI/Forms/frmMain.Designer.cs
#	mRemoteV1/UI/Menu/ViewMenu.cs
2018-05-18 20:04:23 -05:00
David Sparer
35f2484adf Merge pull request #948 from farosch/translation
some changes regarding tranlsation
2018-05-18 18:41:06 -05:00
Sean Kaim
662b5bde31 code clean up 2018-05-16 22:58:12 -04:00
Sean Kaim
388a4ed75b minor code clean up
* No need to kick off the registry provider here (it's done already in PuttySessionsManager#StartWatcher())

* if (Directory.Exists(sessionsFolderPath)) thows an exception even though it should have just fallen through... but if (!Directory.Exists(sessionsFolderPath)) doesn't throw and logs a message with a graceful return????

IDK... I had a Uri.IsWellFormedUriString test in there to avoid the exception, but it seems unnecessary...
2018-05-16 21:55:24 -04:00
David Sparer
c2cf496ded updated changelog and credits 2018-04-29 12:00:08 -05:00
David Sparer
8a172f02a9 updated changelog and credits for #942 2018-04-19 08:08:44 -05:00
David Sparer
f27935ea61 Merge pull request #942 from sli-pro/develop
Made several strings translatable and added Russian translations
2018-04-19 07:58:16 -05:00
Cristian Abelleira Olañeta
5311b522b7 Added InheritRedirectClipboard to CsvSerializer 2018-04-18 18:07:52 +02:00
Cristian Abelleira Olañeta
ea682e218d Fixed multiple errors in implementation 2018-04-15 20:13:28 +02:00
Cristian Abelleira Olañeta
aa5f7ef2a8 Implemented clipboard sharing setting for RDP protocol 2018-04-15 10:41:39 +02:00
Faryan Rezagholi
043df0aec3 fixed wording 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
63a2e18760 added missing items 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
c3ced7ed03 fix: translations of main file menu items were not loaded 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
f597e14b3d fix group box was not translatable 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
aff4ba9115 fix: set labels dock mode to fill (wasnt displaying longer translated texts) 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
554e0805e3 fix: title of options page was not translatable 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
f4efa74a23 Added missing translation options in viewMenu.cs 2018-04-14 11:56:01 +02:00
Vladimir Semenov
ddc19587fa Edited and added a translation of the Russian language in the forms
- File/import
- File/Import from AD
- File/Export to File
- View/Lock Toolbar position
- View/Mylti SSH toolbar
- Tools/Options/Additionally
Related to question #940.
2018-04-10 13:41:34 +03:00
Vladimir Semenov
5f1232727e Edit and add a translation on the external tools form.
Added and corrected Russian and English translations in the external tools tab.
Adjusted the placement of components on the external tools form so that the text does not overlap during translation.
Related to question #940.
2018-04-10 09:58:59 +03:00
David Sparer
9c373e8f0a Merge pull request #938 from sli-pro/develop
Small visual correction of the forms
2018-04-07 11:25:55 -05:00
David Sparer
83942d788f Merge branch '916_default_properties_not_saving' into develop 2018-04-06 15:05:35 -05:00
David Sparer
73d6fec6f3 updated changelog 2018-04-06 15:05:00 -05:00
David Sparer
a37b5deaa1 finished updating some tests for default inheritance 2018-04-06 15:02:14 -05:00
Vladimir Semenov
3b9de847e7 Small visual correction of the forms
- for the main form set the minimum resolution 1140; 603.
- for the form of port scans, done visual editing of components.
2018-04-06 20:59:15 +03:00
David Sparer
924f1f1e48 improved tests for default connection info 2018-04-05 16:37:22 -05:00
David Sparer
7bdebbe25b Merge pull request #936 from sli-pro/develop
Update Language ru
2018-04-05 15:16:31 -05:00
David Sparer
8f46c25dc9 Merge pull request #935 from marcomsousa/develop
Update Language es
2018-04-05 15:15:04 -05:00
Vladimir Semenov
8bb4a03639 Update Language ru
Fix typos in Russian language
2018-04-05 18:51:47 +03:00
Marco Sousa
7b5bc5e057 Update Language es 2018-04-05 12:39:02 +02:00
Aleksei Reytsman
2c62218fd6 Add context menu items to close other and other to the right tabs 2018-03-28 18:21:47 +03:00
David Sparer
35582a5e6a fixed bug with saving and loading default connection info data
updated tests to better cover this feature. related to #916
2018-03-22 16:54:50 -05:00
David Sparer
20340fd31f Merge pull request #913 from mRemoteNG/github-templates
Update .github templates
2018-03-22 07:44:10 -05:00
David Sparer
d6d7664b48 update readme shield 2018-03-14 19:30:25 -05:00
David Sparer
ce97e63876 bump version 2018-03-14 19:17:29 -05:00
David Sparer
378b98ff89 set release date 2018-03-14 19:09:02 -05:00
David Sparer
ce31199e57 updated changelog 2018-03-10 17:55:15 -06:00
David Sparer
227f3b2924 fix csv serialization bug where some empty fields would not be included
related to #911
2018-03-10 17:47:33 -06:00
David Sparer
5076f1354c fix bug where inheritance is incorrectly allowed on nodes under the root node after deserializing 2018-03-10 16:37:54 -06:00
Bennett Blodinger
e5a34388ae Update .github templates
Bumping up the quality of the templates with help from https://www.talater.com/open-source-templates
2018-03-09 09:46:03 -05:00
David Sparer
6a5f65c018 add a bit more documentation to the ps script that creates bulk connections 2018-03-09 08:08:29 -06:00
David Sparer
6d5f41b3d8 forgot to bump the stable branch when 1.75.7012 was released 2018-03-03 09:39:37 -06:00
David Sparer
64f10ead63 bump development channel download shield 2018-03-03 09:31:27 -06:00
David Sparer
575dae446f bump version and update changelog 2018-03-03 09:16:55 -06:00
David Sparer
9b438576f2 deserializing enums now ignores case. resolves #899 2018-02-27 09:48:09 -06:00
David Sparer
cbd32f1a07 added powershell script for creating bulk connections 2018-02-27 08:37:25 -06:00
David Sparer
516182ec40 the xml v2.6 schema must have the export field event if we dont use it. need to bump to v2.7 to get rid of it 2018-02-26 08:11:59 -06:00
David Sparer
4ad3a68d80 readded Export field to xml schema 2018-02-26 07:13:36 -06:00
David Sparer
2f9ba32c07 bump readme for development channel badge 2018-02-25 13:41:32 -06:00
David Sparer
dfc45a2904 update changelog 2018-02-25 12:59:58 -06:00
David Sparer
563fdffb67 fixed build scripts that publish to github
github no longer accepts tls1.0 connections, use tls1.2
2018-02-25 12:58:12 -06:00
David Sparer
f2e9c5e2c0 fixed issue with expanded property not being deserialized 2018-02-25 12:57:40 -06:00
David Sparer
86a591364c modified the xml serializer slightly to make it conform to the XSD file
This required all bools to be serialized to lower case which broke a few assumptions we made in the deserializer
2018-02-25 11:26:29 -06:00
David Sparer
2a82485f81 fixed build issue where installer wasnt being renamed with version number 2018-02-25 09:04:59 -06:00
David Sparer
e13549d361 fixed build issue where binary signatures were not being validated during release builds 2018-02-25 09:00:51 -06:00
David Sparer
a85c1bd7d3 bumped assembly and set release date 2018-02-24 15:19:09 -06:00
David Sparer
946679f490 dont attempt to close a tab if it is disposed 2018-02-24 15:09:09 -06:00
David Sparer
b6f27eac18 added another test and did some cleanup 2018-02-24 14:34:13 -06:00
David Sparer
2cc82145a3 csv serialization now fully preserves tree structure 2018-02-24 12:58:16 -06:00
David Sparer
2dae0f2d8e fix bug where sometimes containers would have their container flag turned off 2018-02-24 12:57:38 -06:00
David Sparer
412f6edc36 change guard checks to use extension method 2018-02-16 20:17:31 -06:00
David Sparer
764791b8e5 changed the Maybe type name to Optional, which is slightly more common 2018-02-16 20:17:30 -06:00
David Sparer
bd20d6ae7d moved classes to new namespace 2018-02-16 20:17:30 -06:00
David Sparer
8db0bf7bea make constant id readonly 2018-02-13 16:15:49 -06:00
David Sparer
cff6aa72fc update changelog 2018-02-13 14:38:58 -06:00
David Sparer
63ddf06057 Made port scan timeout configurable
resolves #648
2018-02-13 14:29:26 -06:00
David Sparer
3d9d57b7fa adding several tool chain dependencies 2018-02-09 13:09:58 -06:00
David Sparer
2c1734aea6 change post-build scripts to use bin tools from the repo
this should prevent some build issues new devs have and gives us more control over our build process
2018-02-08 16:11:16 -06:00
David Sparer
301c39aad0 update copyright 2018-02-08 15:39:35 -06:00
David Sparer
5be346c89d changed a few localized strings used by the initial connection file not found dialog 2018-02-04 19:44:39 -06:00
David Sparer
e4eaf0037e fixed an issue that was making bug #479 reappear 2018-02-04 19:14:03 -06:00
David Sparer
8f97be82cb added some more safety around retrieving inherited values 2018-02-04 19:08:29 -06:00
David Sparer
4ab7f92b82 reapply the quick connect focus bug fix provided in #651 2018-02-04 18:13:18 -06:00
David Sparer
0ec95a7729 Merge branch '625_deserialize_csv' into develop 2018-02-04 17:59:49 -06:00
David Sparer
98c38716cd updated changelog 2018-02-04 17:59:15 -06:00
David Sparer
6a46df780c did some refactoring
made IConnectionImporter generic to cut down on code
2018-02-04 16:00:50 -06:00
David Sparer
7788198f26 fixed an issue with serializing csv data with semi colons in fields 2018-02-04 11:52:26 -06:00
David Sparer
3010963283 hooked up csv deserialization to ui 2018-02-04 11:39:04 -06:00
David Sparer
6522524c0f added serialization for a few more inheritance properties 2018-02-04 10:32:18 -06:00
David Sparer
160434c114 Merge branch 'develop' into 625_deserialize_csv 2018-02-04 09:33:33 -06:00
David Sparer
36acb9ac12 update develop branch download badge 2018-02-01 21:38:10 -06:00
David Sparer
1a06783dab update changelog and credits 2018-02-01 21:13:42 -06:00
David Sparer
ec38ee9abc remove dead code 2018-02-01 20:54:24 -06:00
David Sparer
2e82551b7c fix toolbar location loading bug 2018-02-01 20:34:22 -06:00
David Sparer
49121fb945 remove deleted file from solution 2018-02-01 20:34:07 -06:00
David Sparer
6e436f55c3 Merge pull request #840 from jotatsu/develop
Fix themes on installer version, initial menu position fix
2018-02-01 20:32:59 -06:00
David Sparer
afb0131a28 save and load multi ssh toolbar position. resolves #846 2018-01-28 21:15:12 -06:00
David Sparer
92588282a6 always set file menu position to the top left 2018-01-28 21:14:42 -06:00
David Sparer
765e997976 Merge pull request #858 from Fyers/develop
fixed putty session name encoding - fixes #800
2018-01-26 20:39:39 -06:00
Sean Kaim
ddbf6a2e7a ports from dev for appveyor build 2018-01-25 12:35:32 -05:00
Sean Kaim
8567e912a3 add citrixReceiver.exe for appveyor 2018-01-25 12:25:48 -05:00
Sean Kaim
42e4f168d1 appveyor build status badge for master 2018-01-25 12:22:15 -05:00
Sean Kaim
7c98f2809c add appveyor.yml 2018-01-25 12:14:01 -05:00
Sean Kaim
e68b529a34 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2018-01-25 12:13:29 -05:00
Sean Kaim
1ed4987277 Update appveyor.yml 2018-01-25 12:13:26 -05:00
Sean Kaim
a5d1f0995c appveyor badge for develop branch 2018-01-25 12:11:28 -05:00
Sean Kaim
b6951df72e fix link for translations 2018-01-25 11:09:15 -05:00
David Sparer
b1c31048a9 trim rdp file parts for safety 2018-01-24 10:47:07 -06:00
Fyers
e13faa1b66 fixed putty session name encoding #800 2018-01-06 19:54:14 +01:00
Sean Kaim
9349aca76e remove credit
hotkey selection control is no lnger used
2018-01-03 12:13:58 -05:00
Sean Kaim
4946726d1e appveyor config 2018-01-02 17:06:23 -05:00
Sean Kaim
72c7800c02 update nunit 2018-01-02 16:11:33 -05:00
Sean Kaim
e4c35b2ba2 CitrixReceiver.exe - for appveyor 2018-01-02 15:47:19 -05:00
Sean Kaim
bccb885508 ignore cred repo tests 2018-01-02 15:43:53 -05:00
David Sparer
7b7e0e0522 Merge branch 'develop' into develop 2018-01-02 08:22:00 -06:00
Camilo Alvarez
991d1d82b8 Misc fixes
- Clear redundant settings form app.config
- Deleted DesignModeTest as ThemeManager can now be used in design time without adjustements, removed usage from all custo elements
- Instance _themeManager in NGNumericUpDown at object creation to avoid null reference errors
- Errorsform instancing is now defaulted to DockBottomAutoHide  in frmMain
-Fix missing panel at startup by adding a blank panel, temporary solution as magic library is beign phased out
2017-12-26 12:15:11 -05:00
David Sparer
5832205624 update credits and changelog for #829 2017-12-18 14:20:39 -06:00
David Sparer
8aeea4d212 added option for enabling utf8 encoding of the rdp "load balance info" property 2017-12-18 14:13:21 -06:00
David Sparer
e1934cd1b0 Merge pull request #829 from sirLoaf/AzureLoadBalanceInfoFix
Fix for connecting to azure instances (cloud services). LoadBalanceIn…
2017-12-18 13:27:32 -06:00
Camilo Alvarez
056cce2f97 Removed windings fonts
Now using unicode for better compatibility in special characters for drawing controls
2017-12-13 09:34:27 -03:00
David Sparer
61f6463e59 rearranged a few items on the sql server page 2017-12-12 09:47:27 -06:00
David Sparer
a929552c3d fixed a bad merge that I made 2017-12-12 09:44:08 -06:00
David Sparer
10cd02d2e7 Merge pull request #836 from dekelMP/develop
SQL Read Only Option
2017-12-12 09:42:23 -06:00
David Sparer
afac50c18f Merge branch 'develop' into develop 2017-12-12 09:32:49 -06:00
David Sparer
24ade35df8 Merge branch 'develop' into develop 2017-12-12 09:30:42 -06:00
David Sparer
d50341ff8e updated changelog 2017-12-12 09:25:14 -06:00
David Sparer
54bd6d5336 added option to lock the toolbar controls
resolves #838
2017-12-12 09:22:33 -06:00
Camilo Alvarez
7bc26787db Reorganize menus, fix empty values in design mode 2017-12-12 08:47:35 -03:00
Camilo Alvarez
e923f816a4 fix installer version missing themes
fixed the installed veresion missing themes, added more controls for theme failure to load
2017-12-11 08:29:18 -03:00
Dekel Asaf
c6e4439ab9 Added check for SQL read only in SqlDataProvider 2017-12-10 22:22:38 +02:00
Dekel Asaf
94f66da84e Added SQL Read Only option
Avoid saving when SQL Read Only check box is checked
2017-12-10 21:59:57 +02:00
Dekel Asaf
384399c1c8 Merge develop from upstream 2017-12-10 21:13:50 +02:00
Dekel Asaf
7bac63310f Merge remote-tracking branch 'upstream/develop' into develop 2017-12-10 21:07:03 +02:00
David Sparer
f85de2c960 set release date of 1.76 alpha 1 in changelog 2017-12-08 15:14:43 -06:00
Fabio Laib
173b516270 Fix for connecting to azure instances (cloud services). LoadBalanceInfo requires a UTF8 encoded string 2017-12-06 12:52:51 +01:00
David Sparer
3af25610b8 Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/App/Startup.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
2017-12-05 08:00:23 -06:00
David Sparer
0898ed8c00 began implementing csv deserializing 2017-12-04 22:00:18 -06:00
David Sparer
0d0b056f6b resolves #561 2017-12-03 16:41:17 -06:00
David Sparer
3f6b572f51 added ability to launch mremoteng from last screen of installer 2017-12-03 15:46:11 -06:00
David Sparer
1a2b906e0a bump assembly version to 1.75.7012 2017-12-01 10:18:52 -06:00
David Sparer
d48331b706 Merge branch '1.75.7012' 2017-12-01 10:17:06 -06:00
David Sparer
d95cc62c8e update changelog 2017-12-01 10:15:43 -06:00
David Sparer
f04aa78fd7 resolves #803 2017-12-01 10:06:33 -06:00
David Sparer
b03d355d69 connection's inheritance is now correctly disabled when rootnode is the parent 2017-11-30 12:29:56 -06:00
David Sparer
834e7c1abb Merge branch '1.75.7012' into develop 2017-11-24 08:33:12 -06:00
David Sparer
c37caa95a4 resigned putty with new code signing cert 2017-11-24 08:32:44 -06:00
David Sparer
3ffcc5d5ba fixed bug where our custom drag sink was being overwritten
closes #814
2017-11-21 12:40:22 -06:00
Sean Kaim
52fa87a7c6 minor refactor 2017-11-20 14:54:38 -05:00
Sean Kaim
0ddcfbeed7 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2017-11-20 14:36:33 -05:00
Sean Kaim
a2f56682e6 streamlined error handling for Authenticode check 2017-11-20 14:36:31 -05:00
David Sparer
edc4af6da5 fixed bug where user/domain/pass inheritance wasnt being shown
this was due to some credential manager work that didnt get rolled back
2017-11-20 12:18:00 -06:00
David Sparer
283354d4d9 fixed bug where closing the options window would always prompt for a connections file to load 2017-11-19 15:00:55 -06:00
David Sparer
c3fbc573e2 forgot a thing... 2017-11-19 14:49:30 -06:00
David Sparer
e7f0091b48 made a ui buttons text translatable 2017-11-19 14:48:54 -06:00
David Sparer
446327dffd Merge pull request #809 from mRemoteNG/338_connection_tree_filtering
Implemented connection search filtering feature
2017-11-19 14:40:42 -06:00
David Sparer
03a0449662 updated changelog 2017-11-19 10:11:44 -06:00
David Sparer
3fb72dfc24 implemented search filtering feature 2017-11-19 09:13:44 -06:00
David Sparer
7c4ccde69b updated credits and changelog 2017-11-17 15:04:05 -06:00
David Sparer
167a50816f Domain is now available on connections with protocol Int App
Closes #485
2017-11-15 11:27:56 -06:00
David Sparer
a753b868e6 Updated urls for the forum to point to reddit
Closes #608
2017-11-15 11:19:26 -06:00
David Sparer
0958c9da44 minor refactoring. removed need for compiler conditionals 2017-11-15 10:52:50 -06:00
David Sparer
bdee98feb0 Merge pull request #799 from mRemoteNG/340_save_connections_on_edit
Implemented option for saving connections on edit
2017-11-15 10:13:25 -06:00
David Sparer
6f9c76c9ba SaveConnectionsAfterEveryEdit defaults to true 2017-11-15 10:10:03 -06:00
David Sparer
c4fdf075b3 Merge branch '644_target' into develop
# Conflicts:
#	mRemoteV1/App/Windows.cs
#	mRemoteV1/UI/Forms/frmMain.Designer.cs
#	mRemoteV1/UI/Forms/frmMain.cs
#	mRemoteV1/UI/Forms/frmMain.resx
#	mRemoteV1/mRemoteV1.csproj
2017-11-15 10:06:15 -06:00
David Sparer
0a19874ef3 Merge pull request #644 from mrwulf/Multi-SSH
Multi ssh
2017-11-15 07:51:30 -06:00
David Sparer
39af07cc22 Merge branch '644_target' into Multi-SSH 2017-11-15 07:51:10 -06:00
David Sparer
7ac3a264da Merge branch '644_target' into Multi-SSH 2017-11-15 07:50:39 -06:00
David Sparer
8951b45a39 Merge pull request #805 from pablomh/patch-1
Fix typo and minor nits
2017-11-15 07:38:29 -06:00
pablomh
a4e4315002 Fix typo and minor nits
- s/approprite/appropriate .
- Add a dot at end of sentence.
- Fix </li> formatting to comply with existing style.
2017-11-15 10:20:28 +01:00
David Sparer
3a9d108b76 Merge pull request #801 from DamianBis/797
issue #797 removed duplicate strings & fixed spelling
2017-11-14 14:53:28 -06:00
Sean Kaim
651a4ae2bf remove version #'s
Closes #615
2017-11-13 15:47:00 -05:00
Sean Kaim
75007db630 Changes from #708
Closes #708
Closes #197
2017-11-13 14:58:28 -05:00
Unknown
d0adfebf7a issue #797 removed duplicate strings & fixed spelling 2017-11-13 21:48:02 +11:00
David Sparer
f9e8496d3f moved event handler for saving connections on edit 2017-11-12 16:14:34 -06:00
David Sparer
f583b741d4 implemented save connections on edit 2017-11-12 15:14:50 -06:00
David Sparer
1d80b166b1 began implementing plumbing for saving connections on edit 2017-11-12 15:06:18 -06:00
David Sparer
42e59ee564 moved RemoteConnectionsSyncronizer references from Runtime to ConnectionsService 2017-11-12 14:30:23 -06:00
David Sparer
e2c82086be more refactoring. most connection saving/loading calls now go through the connection service class 2017-11-12 14:23:00 -06:00
David Sparer
e9d47f046d removed code for saving to .vre format
we havent supported this for a long time
2017-11-12 11:39:15 -06:00
David Sparer
4acc73ac19 did some refactoring to consolidate connection loading into a single service 2017-11-12 11:32:19 -06:00
David Sparer
96c27efa68 added setting for saving connections file on edit 2017-11-12 09:37:11 -06:00
David Sparer
52ad4435ac resolves #468 2017-11-12 08:22:06 -06:00
David Sparer
b6426dd202 the settings editor decided these should be in here... they must have accidentally been wiped away by a merge 2017-11-12 07:57:37 -06:00
David Sparer
abbdbdbc18 fixed bug where window text wasnt updated when choosing to create new connection from dialog popup 2017-11-11 21:44:36 -06:00
David Sparer
9ad6c20d42 Merge pull request #798 from mRemoteNG/sql_test_connection
Added way to test sql connections on sql options page
2017-11-11 21:18:42 -06:00
David Sparer
d96c854756 Merge branch 'develop' into sql_test_connection
# Conflicts:
#	mRemoteV1/Resources/Language/Language.Designer.cs
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/mRemoteV1.csproj
2017-11-11 21:16:39 -06:00
David Sparer
ac4c578396 Merge pull request #786 from brucetp/MR-421_The_startup_connection_file_could_not_be_loaded
MR-421 The startup connection file could not be loaded
2017-11-11 21:07:46 -06:00
David Sparer
5d527c8e72 Merge branch 'develop' into MR-421_The_startup_connection_file_could_not_be_loaded 2017-11-11 20:48:26 -06:00
David Sparer
15ef6c77dc Merge branch 'develop' into MR-421_The_startup_connection_file_could_not_be_loaded 2017-11-11 20:41:25 -06:00
David Sparer
8b990ac273 improved external tools window
- can edit items in listview
- improved data binding between model and ui
- delete and launch buttons disabled if no item selected
- item selection updates when deleting/adding item
2017-11-11 20:37:37 -06:00
David Sparer
99ffe9eac2 made ExternalTool implement INotifyPropertyChanged
Also codified the rule that "WaitForExit" cannot be set at the same time as "TryIntegrate". TryIntegrate will always be settable, but WaitForExit will have to defer its state.
2017-11-11 18:20:36 -06:00
David Sparer
3d8dda23ce added a AddRange method to FullyObservableCollection
more efficient collection updating - it only raises 1 event for the whole batch
2017-11-11 18:18:34 -06:00
David Sparer
4fe5df51fa Merge branch 'pr706_target' into develop
# Conflicts:
#	mRemoteV1/Config/Settings/SettingsSaver.cs
#	mRemoteV1/Tools/ExternalTool.cs
#	mRemoteV1/UI/Window/ExternalToolsWindow.Designer.cs
#	mRemoteV1/UI/Window/ExternalToolsWindow.cs
#	mRemoteV1/UI/Window/ExternalToolsWindow.resx
2017-11-11 13:36:19 -06:00
David Sparer
d7d6aa78f5 Merge pull request #706 from pedro2555/custom-workdir-external-tool
[RFC] Added support for custom working directory in External Tool
2017-11-11 12:07:26 -06:00
David Sparer
3646cb0ce6 Removed flicker when external tool toolbar entries are changed 2017-11-11 11:40:08 -06:00
David Sparer
e2bd1b8ba3 Merge pull request #775 from brucetp/MR-152_Add_to_External_Tools_Toolbar_option
MR 152 add to external tools toolbar option
2017-11-11 11:31:34 -06:00
David Sparer
b061f7e405 Merge pull request #704 from pedro2555/fix-portable-settings-cleaned
Fixes settings save location on portable version
2017-11-11 11:10:36 -06:00
David Sparer
78f38f1a48 fixed tests 2017-11-11 10:50:32 -06:00
David Sparer
eeec81bf3b added way to test sql db connection in options page 2017-11-11 10:31:16 -06:00
David Sparer
4682096d98 refactored sqldatabaseconnector to require connection details in ctor
created factory for creating SqlDatabaseConnectors from settings data for convenience
2017-11-11 10:31:15 -06:00
Bruce Peterson
ca369e2df5 Merge Conflict 2017-11-11 08:45:20 -05:00
Bruce Peterson
1a6efebea4 Resolving Merge Conflicts 2017-11-11 08:35:01 -05:00
David Sparer
bba3a45f0f Merge pull request #796 from farosch/develop
Further design optimizations on settings
2017-11-10 17:34:07 -06:00
Faryan Rezagholi
de83a273a9 Further optimazations on settings
Small layout fixes to frmOptions and option pages:
-Unified button heights
-fixed tab order on some option pages elements
-Resized "Launch PuTTY"-button under  Options>Advanced to display PuTTY Icon in full size
-Resized main panel in frmOption to fit size of option panes
-Reduced size of bottom panel in frmOptions to waste less space
-Fixed distance to form border of"OK" and "Cancel" buttons in frmOptions
-Unified all border styles of panels in frmOptions to none. (This makes the design look a little bit more flat and cleaner, also removes the strange edge  in the title bar where the two panels meet)
-set width of deviders on frmOptions to 1px (also looks a lot cleaner)
2017-11-10 18:52:04 +01:00
David Sparer
ba2954baf4 lowered sql connection schema version back down to 2.6 (pre-credential manager) 2017-11-10 08:44:19 -06:00
David Sparer
9e4f2ee3e7 resolves #419. removed all string collation directives.
Previously, all varchars had "COLLATE SQL_Latin1_General_CP1_CI_AS". This was done to better support international users
2017-11-10 08:13:41 -06:00
David Sparer
0c6ad58bca made file data provider tests safer for concurrent execution in jenkins
When multiple builds had to run, these tests would sometimes fail due to the file system being a shared resource.
Each test now creates its own random folder and cleans it up after the test runs
2017-11-10 08:03:03 -06:00
Bruce Peterson
8319ec988f Added File Not Found test 2017-11-09 23:03:16 -05:00
David Sparer
fc65476918 Merge pull request #791 from farosch/develop
Rearranged settings elements
2017-11-09 20:17:55 -06:00
David Sparer
42b45408ed readded tests that got missed in a merge 2017-11-09 19:47:42 -06:00
David Sparer
792f0b5c7a Merge pull request #754 from brucetp/MR-225_Can_not_import_RDCMan_v2.7
MR-225 Can not import RDCMan v2.7
2017-11-09 19:20:13 -06:00
David Sparer
b68e0600bd safer test cleanup 2017-11-09 18:48:59 -06:00
David Sparer
a667502836 connection tree context menu now gets set. Why was this line missing? bad merge? 2017-11-09 15:37:23 -06:00
Faryan Rezagholi
254d545e58 Rearranged settings elements
Rearranged some elements from the settings to prevent that translated strings overlap with these elements. Issue #784
2017-11-09 18:19:13 +01:00
David Sparer
cdde4b0cc9 Merge branch 'develop' into fix-portable-settings-cleaned 2017-11-09 08:40:03 -06:00
Bruce Peterson
0346497f45 Added dialogs and options for new config, path, or importing a file 2017-11-08 21:12:41 -05:00
David Sparer
af3527d6cf updated the download shield icons 2017-11-08 15:20:22 -06:00
David Sparer
08186d98f5 Merge branch 'develop' into MR-225_Can_not_import_RDCMan_v2.7 2017-11-08 12:04:23 -06:00
David Sparer
9b8b01515c Merge branch 'develop' into MR-225_Can_not_import_RDCMan_v2.7 2017-11-08 11:58:34 -06:00
David Sparer
49e5b71235 Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteNGTests/mRemoteNGTests.csproj
#	mRemoteV1/App/Startup.cs
#	mRemoteV1/Connection/Protocol/IntegratedProgram.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Resources/Language/Language.Designer.cs
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs
#	mRemoteV1/UI/Forms/frmMain.cs
#	mRemoteV1/UI/Window/ConnectionTreeWindow.cs
2017-11-08 11:52:10 -06:00
David Sparer
f63980f122 Merge branch 'hotfix11' 2017-11-07 20:22:00 -06:00
David Sparer
9cee827f6b updated changelog 2017-11-07 20:21:13 -06:00
David Sparer
9c57976906 singleton instance should be given focus 2017-11-07 20:20:24 -06:00
David Sparer
ef5b09b6fa fix issue where /resetpanels did nothing 2017-11-07 16:35:25 -06:00
David Sparer
469b4224dc fixed bug with resetting window position
resetting window position now places app in center of main monitor like it should
2017-11-07 10:05:18 -06:00
David Sparer
afc410cfe6 fixed #778
custom cons param bug introduced in commit f73c9c9d
2017-11-07 08:21:32 -06:00
David Sparer
b686bc1112 Update mRemoteNGTests.csproj
removed unit test I accidentally re-added
2017-11-06 10:17:33 -06:00
David Sparer
25bee76fff Merge branch 'develop' into MR-225_Can_not_import_RDCMan_v2.7 2017-11-06 10:14:35 -06:00
David Sparer
98a8b9944e Merge branch 'develop' into MR-225_Can_not_import_RDCMan_v2.7 2017-11-06 10:09:49 -06:00
Bruce Peterson
66745d2ddf Correcting Merge conflicts with TESTS project file. 2017-11-06 10:15:10 -05:00
Bruce Peterson
cf9e1fe54c Attempting to correct merge conflicts 2017-11-06 09:56:10 -05:00
David Sparer
9bf59bed2f update jenkins build tools paths 2017-11-06 08:08:49 -06:00
Bruce Peterson
48a9968d20 Update the External Tools Toolbar based upon the collection 2017-11-05 22:01:49 -05:00
Bruce Peterson
d23355b147 Bug Fix on External Tools column header 2017-11-05 20:34:14 -05:00
Bruce Peterson
83ec5658c4 Added Show on Toolbar to External Tools Dialog 2017-11-05 19:53:06 -05:00
David Sparer
aed509155b inheritance button should be disabled when parent is root connection node 2017-11-05 09:04:10 -06:00
David Sparer
0120762dbe putty sessions should not have the inheritance button 2017-11-05 08:41:13 -06:00
David Sparer
85b67ecd0b fixed bug in connection tree context menu
right clicking in white space (no connection tree item selected) made the context menu appear with all options enabled. No context menu should appear in that case
2017-11-05 07:24:28 -06:00
David Sparer
7451383c24 putty nodes and root putty node should not have context menu items "import" or "export" 2017-11-05 07:09:17 -06:00
David Sparer
88d735ed56 resolved bug that would sometimes disable connection tree hot keys
bug was introduced in #652. I made sure that the original issue is still resolved
2017-11-04 22:04:08 -05:00
David Sparer
7a002e4b89 updated changelog 2017-11-04 11:45:14 -05:00
David Sparer
01ad0b4875 safer connection tree gui updating 2017-11-03 15:10:35 -05:00
David Sparer
4defa5fa9c Resolves #758
introduced in commit 8a3e3704
2017-11-03 15:09:18 -05:00
David Sparer
32a1dd64ab Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	CREDITS.TXT
#	README.MD
#	Tools/postbuild_installer.ps1
#	Tools/set_LargeAddressAware.ps1
#	mRemoteNGTests/mRemoteNGTests.csproj
#	mRemoteNGTests/packages.config
#	mRemoteV1/App/Logger.cs
#	mRemoteV1/App/Runtime.cs
#	mRemoteV1/App/Startup.cs
#	mRemoteV1/Connection/DefaultConnectionInfo.cs
#	mRemoteV1/Connection/Protocol/IntegratedProgram.cs
#	mRemoteV1/Connection/Protocol/PuttyBase.cs
#	mRemoteV1/Messages/MessageCollector.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Resources/Language/Language.Designer.cs
#	mRemoteV1/Resources/PuTTYNG.exe
#	mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs
#	mRemoteV1/Tools/ExternalToolArgumentParser.cs
#	mRemoteV1/Tools/IeBrowserEmulation.cs
#	mRemoteV1/Tools/NotificationAreaIcon.cs
#	mRemoteV1/Tools/PortScanner.cs
#	mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs
#	mRemoteV1/UI/Controls/ConnectionTree/NameColumn.cs
#	mRemoteV1/UI/Forms/OptionsPages/ConnectionsPage.cs
#	mRemoteV1/UI/Forms/frmMain.cs
#	mRemoteV1/UI/Window/AboutWindow.cs
#	mRemoteV1/UI/Window/PortScanWindow.cs
2017-11-03 11:15:20 -05:00
David Sparer
5ce8171f12 updated changelog 2017-11-01 15:29:54 -05:00
David Sparer
e3121cb043 bumped assembly version 2017-11-01 15:14:55 -05:00
David Sparer
99e52ab0b5 updated changelog 2017-10-31 15:08:06 -05:00
David Sparer
2b672dc4fc Fixed another minor issue with external tools 2017-10-31 14:07:18 -05:00
David Sparer
6db7adf900 re-implemented autoresizecolumn in the connection tree
I did this in order to get around a weird bug where the connection tree would sometimes be set to a very small width (making it not visible)
2017-10-31 13:10:49 -05:00
David Sparer
65782285a3 added a few unit tests for integrated programs 2017-10-31 09:56:48 -05:00
David Sparer
64bd5a93ad resolves #761 2017-10-31 08:11:57 -05:00
David Sparer
93d7ef48eb removed unnecessary specflow file 2017-10-30 15:30:06 -05:00
Sean Kaim
a90b7abff7 proper xml formatting 2017-10-30 15:10:08 -04:00
Sean Kaim
a479b4b109 fix line terminators 2017-10-30 14:57:40 -04:00
Sean Kaim
326e1118da more nuget package updates 2017-10-30 14:57:29 -04:00
Sean Kaim
90f1e324ce update gecko 2017-10-30 14:39:20 -04:00
Sean Kaim
41e0228c03 re-target for .net 4.6 2017-10-30 13:42:26 -04:00
Sean Kaim
e72691a164 Merge pull request #760 from brucetp/MR-747_PuttySessions.Watcher.StartWatching_failed._Not_found
MR-747 putty sessions.watcher.start watching failed. not found
2017-10-30 12:28:24 -04:00
Bruce Peterson
7b1d2a0b38 Attempting to start Putty FileSystemWatcher on a folder that doesn't exist. 2017-10-30 12:03:21 -04:00
David Sparer
470d76faab added another valid microsoft cert thumbprint 2017-10-30 10:30:03 -05:00
Sean Kaim
aec9a75bba additional log adjustments 2017-10-30 11:27:43 -04:00
Sean Kaim
fcbac22577 add some details to StackTrace messages 2017-10-30 11:23:29 -04:00
Bruce Peterson
1153a5dd3c Putty config file path was incorrectly parsed 2017-10-30 11:22:26 -04:00
David Sparer
04fccad19c removed jenkins build step to publish test reports
they seem ot be failing a lot lately and its really not worth the trouble
2017-10-29 17:41:49 -05:00
David Sparer
1bce756bd6 Merge pull request #742 from mRemoteNG/revert_credmanager
Reverted credential manager functionality
2017-10-29 17:30:29 -05:00
David Sparer
68f052efcb Merge branch 'hotfix10' 2017-10-29 12:44:53 -05:00
David Sparer
4a8baf79fb bumped assembly version 2017-10-29 12:44:18 -05:00
David Sparer
499ac0295e fixed one case where visible connection tree width wasnt being updated correctly 2017-10-29 12:33:29 -05:00
David Sparer
29c422501a resolves #756 2017-10-29 12:17:18 -05:00
David Sparer
8efe74f614 bump assembly version 2017-10-28 16:25:08 -05:00
David Sparer
4e0f12f4b9 Merge branch 'Patch9' 2017-10-28 15:55:09 -05:00
David Sparer
cbd3a61259 updated changelog and credits 2017-10-28 15:48:16 -05:00
David Sparer
2406a7be49 fixes #600 2017-10-28 15:12:30 -05:00
Bruce Peterson
87322a36ca Included Test Cases for RDCMan v2.7 2017-10-27 23:36:36 -04:00
Bruce Peterson
bbe4d28a40 Modified Conn Manager Deserializer to import from RDCMan v2.7 2017-10-27 23:35:30 -04:00
David Sparer
dd40b56047 Merge pull request #728 from dekelMP/Patch9
Fixed #529
2017-10-27 18:55:22 -05:00
Sean Kaim
f14a0d5ee3 Merge pull request #710 from pedro2555/issue#649-cannot-integrate-cli-apps
Fixed integrated cli apps?
2017-10-19 09:54:07 -04:00
David Sparer
2994419381 revert confcons version back to 2.6 when serializing 2017-10-17 13:55:03 -05:00
David Sparer
81f06026d0 no longer try to load credential repo list 2017-10-17 13:54:39 -05:00
David Sparer
2df9441c20 reverted credential manager functionality as best I could 2017-10-16 14:39:41 -05:00
Sean Kaim
47190d9c02 Update ISSUE_TEMPLATE.md 2017-09-27 13:58:05 -04:00
Dekel Asaf
e0383d6c59 Fixed #529 2017-09-22 20:57:46 +03:00
Dekel Asaf
a436d9c070 fixed #529 2017-09-22 20:54:47 +03:00
Pedro Rodrigues
eeabcd94ed re-removed WaitForInputIdle
later consideration
2017-09-19 23:07:55 +01:00
Sean Kaim
8a3e37041a remove unnecessary converts 2017-09-18 17:37:04 -04:00
Sean Kaim
a1e9aefeb2 Merge branch 'Patch9' of https://github.com/mRemoteNG/mRemoteNG into Patch9 2017-09-18 10:02:09 -04:00
Sean Kaim
670cb51352 unnecessary convert.tostring's 2017-09-18 10:02:07 -04:00
Sean Kaim
a43dff88c5 Merge pull request #715 from pedro2555/492
fallback to empty credentials settings in external apps
2017-09-18 09:58:24 -04:00
David Sparer
fb3c87359f Merge pull request #724 from mRemoteNG/482_proposed_fix
Default connection password must be decrypted before first use
2017-09-18 08:48:06 -05:00
kmscode
a49dec7e6d just claify a comment. 2017-09-17 14:57:56 -04:00
kmscode
a7156235c3 puttyng 0.70
fixes #635
2017-09-17 14:22:36 -04:00
David Sparer
3cb52ba3f1 rearranged program init to ensure ConDefaultPassword is decrypted before assignment to DefaultConnectionInfo object 2017-09-17 11:10:32 -05:00
Sean Kaim
024f1a7047 minor code clean up 2017-09-15 17:37:28 -04:00
Sean Kaim
b77c7e922f Merge pull request #720 from pedro2555/676
First startup ignores cons param
2017-09-15 17:33:22 -04:00
Sean Kaim
9335c4706b fix editbin post build on jenkins 2017-09-15 16:52:42 -04:00
Sean Kaim
e09a9dabd6 update nuget packages 2017-09-15 15:42:28 -04:00
Pedro Rodrigues
e4e2f50015 Saving settings before exiting, and avoid early return 2017-09-15 20:38:34 +01:00
Sean Kaim
61865050c7 minor code cleanup 2017-09-15 15:34:54 -04:00
Sean Kaim
05d90c26ff Merge pull request #709 from pedro2555/issue#335
Changed quick connect connection icon image to play icon when there a…
2017-09-15 15:31:16 -04:00
Sean Kaim
43cdb29eb6 we don't need to look in ProgramData 2017-09-15 15:28:29 -04:00
Pedro Rodrigues
87ff1cb2b2 preparing ConsParam, and use Path.Combine in favor of string concatenation 2017-09-15 19:36:00 +01:00
Pedro Rodrigues
f73c9c9d02 Refactored cons param, corrected fallback override on first initialization.
Fixes 676
2017-09-15 19:17:08 +01:00
Sean Kaim
d15e444cb7 code clean up / null checks & logging 2017-09-15 13:58:32 -04:00
Pedro Rodrigues
2eff6c3dc4 if ( == false) is confusing, no need for it, if no else then ! 2017-09-15 18:49:06 +01:00
David Sparer
41fe211aec resolved #610 2017-09-15 08:07:12 -05:00
David Sparer
2acfa6d88d added another valid MS certificate thumbprint for build tools 2017-09-14 14:57:40 -05:00
Pedro Rodrigues
348b0c728c fallback to empty credentials settings in external apps #492 2017-09-14 20:16:53 +01:00
Pedro Rodrigues
ece2bda680 Credits to crdx, just found there's a proper place for that 2017-09-13 21:48:42 +01:00
Pedro Rodrigues
875e1573a4 Fixed integrated cli apps?
What was WaitForInputIdle() then?
2017-09-11 01:01:18 +01:00
Pedro Rodrigues
926dc868ef Changed quick connect connection icon image to play icon when there are open connections 2017-09-10 22:42:29 +01:00
Pedro Rodrigues
4a69ff6428 Added option to run external tool with elevated privileges 2017-09-10 19:33:35 +01:00
Pedro Rodrigues
75cf17e2ce Added browse button for ExternalTool working directory
Fixed minor bug on browse button for external tool filename, which was not saving upon selecting a new file, but rather relying on any other thing triggering the update on the actual ExternalTool instance.
2017-09-10 00:26:37 +01:00
Pedro Rodrigues
af3f66a5fa Wired up saver and loader 2017-09-10 00:11:26 +01:00
Pedro Rodrigues
61adf1f784 Wired up the form 2017-09-10 00:05:18 +01:00
Pedro Rodrigues
1d0311a194 Added controls for Working Directory option on ExternalToolsWindow 2017-09-10 00:00:08 +01:00
Pedro Rodrigues
bda9974eb8 A bit of house cleaning before adding new controls to ExternalToolsWindow 2017-09-09 23:39:10 +01:00
Pedro Rodrigues
0306296ae9 Added support for custom working directory in ExternalTool class
Not sure about l79 and argParser
2017-09-09 21:35:09 +01:00
kmscode
86ecb38ae2 minor code cleanup 2017-09-09 15:36:53 -04:00
Sean Kaim
f3ca58111c Merge pull request #705 from pedro2555/fix-proposal-issue#665
Fix proposal for issue 'Can not add new connection or new folder'
2017-09-09 15:34:44 -04:00
kmscode
3124d3ca1c minor code cleanup 2017-09-09 15:10:33 -04:00
Sean Kaim
9012506209 Merge pull request #700 from pedro2555/fix-write-log-file-option
Prevented log file creation when writeLogFile option is not set
2017-09-09 15:01:06 -04:00
kmscode
adb874ca74 avoid writing to the log when configured not to
plus some minor optimization.
2017-09-09 14:59:42 -04:00
Sean Kaim
f006a8aab6 Merge pull request #702 from jotatsu/develop
fix theme ui
2017-09-09 14:46:55 -04:00
kmscode
6aaf2f031b find editbin for vs 2017 community
updated acceptable authenticode for editbin.
2017-09-09 14:26:38 -04:00
Pedro Rodrigues
1669377938 Use root node when creating new connection/folder and no node is selected 2017-09-09 17:17:23 +01:00
Pedro Rodrigues
da45abaafb Applied PortableSettingsProvider.patch cleaned 2017-09-09 16:03:06 +01:00
CamAlvar
2b942f03b2 fix theme ui
- Fixed bug in ngcombobox that wasnt rendering DisplayMember elements text in theme mode
- Change in ngbutton icon placement for long text button names
- Verify SSH and notifications file transfer for theme, its ok
- Changed ConnectionTree to elipse text based on the width of the panel
2017-09-07 08:10:49 -05:00
Sean Kaim
985b5e6724 Merge pull request #698 from pedro2555/develop
README.md overhaul
2017-09-06 15:56:11 -07:00
Pedro Rodrigues
198c235765 Prevent log file writing when option is not set 2017-09-06 22:19:32 +01:00
Pedro Rodrigues
e82ee97666 Merge branch 'develop' into develop 2017-09-06 15:32:12 +01:00
Pedro Rodrigues
8be7dac209 README.md overhaul
Added titles to separate concerns.
Included quick access links to relevant wiki pages
Hopefully there is now everything one may be looking for in the README.
2017-09-06 15:28:24 +01:00
Sean Kaim
d2e35d8b2c Merge pull request #692 from mRemoteNG/pr/671
Pr/671 fixes
2017-09-05 10:02:10 -07:00
Sean Kaim
5938bc72b4 jenkins doesn't like this... 2017-09-05 12:59:07 -04:00
Sean Kaim
23860e5897 Merge pull request #671 from jotatsu/develop
Theming system revamp
2017-09-05 09:55:13 -07:00
Sean Kaim
11adbed079 code clean up 2017-09-05 12:50:32 -04:00
Sean Kaim
07eb45ad76 fix some of my merge fix boo boos 2017-09-05 11:45:58 -04:00
Sean Kaim
726e908b5a Merge branch 'develop' into develop 2017-09-05 08:40:25 -07:00
Sean Kaim
526c6d8852 fix virtual call in constructor 2017-09-05 11:06:12 -04:00
Sean Kaim
6d2be2e0a1 revert the few things that jenkins doesn't like 2017-08-21 17:48:36 -04:00
Sean Kaim
a8a9423ab0 ok... code clean up again... 2017-08-21 17:39:33 -04:00
Sean Kaim
78a82be4a0 Revert "code clean up"
This reverts commit 1acdb27996.
2017-08-21 16:54:01 -04:00
Sean Kaim
1acdb27996 code clean up 2017-08-21 16:48:20 -04:00
David Sparer
66f2c55343 Merge remote-tracking branch 'origin/master' into Patch9 2017-08-10 17:19:29 -05:00
David Sparer
0f3fa86bed Merge pull request #677 from mRemoteNG/improve_publish_automation
Improve publish automation
2017-08-10 17:18:19 -05:00
David Sparer
e5c2cfd243 fix github release body builder function 2017-08-10 16:35:17 -05:00
David Sparer
1a7ce13ec3 fixed error in test project 2017-08-06 10:40:36 -05:00
David Sparer
b4c535c76a can now delete multiple credentials 2017-08-06 10:32:48 -05:00
David Sparer
1c7592c707 Merge branch '659_dont_reference_creds_directly' into develop 2017-08-05 19:07:42 -05:00
David Sparer
e4f8f96b83 unloaded credentials now display a message 2017-08-05 19:06:27 -05:00
CamAlvar
105baa0557 Improved no-theme handlig for missing /themes folder, target to unit test 2017-08-05 18:22:13 -05:00
David Sparer
ec554dae2e cred record drop down now works
you can select the credential associated to a connection via a property window drop down
2017-08-05 16:35:21 -05:00
David Sparer
da86f113b8 fixed copyfrom bug
fixed a bug where an exception would be thrown if we tried to set a property that only exposed a getter
2017-08-05 16:09:30 -05:00
David Sparer
ef1c397f11 updated changelog 2017-08-05 11:02:16 -05:00
David Sparer
12e0cc3d7b Merge pull request #652 from mrwulf/Issue550
Issue #550 Fix - Don't propagate edit if it didn't come from the menu item
2017-08-05 10:59:06 -05:00
David Sparer
ff6bb6ebb0 update changelog and credits 2017-08-05 10:52:36 -05:00
David Sparer
6b78215b2e Merge pull request #651 from mrwulf/Issue176
Only do ActivateConnection when one of our known controls wasn't clicked (Addresses Issue #176)
2017-08-05 10:45:16 -05:00
CamAlvar
29a25b708c added comments to code, language location to new user strings, checked diff for merge 2017-08-04 19:02:28 -05:00
CamAlvar
376f22ce08 Finish wiring the options window, creation and modifying of themes. Added script to output themes at compilation 2017-08-04 01:07:22 -05:00
CamAlvar
6f25a72fb7 Added defaulting disable theming, wiring the theme manager with the option page 2017-08-02 22:08:55 -05:00
David Sparer
ec50078f18 minor test cleanup
did some small resharper cleanup. refactored the compiler conditionals to be more refactor-safe
2017-07-31 09:55:59 -05:00
David Sparer
c4900f5a66 fixed cred id showing up in config window 2017-07-29 22:07:51 -05:00
David Sparer
edb5dff064 bit of cleanup 2017-07-29 21:49:29 -05:00
David Sparer
3961e1844c Maybe<T> now calls T.ToString() 2017-07-29 11:46:16 -05:00
David Sparer
d09ecac35d added a MaybeParse extension
this makes parsing guids much nicer. no dealing with out vars or try blocks
2017-07-29 11:45:05 -05:00
Sean Kaim
5d9a02657f Fixes #658
Also fix a comment.
2017-07-28 15:25:56 -04:00
David Sparer
792edd9146 refactored a bit to use the Maybe pattern
implemented via ienumerable<t> so we can make use of the existing ienum monads
2017-07-28 13:01:15 -05:00
CamAlvar
fd045fcc39 Added images to buttons, updated the dockpanel version 2017-07-28 08:56:12 -05:00
David Sparer
7a2ab59346 connections now just reference credential ids 2017-07-27 21:50:50 -05:00
CamAlvar
dc7970ac80 99% #themed 2017-07-27 08:42:52 -05:00
CamAlvar
d08d4fa488 Almost all dialogs,forms and panels themed 2017-07-25 09:06:50 -05:00
Brandon Wulf
0807e7fec1 Send commands to quickconnect created connections too! 2017-07-24 17:41:39 -07:00
Brandon Wulf
1c4b5d1ca5 Merge branch 'Multi-SSH' of github.com:mrwulf/mRemoteNG into Multi-SSH 2017-07-24 16:45:56 -07:00
Brandon Wulf
a3d9b2b9cb Pulled MultiSSH code into its own class 2017-07-24 16:45:38 -07:00
CamAlvar
d0df08de2c Added more controls, replaced normal elements with NG versions 2017-07-24 09:25:02 -05:00
Brandon Wulf
14d670a9a2 Don't propagate edit if it didn't come from the menu item 2017-07-21 15:38:46 -07:00
Brandon Wulf
67801506e0 Only do ActivateConnection when one of our known controls wasn't clicked. 2017-07-21 14:19:08 -07:00
David Sparer
e98291498b Merge pull request #639 from emazv72/develop
fixed italian spelling
2017-07-20 19:12:07 -05:00
David Sparer
d82a86e01b Merge pull request #650 from polluks/develop
German typo
2017-07-20 11:59:51 -05:00
Stefan
760d053cd7 typo 2017-07-20 18:52:03 +02:00
Sean Kaim
48eb6dbbe0 updated changelog 2017-07-18 15:13:48 -04:00
Sean Kaim
d520c6a816 Exception after clicking on import port scan
Fixes #646
2017-07-18 14:31:21 -04:00
CamAlvar
a3894323db Added more custo controls, external tools window list redesigned, external tools window finished 2017-07-18 09:43:30 -05:00
Brandon Wulf
a4b902d5af Reverting the references
...even though it won't compile on my box without them..
2017-07-17 16:14:54 -07:00
Brandon Wulf
5f9f0769eb Switched Multi SSH window to a Multi SSH toolbar 2017-07-17 15:00:59 -07:00
Brandon Wulf
49390574bf Builds and basically works 2017-07-14 18:16:27 -07:00
Emanuele Zavallone
71fab09581 fixed italian spelling 2017-07-14 09:51:01 +02:00
CamAlvar
9225df85da Fixed design time controls, added custom button control 2017-07-13 09:34:17 -05:00
CamAlvar
81160ac1ea implemented custom label to override winforms disabled hacks
Fix for dark themes on disabled label text (default to black in the winforms code)
2017-07-12 09:48:59 -05:00
CamAlvar
5dd02602b7 theme more windows,panels and menu 2017-07-10 08:06:38 -05:00
CamAlvar
a92dfa3920 fixed color default method
fixed color default method, fixed message box foreground color and mixed warning and error colors
2017-07-06 01:30:52 -05:00
CamAlvar
0c19a1aafe changed loading and defaulting theme method
Use resource style  and xpath for loading, now the default is merged dinamically into the active theme by using a dictionary storange
2017-07-06 01:06:26 -05:00
CamAlvar
5429bb7d2b fixes and improvements
Defaulting extended palette in embedded themes, removed the reference to the dockpanel theme palette, that only exist in vs2015
2017-06-28 00:26:01 -05:00
David Sparer
664799c01b minor fix to allow building on some older machines
Oder editbin.exe files from Microsoft were signed with a different cert thumbprint. This update makes it easier to add additional valid thumbprints for MS signed tools
2017-06-27 12:20:39 -05:00
David Sparer
d88c5b9db2 minor error message correction
changed an error message that referred to File -> Load Connections (which doesn't exist). Changed this to File -> Open Connection File
2017-06-27 12:15:38 -05:00
CamAlvar
509acd1192 Fix property loaded
Removed unnecesary call for load proprerties, added a theme for reference implementation
2017-06-20 07:57:57 -05:00
CamAlvar
8db74a4514 First try
Lots of things broken, but basic structure is there
2017-06-19 22:51:34 -05:00
Camilo Alvarez
0d6f98f50a Update README.MD 2017-06-19 22:41:49 -05:00
Sean Kaim
0fe7a693f8 changelog 2017-06-16 10:08:04 -04:00
Sean Kaim
d368fbbf5b changelog 2017-06-16 10:07:02 -04:00
Sean Kaim
1e7c123145 add log message
Relates to #596
2017-06-16 10:04:12 -04:00
Sean Kaim
9a2efd9686 Exception launching ExtTool without con selected 2017-06-16 09:54:52 -04:00
Sean Kaim
069b0b0153 merge 1.75.7008 changes into develop 2017-06-15 15:10:23 -04:00
Sean Kaim
c12c64380d changelog update 2017-06-15 15:10:22 -04:00
Sean Kaim
88961fbdb5 Merge pull request #593 from mRemoteNG/kmscode-patch-1
changelog update
2017-06-15 15:02:20 -04:00
Sean Kaim
a11ceced09 changelog update 2017-06-15 15:00:34 -04:00
Sean Kaim
9da94b38b3 hotfix 8 2017-06-15 12:20:02 -04:00
Sean Kaim
ca35662ca2 Merge pull request #592 from mRemoteNG/hotfix7
Hotfix8
2017-06-15 11:52:59 -04:00
Sean Kaim
e7c4bbe1e8 increment version 2017-06-15 11:33:50 -04:00
Sean Kaim
1bc56b5c9e Merge remote-tracking branch 'refs/remotes/origin/master' into hotfix7 2017-06-15 11:29:55 -04:00
Sean Kaim
25a0630bcb updated putty build
New version number: 0.69.0.1

Fixes #589
2017-06-15 11:28:41 -04:00
Sean Kaim
1f7d122bee clean up installer build a bit 2017-06-15 11:19:30 -04:00
Sean Kaim
d9cb32ca53 enable verbose logging within the MSI 2017-06-15 11:19:02 -04:00
David Sparer
9cdfc61a30 Merge pull request #558 from vbfox/treeview_icons
Use the connection icon everywhere
2017-06-14 13:07:59 -05:00
David Sparer
760587ee2e Merge pull request #590 from mRemoteNG/update_jenkinsfile
jenkins release builds will now clean then build
2017-06-14 11:21:21 -05:00
David Sparer
d2fe8a2ddb builds will now clean then build 2017-06-14 11:14:36 -05:00
David Sparer
d2dc76baf1 removed a few unnecessary powershell params 2017-06-14 10:47:55 -05:00
David Sparer
232de66683 find_vstool now verifies that the tool can be executed
This improvement is meant to discard tool binaries that cannot be run. This is useful when you have an old install of VS that is broken for whatever reason. Now, we will ensure the tool has a valid exit code
2017-06-14 10:40:46 -05:00
Sean Kaim
3d61d1bca0 hotfix7 readme updates 2017-06-14 11:26:31 -04:00
Sean Kaim
c2c9531c1b changelog update 2017-06-14 11:22:57 -04:00
Sean Kaim
461df14cf7 rebuilt & signed puttyng 0.69
Fixes #583
2017-06-14 11:20:46 -04:00
Sean Kaim
81b0be0489 Merge pull request #588 from mRemoteNG/hotfix7
Hotfix7 changelog
2017-06-14 11:10:19 -04:00
Sean Kaim
3074a211f8 changelog 2017-06-14 11:08:55 -04:00
Sean Kaim
0659b140f5 Merge pull request #587 from mRemoteNG/hotfix7
Hotfix7
2017-06-14 10:59:06 -04:00
Sean Kaim
0b8160ae34 changelog 2017-06-14 10:57:49 -04:00
Sean Kaim
dbf2b7b4b6 increment version 2017-06-14 10:51:24 -04:00
Sean Kaim
1e8afc8ea4 update readme 2017-06-14 10:48:57 -04:00
Sean Kaim
70bd2e8a78 rebuilt & signed puttyng 0.69 2017-06-14 10:48:46 -04:00
Sean Kaim
b1dfe6e714 update download links to hotfix6 2017-06-13 17:17:04 -04:00
David Sparer
46bc0fe8b4 no longer request users tag issues
Removed lines in Bug/Feature headings that requested users tag their own issues. Normal users cannot set issue tags.
2017-06-13 13:47:50 -05:00
Sean Kaim
8045544051 Merge pull request #581 from mRemoteNG/hotfix6
Hotfix6
2017-06-13 11:15:08 -04:00
Sean Kaim
0cef4dc9b3 changelog update 2017-06-13 10:49:05 -04:00
Sean Kaim
f1cfa4330a fix build/porting problem for about window 2017-06-13 10:42:31 -04:00
Sean Kaim
a50b370262 Use all space on about page
Fixed 377
9c5e4f7a7c
2017-06-13 10:24:40 -04:00
Julien Roncaglia
7cc3639758 React to icon change events 2017-06-13 10:26:25 +02:00
Julien Roncaglia
24b5dd0c8c Add server icons in the treeview 2017-06-13 10:26:24 +02:00
David Sparer
32afdfc257 Update README.MD
Removed build badge for the beta branch. We do not build a new binary for beta builds, they are promoted from development releases
2017-06-08 10:36:39 -05:00
Sean Kaim
10e61e28c6 changelog update 2017-06-02 16:49:46 -04:00
Sean Kaim
d88be9aca4 Quick Connect from ntf area icon displays warning
warning occurs when clicking on a folder.

Fixes #546
2017-06-02 16:48:52 -04:00
Sean Kaim
064fd217ba initial Hotfix 6 commit 2017-06-02 16:45:23 -04:00
Sean Kaim
dd2e2734ce Addl protections to avoid problems on update chk
fixes #527
2017-06-02 15:16:56 -04:00
David Sparer
390c230de9 updated credits 2017-05-27 20:37:49 -06:00
David Sparer
b43f868eba updated changelog and credits 2017-05-27 20:34:54 -06:00
David Sparer
119a18aa15 Merge pull request #567 from peterchenadded/develop
Added extra logic to search the hostname and description fields of the connection instead of just the name.
2017-05-27 20:27:21 -06:00
David Sparer
b79c35042a Merge pull request #557 from vbfox/credential_manager_upgrade_crash
Credential manager upgrade crash
2017-05-27 19:00:57 -06:00
Chen, Peter
12f8e0fe71 Saved lowercase searchText to variable and used it for the comparison 2017-05-24 22:47:35 +10:00
Chen, Peter
0b065b16b1 Fixed incorrect test name 2017-05-24 22:42:39 +10:00
Chen, Peter
b4d5451b11 Added extra logic to search the hostname and description of the connection instead of just the name. Also added associated tests 2017-05-24 22:36:29 +10:00
David Sparer
2fb4c8d227 Merge pull request #555 from polluks/patch-1
Update README.MD
2017-05-19 09:18:26 -06:00
Julien Roncaglia
9d8f3db511 Fix a second instance of the same problem 2017-05-15 22:02:23 +02:00
Julien Roncaglia
76813e9df4 Culture-Independent parsing of the configuration version
The configuration version was parsed in the credential manager upgrade
process using the current user culture and crashed on cultures where '.'
isn't the decimal separator.
2017-05-15 21:53:15 +02:00
Stefan
35da9cfb54 Update README.MD
https://en.wikipedia.org/wiki/Telnet
2017-05-15 13:52:38 +02:00
David Sparer
3f28594376 Cleaned up some event handlers in PortScanner 2017-05-12 10:36:55 -06:00
David Sparer
64c142d21e extracted a Runtime function to a new class 2017-05-12 09:08:19 -06:00
David Sparer
36304e8356 slightly improved the setup of Runtime.IsPortableEdition
refactoring the name of this property is now safer
2017-05-11 15:39:33 -06:00
David Sparer
4090930142 delayed the creation of a dependency to resolve a nullref error
There is currently a circular dependency between frmmain and connectioninitiator. This change temporarily resolves the issue of the nullref, but these two classes need to be decoupled somehow.
2017-05-11 15:20:30 -06:00
David Sparer
cd4d5df4db extracted a Runtime method to a different class 2017-05-11 15:12:53 -06:00
David Sparer
b921964c88 updated changelog 2017-05-11 10:46:32 -06:00
David Sparer
6dcef71ebc changed the backup file timestamp to use system time rather than utc 2017-05-11 10:42:58 -06:00
David Sparer
c69d4107d8 fixed unit tests 2017-05-11 10:37:32 -06:00
David Sparer
d6c34f2312 simplified backup file creation 2017-05-11 10:29:06 -06:00
David Sparer
8666c491ce extracted some Runtime class methods to new classes 2017-05-11 09:53:32 -06:00
David Sparer
7f4cfc267e updated supporteduicultures in settings file. this wasn't set when the korean translation was added 2017-05-11 09:16:37 -06:00
David Sparer
9d48eb6d74 refactored a few usages of compiler conditionals 2017-05-10 21:32:04 -06:00
David Sparer
7f80cad356 moved property from Runtime to ConnectionsService 2017-05-10 19:59:56 -06:00
David Sparer
36b3278698 moved a property from Runtime to ConnectionsService 2017-05-10 17:59:58 -06:00
David Sparer
2633b4c876 extracted all external tools related code from Runtime to a new class 2017-05-10 17:42:40 -06:00
David Sparer
fd26e9755d extracted some Runtime methods to the ConnectionsService 2017-05-10 17:24:54 -06:00
David Sparer
c5623a10c1 fix non-portable build 2017-05-10 16:44:59 -06:00
David Sparer
4049695425 extracted a runtime method to a new class 2017-05-10 16:42:30 -06:00
David Sparer
25b0d12576 migrated a property from Runtime to frmMain 2017-05-10 16:11:58 -06:00
David Sparer
cb1c490a1c simplified save filter a bit 2017-05-10 16:07:54 -06:00
David Sparer
565a20a83e extracted Runtime method to a new class 2017-05-10 11:43:03 -06:00
David Sparer
077965f083 extracted Runtime method to new class 2017-05-10 11:16:35 -06:00
David Sparer
eae4f569c2 removed some references to Runtime class 2017-05-10 11:13:06 -06:00
David Sparer
3f999e525a changed namespace that was colliding with a class name 2017-05-10 11:01:27 -06:00
David Sparer
509606dbda extracted a Runtime method to a new class 2017-05-10 10:58:53 -06:00
David Sparer
1b12a689a3 cleaned up some code in Runtime relating to new confcons creation 2017-05-10 09:27:11 -06:00
David Sparer
f91d09b2ae FileDataProvider now creates directories if they do not exist 2017-05-10 09:11:33 -06:00
David Sparer
89c02483eb extracted method to improve code readability 2017-05-10 08:34:21 -06:00
David Sparer
9725082b06 hooked up the cred upgrader form to the connections loader code 2017-05-09 11:58:30 -06:00
David Sparer
4c9471c415 minor cleanup 2017-05-09 11:55:54 -06:00
David Sparer
2bee87916d added error handling to the jenkinsfile to ensure nunit test results are uploaded on test failures
previously, a failure of a test would stop the pipeline at that point without uploading any test data
now, the pipeline will stop on the step that fails but still upload all test reports that have been created up to that point.
2017-05-09 11:23:20 -06:00
David Sparer
7838b6dc0e added some artificial delay to a test to help ensure it doesnt fail due to completing too quickly 2017-05-08 13:39:20 -06:00
David Sparer
6ae279c292 created some tests to verify that the file data providers work as expected 2017-05-08 13:23:49 -06:00
David Sparer
28aea45f95 made the cred upgrader form a deserializer decorator so we can inline it with other deserializers 2017-05-07 23:13:45 -06:00
David Sparer
38d0be992c updated the NewConnections function to use the already built serializer 2017-05-07 23:12:17 -06:00
David Sparer
73b0c8c68c promoted cred file path to a public property 2017-05-07 23:11:27 -06:00
David Sparer
b8002ce577 created language resources for some new entries in the cred upgrader form 2017-05-07 21:31:22 -06:00
David Sparer
5eebcd01ef hooked up several buttons in the cred upgrader form
- create new confcons file now works
- we can select a new confcons file to upgrade
2017-05-07 21:24:06 -06:00
David Sparer
5a455e1558 set up placeholder calls for localizing the form 2017-05-07 21:02:52 -06:00
David Sparer
c2d0eec9d2 began creating form for handling the upgrade of confcons to handle cred manager 2017-05-07 18:34:25 -06:00
David Sparer
97104d820e some more cleanup 2017-05-07 18:32:18 -06:00
David Sparer
f334f804b6 more minor cleanup 2017-05-07 18:26:24 -06:00
David Sparer
38bcafbfe5 cleaned up RdpProtocol 2017-05-07 17:22:59 -06:00
David Sparer
72196c705e minor cleanup of MessageFocusDecorator class 2017-05-07 16:46:42 -06:00
David Sparer
eb4d800e40 minor cleanup of NotificationAreaIcon class to condense refs to frmMain 2017-05-07 16:46:16 -06:00
David Sparer
ad508a30ea minor cleanup of frmMain 2017-05-07 16:45:05 -06:00
David Sparer
7068309b04 minor cleanup of connection window 2017-05-07 16:40:05 -06:00
David Sparer
06ab054118 cleaned up RawProtocol 2017-05-07 16:36:22 -06:00
David Sparer
4f5c929a9b renamed ProtocolICA to IcaProtocol 2017-05-07 16:34:31 -06:00
David Sparer
268a146775 cleaned up ICA protocol 2017-05-07 16:29:37 -06:00
David Sparer
7151c347a0 minor cleanup of Startup class 2017-05-07 16:21:50 -06:00
David Sparer
98d813c172 cleaned up Screens class 2017-05-07 16:19:11 -06:00
David Sparer
7b5a805eda minor cleanup of Windows class 2017-05-07 16:16:17 -06:00
David Sparer
d2b6429c8b changed setting saver method signature to require frmmain rather than using static singleton variable 2017-05-07 16:08:50 -06:00
David Sparer
450c9bb755 refactored dock panel saver to split serialization to a separate class 2017-05-07 16:07:28 -06:00
David Sparer
a45cd01e26 renamed the dock panel load/save classes to be more indicative of their purpose 2017-05-07 15:31:12 -06:00
David Sparer
28f7a7315e refactored layout saver code to a new class 2017-05-07 15:21:47 -06:00
David Sparer
d9e7e359f9 refactored external tools saver code to a new class 2017-05-07 15:15:25 -06:00
David Sparer
bee41e0e75 few minor refactorings in frmMain 2017-05-07 15:00:12 -06:00
David Sparer
5e826a3392 refactored the cred manager upgrader to be a deserialization decorator 2017-05-07 14:48:40 -06:00
David Sparer
635ff88a53 removed unused param 2017-05-07 12:17:33 -06:00
David Sparer
83156bf28e refactored xml credential loading to a new class 2017-05-07 11:57:15 -06:00
David Sparer
9ba081f241 refactored sql connection loader 2017-05-07 11:45:09 -06:00
David Sparer
179c3725ca added a tab control that hides its tabs during runtime (shown during design time) 2017-05-07 11:29:22 -06:00
David Sparer
645fedb1ed refactored the cred manager migration code to a new class 2017-05-07 11:27:33 -06:00
David Sparer
104ee3829f combined several duplicate sort methods 2017-05-07 00:01:59 -06:00
David Sparer
9f80eb2f74 normalized line endings 2017-05-06 23:58:01 -06:00
David Sparer
44b3a643dd Merge pull request #480 from pfjason/develop
Added a BeginEdit() at the end of the AddNode function.
2017-05-06 23:39:10 -06:00
David Sparer
cf61a6bbe7 removed a call that was causing many unnecessary host pings. should help #480 2017-05-06 23:36:25 -06:00
David Sparer
93b45fba84 fixed auto column sizing to also include a horizontal scroll bar. resolves #501 2017-05-06 22:40:35 -06:00
David Sparer
0d1851a73b updated credits and changelog to include korean translation and cred manager 2017-05-06 20:13:56 -06:00
David Sparer
5d6377f71c added some unit tests 2017-05-06 13:36:59 -06:00
David Sparer
28872f39c1 cleaned up messages module 2017-05-06 12:47:25 -06:00
David Sparer
c0b8eab4b8 cleanup the resources folder by combining some icon/image folders 2017-05-06 12:04:58 -06:00
David Sparer
75ba00735d removed another unused file 2017-05-06 11:58:48 -06:00
David Sparer
fdd7951d13 removed unneeded files 2017-05-06 11:55:11 -06:00
David Sparer
e0427ae200 hook up korean translation to be used 2017-05-06 11:44:21 -06:00
David Sparer
ec269f7177 Merge pull request #504 from gyuha/develop
Add Korean translation
2017-05-06 11:40:19 -06:00
David Sparer
2226082b6b Merge pull request #543 from mRemoteNG/improve_credential_manager
Improve credential manager
2017-05-06 11:26:16 -06:00
David Sparer
c69c188de9 cleaned up jenkinsfile stages 2017-05-05 18:00:33 -06:00
David Sparer
8499655c94 added code coverage stage to jenkins pipeline 2017-05-05 16:05:35 -06:00
David Sparer
4c0c13e792 updated nunit and nsubstitute packages 2017-05-05 15:01:35 -06:00
David Sparer
9d2d693a63 updated "stage" definitions to follow newer jenkins pipeline guidelines 2017-05-05 14:58:45 -06:00
David Sparer
e8d4db3f80 added portable unit tests and acceptance tests to the jenkins build 2017-05-05 14:46:39 -06:00
David Sparer
e7ebea535e fix nunit test report upload 2017-05-05 14:15:30 -06:00
David Sparer
c3a7e91a1d update path to nunit console 2017-05-05 12:18:56 -06:00
David Sparer
44be066b26 update jenkins to use nunit test runner 2017-05-05 12:06:29 -06:00
David Sparer
47f4efe60c added some interfaces to making testing easier
created simple behavior tests for the credential service facade
2017-05-05 11:22:17 -06:00
David Sparer
a4d7aff651 some more refactoring to better segregate confcons version upgrade code 2017-05-05 10:45:52 -06:00
David Sparer
d55b41963b minor refactor to segregate code that upgrades confcons v26 to 27 2017-05-05 09:06:12 -06:00
David Sparer
6bfad8e2d0 removed test menu item 2017-05-05 09:02:01 -06:00
David Sparer
e06ba65e6c minor cleanup 2017-05-04 17:50:37 -06:00
David Sparer
3acd77a63d added a few minor tests 2017-05-04 17:40:51 -06:00
David Sparer
25b32a6444 removed unused code 2017-05-04 17:40:26 -06:00
David Sparer
62ae4fb265 split sql db version upgraders to separate classes 2017-05-04 17:16:55 -06:00
David Sparer
57fe2a6cc2 added some tests for the cred record converter 2017-05-04 10:20:01 -06:00
David Sparer
a6ef8e0b40 renamed class 2017-05-04 08:26:18 -06:00
David Sparer
467ceb89b1 moved some cred repo classes to a sub-namespace 2017-05-03 17:54:51 -06:00
David Sparer
873bc3f582 removed an unused class 2017-05-03 17:02:50 -06:00
David Sparer
9ebb37c524 added function to get a specific cred record by id 2017-05-03 16:07:01 -06:00
David Sparer
ccf4ba2269 signed putty 0.69 binary 2017-05-03 09:48:06 -06:00
Sean Kaim
e377a72f75 PuTTYNG 0.69 2017-05-03 11:40:52 -04:00
David Sparer
4ed806ea97 Merge branch 'develop' into improve_credential_manager 2017-05-02 12:43:41 -06:00
David Sparer
57ba991673 resolved issue with clone still setting con info parent 2017-05-02 12:41:46 -06:00
David Sparer
21a48ccab5 some minor cleanup 2017-05-02 12:25:02 -06:00
David Sparer
0f0c27ad09 reordered repo grid to put the Loaded column ahead of Source 2017-05-02 12:24:49 -06:00
David Sparer
40ed6450ff fixed some minor ui bugs where elements would not update right away 2017-05-02 12:23:41 -06:00
David Sparer
a0c0ea4c4c Merge branch 'develop' into improve_credential_manager 2017-05-02 10:15:06 -06:00
David Sparer
2dc413ca3a Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Resources/PuTTYNG.exe
#	mRemoteV1/UI/Controls/ConnectionContextMenu.cs
2017-05-02 10:14:33 -06:00
David Sparer
692b26622c Merge pull request #534 from mRemoteNG/530_fix_tree_node_entry_creation_on_exttool_run
530 fix tree node entry creation on exttool run
2017-05-02 10:00:30 -06:00
David Sparer
72a56d33d0 updated changelog 2017-05-02 09:08:49 -06:00
David Sparer
ce4bfc55c1 ConnectionInfo.Clone no longer sets the Parent property
this resolves undesirable tree nodes from being created
2017-05-02 08:49:04 -06:00
David Sparer
faba53fa5f Merge pull request #524 from mRemoteNG/improve_build_script_compatibility
Improve compatibility with different build environments
2017-05-02 07:57:02 -06:00
David Sparer
f0faec9def Merge pull request #528 from mRemoteNG/hotfix5
1.75 Hotfix5
2017-04-27 15:36:16 -06:00
David Sparer
e6ef28050c set release date in changelog for 1.75.7005 2017-04-27 15:20:07 -06:00
David Sparer
547ec3cb3a updated msi installer requirements
Replaced KB2923545 with KB2830477 (which is the REAL rdp 8.1 update)
2017-04-25 21:06:25 -06:00
Sean Kaim
5bfc67af4f Let's get some more clear validation 2017-04-21 17:20:23 -04:00
Sean Kaim
c72d9b544e just a slightly more informative message 2017-04-21 17:01:05 -04:00
David Sparer
cd34619acd added a few more known-good MS cert thumbprints 2017-04-21 14:52:40 -06:00
David Sparer
f091817d66 further reduce our search space
this also reduces the chance we will try to access a folder which we dont have permissions for
2017-04-21 14:42:33 -06:00
David Sparer
f2c65314b4 added a post build action to dump bin headers 2017-04-21 13:59:09 -06:00
David Sparer
a9fcdd3341 extracted a new script for finding a vstool (such as editbin.exe) 2017-04-21 12:13:54 -06:00
David Sparer
36a5cc7446 update changelog 2017-04-21 08:27:23 -06:00
David Sparer
fc0f278962 signed putty v0.68 exe 2017-04-20 09:27:14 -06:00
David Sparer
1f3db15892 Merge branch '442_fix_importing_putty_session_with_spaces_in_name' into hotfix5 2017-04-20 09:17:22 -06:00
David Sparer
e3e4c49427 changelog update 2017-04-20 09:16:31 -06:00
David Sparer
1520b8bf73 fixed bug where any sessions with spaces in the name would be filtered out
this fixes the bug, but the entire putty sessions loading component should be refactored heavily
2017-04-20 09:07:21 -06:00
David Sparer
c9e7f82905 fixed minor bug with adding a duplicate default session in some situations 2017-04-20 08:53:57 -06:00
Sean Kaim
14a1a665ef changelog 2017-04-19 12:43:28 -04:00
Sean Kaim
d2357fa779 changelog update 2017-04-19 12:38:54 -04:00
Sean Kaim
703178ddf1 Fix NPE when importing from the connection tree
Fixes #518
2017-04-19 12:37:56 -04:00
Sean Kaim
ec836e2e79 Fix NPE when importing from the connection tree
Fixes #518
2017-04-19 12:35:43 -04:00
Sean Kaim
4e9c5de16c changelog 2017-04-17 17:34:09 -04:00
Sean Kaim
2a677aaf02 changelog 2017-04-17 17:33:41 -04:00
Sean Kaim
2a141cd9b3 update changelog 2017-04-17 17:30:59 -04:00
Sean Kaim
3d1fcc35df Update credits.txt 2017-04-17 17:30:14 -04:00
Sean Kaim
e20d7afb72 update changelog 2017-04-17 17:29:32 -04:00
Sean Kaim
5ade8b208e Update credits.txt 2017-04-17 17:26:06 -04:00
Sean Kaim
9c5e4f7a7c Use all space on about page
Fixes #377
2017-04-17 16:46:59 -04:00
Sean Kaim
07e2bc3858 update change log 2017-04-17 11:56:47 -04:00
David Sparer
5c785ca1c6 moved default credential selection to the new credentials option page and created a cred records combobox 2017-04-14 18:01:43 -06:00
David Sparer
b389b20ca3 app now honors the prompt-unlock-on-startup setting 2017-04-14 17:25:48 -06:00
David Sparer
6f1d496a9e created a credentials options page and a setting for prompting repo unlock on startup 2017-04-14 17:23:36 -06:00
David Sparer
fe12cb345e merged branch 'develop' into 'improve_credential_manager'
# Conflicts:
#      CredentialManagerForm.cs
#      PasswordForm.cs
2017-04-14 16:56:02 -06:00
David Sparer
2607994c4c only save repo data if it is loaded 2017-04-14 16:35:27 -06:00
David Sparer
47a02afea6 updated some tests 2017-04-14 16:34:28 -06:00
David Sparer
a2e0a0c6f7 created factory for creating cred unlocker forms. unlocking repos from the manager now uses the unlocker form 2017-04-14 16:33:11 -06:00
Sean Kaim
f3b11d6f72 Fix for #434 - SysTray SafeHandle 2017-04-14 17:25:40 -04:00
Sean Kaim
edac8f764b Fix build issue (2015 doesn't like this) 2017-04-14 17:11:12 -04:00
David Sparer
4fa68e3bb0 when decrypting xml cred repos, we must be able to decrypt the auth header 2017-04-14 15:09:30 -06:00
Sean Kaim
69f310c02c PuTTYNG.exe 0.68 2017-04-14 17:00:22 -04:00
Sean Kaim
09789e163c PuTTYNG 0.68 2017-04-14 16:59:44 -04:00
Sean Kaim
84c8851ff8 check for nulls 2017-04-14 16:23:08 -04:00
Sean Kaim
95dacdd6da minor optimizations 2017-04-14 16:19:39 -04:00
Sean Kaim
3308f1146c load expanded data properly
and minor optimization
2017-04-14 15:50:20 -04:00
David Sparer
37b9e46e96 localized the repo unlocker form 2017-04-14 13:37:36 -06:00
Sean Kaim
8e8cf3df8d check for nulls 2017-04-14 15:34:55 -04:00
David Sparer
f4b188a9ac added some visual indicators when a repo is unlocked 2017-04-14 13:23:52 -06:00
David Sparer
35c886a59c added some error feedback on password error 2017-04-14 13:07:15 -06:00
Sean Kaim
26fdd924ef Increment version number
And make it match the hotfix number - you have no idea how much that was
annoying me...
2017-04-14 14:44:26 -04:00
Sean Kaim
e87a49796f Merge pull request #513 from mRemoteNG/483_make_datatable_serializer_safer
483 make datatable serializer safer
2017-04-14 14:41:56 -04:00
Sean Kaim
7e0b1e479c Merge branch 'develop' into 483_make_datatable_serializer_safer 2017-04-14 14:40:48 -04:00
David Sparer
1af2f7848e added some error handling when repo unlocking fails 2017-04-14 12:39:13 -06:00
Sean Kaim
ea3494f6e7 Merge pull request #512 from mRemoteNG/483_make_datatable_serializer_safer
483 make datatable serializer safer
2017-04-14 14:37:33 -04:00
David Sparer
0e7b93771e created a facade service for the credentials module to give other portions of the code a single api to use 2017-04-14 12:11:29 -06:00
David Sparer
ea5a21e487 added some more code around loading converted/harvested cred repo 2017-04-13 17:15:43 -06:00
David Sparer
dc72b87479 refactored repo unlocker select-next method 2017-04-13 12:29:48 -06:00
David Sparer
2f20acfa34 fixed some more empty string deserialization bugs 2017-04-12 17:50:55 -06:00
David Sparer
4869058f46 fixed exception that would occur if the repo list xml file did not exist 2017-04-12 17:37:42 -06:00
David Sparer
fa006afd0d changed the "skip" button to "close" 2017-04-12 17:37:14 -06:00
David Sparer
8e06255758 fixed tab focus ordering 2017-04-12 17:14:24 -06:00
David Sparer
ba57b25cd4 set password box text masking 2017-04-12 17:12:21 -06:00
David Sparer
4fa9d98171 repo unlocker form runs on app startup 2017-04-12 17:02:25 -06:00
David Sparer
6d19832d01 did a bit of code rearranging 2017-04-12 15:19:09 -06:00
David Sparer
bdaa059fa3 resolved object-disposed bug due to stale event subscription 2017-04-12 14:55:04 -06:00
Sean Kaim
f7bfc51735 check for nulls 2017-04-12 16:25:32 -04:00
Sean Kaim
998e156b21 deregister VNC event handler on disconnect. 2017-04-12 16:13:43 -04:00
Sean Kaim
491bf850e8 Merge pull request #506 from mRemoteNG/434_SafeHandle_Implmentation
434 safe handle implmentation
2017-04-12 15:14:01 -04:00
Sean Kaim
9bf53c6b25 fix & supress warning 2017-04-12 14:58:52 -04:00
Sean Kaim
e2fb49037a fix ruleset again... 2017-04-12 14:58:36 -04:00
David Sparer
3291c24c8c created SecureSerializer abstraction 2017-04-12 12:39:38 -06:00
Sean Kaim
f0bc375421 Merge remote-tracking branch 'refs/remotes/origin/develop' into 434_SafeHandle_Implmentation 2017-04-12 14:02:50 -04:00
Sean Kaim
e3c223dc0a Set code analysis rules to something reasonable 2017-04-12 13:48:39 -04:00
Sean Kaim
53c8b3b66d use statement bodys to allow building with VS2015 2017-04-12 13:40:36 -04:00
Sean Kaim
af5000b0f8 use statement bodys to allow building with VS2015 2017-04-12 13:15:32 -04:00
Sean Kaim
d5d4fdefc8 VncSharp Updates
* New VncSharp.dll built with a .NET 4 runtime target
* Minor code cleanup
* Avoid exceptions on VNC close/disconnect
2017-04-12 12:43:48 -04:00
gyuha
1caa0c6210 Add Korean translation 2017-04-12 16:23:04 +09:00
Sean Kaim
5b646617d1 code clean up 2017-04-11 16:24:34 -04:00
David Sparer
9f028d9104 added some safety checking for data table deserialization
added some tests for the data table deserializer
2017-04-09 17:36:56 -06:00
David Sparer
f40be696c7 made utility for creating test connection tree models 2017-04-09 17:35:52 -06:00
David Sparer
95a503a390 fix issue with setting up data table 2017-04-09 17:05:36 -06:00
David Sparer
88c51f4933 added some safety checks to the data table serialier 2017-04-09 16:57:56 -06:00
David Sparer
d63177f3c7 modified the cred repo interface
load now requires a decryption key
2017-04-06 14:56:19 -06:00
David Sparer
e9d41fd01b changed interface for loading credentials from a repo to get around issues with providing a key 2017-04-06 09:16:14 -06:00
David Sparer
224d2987db added some tests for the cred record loader 2017-04-06 08:54:10 -06:00
David Sparer
8439d6d3aa lots of reworked interfaces around cred repo serialization
- decryptors now expose a property that represents what key they will use for decrypt. this can be used by decorators to properly encapsulate password prompts
- added some basic acceptance tests around cred repos
- added some stubby implementations for IDataProvider and the key provider decorators
2017-04-03 20:09:47 -06:00
David Sparer
13b38955e6 removed duplicate interface 2017-04-03 13:51:22 -06:00
David Sparer
ae3fb9a2dd added iKeyProvider interface for dynamically retrieving keys/passwords
this will support the push towards constructor injection / decorators. this interface can act as a stand-in for what would otherwise be a static decryption key
2017-04-03 12:40:07 -06:00
David Sparer
9d78d769c4 began adding acceptance tests in specflow 2017-04-03 11:33:45 -06:00
David Sparer
e436a31a18 split up crypto provider factories and created an interface 2017-04-02 22:33:36 -06:00
David Sparer
929ade554c renamed method 2017-04-02 22:26:23 -06:00
David Sparer
d6c7066bfa changed the credential serializer lifecycle test to include password de/encryption 2017-04-02 21:29:52 -06:00
David Sparer
2387f183e9 added password decryption decorator 2017-04-02 21:28:50 -06:00
David Sparer
e8d645467f modified the interface of IDeserializer
now requires: TOut Deserialize(TIn serializedData)
2017-04-02 20:28:25 -06:00
David Sparer
a8e022cab4 added some lifecycle tests for the cred de/encrypt 2017-04-02 19:32:49 -06:00
David Sparer
579e8abda1 refactored tests for less duplication 2017-04-02 18:42:15 -06:00
David Sparer
4d44440e90 removed some more unnecessary args 2017-04-02 17:42:51 -06:00
David Sparer
709f914561 removed unnecessary arguments related to encrypting xml creds 2017-04-02 17:36:05 -06:00
David Sparer
0afa8e092e fix build 2017-04-02 17:25:03 -06:00
David Sparer
e886619b22 simplified the implementation of the xml cred deserializer
removed anything to do with encryption which will be handled by decorators
2017-04-02 17:22:42 -06:00
David Sparer
fa5f423bbd added decorator for encrypting credential xml files 2017-04-02 14:26:47 -06:00
David Sparer
bfbf5c70d5 reorganized more tests 2017-04-02 12:10:36 -06:00
David Sparer
2c19a442a7 moved a few tests to correct namespace 2017-04-02 11:56:56 -06:00
David Sparer
984ca69e8c reverted code that only compiles on vs2017 2017-03-31 20:26:24 -06:00
David Sparer
544d7a15d4 wired up data bindings for the cred repo unlocker 2017-03-31 17:56:31 -06:00
David Sparer
858f49d265 created a form for unlocking multiple credential repos 2017-03-31 15:44:25 -06:00
Jason Aquino
1b66d446f9 Added a BeginEdit() at the end of the AddNode function. 2017-03-31 11:18:24 -04:00
David Sparer
6e92fc0505 we dont need the tests playlist anymore 2017-03-28 11:35:05 -06:00
David Sparer
ea84403811 Merge branch 'develop' into improve_credential_manager 2017-03-28 11:30:52 -06:00
David Sparer
65a02795d6 fixed annoying exception when trying to ping empty hostname 2017-03-28 11:30:29 -06:00
David Sparer
c5549367eb Merge branch 'develop' into improve_credential_manager 2017-03-28 10:38:02 -06:00
David Sparer
6aa4a4d205 Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	InstallerProjects/Installer/Installer.wixproj
#	Tools/signfiles.ps1
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/mRemoteV1.csproj
2017-03-28 10:36:07 -06:00
David Sparer
9e20f1dd33 created script for publishing a github release that is currently in draft mode 2017-03-24 18:08:27 -06:00
David Sparer
16be19b5d3 split github functions to a library script 2017-03-24 18:07:23 -06:00
David Sparer
80ac0259b8 fix script name 2017-03-24 16:50:15 -06:00
David Sparer
9f7911923c updated the create_upg_check_files script to be parameterized for use within jenkins 2017-03-24 16:40:41 -06:00
David Sparer
686005071e Merge branch 'resolve_sql_deserialization_issue' 2017-03-24 15:26:28 -06:00
David Sparer
e16d31d605 fixed stupid transposition typo 2017-03-24 15:14:57 -06:00
David Sparer
8b201d22cb added authkey requirement to get-githubrelease in order to show drafts 2017-03-24 15:07:31 -06:00
David Sparer
0f6f8d43bd added cmdlet for retrieving a github release 2017-03-24 14:28:18 -06:00
David Sparer
8f171cddd9 fix content type of msi upload to github 2017-03-24 14:23:38 -06:00
David Sparer
c77c323f73 fix jenkinsfile variable 2017-03-24 14:22:17 -06:00
David Sparer
9e358309e4 Merge branch 'master' into resolve_sql_deserialization_issue 2017-03-24 12:14:26 -06:00
David Sparer
485438f38d Merge pull request #472 from mRemoteNG/fix_jenkinsfile_publish
fixed hard coded branch names in jenkinsfile_publish
2017-03-24 12:06:55 -06:00
David Sparer
fe26a60337 fixed hard coded branch names in jenkinsfile_publish 2017-03-24 12:04:52 -06:00
David Sparer
d2c2de4dd7 Merge branch 'master' into resolve_sql_deserialization_issue 2017-03-24 11:42:01 -06:00
David Sparer
d49d58f7f8 fixed parent reference update issue in mRemoteNGImporter 2017-03-24 11:40:28 -06:00
David Sparer
c0c5579027 Merge branch 'develop' into improve_credential_manager
# Conflicts:
#	mRemoteV1/UI/Forms/frmMain.cs
#	mRemoteV1/UI/Menu/ToolsMenu.cs
2017-03-23 17:25:16 -06:00
David Sparer
164d4fff8b Merge pull request #470 from mRemoteNG/pipeline_tests
Create jenkins pipeline script for release automation
2017-03-23 16:46:13 -06:00
Sean Kaim
6e7e4a129b Merge pull request #469 from mRemoteNG/vs2017_build
Vs2017 build
2017-03-23 18:01:06 -04:00
David Sparer
7726406674 added loggers to the test runners 2017-03-23 09:40:31 -06:00
David Sparer
ed38b39fec attempting to resolve bug with accessing correct key store 2017-03-23 08:59:09 -06:00
David Sparer
9188d4316e fix variable issue 2017-03-23 08:52:24 -06:00
David Sparer
cf374c6b8b added cert password as an auto-injected resource 2017-03-23 08:29:47 -06:00
David Sparer
82388dcbc3 added finger-printing to artifacting step 2017-03-23 08:26:18 -06:00
David Sparer
7a6a99e2b6 attempting to use the publishing jenkinsfile from scm 2017-03-23 08:08:29 -06:00
David Sparer
c383736834 more debug code 2017-03-22 17:06:30 -06:00
David Sparer
6e5e78df3b investigating certificate unlock issues 2017-03-22 17:03:38 -06:00
David Sparer
311bf1b641 fix issue with retrieving fuzzy file name 2017-03-22 16:48:38 -06:00
David Sparer
5c9933791c do base64 decoding in the script 2017-03-22 16:39:47 -06:00
David Sparer
039d4d11aa add a cast to help aleviate bat file issues 2017-03-22 16:33:12 -06:00
David Sparer
c0f2d2aa84 fixed bug 2017-03-22 16:27:28 -06:00
David Sparer
45099bfa07 try to get around weird type casting issue 2017-03-22 16:22:53 -06:00
David Sparer
695ae9d970 added script for publishing a release to github 2017-03-22 14:41:35 -06:00
David Sparer
21eb0064b1 enable code signing for installer 2017-03-22 08:45:25 -06:00
David Sparer
513fe402af signed the firefox binaries 2017-03-21 12:47:47 -06:00
David Sparer
b27e5754e8 fix arg passing 2017-03-21 12:07:49 -06:00
David Sparer
fa7231d77b added puttyng.exe to the sign files exclusion list 2017-03-21 11:52:52 -06:00
David Sparer
f5a30ecb33 added some more support for excluding files from signing 2017-03-21 11:42:50 -06:00
David Sparer
7f22289889 add previously signed puttyng binary 2017-03-21 11:21:12 -06:00
David Sparer
f80c39077a Added ability to exclude items from signing 2017-03-21 11:19:09 -06:00
David Sparer
75c60a1cc4 release certificate resources after we've used them 2017-03-21 11:16:05 -06:00
David Sparer
2cf38d6b7c removed some debug code 2017-03-21 11:15:16 -06:00
David Sparer
482c9c1574 added some temp debugging code 2017-03-21 11:10:33 -06:00
David Sparer
882e59a260 normalized the unit test output folder for the portable builds 2017-03-21 10:55:18 -06:00
David Sparer
7a036956b7 added some certificate checks to be more sure that the editbin we're using is legit 2017-03-21 10:29:48 -06:00
David Sparer
7520b20cf9 fixed bug in setting largeaddressaware 2017-03-21 10:28:49 -06:00
David Sparer
d47ccd75d5 Revert "removed unnecessary build configs for the unit tests project"
This reverts commit 56ff81a0ed.
2017-03-21 10:20:20 -06:00
David Sparer
56ff81a0ed removed unnecessary build configs for the unit tests project
im not even sure we need to distinguish between debug and portable builds, but ill leave it like this for now
2017-03-21 10:10:48 -06:00
David Sparer
8db76f5324 actually fix the sensitive param leakage 2017-03-18 17:25:30 -06:00
David Sparer
a9442ea06e added some error output for cert loading action 2017-03-18 16:30:03 -06:00
David Sparer
92bd0d3ea0 do not echo sensitive params 2017-03-18 16:29:44 -06:00
David Sparer
512d7322b2 request cert path and password as script parameters 2017-03-18 16:13:20 -06:00
David Sparer
45645c439f test of msbuild param passing 2017-03-18 15:13:23 -06:00
David Sparer
84ebb82cae the installer project now uses a powershell script for post build actions 2017-03-18 00:24:39 -06:00
David Sparer
576f6a3bd6 fixed issue with tidying release files 2017-03-18 00:24:07 -06:00
David Sparer
96df821eca changed signature failures from errors to warnings 2017-03-18 00:23:44 -06:00
David Sparer
8589778e92 split postbuild actions into powershell scripts 2017-03-17 23:53:59 -06:00
David Sparer
a8a7de9ee6 began converting all post build actions to powershell 2017-03-17 18:01:08 -06:00
David Sparer
1d99340425 remove quoting 2017-03-17 16:33:27 -06:00
David Sparer
a8cdfb56f3 single quote might be safer 2017-03-17 16:18:20 -06:00
David Sparer
0958cdaa2d ensure paths are quoted 2017-03-17 16:13:12 -06:00
David Sparer
ebfb3dd31e added a build config for the installer 2017-03-17 16:01:50 -06:00
Sean Kaim
2293a14a90 sysTray object safehandle implementation 2017-03-17 17:51:04 -04:00
Sean Kaim
3e664a7c2c refactor and fix compiler warning 2017-03-17 17:02:15 -04:00
David Sparer
30b37951b2 Merge branch 'update_signing_script' into develop 2017-03-17 09:20:28 -06:00
David Sparer
0d177d12fe added ability to exclude files for signing. cleaned up script 2017-03-17 09:17:10 -06:00
David Sparer
f7c8a570f8 signed puttyng.exe
we want each version of putty signed only once. this way the file hashes will be the same for each release
2017-03-17 09:16:28 -06:00
Sean Kaim
1814aa86b7 Merge pull request #458 from mRemoteNG/frmmain_menus_refactor_option2
Frmmain menus refactor option2
2017-03-16 13:25:00 -04:00
Sean Kaim
d0a5e658d1 reset dock for toolstrips, get File/View in dsgnr 2017-03-16 13:04:41 -04:00
Sean Kaim
2cbc1da286 Add quickconnect & ext tools to tsContainer 2017-03-16 12:47:15 -04:00
David Sparer
75d21231ae changed all menu classes to use property injection instead of ctor injection so we can use them at design time 2017-03-16 10:24:51 -06:00
Sean Kaim
f2d340a012 VS prompted to update supporte cultures
prompt occured while looking at project properties.
2017-03-15 17:55:02 -04:00
Sean Kaim
1b28111c6d update all nuget's target framework 2017-03-15 16:59:17 -04:00
Sean Kaim
4f4efcbc23 Merge remote-tracking branch 'refs/remotes/origin/develop' into vs2017_build
# Conflicts:
#	mRemoteV1/mRemoteV1.csproj
2017-03-15 16:28:21 -04:00
Sean Kaim
7006d18e93 .net 4.0 / log4net update 2017-03-15 16:24:32 -04:00
Sean Kaim
049959b567 Merge pull request #454 from mRemoteNG/Gecko_Insecure_Certs_v2
Gecko insecure certs v2
2017-03-15 11:43:47 -04:00
Sean Kaim
7cd8c0475e replace log4net with nuget (and latest version) 2017-03-14 16:24:41 -04:00
Sean Kaim
207accf21f update NSubstitute and NUnit packages 2017-03-14 16:17:25 -04:00
Sean Kaim
bd1e62abc1 localization message support, logging, formatting 2017-03-14 12:20:20 -04:00
Sean Kaim
d2e33ee423 I was doing some backwards thinking it appears... 2017-03-14 11:58:51 -04:00
Sean Kaim
f2934f8453 update message, change unhandled messages to false 2017-03-14 10:23:15 -04:00
Sean Kaim
20fb269828 Initial prompt for allow untrusted cert 2017-03-13 18:05:07 -04:00
Sean Kaim
cc13707fea Better error handling 2017-03-13 17:29:17 -04:00
Sean Kaim
a9db6a0473 More code cleanup 2017-03-13 17:26:52 -04:00
Sean Kaim
282ddb85c7 code clean up
Fix - CA2214: Do not call overridable methods in constructors

Relates to #249
2017-03-13 17:11:21 -04:00
David Sparer
3943b8753f split releases 2017-03-10 14:41:14 -07:00
David Sparer
9e26ea1866 bumped assembly version 2017-03-10 14:26:35 -07:00
David Sparer
8152a87514 bumped patch version 2017-03-10 14:20:23 -07:00
David Sparer
b28775c2c6 made sqlbulkcopy column-position independant 2017-03-10 14:18:55 -07:00
David Sparer
9b27200793 updated changelog and credits 2017-03-10 13:03:44 -07:00
David Sparer
0b7d7dac38 Merge pull request #429 from rheingold/develop_added_czech_loc
Develop added czech loc
2017-03-10 12:49:35 -07:00
David Sparer
3eb96ef765 set changelog and bumped patch version 2017-03-10 11:40:20 -07:00
David Sparer
8805584cbe updated sql code
- added upgrade script to bring db version up to 2.6
- refactored db upgrade code to a new class
- resolved an issue with db column naming for one of the new features
- updated new sql db creation script
2017-03-10 11:13:26 -07:00
rheingold
c2edf314c2 Updated czech language file for the new Microphone redirect feature. 2017-03-10 13:31:54 +01:00
Sean Kaim
2da2d54013 Build changes
* Upgrade to VS2017 solution (still compatible with VS2015 though)
* Require .NET 4.5
* Use latest log4net NuGet package (removed old copy)
2017-03-08 11:54:57 -05:00
David Sparer
f433b911a0 modified export form to handle the new credential management system 2017-03-06 15:04:48 -07:00
David Sparer
8b44815b70 fixed some issues with the CSV exporter 2017-03-06 14:46:36 -07:00
David Sparer
788f597a3f Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializer27Tests.cs
#	mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs
#	mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs
#	mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs
#	mRemoteV1/Config/Serializers/XmlConnectionNodeSerializer26.cs
#	mRemoteV1/Config/Serializers/XmlConnectionsDocumentCompiler.cs
#	mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
2017-03-06 13:21:56 -07:00
Sean Kaim
4ee70acf12 update to 1.75hotfix1 2017-03-06 13:26:15 -05:00
David Sparer
be5c66bd93 Merge pull request #438 from mRemoteNG/1_75_hotfixes
1.75 hotfix 1
2017-03-06 10:33:04 -07:00
David Sparer
5347e5a3aa implemented new versioning scheme. resolves #437 2017-03-06 10:27:25 -07:00
David Sparer
9b22254b6c update changelog 2017-03-06 10:24:41 -07:00
Sean Kaim
e5ccd27fd9 correct namespace and code clean up 2017-03-05 20:00:11 -05:00
Sean Kaim
d34ad62c8a fix possible (but highly unlikely) null assignment
found by ReSharper
2017-03-05 19:45:33 -05:00
Sean Kaim
0d0bee674d not used in portable version 2017-03-05 18:35:05 -05:00
Sean Kaim
279747d3a4 fix protection level / non-portable build failure 2017-03-05 15:01:56 -05:00
Sean Kaim
1e4bf38402 Fix copmlier warning CA1401 2017-03-05 14:54:02 -05:00
Sean Kaim
93d1163c5f fix complier warning CA1065
code cleanup/refactor
2017-03-05 14:44:03 -05:00
Sean Kaim
a3e436e42d convert big if-else to switch 2017-03-05 14:43:25 -05:00
Sean Kaim
e824886e19 remove redundant argument values
and other minor resharper cleanup
2017-03-03 16:54:02 -05:00
rheingold
9c724b31de Corrected also the app settings file 2017-03-03 12:16:47 +01:00
David Sparer
6a67e0ea8b resolved issue with export filter not being respected. resolves #427 2017-03-02 16:42:00 -07:00
David Sparer
7b118995ea updated changelog 2017-03-02 13:26:40 -07:00
David Sparer
35b4564644 turned off a feature of ObjectListView that was stealing focus from keepass autotype events. resolves #312 2017-03-02 13:02:51 -07:00
David Sparer
30df947365 resolved issue when clicking in connection tree white space #422 2017-03-02 08:55:10 -07:00
David Sparer
b1ec975612 Merge pull request #425 from mRemoteNG/1_75_release
1 75 release
2017-03-02 08:51:19 -07:00
David Sparer
a4851c8d81 added null guard when loading default conn info properties 2017-03-01 17:58:24 -07:00
David Sparer
469f48f473 Merge branch 'develop' into improve_credential_manager 2017-03-01 17:37:06 -07:00
David Sparer
c915ac4a74 Added null propagation check for single click handler. resolves #422 2017-03-01 17:35:13 -07:00
David Sparer
9b74c470da Merge branch 'v1_75_release_candidates' into develop
# Conflicts:
#	CHANGELOG.TXT
2017-03-01 17:14:48 -07:00
David Sparer
1034e434c4 updated changelog with release date 2017-03-01 16:23:40 -07:00
David Sparer
0a4935d193 fixed a brittle (and currently failing) test 2017-03-01 15:56:39 -07:00
rheingold
5995f6fbef Added czech localization file 2017-02-21 00:28:24 +01:00
Sean Kaim
0ca15a6c65 code clean up 2017-02-16 14:18:36 -05:00
David Sparer
72193833a9 removed the "export" flag from the confCons file - it is no longer necessary for us to differentiate between normal and exported confcons files 2017-02-16 09:21:38 -07:00
David Sparer
e40ffabe4a Merge branch 'v1_75_release_candidates' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/App/Export.cs
2017-02-16 08:51:43 -07:00
David Sparer
f419bff545 #394 resolved bug where export flag would not get set on the exported connections file 2017-02-16 08:29:31 -07:00
Sean Kaim
69eec0135e Update to SHA512 file hashes 2017-02-15 15:21:18 -05:00
David Sparer
a267e32e0e made the iserializer and ideserializer interfaces more generic 2017-02-14 15:52:20 -07:00
David Sparer
92a5249e45 renamed test class 2017-02-14 15:51:54 -07:00
David Sparer
fbfe664438 replaced duplicate code 2017-02-14 14:58:09 -07:00
David Sparer
b52b5b4287 renamed class 2017-02-14 14:53:20 -07:00
David Sparer
ba3513341a moved some source files into folders 2017-02-14 14:50:12 -07:00
David Sparer
de06ce909e fixed eventing bug when opening the cred manager multiple times 2017-02-14 13:26:16 -07:00
David Sparer
fa29b746e7 moved the IsLoaded property from the RepoConfig to the Repo since this is a state flag 2017-02-14 13:23:30 -07:00
David Sparer
5527ebf085 added an Auth attribute to the xml cred file to get around an issue when the file contains no passwords 2017-02-14 13:21:54 -07:00
David Sparer
cca2052b15 added ability to load/unload a repo 2017-02-14 10:36:40 -07:00
David Sparer
ec0338bb30 fixed small bug with the PasswordForm when it gets loaded multiple times 2017-02-14 10:36:22 -07:00
David Sparer
f40a1b6de8 added support for authenticating to a repo on load 2017-02-14 09:33:42 -07:00
David Sparer
7110337dcd added an interface for requesting a password from the user 2017-02-14 09:28:14 -07:00
David Sparer
cbfe850351 added a flag to set whether a repo is loaded or not 2017-02-14 08:43:45 -07:00
David Sparer
d6d768029b finished linking cred update events together 2017-02-13 15:59:58 -07:00
David Sparer
d003e086bb created a class and event type for handling collections that need to raise events for collection changes and child updates
this is for cases where you would like to have INotifyCollectionChanged and INotifyPropertyChanged implemented, but dont need the level of detail that those types provide.
2017-02-13 13:56:58 -07:00
David Sparer
a3b66ec456 defined new event args classes 2017-02-13 12:05:55 -07:00
David Sparer
1c3d41c03b cleanup 2017-02-11 20:42:20 -07:00
David Sparer
56b1751c3f set default page when opening up cred manager form 2017-02-11 20:41:20 -07:00
David Sparer
93724063e2 cleanup 2017-02-11 20:32:55 -07:00
David Sparer
72b8cd2ac8 credential lists are now loaded and saved from the provider list 2017-02-11 20:30:39 -07:00
David Sparer
e5b22255e9 added a Title property to cred repos to allow creating a friendly name 2017-02-11 19:12:35 -07:00
David Sparer
a4639e295d created page for selecting a credential provider for a new credential 2017-02-11 18:42:36 -07:00
David Sparer
8dc4246c98 renamed page 2017-02-11 18:00:45 -07:00
David Sparer
a187832cdc moved the repository list view to a new class 2017-02-11 17:58:36 -07:00
David Sparer
d08a46a573 fix 2017-02-11 17:57:49 -07:00
David Sparer
e86fcc9636 fix 2017-02-11 17:35:59 -07:00
David Sparer
1f60405d43 began converting credential editor to a page 2017-02-11 17:32:22 -07:00
David Sparer
8f568cc6ac loading creds 2017-02-11 17:31:01 -07:00
David Sparer
4d61820a78 made the treenode click handler generic 2017-02-11 17:25:13 -07:00
David Sparer
b6d49233fb removed CredentialManager in favor of the cred repo list 2017-02-11 16:23:44 -07:00
David Sparer
beac6be7db fixed some tests 2017-02-11 16:23:14 -07:00
David Sparer
b99931df95 started converting everything to use the cred repo list instead of the cred manager 2017-02-11 15:14:55 -07:00
David Sparer
00ba661456 refactored the credential repository to project all loaded items to a locally managed list 2017-02-11 14:39:08 -07:00
David Sparer
2ffde30340 fixed bug where config changes were automatically being accepted and saved 2017-02-11 13:35:29 -07:00
David Sparer
f97a84d2df repository config updates now trigger saves 2017-02-11 13:30:38 -07:00
David Sparer
c5bb10db4c fixed serialization bug 2017-02-11 13:06:54 -07:00
David Sparer
acf4d2f740 we can now save the cred repo list 2017-02-11 12:50:44 -07:00
David Sparer
1c2f6913bb set the cred repo list file path to a non-test value 2017-02-11 12:41:59 -07:00
David Sparer
31be8bee95 dont add cred providers with a duplicate guid 2017-02-11 12:38:33 -07:00
David Sparer
2a113efe5c we can now load the cred repo list 2017-02-11 12:35:02 -07:00
David Sparer
801791b4df renamed cred repo config property "Name" to "TypeName" 2017-02-11 12:18:19 -07:00
David Sparer
643a2ee739 created classes for deserializing a list of cred providers 2017-02-11 12:03:43 -07:00
David Sparer
cd9c97ffc0 password loaded when editing cred repo 2017-02-11 11:30:41 -07:00
David Sparer
c105319b08 added double click support for editing cred repos 2017-02-11 11:17:03 -07:00
David Sparer
d98fa381e8 edit button only active when we have a selected repo 2017-02-11 11:12:17 -07:00
David Sparer
1f39b43869 resolved bug where editing a cred repo would also create a new instance of it 2017-02-11 11:08:37 -07:00
David Sparer
3aeb6a662a we can now edit cred repos 2017-02-11 11:05:07 -07:00
David Sparer
d7c176d4fd resolved small bug in the xml cred repo editor page validation 2017-02-11 11:03:30 -07:00
David Sparer
cac1df7a66 fixed double-click support for selecting cred repo type 2017-02-11 10:54:31 -07:00
David Sparer
aafa383f56 refactored the pagesequence class to be event-based. sequenced pages no longer need a reference to the sequence controller 2017-02-11 10:49:19 -07:00
David Sparer
af6e2abdb2 added another convenience ctor for pagesequence to allow variable arity 2017-02-11 08:33:30 -07:00
David Sparer
05430f7e47 added convenience ctor to the pagesequence class 2017-02-11 08:28:06 -07:00
David Sparer
2daf4cf46a xml cred repo editor page now validates contents before allowing to confirm submission 2017-02-11 08:20:10 -07:00
David Sparer
52333beabe added support for setting the password-mask char for the new-password control 2017-02-11 08:10:26 -07:00
David Sparer
49d1e0622b removed unnecessary classes 2017-02-11 07:48:31 -07:00
David Sparer
eebd87c6b7 created a new class to handle sequences of pages that support next and previous page navigation 2017-02-11 07:44:06 -07:00
David Sparer
c1b6b30144 added ability to remove cred repositories 2017-02-10 17:05:35 -07:00
David Sparer
7703986c9e we can now view currently added credential repositories 2017-02-10 17:00:30 -07:00
David Sparer
6c272d9336 renamed ICredentialProviderCatalog to ICredentialRepositoryList 2017-02-10 16:41:43 -07:00
David Sparer
73b0416dbe we now use a single credential provider catalog throughout the app 2017-02-10 16:37:10 -07:00
David Sparer
c7760b0ed9 creating new xml repositories is mostly complete 2017-02-10 16:32:35 -07:00
David Sparer
c0db476f80 created a new-password control 2017-02-10 16:32:11 -07:00
David Sparer
7999c29b51 began writing logic for creating a new repo from the editor page 2017-02-10 14:52:20 -07:00
David Sparer
1d111a252e added support for double clicking a repo item to begin setup 2017-02-10 14:31:10 -07:00
David Sparer
93d085e23e we can now go back from the repo type selector page 2017-02-10 14:15:14 -07:00
David Sparer
67e0e34f40 clicking "Add" now advances to the repo selection page 2017-02-10 14:05:22 -07:00
David Sparer
098e61295c Renamed CredentialSourcePage to CredentialRepositoryPage 2017-02-10 13:53:18 -07:00
David Sparer
1d2666a343 we can now create cred repo editor pages for selected repo type 2017-02-10 13:03:11 -07:00
David Sparer
b8c2c86c59 renamed ICredentialProvider to ICredentialRepository and split up data/behavior to separate classes 2017-02-10 12:17:12 -07:00
David Sparer
edf0342404 began creating a page for adding a new credential repository 2017-02-10 09:51:16 -07:00
David Sparer
dc6815045c started splitting creential manager gui into a multipage control 2017-02-08 16:51:59 -07:00
David Sparer
23ed1cf5e5 bumped assembly version to 1.76 2017-02-08 09:26:06 -07:00
David Sparer
97715f260f removed old VB config file that is not used 2017-02-08 09:23:35 -07:00
David Sparer
87411ee952 Merge branch 'cleanup_frmMain' into develop 2017-02-08 09:16:19 -07:00
David Sparer
d0bbf1e4ad resolved a toolstrip loading bug due to the main menu being initialized too late 2017-02-08 09:11:50 -07:00
David Sparer
3bbd088733 some rename/cleanup 2017-02-08 09:11:15 -07:00
David Sparer
d96dd5fe82 factored out some logic from frmmain wndproc to a new class 2017-02-08 09:10:54 -07:00
David Sparer
6028e3f299 added a summary msg to one of the native method constants 2017-02-08 09:09:44 -07:00
David Sparer
37bfce1905 moved external tools tool strip to a new class 2017-02-07 16:00:40 -07:00
David Sparer
5993b30ccf moved the quick connect toolstrip to its own class 2017-02-07 15:17:19 -07:00
David Sparer
2fc6c4c0bc removed unnecessary instance var 2017-02-07 14:40:07 -07:00
David Sparer
0195a6bab5 refactored info menu to new class 2017-02-07 14:33:00 -07:00
David Sparer
ccb35bdc5a factored out tools menu to new class 2017-02-07 10:33:34 -07:00
David Sparer
bfadfaf261 moved main and view menus to new classes. they will be further split up to their component parts 2017-02-07 10:14:06 -07:00
David Sparer
d0180a6633 refactored a class out of frm main 2017-02-07 09:13:28 -07:00
David Sparer
afbc580ae6 refactored class out of frmmain 2017-02-06 15:30:59 -07:00
David Sparer
2b2e01f3d1 minor renames (resharper) 2017-02-06 15:26:47 -07:00
David Sparer
529f1ca835 renamed frmMain to FrmMain (resharper) 2017-02-06 15:19:52 -07:00
David Sparer
ee7993b918 at least contained the mess of loading creds/cons to a new class until it can be redesigned 2017-02-06 15:16:06 -07:00
David Sparer
8239a40c72 moved message collector setup 2017-02-06 15:03:36 -07:00
David Sparer
2c9f9a36c5 cleanup 2017-02-06 15:01:49 -07:00
David Sparer
307169fcc3 Merge branch 'develop' into 'cleanup_frmMain' 2017-02-06 15:00:35 -07:00
David Sparer
5ee69d24f7 removed unneeded tests 2017-02-06 14:40:40 -07:00
David Sparer
077106b71b removed unit test for now - will need to rework how log4net is integrated to make it less coupled 2017-02-06 14:38:36 -07:00
David Sparer
141e660d91 Merge branch 'v1_76_temporary_branch' into develop
# Conflicts:
#	CHANGELOG.TXT
2017-02-06 14:35:23 -07:00
David Sparer
be73699013 Merge branch 'message_collector_tweaks' into v1_76_temporary_branch 2017-02-06 14:32:26 -07:00
David Sparer
65e3649999 added changelog entry 2017-02-06 14:31:20 -07:00
David Sparer
994f1ae7ed added option to always log to the mremoteng directory 2017-02-06 14:28:49 -07:00
David Sparer
548e633b72 log file path updates no longer require app restart to take effect 2017-02-06 13:43:10 -07:00
David Sparer
87b98e7949 resolved bug with settings file upgrade overwriting new data 2017-02-06 13:42:11 -07:00
David Sparer
5692baf1f3 set the message icon for debug msgs 2017-02-06 11:29:25 -07:00
David Sparer
8a10a2aa18 split notification message list item creation to a new class 2017-02-06 11:29:07 -07:00
David Sparer
797bbf8870 set the new notifications page icon 2017-02-06 10:14:48 -07:00
David Sparer
edb3f9e885 some cleanup 2017-02-06 10:08:08 -07:00
David Sparer
a0008e165b created classes that tie the logging options to the settings file 2017-02-06 10:01:10 -07:00
David Sparer
3d55b033d6 created tests for MessageTypeFilterDecorator 2017-02-06 09:36:45 -07:00
David Sparer
93fb0efc67 created filter for messages with the OnlyLog flag 2017-02-06 09:22:24 -07:00
David Sparer
b7585ef02c moved the notification panel focuser to a new decorator class 2017-02-06 09:05:33 -07:00
David Sparer
fce07288e9 fix 2017-02-06 08:52:03 -07:00
David Sparer
3ccfdb2e97 pulled the message type filtering options out into a new decorator 2017-02-06 08:51:44 -07:00
David Sparer
5840e2ba07 moved all message filter options to a new interface 2017-02-06 08:26:29 -07:00
David Sparer
4daba88970 renamed the message type filter options 2017-02-06 08:24:48 -07:00
David Sparer
3180feb874 renamed IMessageWriter.Print to Write 2017-02-06 08:20:34 -07:00
David Sparer
17a430f31f removed WriteMessages from the IMessageWriter interface. it was unneeded 2017-02-06 08:14:39 -07:00
David Sparer
20d330f0f1 split up startup arg parsing to a new class and cleaned up the related code. added some debug msgs 2017-02-03 16:20:08 -07:00
David Sparer
27d0467e08 added a message collection function for adding multiple msgs at once. only one notification will be raised for a batch of msgs 2017-02-03 15:02:16 -07:00
David Sparer
5437967218 changed the message ctor to remove the datetime requirement. it will also be DateTime.Now 2017-02-03 15:01:07 -07:00
David Sparer
1228f0572d replaced calls to the log4net logger with calls to messagecollector since it is now safe to do so 2017-02-03 14:23:55 -07:00
David Sparer
9cf44c3050 minor cleanup 2017-02-03 14:07:07 -07:00
David Sparer
aa9b641787 renamed Messages options page to Notifications 2017-02-03 14:06:38 -07:00
David Sparer
2e3c4f33a2 removed setting that is no longer needed 2017-02-03 12:28:07 -07:00
David Sparer
39ef6ebdbf localized all message page text 2017-02-03 12:18:33 -07:00
David Sparer
4d08c22204 removed settings for the debug console message writer. it will only be included in debug builds 2017-02-03 11:55:48 -07:00
David Sparer
4041dd3ad5 localized the choose-log-path string 2017-02-03 11:55:14 -07:00
David Sparer
a38de8198f we can now open the log file from the options page 2017-02-03 11:47:03 -07:00
David Sparer
3369374e43 renamed MessageCollector2 to MessageCollector 2017-02-03 11:41:10 -07:00
David Sparer
d74631bbdb removed the old message collector 2017-02-03 11:39:52 -07:00
David Sparer
be8c392562 rearranged app startup to ensure the message collector is created as early in the process as possible 2017-02-03 11:37:25 -07:00
David Sparer
f564efb4d6 more cleanup of the Windows class 2017-02-03 11:07:40 -07:00
David Sparer
dee9e3c326 removed references to Windows.UpdatePanel 2017-02-03 10:54:02 -07:00
David Sparer
4ff8d7d68e removed references to Windows.ScreenshotPanel 2017-02-03 10:48:01 -07:00
David Sparer
789e467573 remove references to Windows.TreePanel 2017-02-03 10:43:42 -07:00
David Sparer
745b85a3ac removed references to Windows.ErrorsPanel 2017-02-03 10:39:23 -07:00
David Sparer
4f84c2cb01 removed all references to Window.ConfigPanel - we dont need it 2017-02-03 10:34:07 -07:00
David Sparer
83414acb1d fix tests 2017-02-03 10:32:30 -07:00
David Sparer
356effc6a9 split startup data logging to a new class and required a messagecollector to be passed in 2017-02-03 10:13:37 -07:00
David Sparer
88ec186b98 can restore log location to default 2017-02-03 10:10:33 -07:00
David Sparer
530615f049 resolve logging bug where cmdline args arent shown 2017-02-03 09:32:43 -07:00
David Sparer
afec12822f can now select log file path 2017-02-03 09:12:39 -07:00
David Sparer
f117620ead wired up the logging level selection 2017-02-03 08:39:25 -07:00
David Sparer
1c9f34ba1b the notification panel section of the messages page is now working 2017-02-03 08:32:31 -07:00
David Sparer
c26cd9876a the notification panel msg writer now respects the focus-on settings 2017-02-03 08:31:19 -07:00
David Sparer
32f7d37768 Moved message collector/writer setup to a separate class 2017-02-03 07:23:35 -07:00
David Sparer
3873e680e4 fix 2017-02-03 07:13:14 -07:00
David Sparer
ddc8a9a286 one more minor rename 2017-02-03 07:11:33 -07:00
David Sparer
399bde7588 renamed some classes and namespace around the message writers 2017-02-03 07:10:41 -07:00
David Sparer
5e51febee8 message writer settings will be saved in the settings file like all others. no reason to roll my own persistence strategy 2017-02-03 07:02:14 -07:00
David Sparer
6e8200a380 started building new options page for messages 2017-02-02 20:22:22 -07:00
David Sparer
fc9961b2de removed setting that will no longer be needed 2017-02-02 20:20:14 -07:00
David Sparer
d750e3e996 minor cleanup 2017-02-02 20:17:33 -07:00
David Sparer
1cd15c6f7c now loading and saving settings for the message printers 2017-02-02 20:17:15 -07:00
David Sparer
5c47acbcc3 added messageprinter setting de/serializer 2017-02-02 20:15:31 -07:00
David Sparer
1363c2893b modified the imessageprinter interface to include booleans to filter message types 2017-02-02 20:14:20 -07:00
David Sparer
cbc426014b the app now uses the newer message collector 2017-02-02 14:22:06 -07:00
David Sparer
17178e3ae3 added an extra space after the message class in the logs so that error and debug msgs have a space after them 2017-02-02 13:53:42 -07:00
David Sparer
b9299d90df modified the log4net logger to log debug level messages by default. we will futher restrict logging levels based on user preference within the app 2017-02-02 13:52:37 -07:00
David Sparer
aff5b46c5e there were only 2 messages using the Report type. Move those to use the Information type and renamed Report to Debug 2017-02-02 13:51:16 -07:00
David Sparer
2e83f81672 created a popup message printer 2017-02-02 13:31:34 -07:00
David Sparer
e352cc76cf Created a message printer for sending messages to the errors and infos window 2017-02-02 13:06:45 -07:00
David Sparer
cab2ee4fa4 cleaned up the error and info window class 2017-02-02 12:43:47 -07:00
David Sparer
bdfc839080 created a message printer adapter for the log4net logger 2017-02-02 12:08:39 -07:00
David Sparer
6beb21349b created a message printer for writing to the debug stream 2017-02-02 12:07:51 -07:00
David Sparer
b2240e8f1a created a replacement message collector that has no dependency on whatever printers may want to show its messages 2017-02-02 12:07:08 -07:00
David Sparer
32f43d46b5 created an interface for message printers 2017-02-02 12:05:32 -07:00
David Sparer
803d689bd3 renamed some imessage properties 2017-02-02 11:16:01 -07:00
David Sparer
66255bf443 created an interface for the message type 2017-02-02 10:54:11 -07:00
David Sparer
338a486513 resharper cleanup of messagecollector 2017-02-02 10:52:22 -07:00
David Sparer
b543343045 Merge branch 'improve_password_creation_classes' into v1_76_temporary_branch 2017-02-02 08:55:54 -07:00
David Sparer
28c60332e8 moved orchestration of cred and con loading to a separate function 2017-01-31 08:58:30 -07:00
David Sparer
9ddc45721f extracted some classes from Startup 2017-01-30 12:12:16 -07:00
David Sparer
2849baf857 Merge branch '378_ssh_connection_launched_on_single_click' into v1_75_release_candidates 2017-01-30 11:37:10 -07:00
David Sparer
768fdcd0e4 using MouseClick events rather than the OLV CellClick events. this should resolve #378 2017-01-30 11:33:27 -07:00
David Sparer
5280ef32cd created a has-special-characters constraint 2017-01-28 14:10:04 -07:00
David Sparer
59a7e4179b minor test fix 2017-01-28 13:40:55 -07:00
David Sparer
bd2054e5a4 created a has-upper-case constraint 2017-01-28 13:39:51 -07:00
David Sparer
69be19c02b created a has-lower-case constraint 2017-01-28 13:35:28 -07:00
David Sparer
fcffeb5734 created a password-has-numbers constraint 2017-01-28 13:15:43 -07:00
David Sparer
11b67208f4 created password length constraint 2017-01-28 12:42:46 -07:00
David Sparer
03e8342c90 Merge branch 'Create_basic_infrastructure_for_supporting_credential_manager' into v1_76_temporary_branch 2017-01-28 11:59:13 -07:00
David Sparer
fcd070066c Merge branch 'v1_76_temporary_branch' into Create_basic_infrastructure_for_supporting_credential_manager
# Conflicts:
#	mRemoteV1/Config/Settings/SettingsSaver.cs
#	mRemoteV1/Properties/Settings.Designer.cs
#	mRemoteV1/Properties/Settings.settings
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/app.config
2017-01-28 11:57:12 -07:00
David Sparer
9b38308ad1 set date for rc1 build in changelog 2017-01-27 15:28:36 -07:00
Sean Kaim
5d79ad527e Merge remote-tracking branch 'refs/remotes/origin/develop' into v1_76_temporary_branch 2017-01-27 17:15:47 -05:00
Sean Kaim
afcdf96e5c changelog / credits update 2017-01-27 17:13:50 -05:00
Sean Kaim
ffc8b5619e Merge pull request #373 from mRemoteNG/cleanup_converts
Cleanup converts
2017-01-27 17:04:37 -05:00
David Sparer
3e40b08525 Merge pull request #348 from countchappy/develop
RDP Minutes to Idle Timeout - users cant enter invalid timeout values
2017-01-27 14:58:05 -07:00
David Sparer
9be49b3738 harvested credentials now start with a title composed like "username\domain" 2017-01-27 13:58:04 -07:00
David Sparer
724488911e credentials are now harvested for confCons versions 2.6 and older 2017-01-27 13:53:23 -07:00
David Sparer
8ac0bf5865 credential harvester now maps the harvested credentials to the IDs of the connectionInfos that were using them 2017-01-27 13:50:57 -07:00
David Sparer
57c1c38d52 fixed minor bug with PasswordAuthenticator 2017-01-27 13:47:24 -07:00
countchappy
237cf037be RDP Minutes to Idle Timeout - Update 5
Incorrect values entered in the Minutes to Idle Timout setting will be
corrected to fit in the range of 0-240, rather than be truncated.
2017-01-27 14:56:40 -05:00
David Sparer
8b98181752 created a helper to ensure that all connectioninfo objects in an xdoc have IDs 2017-01-27 11:01:42 -07:00
David Sparer
21993a4862 made a few calls to CredentialRecord safer 2017-01-27 09:46:55 -07:00
David Sparer
6e8e1ad74b putty now uses credential record 2017-01-27 09:42:04 -07:00
David Sparer
03da5b3cf1 VNC now uses credential record 2017-01-27 09:31:24 -07:00
David Sparer
f348ef1f96 ICA now uses new credential record 2017-01-27 09:29:42 -07:00
David Sparer
193cebed81 RDP connections now use the new credential record 2017-01-27 09:27:01 -07:00
David Sparer
f2f6156bd0 minor cleanup 2017-01-27 09:17:26 -07:00
David Sparer
0d7c3838f6 split connection serializer for confcons 2.6 and 2.7 into different classes
resolved a bunch of test failures
2017-01-27 09:15:07 -07:00
David Sparer
105e3360be informational message will display when a matching credential cannot be found for a connectioninfo 2017-01-27 07:51:27 -07:00
David Sparer
23dd3b4f41 minor cleanup 2017-01-26 16:12:09 -07:00
David Sparer
bc225f9656 saving and loading default credential now works 2017-01-26 16:11:56 -07:00
David Sparer
dd9f76f73b removed inherit username/domain/password from showing in the property grid 2017-01-26 14:41:43 -07:00
David Sparer
47ae8b903e hide credentialrecord in property grid if its inherited or if we're viewing the rootnode 2017-01-26 14:38:27 -07:00
David Sparer
3dcfd3738d connectionrecord and its inheritance are now serialized and deserialized 2017-01-26 14:32:07 -07:00
David Sparer
8993794a88 created a test for the credential deletion confirmer 2017-01-26 09:58:01 -07:00
David Sparer
a530e7e70a simplified a few tests 2017-01-26 09:45:28 -07:00
David Sparer
4791b8e53c removed unused class 2017-01-26 09:41:45 -07:00
David Sparer
6ddd19ac54 added a deletion confirmer to the credential manager 2017-01-26 09:41:15 -07:00
David Sparer
6a871e73e0 modified the interface for the IConfirmer to be generic 2017-01-26 09:38:55 -07:00
David Sparer
7ba106d97b credentials are now saved when cred property values change from any source 2017-01-26 09:05:11 -07:00
David Sparer
69c021cc54 credentials save when the credential manager raises its changed event 2017-01-26 08:43:32 -07:00
David Sparer
7a63bb395f resolved failing tests 2017-01-26 08:33:28 -07:00
David Sparer
1931695b03 Merge branch 'develop' into Create_basic_infrastructure_for_supporting_credential_manager 2017-01-26 08:19:10 -07:00
David Sparer
b953240966 created some ui elements to make selection credentials from the config window easier 2017-01-26 08:18:00 -07:00
David Sparer
e1c06af3b2 began switching code over to using the newer connectioninfo interface
created a credential manager class to help manage the list of current credentials
2017-01-26 08:17:11 -07:00
Sean Kaim
1cc7bfcb2d Merge remote-tracking branch 'refs/remotes/origin/develop' into cleanup_converts 2017-01-25 17:50:42 -05:00
Sean Kaim
2445c74638 code clean up and minor refactoring 2017-01-25 17:50:10 -05:00
Sean Kaim
6a69ed48a9 Merge pull request #372 from mRemoteNG/serialize_connectioninfo_id
Serialize connectioninfo ID
2017-01-25 17:01:29 -05:00
David Sparer
714c7eb8d1 refactored to remove a static reference to the ConnectionInfo base class 2017-01-25 14:44:24 -07:00
David Sparer
6790287470 renamed AbstractConnectionInfoData to AbstractLegacyConnectionRecord and marked it as obsolete 2017-01-25 14:43:42 -07:00
David Sparer
217693937f connectioninfo id is now serialized to the confCons file 2017-01-25 14:02:20 -07:00
David Sparer
94a8a5c753 credential harvester now only returns unique credentials sets (based on domain & username) 2017-01-25 13:19:02 -07:00
Sean Kaim
22300577cf Merge pull request #371 from jcefoli/develop
Quick fix for #369 (Reset Layout Ignores Notification Pane)
2017-01-25 15:06:39 -05:00
Joe Cefoli
6a07f4e731 Quick fix for #369 2017-01-25 14:02:16 -05:00
David Sparer
63ace60dcc Merge pull request #367 from mRemoteNG/295_default_con_values_not_saved
resolved issue where saving default con properties would fail
2017-01-25 09:58:50 -07:00
David Sparer
601951582d resolved issue where saving default con properties would fail
enum, int, bool -> string was throwing an exception. now using a simpler strategy for type conversion
resolves #295
2017-01-25 09:54:54 -07:00
David Sparer
ca4d22602f began creating credential harvester to help split credentials from confCons v2.6 to confCreds v1.0 2017-01-25 08:16:29 -07:00
Sean Kaim
42774a6227 code cleanup 2017-01-24 21:07:25 -05:00
Sean Kaim
7f65bfeebb remove unecessary converts 2017-01-24 21:05:33 -05:00
Sean Kaim
88178a6b6b remove unnecessary converts 2017-01-24 21:04:20 -05:00
Sean Kaim
3f9ca1454e removed unnecessary converts and code clean up 2017-01-24 21:02:19 -05:00
Sean Kaim
9a3f1bd5cf remove unecessary convert 2017-01-24 20:58:43 -05:00
Sean Kaim
0186254f74 remove unecessary converts 2017-01-24 20:56:22 -05:00
Sean Kaim
6dc432e6a9 remove unecessary converts and code clean up 2017-01-24 20:51:24 -05:00
Sean Kaim
01db774e05 remove unecessary convert & code clean up 2017-01-24 20:48:37 -05:00
Sean Kaim
aaef3dc19c remove unecessary convert 2017-01-24 20:45:58 -05:00
Sean Kaim
bb8009363d remove unnecessary converts 2017-01-24 20:45:17 -05:00
Sean Kaim
5fd403cf08 remove unecessary convert 2017-01-24 20:42:26 -05:00
Sean Kaim
168c77eac5 remove unnecessary parens 2017-01-24 20:40:46 -05:00
Sean Kaim
bf865cbe5d remove unecessary convert 2017-01-24 20:38:38 -05:00
Sean Kaim
3e3029461b remove unnecesary convert 2017-01-24 20:35:51 -05:00
Sean Kaim
c750e0a64e remove unecessary convert 2017-01-24 20:34:32 -05:00
Sean Kaim
fc2662c402 remove unnecessary convert 2017-01-24 20:33:04 -05:00
Sean Kaim
29dad51ff7 Remove unneccessary Converts 2017-01-24 20:28:29 -05:00
Sean Kaim
9250dde5b0 Merge pull request #364 from mRemoteNG/176_scheduled_updates
1.76 scheduled updates to 1.75
2017-01-24 20:04:47 -05:00
Sean Kaim
29ca72d8ca Change log update 2017-01-24 20:03:20 -05:00
Sean Kaim
87c89a0de5 reformat code 2017-01-24 19:55:18 -05:00
Sean Kaim
73f72e39d3 Fix incorrect cast & code clean up
Fixes #362
2017-01-24 19:49:22 -05:00
Sean Kaim
e00ba62606 Refactored Tools.Controls.cs
Fixes #363
2017-01-24 17:52:15 -05:00
Sean Kaim
48d53cecce Rename Tab dialog - populate original name
Fixes #258
2017-01-24 17:36:41 -05:00
David Sparer
da44bba3fe created a builder class for creating a crypto provider from an xml element 2017-01-24 13:35:03 -07:00
David Sparer
b55e42ba78 added cue banner support for text boxes 2017-01-24 09:34:38 -07:00
David Sparer
233a9843d7 password field now uses the secure text box implementation 2017-01-24 09:16:16 -07:00
David Sparer
6184087456 added secure text box 2017-01-24 09:09:25 -07:00
David Sparer
237ad2fa3c made the add/remove buttons a bit larger to accomodate for potentially longer localized words 2017-01-24 08:41:17 -07:00
David Sparer
b8037c04d0 created some localization strings for the credential editor 2017-01-24 08:37:31 -07:00
David Sparer
cdb9c2eddb added more localization strings for the credential manager 2017-01-24 08:28:40 -07:00
David Sparer
8a284f0767 removed unnecessary class 2017-01-24 08:15:30 -07:00
David Sparer
83a57b08ab prevented annoying 'ding' sound on key press 2017-01-23 16:07:56 -07:00
David Sparer
d1a251ff6c cred manager now recognizes delete key for removing entries 2017-01-23 15:48:43 -07:00
David Sparer
12f0c826c8 cred manager no longer groups items 2017-01-23 15:47:25 -07:00
David Sparer
4aa5da8c0d Merge branch 'develop' into Create_basic_infrastructure_for_supporting_credential_manager 2017-01-23 15:32:55 -07:00
David Sparer
e0fd81e938 resolved bug when clicking in blank space in the connection tree 2017-01-23 15:32:06 -07:00
David Sparer
58509bcf41 renamed method 2017-01-23 15:31:12 -07:00
David Sparer
8aa0eb1d64 added a key handler for enter and 'a' 2017-01-23 15:26:49 -07:00
David Sparer
ece974c1be fixed bug where selected row would be deselected after committing a change to the list 2017-01-23 15:25:27 -07:00
David Sparer
56dd3c32cb tweaked the credential editor window 2017-01-23 14:33:16 -07:00
David Sparer
118e3a3bd3 added a close button to the cred manager and bound 'esc' to it 2017-01-23 12:24:40 -07:00
David Sparer
8cd3c2a89f simplified the credential list updating mechanism. we dont need an observable list 2017-01-23 11:42:01 -07:00
David Sparer
9c4672fd68 credential manager and cred editor windows now start in the middle of their parent window 2017-01-23 11:39:23 -07:00
Sean Kaim
04f6f4f9cf Make version selectable/copyable
fixes #360

Also update copyright year since it's 2017 now...
2017-01-23 12:59:29 -05:00
David Sparer
7b851e7ac8 optimized event raising so we only save the credential list once for multiple property changes 2017-01-20 13:02:57 -07:00
David Sparer
6c0b33c0dc we can now save and load credentials to xml 2017-01-20 12:27:59 -07:00
David Sparer
4d951c9827 wrapped cred deserialization in try catch 2017-01-20 12:27:05 -07:00
David Sparer
172232be48 created a new generic collection type for getting updates on property changes for items within a collection 2017-01-20 12:25:18 -07:00
David Sparer
d749a13611 moved the add/remove buttons 2017-01-20 10:12:22 -07:00
David Sparer
3998be3f93 created credential saver and loader classes 2017-01-20 10:10:59 -07:00
David Sparer
a381827890 aead crypto provider now returns empty string when asked to decrypt empty message 2017-01-20 10:10:17 -07:00
David Sparer
eecfe45443 xml cred deserializer now ensures empty strings are used for any missing xml attributes 2017-01-20 10:09:42 -07:00
David Sparer
ad5eb7b594 xml credential serializer now serializes domain value 2017-01-20 10:08:58 -07:00
David Sparer
9ce09eb406 Remove button is disabled when no credential selected 2017-01-19 15:15:13 -07:00
David Sparer
9c23f3d1d9 credential list now persists between opening/closing the manager 2017-01-19 15:09:17 -07:00
David Sparer
3f779b7ceb credential record now implements INotifyPropertyChanged. this makes updating the objectlistview much easier 2017-01-19 14:47:49 -07:00
David Sparer
3bc53bd7f8 created screen for viewing credential list and for editing single credentials 2017-01-19 14:29:54 -07:00
David Sparer
27b61fe9a4 renamed the credential Name property to Title 2017-01-19 08:57:08 -07:00
David Sparer
4d94c7ac7a credential deserializer now supports variable decryption parameters 2017-01-19 08:47:27 -07:00
David Sparer
4eb1125b7b credential serializer now provides encryption parameters to support variable decryption 2017-01-19 08:09:11 -07:00
David Sparer
496b481c31 added an xml schema for confcons version 2.7
this removes the username/password/domain from the confcons file schema and puts an id pointing to the credential to use
2017-01-19 07:37:31 -07:00
David Sparer
77120cf156 added xml schema for the credential xml 2017-01-18 16:15:02 -07:00
David Sparer
80f11c0f70 created xml credential deserializer and tests 2017-01-18 16:14:29 -07:00
David Sparer
bee8059cbe added a credential record serializer and tests 2017-01-18 15:31:19 -07:00
David Sparer
0f2e72172b Merge branch 'develop' into Create_basic_infrastructure_for_supporting_credential_manager
# Conflicts:
#	mRemoteV1/Credential/CredentialInfo.cs
#	mRemoteV1/Credential/CredentialList.cs
2017-01-18 14:23:50 -07:00
David Sparer
25d1e0a74d Merge pull request #352 from mRemoteNG/299_better_testing_of_connection_tree
Refactor connection tree to be more testable
2017-01-18 09:03:26 -07:00
David Sparer
cbd9d16e4c simplified the connection tree refresh method.
the complexity of trying to add refresh optimizations was causing bugs. i will need to find a new way of reducing flicker
2017-01-17 15:31:40 -07:00
David Sparer
cb708b3217 resolved bug where some context menu hot keys would not work after opening the menu on the root node 2017-01-17 13:45:25 -07:00
David Sparer
4e5a22a7e8 resolved a minor bug where creating a new node would screw up the selected node in the tree
We were trying to do multiselection when it is currently not supported by our implementation.
2017-01-17 09:47:00 -07:00
Sean Kaim
3722db93c6 Merge pull request #349 from jogleasonjr/patch-1
Fix typo in README.MD
2017-01-16 17:56:59 -05:00
John Gleason
b43331dc27 Fix typo in README.MD 2017-01-16 15:20:07 -06:00
countchappy
80c6ce81e1 RDP Minutes to Idle Timeout - Update 4
Added an option to alert if disconnected due to inactivity.
2017-01-16 15:14:27 -05:00
David Sparer
1a776359c4 added test for folder expander 2017-01-14 11:44:09 -07:00
David Sparer
113e4035e5 refactored the deletion confirmer to make it testable 2017-01-14 11:14:30 -07:00
David Sparer
a03095ab8e refactored the node deletion confirmer to be interface-based. this will lead to improved testability 2017-01-14 10:38:11 -07:00
David Sparer
d03f830622 added null test for the composite click handler 2017-01-14 10:36:54 -07:00
David Sparer
9b42dc9f10 Refactored some click handlers and created a test for it
During testing I realized that the double and single click handlers were exactly the same thing, so i combined them into the composite click handler.
2017-01-14 10:11:22 -07:00
David Sparer
fd7adf3c64 added some more tests 2017-01-13 17:43:06 -07:00
David Sparer
d0b7e72f15 Merge pull request #342 from countchappy/develop
RDP Optional Minutes to Idle Timeout
2017-01-13 17:05:25 -07:00
countchappy
5a61c6b7df RDP Minutes to Idle Timeout - Update 3.1 2017-01-13 18:49:39 -05:00
countchappy
c897eae04e RDP Minutes to Idle Timeout - Update 3
Fixed name and description not showing up in the config window.
2017-01-13 18:08:36 -05:00
countchappy
c33095cd0e RDP Minutes to Idle Timeout - Update 2.1
Fixed my goof!
2017-01-13 17:11:07 -05:00
David Sparer
05d8b7983a reorganized some test files and added tests for null args 2017-01-13 12:12:22 -07:00
countchappy
166d9f7133 RDP Minutes to Idle Timeout - Update 2
Added null conditional operator to prevent throwing a null reference
error for beta users.
2017-01-13 13:41:19 -05:00
David Sparer
2ce31f35cc more file organizing 2017-01-13 10:54:39 -07:00
David Sparer
ce5d0cefe3 organized some files 2017-01-13 10:41:28 -07:00
David Sparer
6cc668fe83 added more tests for connectiontree delegates 2017-01-12 15:30:30 -07:00
David Sparer
ac0aa8daf4 added a method to the IConnectionTree interface to make testing another class possible 2017-01-12 15:20:32 -07:00
David Sparer
16b094be44 we no longer need the extensions now that we are subclassing TreeListView 2017-01-12 15:16:55 -07:00
David Sparer
b3e6fd7b96 created test for another tree handler 2017-01-12 15:09:24 -07:00
David Sparer
893d5d92f3 made all relevant classes use IConnectionTree 2017-01-12 15:09:05 -07:00
David Sparer
77add0b39d added an interface for iconnectiontree. this kind of hacky and really just exists to make the tests work. this indicates we have some coupling on ConnectionTree that shouldn't be there.. 2017-01-12 15:08:12 -07:00
David Sparer
b4f8ab0a49 moved a call to settings further up in the abstraction level to make testing easier 2017-01-12 14:13:35 -07:00
David Sparer
1d46c44c21 added tests for another click handler 2017-01-12 13:57:44 -07:00
David Sparer
12da35f875 made the rest of the connectioninitiator functions non-static 2017-01-12 13:57:15 -07:00
David Sparer
8970a15d4e added tests for one of the click handlers 2017-01-12 13:33:12 -07:00
David Sparer
82217478d9 made one of the methods for the connectioninitiator non-static (they should eventually all be non-static).
This change was made to making testing easier (make connectioninitiator mockable)
2017-01-12 13:31:29 -07:00
David Sparer
4c792308bb moved all click-actions for the tree to separate classes to make them easily composable
this has the nice effect of also pushing any calls to the settings class outside the classes that are actualy doing work, making them much easier to test in isolation
2017-01-12 12:47:23 -07:00
David Sparer
978d94a2cd resolved issue with unit test. we could not select a tree object without that object being visible 2017-01-12 11:12:18 -07:00
David Sparer
b195d89b76 moved a few more functions closer to their call site 2017-01-12 11:02:11 -07:00
David Sparer
875888a341 moved a method closer to its call site 2017-01-12 10:51:05 -07:00
David Sparer
6631a13d20 cleanup 2017-01-12 10:31:50 -07:00
David Sparer
28728fe29f moved some connectiontree post setup actions into their own classes. post setup actions are now managed by a composite 2017-01-12 10:29:30 -07:00
David Sparer
aa954cbea9 minor cleanup 2017-01-12 09:24:59 -07:00
David Sparer
dae339f494 moved the image getter delegate code into its imagelist since the img names have to match up. seems like a better division of responsibility 2017-01-12 09:17:34 -07:00
David Sparer
5bcb59f876 moved the setup of the tree image list to its own class 2017-01-12 08:59:34 -07:00
David Sparer
9132592fd7 moved the setup of the name column to its own class 2017-01-12 08:58:52 -07:00
Sean Kaim
ca592fac77 update change log 2017-01-11 17:56:37 -05:00
Sean Kaim
ea657824c2 Streamlined non-integrated IntApp connections
This seems to fix #325
2017-01-11 17:49:37 -05:00
Sean Kaim
99e7072e27 code clean up
relates to #325
2017-01-11 17:01:08 -05:00
David Sparer
ad32f4a0a3 Merge branch 'develop' into 299_better_testing_of_connection_tree 2017-01-11 15:00:44 -07:00
David Sparer
b9cdd0996d moved click handling responsibility out of the connectiontreewindow and into the context menu class 2017-01-11 14:58:29 -07:00
Sean Kaim
e92a76f95b "return ;" annoyed me...
And I did a find and replace in the solution instead of the one file I
was working on... So I'm going with it...
2017-01-11 16:56:14 -05:00
countchappy
10d152342f RDP Minutes to Idle Timeout - Update 1
Fixed some language file stuff.
2017-01-11 16:44:53 -05:00
countchappy
7e4b0635b2 RDP Minutes To Idle Timeout
Allows users to configure a number of minutes until the session will
automatically disconnect if left idle.
2017-01-11 15:23:43 -05:00
Sean Kaim
eec17f10d5 update changelog 2017-01-10 10:54:03 -05:00
Sean Kaim
ac9d5dfa95 code clean up 2017-01-10 10:51:34 -05:00
Sean Kaim
4c2b3738c2 Don't attempt to connect to folders
Fixes #334
2017-01-10 10:46:34 -05:00
Sean Kaim
6f29183b45 code clean up and logging / exception handling 2017-01-09 11:32:04 -05:00
Sean Kaim
dd65c9c588 update changelog 2017-01-06 12:53:56 -05:00
Sean Kaim
cb8bb05627 Merge pull request #329 from mRemoteNG/release_channels
Add Release channels
2017-01-06 12:32:05 -05:00
David Sparer
256f6d8fdd extracted and renamed some methods 2017-01-06 10:15:33 -07:00
Sean Kaim
a88fdddecb allow all tests to pass regardless of build type 2017-01-06 11:58:00 -05:00
Sean Kaim
fd5e3e24df Run tests from local resources 2017-01-06 11:16:02 -05:00
Sean Kaim
244d27427d update some log messages 2017-01-05 14:30:24 -05:00
Sean Kaim
55c42a3cca Merge remote-tracking branch 'refs/remotes/origin/develop' into release_channels 2017-01-05 11:21:46 -05:00
Sean Kaim
3c9cfbdf92 log exception messages only 2017-01-05 11:13:43 -05:00
Sean Kaim
46dd58d26e External Tool/Connection - code clean up & logging
Relates to #325
2017-01-05 11:05:59 -05:00
Sean Kaim
051dd2e567 Add Beta and Dev tests 2017-01-04 11:15:51 -05:00
Sean Kaim
17ccf40082 re-add version check & adjust CPU target for tests
fixed compliler warning regarding architecture mismatch.
2017-01-04 10:47:23 -05:00
Sean Kaim
0f2b61694d Merge remote-tracking branch 'refs/remotes/origin/develop' into release_channels 2017-01-04 09:15:22 -05:00
Sean Kaim
0aed66df47 fix build & test failure 2017-01-03 18:17:03 -05:00
Sean Kaim
94a6e9a886 code clean up around startup / frmMain
Slightly related to #298
2016-12-22 10:01:20 -05:00
Sean Kaim
355f48b6ba We want only Valid info! 2016-12-16 17:29:03 -05:00
Sean Kaim
d1a6526c22 Added functional UpdateStableChannel test
It's working! It's working!
2016-12-16 17:27:57 -05:00
Sean Kaim
975a308647 reworking code to better test & code cleanup 2016-12-15 17:44:55 -05:00
Sean Kaim
5138eaeb68 Merge remote-tracking branch 'refs/remotes/origin/develop' into release_channels 2016-12-15 15:02:30 -05:00
David Sparer
45dfaa1b21 removed unused code 2016-12-13 13:11:50 -07:00
David Sparer
715f92f3d5 removed unnecessary code 2016-12-13 13:07:52 -07:00
Sean Kaim
8d5a765040 pass importSubOU option in to recursive calls
Fixes remaining problems reported in #211
2016-12-13 14:22:39 -05:00
Sean Kaim
34fa6b158b load the default domain when opening the form
Related to #311
2016-12-13 13:34:44 -05:00
David Sparer
78c1f6b8e3 Fixed bug where we could not drop between items (rearrange) 2016-12-13 10:28:38 -07:00
David Sparer
adccb91106 removed unnecessary code 2016-12-13 10:06:50 -07:00
David Sparer
1e213dfff7 resolved issue with deleting the last folder in the tree 2016-12-13 09:58:24 -07:00
David Sparer
d469fa1d40 Made the deletion confirmation functionality plugable to make testing easier 2016-12-13 09:51:18 -07:00
David Sparer
737db469ba Fixed test name 2016-12-13 09:27:32 -07:00
David Sparer
a44a33d508 minor cleanup 2016-12-13 09:16:05 -07:00
David Sparer
a518d41c78 updated connection tree window tests 2016-12-13 09:07:21 -07:00
David Sparer
d5360c6568 Completed splitting the connection tree from the connection tree window 2016-12-13 09:00:38 -07:00
Sean Kaim
d468107311 Load users default/current domain
Fixes #311

Caused by 97a0e2413e

Some code clean up as well...
2016-12-13 10:50:36 -05:00
Sean Kaim
3f65e1bfa0 add tests for update channels
Some code clean up as well...
2016-12-13 10:31:16 -05:00
David Sparer
a22758f5cd organized code into regions to help prepare for later refactoring 2016-12-09 12:57:26 -07:00
David Sparer
88b5b9d1e7 began moving connectiontree functions out of the code for the window and into its own class.
this will improve testability and reduce class complexity
2016-12-07 15:07:15 -07:00
Sean Kaim
e38f7c880e code clean up
Added some log messages for #298
2016-12-06 19:13:09 -05:00
David Sparer
6367b58994 began adding unit tests for the connectiontree ui 2016-12-06 15:28:56 -07:00
David Sparer
5a54b5ee64 Merge pull request #292 from ForensicITGuy/develop
Added code and screenshots for Quick Connect help files
2016-12-06 08:36:00 -07:00
ForensicITGuy
002e41f418 Added Quick Connect screenshots into project. Modified folder name and HTML code to include spaces as observed in the other screenshot folders. Set to track content and copy if newer in output. 2016-12-06 01:04:52 -06:00
David Sparer
f7787c748a Added multiple build badges based on update channel to readme.md 2016-12-03 11:17:41 -07:00
David Sparer
f9b18b45a4 updated the jenkins build badge to point to the sanitized url. added a title to readme.md 2016-12-03 10:46:20 -07:00
David Sparer
8966f44272 resolved issue with Jenkins not being about the build PRs 2016-12-02 16:49:49 -07:00
Tony M Lambert
3dbcbae61f Added code for Quick Connect documentation
Added HTML code to document Quick Connect functionality
2016-12-02 15:49:04 -06:00
Sean Kaim
24508abe7a rename channels 2016-12-02 16:41:37 -05:00
Tony M Lambert
27f8f2542e Added screenshots for Quickconnect documentation 2016-12-02 15:25:05 -06:00
Sean Kaim
44ee3ceec8 User Selectable Release Channels
Final = Final
Beta = Beta & RC
Pre-Release = Alpha, Beta & RC
2016-12-02 14:57:49 -05:00
Sean Kaim
b08112aec0 Load Ext Tools - add logging
Relates to #291 & #236
2016-12-02 12:20:02 -05:00
Sean Kaim
9d2bbda2b9 ExtTools code clean up
Relates to #291 & #236
2016-12-02 12:11:46 -05:00
David Sparer
6eff685b18 updated changelog 2016-12-01 15:40:04 -07:00
David Sparer
2d08146de8 updated changelog for 1.75beta3 2016-12-01 15:38:26 -07:00
Sean Kaim
f131420a44 Change from .exe to .msi
Fixes #289
2016-12-01 17:22:50 -05:00
David Sparer
245ea5463e updated the folder path resolution for the release folder to be a bit safer 2016-12-01 15:04:49 -07:00
David Sparer
71bb90a769 Set build date 2016-12-01 14:47:43 -07:00
David Sparer
e71a22fbb3 Added badge for CII progress https://bestpractices.coreinfrastructure.org/projects/529 2016-12-01 14:24:20 -07:00
Sean Kaim
802c4c28f5 smaller image 2016-12-01 15:51:59 -05:00
Sean Kaim
2cda6fc057 updated/added some links 2016-12-01 15:47:40 -05:00
Sean Kaim
a0303c70f9 Merge pull request #285 from mRemoteNG/284_md5_update_checks
284 md5 update checks
2016-11-30 15:32:37 -05:00
Sean Kaim
f5b9f58747 generate update files 2016-11-30 15:31:34 -05:00
Sean Kaim
0d8dee0ed7 use MD5 checksum for zip and msi releases
and some code cleanup
2016-11-30 14:50:55 -05:00
David Sparer
ace02263dd added a few links 2016-11-30 12:48:29 -07:00
David Sparer
a2398bfb3a Merge pull request #189 from mRemoteNG/update_contribution_guide
Update CONTRIBUTING.md
2016-11-30 12:22:44 -07:00
David Sparer
cd7ddb5ba1 minor typo fixes 2016-11-30 12:08:48 -07:00
Sean Kaim
ae37a4c85d some additions
- added short code style section
- added "ready" and "Documentation" label notes
- made note of Static Code Analysis tools for PRs
2016-11-30 13:49:34 -05:00
Sean Kaim
32e1716061 Merge remote-tracking branch 'refs/remotes/origin/develop' into update_contribution_guide 2016-11-30 13:32:27 -05:00
David Sparer
d92616f39f Merge pull request #282 from mRemoteNG/280_connections_file_corrupted_when_cancelling_password_prompt
Connections file corrupted when cancelling password prompt
2016-11-30 10:28:50 -07:00
David Sparer
0c13db46fd save not performed when connections file is not loaded 2016-11-30 10:20:26 -07:00
David Sparer
b6fc9a8ec1 Updated credits and changelog for PR #275 2016-11-29 11:51:11 -07:00
David Sparer
a672141352 Merge pull request #275 from ForensicITGuy/develop
Addition of HTML code for SSH File Transfer help page
2016-11-29 11:46:53 -07:00
David Sparer
df354e483a Merge pull request #279 from mRemoteNG/278_silent_installs_not_detecting_prerequisites
Resolves #278
2016-11-29 11:16:00 -07:00
David Sparer
89874545b1 updated changelog 2016-11-29 11:12:45 -07:00
David Sparer
b0fdd09f39 added prereq checks to non-gui executions 2016-11-29 11:11:31 -07:00
David Sparer
fbf620ae36 Merge pull request #277 from mRemoteNG/271_make_installer_aware_of_previous_install_path
make installer aware of previous install path. Resolves #277
2016-11-29 11:00:42 -07:00
David Sparer
509f7da12e installer now saves and loads the previous install location in the registry 2016-11-29 10:37:54 -07:00
David Sparer
64a40e4ed0 renamed the property used for the fully install path from APPLICATIONROOTDIRECTORY to INSTALLDIR to make it easier to type at the cmdline 2016-11-29 09:21:22 -07:00
David Sparer
ab253dbf28 Merge pull request #273 from mRemoteNG/add_turkish_translation
Add Turkish translation provided by forum user rizaemet
2016-11-29 08:18:56 -07:00
David Sparer
feb19df20f minor update to credits 2016-11-29 08:15:15 -07:00
ForensicITGuy
d5d2241f1b Fixed Indentation and added Troubleshooting Info 2016-11-29 00:03:48 -06:00
ForensicITGuy
5af1a0aa87 Fixed Indentation 2016-11-28 23:55:44 -06:00
ForensicITGuy
816621651d Added help HTML code for SSH File Transfer 2016-11-28 23:03:23 -06:00
David Sparer
8f2aa08dbe Updated changelog and credits 2016-11-28 13:15:09 -07:00
David Sparer
d20e1a6e9c added Turkish translation provided by forum user rizaemet 2016-11-28 13:01:31 -07:00
Sean Kaim
2a5a4c9ace code clean up 2016-11-22 17:14:27 -05:00
Sean Kaim
2e7fd3fb60 code clean up 2016-11-22 16:54:06 -05:00
David Sparer
56579100f1 Merge pull request #265 from mRemoteNG/254_component_check_issues
Resolves #254
2016-11-22 08:04:37 -07:00
David Sparer
1e5cd24acd update changelog 2016-11-22 08:03:11 -07:00
David Sparer
7f152cef20 Merge branch 'develop' into 254_component_check_issues 2016-11-22 07:57:32 -07:00
David Sparer
3958d2d597 update changelog 2016-11-21 12:15:16 -07:00
David Sparer
84a3b31e8d Merge pull request #263 from mRemoteNG/260_unable_to_decrypt_confCons_v2_5_fullencryption
Resolves #260
2016-11-21 10:06:15 -07:00
David Sparer
cc15c12d19 Resolved bug with deserializing confCons v2.5 custom password full encryption files 2016-11-21 10:01:34 -07:00
David Sparer
50e7b89b15 Added test for deserializing confCons v2.5 custom password full encryption files 2016-11-21 10:00:55 -07:00
David Sparer
0b507cb66a Fixed bug where custom decryption passwords would require 2 password prompts to decrypt 2016-11-21 09:59:46 -07:00
David Sparer
b1c697ea09 ensured that the rootnodeinfo is not null during decryption 2016-11-21 09:25:43 -07:00
David Sparer
dbcf15e45b Created test to ensure deserializing confCons v2.5 w/ full encryption works 2016-11-21 09:05:35 -07:00
David Sparer
21d864ce7a Merge pull request #262 from mRemoteNG/261_double_click_expands_tree_node_folder
Re-add double click support for toggling tree node expansion. Resolves #261
2016-11-21 08:47:02 -07:00
David Sparer
dcf1f1af10 Added double click support for toggling tree node expansion. (existed in previous version - this was a feature regression) 2016-11-21 08:44:55 -07:00
David Sparer
9c25a39b7b split ICA object initialization from setting Parent property. this had created an appearance bug. connected to #254 2016-11-21 08:23:33 -07:00
David Sparer
d79687db53 Added some extra debugging messages. will remove once done investigating 2016-11-18 11:52:23 -07:00
David Sparer
77428e0fe5 minor cleanup 2016-11-18 09:48:21 -07:00
David Sparer
53df3b5cfa moved the Rdp and Vnc component check using directives into the try blocks. connected to #254 2016-11-18 08:15:24 -07:00
David Sparer
f2e1c9e959 moved the using directive of the ICA check into the try block. this seems to resolve #254 2016-11-17 15:16:45 -07:00
David Sparer
a004b2f3e0 split component checks to separate functions to make them a bit easier to digest mentally 2016-11-17 14:50:54 -07:00
Sean Kaim
65b4398b0e code clean up 2016-11-17 15:06:58 -05:00
Sean Kaim
0b83d2869d code clean up - use "using"
Attempt to help #254
2016-11-17 15:01:49 -05:00
Sean Kaim
1a408b810c use var everywhere in Logger
For #253
2016-11-17 14:38:51 -05:00
David Sparer
bab5879c3d Component check now tests for the correct RDP version. 2016-11-17 08:29:33 -07:00
David Sparer
6f79954989 re-added a few more missing menu icons 2016-11-16 15:07:43 -07:00
David Sparer
8d4622dc31 re-add Options menu icon 2016-11-16 15:00:39 -07:00
David Sparer
fecdc48b09 Merge branch 'trying_to_fix_the_main_menu_position' into develop 2016-11-16 14:35:29 -07:00
David Sparer
0edb51a32a set safe default positions for the quick connect and external tools menu items 2016-11-16 14:27:02 -07:00
David Sparer
750bd2f61b another attempt to fix the main menu default location 2016-11-16 13:29:56 -07:00
Sean Kaim
f6fa9821f0 Add PayPal badge to the readme 2016-11-15 14:50:08 -05:00
Sean Kaim
3ed06dafb0 suppress complier warning MSB3305
Processing COM reference "" from path "". At least one of the arguments
for '' cannot be marshaled by the runtime marshaler.  Such arguments
will therefore be passed as a pointer and may require unsafe code to
manipulate.
2016-11-15 14:17:17 -05:00
Sean Kaim
4be6a5b5a9 ReSharper - code clean up 2016-11-15 14:08:55 -05:00
Sean Kaim
a4c77ce33e Fix complier error CA2213 2016-11-15 14:02:06 -05:00
Sean Kaim
f6babd01ca Fix complier warning 2016-11-15 14:00:22 -05:00
Sean Kaim
17ce9a0903 Remove unused / unreferenced UI element 2016-11-15 13:43:57 -05:00
David Sparer
824b4681e4 Merge pull request #248 from mRemoteNG/247_inheritance_not_applied_correctly
Resolves #247
2016-11-15 10:20:34 -07:00
David Sparer
7ba7e0b2d8 resolved the issue with inheritance not being applied correctly for folders. created a few tests to help guard against this from happening again. 2016-11-15 10:15:49 -07:00
David Sparer
0391eabc79 fixed some test files 2016-11-15 10:14:35 -07:00
Sean Kaim
e2ebf6b8fe code clean up 2016-11-15 12:05:50 -05:00
Sean Kaim
58d3d678ca code clean up 2016-11-15 11:41:50 -05:00
David Sparer
b52b68595b set changelog version and date 2016-11-15 08:32:14 -07:00
Sean Kaim
0a8d606686 About: line some things up a little better 2016-11-15 09:45:09 -05:00
Sean Kaim
d1ef9f3e99 Fix build errors 2016-11-11 17:31:26 -05:00
Sean Kaim
5a830c17db ReShaper Cleanup 2016-11-11 17:24:02 -05:00
Sean Kaim
10c4a4d665 CA1034: Nested types should not be visible
https://msdn.microsoft.com/library/ms182162.aspx
2016-11-11 16:43:46 -05:00
Sean Kaim
e93e7f05c6 CA1031: Do not catch general exception types
https://msdn.microsoft.com/library/ms182137.aspx
2016-11-11 16:40:59 -05:00
Sean Kaim
e2c6240798 Fix Release build failure 2016-11-11 16:35:14 -05:00
Sean Kaim
24ad483214 Fix other complier warnings & code clean up 2016-11-11 16:30:22 -05:00
Sean Kaim
bfa53224a6 CA1060: Move to NativeMethods class
https://msdn.microsoft.com/en-us/library/ms182161.aspx
2016-11-11 16:29:57 -05:00
Sean Kaim
00ec25d38c Fix compilier warning: CA2202 & refactor
https://msdn.microsoft.com/en-us/library/ms182334.aspx
2016-11-11 16:25:47 -05:00
Sean Kaim
348fc156de Commented out Unused variable 2016-11-11 16:21:46 -05:00
Sean Kaim
1a9cb5335a adjust changelog display in about form 2016-11-11 14:36:08 -05:00
Sean Kaim
0abfab96a4 changelog and credits update 2016-11-11 12:24:47 -05:00
Sean Kaim
bbfbbbf91e make sub OU import optional 2016-11-10 17:53:32 -05:00
David Sparer
8db0150c4a Merge pull request #241 from mRemoteNG/240_Config_window_buttons_sometimes_deactivate
resolves #240
2016-11-10 11:00:29 -07:00
David Sparer
3d7db6136f resolved the issue of config window buttons being deactivated in some cases. the config window was incorrectly tracking the selected tree node. 2016-11-10 10:57:03 -07:00
David Sparer
ace6c1167b bit more cleanup 2016-11-10 10:20:48 -07:00
David Sparer
4644dfbd7b initial resharper cleanup 2016-11-10 10:00:39 -07:00
David Sparer
c7b205dbde Began creating a serializer for saving credential providers 2016-11-09 15:42:51 -07:00
David Sparer
ffff2636ae Made ICredentialProvider implement IEnumerable. Added a few properties to the ICredentialProvider 2016-11-09 15:42:20 -07:00
David Sparer
c69e1bb091 Fleshed out the CredentialProviderCatalog 2016-11-09 15:00:12 -07:00
David Sparer
49531285c9 Renamed class CredentialCatalog to CredentialProviderCatalog 2016-11-09 14:37:04 -07:00
David Sparer
b9824d0095 Renamed test to reflect var name change 2016-11-09 14:36:28 -07:00
David Sparer
3dc04f9246 Renamed UniqueId to just Id 2016-11-09 14:27:22 -07:00
Sean Kaim
1bf6dc37d9 Merge pull request #234 from mRemoteNG/211_AD_Sub_OU_Import
Fixes #211
2016-11-09 14:54:17 -05:00
Sean Kaim
97a0e2413e Fixed MR-220
Don't close the AD importer after import
Add Close button (for when you're done with the importer)
2016-11-09 14:20:01 -05:00
Sean Kaim
c5f199bdf8 recurively import OU, Sub-OU and servers 2016-11-08 17:31:50 -05:00
David Sparer
656e3ff022 Began fleshing out the CredentialRecordCatalog which will be a master list of all ICredentialRecords. Will probably be refactoring this a bit more. 2016-11-07 15:33:06 -07:00
David Sparer
94f1a80323 ICredentialLists now hold a reference to their assoviated credential provider 2016-11-07 15:26:11 -07:00
Sean Kaim
11256e6988 code clean up 2016-11-07 16:05:36 -05:00
David Sparer
db6c32891a Renamed ICredentialCatalog to ICredentialProviderCatalog 2016-11-07 13:38:38 -07:00
David Sparer
6d819206ea Renamed ICredential to ICredentialRecord 2016-11-07 13:34:43 -07:00
Sean Kaim
32240ee475 Allow the update options page for portable versions 2016-11-07 14:22:42 -05:00
Sean Kaim
77a1c2cfb8 code clean up
convert if else -> switch
use ?: where possible
use "var"
"return ;" - why??? Also, why does that space annoy me so much?
😕
2016-11-07 12:23:04 -05:00
Sean Kaim
0f6d7ce2a4 Merge pull request #224 from mRemoteNG/160_portable_update_check
160 portable update check
2016-11-06 17:12:55 -05:00
Sean Kaim
e8738adc40 correct file name 2016-11-06 17:05:49 -05:00
Sean Kaim
bca02edead fix a boo-boo 2016-11-06 16:59:41 -05:00
Sean Kaim
abf81ac26b Download portable zip
* code clean up
* Compare MD5 hash
* Display changelog properly direct from GH
2016-11-06 16:56:59 -05:00
Sean Kaim
011d2f83f6 clean up update code 2016-11-06 15:19:13 -05:00
Sean Kaim
1a80c5273c Use same exact format as installer version 2016-11-06 15:04:48 -05:00
Sean Kaim
cf8f31168e upgrade check file hash creation 2016-11-06 15:03:27 -05:00
Sean Kaim
e25d7ca995 Here are the basics for portable update checks... 2016-11-03 17:43:53 -04:00
David Sparer
51fa8994c3 Resaved test file with KdfIterations=5000 2016-11-02 16:04:05 -06:00
David Sparer
78852b7119 Added a test to ensure we can serialize then deserialize with custom kdf values 2016-11-02 15:59:53 -06:00
David Sparer
193bb0bf26 The xml decryptor wasn't passing the kdfiterations value to the cryptoprovider. It was being essentially hard-coded in... whoops
Added a new test to ensure we can serialize then deserialize with a custom kdf value
2016-11-02 15:59:25 -06:00
Sean Kaim
d862462bbf Fix build failures (tests)
I don't want to risk breaking any existing SQL implementations at this
point by updating the schema... Especially since I don't have the time
to test it properly.
2016-11-02 17:05:44 -04:00
Sean Kaim
dcecd30e7c Fix build failure (tests) 2016-11-02 17:00:37 -04:00
Sean Kaim
a01ef3bb08 Change update URL
Fixes #162
2016-11-02 16:35:03 -04:00
Sean Kaim
60cd2c2b12 RDP audioqualitymode option
fixes #172
2016-11-02 15:49:45 -04:00
Sean Kaim
daad1cac5e Fixed problem saving confCons.xml
Intoduced in commit 9a32aa3350

Removed "_saveUpdate" bool and related checks since it's not used
anywhere else. It was meaningless code (that caused a problem when
ReShaper "cleaned" it up).
2016-11-02 15:30:11 -04:00
Sean Kaim
c6b89425b1 FilteredPropertyGrid code cleanup 2016-11-02 14:10:50 -04:00
David Sparer
70408ca8ee Finalized the first draft and removed the template lines 2016-10-31 15:54:42 -06:00
David Sparer
b3bf86d404 Added a few domain specific functions to ICredentialList 2016-10-31 09:17:43 -06:00
David Sparer
296c337eb6 renamed some classes to make more sense 2016-10-31 08:25:22 -06:00
David Sparer
a6f71911fe Added folder in which we can place new credential providers 2016-10-28 12:24:48 -06:00
David Sparer
b91a781d27 Added interface for ICredentialProvider 2016-10-28 12:23:49 -06:00
David Sparer
6aa363830b Minor formatting fix 2016-10-28 11:52:11 -06:00
David Sparer
fffc0f9eae Added a copy constructor to the CredentialRecord 2016-10-28 11:41:27 -06:00
David Sparer
1d2889f5b8 Can create new credential record with a specific Guid 2016-10-28 11:18:53 -06:00
David Sparer
6ed7568cd9 Added UniqueId property to ICredential 2016-10-28 11:11:11 -06:00
David Sparer
22ca5b76b4 Created an interface for the credential repository 2016-10-28 10:51:07 -06:00
David Sparer
a03ce5bf7b Created minimalistic class to encapsulate the credential list (repository) 2016-10-28 10:32:53 -06:00
David Sparer
2994806a35 Created an interface and implementation for credential records 2016-10-28 10:00:16 -06:00
David Sparer
be17960ce6 Removed credential classes that are not used 2016-10-28 09:25:37 -06:00
David Sparer
eeb2f0ad60 Merge pull request #209 from mRemoteNG/Fix_password_support_for_international_chars
Investigate password support for international chars
2016-10-28 08:49:10 -06:00
David Sparer
314e5bc364 minor cleanup 2016-10-25 11:40:43 -06:00
David Sparer
a294bfde11 Added test to ensure that strings with international characters are serialized and deserialized correctly 2016-10-25 11:40:01 -06:00
David Sparer
baa496fc07 Merge pull request #199 from mRemoteNG/Make_XmlSerializer_class_testable
The XmlConnectionsSerializer class was broken into smaller classes that better adhere to SRP.

Closes #180
2016-10-25 11:17:07 -06:00
David Sparer
4ca29d5d2e Removed an unused variable in Runtime 2016-10-25 11:13:43 -06:00
David Sparer
5e7074a297 Fixed minor bug when turning off custom password encryption 2016-10-25 11:10:52 -06:00
David Sparer
fd6268ce8a Updated the deserializer / decryptor to look at the rootnodeinfo for decryption key rather than static Runtime. There was some state leaking that caused unit tests to fail intermittently 2016-10-25 10:59:43 -06:00
David Sparer
806da552ce Added a test for serializing a single connection node 2016-10-25 09:34:03 -06:00
David Sparer
47561340e3 minor cleanup 2016-10-25 09:33:34 -06:00
David Sparer
b374952141 Renamed the ConnectionsDecryptor to XmlConnectionsDecryptor and moved it into the Serializers namespace 2016-10-25 08:53:07 -06:00
David Sparer
e098970d82 Added some tests to ensure that the xml serializer produces output that the deserializer can handle. 2016-10-25 08:25:57 -06:00
David Sparer
6ca5f5e877 minor cleanup 2016-10-25 08:14:49 -06:00
David Sparer
6b023c5fb6 Simplified the xml serializer by chunking it into appropriate classes 2016-10-24 15:40:28 -06:00
David Sparer
bd30103758 Fixed bug where we were not using the correct encryption key during serialization 2016-10-24 15:39:50 -06:00
David Sparer
e9ead72e79 Added logic to the XmlConnectionsDocumentCompiler to respect the FullFileEncryption flag 2016-10-24 14:54:08 -06:00
David Sparer
513edc58ab Created XmlConnectionsDocumentEncryptor to handle encrypting the entire connections xml file 2016-10-24 14:51:48 -06:00
David Sparer
fd7e7bd439 Created a class to handle compiling the structure of the xml document (child/parent relationships) 2016-10-24 13:12:39 -06:00
David Sparer
f510f20f57 Created an xml serializer specifically for dealing with the root connections node 2016-10-24 11:47:35 -06:00
David Sparer
a0a92b9b40 RootNodeInfo.PasswordString will now return either a custom password (if one is set) otherwise the default password 2016-10-24 11:24:35 -06:00
David Sparer
ba878c7587 Moved some of the responsibility of the default encryption password into the RootNodeInfo class. This simplifies serialization a bit, though may not be the best place for storing encryption passwords 2016-10-24 10:51:59 -06:00
David Sparer
f1f76a4910 XmlConnectionNodeSerializer now respects save filter settings for serializing inheritance 2016-10-24 09:04:51 -06:00
David Sparer
3ea4bc29ba Began splitting individual xml element serialization from serializing the structure of the document. Created unit tests to ensure the attributes are serialized correctly 2016-10-21 12:47:20 -06:00
David Sparer
82848aa4cd Added a section on pull requests 2016-10-20 15:29:58 -06:00
David Sparer
5131604ba7 Added drafts for submitting bugs and feature requests 2016-10-20 12:33:23 -06:00
David Sparer
1be821b07a added rough draft of the contribution intro 2016-10-20 11:30:49 -06:00
David Sparer
1ed475d469 Test for confversion serialized 2016-10-19 18:03:45 -06:00
David Sparer
e11413eab8 The XmlConnectionsSerializer now looks to its crypto provider for the value of KdfIterations. This insulates the function from global state (Settings) 2016-10-19 18:00:14 -06:00
David Sparer
98db923ac7 Added get/set property KeyDerivationIterations to the ICryptographyProvider interface 2016-10-19 17:54:45 -06:00
David Sparer
7376ff1c9b XmlSerializer now requires a cryptoprovider be given to the ctor. Reduces reliance on global state (Settings) 2016-10-19 17:43:02 -06:00
David Sparer
d427e3e0ae Fixed CryptoFactory tests 2016-10-19 17:26:18 -06:00
David Sparer
550119a53a Modified the ICryptographyProvider interface to require getters for the cipher engine and mode using their enum types 2016-10-19 17:17:28 -06:00
David Sparer
2df182c4c9 disable resharper name checking for a few enums 2016-10-19 16:56:38 -06:00
David Sparer
2b9b872ad4 Added test 2016-10-19 15:28:44 -06:00
Sean Kaim
94853714c7 code clean up / fix complier warning 2016-10-18 17:31:09 -04:00
David Sparer
01529a8028 Began creating tests for the XmlConnectionsSerializer 2016-10-18 15:27:59 -06:00
David Sparer
71d348227e Merge branch 'Remove_unused_code' into develop 2016-10-18 14:56:40 -06:00
Sean Kaim
76f585a051 code clean up 2016-10-18 16:48:32 -04:00
David Sparer
f1085716d9 Removed references to the My namespace 2016-10-18 13:58:55 -06:00
David Sparer
93bb620099 Remove the defunct My.Settings file 2016-10-18 13:49:54 -06:00
David Sparer
ded0bd7d12 Merge pull request #179 from mRemoteNG/Create_more_tests
Createed more tests
2016-10-18 13:46:24 -06:00
Sean Kaim
088f646d6f updater code clean up 2016-10-18 11:01:52 -04:00
David Sparer
e6a00f7935 Merge branch 'develop' into Create_more_tests
# Conflicts:
#	mRemoteNGTests/mRemoteNGTests.csproj
2016-10-18 08:55:28 -06:00
Sean Kaim
e5d625f294 code clean up 2016-10-17 21:25:04 -04:00
Sean Kaim
6e3bfcdf04 Remove unused code 2016-10-17 20:52:36 -04:00
David Sparer
10bd19e390 The Tools.EnvironmentInfo class didn't need to exist. Replace a single call to it with Environment.Is64BitProcess 2016-10-17 15:33:07 -06:00
David Sparer
9a1cb822d1 Created tests for the NodeSearcher 2016-10-17 13:14:29 -06:00
David Sparer
8ad5f3426c Removed the Impersonator class. This was only ever used for the Sessions feature which was removed in v1.74 2016-10-17 12:34:14 -06:00
David Sparer
2070a98a72 Minor cleanup 2016-10-17 12:32:33 -06:00
David Sparer
b97410dab7 Removed unused/unnecessary code 2016-10-17 12:25:07 -06:00
David Sparer
d47bc021a5 Added a test for GetDefaultPort 2016-10-17 12:04:38 -06:00
David Sparer
0b2dfecf27 Created more containerinfo tests 2016-10-17 11:45:59 -06:00
David Sparer
46ea97333e Added more tests for the containerinfo 2016-10-17 11:19:27 -06:00
David Sparer
598a9f6a0f Added a few more tests for the LegacyRijndaelCryptographyProvider 2016-10-17 10:31:36 -06:00
Sean Kaim
ef7d92d6bd code clean up 2016-10-17 12:29:05 -04:00
David Sparer
da4fe41f34 Added extra test to cover setting the authenticator max attempts 2016-10-17 09:24:40 -06:00
David Sparer
91fe4050b2 Modified several tests that were failing on some machines due to differing environment variables. Tests are now more resilient 2016-10-14 13:09:35 -06:00
David Sparer
23da6cf69e Removed unused test 2016-10-14 09:57:03 -06:00
David Sparer
51883b450f Adding various other graphics/assets provided by Riley during the turnover 2016-10-14 08:56:49 -06:00
David Sparer
cbdf02db55 Merge pull request #174 from mRemoteNG/Make_UI_more_responsive_during_save/load
Resolves #166
2016-10-14 08:52:25 -06:00
David Sparer
196096cd65 Made a few Save calls async. These probably were async before and were accidentally changed. 2016-10-14 08:19:31 -06:00
David Sparer
476ac38883 Merge pull request #173 from mRemoteNG/Reduce_duplicate_password_serialization
Reduce duplicate password serialization
2016-10-14 08:15:33 -06:00
David Sparer
90fea916fd Passwords will now only be serialized if the SaveFilter allows them to be, and if the connection/container does NOT inherit the password. 2016-10-14 08:07:30 -06:00
David Sparer
6fccd203a4 Merge pull request #171 from mRemoteNG/Make_key_derivation_iterations_a_user_option
Make key derivation iterations a user option
2016-10-13 18:44:57 -06:00
David Sparer
f2f0ee0179 Key derivation iterations is now saved in the settings (for serialization) and the confCons file (for deserialization) 2016-10-13 18:43:46 -06:00
David Sparer
1f9218bd5a Added tests for the key generator 2016-10-13 18:01:36 -06:00
David Sparer
966f7b2d61 Decryption now uses the new key derivation class 2016-10-13 17:28:25 -06:00
David Sparer
58c4b541b0 Little cleanup on decryption. Now uses the new key derivation class 2016-10-13 17:23:55 -06:00
David Sparer
f6c490fc62 Created a key derivation interface and initial Pkcs5 implementation 2016-10-13 17:17:34 -06:00
David Sparer
be59392814 Merge pull request #170 from mRemoteNG/Decryption_failing_with_custom_password
More work needs to be done to cleanup the related classes and reduce coupling, though this PR is starting to get a bit large for what the original intent was. Of particular issue are the calls to Runtime.EncryptionKey. The current implementation makes it very easy to use the wrong encryption key. Resolves #168
2016-10-13 15:59:13 -06:00
David Sparer
d0e21d7d8a Added tests for all current versions and significant variations of confCons. More changes to the deserialization classes were required to make them more testable. Still needs significant work to be considered good code 2016-10-13 15:49:49 -06:00
David Sparer
737373940e PasswordAuthenticator will only attempt reauthentication up to MaxAttempts 2016-10-13 15:46:17 -06:00
David Sparer
c639b89511 Added a custom EncryptionException type that inherits from the BouncyCastle type. This gives us a bit of namespace insulation (we shouldn't reference BouncyCastle outside of the mRemoteNG.Security namespace). 2016-10-13 12:43:47 -06:00
David Sparer
c530b3f8b4 Fixed bug where we could not turn custom password encryption off 2016-10-13 12:25:45 -06:00
David Sparer
1592a448f3 Simplified the authentication code when deserializing xml 2016-10-13 12:00:49 -06:00
David Sparer
c5ab2b1373 Changed the AeadCryptographyProvider to use the localized error message when decryption fails 2016-10-13 11:52:57 -06:00
David Sparer
f14f2cb5b7 Modified the LegacyRijndaelCryptographyProvider to throw errors when decryption fails. This is more in line with the other crypto providers 2016-10-13 11:51:24 -06:00
David Sparer
9c2945d270 Forgot to commit one changed line 2016-10-13 11:48:31 -06:00
David Sparer
05357c24f6 Removed unnecessary resource file from tests and made it a string constant instead (it was a small amount of text) 2016-10-13 11:47:15 -06:00
David Sparer
75839f330c Created test to ensure decryption failures throw an exception in AeadCryptographyProvider 2016-10-13 11:33:03 -06:00
David Sparer
ba0a9bbe58 moved the IAuthenticator into the Security.Authentication namespace 2016-10-13 10:32:23 -06:00
David Sparer
fb082471fe Created a new interface & class for authenticating passwords. This will replace the ConnectionsDecryptor class 2016-10-13 10:23:08 -06:00
David Sparer
f8968f2eb1 Resolved issue with the password prompt box not appearing when trying to decrypt with custom password. Class needs to be cleaned up. 2016-10-13 09:13:02 -06:00
David Sparer
990605948b Changed the exception when decryption fails from the generic "Exception" type to the more specific "EncryptionException" type to make catching easier. 2016-10-13 09:10:47 -06:00
David Sparer
21c96281a8 Resolved issue where encrypted values were not being decrypted correctly. (it was using the wrong decryption provider) 2016-10-13 09:09:47 -06:00
Sean Kaim
1ad7fce7a5 update nugets / fix access denied on post build 2016-10-12 17:12:05 -04:00
David Sparer
76162953e6 Resolved build failure 2016-10-12 14:23:59 -06:00
Sean Kaim
b934e29dc0 Merge pull request #167 from mRemoteNG/137_Update_Check
137 update check
2016-10-12 15:52:13 -04:00
Sean Kaim
93c128438c Merge changes from devlop into 137_Update_Check
Fixed conflicts in mRemoteV1/UI/Forms/frmOptions.cs
2016-10-12 15:48:17 -04:00
Sean Kaim
c283ddbb6a remove announcement info and cleanup 2016-10-12 15:39:44 -04:00
David Sparer
e3085a7054 Export file selection dialog box now selects file type filter based on Export form selection 2016-10-12 12:27:23 -06:00
David Sparer
4aa9a6e7a3 Changed the mRemoteNG csv exporter to not use the non-existant TreeNode for serializing its location in the tree. Resolves #165 2016-10-12 12:09:28 -06:00
David Sparer
76b0057deb Merge pull request #164 from mRemoteNG/Remove_RemoteDesktop2008_export_option
Closes #144
2016-10-12 11:36:22 -06:00
David Sparer
5d964f7638 Removed the visionapp Remote Desktop 2008 export option and all related code 2016-10-12 11:30:31 -06:00
David Sparer
81610dee0e Merge pull request #158 from mRemoteNG/Implement_new_cryptography_providers
Implement new crypto providers
2016-10-12 10:05:53 -06:00
David Sparer
f64c0ae266 Code cleanup 2016-10-12 10:00:31 -06:00
David Sparer
324992f6ff Fixed a variable that should have been renamed 2016-10-12 09:58:50 -06:00
David Sparer
c35ce9ffe1 Renamed source file to match class name 2016-10-12 09:53:05 -06:00
David Sparer
a13a6d3919 Renamed the SaveFilter properties to include the prefix "Save" 2016-10-12 09:51:08 -06:00
David Sparer
ac01c6fff2 Renamed the Save class to SaveFilter to better indicate its purpose 2016-10-12 09:49:33 -06:00
David Sparer
53074c7b20 Simplified the Save class 2016-10-12 09:45:38 -06:00
David Sparer
1d4ef9474f Added tests of all BlockCipherEngine and BlockCipherMode combinations to ensure encryption/decryption is working. 2016-10-12 09:33:18 -06:00
David Sparer
59e948fa06 Renamed function to better show its purpose 2016-10-12 09:06:18 -06:00
David Sparer
55fe30b02c Resolved bug when unable to decrypt the confCons file. The app will now exit without attempting to save the cons file (avoiding data corruption issues) 2016-10-12 09:00:28 -06:00
David Sparer
e2929f43a3 Code cleanup of GeneralAppInfo (mostly just renames) 2016-10-12 08:19:37 -06:00
David Sparer
9d67f58490 Replaced all calls to GeneralAppInfo.EncryptionKey to Runtime.EncryptionKey 2016-10-12 08:16:05 -06:00
David Sparer
a862240ed7 Code cleanup 2016-10-12 08:09:28 -06:00
David Sparer
0f604f453d Code cleanup 2016-10-12 07:38:47 -06:00
David Sparer
113e9eba79 Deserialization now works for full file encryption 2016-10-11 20:02:54 -06:00
David Sparer
9af610a45b Rewrote the full file encryption code for the xml serializer. It now conforms to the expected placement of encrypted data 2016-10-11 16:09:42 -06:00
Sean Kaim
e8db5d267e display proper options page on customize
and code clean up
2016-10-11 17:41:11 -04:00
David Sparer
201fbb71c1 Xml deserializer is working for the new confcons schema to detect and use variable encryption methods. Full file decryption does not currently function. 2016-10-10 20:08:01 -06:00
David Sparer
2f87e55ae6 Incremented confcons file serialization version 2016-10-10 19:42:22 -06:00
David Sparer
34af797ad2 Modified xml serializer to use the new confcons schema 2016-10-10 19:41:14 -06:00
David Sparer
4ca640eee5 Made modifications to the confcons v2.6 schema. Eliminated the EncryptionInfo node. Its attributes are now owned by Connections node. 2016-10-10 19:31:22 -06:00
David Sparer
29d1bf7ce5 Updated the max supported confcons version to 2.6 2016-10-10 15:24:36 -06:00
David Sparer
c2f9c687ce Added an attribute to the Xml element "EncryptionInfo" to indicate whether we should expect full file encryption 2016-10-10 15:21:45 -06:00
David Sparer
a8da64cc6a Removed old code for serializing the complete xml file 2016-10-10 15:20:51 -06:00
David Sparer
d522258e0a Made the nonce size a bit smaller for CCM mode to avoid some issues with large nonces 2016-10-10 15:08:10 -06:00
Sean Kaim
5f738f97ea Remove more announcement stuff 2016-10-10 16:53:38 -04:00
Sean Kaim
db319825a1 fix update file parsing 2016-10-10 16:52:33 -04:00
David Sparer
cbb9ceb709 XmlSerialization now saves the new EncryptionInfo element 2016-10-10 14:50:37 -06:00
David Sparer
333ee232ae Fixed a small issue with the CCM mode nonce size 2016-10-10 14:48:32 -06:00
David Sparer
963b483697 null access checks 2016-10-10 14:06:43 -06:00
David Sparer
49425a37ac Added attribute to schema 2016-10-10 14:06:02 -06:00
Sean Kaim
0da975a9d3 fix build error & cleanup 2016-10-10 15:31:55 -04:00
Sean Kaim
1ea0522fcb MR-364 - remove announcements
And some code clean up
2016-10-10 15:23:55 -04:00
David Sparer
aaaa0e6aea Little simplification of the v2.6 schema 2016-10-10 11:39:13 -06:00
David Sparer
42368f05f8 Xml serializer now respects encryption settings 2016-10-10 11:26:54 -06:00
David Sparer
4e51a5db73 Created an updated confCons schema which saves encryption details 2016-10-10 11:22:24 -06:00
David Sparer
4bd5a3675f Minor security page layout change 2016-10-10 09:59:45 -06:00
David Sparer
a4d3850f13 Changed the localized text "Block Cipher" to "Block Cipher Mode" 2016-10-10 09:56:51 -06:00
David Sparer
864d370994 Simplified some code 2016-10-10 09:53:24 -06:00
David Sparer
47f0550cea Security settings now save. Simplified data binding to the encryption dropdowns 2016-10-10 09:34:00 -06:00
David Sparer
1bbc2b0165 Resolved issue with de/serializing encrypting settings 2016-10-10 09:19:33 -06:00
David Sparer
fc8a1ec4fc Renamed the EncryptionBlockCipher setting to EncryptionBlockCipherMode 2016-10-10 09:13:06 -06:00
David Sparer
4baabd7d07 Moved the confcons schema to a new folder 2016-10-10 08:19:53 -06:00
David Sparer
92ba170cdf Added schema attributes for the root Connections node and added sequence indicator for connectioninfo nodes. Schema appears to be complete 2016-10-10 08:12:34 -06:00
David Sparer
e842850695 #157 Began creating xml schema file for the current confCons file since we will need to change the schema to include the current encryption parameters 2016-10-09 09:23:32 -06:00
Sean Kaim
41fcbb2989 enable update check 2016-10-07 17:50:22 -04:00
Sean Kaim
d6a6cf6a59 code clean up & remove ugly colors (go to control) 2016-10-07 17:49:49 -04:00
David Sparer
113c8f6d4a Combo boxes now set their selected item on creation based off of the user settings 2016-10-07 13:03:17 -06:00
David Sparer
8218acddca Created dropdowns for choosing the encryption engine and the block cipher 2016-10-07 12:44:11 -06:00
David Sparer
7cb65df19e Rearranged the Advanced page after removing an option 2016-10-07 12:25:30 -06:00
David Sparer
91ba993279 Moved the option to completely encrypt the connections file from the Advanced page to the Security page 2016-10-07 12:23:53 -06:00
David Sparer
505f3dd947 Began creating the Security options page 2016-10-07 12:17:59 -06:00
David Sparer
7eca66e2c4 Added shield icon for the new security options page 2016-10-07 12:13:26 -06:00
David Sparer
3111c5437b Merge pull request #156 from mRemoteNG/Installer_does_not_respect_KB2923545_to_fulfill_RDP8_requirement
Installer now respects KB2923545 to fulfill RDP8 requirement. This closes #151
2016-10-07 11:19:59 -06:00
David Sparer
d32a1adead Installer now accepts either the RDP8 or RDP8.1 KB 2016-10-07 11:18:09 -06:00
David Sparer
9c5a2c0196 Added more efficient support for checking if atleast one of a number of KBs are installed. 2016-10-07 10:26:21 -06:00
David Sparer
19a76008d7 Merge pull request #149 from mRemoteNG/Hunting_for_memory_leaks
Hunting for memory leaks
2016-10-07 09:01:36 -06:00
David Sparer
2ffcccdc6f Fixed minor memory leak of Collection and Property changed event handlers when changing the ConnectionTreeModel associated to the ConnectionTreeWindow 2016-10-06 11:04:00 -06:00
David Sparer
67c01046be Removed unnecessary implementations of IDisposable 2016-10-05 13:50:55 -06:00
David Sparer
c755d651cc Removed all destructors since they were a very bad idea to implement 2016-10-05 13:41:35 -06:00
David Sparer
0529729626 Merge pull request #148 from mRemoteNG/Connection_icon_not_updating_until_mouseover
Resolved #141
2016-10-05 13:07:21 -06:00
David Sparer
984d989f14 #141 TreeListView objects now update immediately when their OpenConnections list contents change 2016-10-05 12:57:29 -06:00
David Sparer
a204e34d53 Modified the Asserts lines of a few tests to give better info on failure 2016-10-05 12:45:50 -06:00
David Sparer
3e47041820 Fixed minor bug where ProtocolList.Clear() would trigger a CollectionChanged event even when no items were removed (list already empty) 2016-10-05 12:43:27 -06:00
David Sparer
c471f621b2 #141 ConnectionInfo now listens to collection changed events from the ProtocolList and raises a PropertyChanged event for OpenConnections when the list contents changes. 2016-10-05 12:37:05 -06:00
David Sparer
e2e010c418 Created test to check for safe indexer handling of unknown object types 2016-10-05 11:51:44 -06:00
David Sparer
913e0dd3e4 #141 Implemented INotifyCollectionChanged on ProtocolList and created unit tests 2016-10-05 11:47:22 -06:00
David Sparer
192a718d08 Cleanup of the protocollist. connected to #141 2016-10-05 10:45:48 -06:00
David Sparer
a881232eb1 Merge pull request #145 from mRemoteNG/MR-975_Replace_TreeView_with_TreeListview
MR-975 / #143 replace tree view with tree listview
2016-10-04 15:28:11 -06:00
David Sparer
cf73e827e0 Quick changelog entry 2016-10-04 15:25:14 -06:00
David Sparer
bf97905fe9 Merge branch 'develop' into MR-975_Replace_TreeView_with_TreeListview 2016-10-04 15:19:04 -06:00
David Sparer
f962b8a573 Right clicking on an empty connection panel no longer displays the context menu 2016-10-04 15:15:38 -06:00
David Sparer
9e9786ecc7 Resolved minor bug with copying default connection info data to folders 2016-10-04 15:14:37 -06:00
David Sparer
59d22b536a Fixed bug that occurs on startup when non-english language is selected. 2016-10-04 14:50:58 -06:00
David Sparer
e8d17fd733 Suppress tree refresh errors which occassionally occur 2016-10-04 14:28:43 -06:00
David Sparer
42f4cb618b Resolved bug where some new connections/containers would not respect the default connection info and default inheritance settings 2016-10-04 14:26:49 -06:00
David Sparer
faa240ab97 Sorting tree nodes is now recursive in all cases to be more in line with user expectations 2016-10-04 14:01:36 -06:00
David Sparer
a02e72d895 Resolved bug where app would crash when opening the Export form with no connection tree node selected 2016-10-04 13:24:24 -06:00
David Sparer
852b43b121 Resolved crash bug when attempting to import from AD when no connection tree node is selected (will import under the root node) 2016-10-04 13:21:54 -06:00
David Sparer
020823510d Fixed bug where app would crash when no tree node selected and trying to import from file 2016-10-04 12:50:02 -06:00
David Sparer
5c92128b17 Resolves #140. The decryption key was not being saved and used for further decryption attempts. This fix is quick/temporary and should be redone to remove Runtime references. 2016-10-04 11:31:41 -06:00
David Sparer
7cee3c9050 Created another unit test for the legacy crypto provider 2016-10-04 11:31:15 -06:00
Sean Kaim
f31cf9f839 waffle.io badge 2016-10-04 12:37:26 -04:00
David Sparer
960de69c20 Added note regarding a minor efficiency bug to investigate 2016-10-04 10:18:49 -06:00
Sean Kaim
6d8e4d14e6 contributing typo. 2016-10-04 11:55:38 -04:00
Sean Kaim
fd7929134b Merge pull request #139 from mRemoteNG/dot-github
.github support
2016-10-04 11:34:18 -04:00
David Sparer
40016f0d52 Code cleanup 2016-10-04 08:28:39 -06:00
David Sparer
05c46653a1 Resolved crash bug when deserialization fails (for example when we cant decrypt the file). 2016-10-03 15:02:16 -06:00
David Sparer
a932129d52 Very minor code cleanup 2016-10-03 12:12:15 -06:00
David Sparer
426c07ce75 Code cleanup of Runtime.cs 2016-10-03 12:10:56 -06:00
David Sparer
140723108e Resolved bug where the RemoteConnectionsSyncronizer wouldn't get disposed/deferenced when switching from using Sql to not using it 2016-10-03 12:05:07 -06:00
David Sparer
418f023780 Removed unused code 2016-10-03 12:02:48 -06:00
David Sparer
85b6e09ea6 Merge branch 'develop' into MR-975_Replace_TreeView_with_TreeListview 2016-10-03 10:46:49 -06:00
David Sparer
d6bd7e0886 Resolved bug where rearranging nodes by drag-n-drop would not save changes 2016-10-03 10:36:58 -06:00
David Sparer
2df93bea24 Reduced some complexity by merging the PeriodicConnectionsUpdateChecker with the RemoteConnectionsSyncronizer since they did nearly the same thing. 2016-10-03 10:28:08 -06:00
David Sparer
b474a67ef4 Fixed a few unit tests 2016-10-03 10:08:48 -06:00
David Sparer
ddd94da47b Code cleanup 2016-10-03 10:04:58 -06:00
David Sparer
48bd1854e4 Resolved saving to an Sql DB. Had to correclty arrange the column schema, add the ID column and make it autoincrement, and change a few data types. 2016-10-03 09:55:31 -06:00
David Sparer
6582ebcf57 Resolved minor bug that would occassionaly create unnecessary exceptions 2016-10-03 09:19:57 -06:00
David Sparer
41cd6f4290 Save supported by the RemoteConnectionsSyncronizer 2016-09-30 15:32:36 -06:00
David Sparer
5f40bab9c5 Enforce column data types 2016-09-30 15:31:46 -06:00
David Sparer
4b90b259a8 Created a class that brings all the various database classes together to keep the local connections tree updated with the remote connections tree. DB reads will now only occur if the local last update time is behind the remote last update time. 2016-09-30 14:49:14 -06:00
David Sparer
279682df11 the db update checker now runs on app startup 2016-09-30 13:55:25 -06:00
David Sparer
64b6c5967d Removed unused code 2016-09-30 13:50:41 -06:00
David Sparer
5826f055e3 DB updates now trigger reloading of connections data and rebuilding of the connection tree (somewhat thread safe) 2016-09-30 13:47:08 -06:00
David Sparer
e4ec71928d Cleanup 2016-09-30 09:28:20 -06:00
David Sparer
cb2ff4002f Moved some files to Config.Connections.Multiuser to keep things organized 2016-09-30 09:27:53 -06:00
David Sparer
36d5c888a5 Cleanup. Made PeriodicConnectionsUpdateChecker a bit more generically useful 2016-09-30 09:02:12 -06:00
David Sparer
de7493bc00 Implemented the ConnectionsUpdateAvailable event. 2016-09-30 08:35:41 -06:00
David Sparer
6819c1d9ff Made IConnectionsUpdateChecker implement IDisposable 2016-09-30 08:04:44 -06:00
David Sparer
021a3fe3bc Created interface IConnectionsUpdateChecker and modified SqlConnectionsUpdateChecker to implement it 2016-09-30 08:02:02 -06:00
David Sparer
0d70033e4c Some code rearranging 2016-09-30 08:01:15 -06:00
David Sparer
812cf21f98 Some updates that should have been committed with the last rename 2016-09-30 08:00:34 -06:00
David Sparer
f0da088836 Renamed SqlConnectionsProvider to PeriodicConnectionsUpdateChecker to better indicate its purpose 2016-09-30 07:50:49 -06:00
David Sparer
d7501751e3 Removed the SqlUpdateQueryBuilder since it serves very little purpose 2016-09-30 07:49:10 -06:00
David Sparer
94648f072e Code cleanup 2016-09-29 15:02:12 -06:00
David Sparer
a7d34b2c1b Code cleanup 2016-09-29 15:01:19 -06:00
Bennett Blodinger
26403096e8 .github support
Adds initail support for GitHub settings
2016-09-29 14:37:01 -04:00
David Sparer
62190bde17 Resolved crash that would sometimes occur when working with interfacecontrols 2016-09-29 11:38:40 -06:00
David Sparer
293b3d90b9 Cleanup 2016-09-29 11:31:35 -06:00
David Sparer
1928b904e5 Minor cleanup 2016-09-29 11:29:16 -06:00
David Sparer
a71cf6080f Fixed bug where loading a new connection file or creating a new one would not update the connection tree 2016-09-29 11:01:06 -06:00
David Sparer
14d56c3e28 Fixed crash when adding node with no treenode selected 2016-09-29 10:33:59 -06:00
Sean Kaim
707e3bc08f code cleanup 2016-09-29 11:57:23 -04:00
Sean Kaim
0614aef362 fix minor post build event errors 2016-09-29 11:50:05 -04:00
David Sparer
2ff9a7ff22 Large code cleanup of the ConnectionWindow class 2016-09-29 09:16:57 -06:00
David Sparer
3e4cfc16df Simplified teh ConnectionWindow drag_over handler and made it safer (actually does type checking) 2016-09-28 15:26:18 -06:00
David Sparer
fcd846bd6d Dragging connections/folder onto a connection panel now opens the connection(s). This restores functionality for dragging single connections, but is new functionality for folders 2016-09-28 15:09:50 -06:00
David Sparer
05028c958e Fixed crash that would occur when double clicking inside a connection window after disconnecting 2016-09-28 15:08:40 -06:00
David Sparer
40455e199b Fixed bug that would occasionally cause crashes when clicking 2016-09-28 15:05:04 -06:00
David Sparer
e5c9ccbdcc Moved all database connectors to the Config.DatabaseConnectors namespace 2016-09-28 14:15:39 -06:00
David Sparer
be22ebd789 Code cleanup 2016-09-28 13:57:35 -06:00
David Sparer
050d12a8ec Created tests for the ConnectionInfoComparer 2016-09-28 13:52:21 -06:00
David Sparer
5746d0264a Extracted some methods in the ExternalToolArgumentParser to make it more readable 2016-09-28 11:50:09 -06:00
David Sparer
0a4010d9a9 Created more test cases for the ExternalToolArgumentParser 2016-09-28 11:49:28 -06:00
David Sparer
ab30dd2294 Extracted a method in ExternalToolArgumentParser 2016-09-28 11:49:02 -06:00
David Sparer
f53e77ecc9 Added a few more parser tests 2016-09-28 10:53:06 -06:00
David Sparer
91da8f1b5f Reset the position of the main menu. At some point it got pushed to the side again 2016-09-28 09:57:35 -06:00
David Sparer
1bf616579b Added tests for the external tools arg parser 2016-09-28 09:50:38 -06:00
David Sparer
da2d48b49a Minor code cleanup 2016-09-28 08:20:16 -06:00
David Sparer
48b209155b Renamed class to be more indicative of its use 2016-09-28 08:10:13 -06:00
David Sparer
7fe8749807 Resolved bug with the Reconnect context menu item being permanently disabled for containers 2016-09-27 14:52:06 -06:00
David Sparer
b73547ced9 Connecting to an entire folder working again 2016-09-27 14:44:35 -06:00
David Sparer
9c8c22979f Resolved bug where hitting the delete key would bring up the prompt to delete root nodes and putty nodes 2016-09-27 13:56:03 -06:00
David Sparer
60b387ac56 Adding a new node will expand the parent container, select the new node, and ensure the new node is visible. Extracted a method since these actions are identical for both containers and connections 2016-09-27 10:36:30 -06:00
David Sparer
20339c1452 Fixed bug when trying to refresh the display of a folder that had 0 children but now has some 2016-09-27 10:33:34 -06:00
David Sparer
7a15a8151c Resolved error when attempting to connect to PuTTY session 2016-09-27 09:21:15 -06:00
David Sparer
967d9b1036 Renamed properties and fields of the Windows class to conform to naming guidelines 2016-09-26 15:27:41 -06:00
David Sparer
faec28ac78 Removed unused code 2016-09-26 15:25:18 -06:00
David Sparer
0832c8610b Removed unused code 2016-09-26 15:17:26 -06:00
David Sparer
fa7ca994e9 ConnectionList served no purpose and was removed 2016-09-26 15:10:32 -06:00
David Sparer
288221918e ContainerList serves no purpose 2016-09-26 15:07:59 -06:00
David Sparer
5462e96090 Removed unused code 2016-09-26 15:02:12 -06:00
David Sparer
a1b5d8bdc5 Removed unused code 2016-09-26 14:59:14 -06:00
David Sparer
bd280ad2b6 Removed unused code 2016-09-26 14:53:32 -06:00
David Sparer
0c460f7aab Removed unused code 2016-09-26 14:49:32 -06:00
David Sparer
634c420799 Refactored the SqlSaver code to use the new functions 2016-09-26 14:49:16 -06:00
David Sparer
0bdb57c44e Removed reference to unnecessary method 2016-09-26 14:47:41 -06:00
David Sparer
2540777e18 Removed unnecessary code 2016-09-26 14:12:06 -06:00
David Sparer
eaced33ed5 Refactored some code for creating a menu tree of the connectiontreemodel 2016-09-26 14:07:33 -06:00
David Sparer
0b97c47f4e Removed unused code 2016-09-26 13:18:36 -06:00
David Sparer
584075a9b1 Fixed the connections dropdown list 2016-09-26 13:13:11 -06:00
David Sparer
3febb2be5e Removed unused code 2016-09-26 12:53:42 -06:00
David Sparer
c4a9841ba6 Refactored Export and ExportForm to require ConnectionInfo rather than TreeNode for export 2016-09-26 12:51:28 -06:00
David Sparer
c613c3b4e1 Updated the ISerialize interface to require a Serialize(ConnectionInfo) method to support serializing a target connection/container 2016-09-26 12:22:55 -06:00
David Sparer
814f07212d Made ISerializer generic 2016-09-26 11:58:48 -06:00
David Sparer
a63120b78f Code cleanup 2016-09-26 11:43:47 -06:00
David Sparer
598a39fcc1 Removed unnecessary code 2016-09-26 11:28:37 -06:00
David Sparer
425fdb502c Removed unnecessary code and implemented directly in the calling class 2016-09-26 11:28:05 -06:00
David Sparer
3016ef8545 Removed unnecessary code 2016-09-26 11:22:05 -06:00
David Sparer
87b4dd09e4 Rewrote Sql connection loading to use the DataProvider/Deserializer 2016-09-26 11:19:53 -06:00
David Sparer
95f54b9330 Made IDataProvider generic to support multiple data formatting types (mostly to help with database support and DataTables) 2016-09-26 09:35:40 -06:00
David Sparer
1a8d4ea7fd Removed unnecessary code 2016-09-26 09:21:45 -06:00
David Sparer
e27424102b Removed unused code 2016-09-26 09:15:17 -06:00
David Sparer
d35540e691 Code cleanup 2016-09-25 14:42:03 -06:00
David Sparer
bda536cc62 Call to the message collector is causing tests to fail. Will need a test-safe way of indicating failure 2016-09-25 14:35:18 -06:00
David Sparer
cf3443ace3 Disabled password import tests for the RemoteDesktopConnectionManagerDeserializer. Since the passwords are encrypted using a machine key, decryption on other machines will always fail. 2016-09-25 14:32:01 -06:00
David Sparer
b8e05fc7da Refactored the DecryptPassword function in RemoteDesktopConnectionManagerDeserializer to use managed rather than native functions 2016-09-25 14:27:27 -06:00
David Sparer
ddfbb1d42e Created tests for PuttyConnectionManagerDeserializer 2016-09-25 14:01:43 -06:00
David Sparer
c4c255d560 Created tests for PortScanDeserializer 2016-09-25 13:28:01 -06:00
David Sparer
b1fd47ff9d Renamed the Scanner class to PortScanner 2016-09-25 12:29:30 -06:00
David Sparer
636848ed26 Split the ScanHost class to its own file. 2016-09-25 12:27:58 -06:00
David Sparer
6e713ebd83 Moved some tests to the right namespace 2016-09-25 12:16:19 -06:00
David Sparer
80a4d2af59 Created tests for various bad version/schema scenarios 2016-09-25 12:10:48 -06:00
David Sparer
d0153da3d1 Created more tests for teh RemoteDesktopConnectionManagerDeserializer 2016-09-25 11:32:02 -06:00
David Sparer
aa6f467942 Made the parsing code a bit safer 2016-09-25 11:31:41 -06:00
David Sparer
34f8a123a5 Resolved bug with importing gateway password from RDCMan when not stored in clear text 2016-09-25 11:11:06 -06:00
David Sparer
63ae7d845c Code cleanup 2016-09-25 10:55:41 -06:00
David Sparer
12d8097774 Ensured UseConsoleSession bool could be parsed 2016-09-25 10:55:22 -06:00
David Sparer
ae4ce70c48 Began creating tests for the RemoteDesktopConnectionManagerDeserializer 2016-09-25 10:39:06 -06:00
David Sparer
cc43eab6ee Removed unnecessary code 2016-09-25 10:38:29 -06:00
David Sparer
ea5ec58ca3 Made the version checker a bit safer 2016-09-25 09:56:43 -06:00
David Sparer
775499a1ff Created more tests for the RemoteDesktopConnectionDeserializer 2016-09-24 12:18:37 -06:00
David Sparer
46d04541f1 Began creating unit tests for RemoteDesktopConnectionDeserializer 2016-09-23 23:13:19 -06:00
David Sparer
d80497011b Removed unnecessary code 2016-09-23 13:00:58 -06:00
David Sparer
02fea4ad5d Code cleanup 2016-09-23 12:48:56 -06:00
David Sparer
effc6fc9dd PortScanDeserializer created. Import now working 2016-09-23 12:47:48 -06:00
David Sparer
300fb55ec5 Created ActiveDirectoryDeserializer. Import is now working 2016-09-23 12:03:36 -06:00
David Sparer
8a1f2cbca8 Moved all serializers/deserializers to the mRemoteNG.Config.Serializers namespace 2016-09-23 11:06:13 -06:00
David Sparer
dec411e866 Created PuttyConnectionManagerDeserializer. Import is now working 2016-09-23 10:59:16 -06:00
David Sparer
88f40841d4 Code cleanup 2016-09-23 10:33:01 -06:00
David Sparer
c73aaa5455 Renamed PuttyConnectionManager to PuttyConnectionManagerImporter 2016-09-23 10:19:58 -06:00
David Sparer
6bf493f9a1 Created a RemoteDesktopConnectionManagerDeserializer. Importing from RDCM now works 2016-09-23 10:12:18 -06:00
David Sparer
b0be42815d Cleanup of RDCM Importer 2016-09-23 08:49:29 -06:00
David Sparer
79a423fc18 Renamed RemoteDesktopConnectionManager to RemoteDesktopConnectionManagerImporter 2016-09-23 08:38:08 -06:00
David Sparer
7047f2580f Cleanup 2016-09-22 15:24:06 -06:00
David Sparer
e8080aff58 Renamed ActiveDirectory to ActiveDirectoryImporter 2016-09-22 15:22:46 -06:00
David Sparer
d8ffed6e75 Renamed PortScan to PortScanImporter 2016-09-22 15:21:35 -06:00
David Sparer
0a3f201cb7 Created a deserializer for microsoft RDC and updated the importer 2016-09-22 15:20:28 -06:00
David Sparer
00adac42b8 mRemoteNG import doesnt need to be static 2016-09-22 15:17:54 -06:00
David Sparer
9a07ac075f Renamed RemoteDesktopConnection to RemoteDesktopConnectionImporter 2016-09-22 14:21:20 -06:00
David Sparer
44053f92c6 Importing mremoteng export files now works again 2016-09-22 14:17:34 -06:00
David Sparer
21475e0596 Small code cleanup 2016-09-22 12:38:50 -06:00
David Sparer
3ac09748db Opening a loading a putty session and showing the putty configuration window will no longer freeze mRemoteNG 2016-09-22 12:31:22 -06:00
David Sparer
91ff0786cc Rearranged some functions 2016-09-22 12:30:18 -06:00
David Sparer
45b207f399 Added property changed event handler to the connection tree. Model property updates will now be immediately reflected by the tree view 2016-09-22 12:06:18 -06:00
David Sparer
d7d15a0ab3 Fixed a typo in the ConnectionTreeModel's NotifyPropertyChanged event propogation 2016-09-22 12:04:30 -06:00
David Sparer
bce8d2e4b8 Forgot to commit this bit 2016-09-22 11:56:46 -06:00
David Sparer
d4e48e8b63 Fixed bug where app would crash when changing node name from config window 2016-09-22 11:56:12 -06:00
David Sparer
6de57ee0d4 ConnectionTreeModel now implements INotifyPropertyChanged and subscribes to child events 2016-09-22 11:55:28 -06:00
David Sparer
c3c9bb33a2 Code cleanup 2016-09-22 11:46:26 -06:00
David Sparer
ff4e6ab3ca Fixed bug where nodes could be dragged (with errors) above or below the root connections node 2016-09-22 10:45:00 -06:00
David Sparer
b646e7ef70 Minor optimization tree refresh when dragging nodes between containers. There is still a small disruption in the UI (~200ms) when moving nodes between containers. 2016-09-22 10:36:37 -06:00
David Sparer
981919335d Resolved a severe performance issue with refreshing the tree after drag-n-drop operations 2016-09-21 14:06:05 -06:00
David Sparer
42fcdd2267 Renamed variable to be more in line with other uses in the class 2016-09-21 10:43:01 -06:00
David Sparer
2b6367a8a9 Fixed bug where connections/containers could be dragged between putty session nodes 2016-09-21 10:38:41 -06:00
David Sparer
cbe0c1a550 Created tests for model-dropped 2016-09-21 10:22:25 -06:00
David Sparer
759c072c11 Refactored ModelDropped handler to be more test-friendly 2016-09-21 10:22:10 -06:00
David Sparer
d39e2a506f Added tests 2016-09-21 09:55:46 -06:00
David Sparer
f035872592 Extracted a method to increase readability 2016-09-21 09:55:33 -06:00
David Sparer
0324225c38 Added new convenience/optimization functions to containerinfo 2016-09-21 09:40:33 -06:00
David Sparer
a352516176 Fixed a bug where you could try to drag connection/containers onto a root putty session node 2016-09-21 09:38:54 -06:00
David Sparer
07fab69221 Created more tests for drag and drop handler 2016-09-21 09:35:07 -06:00
David Sparer
82804c1390 Fixed small bug in the drag and drop handler refactor that was causing info messages to not refresh all the time. 2016-09-21 09:10:32 -06:00
David Sparer
536d6f7c29 Refactored ConnectionTreeDragAndDropHandler to be more unit-test friendly. Began creating unit tests for it 2016-09-21 09:03:11 -06:00
David Sparer
a4ec3291ca Small drop-n-drop optimization 2016-09-20 13:56:03 -06:00
David Sparer
10420d9e7f ConnectionTreeWindow now updates its treelistview based on eventing from its ConnectionTreeModel 2016-09-20 13:03:25 -06:00
David Sparer
522d139044 ConnectionTreeModel now listens for and propogates collection changed events on child members 2016-09-20 13:02:15 -06:00
David Sparer
81a944a95c ContainerInfo objects now subscribe to child collection changed events 2016-09-20 13:01:17 -06:00
David Sparer
75b4ea175b Small cleanup 2016-09-20 12:27:20 -06:00
David Sparer
62b1402b43 Removing putty sessions now updates the treelistview as expected 2016-09-20 12:23:55 -06:00
David Sparer
688dbd1ce9 Added a convenience property and a way to remove sessions that triggers eventing 2016-09-20 12:07:05 -06:00
David Sparer
941e3d5904 Added putty model update code to tree view. Adding putty sessions works as expected 2016-09-20 12:00:04 -06:00
David Sparer
a938e098e5 Added support for propogating child session collection changed events 2016-09-20 11:36:45 -06:00
David Sparer
1bda39bc7e Implemented collectionchanged event on puttysessionprovider 2016-09-20 11:29:05 -06:00
David Sparer
6c5fedb631 Made the puttyrootnode property on puttysessionsproviders virtual to allow overriding 2016-09-20 11:13:45 -06:00
David Sparer
55e48742a9 Code cleanup 2016-09-20 10:48:20 -06:00
David Sparer
9a13273726 Renamed event SessionChanged to PuttySessionChanged 2016-09-20 10:37:39 -06:00
David Sparer
45e641067b Renamed SessionChangedEventHandler to PuttySessionChangedEventHandler 2016-09-20 10:36:39 -06:00
David Sparer
6a7dedfe67 Renamed SessionChangedEventArgs to PuttySessionChangedEventArgs 2016-09-20 10:35:58 -06:00
David Sparer
28fa043b32 Added support to the SessionChangedEventArgs to allow providing which session changed 2016-09-20 10:35:20 -06:00
David Sparer
d7c339ccea Refactored some of the eventing code in AbstractPuttySessionsProvider to make it less complex 2016-09-20 10:24:42 -06:00
David Sparer
cdc6567628 Forgot to commit this change to the Args change 2016-09-20 10:23:46 -06:00
David Sparer
fb315fd782 Moved the SessionChangedEventArgs to its own class file. Embeded classes are generally not a good idea 2016-09-20 10:23:03 -06:00
David Sparer
0907a19821 Renamed PuttySessionManager.AddSessionsToTree to just AddSessions to reflect that it does not directly work on any tree objects. Implemented the CollectionChanged event for the sessions providers collection 2016-09-20 10:12:46 -06:00
David Sparer
00b0552e5e Made PuttySessionManager a singleton rather than static. Began implementing collectionchanged event to notify when the putty session list changes 2016-09-20 09:55:05 -06:00
David Sparer
9949907adc Slightly better way to set root nodes on the treelistview 2016-09-20 09:50:20 -06:00
David Sparer
94ab1ddfbc Slight optimization of the treelistview CanExpandGetter 2016-09-20 09:49:47 -06:00
David Sparer
c13ff71f9a Abstracted the way we refresh tree model objects 2016-09-20 09:36:39 -06:00
David Sparer
e64ebf06f1 Fixed bug with calling CollectionChanged when sorting container children 2016-09-20 09:34:22 -06:00
David Sparer
20f527ae94 Created more ContainerInfo tests 2016-09-20 09:07:30 -06:00
David Sparer
1b0f9fcd88 Created more ContainerInfo tests 2016-09-20 09:02:03 -06:00
David Sparer
05799767a0 Added more ContainerInfo tests. Refactored a bit 2016-09-20 08:54:41 -06:00
David Sparer
86cb233cf6 Implemented INotifyCollectionChanged on the container children list rather than the INotifyPropertyChanged. It makes more sense, though we will need to implement UI refresh listeners on the TreeListView manually now (objectlistview currently only respects INotifyPropertyChanged events) 2016-09-20 08:37:44 -06:00
David Sparer
5838ff045a Implemented INotifyPropertyChanged for the Children proptery of the ContainerInfo object 2016-09-19 13:00:23 -06:00
David Sparer
95ddca0d7c Implemented INotifyPropertyChanged on AbstractConnectionInfoData (and thus on every connectioninfo subtype) 2016-09-19 12:54:01 -06:00
David Sparer
a03e2783d4 Created another level of abstraction between the data shared by all connection info objects and the behavior shown by certain connection info objects 2016-09-19 11:25:58 -06:00
David Sparer
f0638b0dd8 Cleanup 2016-09-19 10:58:37 -06:00
David Sparer
ab3e00f42c Fixed issue with using the proper tree images for the putty nodes 2016-09-19 10:44:23 -06:00
David Sparer
c67971035d Only show putty provider if it has sessions 2016-09-19 10:40:40 -06:00
David Sparer
3c55446e86 Putty sessions now being shown in connection tree again 2016-09-19 10:38:08 -06:00
David Sparer
fd559b61b1 Renamed PuttySessionsProvider to AbstractPuttySessionsProvider 2016-09-19 08:44:08 -06:00
David Sparer
77ca139363 Renamed class "Sessions" to "PuttySessionsManager" 2016-09-19 08:13:12 -06:00
David Sparer
f0828d3870 Some code cleanup 2016-09-19 08:08:34 -06:00
David Sparer
0e4ffde6ca Some file/class renaming 2016-09-15 13:41:32 -06:00
David Sparer
a50f96606b Resolved bug when editing a tree node name - the context menu would steal keyboard input for its shortcut keys 2016-09-15 13:31:00 -06:00
David Sparer
ecb77238a3 Sorting nodes now works (ascending/descending) 2016-09-15 12:05:46 -06:00
David Sparer
3fe5801366 Context menu item enable/disabled based on node type is now working again 2016-09-15 10:01:20 -06:00
David Sparer
9807231b72 Basic switch has been completed. Most context menu actions are working as expected. 2016-09-15 09:56:04 -06:00
David Sparer
eed85b3641 Finished creating pass-through events for the underlying context menu 2016-09-15 09:06:54 -06:00
David Sparer
7d7d4e62a3 Began moving connection tree context menu to its own class 2016-09-14 15:26:21 -06:00
David Sparer
f0f9d2a6aa Little bit of cleanup 2016-09-14 15:07:19 -06:00
David Sparer
7b2a30dcbf Starting external tools from the connections tree now works 2016-09-14 14:52:47 -06:00
David Sparer
b214efc029 Fixed SSH transfer window creation from context menu 2016-09-14 14:41:13 -06:00
David Sparer
e74884bcea any letter or number key press while the connections tree has focus will activate the search box 2016-09-14 14:27:31 -06:00
David Sparer
4accd71744 Hitting escape while the search box has focus switches focus to the connections tree 2016-09-14 14:19:43 -06:00
David Sparer
fa7c170540 Rather than yellow highlight, just make the node highlightling the same whether the contol has focus or not 2016-09-14 13:59:30 -06:00
David Sparer
92360eb2ce Fixed node search bug when no results are returned. 2016-09-14 13:58:51 -06:00
David Sparer
b13382a6ee Hooked up the keydown event with the new connection tree 2016-09-14 13:19:31 -06:00
David Sparer
b9718edfd3 Folders will now expand when scrolling through search results 2016-09-14 13:07:08 -06:00
David Sparer
d3e2976ff9 Scrolling through search results now ensures that the node is visible. Up/down keys no longer move the search box text cursor 2016-09-14 12:38:54 -06:00
David Sparer
5e84b7cffe Made search match nodes highlighted in yellow 2016-09-14 12:24:22 -06:00
David Sparer
764eb764ce Fixed case sensitivity when searching for nodes 2016-09-14 12:23:42 -06:00
David Sparer
a992b41e26 Refactored node searching to a new class 2016-09-14 11:43:40 -06:00
David Sparer
7d882c3f74 Added function to get all children of the connectiontreemodel, including root nodes 2016-09-14 11:42:56 -06:00
David Sparer
668e8de7df Removed unnecessary code 2016-09-14 10:19:53 -06:00
David Sparer
29ad420916 ExpandAll and CollapseAll now work 2016-09-14 10:17:43 -06:00
David Sparer
f743942e65 Fixed ExpandAll 2016-09-14 10:06:56 -06:00
David Sparer
0a120e402e Removed unnecessary code 2016-09-14 10:05:38 -06:00
David Sparer
6bc0c79624 Created a convenience function for determining if a container has children 2016-09-14 10:00:27 -06:00
David Sparer
6860ddced3 Reimplemented confirmation boxes when deleting tree nodes 2016-09-14 09:59:57 -06:00
David Sparer
ddf5e38396 Fixed minor bug where folders with no contents had an expand button 2016-09-14 09:44:15 -06:00
David Sparer
2ff2e448be Removed unnecessary code 2016-09-14 09:40:15 -06:00
David Sparer
9882dda905 Resolved issue with tree actions from the File menu. This is still an ugly fix, but its working 2016-09-14 09:27:05 -06:00
David Sparer
88d005caf6 Rearranged some event handler declarations 2016-09-14 08:59:03 -06:00
David Sparer
eba5fc9caf Slight optimization of updating the tree when deleting a node. Refresh one row rather than the whole tree 2016-09-14 08:39:12 -06:00
David Sparer
3a2f35f697 Duplicating a node now places it under the node that it was copied from, rather than the bottom of the list. (this was the previous behavior) 2016-09-14 08:36:58 -06:00
David Sparer
2ba3e95379 Removed unnecessary tooltip code 2016-09-14 07:59:36 -06:00
David Sparer
023570298b Removed unnecessary code 2016-09-14 07:41:38 -06:00
David Sparer
cf7e4d1f52 Moved GetExtAppByName() back to Runtime. Will make more sense for later refactoring 2016-09-12 10:20:35 -06:00
David Sparer
a09ce702c1 Removed unnecessary code 2016-09-12 10:17:14 -06:00
David Sparer
4c6f5dd72d Renamed some variables to adhere to style guidelines 2016-09-12 10:12:00 -06:00
David Sparer
dabed1568c Removed another OpenConnection overload that didnt take a connectioninfo object 2016-09-12 10:09:15 -06:00
David Sparer
79dee21f9b Removed empty arg overload for OpenConnection(). We always require a connectioninfo object 2016-09-12 10:07:05 -06:00
David Sparer
6ccbe69c02 Retargeted all Runtime.OpenConnection() to ConnectionInitiator.OpenConnection(). Will help with later iterative refactors 2016-09-12 10:00:53 -06:00
David Sparer
3ad8a14786 Initial refactor of connection initiation (which is heavily tied into how the connection tree was previously being managed) 2016-09-12 09:52:12 -06:00
David Sparer
c79ee46551 Removed unnecessary code 2016-09-12 08:49:32 -06:00
David Sparer
b391940037 Merge branch 'develop' into MR-975_Replace_TreeView_with_TreeListview
# Conflicts:
#	mRemoteV1/Config/SqlDatabaseConnector.cs
#	mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs
2016-09-12 08:40:43 -06:00
Sean Kaim
d5a54dd63d code clean up 2016-09-09 17:08:27 -04:00
Sean Kaim
6799ac2b30 code clean up 2016-09-09 17:08:15 -04:00
Sean Kaim
2f10e60dbf code clean up 2016-09-09 16:39:24 -04:00
Sean Kaim
95c818d92e code clean up
Octet1.Text.Remove didn't actually do anything. Text is already removed
properly when backspace is pressed without this code in the event
handlers.
2016-09-09 16:23:03 -04:00
David Sparer
e6f846107a drag-n-drop now supports rearranging nodes. Fixed a small bug with child rearrangement 2016-09-09 14:05:22 -06:00
Sean Kaim
b757ab7424 MR-979 - switched to notifications pnl incorrectly 2016-09-09 15:46:21 -04:00
David Sparer
d439a0df00 Created functions to rearrange child nodes. Moving nodes up/down now working 2016-09-09 12:03:35 -06:00
David Sparer
c3e14afe0a Created localization strings for drag-n-drop feedback messages 2016-09-09 10:33:20 -06:00
David Sparer
22f43d63ec Renamed drag-n-drop handlers 2016-09-09 10:32:25 -06:00
David Sparer
07c364cf0b Added support for changing the feedback color when dropping a node is allowed/denied. Removed unnecessary code 2016-09-09 10:18:52 -06:00
David Sparer
96485d9b9f Added check to prevent dragging a node onto the folder in which it already resides 2016-09-09 10:11:53 -06:00
David Sparer
4cdfeeecf2 Turns out we didn't need a custom Equals comparer for ConnectionInfo. Rolling back since it's probably best to keep the default implementation unless we actually need a custom one. 2016-09-09 09:57:21 -06:00
David Sparer
00abd53b19 Fixed issue with preventing dragging node onto itself. Feedback highlighting is disabled when attempting to drag un-draggable node. 2016-09-09 09:56:30 -06:00
Sean Kaim
6666552b8a code clean up and ensure settings save 2016-09-09 11:54:06 -04:00
David Sparer
b65fdbdd78 Overrode the Equals method for ConnectionInfo. Equality based on ConstantID 2016-09-09 09:50:06 -06:00
David Sparer
7c7d791f31 Renamed a few variables and created a check for dragging a node onto itself 2016-09-09 09:40:18 -06:00
David Sparer
d66f333bd5 Refactored drag-n-drop code to its own class 2016-09-09 09:35:13 -06:00
Sean Kaim
5afb9c572e code clean up 2016-09-09 11:31:43 -04:00
David Sparer
866aeab76b Changed the drag-drop highlight color 2016-09-09 08:25:56 -06:00
Sean Kaim
ae13b5f920 code clean up/remove unused files 2016-09-09 10:24:02 -04:00
David Sparer
cfbcb502d8 Removed unnecessary code 2016-09-08 10:54:36 -06:00
David Sparer
5f8d274b94 Drag and drop now working 2016-09-08 10:50:47 -06:00
David Sparer
092171982b Modified the IHasParent interface to include another common method 2016-09-08 09:10:52 -06:00
David Sparer
30ccc0c76c Resolved bug that broke the "child node only ever has one parent" rule 2016-09-08 09:01:21 -06:00
David Sparer
bf23d78e41 Node tool tips now working. Removed unnecessary code 2016-09-08 08:32:08 -06:00
David Sparer
08466f5179 Refactored the single node click event handler to handle the CellClick event instead of MouseClick to be more in line with the double click event handler 2016-09-08 08:24:01 -06:00
David Sparer
4ca07d534b Double click actions on tree nodes now working 2016-09-08 08:22:23 -06:00
David Sparer
3237875aee Merge branch 'develop' into MR-975_Replace_TreeView_with_TreeListview 2016-09-08 07:53:49 -06:00
David Sparer
c8db438cca Fixed single mouse click on node 2016-09-07 15:28:22 -06:00
David Sparer
5ea2304d5e Duplicating nodes now works 2016-09-07 14:36:52 -06:00
Sean Kaim
197652f8eb lock the file menu in place 2016-09-07 16:26:37 -04:00
Sean Kaim
80b16d8b57 lock the file menu in place 2016-09-07 16:10:32 -04:00
Sean Kaim
b8d78c1733 lock the file menu in place 2016-09-07 15:08:01 -04:00
David Sparer
8bf5004147 Fixed nullref error when attempting to delete a node when nothing is selected 2016-09-07 12:49:41 -06:00
David Sparer
89538e7289 New folders created with "New Folder" as the text 2016-09-07 12:47:51 -06:00
David Sparer
ff46d39a6a AddFolder now working 2016-09-07 12:45:44 -06:00
David Sparer
b843a55a25 AddNode is working 2016-09-07 12:41:07 -06:00
David Sparer
54008af8bf Deep clone for containers 2016-09-07 10:40:38 -06:00
David Sparer
d73f0d2401 Resolved nullref error with SetParent 2016-09-07 10:36:03 -06:00
David Sparer
86228e4270 Updated some Clone methods to be deeper 2016-09-07 10:29:16 -06:00
David Sparer
5ab5688844 Renamed Inheritance.Copy to Clone 2016-09-07 10:02:45 -06:00
David Sparer
53cb4149da Missed a commit for the Copy -> Clone rename 2016-09-07 09:52:55 -06:00
David Sparer
1056e20ec2 Renamed Copy to Clone 2016-09-07 09:47:15 -06:00
David Sparer
a589f337b7 Removed more unnecessary code 2016-09-07 09:37:12 -06:00
David Sparer
73ee88ab08 Removed unnecessary code 2016-09-07 09:28:41 -06:00
David Sparer
1e68483deb - Renamed IParent to IHasParent
- Renamed Add, AddRange, Remove, RemoveRange to include the word "Child" to make it more explicit
- Added SetParent and RemoveParent functions
- DeleteNode now works
2016-09-07 09:24:30 -06:00
Sean Kaim
9c168087af code cleanup / moved try in CloseConnectionTab 2016-09-07 11:21:22 -04:00
Sean Kaim
d988644b6a code cleanup/system colors for form/msg format 2016-09-07 11:00:03 -04:00
David Sparer
22c21222d3 Added more TODO notes for functionality that needs to be fixed for the treelistview change 2016-09-07 07:34:40 -06:00
David Sparer
73627a680c AfterSelect event working again 2016-09-06 18:56:28 -06:00
David Sparer
e70e8262e6 EnsureRootNodeVisible now works 2016-09-06 18:08:17 -06:00
David Sparer
8a74809ea4 Fixed opening previous connections to work with the tree list view 2016-09-06 18:05:46 -06:00
David Sparer
9cf3c23328 Disabled full row select to be more in line with previous functionality 2016-09-06 16:37:39 -06:00
David Sparer
40347c09ba minor update 2016-09-06 15:28:56 -06:00
David Sparer
64ed15ffae Got the tree node images working with the new TreeListView 2016-09-06 15:28:38 -06:00
David Sparer
617ec4cc3e Moved the code for generating a recursive list of children to ContainerInfo where it makes more sense. Left a helper function in ConnectionTreeModel where it may still be useful 2016-09-06 14:55:19 -06:00
David Sparer
bec154e538 Resolved issue serializing the connection tree node types (connect/container) 2016-09-06 14:48:53 -06:00
David Sparer
6e565c0b31 Fixed support for saving tree node expansion 2016-09-06 14:41:59 -06:00
David Sparer
c2b32de533 Added support for expanding all previously expanded nodes 2016-09-06 14:11:40 -06:00
David Sparer
454f007e42 Created helper function GetChildList in ConnectionTreeModel to retrieve a flat list of all connections/folders under a particular node 2016-09-06 13:59:10 -06:00
David Sparer
44a81cb7d8 Fixed scheme issue in the data table serializer 2016-09-06 13:57:26 -06:00
David Sparer
4623853399 Rearranged some code 2016-09-06 13:03:41 -06:00
David Sparer
15c894845c Created function to expand the root node on load. Refactored some delegate code 2016-09-06 12:58:27 -06:00
David Sparer
10597aed2f Renamed the Name column 2016-09-06 12:38:06 -06:00
David Sparer
2810fa7f80 Removed unnecessary tree update function. Added TODO comments for all functionality broken by the change to the TreeListView 2016-09-06 12:33:50 -06:00
David Sparer
a6dbc59ad1 Made the connection node name column take up all available space (similar to previous implementation) 2016-09-06 12:32:34 -06:00
David Sparer
1afe93be66 Began implementing TreeListView to replace the regular TreeView for the connection list. This will utilize a virtual list rather than a concrete set of tree nodes to model the connection list hierarchy. 2016-09-06 12:14:11 -06:00
David Sparer
1bd6839b21 Resolved bug with loading folders from SQL 2016-09-06 09:24:39 -06:00
David Sparer
b5e3564724 Fixed null ref error when viewing folders in some situations 2016-09-02 15:20:41 -06:00
David Sparer
8b143a2713 Fixed issue with creating node hierarchy 2016-09-02 15:07:22 -06:00
David Sparer
543f5e126f Fixed enum casts in DataTableSerializer 2016-09-02 14:54:34 -06:00
Sean Kaim
a5ac70cd3f changelog 2016-09-02 15:42:45 -04:00
Sean Kaim
07ed1b3f74 MR-586 - Reduce document title length
Also, code clean up...
2016-09-02 15:17:32 -04:00
Sean Kaim
7218208355 code clean up 2016-09-02 13:04:29 -04:00
David Sparer
d483c6a726 Merge branch 'develop' into MR-975_Replace_TreeView_with_TreeListview
# Conflicts:
#	mRemoteV1/App/Runtime.cs
#	mRemoteV1/UI/Window/ConnectionTreeWindow.cs
2016-09-02 09:20:58 -06:00
David Sparer
cb3fe686f3 Renamed function to be a bit more descriptive 2016-09-01 13:25:36 -06:00
Sean Kaim
69477cf3b4 changelog update 2016-08-30 17:07:10 -04:00
Sean Kaim
c114c68f15 MR-938 - add resolution / code clean up 2016-08-30 16:31:46 -04:00
Sean Kaim
1858c0f000 remove unused references 2016-08-30 15:36:02 -04:00
Sean Kaim
5c203c8e30 fix theme 2016-08-29 17:56:18 -04:00
Sean Kaim
005425efb1 code clean up 2016-08-29 17:31:34 -04:00
Sean Kaim
0c87954755 code cleanup 2016-08-29 17:19:13 -04:00
Sean Kaim
3c11092af1 changelog updates 2016-08-29 17:18:56 -04:00
Sean Kaim
4b71540dc7 default menu and quickconnect to same line
The Main menu bar, and the QuickConnect bar should now default to the
same line in the UI (though, forwhatever reason, it doesn't look like
this in VS Designer 😕 )

Code Clean up including rafactor QuickConnectComboBox to the correct
namespace.

Slightly related to MR-458
2016-08-29 16:48:47 -04:00
Sean Kaim
e22e3967f5 code cleanup 2016-08-29 16:11:38 -04:00
Sean Kaim
50809f45a3 MR-366 - Show PuTTY type and version
on components check screen
2016-08-29 15:12:41 -04:00
Sean Kaim
82bbf9d39f fix non-portable build failure 2016-08-26 17:18:01 -04:00
Sean Kaim
4692b20a74 more code clean up 2016-08-26 17:07:59 -04:00
Sean Kaim
9a32aa3350 code clean up 2016-08-26 17:00:01 -04:00
Sean Kaim
6d1fa4764d code clean up 2016-08-26 16:10:24 -04:00
Sean Kaim
267af5d6db Update strings: VncSharpNG to VncSharp 2016-08-26 15:59:15 -04:00
Sean Kaim
4bcb06c35b Update .gitignore 2016-08-26 12:00:42 -04:00
David Sparer
ff14c91fe1 First attempt at deserializing hierarchy from flat database 2016-08-25 15:16:56 -06:00
David Sparer
a0f7241f85 Fixed db schema error 2016-08-25 15:15:58 -06:00
Sean Kaim
66e7dfe6d5 update .gitignore 2016-08-25 16:49:02 -04:00
David Sparer
1538628e16 minor code cleanup 2016-08-25 14:45:18 -06:00
David Sparer
1b9d18adc1 Began creating the DataTableDeserializer 2016-08-25 14:44:31 -06:00
David Sparer
124ebaa970 Built out the SqlDataProvider 2016-08-25 14:44:04 -06:00
David Sparer
b44e657279 made the DataTableSerializer more closely conform to the current DB schema 2016-08-25 14:43:43 -06:00
David Sparer
de24dbbb7a Resolved small bug with uninitialized sql dbs 2016-08-25 13:21:49 -06:00
David Sparer
60f79b4400 Fixed bug where uninitialized sql database would not load 2016-08-25 13:13:08 -06:00
David Sparer
03c8f96a46 Created serializer which creates a data table. This can then be used for more efficient bulk Sql transfers 2016-08-25 11:16:49 -06:00
David Sparer
13d833ac5c Very minor code cleanup 2016-08-25 08:06:57 -06:00
David Sparer
71683992a0 Renamed ISqlConnector to IDatabaseConnector 2016-08-24 10:55:59 -06:00
David Sparer
2c785ade51 Initial refactor of sql saving. not even close to done 2016-08-24 10:49:03 -06:00
David Sparer
530819e788 Renamed several files to be more in line with project standards 2016-08-24 10:21:26 -06:00
David Sparer
c4c175e107 Minor code cleanup 2016-08-24 10:05:27 -06:00
David Sparer
6280fdf973 Refactored code for exporting connections in visionapp remote desktop 2008 csv format 2016-08-24 09:56:53 -06:00
David Sparer
269366264d Resolve small bug that would occur when exporting csv multiple times 2016-08-24 09:26:50 -06:00
David Sparer
8137b0831c Fixed issue where ConnectionTreeModel was not always populated when exporting. 2016-08-24 09:18:28 -06:00
David Sparer
396f63a3c9 Added necessary call to save the csv file to disk 2016-08-24 09:17:55 -06:00
David Sparer
cf87f2ee4d Fixed issue with undeclared variable 2016-08-24 08:47:31 -06:00
David Sparer
c98e672a73 minor code cleanup 2016-08-24 08:45:45 -06:00
David Sparer
21fe39542d Renamed CsvConnectionsSerializer to CsvConnectionsSerializerMremotengFormat to help distinguish between this and another CSV serializer strategy 2016-08-24 08:44:52 -06:00
David Sparer
8747da47a5 Began creating a serializer for Csv formatting 2016-08-23 15:31:47 -06:00
David Sparer
b3ff4de2ae Moved all data providers to the namespace mRemoteNG.Config.DataProviders 2016-08-23 15:02:54 -06:00
David Sparer
bc52362123 ConnectionSave now uses the FileDataProviderWithBackup strategies for saving connections files in xml 2016-08-23 14:58:04 -06:00
David Sparer
dcd63f321c Expanded some of the FileDataProvider code and created two different strategies for handling saves with backups 2016-08-23 14:57:17 -06:00
David Sparer
093f8c2714 XmlConnectionsDeserializer now implements IDeserializer 2016-08-23 14:00:00 -06:00
David Sparer
94ee9a39b4 Saving XML data to file now decoupled 2016-08-23 13:59:30 -06:00
David Sparer
1c5ea9e3ff Re-enabled opening connections from last session 2016-08-23 09:49:39 -06:00
David Sparer
3c69644f21 Re-enable expanding previously expanded folders. Implementation is still not ideal, but it's better 2016-08-23 09:35:08 -06:00
David Sparer
a89a593f51 code cleanup 2016-08-23 09:16:09 -06:00
David Sparer
8f685faf9b Refactored to reduce coupling 2016-08-22 16:05:49 -06:00
David Sparer
020433d7ad Fixed issue with display of connections tree which was caused by new connection tree builder code 2016-08-22 16:04:06 -06:00
Sean Kaim
80aa4fb852 removed hack for rightclick import menu 2016-08-22 17:07:24 -04:00
David Sparer
a1a8bd9656 Merge branch 'develop' into MR-975_Replace_TreeView_with_TreeListview 2016-08-22 11:17:03 -06:00
Sean Kaim
72623281c4 Initial PortScan context menu import
Need to fix the event implementation because it's a total hack right
now.
Also, want to put the code for detecting selected hosts into it's own
method.
2016-08-19 17:41:48 -04:00
David Sparer
ccaa70c1a4 XmlConnectionDeserializer now creates a connectiontreemodel which is turned into a treeview by ConnectionTreeViewBuilder 2016-08-19 15:28:12 -06:00
Sean Kaim
aa1ce22ada Missed one... One port scan form 2016-08-19 17:10:17 -04:00
David Sparer
003793b082 Removed dependency on GeneralAppInfo class to improved testability 2016-08-19 14:32:55 -06:00
Sean Kaim
15611cea43 one port scan form (import always available) 2016-08-19 14:52:53 -04:00
David Sparer
7a366de0e3 minor code cleanup 2016-08-19 12:51:01 -06:00
David Sparer
3baaf8bda4 Began building logic to build a TreeView from a connection tree model 2016-08-19 12:46:49 -06:00
David Sparer
23dcb3e823 Renamed method XmlConnectionsDeserializer.LoadFromXml to "Deserialize" 2016-08-19 12:45:52 -06:00
Sean Kaim
66e7790ee0 more code clean up 2016-08-19 11:56:29 -04:00
Sean Kaim
3065126ed1 code clean up 2016-08-19 11:00:30 -04:00
Sean Kaim
98ae737fb8 code clean up and expcetion stack logging 2016-08-19 10:45:22 -04:00
Sean Kaim
52cfda1d8e move some old/unused files 2016-08-18 13:22:41 -04:00
Sean Kaim
f727c13e20 fix minor complier warning 2016-08-18 13:11:21 -04:00
Sean Kaim
0c01479866 rebuild solution fails on post build
error 1104
editbin also can't find mremoteng.exe - seems to be a timing issue.
Small sleep fixes it.
2016-08-18 12:16:19 -04:00
Sean Kaim
34c9ae7518 Fix a cast 2016-08-18 12:04:48 -04:00
Sean Kaim
960334b638 minor logging changes & clean up 2016-08-18 12:00:11 -04:00
Sean Kaim
32e7ee1917 changelog.txt update 2016-08-18 08:55:09 -04:00
David Sparer
6e221e753b code cleanup 2016-08-17 15:12:48 -06:00
David Sparer
501dffe5b2 Refactored to separate loading connection data from deserializing data into domain objects 2016-08-17 14:47:03 -06:00
David Sparer
90dc8274c5 Added ObjectListView to packages 2016-08-17 09:29:43 -06:00
David Sparer
0a5cb40f55 Merge branch 'MR-651_improper_connection_inheritance_behavior' into develop 2016-08-17 09:17:01 -06:00
David Sparer
6d7d587a33 Renamed "Parent" interface to "IParent" 2016-08-17 09:11:13 -06:00
David Sparer
35b6e2bf35 minor cleanup of PuttySessionInfo 2016-08-17 09:02:43 -06:00
David Sparer
d2ebb207ab minor cleanup 2016-08-17 08:54:56 -06:00
David Sparer
c3a7f3c950 Created more unit tests for connection info objects 2016-08-17 08:54:36 -06:00
Sean Kaim
b44efbd998 ssh file transfer Don't add file name to dest file 2016-08-16 15:55:23 -04:00
David Sparer
8bdba217a6 Added test for multi-folder (recursive) inheritance 2016-08-15 15:36:32 -06:00
David Sparer
81dd315dfe More connection tree integration tests 2016-08-15 15:01:55 -06:00
David Sparer
d0be7f16ba Began creating integration tests for the connection tree 2016-08-15 14:47:26 -06:00
David Sparer
818ac03e84 RootNodeInfo now inherits from ContainerInfo 2016-08-15 14:45:33 -06:00
David Sparer
41127e0e38 Added collection management functions to ContainerInfo (Add, AddRange, Remove, RemoveRange). Added unit tests 2016-08-15 12:02:29 -06:00
David Sparer
b4af59a873 Fixed some instances where "Inheritance" was mistakenly changed to "IInheritable" by resharper 2016-08-15 11:05:18 -06:00
David Sparer
08972ff234 New connection entries now get their initial data from the DefaultConnectionInfo 2016-08-15 10:51:56 -06:00
David Sparer
6653f9b110 Resolved bug with DefaultConnectionInfo.SaveTo 2016-08-15 10:39:26 -06:00
David Sparer
c6f2ebd92a Merge branch 'develop' into MR-651_improper_connection_inheritance_behavior 2016-08-15 10:06:47 -06:00
David Sparer
b50c061c0a minor code cleanup 2016-08-12 13:19:43 -06:00
David Sparer
bb0e92c519 DefaultConnectionInfo saving is now handled by the SaveTo method. Removed unnecessary Runtime method 2016-08-12 13:06:26 -06:00
David Sparer
682dc36d34 Added custom type conversion support to the SaveTo method of DefaultConnectionInfo 2016-08-12 13:05:44 -06:00
Sean Kaim
3a173821d7 1.75 Alpha 3 2016-08-12 14:12:57 -04:00
David Sparer
0df478d2aa Resolved runtime type conversion issue with DefaultConnectionInfo when loading from a serialized source 2016-08-12 11:18:17 -06:00
David Sparer
8d3ba881e5 Refactoring DefaultConnectionInfo handling to a new class which inherits from ConnectionInfo 2016-08-11 15:32:04 -06:00
Sean Kaim
4555db8e97 MR-965, MR-871, MR-629: Error 264 on RDP Connect
Error 264 is a timeout:
RDP disconnected!
264 This computer can't connect to the remote computer.

The two computers couldn't connect in the amount of time allotted. Try
connecting again. If the problem continues, contact your network
administrator or technical support.
2016-08-11 16:52:57 -04:00
David Sparer
bc2beb2c56 Rename Config.mRemoteNG to Config.mRemoteNGImporter 2016-08-11 13:45:18 -06:00
David Sparer
29bd6af2a2 Made ContainerInfo class inherit from ConnectionInfo class 2016-08-11 11:11:31 -06:00
Sean Kaim
1bbd20de3c Merge PR #130 - port scan button width 2016-08-10 16:48:42 -04:00
Sean Kaim
d1f4164498 Update changelog 2016-08-10 16:41:56 -04:00
Sean Kaim
d1c238a812 Merge pull request #134 from mRemoteNG/MR-946_Initial_SSH.NET
MR-946 initial ssh.net - File xfer
2016-08-10 16:03:56 -04:00
Sean Kaim
675bbd602f Remove old components, update credits.txt 2016-08-10 15:59:14 -04:00
Sean Kaim
ab1be61fda SFTP file transfer now works fully 2016-08-10 15:52:02 -04:00
David Sparer
754caca613 Convert to auto-properties 2016-08-10 11:16:27 -06:00
Sean Kaim
8097ab146c Merge remote-tracking branch 'refs/remotes/origin/develop' into MR-946_Initial_SSH.NET 2016-08-10 12:04:02 -04:00
David Sparer
c0c4b69c64 Rename interface "Inheritance" to "IInheritable" 2016-08-10 09:24:48 -06:00
David Sparer
315d90391c Merge branch 'MR-906_default_Inherit_All_not_saved' into develop 2016-08-10 09:14:18 -06:00
David Sparer
869a5fd773 Created several simple unit & integration tests for DefaultConnectionInheritance 2016-08-10 09:06:44 -06:00
David Sparer
9940cfcf12 Minor cleanup of the Config window class 2016-08-10 08:28:35 -06:00
Sean Kaim
463b6cd791 progress bar style 2016-08-09 17:53:02 -04:00
David Sparer
b981516913 Fix issue setting ICAEncryptionStrength through inheritance 2016-08-09 15:50:56 -06:00
David Sparer
9ffdbee400 Fix self-reference initialization error 2016-08-09 15:49:52 -06:00
Sean Kaim
def55c9dfe code formatting/clean up 2016-08-09 17:48:22 -04:00
Sean Kaim
69668c5e55 background transfer 2016-08-09 17:45:46 -04:00
David Sparer
f41adec096 Minor cleanup of ConnectionInfo 2016-08-09 15:25:21 -06:00
David Sparer
3cc56f9886 Minor cleanup of ConnectionInfoInheritance 2016-08-09 15:25:03 -06:00
Sean Kaim
be8b302e20 Merge remote-tracking branch 'refs/remotes/origin/develop' into MR-946_Initial_SSH.NET 2016-08-09 16:58:57 -04:00
Sean Kaim
6da05af387 code clean up & fix complier warnings 2016-08-09 16:58:44 -04:00
Sean Kaim
2eb74afc20 upload with progress bar working 2016-08-09 16:41:46 -04:00
David Sparer
c44bb1e27d Made DefaultConnectionInheritance.SaveTo a generic method to decouple it from Settings 2016-08-09 11:08:06 -06:00
David Sparer
12cd38a047 Made DefaultConnectionInheritance LoadFrom a generic method to decouple it from the Settings class 2016-08-09 11:02:53 -06:00
David Sparer
e5c896cb36 Refactored much of the inheritance code to use System.Reflection instead of hardcoded values.
Refactored DefaultInheritance to its own class which inherits from the ConnectionInfoInheritance class.
Fixed issue with DefaultInheritance not saving to settings.
2016-08-09 10:34:51 -06:00
Sean Kaim
d89a2487e7 Merge remote-tracking branch 'refs/remotes/origin/develop' into MR-946_Initial_SSH.NET 2016-08-08 17:56:10 -04:00
David Sparer
e59f91a976 Minor refactoring 2016-08-05 09:37:22 -06:00
David Sparer
9a80777fe9 Minor code cleanup in ConnectionInfoInheritance 2016-08-05 09:02:17 -06:00
David Sparer
69b1da50b8 Removed redundant namespace qualifier 2016-08-05 08:55:45 -06:00
Sean Kaim
04ada28ffc Latest SSH.NET package 2016-08-04 17:48:26 -04:00
David Sparer
369a6c2f04 Merge branch 'MR-896_RDP_Class_not_registered' into develop 2016-08-04 13:39:37 -06:00
David Sparer
f438fb65f8 Installer now checkes for KB2574819 on win7 before installation can occur 2016-08-04 13:37:36 -06:00
David Sparer
6590011ef1 Refactored the CustomActions for checking if a KB is installed. Made it more generic 2016-08-04 13:36:08 -06:00
David Sparer
b6eb3d2361 Added the CustomActions project to build by default for Release and Debug builds 2016-08-03 13:26:32 -06:00
David Sparer
13b9b77f0d Added exception catching to a CustomAction method 2016-08-03 13:25:38 -06:00
David Sparer
20419856c1 Minor update to changelog 2016-08-03 13:25:02 -06:00
David Sparer
43100930cd update changelog for 1.75 alpha 2 2016-08-03 12:40:56 -06:00
David Sparer
aac7e4cc53 Merge branch 'MR-874_incorrect_rdp_check_in_installer' into develop 2016-08-03 12:16:31 -06:00
David Sparer
1c8f3e2328 Some more code cleanup 2016-08-03 12:10:36 -06:00
David Sparer
a54f0a2e89 Cleaned up some CustomActions code 2016-08-03 12:08:03 -06:00
David Sparer
fdb3cecf8e Refactored CustomActions to extract a class 2016-08-03 12:07:13 -06:00
David Sparer
8762c39dd5 Refactored the way we verify the minimum RDP version is installed. Now, instead of using a dynamically named variable based on the required KB, we boil this down to a statically named variable that indicates if the minimum KB is installed. 2016-08-03 11:57:17 -06:00
David Sparer
fc56c56883 Cleanup of some custom action code 2016-08-03 11:14:36 -06:00
David Sparer
ae950ac075 Use var for local variables in CustomActions file 2016-08-03 10:26:37 -06:00
Sean Kaim
8bbb9a70c6 code clean up, ui tweaks, new backend class 2016-07-29 21:52:06 -04:00
Sean Kaim
e6532dc155 code clean up, Eng translation for reconn all 2016-07-29 15:47:44 -04:00
Sean Kaim
ee6af8c187 Merge pull request #133 from yegorich/reconnect
Add an option to reconnect all opened tabs
2016-07-29 15:32:57 -04:00
David Sparer
bc1a0725df Merge branch 'develop' into MR-942_refactor_connection_loader 2016-07-28 14:56:30 -06:00
Sean Kaim
37905f8249 Add nuget packages to tests 2016-07-28 16:49:44 -04:00
Sean Kaim
8163e7273e Add nuget packages to tests 2016-07-28 16:47:45 -04:00
Yegor Yefremov
58fdba1d89 Add an option to reconnect all opened tabs 2016-07-28 09:40:17 +02:00
Sean Kaim
203dcf714f Initial SSH.NET file transfer
Upload succeeds. UI status/etc needs work.
2016-07-27 22:56:28 -04:00
David Sparer
649f864236 Extracted some methods from the sql connection loader 2016-07-27 12:11:17 -06:00
David Sparer
292f3b03cc Refactored AddNodeFromXml to improve readability 2016-07-27 10:51:47 -06:00
David Sparer
ec8fe3c343 Extracted methods for adding connections / containers to the TreeView 2016-07-27 10:36:37 -06:00
David Sparer
823b0518ae Extracted a method for authenticating protected data 2016-07-27 09:59:41 -06:00
David Sparer
c48caf5bdc Minor cleanup of the Runtime methods that use the connections loader 2016-07-26 14:02:59 -06:00
David Sparer
20bc6d079f Extraced method for expanding folders 2016-07-26 12:45:37 -06:00
David Sparer
dccd318f60 Fixed an oversight with bool initialization 2016-07-26 12:44:24 -06:00
David Sparer
2b0f670fb7 Extracted method for opening connections from last session 2016-07-26 12:42:08 -06:00
David Sparer
b5c431dca8 Extracted more methods 2016-07-26 12:40:38 -06:00
David Sparer
57dd93f136 Extracted method for initializing the root tree node 2016-07-26 12:39:37 -06:00
David Sparer
976e02effb Extracted method to load xml data 2016-07-26 12:19:54 -06:00
David Sparer
396387340a Extracted method to validate confcon file version 2016-07-26 12:15:11 -06:00
David Sparer
d9bf021597 Use object initializer 2016-07-26 12:14:27 -06:00
David Sparer
b4e26f513b Removed unnecessary property from xml connection loader 2016-07-26 11:44:50 -06:00
David Sparer
2eef31f74d Renamed several database related properties to be more generic ("sql" -> "database") 2016-07-26 11:34:47 -06:00
David Sparer
cc96e2b3eb Removed more unused code 2016-07-26 11:30:52 -06:00
David Sparer
4526a0b875 Removed unnecessary using directives 2016-07-26 11:29:24 -06:00
David Sparer
4568bcc0ae Split Xml connection loader to its own class 2016-07-26 11:27:31 -06:00
David Sparer
cf3af14c6a Split connection loader code for Sql to its own class 2016-07-26 11:13:43 -06:00
David Sparer
d320c84bc8 Removed some more redundant code 2016-07-26 10:26:03 -06:00
David Sparer
8eff262e8f Removed redundant code 2016-07-26 10:10:41 -06:00
David Sparer
8c7d90f0c4 Use object initializers 2016-07-26 10:02:16 -06:00
David Sparer
0e189551dd Simplify conditional statements 2016-07-26 09:58:26 -06:00
David Sparer
981acd6510 Modified a few function names to adhere to style guidelines 2016-07-26 09:48:45 -06:00
David Sparer
404aae6bf3 Fixed some spacing and caught a few more place that var should have been used 2016-07-26 09:44:11 -06:00
David Sparer
57cc9b8de4 Import Messages namespace 2016-07-26 09:36:24 -06:00
David Sparer
d2def0a34d Use var for local variable declarations 2016-07-26 09:34:40 -06:00
David Sparer
f1a5e1c029 Renamed fields and properties to adhere to style guide and be more descriptive 2016-07-26 09:19:46 -06:00
David Sparer
19ae192887 Converted properties to auto-properties where possible 2016-07-26 09:16:31 -06:00
Sean Kaim
cc87227559 minor tweaks to AeadCryptographyProvider 2016-07-20 11:33:55 -04:00
Sean Kaim
9ad0c74a56 code clean up 2016-07-15 09:36:34 -04:00
Sean Kaim
55a8b743c8 Fix exception opening in Designer 2016-07-15 09:08:34 -04:00
Sean Kaim
7adb150d1c minor code clean up & logging 2016-07-14 15:33:41 -04:00
David Sparer
afdb392289 Jenkinsfile change may not be working properly. This is a test commit 2016-07-14 12:50:44 -06:00
David Sparer
1c8e24a117 Found a way to simplify the git checkout stage of the Jenkins pipeline 2016-07-14 12:46:52 -06:00
David Sparer
266e79a2c3 Fixed a merge mistake regarding the Geckofx package version 2016-07-14 10:48:15 -06:00
David Sparer
6c5d629a88 Merge branch 'MR-917_Improve_cryptographic_support' into develop
# Conflicts:
#	mRemoteV1/mRemoteV1.csproj
#	mRemoteV1/packages.config
2016-07-14 08:43:16 -06:00
David Sparer
84ed778b67 Merge pull request #131 from jamesrenaud/MR-910_RDP_Gateway_Credentials_Applied_Incorrectly
MR-910 Fixes to support Remote Desktop Gateways
2016-07-13 18:13:58 -06:00
jamesrenaud
c1d41847a2 Removed inline comment per style feedback 2016-07-13 19:07:15 -04:00
David Sparer
73c50837d8 Created class for building and using encrypted secure strings 2016-07-13 12:51:21 -06:00
David Sparer
89075aa3e9 Removed unnecessary crypto experiment 2016-07-13 10:42:44 -06:00
David Sparer
bffe4454ba Moved AeasCryptographyProvider to the mRemoteNG.Security.SymmetricEncryption namespace 2016-07-13 10:34:36 -06:00
David Sparer
69a8f50b58 Moved LegacyRijndaelCryptographyProvider to the mRemoteNG.Security.SymmetricEncryption namespace 2016-07-13 10:32:36 -06:00
David Sparer
8c6f6534b6 Added method to the crypto factory and unit test 2016-07-13 10:10:08 -06:00
David Sparer
791a78154d Fixed a decryption bug introduced while cleaning up code in the LegacyRinjdaelCryptographyProvider class 2016-07-13 09:59:57 -06:00
David Sparer
f08ce0acd5 LegacyRijndaelCryptographyProvider now implements ICryptographyProvider 2016-07-13 09:39:27 -06:00
David Sparer
757b195d5c Made the LegacyRijndaelCryptographyProvider class non-static 2016-07-13 08:41:18 -06:00
David Sparer
c6a39a9220 Rename "Crypt" class to "LegacyRijndaelCryptographyProvider" 2016-07-13 08:22:06 -06:00
David Sparer
a2054b458b Code cleanup on the legacy crypt class 2016-07-13 08:16:06 -06:00
James Renaud
6ee12d447f Fixes to support Remote Desktop Gateways 2016-07-12 22:44:27 -04:00
Hayato Iriumi
f95e3fb719 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG.git 2016-07-11 21:44:16 -07:00
Hayato Iriumi
aa9141505f More Japanese translation 2016-07-11 19:56:09 -07:00
David Sparer
b4f0d2f2ae Removing un-needed experiments 2016-07-11 18:12:44 -06:00
David Sparer
5bc67ab796 Changed default engine from AesFastEngine to AesEngine 2016-07-11 18:07:42 -06:00
David Sparer
4f86e0da62 Added a factory class for instantiating crypto providers 2016-07-11 18:07:22 -06:00
David Sparer
12165ac9a6 Added required property to the ICryptographyProvider interface to get the underlying crypto algorithm 2016-07-11 18:06:28 -06:00
David Sparer
dd783c2dc0 Forgot to save project 2016-07-11 15:43:42 -06:00
David Sparer
4b65086622 Some cleanup 2016-07-11 15:42:48 -06:00
David Sparer
de2542c172 Renamed AesGcm to AeadCryptographyProvider 2016-07-11 15:38:13 -06:00
David Sparer
973de3507e AesGcm does not actually benefit from generics. Removed that support 2016-07-11 15:35:13 -06:00
Sean Kaim
1945d5ac6b Update changelog.txt 2016-07-11 17:27:23 -04:00
Sean Kaim
cb3614d54c Fix LargeAddressAware test 2016-07-11 17:27:01 -04:00
David Sparer
4375f2d5d1 Some cleanup of AesGcm class 2016-07-11 15:23:02 -06:00
David Sparer
92b6cf201e Modified AesGcm to accept different string encodings (besides UTF-8) 2016-07-11 15:17:07 -06:00
David Sparer
b2b53561ba Modified AESGCM to support specifying the block cipher engine through generics 2016-07-11 15:10:43 -06:00
Sean Kaim
73a1923db6 Fix conflicts 2016-07-11 16:25:53 -04:00
David Sparer
76e290f6b7 AESGCM implements ICryptographyProvider 2016-07-11 14:24:22 -06:00
Sean Kaim
be02814021 Update GeckoFx and NUnit nuget packages 2016-07-11 16:22:33 -04:00
David Sparer
d60c007ac6 Make AESGCM non-static 2016-07-11 14:22:20 -06:00
David Sparer
e92c1eaa9d Add some tests for the AesGcm class 2016-07-11 14:17:50 -06:00
David Sparer
8d638602b9 Fix encryptor class 2016-07-11 14:17:28 -06:00
David Sparer
48161aca47 Changed the unit tests to use to Encryptor class, which is a better implementation than the AesCryptographyProvider. 2016-07-11 14:16:20 -06:00
Sean Kaim
11314972fa Merge pull request #129 from mRemoteNG/dockpanelsuite_nuget
Dockpanelsuite nuget packages
2016-07-11 16:16:07 -04:00
David Sparer
83ac202a6b The "AESThenHMAC" file is not particularly helpful. This uses .Net crypto - trying to stick with BouncyCastle 2016-07-11 14:14:29 -06:00
Sean Kaim
02c601fd3a Remove local DockPanelSuite 2016-07-11 16:13:48 -04:00
Sean Kaim
86f6f85142 DockPanelSuite 2.10 Final NuGet packages 2016-07-11 16:12:32 -04:00
David Sparer
ca4cb433a9 Testing another implementation for crypto 2016-07-11 13:41:07 -06:00
David Sparer
e5bed0afcb Testing out some encryption implementations 2016-07-11 13:39:30 -06:00
Sean Kaim
11cf85f771 Delete "old installer" files 2016-07-11 15:01:03 -04:00
Sean Kaim
18d7a9cfe9 Update to correct chat room. 2016-07-11 14:23:19 -04:00
David Sparer
b3bac32441 Moved enhancements made in the CredentialManager branch to a dedicated branch 2016-07-11 11:41:42 -06:00
Sean Kaim
0b9fb06c08 fix Gitter badge 2016-07-11 12:44:04 -04:00
Sean Kaim
c6219ff315 Gitter badge 2016-07-11 12:42:30 -04:00
Sean Kaim
2b7668aa68 Updated installer post build steps 2016-07-08 17:59:25 -04:00
Sean Kaim
c8a684e10d Add readme.txt back (no markdown syntax) 2016-07-08 17:18:29 -04:00
Sean Kaim
5a5d675f3e Update version to 1.75 2016-07-08 17:09:02 -04:00
Sean Kaim
a4acc60f1d Updated change log
Fixed some formatting issues
2016-07-08 17:02:34 -04:00
Sean Kaim
b3bc04251b Update .gitignre
.editorconfig is a user preference
2016-07-08 17:01:50 -04:00
Sean Kaim
203111eb5a Revert "Update .gitignore"
This reverts commit 472168b9e4.
2016-07-08 17:01:16 -04:00
Sean Kaim
472168b9e4 Update .gitignore 2016-07-08 17:00:53 -04:00
Sean Kaim
328ebbe3f7 Merge pull request #127 from mRemoteNG/MR-902_vncsharp_lib_updates
MR-902 vncsharp lib updates
2016-07-08 16:52:31 -04:00
Sean Kaim
999cd19d81 Updated dll including fixes from VncSharpNG.dll
Updated credits.txt

Sent changes to upstream: https://github.com/humphd/VncSharp/pull/21
2016-07-08 16:49:53 -04:00
Sean Kaim
d23f6a69e5 MR-905 - Crash at startup
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidCastException
Stack:
at
mRemoteNG.App.CompatibilityChecker.FipsPolicyEnabledForServer2008AndNewer()
at mRemoteNG.App.CompatibilityChecker.CheckFipsPolicy()
at mRemoteNG.App.CompatibilityChecker.CheckCompatibility()
at mRemoteNG.App.Startup.InitializeProgram()
at mRemoteNG.App.ProgramRoot.StartApplication()
at mRemoteNG.App.ProgramRoot.Main(System.String[])
2016-07-08 13:42:13 -04:00
Sean Kaim
38c7fe9e0a links/formatting 2016-07-06 11:32:46 -04:00
Sean Kaim
dc02f51a15 Twitter shield linking to wrong page/formatting 2016-07-06 11:30:28 -04:00
Sean Kaim
dd7ea02c9f one last time - readme formatting 2016-07-06 10:23:57 -04:00
Sean Kaim
5e0bf0da6e more readme formatting 2016-07-06 10:19:20 -04:00
Sean Kaim
f2f4b14f5e Readme formatting 2016-07-06 10:18:27 -04:00
Sean Kaim
e27b4fa2f9 Twitter Sheild 2016-07-06 10:10:15 -04:00
Sean Kaim
c71a57bd69 Fix download stats 2016-07-06 09:58:09 -04:00
Sean Kaim
8c57b271d8 Download stats shield 2016-07-06 09:54:29 -04:00
Sean Kaim
e167602a32 Update build status 2016-07-06 09:52:20 -04:00
Sean Kaim
590f4ba2c6 Build status shield 2016-07-06 09:51:01 -04:00
Sean Kaim
b2c0dc235c Basic necessary changes
Upstream VncSharp doesn't support Ctrl + C currently.
2016-07-02 14:48:16 -04:00
Sean Kaim
f357a53e0e code clean up 2016-06-30 12:00:35 -04:00
Sean Kaim
5f7d1f9f3f Merge pull request #123 from mRemoteNG/Release_v1.74
MR-874: Added work-around to installer to ignore installation prereq
2016-06-30 10:18:38 -04:00
David Sparer
5ebd255a22 MR-874: Added work-around to installer to ignore installation prerequisites 2016-06-28 08:26:25 -06:00
Sean Kaim
010c0a5061 Merge pull request #121 from mRemoteNG/Release_v1.74
Merge latest 1.74 fixes into develop
2016-06-28 10:21:36 -04:00
Sean Kaim
6ec4bdd926 Updated change log 2016-06-28 10:09:35 -04:00
Sean Kaim
fe023b798d MR-884 - Slow startup
https://blogs.technet.microsoft.com/markrussinovich/2009/05/23/the-case-of-the-slow-keynote-demo/

https://msdn.microsoft.com/en-us/library/cc656914(v=vs.100).aspx#Anchor_8
2016-06-28 10:06:48 -04:00
Sean Kaim
141c916b7b MR-884: Attempt to optimize startup 2016-06-27 11:46:41 -04:00
Sean Kaim
f160e456ae Merge pull request #120 from mRemoteNG/Release_v1.74
Merge latest 1.74 fixes into develop
2016-06-27 10:47:34 -04:00
Sean Kaim
49c6219a84 MR-854: Additional code clean up
New (.NET) method for getting file icons.
Additional ReShaper fixes
Additional null checks/protections
2016-06-25 21:34:32 -04:00
Sean Kaim
0db444e78c MR-854: Code Clean up and logging 2016-06-24 13:08:35 -04:00
Sean Kaim
57c2dc0a88 Fix log message for debugging exception 2016-06-24 12:21:40 -04:00
Sean Kaim
15ba2d3156 Fix incorrect Language Selection on Reconnect 2016-06-24 12:11:41 -04:00
David Sparer
48e2ba11bf Resolved MR-882 by removing a ProtocolType enum value that was being tested some time back. This should not have made it into the develop branch. 2016-06-24 08:21:59 -06:00
David Sparer
2a3fc01937 Merge branch 'Release_v1.74' into develop 2016-06-23 09:58:48 -06:00
David Sparer
aa3e8344fb Modified installer postbuild actions to only attempt to sign the MSI during Release builds 2016-06-23 09:58:16 -06:00
David Sparer
df5e619349 - Moved the PuTTYNG dependency file to $(SolutionDir)\Resources
- Added postbuild task to mRemoteV1 project to copy PuTTYNG file to $(TargetDir)
- Modified installer to point to the new PuTTYNG location
2016-06-23 09:57:46 -06:00
Sean Kaim
0c06983411 MR-875 - Win native compress can't extract
Removed LZMA options
Checked for file existance
2016-06-22 10:11:54 -04:00
Sean Kaim
dda9c1f1af Additional fixes for MR-872
Additional code clean up
Fixed some casting errors likely from the initial c# conversion
2016-06-22 09:35:01 -04:00
Sean Kaim
6779a02cf9 MR-872: Prevent outofbounds ex parsing args 2016-06-21 15:30:07 -04:00
David Sparer
7671328245 Merge branch 'Release_v1.74' into develop 2016-06-20 15:18:38 -06:00
David Sparer
ba7608602b Restricted code signing postbuild task to only Release configurations 2016-06-20 12:52:04 -06:00
David Sparer
92dcd8981d Fixed bug with Help window where clicking a treenode that does not have a .html file associated with it would produce an error. 2016-06-20 12:51:25 -06:00
David Sparer
cbe18b70ca Fixed bug when clicking the root tree node in the Help window 2016-06-20 12:46:47 -06:00
David Sparer
ab26b94808 Remove references to the Help page for Sessions. This feature was removed 2016-06-20 12:38:29 -06:00
David Sparer
0e176cee74 Point postbuild action at the correct location of build-relport 2016-06-20 11:53:05 -06:00
David Sparer
23eaba0d47 - Added scripts to rename and copy the MSI installer to the $(SolutionDir)\Release folder
- Added conditional post build to run the build-relport script when building the Release Portable configuration
2016-06-20 11:52:01 -06:00
David Sparer
c6b079c9cb Moved build-relport.cmd to Tools directory 2016-06-20 11:50:08 -06:00
Sean Kaim
9d544fa7fe Updated date. 2016-06-20 10:25:55 -04:00
Sean Kaim
8aba1be3e6 Remove sessions.htm 2016-06-20 10:24:00 -04:00
Sean Kaim
72d28c5219 Minor build fixes 2016-06-20 10:19:12 -04:00
David Sparer
85dc45a479 Merge branch 'Release_v1.74' into develop 2016-06-19 20:23:06 -06:00
David Sparer
283714f88c - Moved various build tools to the Tools folder
- Modified the build-relport script to point to the Tools folder for its required external programs
2016-06-19 20:12:18 -06:00
David Sparer
eb696b49fe Merge branch 'Release_v1.74' into develop 2016-06-19 08:53:42 -06:00
David Sparer
063be0dbe2 Move all files under "Installer Projects" to "InstallerProjects" to make post build tasks a bit easier 2016-06-18 16:50:01 -06:00
David Sparer
1e4656769e - Began tracking changes to the signing script.
- Added post build event for moving Resources\Help to the correct location
- Added post build events for removing unnecessary files for all "Release" configurations
- Removed lines from the release portable script that are now present in the post build events
2016-06-18 12:03:00 -06:00
David Sparer
3079cad8d6 Somehow this file was not being tracked correctly 2016-06-18 12:01:22 -06:00
Sean Kaim
d5c86b91c3 Updated change log and help files 2016-06-17 17:37:57 -04:00
David Sparer
d5de0b8fa3 Modified postbuild actions to sign the binaries. This will only run if a specific script exists 2016-06-17 12:41:45 -06:00
Sean Kaim
167c02f433 Don't build by default, just package 2016-06-17 08:47:51 -04:00
David Sparer
327e03c3b1 Turned debugging symbol generation off for Release and Release Portable configurations 2016-06-16 19:27:29 -06:00
David Sparer
5304ecb71d Prevent .pdb files from being harvested for the installer 2016-06-16 19:20:33 -06:00
Sean Kaim
64dfa2fa33 Updated Assembly Info 2016-06-16 16:28:34 -04:00
Sean Kaim
8f6431f657 fix display issues on about screen 2016-06-16 16:26:12 -04:00
Sean Kaim
5a59c8c179 Merge pull request #118 from mRemoteNG/develop
merge develop into release (again)
2016-06-16 16:16:09 -04:00
Sean Kaim
2a7fa03df1 3G -> NG 2016-06-16 16:14:15 -04:00
David Sparer
be009d55f4 Jenkinsfile: add support for branches with a period (.) in the name 2016-06-16 14:10:01 -06:00
Sean Kaim
d8789926a7 Updated Credits 2016-06-16 16:09:15 -04:00
Sean Kaim
e7de6bd42b French Spell and typographic checking
From @SebThieu
2016-06-16 16:05:31 -04:00
David Sparer
3f6b70e783 Few changes to build configurations.
- Removed the 'AnyCPU' platform. Should always use x86
- Removed installer projects from being built by default in Release configuration
2016-06-16 13:59:42 -06:00
Sean Kaim
d1ab5cc40f Merge pull request #117 from mRemoteNG/develop
merge develop into release
2016-06-16 12:17:15 -04:00
Sean Kaim
a8376ebb96 fix a typo in the changelog. 2016-06-16 12:10:06 -04:00
Sean Kaim
f0456cce0e minor change log update 2016-06-16 12:09:33 -04:00
David Sparer
bc46f8c432 Merge branch 'develop' of github.com:mRemoteNG/mRemoteNG into develop 2016-06-14 15:23:44 -06:00
Sean Kaim
4de8a8e915 More detailed messages for RDP Disconnected events 2016-06-14 16:46:55 -04:00
David Sparer
4f0d425711 - Created a unit test to verify that the LARGEADDRESSAWARE flag is set on mRemoteNG.exe
- Created configurations for the unit test project to support the PORTABLE compilation symbol. This is required for the unit test to work correctly.
2016-06-14 14:28:45 -06:00
Sean Kaim
7679c255f3 better compression for the portable zip 2016-06-14 16:26:14 -04:00
David Sparer
3027ba6dc7 Fixed issue with setting LARGEADDRESSAWARE flag on the binary 2016-06-14 13:36:08 -06:00
Sean Kaim
9b556436bb Spell check and other minor updates
"offiginally" - seriously?  😕
2016-06-11 17:35:14 -04:00
Sean Kaim
1c84205a5e Updated Changelog 2016-06-11 17:08:02 -04:00
Sean Kaim
d39373a4f5 Remove files that are no longer needed 2016-06-10 09:08:55 -04:00
Sean Kaim
3dbfdf3b5b Merge pull request #116 from mRemoteNG/GeckoFx
Replaced XULRunner with GeckoFx
2016-06-10 09:02:55 -04:00
David Sparer
286cfc961e Set the unit tests to always build with "AnyCpu" configuration 2016-06-09 16:37:52 -06:00
David Sparer
3148879bf7 Removed the installer projects from being built in the Debug, Debug Portable, and Release Portable build configurations. 2016-06-09 16:20:36 -06:00
David Sparer
70924b6823 Modified jenkinsfile to force build server to build x86 2016-06-09 15:54:29 -06:00
Sean Kaim
2a63fe6a09 build fix 2016-06-09 17:42:49 -04:00
Sean Kaim
91c09ebd7e Fix jenkins unit test build/run 2016-06-09 17:39:42 -04:00
David Sparer
4957e62765 Fixed a missing apostrophe in the jenkinsfile 2016-06-09 14:57:10 -06:00
David Sparer
80ef32b8b5 Updated the jenkinsfile to restore nuget packages before build. This is done automatically in VS2015 but not in msbuild. 2016-06-09 14:55:26 -06:00
Sean Kaim
39bf3e754d Clarify option 2016-06-09 12:20:15 -04:00
hiriumi
3d8c0ce181 More Japanese translations 2016-06-09 08:26:54 -07:00
hiriumi
07042d16b0 More Japanese translation. About 60% done. 2016-06-08 13:02:48 -07:00
hiriumi
fce583a346 Option page weren't displaying target language so I added apply language in frmOptions. 2016-06-08 10:16:45 -07:00
hiriumi
7ba5a3b8cd Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG.git 2016-06-08 10:07:56 -07:00
Sean Kaim
ae16c021da Remove XULRunner path from settings 2016-06-08 10:40:29 -04:00
Sean Kaim
70ff34438f Update component check for GeckoFx 2016-06-08 10:00:23 -04:00
Sean Kaim
b105585f5a Update Credits.txt 2016-06-07 16:12:16 -04:00
Sean Kaim
29c7859ea1 Replace XULRunner with GeckoFX 2016-06-07 15:43:44 -04:00
Sean Kaim
678194f4f7 minor code clean up 2016-06-07 10:41:56 -04:00
hiriumi
60353be2c0 Japanese translation 2016-06-06 07:05:35 -07:00
Sean Kaim
6410acbb48 minor tweaks to the port scan UI
This seems like a better user experience.  This will also allow for
further (future) changes in the import window when using custom ports
and have it make even more sense.
2016-06-05 14:55:31 -04:00
Sean Kaim
731c2e22b8 PortScan: Actually scan asynchronously
Speeds up the port scan signifigantly
2016-06-05 14:09:51 -04:00
Sean Kaim
cd950f39b4 refactor/cleanup + make portscan work
The non-import version of a portscan didn't test any ports and never
found any open ports (due to backwards logic).
2016-06-04 23:34:51 -04:00
Sean Kaim
8cbf56f7a5 Build FilteredPropertyGrid into mRemoteNG
No longer load the dll.
Makes the small amount of source more maintainable then from the code
project.
Gets rebuilt with latest build env.
2016-06-03 22:13:12 -04:00
David Sparer
17f986ea26 Few fixes for casting errors. These occurred due to commit e5f9fce01e 2016-06-03 15:56:15 -06:00
David Sparer
e5f9fce01e Cleaned up WindowPlacement class by moving native Win32 functions to the NativeMethods class 2016-06-03 15:53:11 -06:00
David Sparer
4c34a88a10 Cleaned up ProcessController tool by moving all native win32 methods to the NativeMethods class 2016-06-03 15:40:09 -06:00
David Sparer
324d34aa3c Moved the TreeImageType to the mRemoteNG.Tree namespace. Removed all references to the mRemoteNG.Images namespace, which no longer exists. 2016-06-03 15:24:01 -06:00
David Sparer
3f984fb65e Removed unused file (contained enum had no references) 2016-06-03 15:19:18 -06:00
David Sparer
c108c60c30 Merge branch 'release/v1.74' into develop 2016-06-03 15:11:44 -06:00
David Sparer
cf1a84f4b2 Resolved MR-855 - Resource not found error when testing proxy settings.
This was introduced in 634df366bd
2016-06-03 15:10:19 -06:00
hiriumi
350afcdb70 more Japanese translations 2016-06-03 12:01:20 -07:00
hiriumi
e5b319e518 Added question mark to MessageBox and more Japanese translation. 2016-06-02 17:07:45 -07:00
David Sparer
a43785d1f0 Small cleanup in Startup.cs 2016-06-02 15:29:24 -06:00
David Sparer
b90981a17c Made a couple more Startup methods non-static 2016-06-02 15:26:51 -06:00
David Sparer
47bbe20001 Startup: clean up some 'using' directives and sort them 2016-06-02 15:23:42 -06:00
David Sparer
668b9dd903 Refactored some Startup functions to their own class 2016-06-02 15:22:22 -06:00
David Sparer
6ca98149a7 Made Startup slightly less static 2016-06-02 15:21:30 -06:00
David Sparer
af2de33809 Forgot to save project when deleting the ApplicationEvents file... I do this a lot it seems. 2016-06-02 14:59:02 -06:00
Sean Kaim
737054873e Update Credits.txt 2016-06-02 16:46:23 -04:00
Sean Kaim
1dd0961a48 Just a comment... 2016-06-02 16:35:39 -04:00
David Sparer
3fcb6bcbd0 Removed unnecessary file. These functions were reimplemented in commit 996af9b268 2016-06-02 14:28:59 -06:00
David Sparer
53660cc7dc Merge branch 'release/v1.74' into develop 2016-06-02 13:49:21 -06:00
David Sparer
996af9b268 Fixed MR-852 - Option "Allow only a single instance of the application" non-functional 2016-06-02 13:47:04 -06:00
Sean Kaim
512044617c Last VB references removed 2016-06-02 15:45:47 -04:00
Sean Kaim
a91f712735 Remove more VB referneces 2016-06-02 14:35:12 -04:00
Sean Kaim
fb7a0fcb50 Remove VB references + fix exception 2016-06-02 14:34:56 -04:00
David Sparer
749ed5432b Merge branch 'release/v1.74' into develop 2016-06-01 11:17:10 -06:00
David Sparer
53be4c259e Fixed MR-847 - Renaming folder in connection tree does not update config panel name 2016-06-01 11:16:47 -06:00
Sean Kaim
e32630511d fix portable build
Move help files to proper location
Don't include unnecessary files
2016-06-01 10:51:02 -04:00
Sean Kaim
c9a6d69d6f README update 2016-05-31 22:38:37 -04:00
Sean Kaim
5a78a71316 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2016-05-31 21:07:47 -04:00
Sean Kaim
da9680d210 Minor form changes
Ported from PR #105
Thanks @aplocher
2016-05-31 21:06:56 -04:00
Sean Kaim
1ec37d657d Minor form changes
Ported from PR #105
2016-05-31 21:04:58 -04:00
Sean Kaim
99df3df42c avoid exception when disposing external tools items
Similar to #114
Thanks @Brandhor
2016-05-31 20:53:10 -04:00
David Sparer
1c83609971 Merge pull request #114 from Brandhor/exttools
External Tools Fixes
2016-05-31 17:59:55 -06:00
Brandon
32da8433bb avoid exception when disposing external tools items 2016-06-01 01:05:15 +02:00
Brandon
485536dc90 fix launching external tools 2016-06-01 00:46:14 +02:00
David Sparer
0b605ddb70 Merge branch 'release/v1.74' into develop 2016-05-31 16:24:32 -06:00
David Sparer
755d7b0742 Resolved MR-846 - help files not being copied with installer 2016-05-31 15:31:47 -06:00
Sean Kaim
15030ab7cb Release Portable Build script 2016-05-31 16:59:06 -04:00
hiriumi
a438d6c3c3 Merging Japanese translation 2016-05-31 09:33:24 -07:00
hiriumi
865a926047 saving Japanese translation. 2016-05-31 09:27:56 -07:00
Sean Kaim
a36ec166cf Initial 1.74 Changelog update 2016-05-31 12:27:06 -04:00
Sean Kaim
77e702da6c Merge pull request #113 from mRemoteNG/develop
exception fixes
2016-05-29 22:07:01 -04:00
Sean Kaim
1560339377 Fix MR-838 - correct cast 2016-05-29 21:58:54 -04:00
Sean Kaim
f0aaab1299 Fix MR-839 - correct cast 2016-05-29 21:55:15 -04:00
Sean Kaim
4eced42981 Fix MR-840 (exception entering fullscreen)
bug introduced as part of the C# conversion

VB code:
Public Fullscreen As New Misc.Fullscreen(Me)

Private Sub mMenViewFullscreen_Click(sender As Object, e As EventArgs)
Handles mMenViewFullscreen.Click
Fullscreen.Value = Not Fullscreen.Value
mMenViewFullscreen.Checked = Fullscreen.Value
End Sub
2016-05-29 21:35:41 -04:00
hiriumi
1da2839cc3 Cleaned up PortScan.cs 2016-05-28 22:16:38 -07:00
hiriumi
0200281732 Cleaned up mRemoteNG.cs 2016-05-28 22:12:25 -07:00
hiriumi
3d9f9ff4c2 Cleaned up ConnectionIcon.cs 2016-05-28 21:55:38 -07:00
hiriumi
60048b4450 Cleaned up ConfigWindow.cs 2016-05-28 21:47:47 -07:00
hiriumi
4bd67c15c0 More Japanese translation. Not complete yet. 2016-05-27 23:35:46 -07:00
hiriumi
3237e18d2d Removed redundant initialization. 2016-05-27 23:01:47 -07:00
hiriumi
fe17123707 Some more clean up of ThemeSerializer.cs 2016-05-27 22:59:57 -07:00
hiriumi
a51df79925 Cleaned up ThemeSerializer.cs 2016-05-27 22:52:54 -07:00
hiriumi
efbe78a77e Just a bit of clean up using ReSharper. 2016-05-27 22:49:23 -07:00
David Sparer
9f860a3f3e Resolved MR-683 - Validated then updated the German localization with provided file. 2016-05-27 14:33:06 -06:00
Sean Kaim
9dc5442743 minor clean up 2016-05-27 15:56:03 -04:00
Sean Kaim
e2d66235b5 Remove Microsoft.VisualBasic references & cleanup 2016-05-27 15:49:03 -04:00
David Sparer
cafad5599d Merge branch 'MR-836_Deleting_folder_only_deletes_2_connections' into develop
# Conflicts:
#	mRemoteV1/Tree/ConnectionTree.cs
2016-05-27 12:58:28 -06:00
Sean Kaim
6d8f375ae1 Remove Microsoft.VisualBasic references 2016-05-27 14:21:34 -04:00
David Sparer
a055d7f4a8 Slight optimization to prevent window flicker when deleting a folder with many connections. 2016-05-27 11:56:48 -06:00
Sean Kaim
09102325eb Fix MR-828 NullReferenceException SetNodeToolTip
Also, remove Microsoft.VisualBasic references
2016-05-27 13:56:04 -04:00
David Sparer
33c9774b21 There was still a bug with deleting folders that had contents. Using a builtin function to do this instead of trying to re-implement.
I am hoping this really does fix MR-836 this time.
2016-05-27 11:39:18 -06:00
David Sparer
d7f64fec4f Added check for null nodes in ConnectionTree.DeleteSelectedNode(). This now fully resolves the issues noted in MR-836 2016-05-27 11:22:40 -06:00
David Sparer
eab5a42d93 Refactored ConnectionTree.DeleteSelectedNode() - extracted some methods to make it more readable 2016-05-27 11:18:05 -06:00
David Sparer
5c7f120a7e Fixed bug with ConnectionTreeNode.IsEmpty(). Logic was inverted 2016-05-27 11:12:32 -06:00
David Sparer
d7d78d8053 Inverted conditional statement. This resolved the primary issue in MR-836 where deleting a non-empty folder would not delete all connections within it 2016-05-27 10:21:28 -06:00
David Sparer
cde7f114f9 Cleaned up some code noise in ConnectionTree 2016-05-27 09:40:34 -06:00
David Sparer
69f4904b5a Merge branch 'MR-834_support_uninstalling_pre-MSI_installs' into develop 2016-05-26 17:18:05 -06:00
David Sparer
93d54a915d Made the legacy uninstall a silent uninstall. Not sure if this is how we will want to release it, but it's reasonably user friendly 2016-05-26 16:47:39 -06:00
Sparer, David
fe9aa59690 Finished basic implementation of uninstalling legacy versions. 2016-05-26 15:37:12 -06:00
hiriumi
381a87ab50 Adding more Japanese translations in Language.ja-JP.resx file. It's not 100% complete yet. 2016-05-26 08:32:03 -07:00
hiriumi
ffea221568 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG.git 2016-05-25 17:53:27 -07:00
hiriumi
aaf3316e65 Added Japanese as a supported language and started to work on Language. ja-JP.resx. The language file itself is not 100% complete yet. 2016-05-25 16:05:21 -07:00
Sean Kaim
41664d2ef4 Make fonts consistent 2016-05-25 17:38:17 -04:00
Sean Kaim
717d4f0b9a Add CREDITS.TXT to About form 2016-05-25 17:27:49 -04:00
Sean Kaim
24873ffa9b Updated language files for RDP requirements 2016-05-25 15:49:01 -04:00
Sean Kaim
7f6e90758a Merge pull request #112 from mRemoteNG/remove_IPTextBox
Remove IPTextBox.dll and use a built-in control
2016-05-25 15:38:46 -04:00
Sean Kaim
5f4d565483 Remove IPTextBox.dll and use a built-in control 2016-05-25 15:37:33 -04:00
Sean Kaim
727e23ada9 DockPanelSuite updates and new theme 2016-05-25 12:29:42 -04:00
Sean Kaim
497363bc3a code clean up 2016-05-25 12:09:23 -04:00
Sean Kaim
6acf8b84ad code clean up and minor UserAgent change 2016-05-25 11:48:50 -04:00
Sean Kaim
daff0de0bd very minor code clean up 2016-05-25 10:55:36 -04:00
David Sparer
f6daa3b5dc Removed static reference to SystemMenu from Runtime. The only references to it were in frmMain 2016-05-24 20:07:25 -06:00
David Sparer
2c87d36cbb Merge remote-tracking branch 'origin/singleton' into frmMain_refactoring_experiment
# Conflicts:
#	mRemoteV1/App/ProgramRoot.cs
#	mRemoteV1/UI/Forms/frmMain.cs
2016-05-24 17:10:17 -06:00
David Sparer
3af3074ab9 Minor cleanup of frmOptions code (deleted dead space, reorder usings, reorder functions based on call order) 2016-05-24 16:56:56 -06:00
David Sparer
c00342df6f Refactoring: Extracted a method in frmOptions that sets the initially selected page 2016-05-24 16:53:47 -06:00
David Sparer
9bbd95a6f2 Fixed minor UI annoyance in frmOptions where you could not see the active page after clicking within that page. 2016-05-24 16:52:37 -06:00
Sparer, David
f1fe5d215c Fixed a few more subtle bugs in frmMain:WndProc() that were caused by the c# conversion 2016-05-24 15:33:20 -06:00
Sparer, David
36e1522a32 Fixed bug MR-826 by resolving an issue caused by the migration from VB to C#. 2016-05-24 13:29:17 -06:00
David Sparer
7c5f795bf4 Added documentation to native constants to help with troubleshooting WndProc 2016-05-22 12:09:07 -06:00
David Sparer
90258636ed Moved program initialization from frmMain to ProgramRoot 2016-05-22 11:15:18 -06:00
David Sparer
06ce840a8f Moved GetConnectionIcons call from frmMain to Startup 2016-05-22 10:48:29 -06:00
David Sparer
268c5a92d8 Minor cleanup in Startup 2016-05-22 10:45:41 -06:00
David Sparer
7f11783d46 Moved IEBrowserEmulation registration from frmMain to Startup 2016-05-22 10:45:02 -06:00
David Sparer
ae2d18e79c Removed unnecessary usings in options form test 2016-05-22 10:44:05 -06:00
David Sparer
58b9755d0c Cleaned up unnecessary usings and fully qualified names in MessageCollector 2016-05-22 10:37:27 -06:00
David Sparer
11a79c2f1f Removed Runtime.Log and replaced all references to Logger.Instance. This still breaks the law of demeter - we should fully wrap the log4net object in our own class at some point. 2016-05-22 10:34:24 -06:00
David Sparer
32742a6f4f Refactored Logger singleton implementation to be more in line with other implementations 2016-05-22 10:27:21 -06:00
David Sparer
083e71370f - Moved the startup debugging "program start" line from frmMain to Startup.cs
- Moved call to ParseCommandLineArgs() from frmMain to Startup.cs
2016-05-22 10:15:55 -06:00
David Sparer
0278390279 Moved method "CreatePanels" from Startup.cs to LayoutSettingsLoader.cs 2016-05-22 10:14:00 -06:00
David Sparer
f344ef054f - Removed unnecessary using directive
- Made many methods in Startup private and non-static
2016-05-22 10:05:11 -06:00
David Sparer
68e3953bcc Made Startup a singleton 2016-05-22 09:58:27 -06:00
David Sparer
7755a5cd9a Removed Runtime.Mainform property and replaced all references to frmMain.Default 2016-05-22 09:43:53 -06:00
Sean Kaim
05a7fec4c4 convert to singleton 2016-05-21 14:39:45 -04:00
Sean Kaim
8f0e15db85 code cleanup 2016-05-20 21:43:11 -04:00
Sean Kaim
b7dc56fef5 Disable VS hosting process
PuTTYNG windows don't integrate properly when it's enabled.
2016-05-20 21:23:48 -04:00
Sean Kaim
da14fb56fa code clean up 2016-05-20 21:19:45 -04:00
Sparer, David
b15e892c60 Removing all frmOptions unit tests since they are failing and polluting the view of our builds in Jenkins. There seems to be an issue with how the tests were structured that has now been broken since the frmOptions rewrite. 2016-05-20 12:53:51 -06:00
Sparer, David
eeeb13d094 Changed the singleton instance implementation in SupportedCultures to be safer. This resolves one of the reasons the UI unit tests are failing. 2016-05-20 12:42:34 -06:00
Sean Kaim
03cb3cd161 update credits.txt 2016-05-20 11:46:05 -04:00
Sean Kaim
f1b3558565 Use latest log4net.dll 2016-05-20 11:44:46 -04:00
Sean Kaim
6a69725ca9 Update CREDITS.TXT 2016-05-20 09:51:48 -04:00
Sean Kaim
63fdabd902 minitabcontrol.dll is no longer used 2016-05-20 09:49:45 -04:00
Sean Kaim
d624f04cde pstaskdialog.dll is no longer used 2016-05-20 09:48:07 -04:00
Sean Kaim
ba08c7d589 no need to ship the PDB with release code 2016-05-20 09:47:24 -04:00
Sean Kaim
35d072f550 Additional code clean up 2016-05-19 16:21:54 -04:00
Sean Kaim
4c28eebbdf Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	mRemoteV1/App/Runtime.cs
2016-05-19 16:13:05 -04:00
Sean Kaim
3ca0e2fc58 Refactoring & code clean up
Corrects some complier warnings.
2016-05-19 15:58:38 -04:00
Sparer, David
7450b22130 Cleaned up a bit more noise in Runtime.cs 2016-05-19 13:17:45 -06:00
Sparer, David
e39faaa550 Cleaned up some code noise in Runtime.cs (mostly just unnecessarily qualified namespaces) 2016-05-19 12:38:18 -06:00
Sean Kaim
ccde45acc9 Better fix for SettingsPath location 2016-05-19 14:18:49 -04:00
hiriumi
6b1c5b5b92 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG.git 2016-05-19 08:48:05 -07:00
hiriumi
e6af5aaea3 Removing OptionsForm as it's replaced by frmOptions. Removed unreference method in Windows class along with it. Also modified the unit test. 2016-05-19 08:47:50 -07:00
Sean Kaim
a792c98630 3G port-Avoid exceptions starting an empty ExtApp
Reference: https://github.com/kmscode/mRemote3G/issues/10

In my testing the crash was semi-random. The exception was thrown,
logged and put into Notifications (all as expected). But every now and
then, would crash (with no further info available). Could not reproduce
in a debug build.

b248849428
2016-05-18 21:56:39 -04:00
Sean Kaim
46985ab39d code clean up and set RDP admin session properly
console is deprecated, admin is not.
2016-05-18 21:51:04 -04:00
Sean Kaim
28d882af7f 3G port - Added 1920x1080 resolution.
5a5c0c1e6b
2016-05-18 21:40:17 -04:00
Sean Kaim
9d6423e7d7 3G port (and fix) - Make Smart Size Work
Allow the Smart Size selection for RDP resolution to work properly (for
reals this time).

3f54842cc1

& code clean up.
2016-05-18 21:37:05 -04:00
Sean Kaim
0a88ae6a52 3G Port - Don't display items in the ToolStripMenu
Set disabled items to invisible when they aren't needed.

97d82f2b86
2016-05-18 21:15:34 -04:00
Sean Kaim
395741a502 Disable optimizations to allow LARGEADDRESSAWARE
Reference: https://msdn.microsoft.com/en-us/library/0zza0de8.aspx
.obj files produced with /GL will not be available to such linker
utilities as EDITBIN and DUMPBIN.
2016-05-18 21:08:32 -04:00
Sean Kaim
00dbbdf453 Port from 3G - Attempt to set a default icon
11fdc4fc28
2016-05-18 17:36:41 -04:00
Sean Kaim
77cf6202fe Port from 3G - Attempt to avoid crash
2f99c57eb6
2016-05-18 17:31:30 -04:00
Sean Kaim
7ed00bb42d Port from 3G - avoid crash and default icon
c917f35352
2016-05-18 17:26:22 -04:00
Sean Kaim
b97fe50958 Put log in more appropriate location
ad create log by default
2016-05-18 17:13:59 -04:00
Sean Kaim
0501d73e7b Set largeaddressaware during build 2016-05-18 17:02:09 -04:00
Sean Kaim
8abe2bffb8 Use CredSSP needs to be true for modern targets
Just about all modern versions of Windows require CredSSP by default.
Set that one back to "Yes".
2016-05-18 16:36:54 -04:00
Sean Kaim
8477625472 Changed some default settings to avoid hangs
Multiple users reported that having "Cahse Bitmaps" and/or "Use CredSSP"
set to yes (which was the previous default) would cause problems with
mRemoteNG - especially when opening multiple RDP connections.

Also increased update check to 14 days.
2016-05-18 16:32:19 -04:00
Sparer, David
08851a2b7a Merge branch 'MR-810_App_crashes_when_setting_all_inherited' into csharp_conv 2016-05-18 11:17:53 -06:00
Sparer, David
d4b9ccf1c2 - Unit tests: Fixed tests for ConnectionInfoInheritance 2016-05-18 11:16:48 -06:00
Sparer, David
7b177f1fd8 Fixed bug MR-810. Omit setting the IsDefault setting when turning inheritance on completely 2016-05-18 09:42:26 -06:00
Sparer, David
7d6e814745 minor code noise cleanup 2016-05-18 09:08:54 -06:00
Sean Kaim
3cfb6ecf6f Clean up files that are no longer needed
"My Project" files are from the VB code.
SharedLibraryNG was removed - see commit:
71254ba6e2
2016-05-18 10:22:50 -04:00
Sean Kaim
11085a0037 PuTTYNG.exe 0.67 for the installer 2016-05-18 09:02:19 -04:00
David Sparer
a679bcf26b - Installer: fixed GUID for mainexe
- mRemoteNG: incremented the minor version of the product to 74. Assembly version is now 1.74
2016-05-17 19:51:49 -06:00
David Sparer
8ed1764fb3 added puttyng.exe dependency back in - this is required and im not sure how it slipped by 2016-05-17 19:03:51 -06:00
David Sparer
b2696003f0 The installer will now utilize the file version attribute of the mRemoteNG.exe file and set the installer version to match. This will help us support major upgrades easier 2016-05-17 19:03:07 -06:00
David Sparer
bc818704df Removed Pandoc from the gitignore since it is part of the build process now 2016-05-17 17:37:55 -06:00
Sparer, David
d21f3c1bcf Merge branch 'MR-818_Create_new_installer' into csharp_conv 2016-05-17 15:17:24 -06:00
Sparer, David
e6ae513474 - Add CustomActions project as a dependency of Installer project 2016-05-17 15:16:34 -06:00
Sparer, David
4360f45ab8 - Custom action for checking if RDP8.0 is installed will only run on Win7 machines
- Re-ordered conditional checks. Installer will warn about .Net version before warning about RDP 8.0 requirement. This more logically follows the "broad to specific" ordering of requirements
2016-05-17 13:50:20 -06:00
Sparer, David
74ef73ebf4 The RDP8.0 custom action project now targets .Net 2.0 for maximum compatibility. 2016-05-17 13:47:10 -06:00
Sparer, David
35b512de19 RDP 8.0 verification is working and now enabled.
Checking for the installed KBs is unusually time-intensive. Should try to optimize the runtime of this verification.
2016-05-17 13:44:19 -06:00
Sparer, David
a5966592e1 update gitignore 2016-05-16 16:11:25 -06:00
Sparer, David
8e2e1769c3 Started creating the custom action for checking if RDP 8.0 is installed. Currently not working correctly 2016-05-16 16:10:53 -06:00
hiriumi
19da883e14 Removed dependency on Microsoft.VisualBasic in Import.cs 2016-05-16 08:22:37 -07:00
hiriumi
600d5f4475 comming the 2016-05-16 08:14:51 -07:00
hiriumi
0e0e3b28de Removed dependency to Microsoft.VisualBasic in Import.cs 2016-05-16 08:11:15 -07:00
Sparer, David
2439ae0508 Merge branch 'csharp_conv' into MR-818_Create_new_installer 2016-05-16 08:07:30 -06:00
Sean Kaim
f9633cb860 Fix non-portable build 2016-05-15 20:54:49 -04:00
David Sparer
2c43f35b0b Added required variables to the other localization files.
Set the debug build configuration to only build the en-US culture for sanity's sake
2016-05-15 15:24:15 -06:00
Sean Kaim
a1beff754c Suppress JavaScript errors 2016-05-15 17:24:11 -04:00
Sean Kaim
647fa12cdc Support additional browser features
ported from mRemote3G:

11a1f94e97
2016-05-15 17:18:03 -04:00
Sean Kaim
725235c250 Fix HTTP connections not working & code cleanup 2016-05-15 17:17:14 -04:00
David Sparer
25d438d691 Links to the License, Credits, and Readme are now created when user requests start menu shortcuts. 2016-05-15 15:14:44 -06:00
David Sparer
37232b5302 Added install conditions:
- Requires Win7 or higher
- If Win7, requires SP1
- Requires .Net Framework 4.0 or higher
- Requires elevated priveleges to install
2016-05-15 15:13:40 -06:00
David Sparer
2d250282ee Added localization files for the languages we will be able to have translated the soonest 2016-05-15 13:09:19 -06:00
Sean Kaim
18e1c112e0 Correct unit tests after keyboard options removed 2016-05-15 14:06:16 -04:00
Sean Kaim
32891e5155 Remove KeyboardOptions tests
Keyboard options removed in 71254ba6e2
2016-05-15 13:57:40 -04:00
Sean Kaim
ef7cbf097b Merge pull request #111 from mRemoteNG/replace_pstaskdialog
Replace pstaskdialog
2016-05-15 13:51:39 -04:00
David Sparer
41ab8033e7 began the slow process of supporting localizations 2016-05-15 07:52:14 -06:00
David Sparer
4f392690eb Added pandoc to automatically convert the license file to RTF format for use in the installer.
Added GUI to installer with mRemoteNG images
Added git ignore entries for the FilesFragment.wsx and License.rtf files which will be re-compiled on every build
2016-05-14 18:12:21 -06:00
David Sparer
d591e4ebc2 added .msi files to the git ignore file 2016-05-14 15:36:28 -06:00
David Sparer
a315c19ebb Merge branch 'csharp_conv' into MR-818_Create_new_installer
# Conflicts:
#	mRemoteV1.sln
2016-05-14 15:35:31 -06:00
David Sparer
764b956221 Added installer support for installing PuTTYNG 2016-05-14 13:57:53 -06:00
David Sparer
f0b0086ca5 Installer now properly places shortcuts in start menu and the desktop.
Updated the program icon to a higher resolution version.
2016-05-14 12:33:52 -06:00
David Sparer
8c43494c03 Added support for creating shortcuts to start menu and desktop. However, the desktop shortcut is not functioning as expected 2016-05-14 11:53:53 -06:00
amaterasu48
634df366bd Removed PSTaskDialog.dll reference added pure .NET Form that mimics PSTaskDialog. No more dependency to it, so we shouldn't see the unexpected error. 2016-05-12 14:59:39 -07:00
Sparer, David
86585feb56 no message 2016-05-12 15:20:56 -06:00
Sparer, David
f4335ff339 updates to support the Portable build types 2016-05-12 15:10:15 -06:00
Sparer, David
61100d167f Accidentatly moved an icon file rather than copying. Put it back. 2016-05-12 14:19:59 -06:00
Sparer, David
77c7ba3194 Installer works in a very basic manner. Files will be installed as expected, though there is no GUI to select options 2016-05-12 14:14:39 -06:00
Sean Kaim
669e3a762b Removed PSTaskDialog instances & code cleanup 2016-05-12 15:08:55 -04:00
Sean Kaim
71254ba6e2 Remove Keyboard shortcut functionality
Removed due to the following reasons:
1. Crashes (semi-regularly)
2. "Beta" option from 1.73 (never released) that doesn't work (on
Windows 10 at least)
3. A multiple bugs were reported for it in the bug tracking system:
https://mremoteng.atlassian.net/browse/MR-714
https://mremoteng.atlassian.net/browse/MR-624
https://mremoteng.atlassian.net/browse/MR-687
https://mremoteng.atlassian.net/browse/MR-752
(and possibly more)
4. After reviewing the bug reports and other info, I feel it's a bad
idea. All keyboard input should go to the connected session (while
"active"). Otherwise a mouse click would be required to have mRemote be
the active Window. In which case, just click the desired tab.
2016-05-12 11:59:13 -04:00
David Sparer
8e7fe19585 Create very simple WiX project 2016-05-11 20:43:06 -06:00
David Sparer
95f605ea9d moved old installer to a new folder 2016-05-11 20:41:18 -06:00
amaterasu48
19d0e5d42f A little bit of UI clean up. 2016-05-11 15:50:09 -07:00
amaterasu48
5433a69775 Refactored and cleaned up frmMain 2016-05-11 14:41:34 -07:00
amaterasu48
f2ac6dace6 Just did refactoring and code cleaning to make it more CSharpy. 2016-05-11 12:49:48 -07:00
David Sparer
028889f9ec set default values for window position (center of screen) and size (minimum size allowed by frmMain) 2016-05-10 18:14:23 -06:00
David Sparer
f0c3395c00 Updated namespace of Resources and Language classes. The namespace was set in the designer but the custom tool needed to be run again to update the actual files. 2016-05-10 18:06:33 -06:00
David Sparer
ee180440e0 Merge branch 'settings_refactor' into csharp_conv 2016-05-10 16:53:16 -06:00
Sparer, David
4eac00c0d9 Resolved a mis-merged file 2016-05-09 10:58:49 -06:00
Sean Kaim
8e15b38e03 Set Code Analysis to MS Managed Recommended
Previously was set to "All" which generates a lot of complier warnings.

15e297eef3 seems to have been overwritten.
2016-05-09 09:42:15 -04:00
hiriumi
61e44af487 Merge remote-tracking branch 'refs/remotes/origin/csharp_conv' into settings_refactor
# Conflicts:
#	mRemoteV1/Config/Settings/SettingsLoader.cs
2016-05-08 22:27:54 -07:00
hiriumi
605fecedea Refactored config related code. 2016-05-08 21:53:41 -07:00
hiriumi
ac1a5e257e refactored settings related code. The UI still looks buggy. Will continue later. 2016-05-08 21:35:38 -07:00
Sean Kaim
401ac0225f Merge pull request #110 from mRemoteNG/settings_refactor
Settings refactor
2016-05-08 22:26:41 -04:00
Sean Kaim
dbda032a4c Disable AppSettingsProvider code as well
And an easier way to disable all custom settings provider code, but
leave it for possible/quicker future use.
2016-05-08 21:32:38 -04:00
David Sparer
b60b55dca2 property needed to be "Configuration" not "config" 2016-05-08 16:29:46 -06:00
David Sparer
e3229f4400 escaped double quotes 2016-05-08 13:15:51 -06:00
David Sparer
34435b3046 added new stage for Debug Portable build profile 2016-05-08 13:14:00 -06:00
David Sparer
1077d8ef4b Decided on commenting out the CreatePanels() / SetDefaultLayout() in frmMain rather than in LayoutSettingsLoader.
If we keep these methods in frmMain and remove in LayoutSettingsLoader, we will overwrite any custom layout loaded.
2016-05-08 12:43:57 -06:00
hiriumi
9527780d99 Removed dependency to PortableSettingsProvider.cs. This prevents app from throwing a lot of NullReferenceException on start up. I will do further testing on settings piece and probably more refactoring. 2016-05-08 11:40:30 -07:00
David Sparer
9878b39571 LayoutSettingsLoader: fix variable name for non-portable build 2016-05-08 12:23:05 -06:00
David Sparer
34f0b54284 Quick update+fix to SettingsLoader and forgot to update teh csproj 2016-05-08 12:09:22 -06:00
David Sparer
49d8aa7352 Extracted some responsibilities of the SettingsLoader to dedicated classes
Also cleaned some minor code noise in SettingsLoader
2016-05-08 12:03:36 -06:00
David Sparer
3ad6246e68 minor cleanup for Windows.cs 2016-05-08 10:30:16 -06:00
David Sparer
66eccf0032 some minor cleanup and local var renaming in ConnectionList.cs 2016-05-08 10:07:11 -06:00
David Sparer
995daecaff Merge branch 'MR-385_inheritance_settings_lost' into csharp_conv
# Conflicts:
#	mRemoteV1/App/Runtime.cs
#	mRemoteV1/Container/ContainerInfo.cs
2016-05-07 21:43:34 -06:00
Sean Kaim
1757c141fe Settings file changes
change from .config to .settings
Set UpdateAddress to an Application property, not a user property.
2016-05-07 22:31:02 -04:00
David Sparer
45b3f3d56f fixed issue described in MR-385
also made some refactoring changes in a quest to make the code more readable
2016-05-07 17:59:23 -06:00
Sean Kaim
b758b053d5 Added AppSettingsProvider (for non-portable builds) 2016-05-07 17:34:29 -04:00
Sean Kaim
7a3088d553 Fixed a number of complier warnings 2016-05-07 16:47:47 -04:00
Sean Kaim
15e297eef3 Set Code Analysis to MS Managed Recommended
Previously was set to "All" which generates a lot of complier warnings.
2016-05-07 16:26:55 -04:00
Sean Kaim
9476ba6578 target x86 / fixes complier warnings 2016-05-06 22:04:02 -04:00
Sean Kaim
a532120662 fix complier warning 2016-05-06 21:58:29 -04:00
David Sparer
b33f1a988c extracted the code for moving treenodes into its own class 2016-05-06 19:13:00 -06:00
David Sparer
24663a1944 forgot to build to update the csproj file after refactor 2016-05-06 18:29:10 -06:00
David Sparer
983ce80703 massive cleanup of code noise and renamed a few classes for clarity 2016-05-06 18:09:32 -06:00
David Sparer
4f3dbaa7ff Merge branch 'csharp_conv' into MR-385_inheritance_settings_lost 2016-05-06 17:38:00 -06:00
David Sparer
0c93614423 Revert "MR-808 intentionally broke build to test something in Jenkins"
This reverts commit 2060b19e92.
2016-05-06 17:07:21 -06:00
David Sparer
2060b19e92 MR-808 intentionally broke build to test something in Jenkins 2016-05-06 15:54:43 -06:00
David Sparer
cc3fc47cc3 did a bit of extra cleanup for MR-808 2016-05-06 15:42:53 -06:00
David Sparer
dd81a6ea91 Resolved issue by utilizing the correct object cast 2016-05-06 15:24:31 -06:00
Sparer, David
95f59ffb1b Merge branch 'csharp_conv' into MR-385_inheritance_settings_lost 2016-05-06 11:39:37 -06:00
Sparer, David
eaf1eaaee3 removing unit test that hangs 2016-05-06 11:35:35 -06:00
Sparer, David
2ebccbe372 fixed a small bug with the branch name regex 2016-05-06 11:32:06 -06:00
Sparer, David
adc49e61e7 adding Jenkinsfile to branch to enable automatic builds within Jenkins 2016-05-06 11:08:51 -06:00
Sparer, David
58142e70af updated Contributors section. also just pushing this to test jenkins webhooks 2016-05-04 08:51:19 -06:00
David Sparer
bae61f58af Merge pull request #109 from sparerd/MR-385_Inheritance_settings_lost
migrating branch to official repo
2016-05-03 09:24:59 -06:00
Kaim, Sean M
f7ac538f1d prevent exception at startup 2016-05-03 00:02:30 -04:00
Kaim, Sean M
8196e61a2c last fix to ensure loading correct settings file 2016-05-02 23:54:25 -04:00
Kaim, Sean M
403983ac6b addl fix to ensure loading correct settings file 2016-05-02 22:41:14 -04:00
Sean Kaim
f3e2f495d3 Merge pull request #108 from sparerd/csharp_conversion
Initial pull from fork into main repo
2016-05-02 22:02:16 -04:00
Sparer, David
78f7ded7a8 Merge branch 'csharp_conversion' into MR-385_Inheritance_settings_lost 2016-05-02 14:52:29 -06:00
Kaim, Sean M
053d59153e Fix portable settings path and remove some VB calls 2016-05-02 16:09:13 -04:00
Kaim, Sean M
84d849da4c Fix NullReferenceExceptions
Introduced in commit 63e0cd198c
Also performed some code cleanup
2016-05-02 15:58:38 -04:00
Sparer, David
90eba686c7 Quick refactor of the methods for retrieving ConnectionInfo properties (including inherited properties). 2016-05-02 11:50:17 -06:00
hiriumi
5a4d53908d A lof refactoring. There is a problem in PortableSettingsProvider.cs where it doesn't save the config file. We need to address PortableSettingsProvider.SetPropertyValues() method that saves the config file is not called at all. 2016-05-02 00:43:28 -07:00
hiriumi
e76dd18962 Refactoring to make the code more CSharpy and resolving more namespace issues. 2016-05-01 19:41:06 -07:00
hiriumi
071c4537ee Removed Microsoft.VisualBasic reference 2016-05-01 19:01:38 -07:00
hiriumi
e4e92c8b21 Did some refactoring to get some classes in the right namespace and some other adjustment. 2016-05-01 18:37:32 -07:00
hiriumi
43a54cdc76 Merge branch 'csharp_conversion' of https://github.com/mRemoteNG/mRemoteNG.git 2016-05-01 11:06:12 -07:00
hiriumi
c88ad088c0 Jira Item 714. I'm supressing the error to prevent the KeyboardHook from crashing the whole application. I'm not sure if this is the right away, so please review the code.
https://mremoteng.atlassian.net/browse/MR-714
2016-05-01 10:43:05 -07:00
Sean Kaim
f462340ac8 Merge pull request #6 from mRemoteNG/kmscode_rpd_v8
RDP version 8 Client & code clean up
2016-04-29 17:06:18 -04:00
Kaim, Sean M
b0cef15fa2 RDP version 8 Client & code clean up 2016-04-29 17:05:25 -04:00
Sean Kaim
160b0101a9 Merge pull request #3 from mRemoteNG/kmcode_csharp_conv
Remove WTS Sessions panel
2016-04-29 15:16:25 -04:00
Kaim, Sean M
63e0cd198c Correct errors for non-portable build 2016-04-29 12:22:19 -04:00
Kaim, Sean M
8a601b4d00 remove bin and obj files 2016-04-29 11:55:09 -04:00
Kaim, Sean M
ff81202d8a Remove bin and obj files 2016-04-29 11:54:20 -04:00
Kaim, Sean M
eed8df7391 Remove WTS Sessions Panel 2016-04-29 11:47:59 -04:00
Kaim, Sean M
12df1caead Remove WTS Sessions panel 2016-04-29 11:47:35 -04:00
Kaim, Sean M
15a7565cfb Update gitignore 2016-04-29 11:13:33 -04:00
Kaim, Sean M
38f17b05c2 update gitignore 2016-04-29 11:07:23 -04:00
Kaim, Sean M
d4e81daee3 Remove Unused References 2016-04-29 10:59:30 -04:00
Kaim, Sean M
143724f146 update gitignore 2016-04-29 10:54:49 -04:00
hiriumi
a3223d2f01 Fixed options forms. Namespaces are also corrected as well. 2016-04-26 22:52:24 -07:00
David Sparer
9520fbe4a1 re-adding some files lost during the migraton from sparerd/mRemoteNG-1 2016-04-14 01:27:15 -06:00
David Sparer
91bce23a5a Merge pull request #1 from sparerd/c#conversion
C#conversion
2016-04-13 23:06:35 -06:00
Sparer, David
b39b367ef2 absolute mess, but decided on a Strategy pattern for choosing connection protocols 2016-03-16 15:41:24 -06:00
Sparer, David
97736b19cd refactoring Connections subsystem 2016-03-15 15:45:45 -06:00
Sparer, David
a5c6fc9bed Revert "began rewrite of Theme subsystem"
This reverts commit a68bbc7950.
2016-03-15 08:00:07 -06:00
David Sparer
a68bbc7950 began rewrite of Theme subsystem 2016-03-13 21:34:09 -06:00
Sparer, David
40941a3b22 fixes 2016-03-11 12:58:19 -07:00
David Sparer
7ea6902b87 fixes 2016-03-10 18:43:16 -07:00
Sparer, David
7c74d447bc runtime and conversion fixes 2016-03-10 15:35:09 -07:00
Sparer, David
a937d5c4f7 runtime fixes 2016-03-09 15:44:41 -07:00
Sparer, David
2f90496a6e more fixes and cleanup 2016-03-08 15:43:29 -07:00
David Sparer
36fa99cef0 fixes 2016-03-07 18:14:31 -07:00
Sparer, David
eadbb1672f more fixes 2016-03-07 15:41:02 -07:00
David Sparer
eb7fad1054 more fixes 2016-03-06 18:24:44 -07:00
David Sparer
b4b7dc667f more fixes 2016-03-06 18:03:06 -07:00
David Sparer
8fe56722a5 more syntax fixes 2016-03-04 18:10:17 -07:00
Sparer, David
7dfc0643d5 more syntax fixes 2016-03-04 12:49:19 -07:00
David Sparer
b3c2fa1770 more syntax fixing 2016-03-03 19:12:11 -07:00
Sparer, David
4303c452e1 who knows 2016-03-03 15:45:53 -07:00
Sparer, David
6b4f2d3e18 more conversion updates 2016-03-03 15:44:51 -07:00
Sparer, David
f8dfc3c652 began converting project to c# 2016-03-01 15:04:05 -07:00
Sparer, David
21014f2e0e Added postbuild event to enable LargeAddressAware as a workaround for https://mremoteng.atlassian.net/browse/MR-582 2016-02-17 11:39:34 -07:00
1717 changed files with 371118 additions and 81548 deletions

157
.github/workflows/Build_mR-NB.yml vendored Normal file
View File

@@ -0,0 +1,157 @@
name: Build_and_Release_mR-NB
on:
push:
branches:
- v1.78.2-dev
workflow_dispatch:
inputs:
release_flag:
description: 'Run NB release'
required: false
default: 'true'
permissions:
contents: write
jobs:
NB-Build-and-Release:
strategy:
matrix:
include:
- runner: windows-latest
platform: x64
arch: x64
- runner: windows-11-arm
platform: ARM64
arch: arm64
runs-on: ${{ matrix.runner }}
# Only run if:
# - manual dispatch, OR
# - push event AND commit message contains "NB release"
if: >
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'push' && contains(github.event.head_commit.message, 'NB release'))
steps:
- name: (01) Checkout Repository
uses: actions/checkout@v5
- name: (02) Setup MSBuild
uses: microsoft/setup-msbuild@v2
with:
vs-version: '17.14.12'
- name: (03) Install and run dotnet-t4 to transform T4 templates
shell: pwsh
run: |
dotnet tool install --global dotnet-t4
# Refresh PATH to include global tools
$env:PATH += ";$env:USERPROFILE\.dotnet\tools"
$ttFile = "$env:GITHUB_WORKSPACE\mRemoteNG\Properties\AssemblyInfo.tt"
# VS Enterprise 2022 assemblies
$vsPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\PublicAssemblies"
Write-Host "Transforming T4 template"
t4 $ttFile -P platformType=${{ matrix.platform }} -r:"$vsPath\EnvDTE.dll" -r:"$vsPath\Microsoft.VisualStudio.Interop.dll"
env:
PLATFORM: '${{ matrix.platform }}'
- name: (04) Cache NuGet Packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-${{ matrix.arch }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-${{ matrix.arch }}-nuget-
- name: (05) Restore NuGet Packages
shell: pwsh
run: dotnet restore
- name: (06) Build Release
shell: pwsh
run: |
msbuild "$Env:GITHUB_WORKSPACE\mRemoteNG.sln" -p:Configuration="Release" -p:Platform=${{ matrix.platform }} /verbosity:minimal
- name: (07) Release Information
id: version
shell: pwsh
run: |
$assemblyInfoPath = "${{ github.workspace }}\mRemoteNG\Properties\AssemblyInfo.cs"
$line = Get-Content $assemblyInfoPath | Where-Object { $_ -match 'AssemblyVersion\("(.+?)"\)' }
if ($line -match 'AssemblyVersion\("(?<ver>\d+\.\d+\.\d+)\.(?<build>\d+)"\)') {
$version = $matches['ver']
$build = $matches['build']
} else {
throw "Could not extract version and build number"
}
$date = Get-Date -Format "yyyyMMdd"
$zipName = "mRemoteNG-$date-v$version-NB-$build-${{ matrix.arch }}.zip"
$tag = "$date-v$version-NB-($build)"
$message = git log -1 --pretty=%B
echo "message=$message" >> $env:GITHUB_OUTPUT
echo "zipname=$zipName" >> $env:GITHUB_OUTPUT
echo "version=$version" >> $env:GITHUB_OUTPUT
echo "build=$build" >> $env:GITHUB_OUTPUT
echo "tag=$tag" >> $env:GITHUB_OUTPUT
$version = "${{ steps.version.outputs.version }}"
- name: (08) Extract Changelog Section
id: changelog
shell: pwsh
run: |
$changelogPath = "$env:GITHUB_WORKSPACE\CHANGELOG.md"
$lines = Get-Content $changelogPath
$startIndex = -1
for ($i = 0; $i -lt $lines.Count; $i++) {
if ($lines[$i] -match '^## \[') {
$startIndex = $i
break
}
}
if ($startIndex -eq -1) {
throw "No version header found in CHANGELOG.md"
}
$section = @()
for ($i = $startIndex + 1; $i -lt $lines.Count; $i++) {
if ($lines[$i] -match '^## ') {
break
}
$section += $lines[$i]
}
$joined = $section -join "`n"
echo "log<<EOF" >> $env:GITHUB_OUTPUT
echo $joined >> $env:GITHUB_OUTPUT
echo "EOF" >> $env:GITHUB_OUTPUT
echo "log=$escaped"
- name: (09) Create Zip File
shell: pwsh
run: |
$sourceDir = "$Env:GITHUB_WORKSPACE\mRemoteNG\bin\${{ matrix.platform }}\Release"
Compress-Archive -Path "$sourceDir\*" -DestinationPath ${{ steps.version.outputs.zipname }}
echo "File: ${{ steps.version.outputs.zipname }}"
- name: (10) Create release
id: create_release
uses: softprops/action-gh-release@aec2ec56f94eb8180ceec724245f64ef008b89f5 # v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
with:
tag_name: ${{ steps.version.outputs.tag }}
name: "mRemoteNG ${{ steps.version.outputs.version }} NB ${{ steps.version.outputs.build }}"
files: ${{ steps.version.outputs.zipname }}
body: |
Changes in this Release:
${{ steps.changelog.outputs.log }}
Last Commit Message:
${{ steps.version.outputs.message }}
draft: false
prerelease: true

126
.github/workflows/add_PR_2_chlog.yml vendored Normal file
View File

@@ -0,0 +1,126 @@
name: Update Changelog After Renovate PR Merge
on:
# 1) Auto on pushes to your repos default branch (merge commits included)
push:
branches:
- v1.78.2-dev
# 2) Manual trigger
workflow_dispatch:
inputs:
dryRun:
description: 'Run without committing changes'
required: false
default: 'true'
jobs:
update-changelog:
runs-on: ubuntu-latest
# Only proceed if…
# - manual dispatch
# - OR a push to default branch
if: |
github.event_name == 'workflow_dispatch' ||
github.event_name == 'push'
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Check for Renovate dependency update
id: check-renovate
shell: bash
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "isRenovate=true" >> $GITHUB_OUTPUT
exit 0
fi
msg="$(git log -1 --pretty=%B)"
if echo "$msg" | grep -q 'chore(deps): update dependency'; then
echo "isRenovate=true" >> $GITHUB_OUTPUT
else
echo "isRenovate=false" >> $GITHUB_OUTPUT
fi
- name: Abort if not a Renovate PR
if: steps.check-renovate.outputs.isRenovate == 'false'
run: |
echo " Last commit is not a Renovate dependency update—skipping."
- name: Parse Renovate PR info
if: steps.check-renovate.outputs.isRenovate == 'true'
id: extract
shell: pwsh
run: |
# 1) Determine dryRun
$dryRun = '${{ github.event.inputs.dryRun }}'
if (-not $dryRun) { $dryRun = 'false' }
Write-Host "🔍 dryRun = $dryRun"
# 2) Read full commit message
$fullMsg = git log -1 --pretty=%B
Write-Host "📝 Commit message:"; Write-Host $fullMsg
# 3) Extract PR number
if ($fullMsg -match 'Merge pull request #(\d+)') {
$prNumber = $matches[1]
} else {
throw "❌ Could not locate PR number in merge commit"
}
# 4) Extract dependency name & version
if ($fullMsg -match 'chore\(deps\): update dependency ([\w\.\-]+) to ([\d\.]+)') {
$depName = $matches[1]
$depVersion = $matches[2]
} else {
throw "❌ Could not parse dependency name/version"
}
# 5) Export outputs
echo "pr=$prNumber" >> $env:GITHUB_OUTPUT
echo "depName=$depName" >> $env:GITHUB_OUTPUT
echo "depVersion=$depVersion" >> $env:GITHUB_OUTPUT
echo "dryRun=$dryRun" >> $env:GITHUB_OUTPUT
- name: Update CHANGELOG.md
if: steps.check-renovate.outputs.isRenovate == 'true'
shell: pwsh
run: |
$path = "$env:GITHUB_WORKSPACE/CHANGELOG.md"
if (-not (Test-Path $path)) { throw "❌ CHANGELOG.md not found" }
$lines = Get-Content $path
$pr = '${{ steps.extract.outputs.pr }}'
$dep = '${{ steps.extract.outputs.depName }}'
$ver = '${{ steps.extract.outputs.depVersion }}'
$entry = "- #$pr: update dependency $dep to $ver"
# Find latest version header: ## [x.y.z]
$vIndex = $lines.FindIndex({ $_ -match '^## \[\d+\.\d+\.\d+\]' })
if ($vIndex -lt 0) { throw "❌ No version header found" }
# Locate or create "### Dependency update"
$depIndex = -1
for ($i = $vIndex + 1; $i -lt $lines.Count; $i++) {
if ($lines[$i] -match '^### Dependency update') { $depIndex = $i; break }
if ($lines[$i] -match '^## ') { break }
}
if ($depIndex -eq -1) {
$lines.Insert($vIndex + 1, '### Dependency update')
$depIndex = $vIndex + 1
}
# Insert the changelog entry
$lines.Insert($depIndex + 1, $entry)
Set-Content -Path $path -Value $lines
Write-Host "✅ Inserted in CHANGELOG.md:"; Write-Host " $entry"
- name: Commit & push
if: steps.check-renovate.outputs.isRenovate == 'true' && steps.extract.outputs.dryRun != 'true'
run: |
git config user.name "github-actions"
git config user.email "github-actions@github.com"
git add CHANGELOG.md
git commit -m "docs: update changelog for #${{ steps.extract.outputs.pr }}"
git push

49
.github/workflows/post_2_Reddit.yml vendored Normal file
View File

@@ -0,0 +1,49 @@
name: Post to Reddit via PowerShell
on:
workflow_dispatch:
jobs:
post:
runs-on: windows-latest
steps:
- name: Authenticate and post to Reddit
shell: pwsh
env:
CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
USERNAME: ${{ secrets.REDDIT_USERNAME }}
PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
SUBREDDIT: ${{ secrets.REDDIT_SUBREDDIT }}
run: |
# Step 1: Get access token
$authHeaders = @{
Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$env:CLIENT_ID:$env:CLIENT_SECRET"))
"User-Agent" = "github-to-reddit-pwsh/0.1"
}
$authBody = @{
grant_type = "password"
username = $env:USERNAME
password = $env:PASSWORD
}
$authResponse = Invoke-RestMethod -Uri "https://www.reddit.com/api/v1/access_token" -Method Post -Headers $authHeaders -Body $authBody
$token = $authResponse.access_token
# Step 2: Post to subreddit
$postHeaders = @{
Authorization = "bearer $token"
"User-Agent" = "github-to-reddit-pwsh/0.1"
}
$postBody = @{
sr = $env:SUBREDDIT
title = "Hello from GitHub Actions (PowerShell)"
kind = "self"
text = "This post was made using PowerShell in GitHub Actions."
}
$postResponse = Invoke-RestMethod -Uri "https://oauth.reddit.com/api/submit" -Method Post -Headers $postHeaders -Body $postBody
Write-Host "Posted: $($postResponse.json.url)"

278
.gitignore vendored
View File

@@ -1,16 +1,13 @@
Release/
mRemoteV1/bin/
mRemoteV1/obj/
mRemoteV1/publish/
**/bin/
**/obj/
**/[Rr]elease [Pp]ortable/
**/[Dd]ebug [Pp]ortable/
*.pfx
*.suo
*.vbproj.user
Thumbs.db
[Dd]ebug/
_Re[Ss]harper.*
*.resharper
*.resharper.user
*.suo
*.cache
*~
*.swp
@@ -24,3 +21,268 @@ UpgradeLog.XML
*.sdf
*.opensdf
*.ipch
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
*.msi
Installer/Resources/License.rtf
Installer/Fragments/FilesFragment.wxs
Installer Projects/Installer/Resources/License.rtf
Installer Projects/Installer/Fragments/FilesFragment.wxs
Installer Projects/Installer/Fragments/HelpFilesFragment.wxs
InstallerProjects/Installer/Fragments/FilesFragment.wxs
InstallerProjects/Installer/Resources/License.rtf
# mRemoteNG
**/mRemoteNG/Properties/AssemblyInfo.tt
**/mRemoteNG/Properties/AssemblyInfo.cs

14
.readthedocs.yaml Normal file
View File

@@ -0,0 +1,14 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: mRemoteNGDocumentation/conf.py
# Optionally build your docs in additional formats such as PDF
formats:
- pdf

11
Add-ons/README.md Normal file
View File

@@ -0,0 +1,11 @@
## Add-ons library by 3rd party
This is a list of add-ons, plugins and extentions what could be used with mRemoteNG, if you wish to add yours to this list - just drop me a line: <a href="mailto:support@mremoteng.org">support@mremoteng.org</a>
<br>
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>Date&nbsp;added</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>Author</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <b>Type</b> | <b>Name</b> | <b>Description</b> | <b>Repository</b> |
| :---------------------------------------------------------:|:-------------------------------------------------:| :---------: |-------------|--------------------|:-----------------:|
| 02-08-2022 | <a href="https://github.com/JustBeta"><img align="left" src="https://avatars.githubusercontent.com/u/25150896?v=4" alt="JustBeta" width="30px"/>JustBeta</a> | script | Export-MobaXterm2mRemoteNG | Conversion of MobaXterm's ini file to mRemoteNG format. | [GITHUB Repository](https://github.com/JustBeta/Export-MobaXtern2mRemoteNG/tree/main) |
<br>
For a detailed usage examples and documentation please reach out authors.

149
BUILD.CMD
View File

@@ -1,149 +0,0 @@
@echo off
setlocal enabledelayedexpansion
set VERSIONTAG=
set VCVARSALL="%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
set DEVENV="devenv.exe"
set MAKENSIS="%ProgramFiles(x86)%\NSIS\Unicode\makensis.exe"
set RAR="%ProgramFiles%\WinRAR\WinRAR.exe"
set SIGNCMD=signtool.exe sign /n "Astrospark Technologies, LLC" /sha1 "1cbd910dbd6e77f26506e7f600736972f700673f" /tr http://timestamp.comodoca.com/rfc3161
rem Windows Sysinternals Sigcheck from http://technet.microsoft.com/en-us/sysinternals/bb897441
set SIGCHECK="%ProgramFiles(x86)%\Sigcheck\sigcheck.exe"
call %VCVARSALL% x86
rmdir /s /q "%~dp0\mRemoteV1\bin" > nul 2>&1
rmdir /s /q "%~dp0\mRemoteV1\obj" > nul 2>&1
if exist "%~dp0\mRemoteV1\bin" goto ERROR_RMDIR
if exist "%~dp0\mRemoteV1\obj" goto ERROR_RMDIR
goto NOERROR_RMDIR
:ERROR_RMDIR
echo.
echo Could not clean output directories.
echo.
echo Build process failed.
echo.
goto END
:NOERROR_RMDIR
echo Building release version...
%DEVENV% "%~dp0\mRemoteV1.sln" /build "Release"
echo Building portable version...
%DEVENV% "%~dp0\mRemoteV1.sln" /build "Release Portable"
echo Signing binaries...
%SIGNCMD% ^
"%~dp0\mRemoteV1\bin\Release\de\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\el\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\en-US\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\es\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\es-AR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\fr\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\hu\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\it\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\nb-NO\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\nl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\pl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\pt\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\pt-BR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\ru\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\uk\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\zh-CN\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\zh-TW\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release\AxInterop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release\AxInterop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.EOLWTSCOM.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.ShDocVw.dll" ^
"%~dp0\mRemoteV1\bin\Release\Interop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release\mRemoteNG.exe" ^
"%~dp0\mRemoteV1\bin\Release Portable\de\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\el\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\en-US\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\es\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\es-AR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\fr\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\hu\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\it\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\nb-NO\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\nl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\pl\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\pt\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\pt-BR\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\ru\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\uk\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\zh-CN\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\zh-TW\mRemoteNG.resources.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\AxInterop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\AxInterop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.EOLWTSCOM.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.MSTSCLib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.ShDocVw.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\Interop.WFICALib.dll" ^
"%~dp0\mRemoteV1\bin\Release Portable\mRemoteNG.exe" ^
rem Do not remove the two blank lines above this line.
mkdir "%~dp0\Release" > nul 2>&1
echo Getting product version...
set VERSIONNSH="%~dp0\Release\Version.nsh"
set SIGCHECK=!SIGCHECK:"=^"!
set SIGCHECK=!SIGCHECK: =^^ !
set SIGCHECK=!SIGCHECK:(=^^(!
set SIGCHECK=!SIGCHECK:)=^^)!
for /F "usebackq delims=. tokens=1-4" %%i in (`!SIGCHECK! /accepteula -q -n "%~dp0\mRemoteV1\bin\Release\mRemoteNG.exe"`) do (
set PRODUCT_VERSION_SHORT=%%i.%%j
echo ^^!define PRODUCT_VERSION "%%i.%%j.%%k.%%l" > %VERSIONNSH%
echo ^^!define PRODUCT_VERSION_SHORT "%%i.%%j" >> %VERSIONNSH%
echo ^^!define PRODUCT_VERSION_MAJOR "%%i" >> %VERSIONNSH%
echo ^^!define PRODUCT_VERSION_MINOR "%%j" >> %VERSIONNSH%
)
echo Version is %PRODUCT_VERSION_SHORT%
echo Creating installer package...
if defined VERSIONTAG (
%MAKENSIS% /DPRODUCT_VERSION_TAG=%VERSIONTAG% "%~dp0\Installer\mRemote.nsi"
set INSTALLEREXE="%~dp0\Release\mRemoteNG-Installer-%PRODUCT_VERSION_SHORT%-%VERSIONTAG%.exe"
set BINARYZIP="%~dp0\Release\mRemoteNG-%PRODUCT_VERSION_SHORT%-%VERSIONTAG%.zip"
set PORTABLEZIP="%~dp0\Release\mRemoteNG-Portable-%PRODUCT_VERSION_SHORT%-%VERSIONTAG%.zip"
) else (
%MAKENSIS% "%~dp0\Installer\mRemote.nsi"
set INSTALLEREXE="%~dp0\Release\mRemoteNG-Installer-%PRODUCT_VERSION_SHORT%.exe"
set BINARYZIP="%~dp0\Release\mRemoteNG-%PRODUCT_VERSION_SHORT%.zip"
set PORTABLEZIP="%~dp0\Release\mRemoteNG-Portable-%PRODUCT_VERSION_SHORT%.zip"
)
del %VERSIONNSH%
echo Signing installer package...
%SIGNCMD% %INSTALLEREXE%
echo Creating release ZIP file...
del /f /q %BINARYZIP% > nul 2>&1
%RAR% a -m5 -r -ep1 -afzip -inul %BINARYZIP% "%~dp0\mRemoteV1\bin\Release\*.*"
%RAR% a -m5 -r -ep1 -afzip -inul %BINARYZIP% "%~dp0\Installer\Dependencies\*.*"
%RAR% a -m5 -ep -afzip -inul %BINARYZIP% "%~dp0\*.TXT"
echo Creating portable ZIP file...
del /f /q %PORTABLEZIP% > nul 2>&1
%RAR% a -m5 -r -ep1 -afzip -inul %PORTABLEZIP% "%~dp0\mRemoteV1\bin\Release Portable\*.*"
%RAR% a -m5 -r -ep1 -afzip -inul %PORTABLEZIP% "%~dp0\Installer\Dependencies\*.*"
%RAR% a -m5 -ep -afzip -inul %PORTABLEZIP% "%~dp0\*.TXT"
echo.
echo Build process complete.
echo.
:END
pause

View File

@@ -1,844 +0,0 @@
1.73 Beta 2 ():
Fixed issue MR-619 - Keyboard shortcuts stop working after locking the screen with Win+L
Added support for importing files from PuTTY Connection Manager.
Improved the import and export functionality.
1.73 Beta 1 (2013-11-19):
Added feature MR-16 - Add keyboard shortcuts to switch between tabs
Added feature MR-141 - Add a default protocol option
Added feature MR-212 - Add option to connect without credentials
Added feature MR-512 - Add support for importing files from Remote Desktop Connection Manager
Added feature MR-547 - Add support for Xming Portable PuTTY
Made improvement MR-250 - Show the name of the selected connection tab in the title of the window
Made improvement MR-367 - Make the 'Connect' button on the 'Quick Connect' toolbar a forced dropdown
Made improvement MR-419 - Password prompt dialog should have a meaningful window title
Made improvement MR-486 - Allow escaping of variable names for external tools
Made improvement MR-590 - Make panels docked to the edge of the window keep their size
Fixed issue MR-187 - F7 keyboard shortcut for New Folder conflicts with remote connections
Fixed issue MR-523 - Changes to external tools are not saved until exiting the program
Fixed issue MR-556 - Export fails when overwriting an existing file
Fixed issue MR-594 - Crash on startup if write access is denied to the IE browser emulation registry key
Fixed issue MR-603 - Some configuration options are still shown even when inheritance is enabled
Added "Reset" to config panel context menu to allow resetting some config settings to their default value.
Added and improved menu icons.
Removed misleading log messages about RD Gateway support.
Removed invalid "Site" configuration option from PuTTY Saved Sessions.
Fixed PuTTY Saved Sessions still showing if all saved sessions are removed.
Fixed config panel showing settings from previously loaded connection file after loading a new one.
Improved handling of variables in external tool arguments.
1.72 (2013-11-13):
Fixed issue MR-592 - Unable to run VBS script as an external tool
Fixed issue MR-596 - Incorrect escaping of quotation marks in external tool arguments
1.71 (2013-10-29):
Fixed issue MR-574 - Crash when retrieving RDP session list if eolwtscom.dll is not registered
Fixed issue MR-578 - Connections file is reset
Fixed log file not showing operating system version on Windows XP and Windows Server 2003.
Fixed the wrong connections file opening on startup under certain conditions.
Fixed checking for updates even when disabled.
Improved error reporting when loading connections files.
Removed warning message when mRemoteNG is started for the first time about new connections file being created.
1.71 Release Candidate 2 (2013-10-16):
Fixed issue MR-560 - Cannot Auto-Update With Open Connections: Unable to find an entry point named 'TaskDialogIndirect' in DLL 'ComCtl32'
Fixed issue MR-565 - Double Folder keep heritage on the initial Folder
Fixed issue MR-566 - Typo in German UI Automatic Update Settings
Fixed duplicated folders possibly being named "New Connection" instead of the original folder's name.
1.71 Release Candidate 1 (2013-10-01):
Fixed issue MR-495 - Having a negative range in port scan creates memory exhaustion.
Fixed issue MR-514 - Window Proxy test failed without close button
Fixed issue MR-521 - Right-Clicking in "Sessions" panel crashes mRemoteNG
Fixed issue MR-525 - Could not start on windows 7 64bit
Fixed issue MR-535 - SQL error saving Connections
Fixed issue MR-538 - RDP loses connection when hiding config or connections pane
Fixed issue MR-542 - Wrapped putty has security flaw
Made minor improvements to the port scan functionality.
Fixed possible cross-thread operation exception when loading connections from SQL.
Fixed PuTTY Saved Sessions not showing after loading a new connections file.
Updated PuTTY to version 0.63.
Updated translations.
Added Chinese (Traditional) translation.
Added partial Greek and Hungarian translations.
1.71 Beta 5 (2013-06-09):
Fixed issue MR-491 - Could not start RDP Connection
Fixed issue MR-499 - TS Gateway is not working in latest release 1.71
Fixed typo in SQL queries.
1.71 Beta 4 (2013-05-28):
Added feature MR-435 - Add digital signature check to updater
Fixed issue MR-255 - The version of the RDP AX client should be updated to 7
Fixed issue MR-392 - Sessions Panel - context menu entries need to be context aware
Fixed issue MR-422 - Gives error Object reference not set to an instance of an object.
Fixed issue MR-424 - Import of a few Linux SSH2 hosts discovered via the port scan tool results in a UE
Fixed issue MR-439 - MRemoteNG 1.70 does not start
Fixed issue MR-440 - RDP import with non-standard port
Fixed issue MR-443 - Instructions for eolwtscom.dll registration for Portable version are inaccurate
Fixed issue MR-446 - Putty saved sessions show in connection panel
Fixed issue MR-459 - Maximized -> Minimized -> Restored results in mangled active display
Fixed issue MR-463 - Add support for LoadBalanceInfo to RDP
Fixed issue MR-470 - Quick Connect to Linux server uses invalid credentials
Fixed issue MR-471 - PuTTY Saved Sessions disappears from connection list
Fixed issue MR-487 - Initiate connections on MouseUp event
Added PuTTY Session Settings command to the Config panel for PuTTY Saved Sessions.
Updated translations.
Added Norwegian (Bokmal) and Portuguese (Brazil) translations.
Added Spanish translation to the installer.
Fixed an exception or crash when choosing unnamed colors for themes.
Fixed possible error "Control does not support transparent background colors" when modifying themes.
Fixed changes to the active theme not being saved reliably.
Fixed handling of the plus (+) character in PuTTY session names.
Changed Internet Explorer to no longer force IE7 compatibility mode.
Changed the "Launch PuTTY" button in the "Options" dialog to open PuTTY from the path the user has currently set, instead of what was previously saved.
Improved update and announcement checking.
Improved the PuTTY Saved Sessions list to update automatically when any changes are made.
Improved loading time of large connection files.
Lowered required version of RDC from 6.1 to 6.0.
Updated VncSharpNG to 1.3.4896.25007.
1.71 Beta 3 (2013-03-20):
Fixed issue MR-397 - Putty disappears from the screen
Fixed issue MR-398 - Full Screen mode doesn't correctly make use of available space
Fixed issue MR-402 - scrollbar touch moves putty window
Fixed issue MR-406 - Items disappear from External Tools toolbar when accessing External Tools panel
Fixed issue MR-410 - Unhandled exception when clicking New button under Theme
Fixed issue MR-413 - Can't use aplication
Fixed new connections having a globe icon.
Fixed the category names in the themes tab of the options dialog on Windows XP not showing correctly.
Fixed PuTTY saved sessions with spaces or special characters not being listed.
1.71 Beta 2 (2013-03-19):
Added feature MR-336 - Customizable background color for the windows/panels
Added feature MR-345 - Two separate options for confirming closure of Tabs and Connection Panels
Added feature MR-346 - Option to show/hide the description box at the bottom of the Config panel
Added feature MR-351 - Import connections from PuTTY
Fixed issue MR-354 - Re-ordering tabs doesn't give good, reliable visual feedback
Fixed issue MR-375 - Changing a connection's icon using the picture button should immediately update Icon field
Fixed issue MR-377 - Several redundant panels can be opened
Fixed issue MR-379 - Connection variables not working with external tools
Fixed issue MR-381 - Notifications panel - whitespace context menu allows Copy and Delete on nothing
Fixed issue MR-401 - Checkbox misaligned
The username and domain settings are now hidden for VNC connections since they are not supported.
Changed "Automatically get session information" to be disabled by default.
RDP connections can now be switched to full screen mode when redirect key combinations is enabled.
1.71 Beta 1 (2013-03-04):
Added feature MR-329 - Create Option to disable the "Quick: " prefix
Fixed issue MR-67 - Sort does not recursively sort
Fixed issue MR-117 - Remote Session Info Window / Tab does not populate
Fixed issue MR-121 - Config pane not sorting properties correctly when switching between alphabetical and categorized view
Fixed issue MR-130 - Issues duplicating folders
Fixed issue MR-142 - Start of mRemoteNG takes about one minute and consumes excessive CPU
Fixed issue MR-158 - Password field not accepting Pipe
Fixed issue MR-330 - Portable version saves log to user's profile folder
Fixed issue MR-333 - Unnecessary prompt for 'close all open connections?'
Fixed issue MR-342 - Incorrect view in config pane of new connection after viewing default inheritance
Fixed issue MR-352 - Passwords with " (quotation mark) and # (hash key) characters make mRemoteNG to open PuttyNG dialog
Fixed issue MR-362 - Rename 'Screenshot Manager' to 'Screenshots' on the View menu to match Panel name
Added detection of newer versions of connection files and database schemata. mRemoteNG will now refuse to open them to avoid data loss.
Improved appearance and discoverability of the connection search box.
If RDC 7.0 or higher is installed, the connection bar is no longer briefly shown when connecting to an RDP connection with redirect key combinations enabled.
If RDC 8.0 or higher is installed, RDP connections automatically adjust their size when the window is resized or when toggling full screen mode.
1.70 (2013-03-07):
Fixed issue MR-339 - Connection group collapses with just one click
Fixed issue MR-340 - Object reference not set to an instance of an object.
Fixed issue MR-344 - Move "Always show panel tabs" option
Fixed issue MR-350 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long.
Fixed issue MR-355 - Moving sub folders to top level causes property loss
Fixed tabs not closing on double-click when the active tab is a PuTTY connection.
1.70 Release Candidate 2 (2013-02-25):
Fixed issue MR-332 - Can't select different tab with one click after disconnecting existing tab
Fixed issue MR-338 - PuTTYNG crashing on fresh install of mRemoteNG
Re-enabled PuTTYNG integration enhancements on Windows 8
1.70 Release Candidate 1 (2013-02-22):
Fixed issue MR-183 - Error trying to save connections when using SQL - Invalid column name _parentConstantId
Fixed issue MR-225 - Tabs do not open in a panel until multiple panels are displayed.
Fixed issue MR-229 - Integrated PuTTY doesn't work in Windows 8 RP
Fixed issue MR-264 - Windows 8 support
Fixed issue MR-317 - Difficulty right-clicking on Tab
Fixed issue MR-318 - Wrong tab gets selected when tab names overflow on the tab bar
Fixed issue MR-321 - New connection panel doesn't get panel header if its the only one or is moved
Fixed issue MR-322 - Connection Button not listing servers
Added option to always show panel tabs.
Fixed "Decryption failed. Padding is invalid and cannot be removed." notification.
Fixed KiTTY opening in a separate window when using a saved session.
1.70 Beta 2 (2013-02-18):
Fixed issue MR-47 - Silent Installation Prompts for Language
Fixed issue MR-54 - Error When disconnecting from SSL channel RDP
Fixed issue MR-58 - Bug when duplicating connection in connection view
Fixed issue MR-68 - Config Window Loses Options
Fixed issue MR-71 - Minimizing mRemoteNG causes temporary re-size of Putty sessions (windows)
Fixed issue MR-80 - Reconnect previous sessions
Fixed issue MR-81 - Problem Duplicating Folder w/ Sub-Folders
Fixed issue MR-85 - Microsoft .NET Framework warning
Fixed issue MR-86 - Citrix GDI+ Error when screen is locked
Fixed issue MR-96 - When pressing SHIFT+F4 to create a new connection inside a folder, the new connections doesn't inherit any properties from its parent
Fixed issue MR-101 - Collapse all folders causes a NullReferenceException
Fixed issue MR-165 - Can't close About window if it is the last tab
Fixed issue MR-166 - Inheritance button is disabled on some connections
Fixed issue MR-167 - Name and description of properties not show in inheritance list
Fixed issue MR-171 - Inherit configuration not showing friendly names for each inherit component
Fixed issue MR-172 - RDGatewayPassword is unencrypted in confCons.xml file
Fixed issue MR-174 - Trailing Space on a Hostname/IP will cause the connection not to happen.
Fixed issue MR-175 - Problem with focus when 2 or more PuTTY sessions opened
Fixed issue MR-176 - Del key while editing connection name triggers 'Delete Connection'
Fixed issue MR-178 - 3 different panels crashes all connections
Fixed issue MR-181 - Sessions on startup
Fixed issue MR-190 - Can't click on tab/session
Fixed issue MR-196 - Cannot export list without usernames and passwords
Fixed issue MR-199 - when using screen inside putty, screen becomes dead when reduce mremoteNG
Fixed issue MR-202 - The Connection "Tab" show Ampersands as underscores.
Fixed issue MR-214 - Hostname/IP reset
Fixed issue MR-224 - Session tabs become un-clickable after duplicating a tab or opening a new one in the same panel
Fixed issue MR-233 - Backslash at end of password prevents success of putty invocation and corresponding auto-logon
Fixed issue MR-235 - Config file gets corrupted when leaving the password entry box with ESC
Fixed issue MR-264 - Windows 8 support
Fixed issue MR-277 - Inheritance configuration button not appear in configuration tab
Fixed issue MR-284 - SSH: Text not showing properly
Fixed issue MR-299 - mRemoteNG crashes while using remotely (Windows XP remote desktop)
Fixed issue MR-306 - Fatal .NET exception on program start
Fixed issue MR-313 - PuTTY window not maximized when loading from saved session
mRemoteNG now requires .NET Framework 3.0 instead of 2.0.
Updated translations.
Added translations for Spanish (Argentina), Italian, Polish, Portuguese, Chinese (Simplified).
Improved the use of Tab and Shift-Tab to cycle through entries in the Config grid.
Improved loading of XML files from older versions of mRemote/mRemoteNG.
1.70 Beta 1 (2012-02-27):
Fixed issue MR-77 - VerifyDatabaseVersion (Config.Connections.Save) failed. Version string portion was too short or too long.
Fixed issue MR-78 - Renaming Connections
Fixed issue MR-79 - MoveUp/Down item doesn't work + Sort button broken
Fixed issue MR-93 - Regional settings problem when using SQL connection in mRemoteNG
Fixed issue MR-97 - Integrate Dutch translation
Fixed issue MR-98 - Integrate Russian and Ukranian translations
Fixed issue MR-99 - Integrate Spanish translation
Fixed issue MR-131 - RD Gateway does not respect setting for use different credentials
Added compatibility check for "Use FIPS compliant algorithms" security setting.
Improved reporting of errors when encrypting and decrypting connection files.
Added partial Polish translation.
The panel tabs are now hidden if only one panel is open.
Fix focus issue with RDP connections when changing tabs.
Show changes live as connection tabs are being dragged around to change their order.
Updated PuTTY to version 0.62.
Improved error handling when loading connection files.
Fixed bugs with creating a new connection file.
A backup of the connection file is saved when it is loaded. The most recent ten backup copies are kept.
Added the option to use a smart card for RD Gateway credentials.
Made the use of CredSSP for RDP connections optional.
Updated VncSharpNG to version 1.2.4440.36644.
Added debugging symbols for VncSharpNG.
1.69 (2011-12-09):
Fixed issue #66 - Fresh Install Fails to Create Config
Fixed issue #69 - Connection file gets erased
Fixed issue #72 - scrollbars added to RDP window after minimize/restore of mRemoteNG
Disabled automatic updates in the portable edition
Fixed file name in window title changing when exporting an XML file.
Fixed Use only Notifications panel checkbox.
Updated PuTTY to version 0.61
Binaries are now digitally signed
Added Credits, License, and Version History items to the Start Menu and made Start Menu item names localizable.
1.68 (2011-07-07):
Fixed issue #48 - VerifyDatabaseVersion fails with new (empty) database tables.
Fixed issue #60 - Can't save connections file
Fixed issue #62 - Connection file error upon launch.
1.67 (2011-06-05):
Fixed migration of external tools configuration and panel layout from Local to Roaming folder.
Disable ICA Hotkeys for Citrix connections. Fixes issue with international users.
Added a language selection option so users can override the language if they don't want it automatically detected.
Added partial French translation to the application.
Addded Thai translation to the installer.
Updated graphics in the installer to mRemoteNG logo.
Fixed RD Gateway default properties and RDP reconnection count setting not being saved.
Fixed bug 33 - IPv6 doesn't work in quick Connect box.
Moved the items under Tools in the Connections panel context menu up to the top level.
Added buttons for Add Connection, Add Folder, and Sort Ascending (A-Z) to the Connections panel toolbar.
Fixed rename edit control staying open when collapsing all folders.
Changed sorting to sort all subfolders below the selected folder.
Allow sorting of connections if a connection entry is selected.
Fixed adding a connection entry if nothing is selected in the tree.
Added 15-bit Color RDP setting.
Fixed loading of RDP Colors setting from SQL.
Added Font Smoothing and Desktop Composition RDP settings.
Improved error handling when loading XML connection files.
Added the mRemoteNG icon to the list of selectable icons for connection entries.
Added confirmation before closing connection tabs.
Fixed bug 42 - Maximized location not remembered with multiple monitors.
Improved loading and saving of window location.
Removed flickering on start up.
Changed the Options page into a normal dialog.
Improved Reset Layout function.
Changed to use full four part version numbers with major, minor, build, and revision.
Changed hard coded SQL database name into a user configurable setting.
Fixed tab order of controls in Options dialog.
Fixed bug 45 - Changing some settings in the config file may not save.
1.66 (2011-05-02):
Fixed connections not working
1.65 (2011-05-02):
Fixed Ctrl-Tab and Ctrl-Shift-Tab not working in any other applications while mRemoteNG is running
Ctrl-Tab and Ctrl-Shift-Tab no longer work to switch tabs within mRemoteNG
Fixed bug 36 - Install creates shortcuts only for the installing user
Fixed bug 38 - Application uses the wrong Application Data settings folder (in Local Settings)
Added code to the installer to check that the user is in the 'Power Users' or 'Administrators' group
1.64 (2011-04-27):
Fixed bug 6 - VNC CTRL+key & keyboard combo mappings are broken
Fixed bug 12 - Tab switch is not working in config panel
Fixed bug 14 - RDP Connection authentication problem
Fixed bug 22 - External App parameter macro expansion doesn't work with "try to integrate"
Fixed bug 25 - Unhandled exception when mRemoteNG opens
Added multilanguage support and German translation to the application
Added Czech, Dutch, French, German, Polish, and Spanish translations to the installer
Added Ctrl-Tab hotkey to switch to the next tab and Ctrl-Shift-Tab to switch to the previous tab
Added Tab key to cycle through entries in the Config grid and Shift-Tab to cycle in reverse
Added ability to configure external tools to run before or after a connection is established
Fixed missing parameters in macro expansion for external tools
Fixed RD Gateway and other inheritance bugs
Changed how new connection files are created
Changed the internal namespace of the application to mRemoteNG instead of mRemote
Added credit for the DockPanel Suite to the About page
Updated DockPanel Suite to version 2.5 RC1
Updated VNCSharpNG to correct Ctrl and Alt key pass-through behavior
1.63 (2010-02-02):
New icon and logo
Fixed problems moving or resizing the main window while PuTTY (SSH/telnet/rlogin/raw) connections are open
Fixed PuTTY processes not closing on Vista and 7 with UAC enabled
Updated DockPanel Suite from 2.2.0 to 2.3.1
Fixed error if the mouse is clicked outside of the remote screen area of a VNC connection
Fixed flashing and red lines at bottom of the window on first run
Added View->Reset Layout menu item
Added F11 shortcut key to View->Full Screen
Improved RDP error reporting
Added support for Credential Security Support Provider (CredSSP) which is required for Network Level Authentication (NLA)
Added support for connecting through Remote Desktop Gateway servers
Popups can now be allowed in Internet Explorer by holding Ctrl+Alt when clicking a link
Added PuTTY Settings item to tab context menu
1.62 (2010-01-19):
Switched to VncSharp, an open source VNC component
VNC is supported again except for the following features:
Windows authentication
Setting the compression, encoding and color settings
Connecting through a proxy server
Free SmartSize mode (it does the same thing as Aspect SmartSize mode now)
Rearranged the Options page and added an Updates tab
Added option to change how often updates are checked
Open Updates options tab before connecting for the first time
No longer show About page on first run
Renamed Quicky toolbar to Quick Connect toolbar
Changed back to allowing toolbars to dock to the left or right of the menu bar and added gripper to move it around
Added RDP, VNC and ICA version numbers to Components Check page
Fixed a bug with the inheritance buttons on the Config panel disappearing after awhile
1.61 (2010-01-14):
Removed unlicensed SmartCode Solutions ViewerX VNC Viewer ActiveX
This version of mRemoteNG does not support VNC
1.60 (2010-01-09):
Changed name to mRemoteNG
Fixed menu bar not staying docked to left side
Removed snakes game Easter egg
Removed references to visionapp Remote Desktop
Changed filename delimiter in title bar from pipe to dash
Changed default format for saving screenshot images to PNG
Changed website addresses
Added Report a Bug and Support Forum links to the Help menu
Moved Check for Updates to the Help menu
Changed website links in Help menu and About page to load within mRemoteNG instead of launching an external browser
1.50:
Added the following formats to the "Save Connections As" function:
mRemote CSV (standard CSV file with all properties)
vRD 2008 CSV (standard CSV file with properties relevant for importing connections in vRD 2008)
Fixed bug in inheritance code (SmartSize Mode and View Only properies were always shown when using VNC)
1.49:
mRemote and visionapp Remote Desktop 2008 merge!
Read more here: http://www.mremote.org/wiki/visionappMerge.ashx
or in the Announcement panel.
Added features to the update function
Added Announcement feature
Changed copyright notice in about screen and text when connecting via VNC
Fixed some SQL-related problems
V1.48:
ATTENTION! There is a bug in the automatic update code in 1.45 so you will have to download the new version manually from http://www.mremote.org/wiki/Downloads.ashx
Added startup components check with directions to fix component installation (also available in Tools - Components Check)
Added "Try to integrate" option to Ext. Apps. If enabled mRemote will try to integrate the app into a tab container like any other connection protocol.
Added Ext. App as protocol. Any Ext. App can be launched just like a normal connection.
Example (DameWare Mini Remote Control):
Create a new Ext. App with the following properties:
Display Name: DameWare
Filename: c:\PathToYourDameWareInstallDir\DWRCC.exe
Arguments: -c: -h: -m:%hostname% -u:%username% -p:"%password%" -d:%domain%
Options: Try to integrate
Create a new connection and select Ext. App as protocol
Then choose DameWare in the Ext. App field
If you have problems with a particular app that takes a long time to start up consider setting a higher PuTTY/Ext. Apps wait time in Tools - Options - Advanced
Added option to completely encrypt connection files (tools - options - advancecd)
Added Rendering Engine option for HTTP/S protocols
You can now use the Gecko (Firefox) rendering engine
For this to work you need to download xulrunner (get it here: ftp://ftp.mozilla.org/pub/xulrunner/releases/1.8.1.3/contrib/win32/)
It must be the 1.8.1.3 release, 1.9.0.0 does NOT work!
Extract the contents to a path of your choice and set the correct path in Tools - Options - Advanced - XULrunner path
The interface is tab enabled and usage is generally very firefox-like. So you can open new tabs with Ctrl+T, jump to the location bar with Ctrl+L and so on...
Added "MAC Address", "User Field" fields and %MacAddress%, %UserField% variables to use in Ext. Apps
Added descriptions for all fields in the config editor
Fixed bug in connections loading code when using SQL storage
Fixed bug in reconnect code
Fixed VNC sessions not refreshing screen automatically when switching between tabs or panels
WARNING! There have been changes to the connections file/SQL tables
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
To get SQL working with the new version please update your tables like in the provided script (Info - Help - SQL Configuration)
These are the added lines:
[RenderingEngine] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[MacAddress] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[UserField] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[ExtApp] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[InheritRenderingEngine] [bit] NOT NULL ,
[InheritMacAddress] [bit] NOT NULL ,
[InheritUserField] [bit] NOT NULL ,
[InheritExtApp] [bit] NOT NULL ,
V1.45:
New german language build available
Added support for RDP 6.1 (XP SP3/Vista SP1) features (Server Authentication, Console Session, TS Gateway not yet...)
Added basic support for UltraVNC SingleClick (Tools - UltraVNC SingleClick); the listening port is configurable in the options
Fixed VNC connections not working on x64
Fixed screenshots save all feature overwriting files with the same name (not actually a bug, but rather a new feature ;)
Fixed ICA Encryption Strength not inheriting properly
WARNING! There have been changes to the connections file/SQL tables
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
To get SQL working with the new version please update your tables like in the provided script (Info - Help - SQL Configuration)
These are the added lines:
[RDPAuthenticationLevel] [varchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[InheritRDPAuthenticationLevel] [bit] NOT NULL ,
V1.43:
Added function to send either the main form or a connection panel to another screen
To send the form to another screen, right click the titlebar or the taskbar button and select "Send to..."
If you want to send a panel to another screen, right click the panel's tab and do the same
Fixed PuTTY connections not supporting credentials with spaces
Fixed form not opening on last position when using multiple screens
Fixed kiosk mode not working on secondary screen
V1.42:
IMPORTANT NEWS: Please read the page that opens when you first start this release or go to:
http://www.mRemote.org/wiki/MainPage.ashx#Commercial
Added minimize to tray option
Added option to enable switching to open connections with a single click on the corresponding connection in the tree
Added button to test proxy settings
Fixed: If the active connection tab is a PuTTY connection, Alt+Tab to mRemote now focuses the PuTTY window
Fixed encoding problem with PuTTY sessions that included spaces
Fixed problem that made mRemote inaccesible when closing it on a second monitor and then disabling this monitor
Fixed: Inheritance defaults of some new VNC properties were not saved in the portable package
V1.41:
Added complete support for SmartCode's ViewerX and removed VncSharp
Many thx to everyone who donated to make this happen!!! I didn't think that it wouldn't even take a week! =)
I hope everyone will be satisfied by the functions and possibilities this new control provides
If you use one of the non-setup packages you must register the control yourself
Open a cmd and change to the directory you installed mRemote to
Type regsvr32 scvncctrl.dll and click ok
Changed shortcuts and added buttons for them to the view menu under "Jump To" because they were causing several problems
WARNING! There have been changes to the connections file/SQL tables and the Ext. Apps XML file
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
To get SQL working with the new version please update your tables like in the provided script (Info - Help - SQL Configuration)
V1.40:
Added (limited) support for the trial version of SmartCode's VNC ActiveX
To enable it go to Options - Advanced and check "Try SmartCode VNC ActiveX"
When connecting a pop up will open, wait about 10 seconds, then click on "Trial" to continue
I will integrate this control fully into mRemote if I get enough Donations to buy the single developer license ($375,-)
So if you want to see better VNC support (All UltraVNC, TightVNC and RealVNC functions) in mRemote, please help me and donate some bucks
For donations either go to the mRemote Wiki (Info - Website) or click on Info - Donate to directly go to PayPal
I will announce the current donation amount every day (or as often as I can) on the Wiki main page
If you want to know more about the control go here: http://www.s-code.com/products/viewerx/
Added feature to choose the panel a connection will open in when...
a. no panel name was assigned in the properties
b. you opened a connection with the option to choose the panel before connecting
c. you checked "Always show panel selection dialog when opening connectins" in Options - Tabs & Panels
Added Shortcuts to focus the standard panels
Alt+C: Switch between Connections & Config panel
Alt+S: Switch between Sessions & Screenshots panel
Alt+E: Switch to Errors & Infos panel
Added some new icons
V1.39:
Added MagicLibrary.dll to the release again (forgot it in the 1.38 packages, sorry)
Added auto-reconnect for ICA
Added feature that automatically clears whitespaces in the Quicky Textfield
Added special feature: Go to the set password dialog and type "ijustwannaplay" (without the quotes) in the password field... ;)
V1.38:
Added automatic reconnect feature for RDP (Options - Advanced)
Added connections drop-down to the quicky toolbar (same as the tray icon menu)
Added setting in the options to enable/disable that double clicking on a connection tab closes it
Added option to automatically set the hostname like the display name when creating new connections
Fixed bug that caused the properties of a folder to be filled with "Object reference not set to an instance of an object." when adding a folder to the root with Default Inheritance enabled
Fixed bug that made the properties of a newly added Connection to the root unavailable when Default Inheritance was enabled
Fixed bug that the default settings for Pre/Post Ext. App, and their inheritance settings were not being saved
Fixed bug in settings loading methods that caused the application to hang when an error occured
Fixed bug in Ext. Apps panel that copied the properties of the previously selected Ext. App when "Wait for exit" was checked
Fixed bug in the SQL Query that creates the tables needed by mRemote
Attempt to fix the "Drop-Down on Screenshot" bug on some machines
V1.35:
Added single instance mode (look in Options - Startup/Exit) - No cmd arguments supported yet!
Added possibilty to start a Ext. App before connecting and on disconnect (e.g. for VPN/RAS)
Added option to the Ext. Apps to tell mRemote to wait for the exit of the Ext. App
Added encryption setting for ICA
WARNING! There have been changes to the connections file/SQL tables and the Ext. Apps XML file
Please always backup your whole config before updating to a new mRemote beta release, especially when there have been changes to the config files/SQL tables
Here's a list of new columns that need to be created before saving connections to an SQL server:
Name: ICAEncryptionStrength, Data-Type: varchar, Length: 64, Allow Nulls: No
Name: InheritICAEncryptionStrength, Data-Type: bit, Length: 1, Allow Nulls: No
Name: PreExtApp, Date-Type: varchar, Length: 512, Allow Nulls: Yes
Name: PostExtApp, Date-Type: varchar, Length: 512, Allow Nulls: Yes
Name: InheritPreExtApp, Date-Type: bit, Length: 1, Allow Nulls: No
Name: InheritPostExtApp, Date-Type: bit, Length: 1, Allow Nulls: No
V1.33:
Fixed problem that caused RDP connections not to initialize properly when using XP SP3
Fixed bug in Port Scan that prevented hosts with no hostname from being imported
V1.32:
Added: Inheritance defaults can now be customized (look in the root properties of your connections tree)
Fixed bug that made password-secured connection files not load properly because the return value from the password screen was always null
Fixed a lot of outdated code in the import functions (Import from XML, Import from AD, Import from RDP files)
Fixed bug that caused properties with a ' character not to be saved properly when using SQL Server
Changed Target CPU to AnyCPU again as I think the x86 setting caused problems on x64 machines (although it shouldn't)
V1.31:
Small speed improvement to the port scanner
Fixed bug that caused SQL live-update to not work when not using AD Authentication
Fixed bug that caused Save As not to work
V1.30:
Added experimental SQL Server with live-update (multi-user) support (see Help - Getting started - SQL Configuration)
Added bunch of new icons to the UI, most of them by famfamfam.com
Added dropdown button to Quicky Toolbar to choose protocol
Many smaller changes and additions
Fixed: Wrong default PuTTY session name
Fixed bug in Port Scanner that caused an error when no DNS name could be resolved
V1.25:
Added inheritance for folders
Added port scan feature and possibility to import from a scan
Added toolbar for Ext. Apps (see View - External Applications Toolbar)
Added quick connect as toolbar
Added code that creates a backup of the current connections file every time it is loaded (It's named YourConsFile.xml_BAK)
Added description variable to Ext. Apps
Fixed bug that allowed inheriting from root node
Fixed bug that caused Ext. Apps launched from a connection tab to use the selected tree node instead of the current tab
Fixed bug that caused mRemote not to save panel layout and Ext. Apps on exit
V1.24:
Fixed a bug in connections loading mechanism that caused a corrupted connections file when upgrading from a previous version
V1.23:
Added feature to remember which connections were opened on last runtime and reconnect to them on the next start (see Tools - Options - Startup/Exit)
A command line switch is also available to cancel reconnecting (/noreconnect or /norc)
Added Auto Save feature (Tools - Options - Connections - Auto Save every...)
Added Ext. Apps to connection tab context menu
Added better error handling for RDP connection creation
Fixed problem with Sessions feature on 64bit systems
Fixed Sessions feature not working when using global credentials
Fixed several problems with the Active Directory OU picker control
Fixed bug in Connection duplicate code that caused duplicated connection to still have previous tree node assigned
V1.20:
Added External Applications feature (check the help section for more info)
Added duplicate feature to Connections tree
Fixed: MagicLibrary.dll was not included in the setup package
V1.16:
New Domain: www.mRemote.org
Fixed PuTTY connections appearing in a new window
There's a new setting in the options to fine tune the time to wait until the window has been created
Fixed export not working
Added reconnect feature in tab menu
V1.15:
Added: New portable package
Added: Defaults for new connections can now be customized
Click the root item and then the new Properties-like button with a small yellow star to get to the settings
Fixed Import from Active Directory not working
Fixed problem with single click connect not focusing correctly
Fixed root node not being renamed after changing name in property grid
V1.10:
Added support for setting a password to protect the connections file with (look in the root of your connections tree)
Added RDP file import feature
Added new command-line switch to reset panel's positions
Added HTTPS as protocol
Added HTTP/S basic authentication
Added support for setting a Proxy server for automatic updates
Some changes in help section
Fixed the bug that passwords stored in the options weren't decrypted when a connection was opened
Fixed "bug" that prevented "Connect to console session" from working in RDC6.1 (Vista SP1 RC1/XP SP3 RC1)
V1.00:
Merry Christmas! =)
V1.00 is a (almost) complete rewrite of the whole application
The code base is now much cleaner and more (easily) extendable
New features include (but are not limited to):
Every part of the application is now integrated into panels which can be moved, docked and undocked, hidden, moved to another monitor, etc.
This makes many new and exciting ways to manage connection and application windows possible
You can for example open up 4 PuTTY sessions in 4 different panels and align them in the main application so you can use all 4 side by side - 2 on the upper side and 2 on the bottom for example
This can be done for EVERY part of the application, it's completely modular and customizable
Connection and folder (previously called containers) properties have moved to a new property grid control
Every setting (with the exclusion of the hostname, which wouldn't make any sense) can now be inherited from the parent folder
Connection file saving/loading is now handled a bit different (more in the help section)
Application restart is no longer nececary after changing options, they are active with a click of the OK button
Smart size can now be activated also if a connection is already open (in the right click menu of the active tab)
A panel name can be stored with every connection (or folder, if inherting) to always open the connection in the specified panel
And last but not least, many bugs have been fixed, though there are probably many new bugs aswell - Did I already mention this is a rewrite? ;)
I hope you like my work and if you do please consider donating on the mRemote website to support me a little. Any amount will do! Thx!
V0.50:
Removed old Terminal (SSH, Telnet) control and embedded PuTTY instead
This decision brings mostly good but also some bad news
The good news is that now everything that works in putty also works in mRemote
This means X11 forwarding, SSH port forwarding, session logging, appearance customization, etc. should be working fine now
It also brings some new protocols (Rlogin, RAW)
The bad news is that I cannot fully integrate Putty into mRemote because it is a standalone application and thus has it's own window handle
This means that you won't be able to use Ctrl+Tab to switch between tabs, catching errors or infos through the new Errors and Infos tab isn't possible, etc.
Added possibility to change resolution or display mode (Fit to window, Fullscreen, Smart size)
Added new setting in options to show logon info on tab titles
Added new feature that catches popup dialogs and puts them in a managed interface. This is another step to make mRemote a single window application.
Pressing escape switches back to the connection list
There is a context menu that allows you to copy selected errors/warnings/infos to the clipboard (text only) or to delete them
There also are settings in the option to change when to switch to the tab and to switch back to the normal behaviour of displaying message popups
Added QuickConnect history and auto-complete functions
Added a few new Icons (Linux, Windows, ESX, Log, Finance)
Improved options tab
Connections file version is now 1.2
Fixed some form drawing bugs
V0.35:
Added tab switching/closing hotkeys
Switch to next tab: Ctrl+Tab
Switch to previous tab: Ctrl+Shift+Tab
Close active tab: Ctrl+W
This does not and will probably never work with RDP connections!
Fixed bug in updating code that still displayed the current version in the old format (x.x.x.x instead of x.xx)
Fixed bug where the colors setting was not correctly read after saving and reloading a connections file (only with 256 colors setting)
Fixed bug that made connect to console session and fullscreen options not work
Fixed bug that when opening options, update or about tab caused weird paddings next to the tab or other strange behaviour
Changed shortcuts to menu items in main menu as they interfered with some terminal key bindings
V0.30:
Added HTTP as protocol to allow for basic web-based administration
Added new connections menu to the toolbar
Left click on a connection connects
Right click on a container or connection opens the config tab for the selected item
Added two new connection context menu entries for quickly connecting to console session or connecting in fullscreen
Improved tray icon menu (just like the main connections menu)
The connections tree can now be hidden
To hide it right click on the splitter (the divider between the connections tree and the tabbing interface)
Removed overlay (RDP locking) feature in favor of simply grabbing input when clicking inside the control area
I hope nobody is too sad that the nice looking overlay feature had to go, but..., well, it had to! ;-)
Changed "Redirect Key combinations (like in fullscreen)" to be disabled when in kiosk mode as it has no effect then anyway
Several small bugfixes and code improvements
V0.20:
Added Drag and Drop support for tabs
Added tab context menu
Switch to/from fullscreen
Take a screenshot
Transfer files via SCP/SFTP (SSH)
Send special keys (VNC)
Rename tabs
Duplicate tabs (Create another instance of the connection)
Show config
Close tab (disconnect)
Removed Fullscreen and Send special keys buttons from the main toolbar as they are now in the tab context menu
Added middle click support for tabs (close/disconnect)
Added SSH file transfer (SCP/SFTP) support
Added Tools menu to the tree context menu
Transfer files via SCP/SFTP (SSH)
Import/Export features
Sorting
Changed version format
Fixed the problem that caused mRemote to crash when dragging a parent node of the connections tree onto one of it's child nodes
Fixed problem in importing mechanism that allowed importing connections including the root which resulted in multiple root items that couldn't be deleted
Fixed problem with quick connect
V0.0.9.0:
Added support for redirecting key combinations (Alt+Tab, Winkey, ...)
Added Import/Export features
Added Quick Connect Port support, just type the host you want to connect to followed by a ":" and then the port
Added Connect/Disconnect buttons to connections context menu
Added two new icons (Test Server | TST; Build Server | BS)
Many changes to the connections loading/saving mechanisms
confCons version is now 1.0
Some code cleanup
Fixed auto session info to only try to get session information when a RDP connection is selected
Fixed AD Import feature (didn't care if imported items were computers, groups, users, ... ;)
Fixed settings and connections not saving when installing updates from the auto-updater
Fixed form size and location not saving properly when closing the application in minimized state or in maximized state on a secondary monitor
V0.0.8.2:
Added SSH1 to Quick Connect GUI
Changed buffer size of terminal control, it's now 500 lines
Fixed terminal connections not getting focus when changing tabs
Fixed bug in terminal code that caused hitting "home" to show "~" instead of jumping to the start of the line
Fixed bug that caused that hitting enter in mRemote wouldn't do anything when options was opened before
V0.0.8.0:
Added code to check if the msrdp com control is registered
Many Improvements to the terminal control (ssh1(!), ssh2, telnet)
Fixed bug that caused mRemote to crash when moving connection into root node (only with inheritance enabled)
Fixed bug: Pressing delete when editing a node's name caused delete messagebox to show
V0.0.7.5:
Added inheritance feature to inherit connection settings from parent container
Expanded/Collapsed state of tree nodes will now be saved
Reduced auto session info delay to 700ms
Some code maintainance
Some corrections to connections tree and quick search behaviour
Fixed bug in TerminalControl that caused the error message "error loading string"
Fixed: Settings saving on exit was broken in V0.0.7.0, this is fixed now
Changed connections file version to 0.9
Fixed connections context menu bug that made import from ad option inaccessible
Fixed session info filling up with infos about hosts previously selected
V0.0.7.0:
Massive GUI redesign and changes, hope you like it! =)
Fixed bug that made session info to query immediately after selecting a connection (when enabled), there is now a one second delay to prevent collecting session info for more than one host
V0.0.6.8:
Added connection import feature for Active Directory
Tidied up project references
Multiple changes to setup routine
Improved error handling for auto-update
Improved download handling for auto-update
Fixed bug that made download finished/failed message box appear multiple times when update was canceled and re-downloaded
Fixed bug where double-clicking a container opened all connections inside this container
V0.0.6.6:
Changed port textbox control to only allow digits
Small changes to connection code for SSH
Fixed port setting not saving (or always displaying default port for selected protocol)
V0.0.6.5:
Added auto update feature
Changed: Multiple UI Changes (added shortcuts, rearranged menu items, ...)
Fixed the problem where the connections file version was saved either with a dot or a comma, depending on system language
Fixed not being able to connect to SSH2 hosts without specifying username and password
Fixed several problems with Quick Connect
Improved saving of config changes
Fixed connections tab not closing when using SSH
V0.0.6.0:
Added new protocols: SSH2 and Telnet
Added first command line switch/parameter "/consfile"
Ex.: mRemote.exe /consfile "%PathToYourConnectionsFile%"
Added button to screenshots to delete a screenshot
Added Host Status (Ping) feature
Many code rewrites and changes in almost every area
Changed the way connections get loaded
The default path for the connection file is no longer in the application directory but in the local application data folder.
Ex.: c:\Documents and Settings\felix\Local Settings\Application Data\Felix_Deimel\mRemote\
If opening a connection file from a custom location (click on open link) saving will also occur in this file and not like in previous versions to the default connections file
To import your old connection file please use the following procedure: start mRemote, click on "Open" and find your old connection file. Then click on "Save As" and save it with the default file name to the default location
Changed the font and style of context menus
Changed Quick Connect UI
Fixed connection settings in config tab not saving when clicking another connection before jumping to another config field
Fixed a bug where renaming a container caused the first connection in the same container to be renamed too
V0.0.5.0 R2:
Fixed a bug that prevented connections from opening when icon files were assigned in a previous version of mRemote
V0.0.5.0:
Added (Global) fullscreen / kiosk feature
Added redirection settings for disk drives, printers, ports, smart cards and sound
Added option to write a log file
Added option to open new tabs on the right side of the currently selected tab
Added possibility to connect to all nodes in a container
Changed session functions to work in background
Changed icon choosing mechanism and added a bunch of default icons
Changed: Containers with connection can now be deleted just like empty containers
Changed screenshot functions to now collect all screenshots in one tab
Changed: More settings can now be changed on container basis
Changed config file version to 0.6
Changed: Small internal changes to the connection saving/creating and opening mechanisms
Fixed "Display Wallpapers" and "Display Themes" settings, they are working now
V0.0.3.6:
Added Feature to display an overlay when RDP connection tab has lost the focus, clicking on this gives the focus back to the control
Added standard handlers for F2 (rename) and DEL (delete) keys in the treeview
Added icon preview for connections in config tab
Changed the way new connections and containers are being created in the treeview. The pop up window will not be displayed any longer, instead everything is handled inplace by the treeview.
Changed some minor UI related stuff
Fixed bug in tab closing mechanism that caused icons (play/pause) to not be set on the correct tree nodes
V0.0.3.5:
Added Feature to query and log off sessions on a remote machine and option to do this automatically
Added Option to show icon in system tray with connection menu
Changed controls to flat style as I think this fits the whole application more than the old 3D look
Multiple UI changes to eliminate annoying behaviour
V0.0.3.3:
Added Feature to specify which login information to use when no info is provided in the config of a remote machine
Fixed bug in Quick Find where trying to open a connection when no node was found caused an error
Fixed bug where the main form was not rendered correctly when hiding top bar and using XP Themes
Fixed bug in drag-drop routine that caused application to hang when trying to drop a node on one of it's child nodes
Fixed bug where taskbar buttons for fullscreen rdp windows did not disappear after disconnecting
V0.0.3.2:
Added new Save As Dialog with feature to only save specific connection settings
Added Option to display Tooltips when hovering over host entries in the connection tree
Added Option to ask at exit when there are open connections
Fixed bug where saving connections file with spaces in the root node caused an error -> updated Connection File Version to 0.5
Fixed bug in options tab where the browse button for a custom connection file didn't do anything
V0.0.3.0:
Added Options Tab
Load connections file from different location
Save/Don't Save connections file on exit
Show current tab name in window title
Added drag and drop functionality to the connections tree
Added feature to hide top bar
Added feature to send special keys (VNC)
Updated VncSharp Library to V0.88 (still pretty buggy)
V0.0.2.7:
Added feature to save connection settings to all connections in the selected container
Icon choosing bug fixed
Taskbar button had no text when in fullscreen - fixed
Fixed bug in Quick Connect GUI
Disabled "Display Wallpaper" and "Display Themes" checkboxes as these features are not implemented
V0.0.2.5:
Quick connect button bug fixed
Search field resize bug fixed
Splitter position is now saved on exit
Added new connections toolstrip (same functions as context menu)
V0.0.2.4:
Changed default color depth to 16bit
Added Keep Alive Interval (1 Minute)
Added Options to choose between RDP & VNC
Added Port Setting for RDP
Added Option to connect to console
Added Menu Entries to move Connections & Containers up & down
Some small code improvements

1717
CHANGELOG.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -278,62 +278,3 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@@ -1,127 +0,0 @@
Contributors
============
Jason Barbier
Wiktor Beryt
Lionel Caignec
Ruben d'Arco
Felix Deimel
Holger Henke
Tom Hiller
Riley McArdle
Apisitt Rattana
Andreas Rehm
David Vidmar
Translators
===========
Eugenio "Ryo567" Mart<72>nez
Mathieu Pape
Emanuel Silva
Robert Siwiec
Included Source Code
====================
Command Line Arguments Parser 1.0
Copyright <20> 2002 Richard Lopes
MIT License
http://www.codeproject.com/KB/recipes/command_line.aspx
DotNetVer
Copyright <20> 2010 David Grinberg
Copyright <20> 2010-2011 Brandon Hansen
http://nsis.sourceforge.net/DotNetVer
Hotkey Selection Control for .NET
Copyright <20> 2006 Thomas Backman
http://www.codeproject.com/Articles/15085/A-simple-hotkey-selection-control-for-NET
Included Components
===================
ADTree 1.0
Copyright <20> 2004 Marc Merritt
Copyright <20> 2008 Felix Deimel
http://www.codeproject.com/KB/selection/ADPickerCtrl.aspx
DiffieHellman 1.0
Copyright <20> 2003 The Mentalis.org Team
Modified New BSD License
http://www.mentalis.org/
DockPanel Suite 2.3.1
Copyright <20> 2007 Weifen Luo
MIT License
http://sourceforge.net/projects/dockpanelsuite/
Emergent OnLine WTSCOM 2.0.6.0
Copyright <20> 2001-2003 Emergent OnLine
http://www.go-eol.com/
FilteredPropertyGrid 1.0.0.0
Copyright <20> 2006 Azuria
http://www.codeproject.com/KB/cs/FilteredPropertyGrid.aspx
GeckoFX 1.8.1.4
Copyright <20> 2008 Skybound Software
Mozilla Public License 1.1
http://www.geckofx.org/
IPTextBox 1.1
Copyright <20> 2006 Matthew Kleinwaks
Copyright <20> 2008 Felix Deimel
http://www.vbforums.com/showthread.php?t=430169
log4net 1.2.10.0
Copyright <20> 2001-2006 The Apache Software Foundation
Apache License Version 2.0
http://logging.apache.org/log4net/
Magic Library 1.7.4
Copyright <20> 2002-2003 Crownwood Consulting, Ltd.
Freely redistributable with attribution
http://www.dotnetmagic.com/magic_download.html
Mentalis.org Security Library 1.0.13.715
Copyright <20> 2002-2005 The Mentalis.org Team
Modified New BSD License
http://www.mentalis.org/
MiniGeckoBrowser 1.0
Copyright <20> 2008 Felix Deimel
http://www.appjuice.org/
MiniTabControl 1.0
Copyright <20> 2008 Felix Deimel
http://www.appjuice.org/
PuTTY 0.62
Copyright <20> 1997-2011 Simon Tatham
MIT License
http://www.chiark.greenend.org.uk/~sgtatham/putty/
SharpSSH 1.1.1.13
Copyright <20> 2002-2008 Atsuhiko Yamanaka, JCraft, Inc.
Copyright <20> 2007 Tamir Gal
BSD Style License
http://www.tamirgal.com/blog/page/SharpSSH.aspx
Silk Icon Set
Copyright <20> 2005-2008 FAMFAMFAM
Creative Commons Attribution 2.5 License
http://www.famfamfam.com/
Vista TaskDialog Wrapper and Emulator 1.0
Copyright <20> 2007-2009 Hedley Muscroft
Code Project Open License (CPOL)
http://www.codeproject.com/KB/vista/Vista_TaskDialog_Wrapper.aspx
VncSharp 1.0
Copyright <20> 2004-2009 David Humphrey
GNU General Public License (GPL) Version 2
http://cdot.senecac.on.ca/projects/vncsharp/

127
CREDITS.md Normal file
View File

@@ -0,0 +1,127 @@
# Contributors
## Current mRemoteNG dev team
[David Sparer](http://github.com/sparerd)
[Sean Kaim](http://github.com/kmscode)
[Faryan Rezagholi](http://github.com/farosch)
[Bennett Blodinger](http://github.com/benwa)
[Joe Cefoli](http://github.com/jcefoli)
[countchappy](http://github.com/countchappy)
Tony Lambert
[Julien Roncaglia](http://github.com/vbfox)
[peterchenadded](http://github.com/peterchenadded)
[Brandon Wulf](http://github.com/mrwulf)
[Pedro Rodrigues](http://github.com/pedro2555)
[dekelMP](http://github.com/dekelMP)
[Bruce](http://github.com/brucetp)
[Camilo Alvarez](http://github.com/jotatsu)
[DamianBis](http://github.com/DamianBis)
[pfjason](http://github.com/pfjason)
[sirLoaf](http://github.com/sirLoaf)
[Fyers](http://github.com/Fyers)
[Vladimir Semenov](http://github.com/sli-pro)
[Stephan](http://github.com/st-schuler)
[Aleksey Reytsman](http://github.com/areytsman)
[Cristian Abelleira](http://github.com/CrAbelleira)
[MitchellBot](http://github.com/MitchellBot)
[Filippo Ferrazini](http://github.com/Filippo125)
## Past Contributors
Felix Deimel - mRemote original developer
Riley McArdle - mRemoteNG original developer
[Hayato Iriumi](http://github.com/hiriumi)
Jason Barbier
Wiktor Beryt
Lionel Caignec
Ruben d'Arco
Holger Henke
Tom Hiller
Apisitt Rattana
Andreas Rehm
David Vidmar
[Brandhor](http://github.com/Brandhor)
[Dimitrij](http://github.com/Kvarkas)
## Translators
Eugenio "Ryo567" Martínez
Mathieu Pape
Emanuel Silva
Robert Siwiec
Hayato Iriumi
[Sebastien Thieury](http://github.com/SebThieu)
Riza Emet
[Lukas Plachy](http://github.com/rheingold)
Gyuha Shin
[Stefan](http://github.com/polluks)
[emazv72](http://github.com/emazv72)
[Vladimir Semenov](http://github.com/sli-pro)
[Marco Sousa](http://github.com/marcomsousa)
[wwj402](http://github.com/wwj402)
[Fyers](http://github.com/Fyers)
[pablomh](http://github.com/pablomh)
[Damian Szczepanik](http://github.com/damianszczepanik)
[Mant1kor](http://github.com/Mant1kor)
# Included Source Code
**[Command Line Arguments Parser](http://www.codeproject.com/KB/recipes/command_line.aspx)**
Copyright © 2002 Richard Lopes
MIT License
**[FilteredPropertyGrid](http://www.codeproject.com/KB/cs/FilteredPropertyGrid.aspx)**
Copyright © 2006 Azuria
**[InputBox](http://www.csharp-examples.net/inputbox/)**
Copyright © 2016 Jan Slama
**[IP TextBox](http://www.codeproject.com/Articles/11576/IP-TextBox)**
Copyright © 2005 mawnkay
**[PortableSettingsProvider](https://github.com/crdx/PortableSettingsProvider)**
Copyright © 2014 crdx
**[ADTree](http://www.codeproject.com/KB/selection/ADPickerCtrl.aspx)**
Copyright © 2004 Marc Merritt © 2008 Felix Deimel
# Included Components
**[CefSharp](https://github.com/cefsharp/CefSharp)**
Copyright © The CefSharp Authors
MIT License
**[DockPanel Suite](https://github.com/dockpanelsuite/dockpanelsuite)**
Copyright © 2018 @roken and @lextm (formerly Weifen Luo)
MIT License
**[log4net](http://logging.apache.org/log4net/)**
Copyright © 2001-2015 The Apache Software Foundation
Apache License Version 2.0
**[PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/)**
Copyright © 1997-2017 Simon Tatham
MIT License
**[Silk Icon Set](http://www.famfamfam.com/)**
Copyright © 2005-2008 FAMFAMFAM
Creative Commons Attribution 2.5 License
**[SSH.NET](https://github.com/sshnet/SSH.NET)**
Copyright © 2016
MIT License
**[VncSharp](https://github.com/humphd/VncSharp) (Archived)**
Copyright © 2004-2009 David Humphrey
GNU General Public License (GPL) Version 2
**[ObjectListView](https://sourceforge.net/projects/objectlistview/)**
Copyright © 2006-2016 Phillip Piper
GNU General Public License (GPL) Version 3
**[ConsoleControl](https://github.com/dwmkerr/consolecontrol)**
Copyright © 2015 Dave Kerr
MIT License

104
Directory.Packages.props Normal file
View File

@@ -0,0 +1,104 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
<NoWarn>$(NoWarn);NU1507</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="AWSSDK.Core" Version="4.0.0.32" />
<PackageVersion Include="AWSSDK.EC2" Version="4.0.40.4" />
<PackageVersion Include="BouncyCastle.Cryptography" Version="2.6.2" />
<PackageVersion Include="Castle.Core" Version="5.2.1" />
<PackageVersion Include="ConsoleControl" Version="1.3.0" />
<PackageVersion Include="ConsoleControlAPI" Version="1.3.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="Cucumber.Messages" Version="30.0.0" />
<PackageVersion Include="DockPanelSuite" Version="3.1.1" />
<PackageVersion Include="DockPanelSuite.ThemeVS2015" Version="3.1.1" />
<PackageVersion Include="envdte" Version="17.14.40260" />
<PackageVersion Include="Gherkin" Version="35.1.0" />
<PackageVersion Include="Google.Protobuf" Version="3.32.1" />
<PackageVersion Include="LiteDB" Version="5.0.21" />
<PackageVersion Include="log4net" Version="3.2.0" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.1" />
<PackageVersion Include="Microsoft.Data.SqlClient.SNI" Version="6.0.2" />
<PackageVersion Include="Microsoft.Data.SqlClient.SNI.runtime" Version="6.0.2" />
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.9" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
<PackageVersion Include="Microsoft.NETCore.Platforms" Version="7.0.4" />
<PackageVersion Include="Microsoft.NETCore.Targets" Version="5.0.0" />
<PackageVersion Include="Microsoft.VisualStudio.TextTemplating.VSHost" Version="17.14.40265" />
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3537.50" />
<PackageVersion Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" />
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
<PackageVersion Include="MySql.Data" Version="9.4.0" />
<PackageVersion Include="NETStandard.Library" Version="2.0.3" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="Newtonsoft.Json.Schema" Version="4.0.1" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="NUnit" Version="4.4.0" />
<PackageVersion Include="NUnit.Console" Version="3.20.1" />
<PackageVersion Include="NUnit.ConsoleRunner" Version="3.20.1" />
<PackageVersion Include="NUnit.Extension.TeamCityEventListener" Version="1.0.10" />
<PackageVersion Include="NUnit.Runners" Version="3.12.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="5.2.0" />
<PackageVersion Include="OpenCover" Version="4.7.1221" />
<PackageVersion Include="Renci.SshNet.Async" Version="1.4.0" />
<PackageVersion Include="ReportGenerator" Version="5.4.17" />
<PackageVersion Include="runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.native.System" Version="4.3.1" />
<PackageVersion Include="runtime.native.System.IO.Compression" Version="4.3.2" />
<PackageVersion Include="runtime.native.System.Net.Http" Version="4.3.1" />
<PackageVersion Include="runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="SSH.NET" Version="2025.0.0" />
<PackageVersion Include="System.Buffers" Version="4.6.1" />
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="9.0.9" />
<PackageVersion Include="System.Collections.Immutable" Version="9.0.9" />
<PackageVersion Include="System.Console" Version="4.3.1" />
<PackageVersion Include="System.Data.Common" Version="4.3.0" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="9.0.9" />
<PackageVersion Include="System.Drawing.Common" Version="9.0.9" />
<PackageVersion Include="System.Diagnostics.EventLog" Version="9.0.9" />
<PackageVersion Include="System.DirectoryServices" Version="9.0.9" />
<PackageVersion Include="System.Dynamic.Runtime" Version="4.3.0" />
<PackageVersion Include="System.IO.Pipelines" Version="9.0.9" />
<PackageVersion Include="System.Formats.Asn1" Version="9.0.9" />
<PackageVersion Include="System.Management" Version="9.0.9" />
<PackageVersion Include="System.Memory" Version="4.6.3" />
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
<PackageVersion Include="System.Net.Primitives" Version="4.3.1" />
<PackageVersion Include="System.Net.Sockets" Version="4.3.0" />
<PackageVersion Include="System.Reflection.Emit" Version="4.7.0" />
<PackageVersion Include="System.Reflection.Emit.ILGeneration" Version="4.7.0" />
<PackageVersion Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
<PackageVersion Include="System.Reflection.Metadata" Version="9.0.9" />
<PackageVersion Include="System.Reflection.TypeExtensions" Version="4.7.0" />
<PackageVersion Include="System.Resources.ResourceManager" Version="4.3.0" />
<PackageVersion Include="System.Runtime" Version="4.3.1" />
<PackageVersion Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
<PackageVersion Include="System.Runtime.Extensions" Version="4.3.1" />
<PackageVersion Include="System.Security.AccessControl" Version="6.0.1" />
<PackageVersion Include="System.Security.Cryptography.Algorithms" Version="4.3.1" />
<PackageVersion Include="System.Security.Cryptography.Cng" Version="5.0.0" />
<PackageVersion Include="System.Security.Cryptography.OpenSsl" Version="5.0.0" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="9.0.9" />
<PackageVersion Include="System.Security.Cryptography.X509Certificates" Version="4.3.2" />
<PackageVersion Include="System.Security.Permissions" Version="9.0.9" />
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.9" />
<PackageVersion Include="System.Text.Json" Version="9.0.9" />
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.6.3" />
<PackageVersion Include="System.ValueTuple" Version="4.6.1" />
<PackageVersion Include="System.Windows.Extensions" Version="9.0.9" />
<PackageVersion Include="System.Xml.ReaderWriter" Version="4.3.1" />
<PackageVersion Include="VncSharpCore" Version="1.2.1" />
<PackageVersion Include="ZstdSharp.Port" Version="0.8.6" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,180 @@
namespace ExternalConnectors.AWS
{
partial class AWSConnectionForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tbAccesKeyID = new System.Windows.Forms.TextBox();
this.tbAccesKey = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// tbAccesKeyID
//
this.tbAccesKeyID.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbAccesKeyID.Location = new System.Drawing.Point(152, 4);
this.tbAccesKeyID.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tbAccesKeyID.Name = "tbAccesKeyID";
this.tbAccesKeyID.Size = new System.Drawing.Size(490, 23);
this.tbAccesKeyID.TabIndex = 0;
//
// tbAccesKey
//
this.tbAccesKey.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbAccesKey.Location = new System.Drawing.Point(152, 43);
this.tbAccesKey.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tbAccesKey.Name = "tbAccesKey";
this.tbAccesKey.Size = new System.Drawing.Size(490, 23);
this.tbAccesKey.TabIndex = 2;
//
// btnOK
//
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(219, 12);
this.btnOK.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(88, 26);
this.btnOK.TabIndex = 10;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(338, 12);
this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(88, 26);
this.btnCancel.TabIndex = 11;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 22.92994F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 77.07006F));
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tbAccesKeyID, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tbAccesKey, 1, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 3;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(646, 102);
this.tableLayoutPanel1.TabIndex = 12;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(4, 0);
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(140, 39);
this.label1.TabIndex = 2;
this.label1.Text = "Access Key ID";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(4, 39);
this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(140, 39);
this.label2.TabIndex = 4;
this.label2.Text = "Access Key";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 5;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 112);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(646, 50);
this.tableLayoutPanel2.TabIndex = 13;
//
// AWSConnectionForm
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(646, 162);
this.Controls.Add(this.tableLayoutPanel2);
this.Controls.Add(this.tableLayoutPanel1);
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "AWSConnectionForm";
this.Text = "AWS EC2 API Login Data";
this.Activated += new System.EventHandler(this.AWSConnectionForm_Activated);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.TextBox tbAccesKeyID;
public System.Windows.Forms.TextBox tbAccesKey;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
}
}

View File

@@ -0,0 +1,16 @@
namespace ExternalConnectors.AWS
{
public partial class AWSConnectionForm : Form
{
public AWSConnectionForm()
{
InitializeComponent();
}
private void AWSConnectionForm_Activated(object sender, EventArgs e)
{
tbAccesKeyID.Focus();
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,119 @@
using Amazon;
using Amazon.EC2;
using Amazon.EC2.Model;
using Microsoft.Win32;
namespace ExternalConnectors.AWS
{
public class EC2FetchDataService
{
private static DateTime lastFetch;
private static List<InstanceInfo>? lastData;
// input must be in format "AWSAPI:instanceid" where instanceid is the ec2 instance id, e.g. i-066f750a76c97583d
public static async Task<string> GetEC2InstanceDataAsync(string input, string region)
{
// get secret id
if (!input.StartsWith("AWSAPI:"))
throw new Exception("calling this function requires AWSAPI: input");
string InstanceID = input[7..];
// init connection credentials, display popup if necessary
AWSConnectionData.Init();
var alldata = await GetEC2IPDataAsync(region);
var found = alldata.Where(x => x.InstanceId == InstanceID).SingleOrDefault();
return (found == null) ? "" : found.PublicIP;
}
private static async Task<List<InstanceInfo>> GetEC2IPDataAsync(string region)
{
// caching
TimeSpan timeSpan = DateTime.Now - lastFetch;
if (timeSpan.TotalMinutes < 1 && lastData != null)
return lastData;
//AWSConfigs.AWSRegion = AWSConnectionData.region;
AWSConfigs.AWSRegion = region;
string awsAccessKeyId = AWSConnectionData.awsKeyID;
string awsSecretAccessKey = AWSConnectionData.awsKey;
var _client = new AmazonEC2Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.EUCentral1);
bool done = false;
List<InstanceInfo> instanceList = new();
var request = new DescribeInstancesRequest();
while (!done)
{
DescribeInstancesResponse response = await _client.DescribeInstancesAsync(request);
foreach (var reservation in response.Reservations)
{
foreach (var instance in reservation.Instances)
{
string vmname = "";
foreach (var tag in instance.Tags)
{
if (tag.Key == "Name")
{
vmname = tag.Value;
}
}
InstanceInfo inf = new(instance, vmname);
instanceList.Add(inf);
}
}
request.NextToken = response.NextToken;
if (response.NextToken == null)
{
done = true;
}
}
lastData = instanceList.OrderBy(x => x.Name).ToList();
lastFetch = DateTime.Now;
return lastData;
}
public static class AWSConnectionData
{
private static readonly RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteAWSInterface");
public static string awsKeyID = "";
public static string awsKey = "";
//public static string _region = "eu-central-1";
public static void Init()
{
if (awsKey != "")
return;
// display gui and ask for data
AWSConnectionForm f = new();
f.tbAccesKeyID.Text = "" + key.GetValue("KeyID");
f.tbAccesKey.Text = "" + key.GetValue("Key");
//f.tbRegion.Text = "" + key.GetValue("Region");
//if (f.tbRegion.Text == null || f.tbRegion.Text.Length < 2)
// f.tbRegion.Text = region;
_ = f.ShowDialog();
if (f.DialogResult != DialogResult.OK)
return;
// store values to memory
awsKeyID = f.tbAccesKeyID.Text;
awsKey = f.tbAccesKey.Text;
//region = f.tbRegion.Text;
// write values to registry
key.SetValue("KeyID", awsKeyID);
key.SetValue("Key", awsKey);
//key.SetValue("Region", region);
key.Close();
}
}
}
}

View File

@@ -0,0 +1,34 @@
using Amazon.EC2.Model;
using System;
namespace ExternalConnectors.AWS
{
public class InstanceInfo
{
public string InstanceId { get; }
public string Name { get; }
public string Status { get; }
public string PublicIP { get; }
public string PrivateIP { get; }
public InstanceInfo(Instance instance, string name)
{
InstanceId = instance.InstanceId;
Name = name;
switch(instance.State.Code)
{
case 0: Status = "Pending"; break;
case 16: Status = "Running"; break;
case 32: Status = "Shutdown"; break;
case 48: Status = "Terminated"; break;
case 64: Status = "Stopping"; break;
case 80: Status = "Stopped"; break;
default: Status = "Unknown"; break;
};
PublicIP = instance.PublicIpAddress ?? "";
PrivateIP = instance.PrivateIpAddress ?? "";
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,241 @@
namespace ExternalConnectors.CPS
{
partial class CPSConnectionForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CPSConnectionForm));
tbServerURL = new TextBox();
label3 = new Label();
tbAPIKey = new TextBox();
btnOK = new Button();
btnCancel = new Button();
tableLayoutPanel1 = new TableLayoutPanel();
label1 = new Label();
label6 = new Label();
tbOTP = new TextBox();
cbUseSSO = new CheckBox();
tableLayoutPanel2 = new TableLayoutPanel();
label4 = new Label();
tableLayoutPanel1.SuspendLayout();
tableLayoutPanel2.SuspendLayout();
SuspendLayout();
//
// tbServerURL
//
tbServerURL.Dock = DockStyle.Fill;
tbServerURL.Location = new Point(298, 5);
tbServerURL.Margin = new Padding(5);
tbServerURL.Name = "tbServerURL";
tbServerURL.Size = new Size(611, 27);
tbServerURL.TabIndex = 0;
//
// label3
//
label3.AutoSize = true;
label3.Dock = DockStyle.Fill;
label3.Location = new Point(5, 84);
label3.Margin = new Padding(5, 0, 5, 0);
label3.Name = "label3";
label3.Size = new Size(283, 42);
label3.TabIndex = 5;
label3.Text = "API Key";
label3.TextAlign = ContentAlignment.MiddleLeft;
//
// tbAPIKey
//
tbAPIKey.Dock = DockStyle.Fill;
tbAPIKey.Location = new Point(298, 89);
tbAPIKey.Margin = new Padding(5);
tbAPIKey.Name = "tbAPIKey";
tbAPIKey.Size = new Size(611, 27);
tbAPIKey.TabIndex = 4;
tbAPIKey.UseSystemPasswordChar = true;
//
// btnOK
//
btnOK.Anchor = AnchorStyles.Right;
btnOK.DialogResult = DialogResult.OK;
btnOK.Location = new Point(337, 16);
btnOK.Margin = new Padding(5);
btnOK.Name = "btnOK";
btnOK.Size = new Size(101, 35);
btnOK.TabIndex = 6;
btnOK.Text = "OK";
btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
btnCancel.Anchor = AnchorStyles.Left;
btnCancel.DialogResult = DialogResult.Cancel;
btnCancel.Location = new Point(474, 16);
btnCancel.Margin = new Padding(5);
btnCancel.Name = "btnCancel";
btnCancel.Size = new Size(101, 35);
btnCancel.TabIndex = 11;
btnCancel.Text = "Cancel";
btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
tableLayoutPanel1.ColumnCount = 2;
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 32.06997F));
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 67.93003F));
tableLayoutPanel1.Controls.Add(label1, 0, 0);
tableLayoutPanel1.Controls.Add(label3, 0, 2);
tableLayoutPanel1.Controls.Add(tbServerURL, 1, 0);
tableLayoutPanel1.Controls.Add(tbAPIKey, 1, 2);
tableLayoutPanel1.Controls.Add(label6, 0, 3);
tableLayoutPanel1.Controls.Add(tbOTP, 1, 3);
tableLayoutPanel1.Controls.Add(cbUseSSO, 0, 1);
tableLayoutPanel1.Dock = DockStyle.Top;
tableLayoutPanel1.Location = new Point(0, 0);
tableLayoutPanel1.Margin = new Padding(5);
tableLayoutPanel1.Name = "tableLayoutPanel1";
tableLayoutPanel1.RowCount = 5;
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));
tableLayoutPanel1.Size = new Size(914, 212);
tableLayoutPanel1.TabIndex = 12;
//
// label1
//
label1.AutoSize = true;
label1.Dock = DockStyle.Fill;
label1.Location = new Point(5, 0);
label1.Margin = new Padding(5, 0, 5, 0);
label1.Name = "label1";
label1.Size = new Size(283, 42);
label1.TabIndex = 2;
label1.Text = "Passwordstate URL";
label1.TextAlign = ContentAlignment.MiddleLeft;
//
// label6
//
label6.AutoSize = true;
label6.Dock = DockStyle.Fill;
label6.Location = new Point(3, 126);
label6.Name = "label6";
label6.Size = new Size(287, 42);
label6.TabIndex = 15;
label6.Text = "2FA OTP (Optional)";
//
// tbOTP
//
tbOTP.Dock = DockStyle.Fill;
tbOTP.Location = new Point(298, 131);
tbOTP.Margin = new Padding(5);
tbOTP.Name = "tbOTP";
tbOTP.Size = new Size(611, 27);
tbOTP.TabIndex = 5;
//
// cbUseSSO
//
cbUseSSO.Anchor = AnchorStyles.Left;
cbUseSSO.AutoSize = true;
cbUseSSO.Location = new Point(5, 53);
cbUseSSO.Margin = new Padding(5, 5, 5, 0);
cbUseSSO.Name = "cbUseSSO";
cbUseSSO.Size = new Size(157, 24);
cbUseSSO.TabIndex = 14;
cbUseSSO.Text = "Use SSO / WinAuth";
cbUseSSO.UseVisualStyleBackColor = true;
cbUseSSO.CheckedChanged += cbUseSSO_CheckedChanged;
//
// tableLayoutPanel2
//
tableLayoutPanel2.ColumnCount = 5;
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 106F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 26F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 107F));
tableLayoutPanel2.Controls.Add(btnOK, 1, 0);
tableLayoutPanel2.Controls.Add(btnCancel, 3, 0);
tableLayoutPanel2.Dock = DockStyle.Bottom;
tableLayoutPanel2.Location = new Point(0, 300);
tableLayoutPanel2.Margin = new Padding(5);
tableLayoutPanel2.Name = "tableLayoutPanel2";
tableLayoutPanel2.RowCount = 1;
tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutPanel2.Size = new Size(914, 67);
tableLayoutPanel2.TabIndex = 13;
//
// label4
//
label4.AutoSize = true;
label4.Dock = DockStyle.Fill;
label4.Location = new Point(0, 212);
label4.Margin = new Padding(5, 0, 5, 0);
label4.Name = "label4";
label4.Size = new Size(345, 20);
label4.TabIndex = 14;
label4.Text = "URL is the base URL, like https://pass.domain.local/";
label4.TextAlign = ContentAlignment.MiddleLeft;
//
// CPSConnectionForm
//
AcceptButton = btnOK;
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(914, 367);
Controls.Add(label4);
Controls.Add(tableLayoutPanel2);
Controls.Add(tableLayoutPanel1);
Icon = (Icon)resources.GetObject("$this.Icon");
Margin = new Padding(5);
Name = "CPSConnectionForm";
Text = "Passwordstate API Login Data";
Activated += CPSConnectionForm_Activated;
tableLayoutPanel1.ResumeLayout(false);
tableLayoutPanel1.PerformLayout();
tableLayoutPanel2.ResumeLayout(false);
ResumeLayout(false);
PerformLayout();
}
#endregion
private System.Windows.Forms.Label label3;
public System.Windows.Forms.TextBox tbServerURL;
//public System.Windows.Forms.TextBox tbUsername;
public System.Windows.Forms.TextBox tbAPIKey;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
public System.Windows.Forms.CheckBox cbUseSSO;
private System.Windows.Forms.Label label4;
private Label label6;
public TextBox tbOTP;
}
}

View File

@@ -0,0 +1,41 @@
namespace ExternalConnectors.CPS
{
public partial class CPSConnectionForm : Form
{
public CPSConnectionForm()
{
InitializeComponent();
}
private void CPSConnectionForm_Activated(object sender, EventArgs e)
{
SetVisibility();
if (cbUseSSO.Checked)
btnOK.Focus();
else
{
if (tbAPIKey.Text.Length == 0)
tbAPIKey.Focus();
else
tbOTP.Focus();
}
tbAPIKey.Focus();
if (!string.IsNullOrEmpty(tbAPIKey.Text) || cbUseSSO.Checked == true)
tbOTP.Focus();
}
private void cbUseSSO_CheckedChanged(object sender, EventArgs e)
{
SetVisibility();
}
private void SetVisibility()
{
bool ch = cbUseSSO.Checked;
tbAPIKey.Enabled = !ch;
//tbUsername.Enabled = !ch;
}
}
}

View File

@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
@@ -112,34 +112,38 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.PageIcon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAA
AAAtLDAA+PDaAP///wD79ugA/PrzAPf39wBGRUkA7NacAM2WAAA3z6kA+Pz/AIKBgwD+//4A4sNtAHXe
xAD8+vIAjuTOANOjHgDV6/4AJZf3APn5+QDw37IAIB8jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAnZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+6vb3/5uzs/+bt7f/n7e3/6O7u/+nv7//p7+//6u/v/+rw
8P/r8PD/6/Hx/+zx8f/s8fH/vb+//52dnf8AAAAAnZ2d6tvi4v/Nz8//y8vL/8zMzP/Ozs7/z8/P/9DQ
0P/S0tL/09PT/9XV1f/X2Nj/5+zs/52dnfcAAAAAAAAAAJ2dnerZ4eH/y8zM/8fHx//IyMj/ysrK/8vL
y//Nzc3/zs7O/9DQ0P/R0dH/09TU/+Xr6/+dnZ33AAAAAAAAAACdnZ3q19/f/8fJyf/CwsL/xMTE/8XF
xf/IyMj/ycnJ/8rKyv/MzMz/zc3N/9DR0f/j6ur/nZ2d9wAAAAAAAAAAnZ2d6tbf3//DxcX/wMDA/8DA
wP/CwsL/w8PD/8TExP/FxcX/yMjI/8nJyf/Nzc3/4Ojo/52dnfcAAAAAAAAAAJ2dndbHzc3/2+Tk/9vk
5P/b5eX/3OXl/9zl5f/d5ub/3ebm/97n5//f6Oj/4Ojo/83T0/+dnZ3jAAAAAAAAAACdnZ1DnZ2dyJ2d
nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3dnZ2dTgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA//+cQf//nEH//5xB//+cQQAAnEEAAJxBgAGcQYABnEGAAZxBgAGcQYABnEGAAZxB//+cQf//
nEH//5xB//+cQQ==
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAgICAgICCQ4CAgIWAgIUAgICAgICAgkJAgICFhYWAAIIDwICAgICCQwCAhYWFgYCCAgIBwIC
AgkJAgsWFhYWBQICCAgIAwIJCQIWFhYWAgICAgINCAgCAgICFhYCAgICAgICAgIRAgICAgICAgICAgIC
AgICEwICAgICEhMTExMCAgITExMCAgICAgITExMTAhMTExMCAgICAgICAgICAhMTEwICAgIICAIJCQIC
AgIKAgICAgIICAQCAgkJAgICAgICAgICCAgCAgICCQkCAgICAgICFQgBAgICAgwJAgICAgICAggIAgIC
AgICEAkCAgICAgIIAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

View File

@@ -0,0 +1,295 @@
using Microsoft.Win32;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
using System.Security.Cryptography;
using System.Text.Json;
using System.Text.Json.Nodes;
namespace ExternalConnectors.CPS;
public class PasswordstateInterface
{
private static class CPSConnectionData
{
public static string ssUsername = "";
public static string ssPassword = "";
public static string ssUrl = "";
public static string ssOTP = "";
public static DateTime ssOTPTimeStampExpiration;
public static bool ssSSO = false;
public static bool initdone = false;
//token
//public static string ssTokenBearer = "";
//public static DateTime ssTokenExpiresOn = DateTime.UtcNow;
//public static string ssTokenRefresh = "";
public static void Init()
{
// 2024-05-04 passwordstate currently does not support auth tokens, so we need to re-enter otp codes frequently
if (!string.IsNullOrEmpty(ssOTP) && DateTime.Now > ssOTPTimeStampExpiration)
{
ssOTP = "";
initdone = false;
}
if (initdone == true)
return;
RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteCPSInterface");
try
{
// display gui and ask for data
CPSConnectionForm f = new CPSConnectionForm();
//string? un = key.GetValue("Username") as string;
//f.tbUsername.Text = un ?? "";
f.tbAPIKey.Text = CPSConnectionData.ssPassword; // in OTP refresh cases, this value might already be filled
string? url = key.GetValue("URL") as string;
if (url == null || !url.Contains("://"))
url = "https://cred.domain.local/SecretServer";
f.tbServerURL.Text = url;
var b = key.GetValue("SSO");
if (b == null || (string)b != "True")
ssSSO = false;
else
ssSSO = true;
f.cbUseSSO.Checked = ssSSO;
// show dialog
while (true)
{
_ = f.ShowDialog();
if (f.DialogResult != DialogResult.OK)
return;
// store values to memory
//ssUsername = f.tbUsername.Text;
ssPassword = f.tbAPIKey.Text;
ssUrl = f.tbServerURL.Text;
ssSSO = f.cbUseSSO.Checked;
ssOTP = f.tbOTP.Text;
ssOTPTimeStampExpiration = DateTime.Now.AddSeconds(30);
// check connection first
try
{
if (TestCredentials() == true)
{
initdone = true;
break;
}
}
catch (Exception)
{
MessageBox.Show("Test Credentials failed - please check your credentials");
}
}
// write values to registry
//key.SetValue("Username", ssUsername);
key.SetValue("URL", ssUrl);
key.SetValue("SSO", ssSSO);
}
catch (Exception)
{
throw;
}
finally
{
key.Close();
}
}
}
private static bool TestCredentials()
{
return ConnectionTest();
}
private static bool ConnectionTest()
{
if (CPSConnectionData.ssSSO)
{
string url = $"{CPSConnectionData.ssUrl}/winapi/passwordlists/";
using HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "mRemote");
client.DefaultRequestHeaders.Add("OTP", CPSConnectionData.ssOTP);
var json = client.GetStringAsync(url).Result;
JsonNode? data = JsonSerializer.Deserialize<JsonNode>(json);
if (data == null)
return false;
return true;
}
else
{
string url = $"{CPSConnectionData.ssUrl}/api/passwordlists/";
using HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "mRemote");
client.DefaultRequestHeaders.Add("APIKey", CPSConnectionData.ssPassword);
client.DefaultRequestHeaders.Add("OTP", CPSConnectionData.ssOTP);
var json = client.GetStringAsync(url).Result;
JsonNode? data = JsonSerializer.Deserialize<JsonNode>(json);
if (data == null)
return false;
return true;
}
}
private static JsonNode? FetchDataWinAuth(int secretID)
{
string url = $"{CPSConnectionData.ssUrl}/winapi/passwords/{secretID}";
using HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "mRemote");
client.DefaultRequestHeaders.Add("OTP", CPSConnectionData.ssOTP);
var json = client.GetStringAsync(url).Result;
JsonNode? data = JsonSerializer.Deserialize<JsonNode>(json);
if (data == null)
return null;
JsonNode? element = data[0];
return element;
}
private static JsonNode? FetchDataAPIKeyAuth(int secretID)
{
string url = $"{CPSConnectionData.ssUrl}/api/passwords/{secretID}";
using HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "mRemote");
client.DefaultRequestHeaders.Add("APIKey", CPSConnectionData.ssPassword);
client.DefaultRequestHeaders.Add("OTP", CPSConnectionData.ssOTP);
var json = client.GetStringAsync(url).Result;
JsonNode? data = JsonSerializer.Deserialize<JsonNode>(json);
if (data == null)
return null;
JsonNode? element = data[0];
return element;
}
private static void FetchSecret(int secretID, out string secretUsername, out string secretPassword, out string secretDomain, out string privatekey)
{
// clear return variables
secretDomain = "";
secretUsername = "";
secretPassword = "";
privatekey = "";
string privatekeypassphrase = "";
JsonNode? element = null;
if (CPSConnectionData.ssSSO)
element = FetchDataWinAuth(secretID);
else
element = FetchDataAPIKeyAuth(secretID);
if (element == null)
return;
var dom = element["Domain"];
if (dom != null) secretDomain = dom.ToString();
var user = element["UserName"];
if (user != null) secretUsername = user.ToString();
var pw = element["Password"];
if (pw != null) secretPassword = pw.ToString();
var privkey = element["GenericField1"];
if (privkey != null) privatekey = privkey.ToString();
var phrase = element["GenericField3"];
if (phrase != null) privatekeypassphrase = phrase.ToString();
// need to decode the private key?
if (!string.IsNullOrEmpty(privatekeypassphrase))
{
try
{
var key = DecodePrivateKey(privatekey, privatekeypassphrase);
privatekey = key;
}
catch(Exception)
{
}
}
// conversion to putty format necessary?
if (!string.IsNullOrEmpty(privatekey) && !privatekey.StartsWith("PuTTY-User-Key-File-2"))
{
try
{
RSACryptoServiceProvider key = ImportPrivateKey(privatekey);
privatekey = PuttyKeyFileGenerator.ToPuttyPrivateKey(key);
}
catch (Exception)
{
}
}
}
#region PUTTY KEY HANDLING
// decode rsa private key with encryption password
private static string DecodePrivateKey(string encryptedPrivateKey, string password)
{
TextReader textReader = new StringReader(encryptedPrivateKey);
PemReader pemReader = new PemReader(textReader, new PasswordFinder(password));
AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
TextWriter textWriter = new StringWriter();
var pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(keyPair.Private);
pemWriter.Writer.Flush();
return ""+textWriter.ToString();
}
private class PasswordFinder(string password) : IPasswordFinder
{
private string password = password;
public char[] GetPassword()
{
return password.ToCharArray();
}
}
// read private key pem string to rsacryptoserviceprovider
public static RSACryptoServiceProvider ImportPrivateKey(string pem)
{
PemReader pr = new PemReader(new StringReader(pem));
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParams);
return rsa;
}
#endregion
// input: must be the secret id to fetch
public static void FetchSecretFromServer(string secretID, out string username, out string password, out string domain, out string privatekey)
{
// get secret id
int sid = Int32.Parse(secretID);
// init connection credentials, display popup if necessary
CPSConnectionData.Init();
// get the secret
FetchSecret(sid, out username, out password, out domain, out privatekey);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -0,0 +1,281 @@
namespace ExternalConnectors.DSS
{
partial class SSConnectionForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SSConnectionForm));
this.tbSSURL = new System.Windows.Forms.TextBox();
this.tbUsername = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.tbPassword = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label5 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.cbUseSSO = new System.Windows.Forms.CheckBox();
this.label6 = new System.Windows.Forms.Label();
this.tbOTP = new System.Windows.Forms.TextBox();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.label4 = new System.Windows.Forms.Label();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// tbSSURL
//
this.tbSSURL.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbSSURL.Location = new System.Drawing.Point(298, 5);
this.tbSSURL.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.tbSSURL.Name = "tbSSURL";
this.tbSSURL.Size = new System.Drawing.Size(611, 27);
this.tbSSURL.TabIndex = 0;
//
// tbUsername
//
this.tbUsername.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbUsername.Location = new System.Drawing.Point(298, 47);
this.tbUsername.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.tbUsername.Name = "tbUsername";
this.tbUsername.Size = new System.Drawing.Size(611, 27);
this.tbUsername.TabIndex = 2;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Location = new System.Drawing.Point(5, 84);
this.label3.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(283, 42);
this.label3.TabIndex = 5;
this.label3.Text = "Password";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tbPassword
//
this.tbPassword.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbPassword.Location = new System.Drawing.Point(298, 89);
this.tbPassword.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.tbPassword.Name = "tbPassword";
this.tbPassword.Size = new System.Drawing.Size(611, 27);
this.tbPassword.TabIndex = 4;
this.tbPassword.UseSystemPasswordChar = true;
//
// btnOK
//
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(337, 16);
this.btnOK.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(101, 35);
this.btnOK.TabIndex = 6;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(474, 16);
this.btnCancel.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(101, 35);
this.btnCancel.TabIndex = 11;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32.06997F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67.93003F));
this.tableLayoutPanel1.Controls.Add(this.label5, 1, 4);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.tbSSURL, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.cbUseSSO, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.tbUsername, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.tbPassword, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.label6, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.tbOTP, 1, 3);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(914, 212);
this.tableLayoutPanel1.TabIndex = 12;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Dock = System.Windows.Forms.DockStyle.Fill;
this.label5.Location = new System.Drawing.Point(298, 168);
this.label5.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(611, 44);
this.label5.TabIndex = 15;
this.label5.Text = "For SSO to work, additional IIS configuration is required!";
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(5, 0);
this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(283, 42);
this.label1.TabIndex = 2;
this.label1.Text = "Secret Server URL";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(5, 42);
this.label2.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(283, 42);
this.label2.TabIndex = 4;
this.label2.Text = "DOMAIN\\Username";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// cbUseSSO
//
this.cbUseSSO.AutoSize = true;
this.cbUseSSO.Location = new System.Drawing.Point(5, 173);
this.cbUseSSO.Margin = new System.Windows.Forms.Padding(5, 5, 5, 0);
this.cbUseSSO.Name = "cbUseSSO";
this.cbUseSSO.Size = new System.Drawing.Size(86, 24);
this.cbUseSSO.TabIndex = 14;
this.cbUseSSO.Text = "Use SSO";
this.cbUseSSO.UseVisualStyleBackColor = true;
this.cbUseSSO.CheckedChanged += new System.EventHandler(this.cbUseSSO_CheckedChanged);
//
// label6
//
this.label6.AutoSize = true;
this.label6.Dock = System.Windows.Forms.DockStyle.Fill;
this.label6.Location = new System.Drawing.Point(3, 126);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(287, 42);
this.label6.TabIndex = 15;
this.label6.Text = "2FA OTP (Optional)";
//
// tbOTP
//
this.tbOTP.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbOTP.Location = new System.Drawing.Point(296, 130);
this.tbOTP.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.tbOTP.Name = "tbOTP";
this.tbOTP.Size = new System.Drawing.Size(615, 27);
this.tbOTP.TabIndex = 5;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 5;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 106F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 26F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 107F));
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 300);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(914, 67);
this.tableLayoutPanel2.TabIndex = 13;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Dock = System.Windows.Forms.DockStyle.Fill;
this.label4.Location = new System.Drawing.Point(0, 212);
this.label4.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(427, 20);
this.label4.TabIndex = 14;
this.label4.Text = "URL is the base URL, like https://cred.domain.local/SecretServer";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// SSConnectionForm
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(914, 367);
this.Controls.Add(this.label4);
this.Controls.Add(this.tableLayoutPanel2);
this.Controls.Add(this.tableLayoutPanel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
this.Name = "SSConnectionForm";
this.Text = "Secret Server API Login Data";
this.Activated += new System.EventHandler(this.SSConnectionForm_Activated);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label3;
public System.Windows.Forms.TextBox tbSSURL;
public System.Windows.Forms.TextBox tbUsername;
public System.Windows.Forms.TextBox tbPassword;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
public System.Windows.Forms.CheckBox cbUseSSO;
private System.Windows.Forms.Label label4;
private Label label5;
private Label label6;
public TextBox tbOTP;
}
}

View File

@@ -0,0 +1,35 @@
namespace ExternalConnectors.DSS
{
public partial class SSConnectionForm : Form
{
public SSConnectionForm()
{
InitializeComponent();
}
private void SSConnectionForm_Activated(object sender, EventArgs e)
{
SetVisibility();
if (cbUseSSO.Checked)
btnOK.Focus();
else
{
if (tbPassword.Text.Length == 0)
tbPassword.Focus();
else
tbOTP.Focus();
}
}
private void cbUseSSO_CheckedChanged(object sender, EventArgs e)
{
SetVisibility();
}
private void SetVisibility()
{
bool ch = cbUseSSO.Checked;
tbPassword.Enabled = !ch;
tbUsername.Enabled = !ch;
}
}
}

View File

@@ -0,0 +1,615 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAQAQEAAAAEAIAAoQAAARgAAACAgAAABACAAKBAAAG5AAAAYGAAAAQAgACgJAACWUAAAEBAAAAEA
IAAoBAAAvlkAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f3e/f397vz9
/e79/f3u7ezr7p6Xju5XTEHuNScV7i8hCe4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isf
CO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isf
CO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isf
CO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHAjuKx8I7jYoFu5XTUHumJGO7u3r6+79/f3u/f397v39
/e79/f3e/f399P//////////u7Wy/0M1KP8jEwD/KRgA/ywdBv8tHwj/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8sHAT/KRcA/yAR
AP9DNSX/ubOt/////////////f399Pv8/e7/////m5aK/xoMAP8lFAD/LSAI/y0gCv8uIAr/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cv8uIAr/LB4J/ysfCf8uIQj/JBYA/xoLAP+elYz///////z9/O79/f3uvLWw/xsNAP8rHAX/LiAK/y0f
Cf8tHwj/LR8I/y0fCf8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCf8tHwn/LR8J/y4gCv8pGgP/GgsA/7y3sP/9/f3u6unp7kM0
I/8nFwH/LiEL/yweCP8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAr/LR8J/yIU
AP9DNSL/6+nq7pqUju4fEQD/LiAI/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8uIAf/HxAA/5qTju5YTT7uJRYA/ywgCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/Kx8I/ygXAP9YTkDuOCkV7iweBv8sHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8sHQX/NykW7ioc
CO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8uIAn/Lh8I/yocCO4qHAjuLyEK/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8K/y4gCf8rHAjuKx8I7i4gCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8J/y0fCP8tHwn/LR8J/y0f
CP8tHwn/LR8J/y0fCP8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
CP8tHwj/LR8J/y0fCf8tHwj/LR8J/y0fCf8tHwn/LR8J/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8uIAj/Kx8I7isfCO4uIAn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8I/y8fCP8uHwj/LR8G/yweCP8uHgn/LR4H/yweB/8rHgf/Kx4H/yweCP8sHgj/Kx4I/yse
CP8sHgj/LB4I/yweCP8sHgn/LB4J/yoeCP8qHgj/LB4I/y4fCP8sIQj/LB8H/y0eCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysf
CO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tIAn/LiAK/y0WAf8sFgH/LRsG/ywbBv8uGwX/MR0B/y8cAv8uGwX/LRkG/ysZ
Bf8qGQX/KhkF/ygaBP8oGgX/JxoF/ycaBf8pGgX/KRkG/ykZBv8nGQT/JxkF/ygZCv8jFAb/IBUG/ywe
Cf8tHwf/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/Lh0I/y0XA/84Qyf/P31P/0aSXP9KkVv/UpJT/2OV
Sv93mUf/jJ9A/6CjPP+vpjv/rac4/6ilN/+ppDn/qaQ4/62jOP+uozj/sKI2/7KiNv+yojX/s6Az/7Wi
NP+0oDP/mIUs/1pIFv8lFQb/Kh4I/y4gCf8sHgn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR4I/ygWA/83b0X/SsOE/0zC
f/9QvHf/Ubp0/1e4b/9YtGz/WrJl/2KwZP96tWD/lL9X/7fNUf/b2E//3NhP/9nWTP/X00v/29NL/9vS
Sv/d0Ur/39FJ/9/RSP/j0Ej/5tBD/+3VRP/r0EX/jHYl/yMUBv8sHwb/LB4I/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysfCO4rHwjuLiAJ/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/ysV
AP8zWTb/ScmH/0e8ef9Ltnb/TrRx/1Cyb/9VsGr/Wa1m/1mrYf9dqV3/XqRc/1yfWf9ooVL/g6tQ/7XD
Tf/R0Ur/ys1H/87LR//Oykb/0MlG/9PKRf/Uy0X/18pF/9jJQf/byEH/4MtD/+7VRv9rWxz/HxMC/y8h
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4g
Cf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/Kx8I/y0cBv8vHQj/QKFs/0fEgP9IuHX/TLZ0/0+0cP9UsW3/Vq9o/1isZP9cqWD/X6hc/2Ok
Wf9loVX/aKBT/2iZUP9um0j/obZJ/87RTP/SzUz/yspI/8zLSP/Qykj/0stH/9XJR//VyUT/2clE/9fH
RP/izkn/vao2/ywdBv8rHAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tGwX/MCoV/0azfP9Fvnv/Sbh2/0y2c/9PtG//VbFs/1av
Z/9YrGT/XKlg/2KnXP9kpVr/ZaJX/2mhU/9unkz/bZtK/2qVR/+asUj/zdJM/8nOSf/JzUv/zcxJ/8/L
R//Rykf/0cpE/9XKRP/WykX/3c5G/9DBQv86Kw//KRoH/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LiAI/ysfCO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwr/LRoE/ywsGP9Dt3//R7x6/0q3
dv9OtHL/ULNu/1Wwa/9Xrmb/Watj/12pXv9hplv/ZaRY/2eiVP9qoFH/bp5M/3OcSf9ymUb/b5BC/6m5
SP/L0k7/yM5M/8vNS//LzEn/z8xJ/87LR//Rykf/08tH/9nNSP/RxkT/PS8R/ygZBv8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4g
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LB8K/y4a
A/8uLRj/RLZ9/0e8ev9LtnX/ULNy/1Gybf9VsGr/Wa5l/1mrYv9dqVz/YKZa/2WkVv9oolL/aqBQ/2+e
S/9zm0n/dJpE/3SUQ/+Dmj7/wMxM/8fPTP/IzUz/yc5L/8zNS//LzEr/z8tK/8/LSP/UzUj/0MZG/z0u
EP8oGgX/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8uIAj/Kx8I7isfCO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/ywfCv8uGgP/Li0Y/0W2fP9Iu3n/TLZ0/1Czcf9Rsm3/VbBq/1muZf9aq2L/Xqlc/2Gm
Wv9lpFb/aKJS/2ugUP9wnkv/c5tI/3WaQ/95l0H/do07/6m6Rf/F007/xM5N/8XOTP/IzUz/yM5L/8zN
S//MzEn/0c9J/83HR/89LhD/KBoG/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysfCO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwr/LRsE/zAsGP9HtHr/S7p3/061cv9Qs2//U7Fr/1Wv
af9arGP/XKlh/2GnW/9lpFn/ZaNV/2igUf9unk7/cpxK/3WbRv91mEH/e5Y//3mPOP+YrEH/wtVT/7/O
Uf/CzlD/xc1Q/8TOTP/IzUz/yc5L/87QTP/HyEn/PS8P/ykZBv8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8K/y0bBP8wLBj/R7R6/0u6
d/9OtXL/ULNv/1Oxa/9Vr2n/Wqxj/1ypYf9hp1v/ZaRZ/2WjVf9ooFH/bp5O/3KcSv91m0b/dZhB/3yW
P/97kDj/j6I9/7/VV/+90VH/wNBR/8PPUf/Bz0z/xM5M/8XOS//K0Uz/xclJ/z0vD/8pGQb/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isf
CO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tGwT/MCwa/0qzef9MuXb/TrRx/1Kybv9Tr2n/V61k/12qYP9fqF3/YKZZ/2SkVv9qoVL/bKBP/26d
TP9ym0b/dJpE/3iWQf98lD7/fY43/42gPf+111v/t9RU/7nSU/+/z1L/vtBQ/8HPUP/Cz03/xtFN/8HJ
TP88MA//KhsF/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LiAJ/ysfCO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LRsE/zAsGv9Ks3n/TLl2/060cf9Ssm7/U69p/1etZP9dqmD/X6hd/2Cm
Wf9kpFb/aqFS/2ygT/9unUz/cptG/3SaRP94lkH/fJQ+/36NNv+LpkP/qNxh/6zYWv+v1Ff/ttFV/7zS
Uf/A0VL/wNFP/8TUT//Ayk3/PDAP/yobBP8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4cA/8wLBn/SrN2/024dP9Ps3D/VLFs/1eu
Z/9Zq2T/XKlf/2KnXf9jpVj/ZaNV/2qgUf9unk7/cJ1K/3KbRf92mUP/e5U+/3mUPP9/jDP/ibRM/5zi
aP+g2mD/pdhe/6zVW/+01Ff/utNU/7vSUv/D1VH/vctN/zswEf8pGgb/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8uHQL/MCwY/0qz
df9NuHP/T7Nv/1Wwa/9arWb/Wqtj/1qpX/9jplz/ZKRY/2WiVf9qoFH/b55N/3CdSf9ym0T/d5hC/3yW
Pf98kjn/g441/4nRZP+N4mv/ld5n/5rcZf+g22D/p9hd/63XWf+y1Fb/utZU/7jMTv86MBH/KBoG/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LiAI/ysf
CO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/Lh0D/zAsF/9LsnT/Trdz/1Gybv9WsGr/WK1l/1uqYv9dqV3/YqZb/2WkVv9nolT/aqBQ/2+e
TP9ynEn/c5pD/3aXQf97lT3/gokz/3uvT/986nr/g+Rw/4nibf+O32v/lN5n/5rcY/+h22D/ptdd/6/Y
Wv+xzlX/Oi8R/ygZBv8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4cBf8wLRb/TbFz/1C2cv9TsWz/V7Bo/1etZP9cqmH/Yahb/2Gl
Wv9mo1T/aKFS/2ugTv9wnUr/dJpI/3WZQ/98kz3/gYo3/3WsUP9s7ID/but8/3fneP995XT/geJy/4fh
bf+O32r/lN5m/5rbZP+j3GL/pdJd/zkvEv8pFwX/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHAX/MC0W/02xc/9QtnL/U7Fs/1ev
aP9YrWT/XKpg/1+oW/9hpVr/ZqNV/2mhUv9sn03/cJxJ/3WVRP95kT3/eJZA/2TAYf9Y8Yj/XPOI/2fs
gv9r637/cel7/3bneP995XT/g+Nw/4nibP+P32r/l+Bo/5jXYf85MBL/KhgG/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysfCO4rHwjuLiAJ/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/KhsE/zAs
FP9NsXH/UbVv/1awav9arWf/Wqxi/12oXv9jo1v/Y6FU/2mcUP9tm0r/bptI/2+cSv9rp1P/YMNo/1Do
hf9G/ZX/SfaO/1PyjP9b8Ir/X+6F/2btgv9s637/cul6/3fmeP995XT/g+Nw/4vlbv+O22n/NjAU/yca
BP8uHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4g
Cf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/yobBP8wLBT/TbJy/1G1b/9WsGr/Wq1n/1uoX/9dp13/YKlf/2CvXv9gt2X/XcBq/1XQ
dv9P4YP/SPCO/0T3lP9J85L/R/SR/0n1kf9L9ZD/TfSP/1Tzi/9b8Yj/Yu+E/2ftgP9r637/cel6/3jn
dv+A6XT/geBs/zgxFf8pGwX/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y8fCf8rHAL/LisU/02ucv9Vs23/VLBp/1ipYP9XuGr/TtOA/0fg
if9H5Ir/RuqO/0Xukf9G7pL/Ru2Q/0Ttjf9J7I7/R+6N/0nwj/9L8ZD/S/KR/0nzkP9I85D/TPSN/1X0
if9d8If/Ye6D/2fsf/9s6nz/cux7/3Xic/81MRb/KxkE/ywfCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysfCO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8sHwn/Lh0D/y4gCP9PnWP/Vbdx/1eq
ZP9TwXP/RuSM/0fmjv9F4ov/Q+SJ/0bliv9F5or/RuaM/0bojP9G6or/R+uM/0jtjP9J7o3/SO+O/0nw
j/9I8o//RvKP/0f0j/9K947/S/WN/1Tyif9b8YT/YO6D/2n2hP9kz27/KyEM/y4dBv8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4g
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LB8J/y4e
B/8sFgH/PGU2/1i9dP9Utm3/RN6J/0Leif9J3on/SN+K/0Xgif9H4ov/R+KL/0fjjP9I5Yz/R+eL/0jo
jP9I6o3/SeuO/0jsjf9J7Y7/SO+O/0jwjv9J8Y//S/OQ/0r0kf9M9ZD/T/SO/1Pziv9h/5X/SIJE/yoP
Af8sHwf/LR8K/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8uIAn/Kx8I7isfCO4uIAj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwn/LBwH/ywdCf9IfEf/Tsx8/0Ddif9F14X/RduH/0bdiP9E3on/Rd+K/0fl
jf9I6JD/SOqQ/0jsj/9J7ZD/SO6R/0nvkv9H8JD/SPKR/0n0kf9K84//SPCP/0fxkP9J8pH/SvWS/0r3
lP9M/pn/RKxh/y0YBv8sHAf/LR8J/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LiAI/ysfCO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8sGgX/KhUE/0GsbP9E4Y7/QteG/0TZ
h/9F2oj/RdyI/0Teiv9Ez3//RMp7/0XNe/9Eznr/RM97/0TQff9F0H3/Q9J7/0PTfP9E0n3/SNyC/0zq
iv9M6Yr/TeqL/0zsiv9P8Iz/S7Vp/ywWB/8sGgT/LiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8sHwn/Lh8G/ywR
BP87m2b/ReCR/0PUiP9E1oj/RtiJ/0bZh/9D5o//Nlk1/ywZB/8vJg3/LyYM/y8mDP8vJQ3/LyUN/ywm
DP8sJgz/KhgH/z9sO/9c2Hr/Vslx/1fJcf9YyXL/XdF3/0yRUv8pEwT/LyEJ/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isf
CO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LB8J/y0eBv8sEwX/PJ1n/0Tej/9D0of/Q9SG/0TWiP9F2Ib/QuWO/zVPLv8sDgD/MBsI/y8b
B/8vGwb/LhsE/y4bBP8sGgb/KxoG/ywKAP87Zjr/U+CD/1HQe/9R0Hv/UtB7/1Pcg/9En17/KxMD/y4g
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LiAJ/ysfCO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4fCf8sHwj/LhUD/0CbZP9F2o7/RM+H/0TQhv9F0of/Q9WG/0bk
kf8yVzL/KxEA/y4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tDgD/O3ZF/0zslP9I2ob/SdqG/0na
hv9L5o7/QaNm/ywVAv8uHgf/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8sHwj/LiAJ/ywUAf89jlf/Q9qO/0LN
hf9Dz4T/RNCG/0LRg/9H4I//O4dQ/yoOAP8tIAj/LR8J/y0fCf8tHwn/LR8J/y0fCP8tHgj/LBMC/z+n
ZP9H6pH/RN+K/0Tfiv9E34r/RuyT/z2bXv8uEwH/LR8H/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LB8J/y0f
Cf8rDwD/NXNF/0PZjP9DyYX/RcuF/0XNhv9EzYT/RdSJ/0TFfv8uKRH/LBYC/ywfCP8tHwn/LR8J/ywf
Cf8sHwj/KBAA/zZAIf9H34n/R+GL/0Xdif9F3Yn/Rd2I/0nvlv86gU3/Kg4A/y0eCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysf
CO4rHwjuLiAI/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCf8rHwj/LRMB/zZRLv9H0ov/QsmE/0LKhP9Ey4X/Q8uE/0XMhP9H3I7/Pppj/ysa
Bv8sEQD/Lh0I/y0fB/8tGgX/Kg4A/y0lD/9AuXH/R+qQ/0Lci/9D34n/Rd6J/0PdiP9C65H/M1wx/y8U
Av8uIAf/LR8J/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y4gCP8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LB4I/y4bBv8uJQ//QLV4/0LNh/9Bx4P/Q8iE/0PJ
g/9Ey4P/RMuG/0Xajv9EpGn/MEoo/ysfC/8uFgr/LiUN/zNULf8+vHf/SOWQ/0TYh/9F3Ij/Rt6J/0fe
i/9E44z/Rc9//y0qDv8vGQX/LSAH/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCf8tHwn/KxEA/zt2
Sv9F047/QcOC/0PFg/9Cx4L/RMmD/0PKgv9EzIP/RdaL/0fUif8/t3P/Pqpv/0C+dv9H3I//Rt6O/0HW
hv9E1oj/RdiI/0Tah/9G3In/R+6U/zuET/8sDwD/LR8J/y0fCf8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LiAI/ysfCO4rHwjuLiAJ/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0aBP8wKhH/QLV4/0HKhv9BxIP/QsWB/0LHgv9CyIL/QsmD/0XKg/9FzoT/Q9KH/0LY
iP9G14r/Q9CH/0XRhf9F0oX/RNSI/0LXiP9C14X/ReGM/0XOgv8uKxT/KxgF/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4g
Cf8rHwjuKx8I7i4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwf/LRYA/zRTL/9Dy4v/QcWG/0HCgf9CxIL/QsSC/0PE
g/9CxoP/Q8iC/0TKhP9Dy4T/RsyF/0PNhf9Cz4b/RNCH/0XSiP9H0oj/QtiJ/0jikP8yWjX/KxAA/ywg
B/8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isfCO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LSAH/y8gBv8vEgD/OWlC/0PL
if8+xYP/P8KA/0DCgf9Bw4L/QsaC/0LHgf9DyIL/QsqC/0PLg/9CzIT/Q82F/0TOhf9Fz4X/RdaK/0fg
lf85dkf/KhEA/yseB/8uHwj/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysfCO4rHwjuLiAJ/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8vHwn/Kh4I/y8WAP82Yzj/P7+C/0LLiP9CwoL/QMGC/0HFhP9BxIH/Q8WD/0PGhP9Ex4X/RMmE/0bK
hf9DzYT/QtyN/0nTiP86aj3/LRIA/y4eCP8sIAr/Lh8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuKx8I7i4g
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8rIAj/KhQA/zU/IP9Bl2X/RseI/0LLiv8/x4b/QMaD/0DF
g/9CxoT/Q8mG/0LOh/9G1o3/RtSK/0WjaP8yQiD/LBEA/y8eCP8sIAn/LR8I/y0fCP8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8uIAn/Kx8I7isfCO4uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8sHwn/LR4I/y4gCv8sFQD/KxoE/zRJ
Kf9Cg1P/Q6tv/0O6ev9EwoL/QsOC/0a+fv9FsHD/QoZS/zZJJ/8sGgT/KxMB/y4fCf8wIAj/Lh8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LiAJ/ysfCO4rHwjuLiAI/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8J/y0f
Cf8tHwj/LR8J/y0dCP8rEwL/LBQA/zEjCf8yLxP/Njce/zQ3H/8yMBT/MiMJ/y8UAP8rEgD/LB0H/y4g
Cf8tHwn/LB8J/y0fCf8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y4gCP8rHwjuKx8I7i4gCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAI/yseB/8rHQj/LBoF/ysXAv8sGAP/KxsF/ygb
Bv8wHgf/LR8J/y4fCv8uIAr/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/Kx8I7isf
CO4uIAj/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8I/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LB8J/y0fCf8tHwj/LR8I/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LiAJ/ysfCO4rHwjuLyEJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHwjuLh8J7i8hCP8tIAj/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwj/LyEJ7jgqFu4sHgX/LR8H/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/LB4G/zUn
FO5YTT7uJhUA/y4gCv8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LSAL/yoZAP9XTD7um5SO7iMRAP8vIAn/LR8J/y0fCf8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwn/LR8I/ywfBv8iEgD/npeO7urq6e5ENSX/JBQA/y0hCP8tIAf/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/Kx0H/y4gCv8lFQD/QzYm/+vr6e79/f3uvLax/xoM
AP8pGwL/LiEI/y0fCf8tHwj/LR8J/y0fCf8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0f
CP8tHwj/LR8I/y0fCP8tHwj/LR8I/y0fCP8tHwj/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHQX/Gw0A/723
tP/9/f3u+vv87v////+ak4n/GQsA/yQUAP8uHwn/LR8J/y0fCP8uIAn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0eCf8sHgj/LB8J/y4g
B/8mFwD/Gw0A/5qViv//////+/z87v39/fT//////////7q1sP9DNCb/IxEA/ycWAP8rHgX/LiAH/y8h
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/zAh
Cv8uHwj/LB0G/yQWAP8fEQD/QzQm/7q0r/////////////39/fT9/f3e/f397vz9/e79/f3u6+rp7puU
ju5YTj/uOCkW7i4fCu4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isf
CO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isf
CO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isfCO4rHwjuKx8I7isf
CO4rHwjuKx8I7isfCO4rHwjuKyAI7jcpFu5YTj7umpOO7uvr6u79/f3u/Pz97v39/e79/f3eKAAAACAA
AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/dzt6+vtdGte7TQmFu0rHQjtLR8I7S0f
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0f
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7SsdBu00Jhbtc2le7e3r6e39/f3c6ubl81ZKOP8dDgD/LB4G/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LyAK/ywdBf8dDgD/VUk4/+rn5vN0a13tHg4A/y4g
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8dDQD/dWtd7TQm
Eu0rHQb/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/ywd
Bf80JhLtKx0G7S8gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LiAJ/ysdBu0tHwjtLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwj/LBcC/ysT
AP8pFAH/JhMC/yISA/8hEQP/IBID/yASA/8gEgT/HxIE/x8RBP8jFgb/LB4I/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR4I/ywY
BP81QiP/Olw1/0RbLP9WXSb/bGMj/3RnIP9vZCD/bmIg/3FiIP9yYh7/dWMf/1ZFFv8lFwb/LB4I/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8rFgL/N2c//0vDgf9SwHr/W7pv/2a2Zf9+t13/p8RT/9bYT//g20z/3tZL/+LWSv/p10f/69RF/39r
Iv8iFQT/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/y0fCO0tHwjtLiAJ/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LBwG/y4lD/9Esnb/Sr55/1Kybv9XrWf/Xahe/1+iWP9imlH/faJJ/8DHSv/Pz0r/z8tI/9PK
Rf/f0Uf/z75A/zQmC/8pGwj/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8sGgX/Ly0W/0S0ef9NuHb/U7Fs/1itZP9ep1z/ZqNW/2yfTv9slUb/hqFE/8fP
TP/Lzkv/zcxJ/9TOSf/Ow0T/PS4P/ygaB/8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4g
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/ywbBf8wLBX/RrF1/0+4dP9UsGv/Wqxj/2CmWv9molT/b55N/3WZ
RP93kTz/r8BI/8fST//Hzkz/zdFM/8bERv87LQ7/KRoH/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/y0f
CO0tHwjtLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LBsF/zAsFf9Jr3T/ULdz/1WvaP9dqmD/YqVZ/2mg
Uv9wnEv/dplD/3mOOf+iuEn/wNZV/8HPT//H0k7/v8ZJ/zstDv8pGgf/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8sGwX/MCwV/0mvc/9RtnH/Vq1m/16p
Xv9jpFf/bKBQ/3CcSP93mEH/fIw2/5bCU/+q3F//tdNW/8HWUv+7yEv/Oi4O/ykaB/8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/ywbBf8wLRT/S65w/1O1
bv9ZrGT/YKdc/2ajVv9sn0//cpxG/3uPOf+AmT7/hd5t/5Hhav+e22L/rdtc/6/KUf85LQ//KRoH/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LiAJ/y0fCO0tHwjtLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LBsG/zAs
E/9NrW7/VrRt/1qrYf9ipFj/aZ5R/3GXR/94kj//dKFI/2bddv9t74H/eeZ2/4Xib/+U4mr/mdFe/zgt
EP8qGQb/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8sGwb/LiwU/06ubf9ZsGn/Xahf/2CqXv9jr13/YLtj/1jRdP9K8o7/SvqT/1byi/9j7oP/b+p8/3zq
d/+D22r/NjAS/yoaBv8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/ywcBv8vJw7/Ualp/1e3bP9N0n//R+GJ/0bojf9E75H/RPKR/0jwj/9J8ZD/R/OR/0z1
jv9W8on/ZfWF/2vhd/8yKg//KxoG/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/y0fCO0tHwjtLiAJ/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8I/ysXAv9CaTr/TNSC/0PijP9F34n/RueP/0n0lv9J95b/SvqY/0n9
mP9J+5b/R/OR/0j4lP9Q/pb/RI5N/ysTAv8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/LR8I7S0f
CO0uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LRwG/ywbB/9Aunf/RN6M/0bijf9At3D/OXJC/zp7
Rf86fEb/NnhD/z+SUv9S3H//U+KD/068bf8sGgj/LRsH/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4g
Cf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHQf/LRwI/0CydP9E2oz/RuWR/zqO
Vv8qAAD/LA8A/ywOAP8pAgD/Mzkb/0/bhP9Q24T/SLRs/y0dCP8tHQf/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LiAJ/y0fCO0tHwjtLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0eCP8tGQT/PqZp/0TW
jP9F1or/Qbh0/ywbBv8sFQL/LBwG/ykGAP86eEX/Ru6U/0Xpkf9At3H/LRkE/y0eB/8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/ysR
AP86fk//RNeP/0TJg/9G14z/PI1Y/y4pEP8tHQn/M1ky/0TWhv9F4Yz/R/CV/zqOU/8sEAD/LR8I/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LBcD/zE5HP9CxoX/QsqF/0PIgv9F1ov/QsR+/0C7d/9F2oz/RNmK/0Xdiv9G34z/MT0d/ywW
A/8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/y0fCO0tHwjtLiAJ/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LBQA/zdmPf9C0Iz/QcmG/0LFgv9DzIX/RNGI/0POhv9F14v/R+WU/zdv
Qv8qEQD/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHgj/LBUB/zVeNv9Ct3v/Q8+M/0LRjP9E1I7/RteO/0TE
fv84ZDr/LRQB/y0eCP8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4g
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHgj/LBMA/y8qEf84Xjb/O3lM/zt6
Tf86YDf/MCoR/ysSAP8tHgj/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LiAJ/y0f
CO0tHwjtLiAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LBoF/ysT
AP8sEQD/KxEA/ysSAP8sGgX/LSAJ/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8uIAn/LR8I7SweBu0vIAn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y4gCf8rHQbtNCYT7SwdBv8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LB4G/zQmEu11a17tHQ4A/y4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0gCf8dDgD/dmxe7ern5vNVSTf/Hg4A/ywdBv8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8rHQX/Hg4A/1ZKOP/q5+fz/f393Ozr6e10aV7tNSYU7Swe
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0f
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLB4I7TQmFO1zaV7t7evp7f39/dwoAAAAGAAAADAA
AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f393JSPhO00JhbtKx0G7S0fCO0tHwjtLR8I7S0f
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0rHQbtMyUW7ZSO
g+39/f3ckouC8yESAP8qHAT/LyAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8vIAn/KhwE/yERAP+Si4LzMyUR7SocBP8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/yocBP8zJRLtKx0F7S4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0eCP8sGgX/KxoG/yka
B/8oGgf/KBoH/ygaB/8nGgf/KBoH/yweCP8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8rHQXtLR8I7S4g
Cf8tHwn/LR8J/y0fCf8tHwn/LRwH/y0aBf8wLRP/Ni8Q/0ExDv9FMw3/PjAN/z4vDv8/MA3/PS4N/ycZ
B/8qHAj/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHQf/LB8K/z6E
VP9NsnL/Wapi/3GoVv+bskv/x8VG/87FRP/PwkL/2cZB/6GMLf8tHwj/Kx0I/y0fCf8tHwn/LR8J/y4g
Cf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8sFgH/MkYn/0nIhP9Rt3L/WK9m/16nXf9jnlP/iKlK/8nO
S//T0Er/2M9H/+jYSv9XSRf/IxUF/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0f
Cf8sFQH/M0os/0vBfv9Tsm3/Wqxi/2OlWP9sn07/bJJD/5uuRP/M0k3/y81L/9nWTP9cTxv/IhQF/y0f
Cf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8rFQH/NEkq/02+e/9UsGr/Xalg/2Wj
Vv9unkz/dJRB/4ufPv+/01P/xM9O/8/XT/9YThr/IxQE/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4g
Cf8tHwn/LR8J/y0fCf8rFgH/NUkp/068ef9Xrmf/X6dc/2iiVP9wnUn/eI86/4ilRP+k3mL/tNVX/8ba
U/9WTxv/JBQE/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8rFgH/Nkgo/1K7
dv9ZrWT/YqRZ/2ycTf93kj//epU+/3bVa/+D53T/lN5n/63hYv9RTx//JRMD/y0fCf8tHwn/LR8J/y4g
Cf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8qFQL/NUop/1a6c/9cqWH/Yatd/2SwW/9gv2b/UeeE/1L4
kP9k7oL/dOh5/4vvdf9JViX/JxIC/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0f
Cf8rFwP/NT4e/1a5cP9N0H3/R+GI/0fwkv9F+5n/SPuY/0j7lv9J95H/VfaM/2f6iP88SyH/KhQC/y0f
Cf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHgj/LBUC/z6ETv9E6JL/Rd+L/0LG
ef9DwHP/QsR1/0LHdP9L4oX/T/aS/0KaV/8rFgT/LR4I/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4g
Cf8tHwn/LR8J/y0fCf8tHwn/Kw8A/zVgOv9F4pL/Rd+N/zJGJP8tEAD/LRoF/ywaBv9Lum3/VOeL/zle
M/8qDwD/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHwn/KxMA/zVX
Mf9F2I7/RtuO/zl3R/8qBQD/KQQA/zJDIv9F4Iv/RvCW/zVfNf8rEQD/LR8J/y0fCf8tHwn/LR8J/y4g
Cf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHwn/LBoF/zAtE/9Cv3//RNCJ/0TNhf86g1D/N29C/0LF
fP9G6JH/RNeF/y8wFP8sGQT/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/ywTAP82Yzv/QtKN/0PPif9F2I3/Rd2Q/0XekP9H5ZP/N2w//ysRAP8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0eCP8sFQH/NVs1/0Cu
dP9CxoT/RMqG/0O3dv83YTj/LBQB/y0eCP8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtLR8I7S4g
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHgj/LBMA/y4iC/8zPB7/Mj0e/y8hCv8rEgD/LR4I/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4gCf8tHwjtKx0F7S4gCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/ywcB/8sFwP/LBcD/ywcB/8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y4g
Cf8rHQbtNCUS7SocBP8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0f
Cf8tHwn/LR8J/y0fCf8tHwn/LR8J/y0fCf8tHwn/LR8J/yocBP80JhLtkouD8yERAP8qHAT/LyAJ/y4g
Cf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4gCf8uIAn/LiAJ/y4g
Cf8vIAn/KhwE/yERAP+VjITz/f393JSOhO00JhbtKx0G7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0f
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0rHQbtMyUW7ZSOg+39/f3cKAAAABAA
AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL65stw/MR/tKBkF7S0fCO0tHwjtLR8I7S0f
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0oGQXtPzEf7b65stw8MR3zJxgA/y8gCf8uIAn/LiAJ/y4g
Cf8uHwn/Lh8J/y4fCf8uHwn/LiAJ/y4gCf8uIAn/LyAJ/ycYAP88MR3zKBoE7S8gCf8tHwn/LSAJ/ywa
Bf8rFAH/LBcD/ysXBP8kFQT/IxUF/yATBP8oGgf/LiAJ/y0fCf8vIQn/KBkE7S0fCO0uIAn/LR8J/ywa
Bf8wMxj/QYNR/1OFSP94iTr/npg0/6aYM/+hji7/RDQP/ycaB/8tHwn/LiAJ/y0fCO0tHwjtLiAJ/y0f
Cf8rEQD/OW9F/1LNhP9dtGj/aahY/5u2TP/Z2U3/7+ZP/4V2KP8eEAT/LR8J/y4gCf8tHwjtLR8I7S4g
Cf8tHwn/KxIA/ztvRf9Tv3f/Xqhd/2ufT/91kj7/tMNK/9fgU/+AeSr/IBAD/y0fCf8uIAn/LR8I7S0f
CO0uIAn/LR8J/ysTAP89bUL/Vrxz/2OjWP9ylkX/fZQ7/5XTX/+952D/d3ot/yEQA/8tHwn/LiAJ/y0f
CO0tHwjtLiAJ/y0fCf8qEwD/P29C/1y6bv9iqlv/Z7Fa/1zad/9l8oX/ifZ6/2OGPP8lDgH/LR8J/y4g
Cf8tHwjtLR8I7S4gCf8tHwn/KhQB/zxULf9P0oD/SOSL/0b1lf9F/Jn/SPaS/1j7kP9DbTb/KRAB/y0f
Cf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0cB/8uIwz/QcuC/0HCef8zRSL/MD0e/0SmYP9M0n7/LSMN/ywc
Bv8tHwn/LiAJ/y0fCO0tHwjtLiAJ/y0fCf8tHQj/LRsG/0Cxc/9Ez4b/MDca/yweCf9Cxnr/Qsd6/y0b
Bv8tHQj/LR8J/y4gCf8tHwjtLR8I7S4gCf8tHwn/LR8J/ywUAf81XTf/RNiR/0TTiv9E1In/R+2Y/zZn
Ov8rEgH/LR8J/y0fCf8uIAn/LR8I7S0fCO0uIAn/LR8J/y0fCf8tHgj/LBcC/zRWMv8+nWb/P6Jo/zZb
NP8sFgL/LR4I/y0fCf8tHwn/LiAJ/y0fCO0oGgTtLyEJ/y0fCf8tHwn/LR8J/y0fCP8sFAH/LBYC/ywW
Av8rEwD/LR4I/y0fCf8tHwn/LR8J/y8hCf8oGQTtPTEd8ycYAP8vIAn/LiAJ/y4gCf8uIAn/LiAJ/y4f
CP8uHwn/LiAJ/y4gCf8uIAn/LiAJ/y8gCf8nGAD/PTEd87u5stw/MR/tKBkF7S0fCO0tHwjtLR8I7S0f
CO0tHwjtLR8I7S0fCO0tHwjtLR8I7S0fCO0oGQXtPzEf7b65stwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
</value>
</data>
</root>

View File

@@ -0,0 +1,377 @@
//----------------------
// <auto-generated>
// Generated using the NSwag toolchain v13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org)
// </auto-generated>
//----------------------
#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended."
#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword."
#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?'
#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ...
#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..."
#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'"
#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant"
namespace SecretServerAuthentication.DSS
{
using System = global::System;
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class OAuth2ServiceClient
{
private string _baseUrl = "";
private System.Net.Http.HttpClient _httpClient;
private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings;
public OAuth2ServiceClient(string baseUrl, System.Net.Http.HttpClient httpClient)
{
BaseUrl = baseUrl;
_httpClient = httpClient;
_settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings);
}
private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings()
{
var settings = new Newtonsoft.Json.JsonSerializerSettings();
UpdateJsonSerializerSettings(settings);
return settings;
}
public string BaseUrl
{
get { return _baseUrl; }
set { _baseUrl = value; }
}
protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } }
partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings);
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url);
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder);
partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response);
/// <summary>Retrieve or Refresh Access Token</summary>
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
/// <returns>Successful retrieval of an access token</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token, string OTP) => AuthorizeAsync(grant_type, username, password, refresh_token, System.Threading.CancellationToken.None, OTP);
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
/// <summary>Retrieve or Refresh Access Token</summary>
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
/// <returns>Successful retrieval of an access token</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public async System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token, System.Threading.CancellationToken cancellationToken, string OTP)
{
var urlBuilder_ = new System.Text.StringBuilder();
urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/oauth2/token");
var client_ = _httpClient;
var disposeClient_ = false;
try
{
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
var keyValues_ = new System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>>();
if (grant_type == null)
throw new System.ArgumentNullException("grant_type");
else
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("grant_type", ConvertToString(grant_type, System.Globalization.CultureInfo.InvariantCulture)));
if (username != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("username", ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture)));
if (password != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("password", ConvertToString(password, System.Globalization.CultureInfo.InvariantCulture)));
if (refresh_token != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("refresh_token", ConvertToString(refresh_token, System.Globalization.CultureInfo.InvariantCulture)));
if (OTP != null)
request_.Headers.Add("OTP", ConvertToString(OTP, System.Globalization.CultureInfo.InvariantCulture));
request_.Content = new System.Net.Http.FormUrlEncodedContent(keyValues_);
request_.Method = new System.Net.Http.HttpMethod("POST");
request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
PrepareRequest(client_, request_, urlBuilder_);
var url_ = urlBuilder_.ToString();
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
PrepareRequest(client_, request_, url_);
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
var disposeResponse_ = true;
try
{
var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
if (response_.Content != null && response_.Content.Headers != null)
{
foreach (var item_ in response_.Content.Headers)
headers_[item_.Key] = item_.Value;
}
ProcessResponse(client_, response_);
var status_ = (int)response_.StatusCode;
if (status_ == 200)
{
var objectResponse_ = await ReadObjectResponseAsync<TokenResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
return objectResponse_.Object;
}
else
if (status_ == 400)
{
var objectResponse_ = await ReadObjectResponseAsync<TokenErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<TokenErrorResponse>("An error occurred", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
{
var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
}
}
finally
{
if (disposeResponse_)
response_.Dispose();
}
}
}
finally
{
if (disposeClient_)
client_.Dispose();
}
}
protected struct ObjectResponseResult<T>
{
public ObjectResponseResult(T responseObject, string responseText)
{
this.Object = responseObject;
this.Text = responseText;
}
public T Object { get; }
public string Text { get; }
}
public bool ReadResponseAsString { get; set; }
protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Threading.CancellationToken cancellationToken)
{
if (response == null || response.Content == null)
{
return new ObjectResponseResult<T>(default(T), string.Empty);
}
if (ReadResponseAsString)
{
var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
try
{
var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseText, JsonSerializerSettings);
return new ObjectResponseResult<T>(typedBody, responseText);
}
catch (Newtonsoft.Json.JsonException exception)
{
var message = "Could not deserialize the response body string as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception);
}
}
else
{
try
{
using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
using (var streamReader = new System.IO.StreamReader(responseStream))
using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader))
{
var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings);
var typedBody = serializer.Deserialize<T>(jsonTextReader);
return new ObjectResponseResult<T>(typedBody, string.Empty);
}
}
catch (Newtonsoft.Json.JsonException exception)
{
var message = "Could not deserialize the response body stream as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception);
}
}
}
private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
{
return "";
}
if (value is System.Enum)
{
var name = System.Enum.GetName(value.GetType(), value);
if (name != null)
{
var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name);
if (field != null)
{
var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute))
as System.Runtime.Serialization.EnumMemberAttribute;
if (attribute != null)
{
return attribute.Value != null ? attribute.Value : name;
}
}
var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo));
return converted == null ? string.Empty : converted;
}
}
else if (value is bool)
{
return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant();
}
else if (value is byte[])
{
return System.Convert.ToBase64String((byte[])value);
}
else if (value.GetType().IsArray)
{
var array = System.Linq.Enumerable.OfType<object>((System.Array)value);
return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo)));
}
var result = System.Convert.ToString(value, cultureInfo);
return result == null ? "" : result;
}
}
/// <summary>API access token response</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public partial class TokenResponse
{
/// <summary>Authentication token</summary>
[Newtonsoft.Json.JsonProperty("access_token", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Access_token { get; set; }
/// <summary>Authentication token type</summary>
[Newtonsoft.Json.JsonProperty("token_type", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public TokenResponseToken_type Token_type { get; set; }
private string _Expires_in;
/// <summary>Authentication token expiration time, in seconds</summary>
[Newtonsoft.Json.JsonProperty("expires_in", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
// public string Expires_in { get; set; }
public string Expires_in
{
get { return _Expires_in; }
set
{
_Expires_in = value;
Expires_on = DateTime.UtcNow.AddSeconds(Double.Parse(value) - 60);
}
}
/// <summary>Authentication token expiration time in UTC</summary>
public DateTime Expires_on { get; set; }
/// <summary>Refresh token. This is only provided when the server is set to allow refresh tokens for web services and when the session timeout duration is not set to Unlimited.</summary>
[Newtonsoft.Json.JsonProperty("refresh_token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Refresh_token { get; set; }
}
/// <summary>API access token error response</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public partial class TokenErrorResponse
{
/// <summary>Authentication token</summary>
[Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Message { get; set; }
}
/// <summary>Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public enum Grant_type
{
[System.Runtime.Serialization.EnumMember(Value = @"password")]
Password = 0,
[System.Runtime.Serialization.EnumMember(Value = @"refresh_token")]
Refresh_token = 1,
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public enum TokenResponseToken_type
{
[System.Runtime.Serialization.EnumMember(Value = @"bearer")]
Bearer = 0,
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class ApiException : System.Exception
{
public int StatusCode { get; private set; }
public string Response { get; private set; }
public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Exception innerException)
: base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException)
{
StatusCode = statusCode;
Response = response;
Headers = headers;
}
public override string ToString() => string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString());
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class ApiException<TResult> : ApiException
{
public TResult Result { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, TResult result, System.Exception innerException)
: base(message, statusCode, response, headers, innerException)
{
Result = result;
}
}
}
#pragma warning restore 1591
#pragma warning restore 1573
#pragma warning restore 472
#pragma warning restore 114
#pragma warning restore 108
#pragma warning restore 3016

View File

@@ -0,0 +1,335 @@
using Microsoft.Win32;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
using SecretServerAuthentication.DSS;
using SecretServerRestClient.DSS;
using System.Security.Cryptography;
namespace ExternalConnectors.DSS;
public class SecretServerInterface
{
private static class SSConnectionData
{
public static string ssUsername = "";
public static string ssPassword = "";
public static string ssUrl = "";
public static string ssOTP = "";
public static bool ssSSO = false;
public static bool initdone = false;
//token
public static string ssTokenBearer = "";
public static DateTime ssTokenExpiresOn = DateTime.UtcNow;
public static string ssTokenRefresh = "";
public static void Init()
{
if (initdone == true)
return;
RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteSSInterface");
try
{
// display gui and ask for data
SSConnectionForm f = new();
string? un = key.GetValue("Username") as string;
f.tbUsername.Text = un ?? "";
f.tbPassword.Text = SSConnectionData.ssPassword; // in OTP refresh cases, this value might already be filled
string? url = key.GetValue("URL") as string;
if (url == null || !url.Contains("://"))
url = "https://cred.domain.local/SecretServer";
f.tbSSURL.Text = url;
var b = key.GetValue("SSO");
if (b == null || (string)b != "True")
ssSSO = false;
else
ssSSO = true;
f.cbUseSSO.Checked = ssSSO;
// show dialog
while (true)
{
_ = f.ShowDialog();
if (f.DialogResult != DialogResult.OK)
return;
// store values to memory
ssUsername = f.tbUsername.Text;
ssPassword = f.tbPassword.Text;
ssUrl = f.tbSSURL.Text;
ssSSO = f.cbUseSSO.Checked;
ssOTP = f.tbOTP.Text;
// check connection first
try
{
if (TestCredentials() == true)
{
initdone = true;
break;
}
}
catch (Exception)
{
MessageBox.Show("Test Credentials failed - please check your credentials");
}
}
// write values to registry
key.SetValue("Username", ssUsername);
key.SetValue("URL", ssUrl);
key.SetValue("SSO", ssSSO);
}
catch (Exception)
{
throw;
}
finally
{
key.Close();
}
}
}
private static bool TestCredentials()
{
if (SSConnectionData.ssSSO)
{
// checking creds doesn't really make sense here, as we can't modify them anyway if something is wrong
return true;
}
else
{
if (!String.IsNullOrEmpty(GetToken()))
{
return true;
}
else
{
return false;
}
}
}
private static SecretsServiceClient ConstructSecretsServiceClient()
{
string baseURL = SSConnectionData.ssUrl;
if (SSConnectionData.ssSSO)
{
// REQUIRES IIS CONFIG! https://docs.thycotic.com/ss/11.0.0/api-scripting/webservice-iwa-powershell
var handler = new HttpClientHandler() { UseDefaultCredentials = true };
var httpClient = new HttpClient(handler);
{
// Call REST API:
return new SecretsServiceClient($"{baseURL}/winauthwebservices/api", httpClient);
}
}
else
{
var httpClient = new HttpClient();
{
var token = GetToken();
// Set credentials (token):
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
// Call REST API:
return new SecretsServiceClient($"{baseURL}/api", httpClient);
}
}
}
private static void FetchSecret(int secretID, out string secretUsername, out string secretPassword, out string secretDomain, out string privatekey)
{
var client = ConstructSecretsServiceClient();
SecretModel secret = client.GetSecretAsync(false, true, secretID, null).Result;
// clear return variables
secretDomain = "";
secretUsername = "";
secretPassword = "";
privatekey = "";
string privatekeypassphrase = "";
// parse data and extract what we need
foreach (var item in secret.Items)
{
if (item.FieldName.ToLower().Equals("domain"))
secretDomain = item.ItemValue;
else if (item.FieldName.ToLower().Equals("username"))
secretUsername = item.ItemValue;
else if (item.FieldName.ToLower().Equals("password"))
secretPassword = item.ItemValue;
else if (item.FieldName.ToLower().Equals("private key"))
{
client.ReadResponseNoJSONConvert = true;
privatekey = client.GetFieldAsync(false, false, secretID, "private-key").Result;
client.ReadResponseNoJSONConvert = false;
}
else if (item.FieldName.ToLower().Equals("private key passphrase"))
privatekeypassphrase = item.ItemValue;
}
// need to decode the private key?
if (!string.IsNullOrEmpty(privatekeypassphrase))
{
try
{
var key = DecodePrivateKey(privatekey, privatekeypassphrase);
privatekey = key;
}
catch(Exception)
{
}
}
// conversion to putty format necessary?
if (!string.IsNullOrEmpty(privatekey) && !privatekey.StartsWith("PuTTY-User-Key-File-2"))
{
try
{
RSACryptoServiceProvider key = ImportPrivateKey(privatekey);
privatekey = PuttyKeyFileGenerator.ToPuttyPrivateKey(key);
}
catch (Exception)
{
}
}
}
#region PUTTY KEY HANDLING
// decode rsa private key with encryption password
private static string DecodePrivateKey(string encryptedPrivateKey, string password)
{
TextReader textReader = new StringReader(encryptedPrivateKey);
PemReader pemReader = new(textReader, new PasswordFinder(password));
AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
TextWriter textWriter = new StringWriter();
var pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(keyPair.Private);
pemWriter.Writer.Flush();
return ""+textWriter.ToString();
}
private class PasswordFinder(string password) : IPasswordFinder
{
private string password = password;
public char[] GetPassword()
{
return password.ToCharArray();
}
}
// read private key pem string to rsacryptoserviceprovider
public static RSACryptoServiceProvider ImportPrivateKey(string pem)
{
PemReader pr = new(new StringReader(pem));
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);
RSACryptoServiceProvider rsa = new();
rsa.ImportParameters(rsaParams);
return rsa;
}
#endregion
#region TOKEN
private static string GetToken()
{
// if there is no token, fetch a fresh one
if (String.IsNullOrEmpty(SSConnectionData.ssTokenBearer))
{
return GetTokenFresh();
}
// if there is a token, check if it is valid
if (SSConnectionData.ssTokenExpiresOn >= DateTime.UtcNow)
{
return SSConnectionData.ssTokenBearer;
}
else
{
// try using refresh token
using (var httpClient = new HttpClient())
{
var tokenClient = new OAuth2ServiceClient(SSConnectionData.ssUrl, httpClient);
TokenResponse token = new();
try
{
token = tokenClient.AuthorizeAsync(Grant_type.Refresh_token, null, null, SSConnectionData.ssTokenRefresh, null).Result;
var tokenResult = token.Access_token;
SSConnectionData.ssTokenBearer = tokenResult;
SSConnectionData.ssTokenRefresh = token.Refresh_token;
SSConnectionData.ssTokenExpiresOn = token.Expires_on;
return tokenResult;
}
catch (Exception)
{
// refresh token failed. clean memory and start fresh
SSConnectionData.ssTokenBearer = "";
SSConnectionData.ssTokenRefresh = "";
SSConnectionData.ssTokenExpiresOn = DateTime.Now;
// if OTP is required we need to ask user for a new OTP
if (!String.IsNullOrEmpty(SSConnectionData.ssOTP))
{
SSConnectionData.initdone = false;
// the call below executes a connection test, which fetches a valid token
SSConnectionData.Init();
// we now have a fresh token in memory. return it to caller
return SSConnectionData.ssTokenBearer;
}
else
{
// no user interaction required. get a fresh token and return it to caller
return GetTokenFresh();
}
}
}
}
}
static string GetTokenFresh()
{
using (var httpClient = new HttpClient())
{
// Authenticate:
var tokenClient = new OAuth2ServiceClient(SSConnectionData.ssUrl, httpClient);
// call below will throw an exception if the creds are invalid
var token = tokenClient.AuthorizeAsync(Grant_type.Password, SSConnectionData.ssUsername, SSConnectionData.ssPassword, null, SSConnectionData.ssOTP).Result;
// here we can be sure the creds are ok - return success state
var tokenResult = token.Access_token;
SSConnectionData.ssTokenBearer = tokenResult;
SSConnectionData.ssTokenRefresh = token.Refresh_token;
SSConnectionData.ssTokenExpiresOn = token.Expires_on;
return tokenResult;
}
}
#endregion
// input must be the secret id to fetch
public static void FetchSecretFromServer(string input, out string username, out string password, out string domain, out string privatekey)
{
// get secret id
int secretID = Int32.Parse(input);
// init connection credentials, display popup if necessary
SSConnectionData.Init();
// get the secret
FetchSecret(secretID, out username, out password, out domain, out privatekey);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows10.0.26100.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Library</OutputType>
<UseWindowsForms>True</UseWindowsForms>
<Platforms>x64;arm64</Platforms>
<Configurations>Debug;Release;Debug Portable;Release Portable;Deploy to github</Configurations>
<SupportedOSPlatformVersion>10.0.26100.0</SupportedOSPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Portable|x64'">
<Optimize>True</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Portable|arm64'">
<Optimize>True</Optimize>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AWSSDK.Core" />
<PackageReference Include="AWSSDK.EC2" />
<PackageReference Include="BouncyCastle.Cryptography" />
<PackageReference Include="Newtonsoft.Json" />
</ItemGroup>
<ItemGroup>
<Compile Update="AWS\AWSConnectionForm.cs" />
<Compile Update="CPS\CPSConnectionForm.cs" />
<Compile Update="DSS\SSConnectionForm.cs" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,111 @@
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace ExternalConnectors;
public class PuttyKeyFileGenerator
{
private const int prefixSize = 4;
private const int paddedPrefixSize = prefixSize + 1;
private const int lineLength = 64;
private const string keyType = "ssh-rsa";
private const string encryptionType = "none";
public static string ToPuttyPrivateKey(RSACryptoServiceProvider cryptoServiceProvider, string Comment = "imported-openssh-key")
{
var publicParameters = cryptoServiceProvider.ExportParameters(false);
byte[] publicBuffer = new byte[3 + keyType.Length + GetPrefixSize(publicParameters.Exponent) + publicParameters.Exponent!.Length + GetPrefixSize(publicParameters.Modulus) + publicParameters.Modulus!.Length + 1];
using (var bw = new BinaryWriter(new MemoryStream(publicBuffer)))
{
bw.Write(new byte[] { 0x00, 0x00, 0x00 });
bw.Write(Encoding.ASCII.GetBytes(keyType));
PutPrefixed(bw, publicParameters.Exponent, CheckIsNeddPadding(publicParameters.Exponent));
PutPrefixed(bw, publicParameters.Modulus, CheckIsNeddPadding(publicParameters.Modulus));
}
var publicBlob = System.Convert.ToBase64String(publicBuffer);
var privateParameters = cryptoServiceProvider.ExportParameters(true);
byte[] privateBuffer = new byte[paddedPrefixSize + privateParameters.D!.Length + paddedPrefixSize + privateParameters.P!.Length + paddedPrefixSize + privateParameters.Q!.Length + paddedPrefixSize + privateParameters.InverseQ!.Length];
using (var bw = new BinaryWriter(new MemoryStream(privateBuffer)))
{
PutPrefixed(bw, privateParameters.D, true);
PutPrefixed(bw, privateParameters.P, true);
PutPrefixed(bw, privateParameters.Q, true);
PutPrefixed(bw, privateParameters.InverseQ, true);
}
var privateBlob = System.Convert.ToBase64String(privateBuffer);
HMACSHA1 hmacSha1 = new(SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes("putty-private-key-file-mac-key")));
byte[] bytesToHash = new byte[prefixSize + keyType.Length + prefixSize + encryptionType.Length + prefixSize + Comment.Length + prefixSize + publicBuffer.Length + prefixSize + privateBuffer.Length];
using (var bw = new BinaryWriter(new MemoryStream(bytesToHash)))
{
PutPrefixed(bw, Encoding.ASCII.GetBytes(keyType));
PutPrefixed(bw, Encoding.ASCII.GetBytes(encryptionType));
PutPrefixed(bw, Encoding.ASCII.GetBytes(Comment));
PutPrefixed(bw, publicBuffer);
PutPrefixed(bw, privateBuffer);
}
var hash = string.Join("", hmacSha1.ComputeHash(bytesToHash).Select(x => $"{x:x2}"));
var sb = new StringBuilder();
sb.AppendLine("PuTTY-User-Key-File-2: " + keyType);
sb.AppendLine("Encryption: " + encryptionType);
sb.AppendLine("Comment: " + Comment);
var publicLines = SpliceText(publicBlob, lineLength);
sb.AppendLine("Public-Lines: " + publicLines.Length);
foreach (var line in publicLines)
{
sb.AppendLine(line);
}
var privateLines = SpliceText(privateBlob, lineLength);
sb.AppendLine("Private-Lines: " + privateLines.Length);
foreach (var line in privateLines)
{
sb.AppendLine(line);
}
sb.AppendLine("Private-MAC: " + hash);
return sb.ToString();
}
private static void PutPrefixed(BinaryWriter bw, byte[] bytes, bool addLeadingNull = false)
{
bw.Write(BitConverter.GetBytes(bytes.Length + (addLeadingNull ? 1 : 0)).Reverse().ToArray());
if (addLeadingNull)
bw.Write(new byte[] { 0x00 });
bw.Write(bytes);
}
private static string[] SpliceText(string text, int lineLength)
{
return Regex.Matches(text, ".{1," + lineLength + "}").Cast<Match>().Select(m => m.Value).ToArray();
}
private static int GetPrefixSize(byte[]? bytes)
{
if (bytes is null)
return 0;
return CheckIsNeddPadding(bytes) ? paddedPrefixSize : prefixSize;
}
private static bool CheckIsNeddPadding(byte[] bytes)
{
if (bytes is null || bytes.Length == 0)
return false;
// 128 == 10000000
// This means that the number of bits can be divided by 8.
// According to the algorithm in putty, you need to add a padding.
return bytes[0] >= 128;
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,296 +0,0 @@
; ---------------------
; DotNetVer.nsh
; Written by: David Grinberg
; Homepage: http://ontheperiphery.veraida.com/
; Updated By: Brandon Hansen (http://www.remotehams.com/)
; ---------------------
;
; LogicLib extensions for checking Microsoft .NET Framework versions and service packs.
;
; Latests Updates by Brandon Hansen, KG6YPI (RemoteHams.com)
; Dec 26, 2011 - .NET Framework 4.0 detection fixes - client profile not being found
; Dec 07, 2010 - .NET Framework 4.0 detection added by Brandon Hansen (KG6YPI)
;
; Usage examples:
;
; ${If} ${HasDotNet4.0}
; DetailPrint "Microsoft .NET Framework 4.0 installed."
; ${If} ${DOTNETVER_4_0} AtLeastDotNetServicePack 1
; DetailPrint "Microsoft .NET Framework 4.0 is at least SP1."
; ${Else}
; DetailPrint "Microsoft .NET Framework 4.0 SP1 not installed."
; ${EndIf}
; ${If} ${DOTNETVER_4_0} HasDotNetClientProfile 1
; DetailPrint "Microsoft .NET Framework 4.0 (Client Profile) available."
; ${EndIf}
; ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 1
; DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) available."
; ${EndIf}
; ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 0
; DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) not available."
; ${EndIf}
; ${EndIf}
!verbose push
!verbose 3
!ifndef ___DOTNETVER__NSH___
!define ___DOTNETVER__NSH___
!include LogicLib.nsh
!include Util.nsh
# constants
!define DOTNETVER_1_0 "1.0"
!define DOTNETVER_1_1 "1.1"
!define DOTNETVER_2_0 "2.0"
!define DOTNETVER_3_0 "3.0"
!define DOTNETVER_3_5 "3.5"
!define DOTNETVER_4_0 "4.0"
# variable declaration
Var /GLOBAL __DONTNET_FOUNDVER
!macro __DotNetVer_DeclareVars
!ifndef __DOTNETVER_VARS_DECLARED
!define __DOTNETVER_VARS_DECLARED
Var /GLOBAL __DOTNET_1.0
Var /GLOBAL __DOTNET_1.1
Var /GLOBAL __DOTNET_2.0
Var /GLOBAL __DOTNET_3.0
Var /GLOBAL __DOTNET_3.5
Var /GLOBAL __DOTNET_4.0
Var /GLOBAL __DOTNETVER_1.0_SP
Var /GLOBAL __DOTNETVER_1.1_SP
Var /GLOBAL __DOTNETVER_2.0_SP
Var /GLOBAL __DOTNETVER_3.0_SP
Var /GLOBAL __DOTNETVER_3.5_SP
Var /GLOBAL __DOTNETVER_4.0_SP
Var /GLOBAL __DOTNET_1.0_CLIENT
Var /GLOBAL __DOTNET_1.1_CLIENT
Var /GLOBAL __DOTNET_2.0_CLIENT
Var /GLOBAL __DOTNET_3.0_CLIENT
Var /GLOBAL __DOTNET_3.5_CLIENT
Var /GLOBAL __DOTNET_4.0_CLIENT
Var /GLOBAL __DOTNET_1.0_FULL
Var /GLOBAL __DOTNET_1.1_FULL
Var /GLOBAL __DOTNET_2.0_FULL
Var /GLOBAL __DOTNET_3.0_FULL
Var /GLOBAL __DOTNET_3.5_FULL
Var /GLOBAL __DOTNET_4.0_FULL
StrCpy $__DOTNET_1.0 0
StrCpy $__DOTNET_1.1 0
StrCpy $__DOTNET_2.0 0
StrCpy $__DOTNET_3.0 0
StrCpy $__DOTNET_3.5 0
StrCpy $__DOTNET_4.0 0
StrCpy $__DOTNETVER_1.0_SP 0
StrCpy $__DOTNETVER_1.1_SP 0
StrCpy $__DOTNETVER_2.0_SP 0
StrCpy $__DOTNETVER_3.0_SP 0
StrCpy $__DOTNETVER_3.5_SP 0
StrCpy $__DOTNETVER_4.0_SP 0
StrCpy $__DOTNET_1.0_CLIENT 0
StrCpy $__DOTNET_1.1_CLIENT 0
StrCpy $__DOTNET_2.0_CLIENT 0
StrCpy $__DOTNET_3.0_CLIENT 0
StrCpy $__DOTNET_3.5_CLIENT 0
StrCpy $__DOTNET_4.0_CLIENT 0
StrCpy $__DOTNET_1.0_FULL 0
StrCpy $__DOTNET_1.1_FULL 0
StrCpy $__DOTNET_2.0_FULL 0
StrCpy $__DOTNET_3.0_FULL 0
StrCpy $__DOTNET_3.5_FULL 0
StrCpy $__DOTNET_4.0_FULL 0
!endif
!macroend
# lazy initialization macro
!macro __DotNetVer_InitVars
# only calculate version once
StrCmp $__DONTNET_FOUNDVER "" dotnetver.noveryet
Return
dotnetver.noveryet:
!insertmacro __DotNetVer_DeclareVars
Push $0 ;registry count
Push $1 ;registry key
Push $2 ;version number
Push $3 ;installed
Push $4 ;service pack number
Push $8 ;strLen helper var
StrCpy $0 0
dotnetver.startenum:
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0
StrCmp $1 "" dotnetver.done
IntOp $0 $0 + 1
StrCpy $2 $1 1 0
StrCmp $2 "v" +1 dotnetver.startenum
StrCpy $2 $1 3 1
; Check for .NET 1.0 to 3.5
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\$1" "Install"
ReadRegDWORD $4 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\$1" "SP"
IntCmp $3 1 dotnetcheck.skipalt
; Alternate check for versions that don't set the Install key
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\$1\Setup" "InstallSuccess"
dotnetcheck.skipalt:
; This is a sanity check that works on .NET 1.0 to 3.5
; if it fails check for dotnet 4
IntCmp $3 0 dotnetcheck.40
StrCmp $2 ${DOTNETVER_1_0} dotnetver.10
StrCmp $2 ${DOTNETVER_1_1} dotnetver.11
StrCmp $2 ${DOTNETVER_2_0} dotnetver.20
StrCmp $2 ${DOTNETVER_3_0} dotnetver.30
StrCmp $2 ${DOTNETVER_3_5} dotnetver.35
dotnetcheck.40:
StrCmp $2 ${DOTNETVER_4_0} dotnetver.40
StrCmp $2 "4" dotnetver.40
Goto dotnetver.startenum
dotnetver.10:
StrCpy $__DOTNET_1.0 1
StrCpy $__DOTNETVER_1.0_SP $4
StrCpy $__DOTNET_1.0_FULL 1
Goto dotnetver.startenum
dotnetver.11:
StrCpy $__DOTNET_1.1 1
StrCpy $__DOTNETVER_1.1_SP $4
StrCpy $__DOTNET_1.1_FULL 1
Goto dotnetver.startenum
dotnetver.20:
StrCpy $__DOTNET_2.0 1
StrCpy $__DOTNETVER_2.0_SP $4
StrCpy $__DOTNET_2.0_FULL 1
Goto dotnetver.startenum
dotnetver.30:
StrCpy $__DOTNET_3.0 1
StrCpy $__DOTNETVER_3.0_SP $4
StrCpy $__DOTNET_3.0_FULL 1
Goto dotnetver.startenum
dotnetver.35:
StrCpy $__DOTNET_3.5 1
StrCpy $__DOTNETVER_3.5_SP $4
StrCpy $__DOTNET_3.5_FULL 1
Goto dotnetver.startenum
dotnetver.40:
; Check for .NET 4.0 (Full Profile)
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
ReadRegDWORD $4 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "SP"
StrLen $8 $3
IntCmp $8 0 dotnetcheck.40c
IntCmp $3 0 dotnetcheck.40c
StrCmp $2 ${DOTNETVER_4_0} dotnetver.40_Full
StrCmp $2 "4" dotnetver.40_Full
dotnetcheck.40c:
; Check for .NET 4.0 (Client Profile)
ReadRegDWORD $3 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Install"
ReadRegDWORD $4 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "SP"
StrLen $8 $3
IntCmp $8 0 dotnetver.startenum
IntCmp $3 0 dotnetver.startenum
StrCmp $2 ${DOTNETVER_4_0} dotnetver.40_Client
StrCmp $2 "4" dotnetver.40_Client
Goto dotnetver.startenum
dotnetver.40_Full:
StrCpy $__DOTNET_4.0 1
StrCpy $__DOTNETVER_4.0_SP $4
StrCpy $__DOTNET_4.0_FULL 1
Goto dotnetcheck.40c ; continue looking for other profiles
dotnetver.40_Client:
StrCpy $__DOTNET_4.0 1
StrCpy $__DOTNETVER_4.0_SP $4
StrCpy $__DOTNET_4.0_CLIENT 1
Goto dotnetver.startenum
dotnetver.done:
StrCpy $__DONTNET_FOUNDVER "1"
Pop $8
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
!macroend
!macro _HasDotNet _a _b _t _f
${CallArtificialFunction} __DotNetVer_InitVars
!insertmacro _= `$__DOTNET_${_b}` `1` `${_t}` `${_f}`
!macroend
!macro __DotNetVer_DefineTest Ver
!define HasDotNet${Ver} `"" HasDotNet ${Ver}`
!macroend
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_1_0}
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_1_1}
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_2_0}
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_3_0}
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_3_5}
!insertmacro __DotNetVer_DefineTest ${DOTNETVER_4_0}
!macro _AtLeastDotNetServicePack _a _b _t _f
${CallArtificialFunction} __DotNetVer_InitVars
!insertmacro _>= `$__DOTNETVER_${_a}_SP` `${_b}` `${_t}` `${_f}`
!macroend
!define AtLeastDotNetServicePack `AtLeastDotNetServicePack`
!macro _AtMostDotNetServicePack _a _b _t _f
${CallArtificialFunction} __DotNetVer_InitVars
!insertmacro _<= `$__DOTNETVER_${_a}_SP` `${_b}` `${_t}` `${_f}`
!macroend
!define AtMostDotNetServicePack `AtMostDotNetServicePack`
!macro _IsDotNetServicePack _a _b _t _f
${CallArtificialFunction} __DotNetVer_InitVars
!insertmacro _= `$__DOTNETVER_${_a}_SP` `${_b}` `${_t}` `${_f}`
!macroend
!define IsDotNetServicePack `IsDotNetServicePack`
!macro _HasDotNetClientProfile _a _b _t _f
${CallArtificialFunction} __DotNetVer_InitVars
!insertmacro _= `$__DOTNET_${_a}_CLIENT` `${_b}` `${_t}` `${_f}`
!macroend
!define HasDotNetClientProfile `HasDotNetClientProfile`
!macro _HasDotNetFullProfile _a _b _t _f
${CallArtificialFunction} __DotNetVer_InitVars
!insertmacro _= `$__DOTNET_${_a}_FULL` `${_b}` `${_t}` `${_f}`
!macroend
!define HasDotNetFullProfile `HasDotNetFullProfile`
# done
!endif # !___DOTNETVER__NSH___
!verbose pop

View File

@@ -1,22 +0,0 @@
; Czech installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_CZECH} "mRemoteNG run CZECH message"
; Installer Language
LangString InstallerLanguage ${LANG_CZECH} "Installer Language"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_CZECH} "Please select the language of the installer"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_CZECH} "mRemoteNG requires Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_CZECH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
; Start Menu items
LangString CreditsLinkName ${LANG_CZECH} "Credits"
LangString CopyingLinkName ${LANG_CZECH} "License"
LangString UninstallLinkName ${LANG_CZECH} "Uninstall"
LangString ChangeLogLinkName ${LANG_CZECH} "Version History"

View File

@@ -1,22 +0,0 @@
; Dutch installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_DUTCH} "mRemoteNG run DUTCH message"
; Installer Language
LangString InstallerLanguage ${LANG_DUTCH} "Installer Language"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_DUTCH} "Please select the language of the installer"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_DUTCH} "mRemoteNG requires Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_DUTCH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
; Start Menu items
LangString CreditsLinkName ${LANG_DUTCH} "Credits"
LangString CopyingLinkName ${LANG_DUTCH} "License"
LangString UninstallLinkName ${LANG_DUTCH} "Uninstall"
LangString ChangeLogLinkName ${LANG_DUTCH} "Version History"

View File

@@ -1,22 +0,0 @@
; English installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_ENGLISH} "Launch mRemoteNG Now"
; Installer Language
LangString InstallerLanguage ${LANG_ENGLISH} "Installer Language"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_ENGLISH} "Please select the language of the installer"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_ENGLISH} "mRemoteNG requires Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_ENGLISH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
; Start Menu items
LangString CreditsLinkName ${LANG_ENGLISH} "Credits"
LangString CopyingLinkName ${LANG_ENGLISH} "License"
LangString UninstallLinkName ${LANG_ENGLISH} "Uninstall"
LangString ChangeLogLinkName ${LANG_ENGLISH} "Version History"

View File

@@ -1,22 +0,0 @@
; French installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_FRENCH} "mRemoteNG run FRENCH message"
; Installer Language
LangString InstallerLanguage ${LANG_FRENCH} "Installer Language"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_FRENCH} "Please select the language of the installer"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_FRENCH} "mRemoteNG requires Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_FRENCH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
; Start Menu items
LangString CreditsLinkName ${LANG_FRENCH} "Credits"
LangString CopyingLinkName ${LANG_FRENCH} "License"
LangString UninstallLinkName ${LANG_FRENCH} "Uninstall"
LangString ChangeLogLinkName ${LANG_FRENCH} "Version History"

View File

@@ -1,22 +0,0 @@
; German installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_GERMAN} "mRemoteNG jetzt Starten"
; Installer Language
LangString InstallerLanguage ${LANG_GERMAN} "Installationsprogamm Sprache"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_GERMAN} "Bitte w<>hlen Sie die Sprache f<>r das Installationsprogramm"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_GERMAN} "mRemoteNG ben<65>tigt das Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_GERMAN} "Sie m<>ssen Mitglied der Grupper 'Power Users' or 'Administratoren' sein, damit Sie mRemoteNG installieren k<>nnen."
; Start Menu items
LangString CreditsLinkName ${LANG_GERMAN} "Credits"
LangString CopyingLinkName ${LANG_GERMAN} "License"
LangString UninstallLinkName ${LANG_GERMAN} "Uninstall"
LangString ChangeLogLinkName ${LANG_GERMAN} "Version History"

View File

@@ -1,31 +0,0 @@
!define LanguageNameEnglish "English"
!insertmacro MUI_LANGUAGE "English"
!include "Language\english.nsi"
!define LanguageNameCzech "Čeština"
!insertmacro MUI_LANGUAGE "Czech"
!include "Language\czech.nsi"
!define LanguageNameGerman "Deutsch"
!insertmacro MUI_LANGUAGE "German"
!include "Language\german.nsi"
!define LanguageNameSpanish "Español"
!insertmacro MUI_LANGUAGE "Spanish"
!include "Language\spanish.nsi"
!define LanguageNameFrench "Français"
!insertmacro MUI_LANGUAGE "French"
!include "Language\french.nsi"
!define LanguageNameDutch "Nederlands"
!insertmacro MUI_LANGUAGE "Dutch"
!include "Language\dutch.nsi"
!define LanguageNamePolish "Polski"
!insertmacro MUI_LANGUAGE "Polish"
!include "Language\polish.nsi"
!define LanguageNameThai "ภาษาไทย"
!insertmacro MUI_LANGUAGE "Thai"
!include "Language\thai.nsi"

View File

@@ -1,22 +0,0 @@
; Polish installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_POLISH} "mRemoteNG run POLISH message"
; Installer Language
LangString InstallerLanguage ${LANG_POLISH} "Installer Language"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_POLISH} "Please select the language of the installer"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_POLISH} "mRemoteNG requires Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_POLISH} "You must be a member of the 'Power Users' or 'Administrators' group to install mRemoteNG."
; Start Menu items
LangString CreditsLinkName ${LANG_POLISH} "Credits"
LangString CopyingLinkName ${LANG_POLISH} "License"
LangString UninstallLinkName ${LANG_POLISH} "Uninstall"
LangString ChangeLogLinkName ${LANG_POLISH} "Version History"

View File

@@ -1,22 +0,0 @@
; Spanish installer translation
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_SPANISH} "Iniciando de mRemoteNG"
; Installer Language
LangString InstallerLanguage ${LANG_SPANISH} "Lenguaje de Instalación"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_SPANISH} "Seleccione el lenguaje de instalación"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_SPANISH} "mRemoteNG requiere Microsoft .NET Framework 3.0."
; User needs to be Admin
LangString RequiresAdminUser ${LANG_SPANISH} "Debe ser miembro del grupo 'Administradores' para poder instalar mRemoteNG."
; Start Menu items
LangString CreditsLinkName ${LANG_SPANISH} "Créditos"
LangString CopyingLinkName ${LANG_SPANISH} "Licencia"
LangString UninstallLinkName ${LANG_SPANISH} "Desinstalar"
LangString ChangeLogLinkName ${LANG_SPANISH} "Historial de Versiones"

View File

@@ -1,23 +0,0 @@
; Thai installer translation
; Contributed by Apisitt Rattana
; Start mRemoteNG after installation
LangString LaunchMremoteNow ${LANG_THAI} "ขณะนี้กำลังติดตั้ง mRemoteNG"
; Installer Language
LangString InstallerLanguage ${LANG_THAI} "ภาษาสำหรับการติดตั้ง"
; Select installer Language
LangString SelectInstallerLanguage ${LANG_THAI} "กรุณาเลือกภาษาสำหรับการติดตั้ง"
; Requires .NET Framework
LangString RequiresNetFramework ${LANG_THAI} "mRemoteNG มีความต้องการ Microsoft .NET Framework 3.0. เป็นพื้นฐาน"
; User needs to be Admin
LangString RequiresAdminUser ${LANG_THAI} "คุณต้องเป็นสมาชิกในกลุ่มของ 'Power Users' หรือ 'Administrators' เพื่อการติดตั้ง mRemoteNG"
; Start Menu items
LangString CreditsLinkName ${LANG_THAI} "Credits"
LangString CopyingLinkName ${LANG_THAI} "License"
LangString UninstallLinkName ${LANG_THAI} "Uninstall"
LangString ChangeLogLinkName ${LANG_THAI} "Version History"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

View File

@@ -1,197 +0,0 @@
!include "MUI.nsh"
!include "WordFunc.nsh"
!insertmacro VersionCompare
!include "DotNetVer.nsh"
!include "..\Release\Version.nsh"
; This will be passed in using the /D switch by BUILD.CMD
!ifdef PRODUCT_VERSION_TAG
!define PRODUCT_VERSION_FRIENDLY "${PRODUCT_VERSION_SHORT}"
!define PRODUCT_VERSION_TAGGED "${PRODUCT_VERSION_SHORT}-${PRODUCT_VERSION_TAG}"
!else
!define PRODUCT_VERSION_FRIENDLY "${PRODUCT_VERSION_SHORT}"
!define PRODUCT_VERSION_TAGGED "${PRODUCT_VERSION_SHORT}"
!endif
; Basic Config
Name "mRemoteNG ${PRODUCT_VERSION_FRIENDLY}"
OutFile "..\Release\mRemoteNG-Installer-${PRODUCT_VERSION_TAGGED}.exe"
SetCompressor /SOLID lzma
InstallDir "$PROGRAMFILES\mRemoteNG"
InstallDirRegKey HKLM "Software\mRemoteNG" "InstallPath"
RequestExecutionLevel admin
; Version Information
VIProductVersion ${PRODUCT_VERSION}
VIAddVersionKey "CompanyName" "Next Generation Software"
VIAddVersionKey "ProductName" "mRemoteNG"
VIAddVersionKey "ProductVersion" ${PRODUCT_VERSION}
VIAddVersionKey "LegalCopyright" "Copyright © 2007-2009 Felix Deimel, 2010-2013 Riley McArdle"
VIAddVersionKey "FileDescription" "mRemoteNG ${PRODUCT_VERSION_FRIENDLY} Installer"
VIAddVersionKey "FileVersion" ${PRODUCT_VERSION}
; Design
!define MUI_ICON "Setup_Install.ico"
!define MUI_UNICON "RecycleBin.ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "header.bmp" ; optional
!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH
!define MUI_HEADERIMAGE_UNBITMAP "header.bmp" ; optional
!define MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
!define MUI_HEADER_TRANSPARENT_TEXT
!define MUI_WELCOMEFINISHPAGE_BITMAP "welcomefinish.bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "welcomefinish.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
; Install Pages
!insertmacro MUI_PAGE_LICENSE "..\COPYING.TXT"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_NOAUTOCLOSE
; Finish Page
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!define MUI_FINISHPAGE_RUN "$INSTDIR\mRemoteNG.exe"
!insertmacro MUI_PAGE_FINISH
; Uninstall Pages
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; Get Languages
!include "Language\languages.nsi"
; Set finish page text
!define MUI_FINISHPAGE_RUN_Text "$(LaunchMremoteNow)"
Function .onInit
ClearErrors
UserInfo::GetName
IfErrors Win9x
Pop $0
UserInfo::GetAccountType
Pop $1
# GetOriginalAccountType will check the tokens of the original user of the
# current thread/process. If the user tokens were elevated or limited for
# this process, GetOriginalAccountType will return the non-restricted
# account type.
# On Vista with UAC, for example, this is not the same value when running
# with `RequestExecutionLevel user`. GetOriginalAccountType will return
# "admin" while GetAccountType will return "user".
StrCmp $1 "Admin" 0 +3
Goto doit
StrCmp $1 "Power" 0 +3
Goto doit
StrCmp $1 "User" 0 +3
Goto noop
StrCmp $1 "Guest" 0 +3
Goto noop
MessageBox MB_OK "Unknown error"
Goto doit
Win9x:
doit:
# We can install
IfSilent +2
Call SelectLanguage
Goto end
noop:
MessageBox MB_OK "$(RequiresAdminUser)"
Quit
end:
FunctionEnd
Function SelectLanguage
;Language selection dialog
Push ""
Push ${LANG_ENGLISH}
Push ${LanguageNameEnglish}
Push ${LANG_GERMAN}
Push ${LanguageNameGerman}
Push ${LANG_DUTCH}
Push ${LanguageNameDutch}
Push ${LANG_FRENCH}
Push ${LanguageNameFrench}
Push ${LANG_POLISH}
Push ${LanguageNamePolish}
Push ${LANG_SPANISH}
Push ${LanguageNameSpanish}
Push ${LANG_CZECH}
Push ${LanguageNameCzech}
Push ${LANG_THAI}
Push ${LanguageNameThai}
Push A ; A means auto count languages
; for the auto count to work the first empty push (Push "") must remain
LangDLL::LangDialog "$(InstallerLanguage)" "$(SelectInstallerLanguage)"
Pop $LANGUAGE
StrCmp $LANGUAGE "cancel" 0 +2
Abort
; Check .NET version
${IfNot} ${HasDotNet3.0}
MessageBox MB_OK|MB_ICONEXCLAMATION "$(RequiresNetFramework)"
Quit
${EndIf}
FunctionEnd
Section "" ; Install
SetOutPath $INSTDIR
SetShellVarContext all
; AddFiles
File /r /x "mRemoteNG.vshost.*" "..\mRemoteV1\bin\Release\*.*"
File /r "Dependencies\*.*"
File "..\*.txt"
; Uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
; Register ActiveX components
RegDLL "$INSTDIR\eolwtscom.dll"
; Start Menu
CreateDirectory "$SMPROGRAMS\mRemoteNG"
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(CreditsLinkName).lnk" "$INSTDIR\CREDITS.TXT"
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(CopyingLinkName).lnk" "$INSTDIR\COPYING.TXT"
CreateShortCut "$SMPROGRAMS\mRemoteNG\mRemoteNG.lnk" "$INSTDIR\mRemoteNG.exe"
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(UninstallLinkName).lnk" "$INSTDIR\Uninstall.exe"
CreateShortCut "$SMPROGRAMS\mRemoteNG\$(ChangeLogLinkName).lnk" "$INSTDIR\CHANGELOG.TXT"
; Registry
WriteRegStr HKLM "Software\mRemoteNG" "InstallPath" $INSTDIR
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "DisplayName" "mRemoteNG"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "Publisher" "Next Generation Software"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "DisplayIcon" "$INSTDIR\mRemoteNG.exe"
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "EstimatedSize" 7080
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "DisplayVersion" ${PRODUCT_VERSION}
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "VersionMajor" ${PRODUCT_VERSION_MAJOR}
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "VersionMinor" ${PRODUCT_VERSION_MINOR}
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "UninstallString" '"$INSTDIR\Uninstall.exe"'
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG" "NoRepair" 1
SectionEnd
Section "un.Uninstall"
; Unregister ActiveX components
UnregDLL "$INSTDIR\eolwtscom.dll"
; Delete Files
RMDIR /r $INSTDIR
; Start Menu
SetShellVarContext all
RMDir /r "$SMPROGRAMS\mRemoteNG"
SetShellVarContext current
RMDir /r "$SMPROGRAMS\mRemoteNG"
; Registry
DeleteRegValue HKLM "Software\mRemoteNG" "InstallPath"
DeleteRegKey /ifempty HKLM "Software\mRemoteNG"
DeleteRegKey /ifempty HKCU "Software\mRemoteNG"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\mRemoteNG"
SectionEnd

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Local" id="2a25bb82-f5ff-4a67-b5e9-c6aaa54d1e80" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Description>These are default test settings for a local test run.</Description>
<Deployment enabled="false" />
<Execution>
<TestTypeSpecific />
<AgentRule name="Execution Agents">
</AgentRule>
</Execution>
</TestSettings>

View File

@@ -0,0 +1,15 @@
using System.Reflection;
// 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 Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("2.9.3.*")]
[assembly: AssemblyFileVersion("2.9.3")]
[assembly: AssemblyInformationalVersion("2.9.3")]
[assembly: System.CLSCompliant(true)]

View File

@@ -0,0 +1,520 @@
/*
* CellEditKeyEngine - A engine that allows the behaviour of arbitrary keys to be configured
*
* Author: Phillip Piper
* Date: 3-March-2011 10:53 pm
*
* Change log:
* v2.8
* 2014-05-30 JPP - When a row is disabled, skip over it when looking for another cell to edit
* v2.5
* 2012-04-14 JPP - Fixed bug where, on a OLV with only a single editable column, tabbing
* to change rows would edit the cell above rather than the cell below
* the cell being edited.
* 2.5
* 2011-03-03 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using BrightIdeasSoftware;
namespace BrightIdeasSoftware {
/// <summary>
/// Indicates the behavior of a key when a cell "on the edge" is being edited.
/// and the normal behavior of that key would exceed the edge. For example,
/// for a key that normally moves one column to the left, the "edge" would be
/// the left most column, since the normal action of the key cannot be taken
/// (since there are no more columns to the left).
/// </summary>
public enum CellEditAtEdgeBehaviour {
/// <summary>
/// The key press will be ignored
/// </summary>
Ignore,
/// <summary>
/// The key press will result in the cell editing wrapping to the
/// cell on the opposite edge.
/// </summary>
Wrap,
/// <summary>
/// The key press will wrap, but the column will be changed to the
/// appropiate adjacent column. This only makes sense for keys where
/// the normal action is ChangeRow.
/// </summary>
ChangeColumn,
/// <summary>
/// The key press will wrap, but the row will be changed to the
/// appropiate adjacent row. This only makes sense for keys where
/// the normal action is ChangeColumn.
/// </summary>
ChangeRow,
/// <summary>
/// The key will result in the current edit operation being ended.
/// </summary>
EndEdit
};
/// <summary>
/// Indicates the normal behaviour of a key when used during a cell edit
/// operation.
/// </summary>
public enum CellEditCharacterBehaviour {
/// <summary>
/// The key press will be ignored
/// </summary>
Ignore,
/// <summary>
/// The key press will end the current edit and begin an edit
/// operation on the next editable cell to the left.
/// </summary>
ChangeColumnLeft,
/// <summary>
/// The key press will end the current edit and begin an edit
/// operation on the next editable cell to the right.
/// </summary>
ChangeColumnRight,
/// <summary>
/// The key press will end the current edit and begin an edit
/// operation on the row above.
/// </summary>
ChangeRowUp,
/// <summary>
/// The key press will end the current edit and begin an edit
/// operation on the row below
/// </summary>
ChangeRowDown,
/// <summary>
/// The key press will cancel the current edit
/// </summary>
CancelEdit,
/// <summary>
/// The key press will finish the current edit operation
/// </summary>
EndEdit,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb1,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb2,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb3,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb4,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb5,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb6,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb7,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb8,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb9,
/// <summary>
/// Custom verb that can be used for specialized actions.
/// </summary>
CustomVerb10,
};
/// <summary>
/// Instances of this class handle key presses during a cell edit operation.
/// </summary>
public class CellEditKeyEngine {
#region Public interface
/// <summary>
/// Sets the behaviour of a given key
/// </summary>
/// <param name="key"></param>
/// <param name="normalBehaviour"></param>
/// <param name="atEdgeBehaviour"></param>
public virtual void SetKeyBehaviour(Keys key, CellEditCharacterBehaviour normalBehaviour, CellEditAtEdgeBehaviour atEdgeBehaviour) {
this.CellEditKeyMap[key] = normalBehaviour;
this.CellEditKeyAtEdgeBehaviourMap[key] = atEdgeBehaviour;
}
/// <summary>
/// Handle a key press
/// </summary>
/// <param name="olv"></param>
/// <param name="keyData"></param>
/// <returns>True if the key was completely handled.</returns>
public virtual bool HandleKey(ObjectListView olv, Keys keyData) {
if (olv == null) throw new ArgumentNullException("olv");
CellEditCharacterBehaviour behaviour;
if (!CellEditKeyMap.TryGetValue(keyData, out behaviour))
return false;
this.ListView = olv;
switch (behaviour) {
case CellEditCharacterBehaviour.Ignore:
break;
case CellEditCharacterBehaviour.CancelEdit:
this.HandleCancelEdit();
break;
case CellEditCharacterBehaviour.EndEdit:
this.HandleEndEdit();
break;
case CellEditCharacterBehaviour.ChangeColumnLeft:
case CellEditCharacterBehaviour.ChangeColumnRight:
this.HandleColumnChange(keyData, behaviour);
break;
case CellEditCharacterBehaviour.ChangeRowDown:
case CellEditCharacterBehaviour.ChangeRowUp:
this.HandleRowChange(keyData, behaviour);
break;
default:
return this.HandleCustomVerb(keyData, behaviour);
};
return true;
}
#endregion
#region Implementation properties
/// <summary>
/// Gets or sets the ObjectListView on which the current key is being handled.
/// This cannot be null.
/// </summary>
protected ObjectListView ListView {
get { return listView; }
set { listView = value; }
}
private ObjectListView listView;
/// <summary>
/// Gets the row of the cell that is currently being edited
/// </summary>
protected OLVListItem ItemBeingEdited {
get {
return (this.ListView == null || this.ListView.CellEditEventArgs == null) ? null : this.ListView.CellEditEventArgs.ListViewItem;
}
}
/// <summary>
/// Gets the index of the column of the cell that is being edited
/// </summary>
protected int SubItemIndexBeingEdited {
get {
return (this.ListView == null || this.ListView.CellEditEventArgs == null) ? -1 : this.ListView.CellEditEventArgs.SubItemIndex;
}
}
/// <summary>
/// Gets or sets the map that remembers the normal behaviour of keys
/// </summary>
protected IDictionary<Keys, CellEditCharacterBehaviour> CellEditKeyMap {
get {
if (cellEditKeyMap == null)
this.InitializeCellEditKeyMaps();
return cellEditKeyMap;
}
set {
cellEditKeyMap = value;
}
}
private IDictionary<Keys, CellEditCharacterBehaviour> cellEditKeyMap;
/// <summary>
/// Gets or sets the map that remembers the desired behaviour of keys
/// on edge cases.
/// </summary>
protected IDictionary<Keys, CellEditAtEdgeBehaviour> CellEditKeyAtEdgeBehaviourMap {
get {
if (cellEditKeyAtEdgeBehaviourMap == null)
this.InitializeCellEditKeyMaps();
return cellEditKeyAtEdgeBehaviourMap;
}
set {
cellEditKeyAtEdgeBehaviourMap = value;
}
}
private IDictionary<Keys, CellEditAtEdgeBehaviour> cellEditKeyAtEdgeBehaviourMap;
#endregion
#region Initialization
/// <summary>
/// Setup the default key mapping
/// </summary>
protected virtual void InitializeCellEditKeyMaps() {
this.cellEditKeyMap = new Dictionary<Keys, CellEditCharacterBehaviour>();
this.cellEditKeyMap[Keys.Escape] = CellEditCharacterBehaviour.CancelEdit;
this.cellEditKeyMap[Keys.Return] = CellEditCharacterBehaviour.EndEdit;
this.cellEditKeyMap[Keys.Enter] = CellEditCharacterBehaviour.EndEdit;
this.cellEditKeyMap[Keys.Tab] = CellEditCharacterBehaviour.ChangeColumnRight;
this.cellEditKeyMap[Keys.Tab | Keys.Shift] = CellEditCharacterBehaviour.ChangeColumnLeft;
this.cellEditKeyMap[Keys.Left | Keys.Alt] = CellEditCharacterBehaviour.ChangeColumnLeft;
this.cellEditKeyMap[Keys.Right | Keys.Alt] = CellEditCharacterBehaviour.ChangeColumnRight;
this.cellEditKeyMap[Keys.Up | Keys.Alt] = CellEditCharacterBehaviour.ChangeRowUp;
this.cellEditKeyMap[Keys.Down | Keys.Alt] = CellEditCharacterBehaviour.ChangeRowDown;
this.cellEditKeyAtEdgeBehaviourMap = new Dictionary<Keys, CellEditAtEdgeBehaviour>();
this.cellEditKeyAtEdgeBehaviourMap[Keys.Tab] = CellEditAtEdgeBehaviour.Wrap;
this.cellEditKeyAtEdgeBehaviourMap[Keys.Tab | Keys.Shift] = CellEditAtEdgeBehaviour.Wrap;
this.cellEditKeyAtEdgeBehaviourMap[Keys.Left | Keys.Alt] = CellEditAtEdgeBehaviour.Wrap;
this.cellEditKeyAtEdgeBehaviourMap[Keys.Right | Keys.Alt] = CellEditAtEdgeBehaviour.Wrap;
this.cellEditKeyAtEdgeBehaviourMap[Keys.Up | Keys.Alt] = CellEditAtEdgeBehaviour.ChangeColumn;
this.cellEditKeyAtEdgeBehaviourMap[Keys.Down | Keys.Alt] = CellEditAtEdgeBehaviour.ChangeColumn;
}
#endregion
#region Command handling
/// <summary>
/// Handle the end edit command
/// </summary>
protected virtual void HandleEndEdit() {
this.ListView.PossibleFinishCellEditing();
}
/// <summary>
/// Handle the cancel edit command
/// </summary>
protected virtual void HandleCancelEdit() {
this.ListView.CancelCellEdit();
}
/// <summary>
/// Placeholder that subclasses can override to handle any custom verbs
/// </summary>
/// <param name="keyData"></param>
/// <param name="behaviour"></param>
/// <returns></returns>
protected virtual bool HandleCustomVerb(Keys keyData, CellEditCharacterBehaviour behaviour) {
return false;
}
/// <summary>
/// Handle a change row command
/// </summary>
/// <param name="keyData"></param>
/// <param name="behaviour"></param>
protected virtual void HandleRowChange(Keys keyData, CellEditCharacterBehaviour behaviour) {
// If we couldn't finish editing the current cell, don't try to move it
if (!this.ListView.PossibleFinishCellEditing())
return;
OLVListItem olvi = this.ItemBeingEdited;
int subItemIndex = this.SubItemIndexBeingEdited;
bool isGoingUp = behaviour == CellEditCharacterBehaviour.ChangeRowUp;
// Try to find a row above (or below) the currently edited cell
// If we find one, start editing it and we're done.
OLVListItem adjacentOlvi = this.GetAdjacentItemOrNull(olvi, isGoingUp);
if (adjacentOlvi != null) {
this.StartCellEditIfDifferent(adjacentOlvi, subItemIndex);
return;
}
// There is no adjacent row in the direction we want, so we must be on an edge.
CellEditAtEdgeBehaviour atEdgeBehaviour;
if (!this.CellEditKeyAtEdgeBehaviourMap.TryGetValue(keyData, out atEdgeBehaviour))
atEdgeBehaviour = CellEditAtEdgeBehaviour.Wrap;
switch (atEdgeBehaviour) {
case CellEditAtEdgeBehaviour.Ignore:
break;
case CellEditAtEdgeBehaviour.EndEdit:
this.ListView.PossibleFinishCellEditing();
break;
case CellEditAtEdgeBehaviour.Wrap:
adjacentOlvi = this.GetAdjacentItemOrNull(null, isGoingUp);
this.StartCellEditIfDifferent(adjacentOlvi, subItemIndex);
break;
case CellEditAtEdgeBehaviour.ChangeColumn:
// Figure out the next editable column
List<OLVColumn> editableColumnsInDisplayOrder = this.EditableColumnsInDisplayOrder;
int displayIndex = Math.Max(0, editableColumnsInDisplayOrder.IndexOf(this.ListView.GetColumn(subItemIndex)));
if (isGoingUp)
displayIndex = (editableColumnsInDisplayOrder.Count + displayIndex - 1) % editableColumnsInDisplayOrder.Count;
else
displayIndex = (displayIndex + 1) % editableColumnsInDisplayOrder.Count;
subItemIndex = editableColumnsInDisplayOrder[displayIndex].Index;
// Wrap to the next row and start the cell edit
adjacentOlvi = this.GetAdjacentItemOrNull(null, isGoingUp);
this.StartCellEditIfDifferent(adjacentOlvi, subItemIndex);
break;
}
}
/// <summary>
/// Handle a change column command
/// </summary>
/// <param name="keyData"></param>
/// <param name="behaviour"></param>
protected virtual void HandleColumnChange(Keys keyData, CellEditCharacterBehaviour behaviour)
{
// If we couldn't finish editing the current cell, don't try to move it
if (!this.ListView.PossibleFinishCellEditing())
return;
// Changing columns only works in details mode
if (this.ListView.View != View.Details)
return;
List<OLVColumn> editableColumns = this.EditableColumnsInDisplayOrder;
OLVListItem olvi = this.ItemBeingEdited;
int displayIndex = Math.Max(0,
editableColumns.IndexOf(this.ListView.GetColumn(this.SubItemIndexBeingEdited)));
bool isGoingLeft = behaviour == CellEditCharacterBehaviour.ChangeColumnLeft;
// Are we trying to continue past one of the edges?
if ((isGoingLeft && displayIndex == 0) ||
(!isGoingLeft && displayIndex == editableColumns.Count - 1))
{
// Yes, so figure out our at edge behaviour
CellEditAtEdgeBehaviour atEdgeBehaviour;
if (!this.CellEditKeyAtEdgeBehaviourMap.TryGetValue(keyData, out atEdgeBehaviour))
atEdgeBehaviour = CellEditAtEdgeBehaviour.Wrap;
switch (atEdgeBehaviour)
{
case CellEditAtEdgeBehaviour.Ignore:
return;
case CellEditAtEdgeBehaviour.EndEdit:
this.HandleEndEdit();
return;
case CellEditAtEdgeBehaviour.ChangeRow:
case CellEditAtEdgeBehaviour.Wrap:
if (atEdgeBehaviour == CellEditAtEdgeBehaviour.ChangeRow)
olvi = GetAdjacentItem(olvi, isGoingLeft && displayIndex == 0);
if (isGoingLeft)
displayIndex = editableColumns.Count - 1;
else
displayIndex = 0;
break;
}
}
else
{
if (isGoingLeft)
displayIndex -= 1;
else
displayIndex += 1;
}
int subItemIndex = editableColumns[displayIndex].Index;
this.StartCellEditIfDifferent(olvi, subItemIndex);
}
#endregion
#region Utilities
/// <summary>
/// Start editing the indicated cell if that cell is not already being edited
/// </summary>
/// <param name="olvi">The row to edit</param>
/// <param name="subItemIndex">The cell within that row to edit</param>
protected void StartCellEditIfDifferent(OLVListItem olvi, int subItemIndex) {
if (this.ItemBeingEdited == olvi && this.SubItemIndexBeingEdited == subItemIndex)
return;
this.ListView.EnsureVisible(olvi.Index);
this.ListView.StartCellEdit(olvi, subItemIndex);
}
/// <summary>
/// Gets the adjacent item to the given item in the given direction.
/// If that item is disabled, continue in that direction until an enabled item is found.
/// </summary>
/// <param name="olvi">The row whose neighbour is sought</param>
/// <param name="up">The direction of the adjacentness</param>
/// <returns>An OLVListView adjacent to the given item, or null if there are no more enabled items in that direction.</returns>
protected OLVListItem GetAdjacentItemOrNull(OLVListItem olvi, bool up) {
OLVListItem item = up ? this.ListView.GetPreviousItem(olvi) : this.ListView.GetNextItem(olvi);
while (item != null && !item.Enabled)
item = up ? this.ListView.GetPreviousItem(item) : this.ListView.GetNextItem(item);
return item;
}
/// <summary>
/// Gets the adjacent item to the given item in the given direction, wrapping if needed.
/// </summary>
/// <param name="olvi">The row whose neighbour is sought</param>
/// <param name="up">The direction of the adjacentness</param>
/// <returns>An OLVListView adjacent to the given item, or null if there are no more items in that direction.</returns>
protected OLVListItem GetAdjacentItem(OLVListItem olvi, bool up) {
return this.GetAdjacentItemOrNull(olvi, up) ?? this.GetAdjacentItemOrNull(null, up);
}
/// <summary>
/// Gets a collection of columns that are editable in the order they are shown to the user
/// </summary>
protected List<OLVColumn> EditableColumnsInDisplayOrder {
get {
List<OLVColumn> editableColumnsInDisplayOrder = new List<OLVColumn>();
foreach (OLVColumn x in this.ListView.ColumnsInDisplayOrder)
if (x.IsEditable)
editableColumnsInDisplayOrder.Add(x);
return editableColumnsInDisplayOrder;
}
}
#endregion
}
}

View File

@@ -0,0 +1,284 @@
/*
* CellEditors - Several slightly modified controls that are used as celleditors within ObjectListView.
*
* Author: Phillip Piper
* Date: 20/10/2008 5:15 PM
*
* Change log:
* v2.6
* 2012-08-02 JPP - Make most editors public so they can be reused/subclassed
* v2.3
* 2009-08-13 JPP - Standardized code formatting
* v2.2.1
* 2008-01-18 JPP - Added special handling for enums
* 2008-01-16 JPP - Added EditorRegistry
* v2.0.1
* 2008-10-20 JPP - Separated from ObjectListView.cs
*
* Copyright (C) 2006-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// These items allow combo boxes to remember a value and its description.
/// </summary>
/// <remarks>
///
/// </remarks>
/// <param name="key"></param>
/// <param name="description"></param>
public class ComboBoxItem(Object key, String description)
{
private readonly String description = description;
/// <summary>
///
/// </summary>
public Object Key {
get { return key; }
}
private readonly Object key = key;
/// <summary>
/// Returns a string that represents the current object.
/// </summary>
/// <returns>
/// A string that represents the current object.
/// </returns>
/// <filterpriority>2</filterpriority>
public override string ToString() {
return this.description;
}
}
//-----------------------------------------------------------------------
// Cell editors
// These classes are simple cell editors that make it easier to get and set
// the value that the control is showing.
// In many cases, you can intercept the CellEditStarting event to
// change the characteristics of the editor. For example, changing
// the acceptable range for a numeric editor or changing the strings
// that respresent true and false values for a boolean editor.
/// <summary>
/// This editor shows and auto completes values from the given listview column.
/// </summary>
[ToolboxItem(false)]
public class AutoCompleteCellEditor : ComboBox
{
/// <summary>
/// Create an AutoCompleteCellEditor
/// </summary>
/// <param name="lv"></param>
/// <param name="column"></param>
public AutoCompleteCellEditor(ObjectListView lv, OLVColumn column) {
this.DropDownStyle = ComboBoxStyle.DropDown;
Dictionary<String, bool> alreadySeen = new Dictionary<string, bool>();
for (int i = 0; i < Math.Min(lv.GetItemCount(), 1000); i++) {
String str = column.GetStringValue(lv.GetModelObject(i));
if (!alreadySeen.ContainsKey(str)) {
this.Items.Add(str);
alreadySeen[str] = true;
}
}
this.Sorted = true;
this.AutoCompleteSource = AutoCompleteSource.ListItems;
this.AutoCompleteMode = AutoCompleteMode.Append;
}
}
/// <summary>
/// This combo box is specialised to allow editing of an enum.
/// </summary>
[ToolboxItem(false)]
public class EnumCellEditor : ComboBox
{
/// <summary>
///
/// </summary>
/// <param name="type"></param>
public EnumCellEditor(Type type) {
this.DropDownStyle = ComboBoxStyle.DropDownList;
this.ValueMember = "Key";
ArrayList values = new ArrayList();
foreach (object value in Enum.GetValues(type))
values.Add(new ComboBoxItem(value, Enum.GetName(type, value)));
this.DataSource = values;
}
}
/// <summary>
/// This editor simply shows and edits integer values.
/// </summary>
[ToolboxItem(false)]
public class IntUpDown : NumericUpDown
{
/// <summary>
///
/// </summary>
public IntUpDown() {
this.DecimalPlaces = 0;
this.Minimum = -9999999;
this.Maximum = 9999999;
}
/// <summary>
/// Gets or sets the value shown by this editor
/// </summary>
new public int Value {
get { return Decimal.ToInt32(base.Value); }
set { base.Value = new Decimal(value); }
}
}
/// <summary>
/// This editor simply shows and edits unsigned integer values.
/// </summary>
/// <remarks>This class can't be made public because unsigned int is not a
/// CLS-compliant type. If you want to use, just copy the code to this class
/// into your project and use it from there.</remarks>
[ToolboxItem(false)]
internal class UintUpDown : NumericUpDown
{
public UintUpDown() {
this.DecimalPlaces = 0;
this.Minimum = 0;
this.Maximum = 9999999;
}
new public uint Value {
get { return Decimal.ToUInt32(base.Value); }
set { base.Value = new Decimal(value); }
}
}
/// <summary>
/// This editor simply shows and edits boolean values.
/// </summary>
[ToolboxItem(false)]
public class BooleanCellEditor : ComboBox
{
/// <summary>
///
/// </summary>
public BooleanCellEditor() {
this.DropDownStyle = ComboBoxStyle.DropDownList;
this.ValueMember = "Key";
ArrayList values = new ArrayList();
values.Add(new ComboBoxItem(false, "False"));
values.Add(new ComboBoxItem(true, "True"));
this.DataSource = values;
}
}
/// <summary>
/// This editor simply shows and edits boolean values using a checkbox
/// </summary>
[ToolboxItem(false)]
public class BooleanCellEditor2 : CheckBox
{
/// <summary>
/// Gets or sets the value shown by this editor
/// </summary>
public bool? Value {
get {
switch (this.CheckState) {
case CheckState.Checked: return true;
case CheckState.Indeterminate: return null;
case CheckState.Unchecked:
default: return false;
}
}
set {
if (value.HasValue)
this.CheckState = value.Value ? CheckState.Checked : CheckState.Unchecked;
else
this.CheckState = CheckState.Indeterminate;
}
}
/// <summary>
/// Gets or sets how the checkbox will be aligned
/// </summary>
public new HorizontalAlignment TextAlign {
get {
switch (this.CheckAlign) {
case ContentAlignment.MiddleRight: return HorizontalAlignment.Right;
case ContentAlignment.MiddleCenter: return HorizontalAlignment.Center;
case ContentAlignment.MiddleLeft:
default: return HorizontalAlignment.Left;
}
}
set {
switch (value) {
case HorizontalAlignment.Left:
this.CheckAlign = ContentAlignment.MiddleLeft;
break;
case HorizontalAlignment.Center:
this.CheckAlign = ContentAlignment.MiddleCenter;
break;
case HorizontalAlignment.Right:
this.CheckAlign = ContentAlignment.MiddleRight;
break;
}
}
}
}
/// <summary>
/// This editor simply shows and edits floating point values.
/// </summary>
/// <remarks>You can intercept the CellEditStarting event if you want
/// to change the characteristics of the editor. For example, by increasing
/// the number of decimal places.</remarks>
[ToolboxItem(false)]
public class FloatCellEditor : NumericUpDown
{
/// <summary>
///
/// </summary>
public FloatCellEditor() {
this.DecimalPlaces = 2;
this.Minimum = -9999999;
this.Maximum = 9999999;
}
/// <summary>
/// Gets or sets the value shown by this editor
/// </summary>
new public double Value {
get { return Convert.ToDouble(base.Value); }
set { base.Value = Convert.ToDecimal(value); }
}
}
}

View File

@@ -0,0 +1,213 @@
/*
* EditorRegistry - A registry mapping types to cell editors.
*
* Author: Phillip Piper
* Date: 6-March-2011 7:53 am
*
* Change log:
* 2011-03-31 JPP - Use OLVColumn.DataType if the value to be edited is null
* 2011-03-06 JPP - Separated from CellEditors.cs
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
namespace BrightIdeasSoftware {
/// <summary>
/// A delegate that creates an editor for the given value
/// </summary>
/// <param name="model">The model from which that value came</param>
/// <param name="column">The column for which the editor is being created</param>
/// <param name="value">A representative value of the type to be edited. This value may not be the exact
/// value for the column/model combination. It could be simply representative of
/// the appropriate type of value.</param>
/// <returns>A control which can edit the given value</returns>
public delegate Control EditorCreatorDelegate(Object model, OLVColumn column, Object value);
/// <summary>
/// An editor registry gives a way to decide what cell editor should be used to edit
/// the value of a cell. Programmers can register non-standard types and the control that
/// should be used to edit instances of that type.
/// </summary>
/// <remarks>
/// <para>All ObjectListViews share the same editor registry.</para>
/// </remarks>
public class EditorRegistry {
#region Initializing
/// <summary>
/// Create an EditorRegistry
/// </summary>
public EditorRegistry() {
this.InitializeStandardTypes();
}
private void InitializeStandardTypes() {
this.Register(typeof(Boolean), typeof(BooleanCellEditor));
this.Register(typeof(Int16), typeof(IntUpDown));
this.Register(typeof(Int32), typeof(IntUpDown));
this.Register(typeof(Int64), typeof(IntUpDown));
this.Register(typeof(UInt16), typeof(UintUpDown));
this.Register(typeof(UInt32), typeof(UintUpDown));
this.Register(typeof(UInt64), typeof(UintUpDown));
this.Register(typeof(Single), typeof(FloatCellEditor));
this.Register(typeof(Double), typeof(FloatCellEditor));
this.Register(typeof(DateTime), delegate(Object model, OLVColumn column, Object value) {
DateTimePicker c = new DateTimePicker();
c.Format = DateTimePickerFormat.Short;
return c;
});
this.Register(typeof(Boolean), delegate(Object model, OLVColumn column, Object value) {
CheckBox c = new BooleanCellEditor2();
c.ThreeState = column.TriStateCheckBoxes;
return c;
});
}
#endregion
#region Registering
/// <summary>
/// Register that values of 'type' should be edited by instances of 'controlType'.
/// </summary>
/// <param name="type">The type of value to be edited</param>
/// <param name="controlType">The type of the Control that will edit values of 'type'</param>
/// <example>
/// ObjectListView.EditorRegistry.Register(typeof(Color), typeof(MySpecialColorEditor));
/// </example>
public void Register(Type type, Type controlType) {
this.Register(type, delegate(Object model, OLVColumn column, Object value) {
return controlType.InvokeMember("", BindingFlags.CreateInstance, null, null, null) as Control;
});
}
/// <summary>
/// Register the given delegate so that it is called to create editors
/// for values of the given type
/// </summary>
/// <param name="type">The type of value to be edited</param>
/// <param name="creator">The delegate that will create a control that can edit values of 'type'</param>
/// <example>
/// ObjectListView.EditorRegistry.Register(typeof(Color), CreateColorEditor);
/// ...
/// public Control CreateColorEditor(Object model, OLVColumn column, Object value)
/// {
/// return new MySpecialColorEditor();
/// }
/// </example>
public void Register(Type type, EditorCreatorDelegate creator) {
this.creatorMap[type] = creator;
}
/// <summary>
/// Register a delegate that will be called to create an editor for values
/// that have not been handled.
/// </summary>
/// <param name="creator">The delegate that will create a editor for all other types</param>
public void RegisterDefault(EditorCreatorDelegate creator) {
this.defaultCreator = creator;
}
/// <summary>
/// Register a delegate that will be given a chance to create a control
/// before any other option is considered.
/// </summary>
/// <param name="creator">The delegate that will create a control</param>
public void RegisterFirstChance(EditorCreatorDelegate creator) {
this.firstChanceCreator = creator;
}
/// <summary>
/// Remove the registered handler for the given type
/// </summary>
/// <remarks>Does nothing if the given type doesn't exist</remarks>
/// <param name="type">The type whose registration is to be removed</param>
public void Unregister(Type type) {
if (this.creatorMap.ContainsKey(type))
this.creatorMap.Remove(type);
}
#endregion
#region Accessing
/// <summary>
/// Create and return an editor that is appropriate for the given value.
/// Return null if no appropriate editor can be found.
/// </summary>
/// <param name="model">The model involved</param>
/// <param name="column">The column to be edited</param>
/// <param name="value">The value to be edited. This value may not be the exact
/// value for the column/model combination. It could be simply representative of
/// the appropriate type of value.</param>
/// <returns>A Control that can edit the given type of values</returns>
public Control GetEditor(Object model, OLVColumn column, Object value) {
Control editor;
// Give the first chance delegate a chance to decide
if (this.firstChanceCreator != null) {
editor = this.firstChanceCreator(model, column, value);
if (editor != null)
return editor;
}
// Try to find a creator based on the type of the value (or the column)
Type type = value == null ? column.DataType : value.GetType();
if (type != null && this.creatorMap.ContainsKey(type)) {
editor = this.creatorMap[type](model, column, value);
if (editor != null)
return editor;
}
// Enums without other processing get a special editor
if (value != null && value.GetType().IsEnum)
return this.CreateEnumEditor(value.GetType());
// Give any default creator a final chance
if (this.defaultCreator != null)
return this.defaultCreator(model, column, value);
return null;
}
/// <summary>
/// Create and return an editor that will edit values of the given type
/// </summary>
/// <param name="type">A enum type</param>
protected Control CreateEnumEditor(Type type) {
return new EnumCellEditor(type);
}
#endregion
#region Private variables
private EditorCreatorDelegate firstChanceCreator;
private EditorCreatorDelegate defaultCreator;
private Dictionary<Type, EditorCreatorDelegate> creatorMap = new Dictionary<Type, EditorCreatorDelegate>();
#endregion
}
}

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Dictionary>
<Words>
<Recognized>
<Word>br</Word>
<Word>Canceled</Word>
<Word>Center</Word>
<Word>Color</Word>
<Word>Colors</Word>
<Word>f</Word>
<Word>fmt</Word>
<Word>g</Word>
<Word>gdi</Word>
<Word>hti</Word>
<Word>i</Word>
<Word>lightbox</Word>
<Word>lv</Word>
<Word>lvi</Word>
<Word>lvsi</Word>
<Word>m</Word>
<Word>multi</Word>
<Word>Munger</Word>
<Word>n</Word>
<Word>olv</Word>
<Word>olvi</Word>
<Word>p</Word>
<Word>parms</Word>
<Word>r</Word>
<Word>Renderer</Word>
<Word>s</Word>
<Word>SubItem</Word>
<Word>Unapply</Word>
<Word>Unpause</Word>
<Word>x</Word>
<Word>y</Word>
</Recognized>
<Deprecated>
<Term PreferredAlternate="EnterpriseServices">ComPlus</Term>
</Deprecated>
</Words>
<Acronyms>
<CasingExceptions>
<Acronym>OLV</Acronym>
</CasingExceptions>
</Acronyms>
</Dictionary>

View File

@@ -0,0 +1,236 @@
/*
* DataListView - A data-bindable listview
*
* Author: Phillip Piper
* Date: 27/09/2008 9:15 AM
*
* Change log:
* 2015-02-02 JPP - Made Unfreezing more efficient by removing a redundant BuildList() call
* v2.6
* 2011-02-27 JPP - Moved most of the logic to DataSourceAdapter (where it
* can be used by FastDataListView too)
* v2.3
* 2009-01-18 JPP - Boolean columns are now handled as checkboxes
* - Auto-generated columns would fail if the data source was
* reseated, even to the same data source
* v2.0.1
* 2009-01-07 JPP - Made all public and protected methods virtual
* 2008-10-03 JPP - Separated from ObjectListView.cs
*
* Copyright (C) 2006-2015 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing.Design;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// A DataListView is a ListView that can be bound to a datasource (which would normally be a DataTable or DataView).
/// </summary>
/// <remarks>
/// <para>This listview keeps itself in sync with its source datatable by listening for change events.</para>
/// <para>The DataListView will automatically create columns to show all of the data source's columns/properties, if there is not already
/// a column showing that property. This allows you to define one or two columns in the designer and then have the others generated automatically.
/// If you don't want any column to be auto generated, set <see cref="AutoGenerateColumns"/> to false.
/// These generated columns will be only the simplest view of the world, and would look more interesting with a few delegates installed.</para>
/// <para>This listview will also automatically generate missing aspect getters to fetch the values from the data view.</para>
/// <para>Changing data sources is possible, but error prone. Before changing data sources, the programmer is responsible for modifying/resetting
/// the column collection to be valid for the new data source.</para>
/// <para>Internally, a CurrencyManager controls keeping the data source in-sync with other users of the data source (as per normal .NET
/// behavior). This means that the model objects in the DataListView are DataRowView objects. If you write your own AspectGetters/Setters,
/// they will be given DataRowView objects.</para>
/// </remarks>
public class DataListView : ObjectListView
{
#region Life and death
/// <summary>
/// Make a DataListView
/// </summary>
public DataListView()
{
this.Adapter = new DataSourceAdapter(this);
}
protected override void Dispose(bool disposing) {
this.Adapter.Dispose();
base.Dispose(disposing);
}
#endregion
#region Public Properties
/// <summary>
/// Gets or sets whether or not columns will be automatically generated to show the
/// columns when the DataSource is set.
/// </summary>
/// <remarks>This must be set before the DataSource is set. It has no effect afterwards.</remarks>
[Category("Data"),
Description("Should the control automatically generate columns from the DataSource"),
DefaultValue(true)]
public bool AutoGenerateColumns {
get { return this.Adapter.AutoGenerateColumns; }
set { this.Adapter.AutoGenerateColumns = value; }
}
/// <summary>
/// Get or set the DataSource that will be displayed in this list view.
/// </summary>
/// <remarks>The DataSource should implement either <see cref="IList"/>, <see cref="IBindingList"/>,
/// or <see cref="IListSource"/>. Some common examples are the following types of objects:
/// <list type="unordered">
/// <item><description><see cref="DataView"/></description></item>
/// <item><description><see cref="DataTable"/></description></item>
/// <item><description><see cref="DataSet"/></description></item>
/// <item><description><see cref="DataViewManager"/></description></item>
/// <item><description><see cref="BindingSource"/></description></item>
/// </list>
/// <para>When binding to a list container (i.e. one that implements the
/// <see cref="IListSource"/> interface, such as <see cref="DataSet"/>)
/// you must also set the <see cref="DataMember"/> property in order
/// to identify which particular list you would like to display. You
/// may also set the <see cref="DataMember"/> property even when
/// DataSource refers to a list, since <see cref="DataMember"/> can
/// also be used to navigate relations between lists.</para>
/// <para>When a DataSource is set, the control will create OLVColumns to show any
/// data source columns that are not already shown.</para>
/// <para>If the DataSource is changed, you will have to remove any previously
/// created columns, since they will be configured for the previous DataSource.
/// <see cref="ObjectListView.Reset()"/>.</para>
/// </remarks>
[Category("Data"),
TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design")]
public virtual Object DataSource
{
get { return this.Adapter.DataSource; }
set { this.Adapter.DataSource = value; }
}
/// <summary>
/// Gets or sets the name of the list or table in the data source for which the DataListView is displaying data.
/// </summary>
/// <remarks>If the data source is not a DataSet or DataViewManager, this property has no effect</remarks>
[Category("Data"),
Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(UITypeEditor)),
DefaultValue("")]
public virtual string DataMember
{
get { return this.Adapter.DataMember; }
set { this.Adapter.DataMember = value; }
}
#endregion
#region Implementation properties
/// <summary>
/// Gets or sets the DataSourceAdaptor that does the bulk of the work needed
/// for data binding.
/// </summary>
/// <remarks>
/// Adaptors cannot be shared between controls. Each DataListView needs its own adapter.
/// </remarks>
protected DataSourceAdapter Adapter {
get {
Debug.Assert(adapter != null, "Data adapter should not be null");
return adapter;
}
set { adapter = value; }
}
private DataSourceAdapter adapter;
#endregion
#region Object manipulations
/// <summary>
/// Add the given collection of model objects to this control.
/// </summary>
/// <param name="modelObjects">A collection of model objects</param>
/// <remarks>This is a no-op for data lists, since the data
/// is controlled by the DataSource. Manipulate the data source
/// rather than this view of the data source.</remarks>
public override void AddObjects(ICollection modelObjects)
{
}
/// <summary>
/// Insert the given collection of objects before the given position
/// </summary>
/// <param name="index">Where to insert the objects</param>
/// <param name="modelObjects">The objects to be inserted</param>
/// <remarks>This is a no-op for data lists, since the data
/// is controlled by the DataSource. Manipulate the data source
/// rather than this view of the data source.</remarks>
public override void InsertObjects(int index, ICollection modelObjects) {
}
/// <summary>
/// Remove the given collection of model objects from this control.
/// </summary>
/// <remarks>This is a no-op for data lists, since the data
/// is controlled by the DataSource. Manipulate the data source
/// rather than this view of the data source.</remarks>
public override void RemoveObjects(ICollection modelObjects)
{
}
#endregion
#region Event Handlers
/// <summary>
/// Change the Unfreeze behaviour
/// </summary>
protected override void DoUnfreeze() {
// Copied from base method, but we don't need to BuildList() since we know that our
// data adaptor is going to do that immediately after this method exits.
this.EndUpdate();
this.ResizeFreeSpaceFillingColumns();
// this.BuildList();
}
/// <summary>
/// Handles parent binding context changes
/// </summary>
/// <param name="e">Unused EventArgs.</param>
protected override void OnParentBindingContextChanged(EventArgs e)
{
base.OnParentBindingContextChanged(e);
// BindingContext is an ambient property - by default it simply picks
// up the parent control's context (unless something has explicitly
// given us our own). So we must respond to changes in our parent's
// binding context in the same way we would changes to our own
// binding context.
// THINK: Do we need to forward this to the adapter?
}
#endregion
}
}

View File

@@ -0,0 +1,240 @@
/*
* DataTreeListView - A data bindable TreeListView
*
* Author: Phillip Piper
* Date: 05/05/2012 3:26 PM
*
* Change log:
* 2012-05-05 JPP Initial version
*
* TO DO:
*
* Copyright (C) 2012 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing.Design;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// A DataTreeListView is a TreeListView that calculates its hierarchy based on
/// information in the data source.
/// </summary>
/// <remarks>
/// <para>Like a <see cref="DataListView"/>, a DataTreeListView sources all its information
/// from a combination of <see cref="DataSource"/> and <see cref="DataMember"/>.
/// <see cref="DataSource"/> can be a DataTable, DataSet,
/// or anything that implements <see cref="IList"/>.
/// </para>
/// <para>
/// To function properly, the DataTreeListView requires:
/// <list type="bullet">
/// <item>the table to have a column which holds a unique for the row. The name of this column must be set in <see cref="KeyAspectName"/>.</item>
/// <item>the table to have a column which holds id of the hierarchical parent of the row. The name of this column must be set in <see cref="ParentKeyAspectName"/>.</item>
/// <item>a value which identifies which rows are the roots of the tree (<see cref="RootKeyValue"/>).</item>
/// </list>
/// The hierarchy structure is determined finding all the rows where the parent key is equal to <see cref="RootKeyValue"/>. These rows
/// become the root objects of the hierarchy.
/// </para>
/// <para>Like a TreeListView, the hierarchy must not contain cycles. Bad things will happen if the data is cyclic.</para>
/// </remarks>
public partial class DataTreeListView : TreeListView
{
#region Public Properties
/// <summary>
/// Gets or sets whether or not columns will be automatically generated to show the
/// columns when the DataSource is set.
/// </summary>
/// <remarks>This must be set before the DataSource is set. It has no effect afterwards.</remarks>
[Category("Data"),
Description("Should the control automatically generate columns from the DataSource"),
DefaultValue(true)]
public bool AutoGenerateColumns
{
get { return this.Adapter.AutoGenerateColumns; }
set { this.Adapter.AutoGenerateColumns = value; }
}
/// <summary>
/// Get or set the DataSource that will be displayed in this list view.
/// </summary>
/// <remarks>The DataSource should implement either <see cref="IList"/>, <see cref="IBindingList"/>,
/// or <see cref="IListSource"/>. Some common examples are the following types of objects:
/// <list type="unordered">
/// <item><description><see cref="DataView"/></description></item>
/// <item><description><see cref="DataTable"/></description></item>
/// <item><description><see cref="DataSet"/></description></item>
/// <item><description><see cref="DataViewManager"/></description></item>
/// <item><description><see cref="BindingSource"/></description></item>
/// </list>
/// <para>When binding to a list container (i.e. one that implements the
/// <see cref="IListSource"/> interface, such as <see cref="DataSet"/>)
/// you must also set the <see cref="DataMember"/> property in order
/// to identify which particular list you would like to display. You
/// may also set the <see cref="DataMember"/> property even when
/// DataSource refers to a list, since <see cref="DataMember"/> can
/// also be used to navigate relations between lists.</para>
/// </remarks>
[Category("Data"),
TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design")]
public virtual Object DataSource {
get { return this.Adapter.DataSource; }
set { this.Adapter.DataSource = value; }
}
/// <summary>
/// Gets or sets the name of the list or table in the data source for which the DataListView is displaying data.
/// </summary>
/// <remarks>If the data source is not a DataSet or DataViewManager, this property has no effect</remarks>
[Category("Data"),
Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(UITypeEditor)),
DefaultValue("")]
public virtual string DataMember {
get { return this.Adapter.DataMember; }
set { this.Adapter.DataMember = value; }
}
/// <summary>
/// Gets or sets the name of the property/column that uniquely identifies each row.
/// </summary>
/// <remarks>
/// <para>
/// The value contained by this column must be unique across all rows
/// in the data source. Odd and unpredictable things will happen if two
/// rows have the same id.
/// </para>
/// <para>Null cannot be a valid key value.</para>
/// </remarks>
[Category("Data"),
Description("The name of the property/column that holds the key of a row"),
DefaultValue(null)]
public virtual string KeyAspectName {
get { return this.Adapter.KeyAspectName; }
set { this.Adapter.KeyAspectName = value; }
}
/// <summary>
/// Gets or sets the name of the property/column that contains the key of
/// the parent of a row.
/// </summary>
/// <remarks>
/// <para>
/// The test condition for deciding if one row is the parent of another is functionally
/// equivilent to this:
/// <code>
/// Object.Equals(candidateParentRow[this.KeyAspectName], row[this.ParentKeyAspectName])
/// </code>
/// </para>
/// <para>Unlike key value, parent keys can be null but a null parent key can only be used
/// to identify root objects.</para>
/// </remarks>
[Category("Data"),
Description("The name of the property/column that holds the key of the parent of a row"),
DefaultValue(null)]
public virtual string ParentKeyAspectName {
get { return this.Adapter.ParentKeyAspectName; }
set { this.Adapter.ParentKeyAspectName = value; }
}
/// <summary>
/// Gets or sets the value that identifies a row as a root object.
/// When the ParentKey of a row equals the RootKeyValue, that row will
/// be treated as root of the TreeListView.
/// </summary>
/// <remarks>
/// <para>
/// The test condition for deciding a root object is functionally
/// equivilent to this:
/// <code>
/// Object.Equals(candidateRow[this.ParentKeyAspectName], this.RootKeyValue)
/// </code>
/// </para>
/// <para>The RootKeyValue can be null. Actually, it can be any value that can
/// be compared for equality against a basic type.</para>
/// <para>If this is set to the wrong value (i.e. to a value that no row
/// has in the parent id column), the list will be empty.</para>
/// </remarks>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public virtual object RootKeyValue {
get { return this.Adapter.RootKeyValue; }
set { this.Adapter.RootKeyValue = value; }
}
/// <summary>
/// Gets or sets the value that identifies a row as a root object.
/// <see cref="RootKeyValue"/>. The RootKeyValue can be of any type,
/// but the IDE cannot sensibly represent a value of any type,
/// so this is a typed wrapper around that property.
/// </summary>
/// <remarks>
/// If you want the root value to be something other than a string,
/// you will have set it yourself.
/// </remarks>
[Category("Data"),
Description("The parent id value that identifies a row as a root object"),
DefaultValue(null)]
public virtual string RootKeyValueString {
get { return Convert.ToString(this.Adapter.RootKeyValue); }
set { this.Adapter.RootKeyValue = value; }
}
/// <summary>
/// Gets or sets whether or not the key columns (id and parent id) should
/// be shown to the user.
/// </summary>
/// <remarks>This must be set before the DataSource is set. It has no effect
/// afterwards.</remarks>
[Category("Data"),
Description("Should the keys columns (id and parent id) be shown to the user?"),
DefaultValue(true)]
public virtual bool ShowKeyColumns {
get { return this.Adapter.ShowKeyColumns; }
set { this.Adapter.ShowKeyColumns = value; }
}
#endregion
#region Implementation properties
/// <summary>
/// Gets or sets the DataSourceAdaptor that does the bulk of the work needed
/// for data binding.
/// </summary>
protected TreeDataSourceAdapter Adapter {
get {
if (this.adapter == null)
this.adapter = new TreeDataSourceAdapter(this);
return adapter;
}
set { adapter = value; }
}
private TreeDataSourceAdapter adapter;
#endregion
}
}

View File

@@ -0,0 +1,219 @@
/*
* DragSource.cs - Add drag source functionality to an ObjectListView
*
* Author: Phillip Piper
* Date: 2009-03-17 5:15 PM
*
* Change log:
* 2011-03-29 JPP - Separate OLVDataObject.cs
* v2.3
* 2009-07-06 JPP - Make sure Link is acceptable as an drop effect by default
* (since MS didn't make it part of the 'All' value)
* v2.2
* 2009-04-15 JPP - Separated DragSource.cs into DropSink.cs
* 2009-03-17 JPP - Initial version
*
* Copyright (C) 2009-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace BrightIdeasSoftware
{
/// <summary>
/// An IDragSource controls how drag out from the ObjectListView will behave
/// </summary>
public interface IDragSource
{
/// <summary>
/// A drag operation is beginning. Return the data object that will be used
/// for data transfer. Return null to prevent the drag from starting. The data
/// object will normally include all the selected objects.
/// </summary>
/// <remarks>
/// The returned object is later passed to the GetAllowedEffect() and EndDrag()
/// methods.
/// </remarks>
/// <param name="olv">What ObjectListView is being dragged from.</param>
/// <param name="button">Which mouse button is down?</param>
/// <param name="item">What item was directly dragged by the user? There may be more than just this
/// item selected.</param>
/// <returns>The data object that will be used for data transfer. This will often be a subclass
/// of DataObject, but does not need to be.</returns>
Object StartDrag(ObjectListView olv, MouseButtons button, OLVListItem item);
/// <summary>
/// What operations are possible for this drag? This controls the icon shown during the drag
/// </summary>
/// <param name="dragObject">The data object returned by StartDrag()</param>
/// <returns>A combination of DragDropEffects flags</returns>
DragDropEffects GetAllowedEffects(Object dragObject);
/// <summary>
/// The drag operation is complete. Do whatever is necessary to complete the action.
/// </summary>
/// <param name="dragObject">The data object returned by StartDrag()</param>
/// <param name="effect">The value returned from GetAllowedEffects()</param>
void EndDrag(Object dragObject, DragDropEffects effect);
}
/// <summary>
/// A do-nothing implementation of IDragSource that can be safely subclassed.
/// </summary>
public class AbstractDragSource : IDragSource
{
#region IDragSource Members
/// <summary>
/// See IDragSource documentation
/// </summary>
/// <param name="olv"></param>
/// <param name="button"></param>
/// <param name="item"></param>
/// <returns></returns>
public virtual Object StartDrag(ObjectListView olv, MouseButtons button, OLVListItem item) {
return null;
}
/// <summary>
/// See IDragSource documentation
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public virtual DragDropEffects GetAllowedEffects(Object data) {
return DragDropEffects.None;
}
/// <summary>
/// See IDragSource documentation
/// </summary>
/// <param name="dragObject"></param>
/// <param name="effect"></param>
public virtual void EndDrag(Object dragObject, DragDropEffects effect) {
}
#endregion
}
/// <summary>
/// A reasonable implementation of IDragSource that provides normal
/// drag source functionality. It creates a data object that supports
/// inter-application dragging of text and HTML representation of
/// the dragged rows. It can optionally force a refresh of all dragged
/// rows when the drag is complete.
/// </summary>
/// <remarks>Subclasses can override GetDataObject() to add new
/// data formats to the data transfer object.</remarks>
public class SimpleDragSource : IDragSource
{
#region Constructors
/// <summary>
/// Construct a SimpleDragSource
/// </summary>
public SimpleDragSource() {
}
/// <summary>
/// Construct a SimpleDragSource that refreshes the dragged rows when
/// the drag is complete
/// </summary>
/// <param name="refreshAfterDrop"></param>
public SimpleDragSource(bool refreshAfterDrop) {
this.RefreshAfterDrop = refreshAfterDrop;
}
#endregion
#region Public properties
/// <summary>
/// Gets or sets whether the dragged rows should be refreshed when the
/// drag operation is complete.
/// </summary>
public bool RefreshAfterDrop {
get { return refreshAfterDrop; }
set { refreshAfterDrop = value; }
}
private bool refreshAfterDrop;
#endregion
#region IDragSource Members
/// <summary>
/// Create a DataObject when the user does a left mouse drag operation.
/// See IDragSource for further information.
/// </summary>
/// <param name="olv"></param>
/// <param name="button"></param>
/// <param name="item"></param>
/// <returns></returns>
public virtual Object StartDrag(ObjectListView olv, MouseButtons button, OLVListItem item) {
// We only drag on left mouse
if (button != MouseButtons.Left)
return null;
return this.CreateDataObject(olv);
}
/// <summary>
/// Which operations are allowed in the operation? By default, all operations are supported.
/// </summary>
/// <param name="data"></param>
/// <returns>All opertions are supported</returns>
public virtual DragDropEffects GetAllowedEffects(Object data) {
return DragDropEffects.All | DragDropEffects.Link; // why didn't MS include 'Link' in 'All'??
}
/// <summary>
/// The drag operation is finished. Refreshe the dragged rows if so configured.
/// </summary>
/// <param name="dragObject"></param>
/// <param name="effect"></param>
public virtual void EndDrag(Object dragObject, DragDropEffects effect) {
OLVDataObject data = dragObject as OLVDataObject;
if (data == null)
return;
if (this.RefreshAfterDrop)
data.ListView.RefreshObjects(data.ModelObjects);
}
/// <summary>
/// Create a data object that will be used to as the data object
/// for the drag operation.
/// </summary>
/// <remarks>
/// Subclasses can override this method add new formats to the data object.
/// </remarks>
/// <param name="olv">The ObjectListView that is the source of the drag</param>
/// <returns>A data object for the drag</returns>
protected virtual object CreateDataObject(ObjectListView olv) {
return new OLVDataObject(olv);
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,185 @@
/*
* OLVDataObject.cs - An OLE DataObject that knows how to convert rows of an OLV to text and HTML
*
* Author: Phillip Piper
* Date: 2011-03-29 3:34PM
*
* Change log:
* v2.8
* 2014-05-02 JPP - When the listview is completely empty, don't try to set CSV text in the clipboard.
* v2.6
* 2012-08-08 JPP - Changed to use OLVExporter.
* - Added CSV to formats exported to Clipboard
* v2.4
* 2011-03-29 JPP - Initial version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Windows.Forms;
namespace BrightIdeasSoftware {
/// <summary>
/// A data transfer object that knows how to transform a list of model
/// objects into a text and HTML representation.
/// </summary>
public class OLVDataObject : DataObject {
#region Life and death
/// <summary>
/// Create a data object from the selected objects in the given ObjectListView
/// </summary>
/// <param name="olv">The source of the data object</param>
public OLVDataObject(ObjectListView olv)
: this(olv, olv.SelectedObjects) {
}
/// <summary>
/// Create a data object which operates on the given model objects
/// in the given ObjectListView
/// </summary>
/// <param name="olv">The source of the data object</param>
/// <param name="modelObjects">The model objects to be put into the data object</param>
public OLVDataObject(ObjectListView olv, IList modelObjects) {
this.objectListView = olv;
this.modelObjects = modelObjects;
this.includeHiddenColumns = olv.IncludeHiddenColumnsInDataTransfer;
this.includeColumnHeaders = olv.IncludeColumnHeadersInCopy;
this.CreateTextFormats();
}
#endregion
#region Properties
/// <summary>
/// Gets or sets whether hidden columns will also be included in the text
/// and HTML representation. If this is false, only visible columns will
/// be included.
/// </summary>
public bool IncludeHiddenColumns {
get { return includeHiddenColumns; }
}
private readonly bool includeHiddenColumns;
/// <summary>
/// Gets or sets whether column headers will also be included in the text
/// and HTML representation.
/// </summary>
public bool IncludeColumnHeaders {
get { return includeColumnHeaders; }
}
private readonly bool includeColumnHeaders;
/// <summary>
/// Gets the ObjectListView that is being used as the source of the data
/// </summary>
public ObjectListView ListView {
get { return objectListView; }
}
private readonly ObjectListView objectListView;
/// <summary>
/// Gets the model objects that are to be placed in the data object
/// </summary>
public IList ModelObjects {
get { return modelObjects; }
}
private readonly IList modelObjects;
#endregion
/// <summary>
/// Put a text and HTML representation of our model objects
/// into the data object.
/// </summary>
public void CreateTextFormats() {
OLVExporter exporter = this.CreateExporter();
// Put both the text and html versions onto the clipboard.
// For some reason, SetText() with UnicodeText doesn't set the basic CF_TEXT format,
// but using SetData() does.
//this.SetText(sbText.ToString(), TextDataFormat.UnicodeText);
this.SetData(exporter.ExportTo(OLVExporter.ExportFormat.TabSeparated));
string exportTo = exporter.ExportTo(OLVExporter.ExportFormat.CSV);
if (!String.IsNullOrEmpty(exportTo))
this.SetText(exportTo, TextDataFormat.CommaSeparatedValue);
this.SetText(ConvertToHtmlFragment(exporter.ExportTo(OLVExporter.ExportFormat.HTML)), TextDataFormat.Html);
}
/// <summary>
/// Create an exporter for the data contained in this object
/// </summary>
/// <returns></returns>
protected OLVExporter CreateExporter() {
OLVExporter exporter = new OLVExporter(this.ListView);
exporter.IncludeColumnHeaders = this.IncludeColumnHeaders;
exporter.IncludeHiddenColumns = this.IncludeHiddenColumns;
exporter.ModelObjects = this.ModelObjects;
return exporter;
}
/// <summary>
/// Make a HTML representation of our model objects
/// </summary>
[Obsolete("Use OLVExporter directly instead", false)]
public string CreateHtml() {
OLVExporter exporter = this.CreateExporter();
return exporter.ExportTo(OLVExporter.ExportFormat.HTML);
}
/// <summary>
/// Convert the fragment of HTML into the Clipboards HTML format.
/// </summary>
/// <remarks>The HTML format is found here http://msdn2.microsoft.com/en-us/library/aa767917.aspx
/// </remarks>
/// <param name="fragment">The HTML to put onto the clipboard. It must be valid HTML!</param>
/// <returns>A string that can be put onto the clipboard and will be recognized as HTML</returns>
private string ConvertToHtmlFragment(string fragment) {
// Minimal implementation of HTML clipboard format
const string SOURCE = "http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView";
const String MARKER_BLOCK =
"Version:1.0\r\n" +
"StartHTML:{0,8}\r\n" +
"EndHTML:{1,8}\r\n" +
"StartFragment:{2,8}\r\n" +
"EndFragment:{3,8}\r\n" +
"StartSelection:{2,8}\r\n" +
"EndSelection:{3,8}\r\n" +
"SourceURL:{4}\r\n" +
"{5}";
int prefixLength = String.Format(MARKER_BLOCK, 0, 0, 0, 0, SOURCE, "").Length;
const String DEFAULT_HTML_BODY =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" +
"<HTML><HEAD></HEAD><BODY><!--StartFragment-->{0}<!--EndFragment--></BODY></HTML>";
string html = String.Format(DEFAULT_HTML_BODY, fragment);
int startFragment = prefixLength + html.IndexOf(fragment, StringComparison.Ordinal);
int endFragment = startFragment + fragment.Length;
return String.Format(MARKER_BLOCK, prefixLength, prefixLength + html.Length, startFragment, endFragment, SOURCE, html);
}
}
}

View File

@@ -0,0 +1,165 @@
/*
* FastDataListView - A data bindable listview that has the speed of a virtual list
*
* Author: Phillip Piper
* Date: 22/09/2010 8:11 AM
*
* Change log:
* 2015-02-02 JPP - Made Unfreezing more efficient by removing a redundant BuildList() call
* v2.6
* 2010-09-22 JPP - Initial version
*
* Copyright (C) 2006-2015 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing.Design;
namespace BrightIdeasSoftware
{
/// <summary>
/// A FastDataListView virtualizes the display of data from a DataSource. It operates on
/// DataSets and DataTables in the same way as a DataListView, but does so much more efficiently.
/// </summary>
/// <remarks>
/// <para>
/// A FastDataListView still has to load all its data from the DataSource. If you have SQL statement
/// that returns 1 million rows, all 1 million rows will still need to read from the database.
/// However, once the rows are loaded, the FastDataListView will only build rows as they are displayed.
/// </para>
/// </remarks>
public class FastDataListView : FastObjectListView
{
protected override void Dispose(bool disposing)
{
if (this.adapter != null) {
this.adapter.Dispose();
this.adapter = null;
}
base.Dispose(disposing);
}
#region Public Properties
/// <summary>
/// Gets or sets whether or not columns will be automatically generated to show the
/// columns when the DataSource is set.
/// </summary>
/// <remarks>This must be set before the DataSource is set. It has no effect afterwards.</remarks>
[Category("Data"),
Description("Should the control automatically generate columns from the DataSource"),
DefaultValue(true)]
public bool AutoGenerateColumns
{
get { return this.Adapter.AutoGenerateColumns; }
set { this.Adapter.AutoGenerateColumns = value; }
}
/// <summary>
/// Get or set the VirtualListDataSource that will be displayed in this list view.
/// </summary>
/// <remarks>The VirtualListDataSource should implement either <see cref="IList"/>, <see cref="IBindingList"/>,
/// or <see cref="IListSource"/>. Some common examples are the following types of objects:
/// <list type="unordered">
/// <item><description><see cref="DataView"/></description></item>
/// <item><description><see cref="DataTable"/></description></item>
/// <item><description><see cref="DataSet"/></description></item>
/// <item><description><see cref="DataViewManager"/></description></item>
/// <item><description><see cref="BindingSource"/></description></item>
/// </list>
/// <para>When binding to a list container (i.e. one that implements the
/// <see cref="IListSource"/> interface, such as <see cref="DataSet"/>)
/// you must also set the <see cref="DataMember"/> property in order
/// to identify which particular list you would like to display. You
/// may also set the <see cref="DataMember"/> property even when
/// VirtualListDataSource refers to a list, since <see cref="DataMember"/> can
/// also be used to navigate relations between lists.</para>
/// </remarks>
[Category("Data"),
TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design")]
public virtual Object DataSource {
get { return this.Adapter.DataSource; }
set { this.Adapter.DataSource = value; }
}
/// <summary>
/// Gets or sets the name of the list or table in the data source for which the DataListView is displaying data.
/// </summary>
/// <remarks>If the data source is not a DataSet or DataViewManager, this property has no effect</remarks>
[Category("Data"),
Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(UITypeEditor)),
DefaultValue("")]
public virtual string DataMember {
get { return this.Adapter.DataMember; }
set { this.Adapter.DataMember = value; }
}
#endregion
#region Implementation properties
/// <summary>
/// Gets or sets the DataSourceAdaptor that does the bulk of the work needed
/// for data binding.
/// </summary>
protected DataSourceAdapter Adapter {
get {
if (adapter == null)
adapter = this.CreateDataSourceAdapter();
return adapter;
}
set { adapter = value; }
}
private DataSourceAdapter adapter;
#endregion
#region Implementation
/// <summary>
/// Create the DataSourceAdapter that this control will use.
/// </summary>
/// <returns>A DataSourceAdapter configured for this list</returns>
/// <remarks>Subclasses should override this to create their
/// own specialized adapters</remarks>
protected virtual DataSourceAdapter CreateDataSourceAdapter() {
return new DataSourceAdapter(this);
}
/// <summary>
/// Change the Unfreeze behaviour
/// </summary>
protected override void DoUnfreeze()
{
// Copied from base method, but we don't need to BuildList() since we know that our
// data adaptor is going to do that immediately after this method exits.
this.EndUpdate();
this.ResizeFreeSpaceFillingColumns();
// this.BuildList();
}
#endregion
}
}

View File

@@ -0,0 +1,419 @@
/*
* FastObjectListView - A listview that behaves like an ObjectListView but has the speed of a virtual list
*
* Author: Phillip Piper
* Date: 27/09/2008 9:15 AM
*
* Change log:
* 2014-10-15 JPP - Fire Filter event when applying filters
* v2.8
* 2012-06-11 JPP - Added more efficient version of FilteredObjects
* v2.5.1
* 2011-04-25 JPP - Fixed problem with removing objects from filtered or sorted list
* v2.4
* 2010-04-05 JPP - Added filtering
* v2.3
* 2009-08-27 JPP - Added GroupingStrategy
* - Added optimized Objects property
* v2.2.1
* 2009-01-07 JPP - Made all public and protected methods virtual
* 2008-09-27 JPP - Separated from ObjectListView.cs
*
* Copyright (C) 2006-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// A FastObjectListView trades function for speed.
/// </summary>
/// <remarks>
/// <para>On my mid-range laptop, this view builds a list of 10,000 objects in 0.1 seconds,
/// as opposed to a normal ObjectListView which takes 10-15 seconds. Lists of up to 50,000 items should be
/// able to be handled with sub-second response times even on low end machines.</para>
/// <para>
/// A FastObjectListView is implemented as a virtual list with many of the virtual modes limits (e.g. no sorting)
/// fixed through coding. There are some functions that simply cannot be provided. Specifically, a FastObjectListView cannot:
/// <list type="bullet">
/// <item><description>use Tile view</description></item>
/// <item><description>show groups on XP</description></item>
/// </list>
/// </para>
/// </remarks>
public class FastObjectListView : VirtualObjectListView
{
/// <summary>
/// Make a FastObjectListView
/// </summary>
public FastObjectListView() {
this.VirtualListDataSource = new FastObjectListDataSource(this);
this.GroupingStrategy = new FastListGroupingStrategy();
}
/// <summary>
/// Gets the collection of objects that survive any filtering that may be in place.
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override IEnumerable FilteredObjects {
get {
// This is much faster than the base method
return ((FastObjectListDataSource)this.VirtualListDataSource).FilteredObjectList;
}
}
/// <summary>
/// Get/set the collection of objects that this list will show
/// </summary>
/// <remarks>
/// <para>
/// The contents of the control will be updated immediately after setting this property.
/// </para>
/// <para>This method preserves selection, if possible. Use SetObjects() if
/// you do not want to preserve the selection. Preserving selection is the slowest part of this
/// code and performance is O(n) where n is the number of selected rows.</para>
/// <para>This method is not thread safe.</para>
/// </remarks>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override IEnumerable Objects {
get {
// This is much faster than the base method
return ((FastObjectListDataSource)this.VirtualListDataSource).ObjectList;
}
set { base.Objects = value; }
}
/// <summary>
/// Move the given collection of objects to the given index.
/// </summary>
/// <remarks>This operation only makes sense on non-grouped ObjectListViews.</remarks>
/// <param name="index"></param>
/// <param name="modelObjects"></param>
public override void MoveObjects(int index, ICollection modelObjects) {
if (this.InvokeRequired) {
this.Invoke((MethodInvoker)delegate() { this.MoveObjects(index, modelObjects); });
return;
}
// If any object that is going to be moved is before the point where the insertion
// will occur, then we have to reduce the location of our insertion point
int displacedObjectCount = 0;
foreach (object modelObject in modelObjects) {
int i = this.IndexOf(modelObject);
if (i >= 0 && i <= index)
displacedObjectCount++;
}
index -= displacedObjectCount;
this.BeginUpdate();
try {
this.RemoveObjects(modelObjects);
this.InsertObjects(index, modelObjects);
}
finally {
this.EndUpdate();
}
}
/// <summary>
/// Remove any sorting and revert to the given order of the model objects
/// </summary>
/// <remarks>To be really honest, Unsort() doesn't work on FastObjectListViews since
/// the original ordering of model objects is lost when Sort() is called. So this method
/// effectively just turns off sorting.</remarks>
public override void Unsort() {
this.ShowGroups = false;
this.PrimarySortColumn = null;
this.PrimarySortOrder = SortOrder.None;
this.SetObjects(this.Objects);
}
}
/// <summary>
/// Provide a data source for a FastObjectListView
/// </summary>
/// <remarks>
/// This class isn't intended to be used directly, but it is left as a public
/// class just in case someone wants to subclass it.
/// </remarks>
/// <remarks>
/// Create a FastObjectListDataSource
/// </remarks>
/// <param name="listView"></param>
public class FastObjectListDataSource(FastObjectListView listView) : AbstractVirtualListDataSource(listView)
{
#region IVirtualListDataSource Members
/// <summary>
/// Get n'th object
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public override object GetNthObject(int n) {
if (n >= 0 && n < this.filteredObjectList.Count)
return this.filteredObjectList[n];
return null;
}
/// <summary>
/// How many items are in the data source
/// </summary>
/// <returns></returns>
public override int GetObjectCount() {
return this.filteredObjectList.Count;
}
/// <summary>
/// Get the index of the given model
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public override int GetObjectIndex(object model) {
int index;
if (model != null && this.objectsToIndexMap.TryGetValue(model, out index))
return index;
return -1;
}
/// <summary>
///
/// </summary>
/// <param name="text"></param>
/// <param name="first"></param>
/// <param name="last"></param>
/// <param name="column"></param>
/// <returns></returns>
public override int SearchText(string text, int first, int last, OLVColumn column) {
if (first <= last) {
for (int i = first; i <= last; i++) {
string data = column.GetStringValue(this.listView.GetNthItemInDisplayOrder(i).RowObject);
if (data.StartsWith(text, StringComparison.CurrentCultureIgnoreCase))
return i;
}
} else {
for (int i = first; i >= last; i--) {
string data = column.GetStringValue(this.listView.GetNthItemInDisplayOrder(i).RowObject);
if (data.StartsWith(text, StringComparison.CurrentCultureIgnoreCase))
return i;
}
}
return -1;
}
/// <summary>
///
/// </summary>
/// <param name="column"></param>
/// <param name="sortOrder"></param>
public override void Sort(OLVColumn column, SortOrder sortOrder) {
if (sortOrder != SortOrder.None) {
ModelObjectComparer comparer = new ModelObjectComparer(column, sortOrder, this.listView.SecondarySortColumn, this.listView.SecondarySortOrder);
this.fullObjectList.Sort(comparer);
this.filteredObjectList.Sort(comparer);
}
this.RebuildIndexMap();
}
/// <summary>
///
/// </summary>
/// <param name="modelObjects"></param>
public override void AddObjects(ICollection modelObjects) {
foreach (object modelObject in modelObjects) {
if (modelObject != null)
this.fullObjectList.Add(modelObject);
}
this.FilterObjects();
this.RebuildIndexMap();
}
/// <summary>
///
/// </summary>
/// <param name="index"></param>
/// <param name="modelObjects"></param>
public override void InsertObjects(int index, ICollection modelObjects) {
this.fullObjectList.InsertRange(index, modelObjects);
this.FilterObjects();
this.RebuildIndexMap();
}
/// <summary>
/// Remove the given collection of models from this source.
/// </summary>
/// <param name="modelObjects"></param>
public override void RemoveObjects(ICollection modelObjects) {
// We have to unselect any object that is about to be deleted
List<int> indicesToRemove = new List<int>();
foreach (object modelObject in modelObjects) {
int i = this.GetObjectIndex(modelObject);
if (i >= 0)
indicesToRemove.Add(i);
}
// Sort the indices from highest to lowest so that we
// remove latter ones before earlier ones. In this way, the
// indices of the rows doesn't change after the deletes.
indicesToRemove.Sort();
indicesToRemove.Reverse();
foreach (int i in indicesToRemove)
this.listView.SelectedIndices.Remove(i);
// Remove the objects from the unfiltered list
foreach (object modelObject in modelObjects)
this.fullObjectList.Remove(modelObject);
this.FilterObjects();
this.RebuildIndexMap();
}
/// <summary>
///
/// </summary>
/// <param name="collection"></param>
public override void SetObjects(IEnumerable collection) {
ArrayList newObjects = ObjectListView.EnumerableToArray(collection, true);
this.fullObjectList = newObjects;
this.FilterObjects();
this.RebuildIndexMap();
}
/// <summary>
/// Update/replace the nth object with the given object
/// </summary>
/// <param name="index"></param>
/// <param name="modelObject"></param>
public override void UpdateObject(int index, object modelObject) {
if (index < 0 || index >= this.filteredObjectList.Count)
return;
int i = this.fullObjectList.IndexOf(this.filteredObjectList[index]);
if (i < 0)
return;
if (ReferenceEquals(this.fullObjectList[i], modelObject))
return;
this.fullObjectList[i] = modelObject;
this.filteredObjectList[index] = modelObject;
this.objectsToIndexMap[modelObject] = index;
}
private ArrayList fullObjectList = new ArrayList();
private ArrayList filteredObjectList = new ArrayList();
private IModelFilter modelFilter;
private IListFilter listFilter;
#endregion
#region IFilterableDataSource Members
/// <summary>
/// Apply the given filters to this data source. One or both may be null.
/// </summary>
/// <param name="iModelFilter"></param>
/// <param name="iListFilter"></param>
public override void ApplyFilters(IModelFilter iModelFilter, IListFilter iListFilter) {
this.modelFilter = iModelFilter;
this.listFilter = iListFilter;
this.SetObjects(this.fullObjectList);
}
#endregion
#region Implementation
/// <summary>
/// Gets the full list of objects being used for this fast list.
/// This list is unfiltered.
/// </summary>
public ArrayList ObjectList {
get { return fullObjectList; }
}
/// <summary>
/// Gets the list of objects from ObjectList which survive any installed filters.
/// </summary>
public ArrayList FilteredObjectList {
get { return filteredObjectList; }
}
/// <summary>
/// Rebuild the map that remembers which model object is displayed at which line
/// </summary>
protected void RebuildIndexMap() {
this.objectsToIndexMap.Clear();
for (int i = 0; i < this.filteredObjectList.Count; i++)
this.objectsToIndexMap[this.filteredObjectList[i]] = i;
}
readonly Dictionary<Object, int> objectsToIndexMap = new Dictionary<Object, int>();
/// <summary>
/// Build our filtered list from our full list.
/// </summary>
protected void FilterObjects() {
// If this list isn't filtered, we don't need to do anything else
if (!this.listView.UseFiltering) {
this.filteredObjectList = new ArrayList(this.fullObjectList);
return;
}
// Tell the world to filter the objects. If they do so, don't do anything else
// ReSharper disable PossibleMultipleEnumeration
FilterEventArgs args = new FilterEventArgs(this.fullObjectList);
this.listView.OnFilter(args);
if (args.FilteredObjects != null) {
this.filteredObjectList = ObjectListView.EnumerableToArray(args.FilteredObjects, false);
return;
}
IEnumerable objects = (this.listFilter == null) ?
this.fullObjectList : this.listFilter.Filter(this.fullObjectList);
// Apply the object filter if there is one
if (this.modelFilter == null) {
this.filteredObjectList = ObjectListView.EnumerableToArray(objects, false);
} else {
this.filteredObjectList = new ArrayList();
foreach (object model in objects) {
if (this.modelFilter.Filter(model))
this.filteredObjectList.Add(model);
}
}
}
#endregion
}
}

View File

@@ -0,0 +1,125 @@
/*
* Cluster - Implements a simple cluster
*
* Author: Phillip Piper
* Date: 3-March-2011 10:53 pm
*
* Change log:
* 2011-03-03 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
namespace BrightIdeasSoftware {
/// <summary>
/// Concrete implementation of the ICluster interface.
/// </summary>
public class Cluster : ICluster {
#region Life and death
/// <summary>
/// Create a cluster
/// </summary>
/// <param name="key">The key for the cluster</param>
public Cluster(object key) {
this.Count = 1;
this.ClusterKey = key;
}
#endregion
#region Public overrides
/// <summary>
/// Return a string representation of this cluster
/// </summary>
/// <returns></returns>
public override string ToString() {
return this.DisplayLabel ?? "[empty]";
}
#endregion
#region Implementation of ICluster
/// <summary>
/// Gets or sets how many items belong to this cluster
/// </summary>
public int Count {
get { return count; }
set { count = value; }
}
private int count;
/// <summary>
/// Gets or sets the label that will be shown to the user to represent
/// this cluster
/// </summary>
public string DisplayLabel {
get { return displayLabel; }
set { displayLabel = value; }
}
private string displayLabel;
/// <summary>
/// Gets or sets the actual data object that all members of this cluster
/// have commonly returned.
/// </summary>
public object ClusterKey {
get { return clusterKey; }
set { clusterKey = value; }
}
private object clusterKey;
#endregion
#region Implementation of IComparable
/// <summary>
/// Return an indication of the ordering between this object and the given one
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public int CompareTo(object other) {
if (other == null || other == System.DBNull.Value)
return 1;
ICluster otherCluster = other as ICluster;
if (otherCluster == null)
return 1;
string keyAsString = this.ClusterKey as string;
if (keyAsString != null)
return String.Compare(keyAsString, otherCluster.ClusterKey as string, StringComparison.CurrentCultureIgnoreCase);
IComparable keyAsComparable = this.ClusterKey as IComparable;
if (keyAsComparable != null)
return keyAsComparable.CompareTo(otherCluster.ClusterKey);
return -1;
}
#endregion
}
}

View File

@@ -0,0 +1,189 @@
/*
* ClusteringStrategy - Implements a simple clustering strategy
*
* Author: Phillip Piper
* Date: 3-March-2011 10:53 pm
*
* Change log:
* 2011-03-03 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Text;
namespace BrightIdeasSoftware {
/// <summary>
/// This class provides a useful base implemention of a clustering
/// strategy where the clusters are grouped around the value of a given column.
/// </summary>
public class ClusteringStrategy : IClusteringStrategy {
#region Static properties
/// <summary>
/// This field is the text that will be shown to the user when a cluster
/// key is null. It is exposed so it can be localized.
/// </summary>
static public string NULL_LABEL = "[null]";
/// <summary>
/// This field is the text that will be shown to the user when a cluster
/// key is empty (i.e. a string of zero length). It is exposed so it can be localized.
/// </summary>
static public string EMPTY_LABEL = "[empty]";
/// <summary>
/// Gets or sets the format that will be used by default for clusters that only
/// contain 1 item. The format string must accept two placeholders:
/// - {0} is the cluster key converted to a string
/// - {1} is the number of items in the cluster (always 1 in this case)
/// </summary>
static public string DefaultDisplayLabelFormatSingular {
get { return defaultDisplayLabelFormatSingular; }
set { defaultDisplayLabelFormatSingular = value; }
}
static private string defaultDisplayLabelFormatSingular = "{0} ({1} item)";
/// <summary>
/// Gets or sets the format that will be used by default for clusters that
/// contain 0 or two or more items. The format string must accept two placeholders:
/// - {0} is the cluster key converted to a string
/// - {1} is the number of items in the cluster
/// </summary>
static public string DefaultDisplayLabelFormatPlural {
get { return defaultDisplayLabelFormatPural; }
set { defaultDisplayLabelFormatPural = value; }
}
static private string defaultDisplayLabelFormatPural = "{0} ({1} items)";
#endregion
#region Life and death
/// <summary>
/// Create a clustering strategy
/// </summary>
public ClusteringStrategy() {
this.DisplayLabelFormatSingular = DefaultDisplayLabelFormatSingular;
this.DisplayLabelFormatPlural = DefaultDisplayLabelFormatPlural;
}
#endregion
#region Public properties
/// <summary>
/// Gets or sets the column upon which this strategy is operating
/// </summary>
public OLVColumn Column {
get { return column; }
set { column = value; }
}
private OLVColumn column;
/// <summary>
/// Gets or sets the format that will be used when the cluster
/// contains only 1 item. The format string must accept two placeholders:
/// - {0} is the cluster key converted to a string
/// - {1} is the number of items in the cluster (always 1 in this case)
/// </summary>
/// <remarks>If this is not set, the value from
/// ClusteringStrategy.DefaultDisplayLabelFormatSingular will be used</remarks>
public string DisplayLabelFormatSingular {
get { return displayLabelFormatSingular; }
set { displayLabelFormatSingular = value; }
}
private string displayLabelFormatSingular;
/// <summary>
/// Gets or sets the format that will be used when the cluster
/// contains 0 or two or more items. The format string must accept two placeholders:
/// - {0} is the cluster key converted to a string
/// - {1} is the number of items in the cluster
/// </summary>
/// <remarks>If this is not set, the value from
/// ClusteringStrategy.DefaultDisplayLabelFormatPlural will be used</remarks>
public string DisplayLabelFormatPlural {
get { return displayLabelFormatPural; }
set { displayLabelFormatPural = value; }
}
private string displayLabelFormatPural;
#endregion
#region ICluster implementation
/// <summary>
/// Get the cluster key by which the given model will be partitioned by this strategy
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
virtual public object GetClusterKey(object model) {
return this.Column.GetValue(model);
}
/// <summary>
/// Create a cluster to hold the given cluster key
/// </summary>
/// <param name="clusterKey"></param>
/// <returns></returns>
virtual public ICluster CreateCluster(object clusterKey) {
return new Cluster(clusterKey);
}
/// <summary>
/// Gets the display label that the given cluster should use
/// </summary>
/// <param name="cluster"></param>
/// <returns></returns>
virtual public string GetClusterDisplayLabel(ICluster cluster) {
string s = this.Column.ValueToString(cluster.ClusterKey) ?? NULL_LABEL;
if (String.IsNullOrEmpty(s))
s = EMPTY_LABEL;
return this.ApplyDisplayFormat(cluster, s);
}
/// <summary>
/// Create a filter that will include only model objects that
/// match one or more of the given values.
/// </summary>
/// <param name="valuesChosenForFiltering"></param>
/// <returns></returns>
virtual public IModelFilter CreateFilter(IList valuesChosenForFiltering) {
return new OneOfFilter(this.GetClusterKey, valuesChosenForFiltering);
}
/// <summary>
/// Create a label that combines the string representation of the cluster
/// key with a format string that holds an "X [N items in cluster]" type layout.
/// </summary>
/// <param name="cluster"></param>
/// <param name="s"></param>
/// <returns></returns>
virtual protected string ApplyDisplayFormat(ICluster cluster, string s) {
string format = (cluster.Count == 1) ? this.DisplayLabelFormatSingular : this.DisplayLabelFormatPlural;
return String.IsNullOrEmpty(format) ? s : String.Format(format, s, cluster.Count);
}
#endregion
}
}

View File

@@ -0,0 +1,70 @@
/*
* ClusteringStrategy - Implements a simple clustering strategy
*
* Author: Phillip Piper
* Date: 1-April-2011 8:12am
*
* Change log:
* 2011-04-01 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
namespace BrightIdeasSoftware {
/// <summary>
/// This class calculates clusters from the groups that the column uses.
/// </summary>
/// <remarks>
/// <para>
/// This is the default strategy for all non-date, filterable columns.
/// </para>
/// <para>
/// This class does not strictly mimic the groups created by the given column.
/// In particular, if the programmer changes the default grouping technique
/// by listening for grouping events, this class will not mimic that behaviour.
/// </para>
/// </remarks>
public class ClustersFromGroupsStrategy : ClusteringStrategy {
/// <summary>
/// Get the cluster key by which the given model will be partitioned by this strategy
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public override object GetClusterKey(object model) {
return this.Column.GetGroupKey(model);
}
/// <summary>
/// Gets the display label that the given cluster should use
/// </summary>
/// <param name="cluster"></param>
/// <returns></returns>
public override string GetClusterDisplayLabel(ICluster cluster) {
string s = this.Column.ConvertGroupKeyToTitle(cluster.ClusterKey);
if (String.IsNullOrEmpty(s))
s = EMPTY_LABEL;
return this.ApplyDisplayFormat(cluster, s);
}
}
}

View File

@@ -0,0 +1,187 @@
/*
* DateTimeClusteringStrategy - A strategy to cluster objects by a date time
*
* Author: Phillip Piper
* Date: 30-March-2011 9:40am
*
* Change log:
* 2011-03-30 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Globalization;
namespace BrightIdeasSoftware {
/// <summary>
/// This enum is used to indicate various portions of a datetime
/// </summary>
[Flags]
public enum DateTimePortion {
/// <summary>
/// Year
/// </summary>
Year = 0x01,
/// <summary>
/// Month
/// </summary>
Month = 0x02,
/// <summary>
/// Day of the month
/// </summary>
Day = 0x04,
/// <summary>
/// Hour
/// </summary>
Hour = 0x08,
/// <summary>
/// Minute
/// </summary>
Minute = 0x10,
/// <summary>
/// Second
/// </summary>
Second = 0x20
}
/// <summary>
/// This class implements a strategy where the model objects are clustered
/// according to some portion of the datetime value in the configured column.
/// </summary>
/// <remarks>To create a strategy that grouped people who were born in
/// the same month, you would create a strategy that extracted just
/// the month, and formatted it to show just the month's name. Like this:
/// </remarks>
/// <example>
/// someColumn.ClusteringStrategy = new DateTimeClusteringStrategy(DateTimePortion.Month, "MMMM");
/// </example>
public class DateTimeClusteringStrategy : ClusteringStrategy {
#region Life and death
/// <summary>
/// Create a strategy that clusters by month/year
/// </summary>
public DateTimeClusteringStrategy()
: this(DateTimePortion.Year | DateTimePortion.Month, "MMMM yyyy") {
}
/// <summary>
/// Create a strategy that clusters around the given parts
/// </summary>
/// <param name="portions"></param>
/// <param name="format"></param>
public DateTimeClusteringStrategy(DateTimePortion portions, string format) {
this.Portions = portions;
this.Format = format;
}
#endregion
#region Properties
/// <summary>
/// Gets or sets the format string will will be used to create a user-presentable
/// version of the cluster key.
/// </summary>
/// <remarks>The format should use the date/time format strings, as documented
/// in the Windows SDK. Both standard formats and custom format will work.</remarks>
/// <example>"D" - long date pattern</example>
/// <example>"MMMM, yyyy" - "January, 1999"</example>
public string Format {
get { return format; }
set { format = value; }
}
private string format;
/// <summary>
/// Gets or sets the parts of the DateTime that will be extracted when
/// determining the clustering key for an object.
/// </summary>
public DateTimePortion Portions {
get { return portions; }
set { portions = value; }
}
private DateTimePortion portions = DateTimePortion.Year | DateTimePortion.Month;
#endregion
#region IClusterStrategy implementation
/// <summary>
/// Get the cluster key by which the given model will be partitioned by this strategy
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public override object GetClusterKey(object model) {
// Get the data attribute we want from the given model
// Make sure the returned value is a DateTime
DateTime? dateTime = this.Column.GetValue(model) as DateTime?;
if (!dateTime.HasValue)
return null;
// Extract the parts of the datetime that we are intereted in.
// Even if we aren't interested in a particular portion, we still have to give it a reasonable default
// otherwise we won't be able to build a DateTime object for it
int year = ((this.Portions & DateTimePortion.Year) == DateTimePortion.Year) ? dateTime.Value.Year : 1;
int month = ((this.Portions & DateTimePortion.Month) == DateTimePortion.Month) ? dateTime.Value.Month : 1;
int day = ((this.Portions & DateTimePortion.Day) == DateTimePortion.Day) ? dateTime.Value.Day : 1;
int hour = ((this.Portions & DateTimePortion.Hour) == DateTimePortion.Hour) ? dateTime.Value.Hour : 0;
int minute = ((this.Portions & DateTimePortion.Minute) == DateTimePortion.Minute) ? dateTime.Value.Minute : 0;
int second = ((this.Portions & DateTimePortion.Second) == DateTimePortion.Second) ? dateTime.Value.Second : 0;
return new DateTime(year, month, day, hour, minute, second);
}
/// <summary>
/// Gets the display label that the given cluster should use
/// </summary>
/// <param name="cluster"></param>
/// <returns></returns>
public override string GetClusterDisplayLabel(ICluster cluster) {
DateTime? dateTime = cluster.ClusterKey as DateTime?;
return this.ApplyDisplayFormat(cluster, dateTime.HasValue ? this.DateToString(dateTime.Value) : NULL_LABEL);
}
/// <summary>
/// Convert the given date into a user presentable string
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
protected virtual string DateToString(DateTime dateTime) {
if (String.IsNullOrEmpty(this.Format))
return dateTime.ToString(CultureInfo.CurrentUICulture);
try {
return dateTime.ToString(this.Format);
}
catch (FormatException) {
return String.Format("Bad format string '{0}' for value '{1}'", this.Format, dateTime);
}
}
#endregion
}
}

View File

@@ -0,0 +1,369 @@
/*
* FilterMenuBuilder - Responsible for creating a Filter menu
*
* Author: Phillip Piper
* Date: 4-March-2011 11:59 pm
*
* Change log:
* 2012-05-20 JPP - Allow the same model object to be in multiple clusters
* Useful for xor'ed flag fields, and multi-value strings
* (e.g. hobbies that are stored as comma separated values).
* v2.5.1
* 2012-04-14 JPP - Fixed rare bug with clustering an empty list (SF #3445118)
* v2.5
* 2011-04-12 JPP - Added some images to menu
* 2011-03-04 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Drawing;
namespace BrightIdeasSoftware {
/// <summary>
/// Instances of this class know how to build a Filter menu.
/// It is responsible for clustering the values in the target column,
/// build a menu that shows those clusters, and then constructing
/// a filter that will enact the users choices.
/// </summary>
/// <remarks>
/// Almost all of the methods in this class are declared as "virtual protected"
/// so that subclasses can provide alternative behaviours.
/// </remarks>
public class FilterMenuBuilder {
#region Static properties
/// <summary>
/// Gets or sets the string that labels the Apply button.
/// Exposed so it can be localized.
/// </summary>
static public string APPLY_LABEL = "Apply";
/// <summary>
/// Gets or sets the string that labels the Clear All menu item.
/// Exposed so it can be localized.
/// </summary>
static public string CLEAR_ALL_FILTERS_LABEL = "Clear All Filters";
/// <summary>
/// Gets or sets the string that labels the Filtering menu as a whole..
/// Exposed so it can be localized.
/// </summary>
static public string FILTERING_LABEL = "Filtering";
/// <summary>
/// Gets or sets the string that represents Select All values.
/// If this is set to null or empty, no Select All option will be included.
/// Exposed so it can be localized.
/// </summary>
static public string SELECT_ALL_LABEL = "Select All";
/// <summary>
/// Gets or sets the image that will be placed next to the Clear Filtering menu item
/// </summary>
static public Bitmap ClearFilteringImage = BrightIdeasSoftware.Properties.Resources.ClearFiltering;
/// <summary>
/// Gets or sets the image that will be placed next to all "Apply" menu items on the filtering menu
/// </summary>
static public Bitmap FilteringImage = BrightIdeasSoftware.Properties.Resources.Filtering;
#endregion
#region Public properties
/// <summary>
/// Gets or sets whether null should be considered as a valid data value.
/// If this is true (the default), then a cluster will null as a key will be allow.
/// If this is false, object that return a cluster key of null will ignored.
/// </summary>
public bool TreatNullAsDataValue {
get { return treatNullAsDataValue; }
set { treatNullAsDataValue = value; }
}
private bool treatNullAsDataValue = true;
/// <summary>
/// Gets or sets the maximum number of objects that the clustering strategy
/// will consider. This should be large enough to collect all unique clusters,
/// but small enough to finish in a reasonable time.
/// </summary>
/// <remarks>The default value is 10,000. This should be perfectly
/// acceptable for almost all lists.</remarks>
public int MaxObjectsToConsider {
get { return maxObjectsToConsider; }
set { maxObjectsToConsider = value; }
}
private int maxObjectsToConsider = 10000;
#endregion
/// <summary>
/// Create a Filter menu on the given tool tip for the given column in the given ObjectListView.
/// </summary>
/// <remarks>This is the main entry point into this class.</remarks>
/// <param name="strip"></param>
/// <param name="listView"></param>
/// <param name="column"></param>
/// <returns>The strip that should be shown to the user</returns>
virtual public ToolStripDropDown MakeFilterMenu(ToolStripDropDown strip, ObjectListView listView, OLVColumn column) {
if (strip == null) throw new ArgumentNullException("strip");
if (listView == null) throw new ArgumentNullException("listView");
if (column == null) throw new ArgumentNullException("column");
if (!column.UseFiltering || column.ClusteringStrategy == null || listView.Objects == null)
return strip;
List<ICluster> clusters = this.Cluster(column.ClusteringStrategy, listView, column);
if (clusters.Count > 0) {
this.SortClusters(column.ClusteringStrategy, clusters);
strip.Items.Add(this.CreateFilteringMenuItem(column, clusters));
}
return strip;
}
/// <summary>
/// Create a collection of clusters that should be presented to the user
/// </summary>
/// <param name="strategy"></param>
/// <param name="listView"></param>
/// <param name="column"></param>
/// <returns></returns>
virtual protected List<ICluster> Cluster(IClusteringStrategy strategy, ObjectListView listView, OLVColumn column) {
// Build a map that correlates cluster key to clusters
NullableDictionary<object, ICluster> map = new NullableDictionary<object, ICluster>();
int count = 0;
foreach (object model in listView.ObjectsForClustering) {
this.ClusterOneModel(strategy, map, model);
if (count++ > this.MaxObjectsToConsider)
break;
}
// Now that we know exactly how many items are in each cluster, create a label for it
foreach (ICluster cluster in map.Values)
cluster.DisplayLabel = strategy.GetClusterDisplayLabel(cluster);
return new List<ICluster>(map.Values);
}
private void ClusterOneModel(IClusteringStrategy strategy, NullableDictionary<object, ICluster> map, object model) {
object clusterKey = strategy.GetClusterKey(model);
// If the returned value is an IEnumerable, that means the given model can belong to more than one cluster
IEnumerable keyEnumerable = clusterKey as IEnumerable;
if (clusterKey is string || keyEnumerable == null)
keyEnumerable = new object[] {clusterKey};
// Deal with nulls and DBNulls
ArrayList nullCorrected = new ArrayList();
foreach (object key in keyEnumerable) {
if (key == null || key == System.DBNull.Value) {
if (this.TreatNullAsDataValue)
nullCorrected.Add(null);
} else nullCorrected.Add(key);
}
// Group by key
foreach (object key in nullCorrected) {
if (map.ContainsKey(key))
map[key].Count += 1;
else
map[key] = strategy.CreateCluster(key);
}
}
/// <summary>
/// Order the given list of clusters in the manner in which they should be presented to the user.
/// </summary>
/// <param name="strategy"></param>
/// <param name="clusters"></param>
virtual protected void SortClusters(IClusteringStrategy strategy, List<ICluster> clusters) {
clusters.Sort();
}
/// <summary>
/// Do the work of making a menu that shows the clusters to the users
/// </summary>
/// <param name="column"></param>
/// <param name="clusters"></param>
/// <returns></returns>
virtual protected ToolStripMenuItem CreateFilteringMenuItem(OLVColumn column, List<ICluster> clusters) {
ToolStripCheckedListBox checkedList = new ToolStripCheckedListBox();
checkedList.Tag = column;
foreach (ICluster cluster in clusters)
checkedList.AddItem(cluster, column.ValuesChosenForFiltering.Contains(cluster.ClusterKey));
if (!String.IsNullOrEmpty(SELECT_ALL_LABEL)) {
int checkedCount = checkedList.CheckedItems.Count;
if (checkedCount == 0)
checkedList.AddItem(SELECT_ALL_LABEL, CheckState.Unchecked);
else
checkedList.AddItem(SELECT_ALL_LABEL, checkedCount == clusters.Count ? CheckState.Checked : CheckState.Indeterminate);
}
checkedList.ItemCheck += new ItemCheckEventHandler(HandleItemCheckedWrapped);
ToolStripMenuItem clearAll = new ToolStripMenuItem(CLEAR_ALL_FILTERS_LABEL, ClearFilteringImage, delegate(object sender, EventArgs args) {
this.ClearAllFilters(column);
});
ToolStripMenuItem apply = new ToolStripMenuItem(APPLY_LABEL, FilteringImage, delegate(object sender, EventArgs args) {
this.EnactFilter(checkedList, column);
});
ToolStripMenuItem subMenu = new ToolStripMenuItem(FILTERING_LABEL, null, new ToolStripItem[] {
clearAll, new ToolStripSeparator(), checkedList, apply });
return subMenu;
}
/// <summary>
/// Wrap a protected section around the real HandleItemChecked method, so that if
/// that method tries to change a "checkedness" of an item, we don't get a recursive
/// stack error. Effectively, this ensure that HandleItemChecked is only called
/// in response to a user action.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void HandleItemCheckedWrapped(object sender, ItemCheckEventArgs e) {
if (alreadyInHandleItemChecked)
return;
try {
alreadyInHandleItemChecked = true;
this.HandleItemChecked(sender, e);
}
finally {
alreadyInHandleItemChecked = false;
}
}
bool alreadyInHandleItemChecked = false;
/// <summary>
/// Handle a user-generated ItemCheck event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
virtual protected void HandleItemChecked(object sender, ItemCheckEventArgs e) {
ToolStripCheckedListBox checkedList = sender as ToolStripCheckedListBox;
if (checkedList == null) return;
OLVColumn column = checkedList.Tag as OLVColumn;
if (column == null) return;
ObjectListView listView = column.ListView as ObjectListView;
if (listView == null) return;
// Deal with the "Select All" item if there is one
int selectAllIndex = checkedList.Items.IndexOf(SELECT_ALL_LABEL);
if (selectAllIndex >= 0)
HandleSelectAllItem(e, checkedList, selectAllIndex);
}
/// <summary>
/// Handle any checking/unchecking of the Select All option, and keep
/// its checkedness in sync with everything else that is checked.
/// </summary>
/// <param name="e"></param>
/// <param name="checkedList"></param>
/// <param name="selectAllIndex"></param>
virtual protected void HandleSelectAllItem(ItemCheckEventArgs e, ToolStripCheckedListBox checkedList, int selectAllIndex) {
// Did they check/uncheck the "Select All"?
if (e.Index == selectAllIndex) {
if (e.NewValue == CheckState.Checked)
checkedList.CheckAll();
if (e.NewValue == CheckState.Unchecked)
checkedList.UncheckAll();
return;
}
// OK. The user didn't check/uncheck SelectAll. Now we have to update it's
// checkedness to reflect the state of everything else
// If all clusters are checked, we check the Select All.
// If no clusters are checked, the uncheck the Select All.
// For everything else, Select All is set to indeterminate.
// How many items are currenty checked?
int count = checkedList.CheckedItems.Count;
// First complication.
// The value of the Select All itself doesn't count
if (checkedList.GetItemCheckState(selectAllIndex) != CheckState.Unchecked)
count -= 1;
// Another complication.
// CheckedItems does not yet know about the item the user has just
// clicked, so we have to adjust the count of checked items to what
// it is going to be
if (e.NewValue != e.CurrentValue) {
if (e.NewValue == CheckState.Checked)
count += 1;
else
count -= 1;
}
// Update the state of the Select All item
if (count == 0)
checkedList.SetItemState(selectAllIndex, CheckState.Unchecked);
else if (count == checkedList.Items.Count - 1)
checkedList.SetItemState(selectAllIndex, CheckState.Checked);
else
checkedList.SetItemState(selectAllIndex, CheckState.Indeterminate);
}
/// <summary>
/// Clear all the filters that are applied to the given column
/// </summary>
/// <param name="column">The column from which filters are to be removed</param>
virtual protected void ClearAllFilters(OLVColumn column) {
ObjectListView olv = column.ListView as ObjectListView;
if (olv == null || olv.IsDisposed)
return;
olv.ResetColumnFiltering();
}
/// <summary>
/// Apply the selected values from the given list as a filter on the given column
/// </summary>
/// <param name="checkedList">A list in which the checked items should be used as filters</param>
/// <param name="column">The column for which a filter should be generated</param>
virtual protected void EnactFilter(ToolStripCheckedListBox checkedList, OLVColumn column) {
ObjectListView olv = column.ListView as ObjectListView;
if (olv == null || olv.IsDisposed)
return;
// Collect all the checked values
ArrayList chosenValues = new ArrayList();
foreach (object x in checkedList.CheckedItems) {
ICluster cluster = x as ICluster;
if (cluster != null) {
chosenValues.Add(cluster.ClusterKey);
}
}
column.ValuesChosenForFiltering = chosenValues;
olv.UpdateColumnFiltering();
}
}
}

View File

@@ -0,0 +1,481 @@
/*
* Filters - Filtering on ObjectListViews
*
* Author: Phillip Piper
* Date: 03/03/2010 17:00
*
* Change log:
* 2011-03-01 JPP Added CompositeAllFilter, CompositeAnyFilter and OneOfFilter
* v2.4.1
* 2010-06-23 JPP Extended TextMatchFilter to handle regular expressions and string prefix matching.
* v2.4
* 2010-03-03 JPP Initial version
*
* TO DO:
*
* Copyright (C) 2010-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Drawing;
namespace BrightIdeasSoftware
{
/// <summary>
/// Interface for model-by-model filtering
/// </summary>
public interface IModelFilter
{
/// <summary>
/// Should the given model be included when this filter is installed
/// </summary>
/// <param name="modelObject">The model object to consider</param>
/// <returns>Returns true if the model will be included by the filter</returns>
bool Filter(object modelObject);
}
/// <summary>
/// Interface for whole list filtering
/// </summary>
public interface IListFilter
{
/// <summary>
/// Return a subset of the given list of model objects as the new
/// contents of the ObjectListView
/// </summary>
/// <param name="modelObjects">The collection of model objects that the list will possibly display</param>
/// <returns>The filtered collection that holds the model objects that will be displayed.</returns>
IEnumerable Filter(IEnumerable modelObjects);
}
/// <summary>
/// Base class for model-by-model filters
/// </summary>
public class AbstractModelFilter : IModelFilter
{
/// <summary>
/// Should the given model be included when this filter is installed
/// </summary>
/// <param name="modelObject">The model object to consider</param>
/// <returns>Returns true if the model will be included by the filter</returns>
virtual public bool Filter(object modelObject) {
return true;
}
}
/// <summary>
/// This filter calls a given Predicate to decide if a model object should be included
/// </summary>
public class ModelFilter : IModelFilter
{
/// <summary>
/// Create a filter based on the given predicate
/// </summary>
/// <param name="predicate">The function that will filter objects</param>
public ModelFilter(Predicate<object> predicate) {
this.Predicate = predicate;
}
/// <summary>
/// Gets or sets the predicate used to filter model objects
/// </summary>
protected Predicate<object> Predicate {
get { return predicate; }
set { predicate = value; }
}
private Predicate<object> predicate;
/// <summary>
/// Should the given model object be included?
/// </summary>
/// <param name="modelObject"></param>
/// <returns></returns>
virtual public bool Filter(object modelObject) {
return this.Predicate == null ? true : this.Predicate(modelObject);
}
}
/// <summary>
/// A CompositeFilter joins several other filters together.
/// If there are no filters, all model objects are included
/// </summary>
abstract public class CompositeFilter : IModelFilter {
/// <summary>
/// Create an empty filter
/// </summary>
public CompositeFilter() {
}
/// <summary>
/// Create a composite filter from the given list of filters
/// </summary>
/// <param name="filters">A list of filters</param>
public CompositeFilter(IEnumerable<IModelFilter> filters) {
foreach (IModelFilter filter in filters) {
if (filter != null)
Filters.Add(filter);
}
}
/// <summary>
/// Gets or sets the filters used by this composite
/// </summary>
public IList<IModelFilter> Filters {
get { return filters; }
set { filters = value; }
}
private IList<IModelFilter> filters = new List<IModelFilter>();
/// <summary>
/// Get the sub filters that are text match filters
/// </summary>
public IEnumerable<TextMatchFilter> TextFilters {
get {
foreach (IModelFilter filter in this.Filters) {
TextMatchFilter textFilter = filter as TextMatchFilter;
if (textFilter != null)
yield return textFilter;
}
}
}
/// <summary>
/// Decide whether or not the given model should be included by the filter
/// </summary>
/// <param name="modelObject"></param>
/// <returns>True if the object is included by the filter</returns>
virtual public bool Filter(object modelObject) {
if (this.Filters == null || this.Filters.Count == 0)
return true;
return this.FilterObject(modelObject);
}
/// <summary>
/// Decide whether or not the given model should be included by the filter
/// </summary>
/// <remarks>Filters is guaranteed to be non-empty when this method is called</remarks>
/// <param name="modelObject">The model object under consideration</param>
/// <returns>True if the object is included by the filter</returns>
abstract public bool FilterObject(object modelObject);
}
/// <summary>
/// A CompositeAllFilter joins several other filters together.
/// A model object must satisfy all filters to be included.
/// If there are no filters, all model objects are included
/// </summary>
/// <remarks>
/// Create a filter
/// </remarks>
/// <param name="filters"></param>
public class CompositeAllFilter(List<IModelFilter> filters) : CompositeFilter(filters) {
/// <summary>
/// Decide whether or not the given model should be included by the filter
/// </summary>
/// <remarks>Filters is guaranteed to be non-empty when this method is called</remarks>
/// <param name="modelObject">The model object under consideration</param>
/// <returns>True if the object is included by the filter</returns>
override public bool FilterObject(object modelObject) {
foreach (IModelFilter filter in this.Filters)
if (!filter.Filter(modelObject))
return false;
return true;
}
}
/// <summary>
/// A CompositeAllFilter joins several other filters together.
/// A model object must only satisfy one of the filters to be included.
/// If there are no filters, all model objects are included
/// </summary>
/// <remarks>
/// Create a filter from the given filters
/// </remarks>
/// <param name="filters"></param>
public class CompositeAnyFilter(List<IModelFilter> filters) : CompositeFilter(filters) {
/// <summary>
/// Decide whether or not the given model should be included by the filter
/// </summary>
/// <remarks>Filters is guaranteed to be non-empty when this method is called</remarks>
/// <param name="modelObject">The model object under consideration</param>
/// <returns>True if the object is included by the filter</returns>
override public bool FilterObject(object modelObject) {
foreach (IModelFilter filter in this.Filters)
if (filter.Filter(modelObject))
return true;
return false;
}
}
/// <summary>
/// Instances of this class extract a value from the model object
/// and compare that value to a list of fixed values. The model
/// object is included if the extracted value is in the list
/// </summary>
/// <remarks>If there is no delegate installed or there are
/// no values to match, no model objects will be matched</remarks>
public class OneOfFilter : IModelFilter {
/// <summary>
/// Create a filter that will use the given delegate to extract values
/// </summary>
/// <param name="valueGetter"></param>
public OneOfFilter(AspectGetterDelegate valueGetter) :
this(valueGetter, new ArrayList()) {
}
/// <summary>
/// Create a filter that will extract values using the given delegate
/// and compare them to the values in the given list.
/// </summary>
/// <param name="valueGetter"></param>
/// <param name="possibleValues"></param>
public OneOfFilter(AspectGetterDelegate valueGetter, ICollection possibleValues) {
this.ValueGetter = valueGetter;
this.PossibleValues = new ArrayList(possibleValues);
}
/// <summary>
/// Gets or sets the delegate that will be used to extract values
/// from model objects
/// </summary>
virtual public AspectGetterDelegate ValueGetter {
get { return valueGetter; }
set { valueGetter = value; }
}
private AspectGetterDelegate valueGetter;
/// <summary>
/// Gets or sets the list of values that the value extracted from
/// the model object must match in order to be included.
/// </summary>
virtual public IList PossibleValues {
get { return possibleValues; }
set { possibleValues = value; }
}
private IList possibleValues;
/// <summary>
/// Should the given model object be included?
/// </summary>
/// <param name="modelObject"></param>
/// <returns></returns>
public virtual bool Filter(object modelObject) {
if (this.ValueGetter == null || this.PossibleValues == null || this.PossibleValues.Count == 0)
return false;
object result = this.ValueGetter(modelObject);
IEnumerable enumerable = result as IEnumerable;
if (result is string || enumerable == null)
return this.DoesValueMatch(result);
foreach (object x in enumerable) {
if (this.DoesValueMatch(x))
return true;
}
return false;
}
/// <summary>
/// Decides if the given property is a match for the values in the PossibleValues collection
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
protected virtual bool DoesValueMatch(object result) {
return this.PossibleValues.Contains(result);
}
}
/// <summary>
/// Instances of this class match a property of a model objects against
/// a list of bit flags. The property should be an xor-ed collection
/// of bits flags.
/// </summary>
/// <remarks>Both the property compared and the list of possible values
/// must be convertible to ulongs.</remarks>
public class FlagBitSetFilter : OneOfFilter {
/// <summary>
/// Create an instance
/// </summary>
/// <param name="valueGetter"></param>
/// <param name="possibleValues"></param>
public FlagBitSetFilter(AspectGetterDelegate valueGetter, ICollection possibleValues) : base(valueGetter, possibleValues) {
this.ConvertPossibleValues();
}
/// <summary>
/// Gets or sets the collection of values that will be matched.
/// These must be ulongs (or convertible to ulongs).
/// </summary>
public override IList PossibleValues {
get { return base.PossibleValues; }
set {
base.PossibleValues = value;
this.ConvertPossibleValues();
}
}
private void ConvertPossibleValues() {
this.possibleValuesAsUlongs = new List<UInt64>();
foreach (object x in this.PossibleValues)
this.possibleValuesAsUlongs.Add(Convert.ToUInt64(x));
}
/// <summary>
/// Decides if the given property is a match for the values in the PossibleValues collection
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
protected override bool DoesValueMatch(object result) {
try {
UInt64 value = Convert.ToUInt64(result);
foreach (ulong flag in this.possibleValuesAsUlongs) {
if ((value & flag) == flag)
return true;
}
return false;
}
catch (InvalidCastException) {
return false;
}
catch (FormatException) {
return false;
}
}
private List<UInt64> possibleValuesAsUlongs = new List<UInt64>();
}
/// <summary>
/// Base class for whole list filters
/// </summary>
public class AbstractListFilter : IListFilter
{
/// <summary>
/// Return a subset of the given list of model objects as the new
/// contents of the ObjectListView
/// </summary>
/// <param name="modelObjects">The collection of model objects that the list will possibly display</param>
/// <returns>The filtered collection that holds the model objects that will be displayed.</returns>
virtual public IEnumerable Filter(IEnumerable modelObjects) {
return modelObjects;
}
}
/// <summary>
/// Instance of this class implement delegate based whole list filtering
/// </summary>
public class ListFilter : AbstractListFilter
{
/// <summary>
/// A delegate that filters on a whole list
/// </summary>
/// <param name="rowObjects"></param>
/// <returns></returns>
public delegate IEnumerable ListFilterDelegate(IEnumerable rowObjects);
/// <summary>
/// Create a ListFilter
/// </summary>
/// <param name="function"></param>
public ListFilter(ListFilterDelegate function) {
this.Function = function;
}
/// <summary>
/// Gets or sets the delegate that will filter the list
/// </summary>
public ListFilterDelegate Function {
get { return function; }
set { function = value; }
}
private ListFilterDelegate function;
/// <summary>
/// Do the actual work of filtering
/// </summary>
/// <param name="modelObjects"></param>
/// <returns></returns>
public override IEnumerable Filter(IEnumerable modelObjects) {
if (this.Function == null)
return modelObjects;
return this.Function(modelObjects);
}
}
/// <summary>
/// Filter the list so only the last N entries are displayed
/// </summary>
public class TailFilter : AbstractListFilter
{
/// <summary>
/// Create a no-op tail filter
/// </summary>
public TailFilter() {
}
/// <summary>
/// Create a filter that includes on the last N model objects
/// </summary>
/// <param name="numberOfObjects"></param>
public TailFilter(int numberOfObjects) {
this.Count = numberOfObjects;
}
/// <summary>
/// Gets or sets the number of model objects that will be
/// returned from the tail of the list
/// </summary>
public int Count {
get { return count; }
set { count = value; }
}
private int count;
/// <summary>
/// Return the last N subset of the model objects
/// </summary>
/// <param name="modelObjects"></param>
/// <returns></returns>
public override IEnumerable Filter(IEnumerable modelObjects) {
if (this.Count <= 0)
return modelObjects;
ArrayList list = ObjectListView.EnumerableToArray(modelObjects, false);
if (this.Count > list.Count)
return list;
object[] tail = new object[this.Count];
list.CopyTo(list.Count - this.Count, tail, 0, this.Count);
return new ArrayList(tail);
}
}
}

View File

@@ -0,0 +1,160 @@
/*
* FlagClusteringStrategy - Implements a clustering strategy for a field which is a single integer
* containing an XOR'ed collection of bit flags
*
* Author: Phillip Piper
* Date: 23-March-2012 8:33 am
*
* Change log:
* 2012-03-23 JPP - First version
*
* Copyright (C) 2012 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
namespace BrightIdeasSoftware {
/// <summary>
/// Instances of this class cluster model objects on the basis of a
/// property that holds an xor-ed collection of bit flags.
/// </summary>
public class FlagClusteringStrategy : ClusteringStrategy
{
#region Life and death
/// <summary>
/// Create a clustering strategy that operates on the flags of the given enum
/// </summary>
/// <param name="enumType"></param>
public FlagClusteringStrategy(Type enumType) {
if (enumType == null) throw new ArgumentNullException("enumType");
if (!enumType.IsEnum) throw new ArgumentException("Type must be enum", "enumType");
if (enumType.GetCustomAttributes(typeof(FlagsAttribute), false) == null) throw new ArgumentException("Type must have [Flags] attribute", "enumType");
List<long> flags = new List<long>();
foreach (object x in Enum.GetValues(enumType))
flags.Add(Convert.ToInt64(x));
List<string> flagLabels = new List<string>();
foreach (string x in Enum.GetNames(enumType))
flagLabels.Add(x);
this.SetValues(flags.ToArray(), flagLabels.ToArray());
}
/// <summary>
/// Create a clustering strategy around the given collections of flags and their display labels.
/// There must be the same number of elements in both collections.
/// </summary>
/// <param name="values">The list of flags. </param>
/// <param name="labels"></param>
public FlagClusteringStrategy(long[] values, string[] labels) {
this.SetValues(values, labels);
}
#endregion
#region Implementation
/// <summary>
/// Gets the value that will be xor-ed to test for the presence of a particular value.
/// </summary>
public long[] Values {
get { return this.values; }
private set { this.values = value; }
}
private long[] values;
/// <summary>
/// Gets the labels that will be used when the corresponding Value is XOR present in the data.
/// </summary>
public string[] Labels {
get { return this.labels; }
private set { this.labels = value; }
}
private string[] labels;
private void SetValues(long[] flags, string[] flagLabels) {
if (flags == null || flags.Length == 0) throw new ArgumentNullException("flags");
if (flagLabels == null || flagLabels.Length == 0) throw new ArgumentNullException("flagLabels");
if (flags.Length != flagLabels.Length) throw new ArgumentException("values and labels must have the same number of entries", "flags");
this.Values = flags;
this.Labels = flagLabels;
}
#endregion
#region Implementation of IClusteringStrategy
/// <summary>
/// Get the cluster key by which the given model will be partitioned by this strategy
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public override object GetClusterKey(object model) {
List<long> flags = new List<long>();
try {
long modelValue = Convert.ToInt64(this.Column.GetValue(model));
foreach (long x in this.Values) {
if ((x & modelValue) == x)
flags.Add(x);
}
return flags;
}
catch (InvalidCastException ex) {
System.Diagnostics.Debug.Write(ex);
return flags;
}
catch (FormatException ex) {
System.Diagnostics.Debug.Write(ex);
return flags;
}
}
/// <summary>
/// Gets the display label that the given cluster should use
/// </summary>
/// <param name="cluster"></param>
/// <returns></returns>
public override string GetClusterDisplayLabel(ICluster cluster) {
long clusterKeyAsUlong = Convert.ToInt64(cluster.ClusterKey);
for (int i = 0; i < this.Values.Length; i++ ) {
if (clusterKeyAsUlong == this.Values[i])
return this.ApplyDisplayFormat(cluster, this.Labels[i]);
}
return this.ApplyDisplayFormat(cluster, clusterKeyAsUlong.ToString(CultureInfo.CurrentUICulture));
}
/// <summary>
/// Create a filter that will include only model objects that
/// match one or more of the given values.
/// </summary>
/// <param name="valuesChosenForFiltering"></param>
/// <returns></returns>
public override IModelFilter CreateFilter(IList valuesChosenForFiltering) {
return new FlagBitSetFilter(this.GetClusterKey, valuesChosenForFiltering);
}
#endregion
}
}

View File

@@ -0,0 +1,56 @@
/*
* ICluster - A cluster is a group of objects that can be included or excluded as a whole
*
* Author: Phillip Piper
* Date: 4-March-2011 11:59 pm
*
* Change log:
* 2011-03-04 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
namespace BrightIdeasSoftware {
/// <summary>
/// A cluster is a like collection of objects that can be usefully filtered
/// as whole using the filtering UI provided by the ObjectListView.
/// </summary>
public interface ICluster : IComparable {
/// <summary>
/// Gets or sets how many items belong to this cluster
/// </summary>
int Count { get; set; }
/// <summary>
/// Gets or sets the label that will be shown to the user to represent
/// this cluster
/// </summary>
string DisplayLabel { get; set; }
/// <summary>
/// Gets or sets the actual data object that all members of this cluster
/// have commonly returned.
/// </summary>
object ClusterKey { get; set; }
}
}

View File

@@ -0,0 +1,80 @@
/*
* IClusterStrategy - Encapsulates the ability to create a list of clusters from an ObjectListView
*
* Author: Phillip Piper
* Date: 4-March-2011 11:59 pm
*
* Change log:
* 2012-05-23 JPP - Added CreateFilter() method to interface to allow the strategy
* to control the actual model filter that is created.
* v2.5
* 2011-03-04 JPP - First version
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace BrightIdeasSoftware{
/// <summary>
/// Implementation of this interface control the selecting of cluster keys
/// and how those clusters will be presented to the user
/// </summary>
public interface IClusteringStrategy {
/// <summary>
/// Gets or sets the column upon which this strategy will operate
/// </summary>
OLVColumn Column { get; set; }
/// <summary>
/// Get the cluster key by which the given model will be partitioned by this strategy
/// </summary>
/// <remarks>If the returned value is an IEnumerable, the given model is considered
/// to belong to multiple clusters</remarks>
/// <param name="model"></param>
/// <returns></returns>
object GetClusterKey(object model);
/// <summary>
/// Create a cluster to hold the given cluster key
/// </summary>
/// <param name="clusterKey"></param>
/// <returns></returns>
ICluster CreateCluster(object clusterKey);
/// <summary>
/// Gets the display label that the given cluster should use
/// </summary>
/// <param name="cluster"></param>
/// <returns></returns>
string GetClusterDisplayLabel(ICluster cluster);
/// <summary>
/// Create a filter that will include only model objects that
/// match one or more of the given values.
/// </summary>
/// <param name="valuesChosenForFiltering"></param>
/// <returns></returns>
IModelFilter CreateFilter(IList valuesChosenForFiltering);
}
}

View File

@@ -0,0 +1,629 @@
/*
* TextMatchFilter - Text based filtering on ObjectListViews
*
* Author: Phillip Piper
* Date: 31/05/2011 7:45am
*
* Change log:
* v2.6
* 2012-10-13 JPP Allow filtering to consider additional columns
* v2.5.1
* 2011-06-22 JPP Handle searching for empty strings
* v2.5.0
* 2011-05-31 JPP Initial version
*
* TO DO:
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
namespace BrightIdeasSoftware {
/// <summary>
/// Instances of this class include only those rows of the listview
/// that match one or more given strings.
/// </summary>
/// <remarks>This class can match strings by prefix, regex, or simple containment.
/// There are factory methods for each of these matching strategies.</remarks>
public class TextMatchFilter : AbstractModelFilter {
#region Life and death
/// <summary>
/// Create a text filter that will include rows where any cell matches
/// any of the given regex expressions.
/// </summary>
/// <param name="olv"></param>
/// <param name="texts"></param>
/// <returns></returns>
/// <remarks>Any string that is not a valid regex expression will be ignored.</remarks>
public static TextMatchFilter Regex(ObjectListView olv, params string[] texts) {
TextMatchFilter filter = new TextMatchFilter(olv);
filter.RegexStrings = texts;
return filter;
}
/// <summary>
/// Create a text filter that includes rows where any cell begins with one of the given strings
/// </summary>
/// <param name="olv"></param>
/// <param name="texts"></param>
/// <returns></returns>
public static TextMatchFilter Prefix(ObjectListView olv, params string[] texts) {
TextMatchFilter filter = new TextMatchFilter(olv);
filter.PrefixStrings = texts;
return filter;
}
/// <summary>
/// Create a text filter that includes rows where any cell contains any of the given strings.
/// </summary>
/// <param name="olv"></param>
/// <param name="texts"></param>
/// <returns></returns>
public static TextMatchFilter Contains(ObjectListView olv, params string[] texts) {
TextMatchFilter filter = new TextMatchFilter(olv);
filter.ContainsStrings = texts;
return filter;
}
/// <summary>
/// Create a TextFilter
/// </summary>
/// <param name="olv"></param>
public TextMatchFilter(ObjectListView olv) {
this.ListView = olv;
}
/// <summary>
/// Create a TextFilter that finds the given string
/// </summary>
/// <param name="olv"></param>
/// <param name="text"></param>
public TextMatchFilter(ObjectListView olv, string text) {
this.ListView = olv;
this.ContainsStrings = new string[] { text };
}
/// <summary>
/// Create a TextFilter that finds the given string using the given comparison
/// </summary>
/// <param name="olv"></param>
/// <param name="text"></param>
/// <param name="comparison"></param>
public TextMatchFilter(ObjectListView olv, string text, StringComparison comparison) {
this.ListView = olv;
this.ContainsStrings = new string[] { text };
this.StringComparison = comparison;
}
#endregion
#region Public properties
/// <summary>
/// Gets or sets which columns will be used for the comparisons? If this is null, all columns will be used
/// </summary>
public OLVColumn[] Columns {
get { return columns; }
set { columns = value; }
}
private OLVColumn[] columns;
/// <summary>
/// Gets or sets additional columns which will be used in the comparison. These will be used
/// in addition to either the Columns property or to all columns taken from the control.
/// </summary>
public OLVColumn[] AdditionalColumns {
get { return additionalColumns; }
set { additionalColumns = value; }
}
private OLVColumn[] additionalColumns;
/// <summary>
/// Gets or sets the collection of strings that will be used for
/// contains matching. Setting this replaces all previous texts
/// of any kind.
/// </summary>
public IEnumerable<string> ContainsStrings {
get {
foreach (TextMatchingStrategy component in this.MatchingStrategies)
yield return component.Text;
}
set {
this.MatchingStrategies = new List<TextMatchingStrategy>();
if (value != null) {
foreach (string text in value)
this.MatchingStrategies.Add(new TextContainsMatchingStrategy(this, text));
}
}
}
/// <summary>
/// Gets whether or not this filter has any search criteria
/// </summary>
public bool HasComponents {
get {
return this.MatchingStrategies.Count > 0;
}
}
/// <summary>
/// Gets or set the ObjectListView upon which this filter will work
/// </summary>
/// <remarks>
/// You cannot really rebase a filter after it is created, so do not change this value.
/// It is included so that it can be set in an object initializer.
/// </remarks>
public ObjectListView ListView {
get { return listView; }
set { listView = value; }
}
private ObjectListView listView;
/// <summary>
/// Gets or sets the collection of strings that will be used for
/// prefix matching. Setting this replaces all previous texts
/// of any kind.
/// </summary>
public IEnumerable<string> PrefixStrings {
get {
foreach (TextMatchingStrategy component in this.MatchingStrategies)
yield return component.Text;
}
set {
this.MatchingStrategies = new List<TextMatchingStrategy>();
if (value != null) {
foreach (string text in value)
this.MatchingStrategies.Add(new TextBeginsMatchingStrategy(this, text));
}
}
}
/// <summary>
/// Gets or sets the options that will be used when compiling the regular expression.
/// </summary>
/// <remarks>
/// This is only used when doing Regex matching (obviously).
/// If this is not set specifically, the appropriate options are chosen to match the
/// StringComparison setting (culture invariant, case sensitive).
/// </remarks>
public RegexOptions RegexOptions {
get {
if (!regexOptions.HasValue) {
switch (this.StringComparison) {
case StringComparison.CurrentCulture:
regexOptions = RegexOptions.None;
break;
case StringComparison.CurrentCultureIgnoreCase:
regexOptions = RegexOptions.IgnoreCase;
break;
case StringComparison.Ordinal:
case StringComparison.InvariantCulture:
regexOptions = RegexOptions.CultureInvariant;
break;
case StringComparison.OrdinalIgnoreCase:
case StringComparison.InvariantCultureIgnoreCase:
regexOptions = RegexOptions.CultureInvariant | RegexOptions.IgnoreCase;
break;
default:
regexOptions = RegexOptions.None;
break;
}
}
return regexOptions.Value;
}
set {
regexOptions = value;
}
}
private RegexOptions? regexOptions;
/// <summary>
/// Gets or sets the collection of strings that will be used for
/// regex pattern matching. Setting this replaces all previous texts
/// of any kind.
/// </summary>
public IEnumerable<string> RegexStrings {
get {
foreach (TextMatchingStrategy component in this.MatchingStrategies)
yield return component.Text;
}
set {
this.MatchingStrategies = new List<TextMatchingStrategy>();
if (value != null) {
foreach (string text in value)
this.MatchingStrategies.Add(new TextRegexMatchingStrategy(this, text));
}
}
}
/// <summary>
/// Gets or sets how the filter will match text
/// </summary>
public StringComparison StringComparison {
get { return this.stringComparison; }
set { this.stringComparison = value; }
}
private StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase;
#endregion
#region Implementation
/// <summary>
/// Loop over the columns that are being considering by the filter
/// </summary>
/// <returns></returns>
protected virtual IEnumerable<OLVColumn> IterateColumns() {
if (this.Columns == null) {
foreach (OLVColumn column in this.ListView.Columns)
yield return column;
} else {
foreach (OLVColumn column in this.Columns)
yield return column;
}
if (this.AdditionalColumns != null) {
foreach (OLVColumn column in this.AdditionalColumns)
yield return column;
}
}
#endregion
#region Public interface
/// <summary>
/// Do the actual work of filtering
/// </summary>
/// <param name="modelObject"></param>
/// <returns></returns>
public override bool Filter(object modelObject) {
if (this.ListView == null || !this.HasComponents)
return true;
foreach (OLVColumn column in this.IterateColumns()) {
if (column.IsVisible && column.Searchable) {
string[] cellTexts = column.GetSearchValues(modelObject);
if (cellTexts != null && cellTexts.Length > 0) {
foreach (TextMatchingStrategy filter in this.MatchingStrategies) {
if (String.IsNullOrEmpty(filter.Text))
return true;
foreach (string cellText in cellTexts) {
if (filter.MatchesText(cellText))
return true;
}
}
}
}
}
return false;
}
/// <summary>
/// Find all the ways in which this filter matches the given string.
/// </summary>
/// <remarks>This is used by the renderer to decide which bits of
/// the string should be highlighted</remarks>
/// <param name="cellText"></param>
/// <returns>A list of character ranges indicating the matched substrings</returns>
public IEnumerable<CharacterRange> FindAllMatchedRanges(string cellText) {
List<CharacterRange> ranges = new List<CharacterRange>();
foreach (TextMatchingStrategy filter in this.MatchingStrategies) {
if (!String.IsNullOrEmpty(filter.Text))
ranges.AddRange(filter.FindAllMatchedRanges(cellText));
}
return ranges;
}
/// <summary>
/// Is the given column one of the columns being used by this filter?
/// </summary>
/// <param name="column"></param>
/// <returns></returns>
public bool IsIncluded(OLVColumn column) {
if (this.Columns == null) {
return column.ListView == this.ListView;
}
foreach (OLVColumn x in this.Columns) {
if (x == column)
return true;
}
return false;
}
#endregion
#region Implementation members
private List<TextMatchingStrategy> MatchingStrategies = new List<TextMatchingStrategy>();
#endregion
#region Components
/// <summary>
/// Base class for the various types of string matching that TextMatchFilter provides
/// </summary>
abstract protected class TextMatchingStrategy {
/// <summary>
/// Gets how the filter will match text
/// </summary>
public StringComparison StringComparison {
get { return this.TextFilter.StringComparison; }
}
/// <summary>
/// Gets the text filter to which this component belongs
/// </summary>
public TextMatchFilter TextFilter {
get { return textFilter; }
set { textFilter = value; }
}
private TextMatchFilter textFilter;
/// <summary>
/// Gets or sets the text that will be matched
/// </summary>
public string Text {
get { return this.text; }
set { this.text = value; }
}
private string text;
/// <summary>
/// Find all the ways in which this filter matches the given string.
/// </summary>
/// <remarks>
/// <para>
/// This is used by the renderer to decide which bits of
/// the string should be highlighted.
/// </para>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>A list of character ranges indicating the matched substrings</returns>
abstract public IEnumerable<CharacterRange> FindAllMatchedRanges(string cellText);
/// <summary>
/// Does the given text match the filter
/// </summary>
/// <remarks>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>Return true if the given cellText matches our strategy</returns>
abstract public bool MatchesText(string cellText);
}
/// <summary>
/// This component provides text contains matching strategy.
/// </summary>
protected class TextContainsMatchingStrategy : TextMatchingStrategy {
/// <summary>
/// Create a text contains strategy
/// </summary>
/// <param name="filter"></param>
/// <param name="text"></param>
public TextContainsMatchingStrategy(TextMatchFilter filter, string text) {
this.TextFilter = filter;
this.Text = text;
}
/// <summary>
/// Does the given text match the filter
/// </summary>
/// <remarks>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>Return true if the given cellText matches our strategy</returns>
override public bool MatchesText(string cellText) {
return cellText.IndexOf(this.Text, this.StringComparison) != -1;
}
/// <summary>
/// Find all the ways in which this filter matches the given string.
/// </summary>
/// <remarks>
/// <para>
/// This is used by the renderer to decide which bits of
/// the string should be highlighted.
/// </para>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>A list of character ranges indicating the matched substrings</returns>
override public IEnumerable<CharacterRange> FindAllMatchedRanges(string cellText) {
List<CharacterRange> ranges = new List<CharacterRange>();
int matchIndex = cellText.IndexOf(this.Text, this.StringComparison);
while (matchIndex != -1) {
ranges.Add(new CharacterRange(matchIndex, this.Text.Length));
matchIndex = cellText.IndexOf(this.Text, matchIndex + this.Text.Length, this.StringComparison);
}
return ranges;
}
}
/// <summary>
/// This component provides text begins with matching strategy.
/// </summary>
protected class TextBeginsMatchingStrategy : TextMatchingStrategy {
/// <summary>
/// Create a text begins strategy
/// </summary>
/// <param name="filter"></param>
/// <param name="text"></param>
public TextBeginsMatchingStrategy(TextMatchFilter filter, string text) {
this.TextFilter = filter;
this.Text = text;
}
/// <summary>
/// Does the given text match the filter
/// </summary>
/// <remarks>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>Return true if the given cellText matches our strategy</returns>
override public bool MatchesText(string cellText) {
return cellText.StartsWith(this.Text, this.StringComparison);
}
/// <summary>
/// Find all the ways in which this filter matches the given string.
/// </summary>
/// <remarks>
/// <para>
/// This is used by the renderer to decide which bits of
/// the string should be highlighted.
/// </para>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>A list of character ranges indicating the matched substrings</returns>
override public IEnumerable<CharacterRange> FindAllMatchedRanges(string cellText) {
List<CharacterRange> ranges = new List<CharacterRange>();
if (cellText.StartsWith(this.Text, this.StringComparison))
ranges.Add(new CharacterRange(0, this.Text.Length));
return ranges;
}
}
/// <summary>
/// This component provides regex matching strategy.
/// </summary>
protected class TextRegexMatchingStrategy : TextMatchingStrategy {
/// <summary>
/// Creates a regex strategy
/// </summary>
/// <param name="filter"></param>
/// <param name="text"></param>
public TextRegexMatchingStrategy(TextMatchFilter filter, string text) {
this.TextFilter = filter;
this.Text = text;
}
/// <summary>
/// Gets or sets the options that will be used when compiling the regular expression.
/// </summary>
public RegexOptions RegexOptions {
get {
return this.TextFilter.RegexOptions;
}
}
/// <summary>
/// Gets or sets a compilex regular expression, based on our current Text and RegexOptions.
/// </summary>
/// <remarks>
/// If Text fails to compile as a regular expression, this will return a Regex object
/// that will match all strings.
/// </remarks>
protected Regex Regex {
get {
if (this.regex == null) {
try {
this.regex = new Regex(this.Text, this.RegexOptions);
}
catch (ArgumentException) {
this.regex = TextRegexMatchingStrategy.InvalidRegexMarker;
}
}
return this.regex;
}
set {
this.regex = value;
}
}
private Regex regex;
/// <summary>
/// Gets whether or not our current regular expression is a valid regex
/// </summary>
protected bool IsRegexInvalid {
get {
return this.Regex == TextRegexMatchingStrategy.InvalidRegexMarker;
}
}
static private Regex InvalidRegexMarker = new Regex(".*");
/// <summary>
/// Does the given text match the filter
/// </summary>
/// <remarks>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>Return true if the given cellText matches our strategy</returns>
public override bool MatchesText(string cellText) {
if (this.IsRegexInvalid)
return true;
return this.Regex.Match(cellText).Success;
}
/// <summary>
/// Find all the ways in which this filter matches the given string.
/// </summary>
/// <remarks>
/// <para>
/// This is used by the renderer to decide which bits of
/// the string should be highlighted.
/// </para>
/// <para>this.Text will not be null or empty when this is called.</para>
/// </remarks>
/// <param name="cellText">The text of the cell we want to search</param>
/// <returns>A list of character ranges indicating the matched substrings</returns>
override public IEnumerable<CharacterRange> FindAllMatchedRanges(string cellText) {
List<CharacterRange> ranges = new List<CharacterRange>();
if (!this.IsRegexInvalid) {
foreach (Match match in this.Regex.Matches(cellText)) {
if (match.Length > 0)
ranges.Add(new CharacterRange(match.Index, match.Length));
}
}
return ranges;
}
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,335 @@
/*
* Attributes - Attributes that can be attached to properties of models to allow columns to be
* built from them directly
*
* Author: Phillip Piper
* Date: 15/08/2009 22:01
*
* Change log:
* v2.6
* 2012-08-16 JPP - Added [OLVChildren] and [OLVIgnore]
* - OLV attributes can now only be set on properties
* v2.4
* 2010-04-14 JPP - Allow Name property to be set
*
* v2.3
* 2009-08-15 JPP - Initial version
*
* To do:
*
* Copyright (C) 2009-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// This attribute is used to mark a property of a model
/// class that should be noticed by Generator class.
/// </summary>
/// <remarks>
/// All the attributes of this class match their equivilent properties on OLVColumn.
/// </remarks>
[AttributeUsage(AttributeTargets.Property)]
public class OLVColumnAttribute : Attribute
{
#region Constructor
// There are several property where we actually want nullable value (bool?, int?),
// but it seems attribute properties can't be nullable types.
// So we explicitly track if those properties have been set.
/// <summary>
/// Create a new OLVColumnAttribute
/// </summary>
public OLVColumnAttribute() {
}
/// <summary>
/// Create a new OLVColumnAttribute with the given title
/// </summary>
/// <param name="title">The title of the column</param>
public OLVColumnAttribute(string title) {
this.Title = title;
}
#endregion
#region Public properties
/// <summary>
///
/// </summary>
public string AspectToStringFormat {
get { return aspectToStringFormat; }
set { aspectToStringFormat = value; }
}
private string aspectToStringFormat;
/// <summary>
///
/// </summary>
public bool CheckBoxes {
get { return checkBoxes; }
set {
checkBoxes = value;
this.IsCheckBoxesSet = true;
}
}
private bool checkBoxes;
internal bool IsCheckBoxesSet = false;
/// <summary>
///
/// </summary>
public int DisplayIndex {
get { return displayIndex; }
set { displayIndex = value; }
}
private int displayIndex = -1;
/// <summary>
///
/// </summary>
public bool FillsFreeSpace {
get { return fillsFreeSpace; }
set { fillsFreeSpace = value; }
}
private bool fillsFreeSpace;
/// <summary>
///
/// </summary>
public int FreeSpaceProportion {
get { return freeSpaceProportion; }
set {
freeSpaceProportion = value;
IsFreeSpaceProportionSet = true;
}
}
private int freeSpaceProportion;
internal bool IsFreeSpaceProportionSet = false;
/// <summary>
/// An array of IComparables that mark the cutoff points for values when
/// grouping on this column.
/// </summary>
public object[] GroupCutoffs {
get { return groupCutoffs; }
set { groupCutoffs = value; }
}
private object[] groupCutoffs;
/// <summary>
///
/// </summary>
public string[] GroupDescriptions {
get { return groupDescriptions; }
set { groupDescriptions = value; }
}
private string[] groupDescriptions;
/// <summary>
///
/// </summary>
public string GroupWithItemCountFormat {
get { return groupWithItemCountFormat; }
set { groupWithItemCountFormat = value; }
}
private string groupWithItemCountFormat;
/// <summary>
///
/// </summary>
public string GroupWithItemCountSingularFormat {
get { return groupWithItemCountSingularFormat; }
set { groupWithItemCountSingularFormat = value; }
}
private string groupWithItemCountSingularFormat;
/// <summary>
///
/// </summary>
public bool Hyperlink {
get { return hyperlink; }
set { hyperlink = value; }
}
private bool hyperlink;
/// <summary>
///
/// </summary>
public string ImageAspectName {
get { return imageAspectName; }
set { imageAspectName = value; }
}
private string imageAspectName;
/// <summary>
///
/// </summary>
public bool IsEditable {
get { return isEditable; }
set {
isEditable = value;
this.IsEditableSet = true;
}
}
private bool isEditable = true;
internal bool IsEditableSet = false;
/// <summary>
///
/// </summary>
public bool IsVisible {
get { return isVisible; }
set { isVisible = value; }
}
private bool isVisible = true;
/// <summary>
///
/// </summary>
public bool IsTileViewColumn {
get { return isTileViewColumn; }
set { isTileViewColumn = value; }
}
private bool isTileViewColumn;
/// <summary>
///
/// </summary>
public int MaximumWidth {
get { return maximumWidth; }
set { maximumWidth = value; }
}
private int maximumWidth = -1;
/// <summary>
///
/// </summary>
public int MinimumWidth {
get { return minimumWidth; }
set { minimumWidth = value; }
}
private int minimumWidth = -1;
/// <summary>
///
/// </summary>
public String Name {
get { return name; }
set { name = value; }
}
private String name;
/// <summary>
///
/// </summary>
public HorizontalAlignment TextAlign {
get { return this.textAlign; }
set {
this.textAlign = value;
IsTextAlignSet = true;
}
}
private HorizontalAlignment textAlign = HorizontalAlignment.Left;
internal bool IsTextAlignSet = false;
/// <summary>
///
/// </summary>
public String Tag {
get { return tag; }
set { tag = value; }
}
private String tag;
/// <summary>
///
/// </summary>
public String Title {
get { return title; }
set { title = value; }
}
private String title;
/// <summary>
///
/// </summary>
public String ToolTipText {
get { return toolTipText; }
set { toolTipText = value; }
}
private String toolTipText;
/// <summary>
///
/// </summary>
public bool TriStateCheckBoxes {
get { return triStateCheckBoxes; }
set {
triStateCheckBoxes = value;
this.IsTriStateCheckBoxesSet = true;
}
}
private bool triStateCheckBoxes;
internal bool IsTriStateCheckBoxesSet = false;
/// <summary>
///
/// </summary>
public bool UseInitialLetterForGroup {
get { return useInitialLetterForGroup; }
set { useInitialLetterForGroup = value; }
}
private bool useInitialLetterForGroup;
/// <summary>
///
/// </summary>
public int Width {
get { return width; }
set { width = value; }
}
private int width = 150;
#endregion
}
/// <summary>
/// Properties marked with [OLVChildren] will be used as the children source in a TreeListView.
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class OLVChildrenAttribute : Attribute
{
}
/// <summary>
/// Properties marked with [OLVIgnore] will not have columns generated for them.
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class OLVIgnoreAttribute : Attribute
{
}
}

View File

@@ -0,0 +1,315 @@
/*
* Comparers - Various Comparer classes used within ObjectListView
*
* Author: Phillip Piper
* Date: 25/11/2008 17:15
*
* Change log:
* v2.8.1
* 2014-12-03 JPP - Added StringComparer
* v2.3
* 2009-08-24 JPP - Added OLVGroupComparer
* 2009-06-01 JPP - ModelObjectComparer would crash if secondary sort column was null.
* 2008-12-20 JPP - Fixed bug with group comparisons when a group key was null (SF#2445761)
* 2008-11-25 JPP Initial version
*
* TO DO:
*
* Copyright (C) 2006-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// ColumnComparer is the workhorse for all comparison between two values of a particular column.
/// If the column has a specific comparer, use that to compare the values. Otherwise, do
/// a case insensitive string compare of the string representations of the values.
/// </summary>
/// <remarks><para>This class inherits from both IComparer and its generic counterpart
/// so that it can be used on untyped and typed collections.</para>
/// <para>This is used by normal (non-virtual) ObjectListViews. Virtual lists use
/// ModelObjectComparer</para>
/// </remarks>
/// <remarks>
/// Create a ColumnComparer that will order the rows in a list view according
/// to the values in a given column
/// </remarks>
/// <param name="col">The column whose values will be compared</param>
/// <param name="order">The ordering for column values</param>
public class ColumnComparer(OLVColumn col, SortOrder order) : IComparer, IComparer<OLVListItem>
{
/// <summary>
/// Gets or sets the method that will be used to compare two strings.
/// The default is to compare on the current culture, case-insensitive
/// </summary>
public static StringCompareDelegate StringComparer
{
get { return stringComparer; }
set { stringComparer = value; }
}
private static StringCompareDelegate stringComparer;
/// <summary>
/// Create a ColumnComparer that will order the rows in a list view according
/// to the values in a given column, and by a secondary column if the primary
/// column is equal.
/// </summary>
/// <param name="col">The column whose values will be compared</param>
/// <param name="order">The ordering for column values</param>
/// <param name="col2">The column whose values will be compared for secondary sorting</param>
/// <param name="order2">The ordering for secondary column values</param>
public ColumnComparer(OLVColumn col, SortOrder order, OLVColumn col2, SortOrder order2)
: this(col, order)
{
// There is no point in secondary sorting on the same column
if (col != col2)
this.secondComparer = new ColumnComparer(col2, order2);
}
/// <summary>
/// Compare two rows
/// </summary>
/// <param name="x">row1</param>
/// <param name="y">row2</param>
/// <returns>An ordering indication: -1, 0, 1</returns>
public int Compare(object x, object y)
{
return this.Compare((OLVListItem)x, (OLVListItem)y);
}
/// <summary>
/// Compare two rows
/// </summary>
/// <param name="x">row1</param>
/// <param name="y">row2</param>
/// <returns>An ordering indication: -1, 0, 1</returns>
public int Compare(OLVListItem x, OLVListItem y)
{
if (this.sortOrder == SortOrder.None)
return 0;
int result = 0;
object x1 = this.column.GetValue(x.RowObject);
object y1 = this.column.GetValue(y.RowObject);
// Handle nulls. Null values come last
bool xIsNull = (x1 == null || x1 == System.DBNull.Value);
bool yIsNull = (y1 == null || y1 == System.DBNull.Value);
if (xIsNull || yIsNull) {
if (xIsNull && yIsNull)
result = 0;
else
result = (xIsNull ? -1 : 1);
} else {
result = this.CompareValues(x1, y1);
}
if (this.sortOrder == SortOrder.Descending)
result = 0 - result;
// If the result was equality, use the secondary comparer to resolve it
if (result == 0 && this.secondComparer != null)
result = this.secondComparer.Compare(x, y);
return result;
}
/// <summary>
/// Compare the actual values to be used for sorting
/// </summary>
/// <param name="x">The aspect extracted from the first row</param>
/// <param name="y">The aspect extracted from the second row</param>
/// <returns>An ordering indication: -1, 0, 1</returns>
public int CompareValues(object x, object y)
{
// Force case insensitive compares on strings
String xAsString = x as String;
if (xAsString != null)
return CompareStrings(xAsString, y as String);
IComparable comparable = x as IComparable;
return comparable != null ? comparable.CompareTo(y) : 0;
}
private static int CompareStrings(string x, string y)
{
if (StringComparer == null)
return String.Compare(x, y, StringComparison.CurrentCultureIgnoreCase);
else
return StringComparer(x, y);
}
private OLVColumn column = col;
private SortOrder sortOrder = order;
private ColumnComparer secondComparer;
}
/// <summary>
/// This comparer sort list view groups. OLVGroups have a "SortValue" property,
/// which is used if present. Otherwise, the titles of the groups will be compared.
/// </summary>
/// <remarks>
/// Create a group comparer
/// </remarks>
/// <param name="order">The ordering for column values</param>
public class OLVGroupComparer(SortOrder order) : IComparer<OLVGroup>
{
/// <summary>
/// Compare the two groups. OLVGroups have a "SortValue" property,
/// which is used if present. Otherwise, the titles of the groups will be compared.
/// </summary>
/// <param name="x">group1</param>
/// <param name="y">group2</param>
/// <returns>An ordering indication: -1, 0, 1</returns>
public int Compare(OLVGroup x, OLVGroup y) {
// If we can compare the sort values, do that.
// Otherwise do a case insensitive compare on the group header.
int result;
if (x.SortValue != null && y.SortValue != null)
result = x.SortValue.CompareTo(y.SortValue);
else
result = String.Compare(x.Header, y.Header, StringComparison.CurrentCultureIgnoreCase);
if (this.sortOrder == SortOrder.Descending)
result = 0 - result;
return result;
}
private SortOrder sortOrder = order;
}
/// <summary>
/// This comparer can be used to sort a collection of model objects by a given column
/// </summary>
/// <remarks>
/// <para>This is used by virtual ObjectListViews. Non-virtual lists use
/// ColumnComparer</para>
/// </remarks>
/// <remarks>
/// Create a model object comparer
/// </remarks>
/// <param name="col"></param>
/// <param name="order"></param>
public class ModelObjectComparer(OLVColumn col, SortOrder order) : IComparer, IComparer<object>
{
/// <summary>
/// Gets or sets the method that will be used to compare two strings.
/// The default is to compare on the current culture, case-insensitive
/// </summary>
public static StringCompareDelegate StringComparer
{
get { return stringComparer; }
set { stringComparer = value; }
}
private static StringCompareDelegate stringComparer;
/// <summary>
/// Create a model object comparer with a secondary sorting column
/// </summary>
/// <param name="col"></param>
/// <param name="order"></param>
/// <param name="col2"></param>
/// <param name="order2"></param>
public ModelObjectComparer(OLVColumn col, SortOrder order, OLVColumn col2, SortOrder order2)
: this(col, order)
{
// There is no point in secondary sorting on the same column
if (col != col2 && col2 != null && order2 != SortOrder.None)
this.secondComparer = new ModelObjectComparer(col2, order2);
}
/// <summary>
/// Compare the two model objects
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int Compare(object x, object y)
{
int result = 0;
object x1 = this.column.GetValue(x);
object y1 = this.column.GetValue(y);
if (this.sortOrder == SortOrder.None)
return 0;
// Handle nulls. Null values come last
bool xIsNull = (x1 == null || x1 == System.DBNull.Value);
bool yIsNull = (y1 == null || y1 == System.DBNull.Value);
if (xIsNull || yIsNull) {
if (xIsNull && yIsNull)
result = 0;
else
result = (xIsNull ? -1 : 1);
} else {
result = this.CompareValues(x1, y1);
}
if (this.sortOrder == SortOrder.Descending)
result = 0 - result;
// If the result was equality, use the secondary comparer to resolve it
if (result == 0 && this.secondComparer != null)
result = this.secondComparer.Compare(x, y);
return result;
}
/// <summary>
/// Compare the actual values
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int CompareValues(object x, object y)
{
// Force case insensitive compares on strings
String xStr = x as String;
if (xStr != null)
return CompareStrings(xStr, y as String);
IComparable comparable = x as IComparable;
return comparable != null ? comparable.CompareTo(y) : 0;
}
private static int CompareStrings(string x, string y)
{
if (StringComparer == null)
return String.Compare(x, y, StringComparison.CurrentCultureIgnoreCase);
else
return StringComparer(x, y);
}
private OLVColumn column = col;
private SortOrder sortOrder = order;
private ModelObjectComparer secondComparer;
#region IComparer<object> Members
#endregion
}
}

View File

@@ -0,0 +1,630 @@
/*
* DataSourceAdapter - A helper class that translates DataSource events for an ObjectListView
*
* Author: Phillip Piper
* Date: 20/09/2010 7:42 AM
*
* Change log:
* v2.9
* 2015-10-31 JPP - Put back sanity check on upper limit of source items
* 2015-02-02 JPP - Made CreateColumnsFromSource() only rebuild columns when new ones were added
* v2.8.1
* 2014-11-23 JPP - Honour initial CurrencyManager.Position when setting DataSource.
* 2014-10-27 JPP - Fix issue where SelectedObject was not sync'ed with CurrencyManager.Position (SF #129)
* v2.6
* 2012-08-16 JPP - Unify common column creation functionality with Generator when possible
*
* 2010-09-20 JPP - Initial version
*
* Copyright (C) 2010-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;
using System.Diagnostics;
namespace BrightIdeasSoftware
{
/// <summary>
/// A helper class that translates DataSource events for an ObjectListView
/// </summary>
public class DataSourceAdapter : IDisposable
{
#region Life and death
/// <summary>
/// Make a DataSourceAdapter
/// </summary>
public DataSourceAdapter(ObjectListView olv) {
if (olv == null) throw new ArgumentNullException("olv");
this.ListView = olv;
// ReSharper disable once DoNotCallOverridableMethodsInConstructor
this.BindListView(this.ListView);
}
/// <summary>
/// Finalize this object
/// </summary>
~DataSourceAdapter() {
this.Dispose(false);
}
/// <summary>
/// Release all the resources used by this instance
/// </summary>
public void Dispose() {
this.Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Release all the resources used by this instance
/// </summary>
public virtual void Dispose(bool fromUser) {
this.UnbindListView(this.ListView);
this.UnbindDataSource();
}
#endregion
#region Public Properties
/// <summary>
/// Gets or sets whether or not columns will be automatically generated to show the
/// columns when the DataSource is set.
/// </summary>
/// <remarks>This must be set before the DataSource is set. It has no effect afterwards.</remarks>
public bool AutoGenerateColumns {
get { return this.autoGenerateColumns; }
set { this.autoGenerateColumns = value; }
}
private bool autoGenerateColumns = true;
/// <summary>
/// Get or set the DataSource that will be displayed in this list view.
/// </summary>
public virtual Object DataSource {
get { return dataSource; }
set {
dataSource = value;
this.RebindDataSource(true);
}
}
private Object dataSource;
/// <summary>
/// Gets or sets the name of the list or table in the data source for which the DataListView is displaying data.
/// </summary>
/// <remarks>If the data source is not a DataSet or DataViewManager, this property has no effect</remarks>
public virtual string DataMember {
get { return dataMember; }
set {
if (dataMember != value) {
dataMember = value;
RebindDataSource();
}
}
}
private string dataMember = "";
/// <summary>
/// Gets the ObjectListView upon which this adaptor will operate
/// </summary>
public ObjectListView ListView {
get { return listView; }
internal set { listView = value; }
}
private ObjectListView listView;
#endregion
#region Implementation properties
/// <summary>
/// Gets or sets the currency manager which is handling our binding context
/// </summary>
protected CurrencyManager CurrencyManager {
get { return currencyManager; }
set { currencyManager = value; }
}
private CurrencyManager currencyManager;
#endregion
#region Binding and unbinding
/// <summary>
///
/// </summary>
/// <param name="olv"></param>
protected virtual void BindListView(ObjectListView olv) {
if (olv == null)
return;
olv.Freezing += new EventHandler<FreezeEventArgs>(HandleListViewFreezing);
olv.SelectionChanged += new EventHandler(HandleListViewSelectionChanged);
olv.BindingContextChanged += new EventHandler(HandleListViewBindingContextChanged);
}
/// <summary>
///
/// </summary>
/// <param name="olv"></param>
protected virtual void UnbindListView(ObjectListView olv) {
if (olv == null)
return;
olv.Freezing -= new EventHandler<FreezeEventArgs>(HandleListViewFreezing);
olv.SelectionChanged -= new EventHandler(HandleListViewSelectionChanged);
olv.BindingContextChanged -= new EventHandler(HandleListViewBindingContextChanged);
}
/// <summary>
///
/// </summary>
protected virtual void BindDataSource() {
if (this.CurrencyManager == null)
return;
this.CurrencyManager.MetaDataChanged += new EventHandler(HandleCurrencyManagerMetaDataChanged);
this.CurrencyManager.PositionChanged += new EventHandler(HandleCurrencyManagerPositionChanged);
this.CurrencyManager.ListChanged += new ListChangedEventHandler(CurrencyManagerListChanged);
}
/// <summary>
///
/// </summary>
protected virtual void UnbindDataSource() {
if (this.CurrencyManager == null)
return;
this.CurrencyManager.MetaDataChanged -= new EventHandler(HandleCurrencyManagerMetaDataChanged);
this.CurrencyManager.PositionChanged -= new EventHandler(HandleCurrencyManagerPositionChanged);
this.CurrencyManager.ListChanged -= new ListChangedEventHandler(CurrencyManagerListChanged);
}
#endregion
#region Initialization
/// <summary>
/// Our data source has changed. Figure out how to handle the new source
/// </summary>
protected virtual void RebindDataSource() {
RebindDataSource(false);
}
/// <summary>
/// Our data source has changed. Figure out how to handle the new source
/// </summary>
protected virtual void RebindDataSource(bool forceDataInitialization) {
CurrencyManager tempCurrencyManager = null;
if (this.ListView != null && this.ListView.BindingContext != null && this.DataSource != null) {
tempCurrencyManager = this.ListView.BindingContext[this.DataSource, this.DataMember] as CurrencyManager;
}
// Has our currency manager changed?
if (this.CurrencyManager != tempCurrencyManager) {
this.UnbindDataSource();
this.CurrencyManager = tempCurrencyManager;
this.BindDataSource();
// Our currency manager has changed so we have to initialize a new data source
forceDataInitialization = true;
}
if (forceDataInitialization)
InitializeDataSource();
}
/// <summary>
/// The data source for this control has changed. Reconfigure the control for the new source
/// </summary>
protected virtual void InitializeDataSource() {
if (this.ListView.Frozen || this.CurrencyManager == null)
return;
this.CreateColumnsFromSource();
this.CreateMissingAspectGettersAndPutters();
this.SetListContents();
this.ListView.AutoSizeColumns();
// Fake a position change event so that the control matches any initial Position
this.HandleCurrencyManagerPositionChanged(null, null);
}
/// <summary>
/// Take the contents of the currently bound list and put them into the control
/// </summary>
protected virtual void SetListContents() {
this.ListView.Objects = this.CurrencyManager.List;
}
/// <summary>
/// Create columns for the listview based on what properties are available in the data source
/// </summary>
/// <remarks>
/// <para>This method will create columns if there is not already a column displaying that property.</para>
/// </remarks>
protected virtual void CreateColumnsFromSource() {
if (this.CurrencyManager == null)
return;
// Don't generate any columns in design mode. If we do, the user will see them,
// but the Designer won't know about them and won't persist them, which is very confusing
if (this.ListView.IsDesignMode)
return;
// Don't create columns if we've been told not to
if (!this.AutoGenerateColumns)
return;
// Use a Generator to create columns
Generator generator = Generator.Instance as Generator ?? new Generator();
PropertyDescriptorCollection properties = this.CurrencyManager.GetItemProperties();
if (properties.Count == 0)
return;
bool wereColumnsAdded = false;
foreach (PropertyDescriptor property in properties) {
if (!this.ShouldCreateColumn(property))
continue;
// Create a column
OLVColumn column = generator.MakeColumnFromPropertyDescriptor(property);
this.ConfigureColumn(column, property);
// Add it to our list
this.ListView.AllColumns.Add(column);
wereColumnsAdded = true;
}
if (wereColumnsAdded)
generator.PostCreateColumns(this.ListView);
}
/// <summary>
/// Decide if a new column should be added to the control to display
/// the given property
/// </summary>
/// <param name="property"></param>
/// <returns></returns>
protected virtual bool ShouldCreateColumn(PropertyDescriptor property) {
// Is there a column that already shows this property? If so, we don't show it again
if (this.ListView.AllColumns.Exists(delegate(OLVColumn x) { return x.AspectName == property.Name; }))
return false;
// Relationships to other tables turn up as IBindibleLists. Don't make columns to show them.
// CHECK: Is this always true? What other things could be here? Constraints? Triggers?
if (property.PropertyType == typeof(IBindingList))
return false;
// Ignore anything marked with [OLVIgnore]
return property.Attributes[typeof(OLVIgnoreAttribute)] == null;
}
/// <summary>
/// Configure the given column to show the given property.
/// The title and aspect name of the column are already filled in.
/// </summary>
/// <param name="column"></param>
/// <param name="property"></param>
protected virtual void ConfigureColumn(OLVColumn column, PropertyDescriptor property) {
column.LastDisplayIndex = this.ListView.AllColumns.Count;
// If our column is a BLOB, it could be an image, so assign a renderer to draw it.
// CONSIDER: Is this a common enough case to warrant this code?
if (property.PropertyType == typeof(System.Byte[]))
column.Renderer = new ImageRenderer();
}
/// <summary>
/// Generate aspect getters and putters for any columns that are missing them (and for which we have
/// enough information to actually generate a getter)
/// </summary>
protected virtual void CreateMissingAspectGettersAndPutters() {
foreach (OLVColumn x in this.ListView.AllColumns) {
OLVColumn column = x; // stack based variable accessible from closures
if (column.AspectGetter == null && !String.IsNullOrEmpty(column.AspectName)) {
column.AspectGetter = delegate(object row) {
// In most cases, rows will be DataRowView objects
DataRowView drv = row as DataRowView;
if (drv == null)
return column.GetAspectByName(row);
return (drv.Row.RowState == DataRowState.Detached) ? null : drv[column.AspectName];
};
}
if (column.IsEditable && column.AspectPutter == null && !String.IsNullOrEmpty(column.AspectName)) {
column.AspectPutter = delegate(object row, object newValue) {
// In most cases, rows will be DataRowView objects
DataRowView drv = row as DataRowView;
if (drv == null)
column.PutAspectByName(row, newValue);
else {
if (drv.Row.RowState != DataRowState.Detached)
drv[column.AspectName] = newValue;
}
};
}
}
}
#endregion
#region Event Handlers
/// <summary>
/// CurrencyManager ListChanged event handler.
/// Deals with fine-grained changes to list items.
/// </summary>
/// <remarks>
/// It's actually difficult to deal with these changes in a fine-grained manner.
/// If our listview is grouped, then any change may make a new group appear or
/// an old group disappear. It is rarely enough to simply update the affected row.
/// </remarks>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void CurrencyManagerListChanged(object sender, ListChangedEventArgs e) {
Debug.Assert(sender == this.CurrencyManager);
// Ignore changes make while frozen, since we will do a complete rebuild when we unfreeze
if (this.ListView.Frozen)
return;
//System.Diagnostics.Debug.WriteLine(e.ListChangedType);
Stopwatch sw = Stopwatch.StartNew();
switch (e.ListChangedType) {
case ListChangedType.Reset:
this.HandleListChangedReset(e);
break;
case ListChangedType.ItemChanged:
this.HandleListChangedItemChanged(e);
break;
case ListChangedType.ItemAdded:
this.HandleListChangedItemAdded(e);
break;
// An item has gone away.
case ListChangedType.ItemDeleted:
this.HandleListChangedItemDeleted(e);
break;
// An item has changed its index.
case ListChangedType.ItemMoved:
this.HandleListChangedItemMoved(e);
break;
// Something has changed in the metadata.
// CHECK: When are these events actually fired?
case ListChangedType.PropertyDescriptorAdded:
case ListChangedType.PropertyDescriptorChanged:
case ListChangedType.PropertyDescriptorDeleted:
this.HandleListChangedMetadataChanged(e);
break;
}
sw.Stop();
System.Diagnostics.Debug.WriteLine(String.Format("PERF - Processing {0} event on {1} rows took {2}ms", e.ListChangedType, this.ListView.GetItemCount(), sw.ElapsedMilliseconds));
}
/// <summary>
/// Handle PropertyDescriptor* events
/// </summary>
/// <param name="e"></param>
protected virtual void HandleListChangedMetadataChanged(ListChangedEventArgs e) {
this.InitializeDataSource();
}
/// <summary>
/// Handle ItemMoved event
/// </summary>
/// <param name="e"></param>
protected virtual void HandleListChangedItemMoved(ListChangedEventArgs e) {
// When is this actually triggered?
this.InitializeDataSource();
}
/// <summary>
/// Handle the ItemDeleted event
/// </summary>
/// <param name="e"></param>
protected virtual void HandleListChangedItemDeleted(ListChangedEventArgs e) {
this.InitializeDataSource();
}
/// <summary>
/// Handle an ItemAdded event.
/// </summary>
/// <param name="e"></param>
protected virtual void HandleListChangedItemAdded(ListChangedEventArgs e) {
// We get this event twice if certain grid controls are used to add a new row to a
// datatable: once when the editing of a new row begins, and once again when that
// editing commits. (If the user cancels the creation of the new row, we never see
// the second creation.) We detect this by seeing if this is a view on a row in a
// DataTable, and if it is, testing to see if it's a new row under creation.
Object newRow = this.CurrencyManager.List[e.NewIndex];
DataRowView drv = newRow as DataRowView;
if (drv == null || !drv.IsNew) {
// Either we're not dealing with a view on a data table, or this is the commit
// notification. Either way, this is the final notification, so we want to
// handle the new row now!
this.InitializeDataSource();
}
}
/// <summary>
/// Handle the Reset event
/// </summary>
/// <param name="e"></param>
protected virtual void HandleListChangedReset(ListChangedEventArgs e) {
// The whole list has changed utterly, so reload it.
this.InitializeDataSource();
}
/// <summary>
/// Handle ItemChanged event. This is triggered when a single item
/// has changed, so just refresh that one item.
/// </summary>
/// <param name="e"></param>
/// <remarks>Even in this simple case, we should probably rebuild the list.
/// For example, the change could put the item into its own new group.</remarks>
protected virtual void HandleListChangedItemChanged(ListChangedEventArgs e) {
// A single item has changed, so just refresh that.
//System.Diagnostics.Debug.WriteLine(String.Format("HandleListChangedItemChanged: {0}, {1}", e.NewIndex, e.PropertyDescriptor.Name));
Object changedRow = this.CurrencyManager.List[e.NewIndex];
this.ListView.RefreshObject(changedRow);
}
/// <summary>
/// The CurrencyManager calls this if the data source looks
/// different. We just reload everything.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks>
/// CHECK: Do we need this if we are handle ListChanged metadata events?
/// </remarks>
protected virtual void HandleCurrencyManagerMetaDataChanged(object sender, EventArgs e) {
this.InitializeDataSource();
}
/// <summary>
/// Called by the CurrencyManager when the currently selected item
/// changes. We update the ListView selection so that we stay in sync
/// with any other controls bound to the same source.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void HandleCurrencyManagerPositionChanged(object sender, EventArgs e) {
int index = this.CurrencyManager.Position;
// Make sure the index is sane (-1 pops up from time to time)
if (index < 0 || index >= this.ListView.GetItemCount())
return;
// Avoid recursion. If we are currently changing the index, don't
// start the process again.
if (this.isChangingIndex)
return;
try {
this.isChangingIndex = true;
this.ChangePosition(index);
}
finally {
this.isChangingIndex = false;
}
}
private bool isChangingIndex = false;
/// <summary>
/// Change the control's position (which is it's currently selected row)
/// to the nth row in the dataset
/// </summary>
/// <param name="index">The index of the row to be selected</param>
protected virtual void ChangePosition(int index) {
// We can't use the index directly, since our listview may be sorted
// Only assign if not null
if (this.ListView.SelectedObject != null)
{
this.ListView.SelectedObject = this.CurrencyManager.List[index];
}
// THINK: Do we always want to bring it into view?
if (this.ListView.SelectedIndices.Count > 0)
this.ListView.EnsureVisible(this.ListView.SelectedIndices[0]);
}
#endregion
#region ObjectListView event handlers
/// <summary>
/// Handle the selection changing in our ListView.
/// We need to tell our currency manager about the new position.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void HandleListViewSelectionChanged(object sender, EventArgs e) {
// Prevent recursion
if (this.isChangingIndex)
return;
// Sanity
if (this.CurrencyManager == null)
return;
// If only one item is selected, tell the currency manager which item is selected.
// CurrencyManager can't handle multiple selection so there's nothing we can do
// if more than one row is selected.
if (this.ListView.SelectedIndices.Count != 1)
return;
try {
this.isChangingIndex = true;
// We can't use the selectedIndex directly, since our listview may be sorted and/or filtered
// So we have to find the index of the selected object within the original list.
this.CurrencyManager.Position = this.CurrencyManager.List.IndexOf(this.ListView.SelectedObject);
} finally {
this.isChangingIndex = false;
}
}
/// <summary>
/// Handle the frozenness of our ListView changing.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void HandleListViewFreezing(object sender, FreezeEventArgs e) {
if (!alreadyFreezing && e.FreezeLevel == 0) {
try {
alreadyFreezing = true;
this.RebindDataSource(true);
} finally {
alreadyFreezing = false;
}
}
}
private bool alreadyFreezing = false;
/// <summary>
/// Handle a change to the BindingContext of our ListView.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void HandleListViewBindingContextChanged(object sender, EventArgs e) {
this.RebindDataSource(false);
}
#endregion
}
}

View File

@@ -0,0 +1,168 @@
/*
* Delegates - All delegate definitions used in ObjectListView
*
* Author: Phillip Piper
* Date: 31-March-2011 5:53 pm
*
* Change log:
* v2.10
* 2015-12-30 JPP - Added CellRendererGetterDelegate
* v2.?
* 2011-03-31 JPP - Split into its own file
*
* Copyright (C) 2011-2015 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Windows.Forms;
using System.Drawing;
namespace BrightIdeasSoftware {
#region Delegate declarations
/// <summary>
/// These delegates are used to extract an aspect from a row object
/// </summary>
public delegate Object AspectGetterDelegate(Object rowObject);
/// <summary>
/// These delegates are used to put a changed value back into a model object
/// </summary>
public delegate void AspectPutterDelegate(Object rowObject, Object newValue);
/// <summary>
/// These delegates can be used to convert an aspect value to a display string,
/// instead of using the default ToString()
/// </summary>
public delegate string AspectToStringConverterDelegate(Object value);
/// <summary>
/// These delegates are used to get the tooltip for a cell
/// </summary>
public delegate String CellToolTipGetterDelegate(OLVColumn column, Object modelObject);
/// <summary>
/// These delegates are used to the state of the checkbox for a row object.
/// </summary>
/// <remarks><para>
/// For reasons known only to someone in Microsoft, we can only set
/// a boolean on the ListViewItem to indicate it's "checked-ness", but when
/// we receive update events, we have to use a tristate CheckState. So we can
/// be told about an indeterminate state, but we can't set it ourselves.
/// </para>
/// <para>As of version 2.0, we can now return indeterminate state.</para>
/// </remarks>
public delegate CheckState CheckStateGetterDelegate(Object rowObject);
/// <summary>
/// These delegates are used to get the state of the checkbox for a row object.
/// </summary>
/// <param name="rowObject"></param>
/// <returns></returns>
public delegate bool BooleanCheckStateGetterDelegate(Object rowObject);
/// <summary>
/// These delegates are used to put a changed check state back into a model object
/// </summary>
public delegate CheckState CheckStatePutterDelegate(Object rowObject, CheckState newValue);
/// <summary>
/// These delegates are used to put a changed check state back into a model object
/// </summary>
/// <param name="rowObject"></param>
/// <param name="newValue"></param>
/// <returns></returns>
public delegate bool BooleanCheckStatePutterDelegate(Object rowObject, bool newValue);
/// <summary>
/// These delegates are used to get the renderer for a particular cell
/// </summary>
public delegate IRenderer CellRendererGetterDelegate(Object rowObject, OLVColumn column);
/// <summary>
/// The callbacks for RightColumnClick events
/// </summary>
public delegate void ColumnRightClickEventHandler(object sender, ColumnClickEventArgs e);
/// <summary>
/// This delegate will be used to own draw header column.
/// </summary>
public delegate bool HeaderDrawingDelegate(Graphics g, Rectangle r, int columnIndex, OLVColumn column, bool isPressed, HeaderStateStyle stateStyle);
/// <summary>
/// This delegate is called when a group has been created but not yet made
/// into a real ListViewGroup. The user can take this opportunity to fill
/// in lots of other details about the group.
/// </summary>
public delegate void GroupFormatterDelegate(OLVGroup group, GroupingParameters parms);
/// <summary>
/// These delegates are used to retrieve the object that is the key of the group to which the given row belongs.
/// </summary>
public delegate Object GroupKeyGetterDelegate(Object rowObject);
/// <summary>
/// These delegates are used to convert a group key into a title for the group
/// </summary>
public delegate string GroupKeyToTitleConverterDelegate(Object groupKey);
/// <summary>
/// These delegates are used to get the tooltip for a column header
/// </summary>
public delegate String HeaderToolTipGetterDelegate(OLVColumn column);
/// <summary>
/// These delegates are used to fetch the image selector that should be used
/// to choose an image for this column.
/// </summary>
public delegate Object ImageGetterDelegate(Object rowObject);
/// <summary>
/// These delegates are used to draw a cell
/// </summary>
public delegate bool RenderDelegate(EventArgs e, Graphics g, Rectangle r, Object rowObject);
/// <summary>
/// These delegates are used to fetch a row object for virtual lists
/// </summary>
public delegate Object RowGetterDelegate(int rowIndex);
/// <summary>
/// These delegates are used to format a listviewitem before it is added to the control.
/// </summary>
public delegate void RowFormatterDelegate(OLVListItem olvItem);
/// <summary>
/// These delegates can be used to return the array of texts that should be searched for text filtering
/// </summary>
public delegate string[] SearchValueGetterDelegate(Object value);
/// <summary>
/// These delegates are used to sort the listview in some custom fashion
/// </summary>
public delegate void SortDelegate(OLVColumn column, SortOrder sortOrder);
/// <summary>
/// These delegates are used to order two strings.
/// x cannot be null. y can be null.
/// </summary>
public delegate int StringCompareDelegate(string x, string y);
#endregion
}

View File

@@ -0,0 +1,407 @@
///*
// * DragSource.cs - Add drag source functionality to an ObjectListView
// *
// * UNFINISHED
// *
// * Author: Phillip Piper
// * Date: 2009-03-17 5:15 PM
// *
// * Change log:
// * v2.3
// * 2009-07-06 JPP - Make sure Link is acceptable as an drop effect by default
// * (since MS didn't make it part of the 'All' value)
// * v2.2
// * 2009-04-15 JPP - Separated DragSource.cs into DropSink.cs
// * 2009-03-17 JPP - Initial version
// *
// * Copyright (C) 2009 Phillip Piper
// *
// * This program is free software: you can redistribute it and/or modify
// * it under the terms of the GNU General Public License as published by
// * the Free Software Foundation, either version 3 of the License, or
// * (at your option) any later version.
// *
// * This program is distributed in the hope that it will be useful,
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// * GNU General Public License for more details.
// *
// * You should have received a copy of the GNU General Public License
// * along with this program. If not, see <http://www.gnu.org/licenses/>.
// *
// * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com.
// */
//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Text;
//using System.Windows.Forms;
//using System.Drawing;
//using System.Drawing.Drawing2D;
//namespace BrightIdeasSoftware
//{
// /// <summary>
// /// An IDragSource controls how drag out from the ObjectListView will behave
// /// </summary>
// public interface IDragSource
// {
// /// <summary>
// /// A drag operation is beginning. Return the data object that will be used
// /// for data transfer. Return null to prevent the drag from starting.
// /// </summary>
// /// <remarks>
// /// The returned object is later passed to the GetAllowedEffect() and EndDrag()
// /// methods.
// /// </remarks>
// /// <param name="olv">What ObjectListView is being dragged from.</param>
// /// <param name="button">Which mouse button is down?</param>
// /// <param name="item">What item was directly dragged by the user? There may be more than just this
// /// item selected.</param>
// /// <returns>The data object that will be used for data transfer. This will often be a subclass
// /// of DataObject, but does not need to be.</returns>
// Object StartDrag(ObjectListView olv, MouseButtons button, OLVListItem item);
// /// <summary>
// /// What operations are possible for this drag? This controls the icon shown during the drag
// /// </summary>
// /// <param name="dragObject">The data object returned by StartDrag()</param>
// /// <returns>A combination of DragDropEffects flags</returns>
// DragDropEffects GetAllowedEffects(Object dragObject);
// /// <summary>
// /// The drag operation is complete. Do whatever is necessary to complete the action.
// /// </summary>
// /// <param name="dragObject">The data object returned by StartDrag()</param>
// /// <param name="effect">The value returned from GetAllowedEffects()</param>
// void EndDrag(Object dragObject, DragDropEffects effect);
// }
// /// <summary>
// /// A do-nothing implementation of IDragSource that can be safely subclassed.
// /// </summary>
// public class AbstractDragSource : IDragSource
// {
// #region IDragSource Members
// /// <summary>
// /// See IDragSource documentation
// /// </summary>
// /// <param name="olv"></param>
// /// <param name="button"></param>
// /// <param name="item"></param>
// /// <returns></returns>
// public virtual Object StartDrag(ObjectListView olv, MouseButtons button, OLVListItem item) {
// return null;
// }
// /// <summary>
// /// See IDragSource documentation
// /// </summary>
// /// <param name="data"></param>
// /// <returns></returns>
// public virtual DragDropEffects GetAllowedEffects(Object data) {
// return DragDropEffects.None;
// }
// /// <summary>
// /// See IDragSource documentation
// /// </summary>
// /// <param name="dragObject"></param>
// /// <param name="effect"></param>
// public virtual void EndDrag(Object dragObject, DragDropEffects effect) {
// }
// #endregion
// }
// /// <summary>
// /// A reasonable implementation of IDragSource that provides normal
// /// drag source functionality. It creates a data object that supports
// /// inter-application dragging of text and HTML representation of
// /// the dragged rows. It can optionally force a refresh of all dragged
// /// rows when the drag is complete.
// /// </summary>
// /// <remarks>Subclasses can override GetDataObject() to add new
// /// data formats to the data transfer object.</remarks>
// public class SimpleDragSource : IDragSource
// {
// #region Constructors
// /// <summary>
// /// Construct a SimpleDragSource
// /// </summary>
// public SimpleDragSource() {
// }
// /// <summary>
// /// Construct a SimpleDragSource that refreshes the dragged rows when
// /// the drag is complete
// /// </summary>
// /// <param name="refreshAfterDrop"></param>
// public SimpleDragSource(bool refreshAfterDrop) {
// this.RefreshAfterDrop = refreshAfterDrop;
// }
// #endregion
// #region Public properties
// /// <summary>
// /// Gets or sets whether the dragged rows should be refreshed when the
// /// drag operation is complete.
// /// </summary>
// public bool RefreshAfterDrop {
// get { return refreshAfterDrop; }
// set { refreshAfterDrop = value; }
// }
// private bool refreshAfterDrop;
// #endregion
// #region IDragSource Members
// /// <summary>
// /// Create a DataObject when the user does a left mouse drag operation.
// /// See IDragSource for further information.
// /// </summary>
// /// <param name="olv"></param>
// /// <param name="button"></param>
// /// <param name="item"></param>
// /// <returns></returns>
// public virtual Object StartDrag(ObjectListView olv, MouseButtons button, OLVListItem item) {
// // We only drag on left mouse
// if (button != MouseButtons.Left)
// return null;
// return this.CreateDataObject(olv);
// }
// /// <summary>
// /// Which operations are allowed in the operation? By default, all operations are supported.
// /// </summary>
// /// <param name="data"></param>
// /// <returns>All opertions are supported</returns>
// public virtual DragDropEffects GetAllowedEffects(Object data) {
// return DragDropEffects.All | DragDropEffects.Link; // why didn't MS include 'Link' in 'All'??
// }
// /// <summary>
// /// The drag operation is finished. Refreshe the dragged rows if so configured.
// /// </summary>
// /// <param name="dragObject"></param>
// /// <param name="effect"></param>
// public virtual void EndDrag(Object dragObject, DragDropEffects effect) {
// OLVDataObject data = dragObject as OLVDataObject;
// if (data == null)
// return;
// if (this.RefreshAfterDrop)
// data.ListView.RefreshObjects(data.ModelObjects);
// }
// /// <summary>
// /// Create a data object that will be used to as the data object
// /// for the drag operation.
// /// </summary>
// /// <remarks>
// /// Subclasses can override this method add new formats to the data object.
// /// </remarks>
// /// <param name="olv">The ObjectListView that is the source of the drag</param>
// /// <returns>A data object for the drag</returns>
// protected virtual object CreateDataObject(ObjectListView olv) {
// OLVDataObject data = new OLVDataObject(olv);
// data.CreateTextFormats();
// return data;
// }
// #endregion
// }
// /// <summary>
// /// A data transfer object that knows how to transform a list of model
// /// objects into a text and HTML representation.
// /// </summary>
// public class OLVDataObject : DataObject
// {
// #region Life and death
// /// <summary>
// /// Create a data object from the selected objects in the given ObjectListView
// /// </summary>
// /// <param name="olv">The source of the data object</param>
// public OLVDataObject(ObjectListView olv) : this(olv, olv.SelectedObjects) {
// }
// /// <summary>
// /// Create a data object which operates on the given model objects
// /// in the given ObjectListView
// /// </summary>
// /// <param name="olv">The source of the data object</param>
// /// <param name="modelObjects">The model objects to be put into the data object</param>
// public OLVDataObject(ObjectListView olv, IList modelObjects) {
// this.objectListView = olv;
// this.modelObjects = modelObjects;
// this.includeHiddenColumns = olv.IncludeHiddenColumnsInDataTransfer;
// this.includeColumnHeaders = olv.IncludeColumnHeadersInCopy;
// }
// #endregion
// #region Properties
// /// <summary>
// /// Gets or sets whether hidden columns will also be included in the text
// /// and HTML representation. If this is false, only visible columns will
// /// be included.
// /// </summary>
// public bool IncludeHiddenColumns {
// get { return includeHiddenColumns; }
// }
// private bool includeHiddenColumns;
// /// <summary>
// /// Gets or sets whether column headers will also be included in the text
// /// and HTML representation.
// /// </summary>
// public bool IncludeColumnHeaders
// {
// get { return includeColumnHeaders; }
// }
// private bool includeColumnHeaders;
// /// <summary>
// /// Gets the ObjectListView that is being used as the source of the data
// /// </summary>
// public ObjectListView ListView {
// get { return objectListView; }
// }
// private ObjectListView objectListView;
// /// <summary>
// /// Gets the model objects that are to be placed in the data object
// /// </summary>
// public IList ModelObjects {
// get { return modelObjects; }
// }
// private IList modelObjects = new ArrayList();
// #endregion
// /// <summary>
// /// Put a text and HTML representation of our model objects
// /// into the data object.
// /// </summary>
// public void CreateTextFormats() {
// IList<OLVColumn> columns = this.IncludeHiddenColumns ? this.ListView.AllColumns : this.ListView.ColumnsInDisplayOrder;
// // Build text and html versions of the selection
// StringBuilder sbText = new StringBuilder();
// StringBuilder sbHtml = new StringBuilder("<table>");
// // Include column headers
// if (includeColumnHeaders)
// {
// sbHtml.Append("<tr><td>");
// foreach (OLVColumn col in columns)
// {
// if (col != columns[0])
// {
// sbText.Append("\t");
// sbHtml.Append("</td><td>");
// }
// string strValue = col.Text;
// sbText.Append(strValue);
// sbHtml.Append(strValue); //TODO: Should encode the string value
// }
// sbText.AppendLine();
// sbHtml.AppendLine("</td></tr>");
// }
// foreach (object modelObject in this.ModelObjects)
// {
// sbHtml.Append("<tr><td>");
// foreach (OLVColumn col in columns) {
// if (col != columns[0]) {
// sbText.Append("\t");
// sbHtml.Append("</td><td>");
// }
// string strValue = col.GetStringValue(modelObject);
// sbText.Append(strValue);
// sbHtml.Append(strValue); //TODO: Should encode the string value
// }
// sbText.AppendLine();
// sbHtml.AppendLine("</td></tr>");
// }
// sbHtml.AppendLine("</table>");
// // Put both the text and html versions onto the clipboard.
// // For some reason, SetText() with UnicodeText doesn't set the basic CF_TEXT format,
// // but using SetData() does.
// //this.SetText(sbText.ToString(), TextDataFormat.UnicodeText);
// this.SetData(sbText.ToString());
// this.SetText(ConvertToHtmlFragment(sbHtml.ToString()), TextDataFormat.Html);
// }
// /// <summary>
// /// Make a HTML representation of our model objects
// /// </summary>
// public string CreateHtml() {
// IList<OLVColumn> columns = this.ListView.ColumnsInDisplayOrder;
// // Build html version of the selection
// StringBuilder sbHtml = new StringBuilder("<table>");
// foreach (object modelObject in this.ModelObjects) {
// sbHtml.Append("<tr><td>");
// foreach (OLVColumn col in columns) {
// if (col != columns[0]) {
// sbHtml.Append("</td><td>");
// }
// string strValue = col.GetStringValue(modelObject);
// sbHtml.Append(strValue); //TODO: Should encode the string value
// }
// sbHtml.AppendLine("</td></tr>");
// }
// sbHtml.AppendLine("</table>");
// return sbHtml.ToString();
// }
// /// <summary>
// /// Convert the fragment of HTML into the Clipboards HTML format.
// /// </summary>
// /// <remarks>The HTML format is found here http://msdn2.microsoft.com/en-us/library/aa767917.aspx
// /// </remarks>
// /// <param name="fragment">The HTML to put onto the clipboard. It must be valid HTML!</param>
// /// <returns>A string that can be put onto the clipboard and will be recognized as HTML</returns>
// private string ConvertToHtmlFragment(string fragment) {
// // Minimal implementation of HTML clipboard format
// string source = "http://www.codeproject.com/KB/list/ObjectListView.aspx";
// const String MARKER_BLOCK =
// "Version:1.0\r\n" +
// "StartHTML:{0,8}\r\n" +
// "EndHTML:{1,8}\r\n" +
// "StartFragment:{2,8}\r\n" +
// "EndFragment:{3,8}\r\n" +
// "StartSelection:{2,8}\r\n" +
// "EndSelection:{3,8}\r\n" +
// "SourceURL:{4}\r\n" +
// "{5}";
// int prefixLength = String.Format(MARKER_BLOCK, 0, 0, 0, 0, source, "").Length;
// const String DEFAULT_HTML_BODY =
// "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" +
// "<HTML><HEAD></HEAD><BODY><!--StartFragment-->{0}<!--EndFragment--></BODY></HTML>";
// string html = String.Format(DEFAULT_HTML_BODY, fragment);
// int startFragment = prefixLength + html.IndexOf(fragment);
// int endFragment = startFragment + fragment.Length;
// return String.Format(MARKER_BLOCK, prefixLength, prefixLength + html.Length, startFragment, endFragment, source, html);
// }
// }
//}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,104 @@
/*
* Enums - All enum definitions used in ObjectListView
*
* Author: Phillip Piper
* Date: 31-March-2011 5:53 pm
*
* Change log:
* 2011-03-31 JPP - Split into its own file
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
namespace BrightIdeasSoftware {
public partial class ObjectListView {
/// <summary>
/// How does a user indicate that they want to edit cells?
/// </summary>
public enum CellEditActivateMode {
/// <summary>
/// This list cannot be edited. F2 does nothing.
/// </summary>
None = 0,
/// <summary>
/// A single click on a <strong>subitem</strong> will edit the value. Single clicking the primary column,
/// selects the row just like normal. The user must press F2 to edit the primary column.
/// </summary>
SingleClick = 1,
/// <summary>
/// Double clicking a subitem or the primary column will edit that cell.
/// F2 will edit the primary column.
/// </summary>
DoubleClick = 2,
/// <summary>
/// Pressing F2 is the only way to edit the cells. Once the primary column is being edited,
/// the other cells in the row can be edited by pressing Tab.
/// </summary>
F2Only = 3,
/// <summary>
/// A single click on a <strong>any</strong> cell will edit the value, even the primary column.
/// </summary>
SingleClickAlways = 4,
}
/// <summary>
/// These values specify how column selection will be presented to the user
/// </summary>
public enum ColumnSelectBehaviour {
/// <summary>
/// No column selection will be presented
/// </summary>
None,
/// <summary>
/// The columns will be show in the main menu
/// </summary>
InlineMenu,
/// <summary>
/// The columns will be shown in a submenu
/// </summary>
Submenu,
/// <summary>
/// A model dialog will be presented to allow the user to choose columns
/// </summary>
ModelDialog,
/*
* NonModelDialog is just a little bit tricky since the OLV can change views while the dialog is showing
* So, just comment this out for the time being.
/// <summary>
/// A non-model dialog will be presented to allow the user to choose columns
/// </summary>
NonModelDialog
*
*/
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,175 @@
/*
* GroupingParameters - All the data that is used to create groups in an ObjectListView
*
* Author: Phillip Piper
* Date: 31-March-2011 5:53 pm
*
* Change log:
* 2011-03-31 JPP - Split into its own file
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace BrightIdeasSoftware {
/// <summary>
/// This class contains all the settings used when groups are created
/// </summary>
public class GroupingParameters {
/// <summary>
/// Create a GroupingParameters
/// </summary>
/// <param name="olv"></param>
/// <param name="groupByColumn"></param>
/// <param name="groupByOrder"></param>
/// <param name="column"></param>
/// <param name="order"></param>
/// <param name="secondaryColumn"></param>
/// <param name="secondaryOrder"></param>
/// <param name="titleFormat"></param>
/// <param name="titleSingularFormat"></param>
/// <param name="sortItemsByPrimaryColumn"></param>
public GroupingParameters(ObjectListView olv, OLVColumn groupByColumn, SortOrder groupByOrder,
OLVColumn column, SortOrder order, OLVColumn secondaryColumn, SortOrder secondaryOrder,
string titleFormat, string titleSingularFormat, bool sortItemsByPrimaryColumn) {
this.ListView = olv;
this.GroupByColumn = groupByColumn;
this.GroupByOrder = groupByOrder;
this.PrimarySort = column;
this.PrimarySortOrder = order;
this.SecondarySort = secondaryColumn;
this.SecondarySortOrder = secondaryOrder;
this.SortItemsByPrimaryColumn = sortItemsByPrimaryColumn;
this.TitleFormat = titleFormat;
this.TitleSingularFormat = titleSingularFormat;
}
/// <summary>
/// Gets or sets the ObjectListView being grouped
/// </summary>
public ObjectListView ListView {
get { return this.listView; }
set { this.listView = value; }
}
private ObjectListView listView;
/// <summary>
/// Gets or sets the column used to create groups
/// </summary>
public OLVColumn GroupByColumn {
get { return this.groupByColumn; }
set { this.groupByColumn = value; }
}
private OLVColumn groupByColumn;
/// <summary>
/// In what order will the groups themselves be sorted?
/// </summary>
public SortOrder GroupByOrder {
get { return this.groupByOrder; }
set { this.groupByOrder = value; }
}
private SortOrder groupByOrder;
/// <summary>
/// If this is set, this comparer will be used to order the groups
/// </summary>
public IComparer<OLVGroup> GroupComparer {
get { return this.groupComparer; }
set { this.groupComparer = value; }
}
private IComparer<OLVGroup> groupComparer;
/// <summary>
/// If this is set, this comparer will be used to order items within each group
/// </summary>
public IComparer<OLVListItem> ItemComparer {
get { return this.itemComparer; }
set { this.itemComparer = value; }
}
private IComparer<OLVListItem> itemComparer;
/// <summary>
/// Gets or sets the column that will be the primary sort
/// </summary>
public OLVColumn PrimarySort {
get { return this.primarySort; }
set { this.primarySort = value; }
}
private OLVColumn primarySort;
/// <summary>
/// Gets or sets the ordering for the primary sort
/// </summary>
public SortOrder PrimarySortOrder {
get { return this.primarySortOrder; }
set { this.primarySortOrder = value; }
}
private SortOrder primarySortOrder;
/// <summary>
/// Gets or sets the column used for secondary sorting
/// </summary>
public OLVColumn SecondarySort {
get { return this.secondarySort; }
set { this.secondarySort = value; }
}
private OLVColumn secondarySort;
/// <summary>
/// Gets or sets the ordering for the secondary sort
/// </summary>
public SortOrder SecondarySortOrder {
get { return this.secondarySortOrder; }
set { this.secondarySortOrder = value; }
}
private SortOrder secondarySortOrder;
/// <summary>
/// Gets or sets the title format used for groups with zero or more than one element
/// </summary>
public string TitleFormat {
get { return this.titleFormat; }
set { this.titleFormat = value; }
}
private string titleFormat;
/// <summary>
/// Gets or sets the title format used for groups with only one element
/// </summary>
public string TitleSingularFormat {
get { return this.titleSingularFormat; }
set { this.titleSingularFormat = value; }
}
private string titleSingularFormat;
/// <summary>
/// Gets or sets whether the items should be sorted by the primary column
/// </summary>
public bool SortItemsByPrimaryColumn {
get { return this.sortItemsByPrimaryColumn; }
set { this.sortItemsByPrimaryColumn = value; }
}
private bool sortItemsByPrimaryColumn;
}
}

View File

@@ -0,0 +1,747 @@
/*
* Groups - Enhancements to the normal ListViewGroup
*
* Author: Phillip Piper
* Date: 22/08/2009 6:03PM
*
* Change log:
* v2.3
* 2009-09-09 JPP - Added Collapsed and Collapsible properties
* 2009-09-01 JPP - Cleaned up code, added more docs
* - Works under VS2005 again
* 2009-08-22 JPP - Initial version
*
* To do:
* - Implement subseting
* - Implement footer items
*
* Copyright (C) 2009-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace BrightIdeasSoftware
{
/// <summary>
/// These values indicate what is the state of the group. These values
/// are taken directly from the SDK and many are not used by ObjectListView.
/// </summary>
[Flags]
public enum GroupState
{
/// <summary>
/// Normal
/// </summary>
LVGS_NORMAL = 0x0,
/// <summary>
/// Collapsed
/// </summary>
LVGS_COLLAPSED = 0x1,
/// <summary>
/// Hidden
/// </summary>
LVGS_HIDDEN = 0x2,
/// <summary>
/// NoHeader
/// </summary>
LVGS_NOHEADER = 0x4,
/// <summary>
/// Can be collapsed
/// </summary>
LVGS_COLLAPSIBLE = 0x8,
/// <summary>
/// Has focus
/// </summary>
LVGS_FOCUSED = 0x10,
/// <summary>
/// Is Selected
/// </summary>
LVGS_SELECTED = 0x20,
/// <summary>
/// Is subsetted
/// </summary>
LVGS_SUBSETED = 0x40,
/// <summary>
/// Subset link has focus
/// </summary>
LVGS_SUBSETLINKFOCUSED = 0x80,
/// <summary>
/// All styles
/// </summary>
LVGS_ALL = 0xFFFF
}
/// <summary>
/// This mask indicates which members of a LVGROUP have valid data. These values
/// are taken directly from the SDK and many are not used by ObjectListView.
/// </summary>
[Flags]
public enum GroupMask
{
/// <summary>
/// No mask
/// </summary>
LVGF_NONE = 0,
/// <summary>
/// Group has header
/// </summary>
LVGF_HEADER = 1,
/// <summary>
/// Group has footer
/// </summary>
LVGF_FOOTER = 2,
/// <summary>
/// Group has state
/// </summary>
LVGF_STATE = 4,
/// <summary>
///
/// </summary>
LVGF_ALIGN = 8,
/// <summary>
///
/// </summary>
LVGF_GROUPID = 0x10,
/// <summary>
/// pszSubtitle is valid
/// </summary>
LVGF_SUBTITLE = 0x00100,
/// <summary>
/// pszTask is valid
/// </summary>
LVGF_TASK = 0x00200,
/// <summary>
/// pszDescriptionTop is valid
/// </summary>
LVGF_DESCRIPTIONTOP = 0x00400,
/// <summary>
/// pszDescriptionBottom is valid
/// </summary>
LVGF_DESCRIPTIONBOTTOM = 0x00800,
/// <summary>
/// iTitleImage is valid
/// </summary>
LVGF_TITLEIMAGE = 0x01000,
/// <summary>
/// iExtendedImage is valid
/// </summary>
LVGF_EXTENDEDIMAGE = 0x02000,
/// <summary>
/// iFirstItem and cItems are valid
/// </summary>
LVGF_ITEMS = 0x04000,
/// <summary>
/// pszSubsetTitle is valid
/// </summary>
LVGF_SUBSET = 0x08000,
/// <summary>
/// readonly, cItems holds count of items in visible subset, iFirstItem is valid
/// </summary>
LVGF_SUBSETITEMS = 0x10000
}
/// <summary>
/// This mask indicates which members of a GROUPMETRICS structure are valid
/// </summary>
[Flags]
public enum GroupMetricsMask
{
/// <summary>
///
/// </summary>
LVGMF_NONE = 0,
/// <summary>
///
/// </summary>
LVGMF_BORDERSIZE = 1,
/// <summary>
///
/// </summary>
LVGMF_BORDERCOLOR = 2,
/// <summary>
///
/// </summary>
LVGMF_TEXTCOLOR = 4
}
/// <summary>
/// Instances of this class enhance the capabilities of a normal ListViewGroup,
/// enabling the functionality that was released in v6 of the common controls.
/// </summary>
/// <remarks>
/// <para>
/// In this implementation (2009-09), these objects are essentially passive.
/// Setting properties does not automatically change the associated group in
/// the listview. Collapsed and Collapsible are two exceptions to this and
/// give immediate results.
/// </para>
/// <para>
/// This really should be a subclass of ListViewGroup, but that class is
/// sealed (why is that?). So this class provides the same interface as a
/// ListViewGroup, plus many other new properties.
/// </para>
/// </remarks>
public class OLVGroup
{
#region Creation
/// <summary>
/// Create an OLVGroup
/// </summary>
public OLVGroup() : this("Default group header") {
}
/// <summary>
/// Create a group with the given title
/// </summary>
/// <param name="header">Title of the group</param>
public OLVGroup(string header) {
this.Header = header;
this.Id = OLVGroup.nextId++;
this.TitleImage = -1;
this.ExtendedImage = -1;
}
private static int nextId;
#endregion
#region Public properties
/// <summary>
/// Gets or sets the bottom description of the group
/// </summary>
/// <remarks>
/// Descriptions only appear when group is centered and there is a title image
/// </remarks>
public string BottomDescription {
get { return this.bottomDescription; }
set { this.bottomDescription = value; }
}
private string bottomDescription;
/// <summary>
/// Gets or sets whether or not this group is collapsed
/// </summary>
public bool Collapsed {
get { return this.GetOneState(GroupState.LVGS_COLLAPSED); }
set { this.SetOneState(value, GroupState.LVGS_COLLAPSED); }
}
/// <summary>
/// Gets or sets whether or not this group can be collapsed
/// </summary>
public bool Collapsible {
get { return this.GetOneState(GroupState.LVGS_COLLAPSIBLE); }
set { this.SetOneState(value, GroupState.LVGS_COLLAPSIBLE); }
}
/// <summary>
/// Gets or sets some representation of the contents of this group
/// </summary>
/// <remarks>This is user defined (like Tag)</remarks>
public IList Contents {
get { return this.contents; }
set { this.contents = value; }
}
private IList contents;
/// <summary>
/// Gets whether this group has been created.
/// </summary>
public bool Created {
get { return this.ListView != null; }
}
/// <summary>
/// Gets or sets the int or string that will select the extended image to be shown against the title
/// </summary>
public object ExtendedImage {
get { return this.extendedImage; }
set { this.extendedImage = value; }
}
private object extendedImage;
/// <summary>
/// Gets or sets the footer of the group
/// </summary>
public string Footer {
get { return this.footer; }
set { this.footer = value; }
}
private string footer;
/// <summary>
/// Gets the internal id of our associated ListViewGroup.
/// </summary>
public int GroupId {
get {
if (this.ListViewGroup == null)
return this.Id;
// Use reflection to get around the access control on the ID property
if (OLVGroup.groupIdPropInfo == null) {
OLVGroup.groupIdPropInfo = typeof(ListViewGroup).GetProperty("ID",
BindingFlags.NonPublic | BindingFlags.Instance);
System.Diagnostics.Debug.Assert(OLVGroup.groupIdPropInfo != null);
}
int? groupId = OLVGroup.groupIdPropInfo.GetValue(this.ListViewGroup, null) as int?;
return groupId.HasValue ? groupId.Value : -1;
}
}
private static PropertyInfo groupIdPropInfo;
/// <summary>
/// Gets or sets the header of the group
/// </summary>
public string Header {
get { return this.header; }
set { this.header = value; }
}
private string header;
/// <summary>
/// Gets or sets the horizontal alignment of the group header
/// </summary>
public HorizontalAlignment HeaderAlignment {
get { return this.headerAlignment; }
set { this.headerAlignment = value; }
}
private HorizontalAlignment headerAlignment;
/// <summary>
/// Gets or sets the internally created id of the group
/// </summary>
public int Id {
get { return this.id; }
set { this.id = value; }
}
private int id;
/// <summary>
/// Gets or sets ListViewItems that are members of this group
/// </summary>
/// <remarks>Listener of the BeforeCreatingGroups event can populate this collection.
/// It is only used on non-virtual lists.</remarks>
public IList<OLVListItem> Items {
get { return this.items; }
set { this.items = value; }
}
private IList<OLVListItem> items = new List<OLVListItem>();
/// <summary>
/// Gets or sets the key that was used to partition objects into this group
/// </summary>
/// <remarks>This is user defined (like Tag)</remarks>
public object Key {
get { return this.key; }
set { this.key = value; }
}
private object key;
/// <summary>
/// Gets the ObjectListView that this group belongs to
/// </summary>
/// <remarks>If this is null, the group has not yet been created.</remarks>
public ObjectListView ListView {
get { return this.listView; }
protected set { this.listView = value; }
}
private ObjectListView listView;
/// <summary>
/// Gets or sets the name of the group
/// </summary>
/// <remarks>As of 2009-09-01, this property is not used.</remarks>
public string Name {
get { return this.name; }
set { this.name = value; }
}
private string name;
/// <summary>
/// Gets or sets whether this group is focused
/// </summary>
public bool Focused
{
get { return this.GetOneState(GroupState.LVGS_FOCUSED); }
set { this.SetOneState(value, GroupState.LVGS_FOCUSED); }
}
/// <summary>
/// Gets or sets whether this group is selected
/// </summary>
public bool Selected
{
get { return this.GetOneState(GroupState.LVGS_SELECTED); }
set { this.SetOneState(value, GroupState.LVGS_SELECTED); }
}
/// <summary>
/// Gets or sets the text that will show that this group is subsetted
/// </summary>
/// <remarks>
/// As of WinSDK v7.0, subsetting of group is officially unimplemented.
/// We can get around this using undocumented interfaces and may do so.
/// </remarks>
public string SubsetTitle {
get { return this.subsetTitle; }
set { this.subsetTitle = value; }
}
private string subsetTitle;
/// <summary>
/// Gets or set the subtitleof the task
/// </summary>
public string Subtitle {
get { return this.subtitle; }
set { this.subtitle = value; }
}
private string subtitle;
/// <summary>
/// Gets or sets the value by which this group will be sorted.
/// </summary>
public IComparable SortValue {
get { return this.sortValue; }
set { this.sortValue = value; }
}
private IComparable sortValue;
/// <summary>
/// Gets or sets the state of the group
/// </summary>
public GroupState State {
get { return this.state; }
set { this.state = value; }
}
private GroupState state;
/// <summary>
/// Gets or sets which bits of State are valid
/// </summary>
public GroupState StateMask {
get { return this.stateMask; }
set { this.stateMask = value; }
}
private GroupState stateMask;
/// <summary>
/// Gets or sets whether this group is showing only a subset of its elements
/// </summary>
/// <remarks>
/// As of WinSDK v7.0, this property officially does nothing.
/// </remarks>
public bool Subseted {
get { return this.GetOneState(GroupState.LVGS_SUBSETED); }
set { this.SetOneState(value, GroupState.LVGS_SUBSETED); }
}
/// <summary>
/// Gets or sets the user-defined data attached to this group
/// </summary>
public object Tag {
get { return this.tag; }
set { this.tag = value; }
}
private object tag;
/// <summary>
/// Gets or sets the task of this group
/// </summary>
/// <remarks>This task is the clickable text that appears on the right margin
/// of the group header.</remarks>
public string Task {
get { return this.task; }
set { this.task = value; }
}
private string task;
/// <summary>
/// Gets or sets the int or string that will select the image to be shown against the title
/// </summary>
public object TitleImage {
get { return this.titleImage; }
set { this.titleImage = value; }
}
private object titleImage;
/// <summary>
/// Gets or sets the top description of the group
/// </summary>
/// <remarks>
/// Descriptions only appear when group is centered and there is a title image
/// </remarks>
public string TopDescription {
get { return this.topDescription; }
set { this.topDescription = value; }
}
private string topDescription;
/// <summary>
/// Gets or sets the number of items that are within this group.
/// </summary>
/// <remarks>This should only be used for virtual groups.</remarks>
public int VirtualItemCount {
get { return this.virtualItemCount; }
set { this.virtualItemCount = value; }
}
private int virtualItemCount;
#endregion
#region Protected properties
/// <summary>
/// Gets or sets the ListViewGroup that is shadowed by this group.
/// </summary>
/// <remarks>For virtual groups, this will always be null.</remarks>
protected ListViewGroup ListViewGroup {
get { return this.listViewGroup; }
set { this.listViewGroup = value; }
}
private ListViewGroup listViewGroup;
#endregion
#region Calculations/Conversions
/// <summary>
/// Calculate the index into the group image list of the given image selector
/// </summary>
/// <param name="imageSelector"></param>
/// <returns></returns>
public int GetImageIndex(object imageSelector) {
if (imageSelector == null || this.ListView == null || this.ListView.GroupImageList == null)
return -1;
if (imageSelector is Int32)
return (int)imageSelector;
String imageSelectorAsString = imageSelector as String;
if (imageSelectorAsString != null)
return this.ListView.GroupImageList.Images.IndexOfKey(imageSelectorAsString);
return -1;
}
/// <summary>
/// Convert this object to a string representation
/// </summary>
/// <returns></returns>
public override string ToString() {
return this.Header;
}
#endregion
#region Commands
/// <summary>
/// Insert a native group into the underlying Windows control,
/// *without* using a ListViewGroup
/// </summary>
/// <param name="olv"></param>
/// <remarks>This is used when creating virtual groups</remarks>
public void InsertGroupNewStyle(ObjectListView olv) {
this.ListView = olv;
NativeMethods.InsertGroup(olv, this.AsNativeGroup(true));
}
/// <summary>
/// Insert a native group into the underlying control via a ListViewGroup
/// </summary>
/// <param name="olv"></param>
public void InsertGroupOldStyle(ObjectListView olv) {
this.ListView = olv;
// Create/update the associated ListViewGroup
if (this.ListViewGroup == null)
this.ListViewGroup = new ListViewGroup();
this.ListViewGroup.Header = this.Header;
this.ListViewGroup.HeaderAlignment = this.HeaderAlignment;
this.ListViewGroup.Name = this.Name;
// Remember which OLVGroup created the ListViewGroup
this.ListViewGroup.Tag = this;
// Add the group to the control
olv.Groups.Add(this.ListViewGroup);
// Add any extra information
NativeMethods.SetGroupInfo(olv, this.GroupId, this.AsNativeGroup(false));
}
/// <summary>
/// Change the members of the group to match the current contents of Items,
/// using a ListViewGroup
/// </summary>
public void SetItemsOldStyle() {
List<OLVListItem> list = this.Items as List<OLVListItem>;
if (list == null) {
foreach (OLVListItem item in this.Items) {
this.ListViewGroup.Items.Add(item);
}
} else {
this.ListViewGroup.Items.AddRange(list.ToArray());
}
}
#endregion
#region Implementation
/// <summary>
/// Create a native LVGROUP structure that matches this group
/// </summary>
internal NativeMethods.LVGROUP2 AsNativeGroup(bool withId) {
NativeMethods.LVGROUP2 group = new NativeMethods.LVGROUP2();
group.cbSize = (uint)Marshal.SizeOf(typeof(NativeMethods.LVGROUP2));
group.mask = (uint)(GroupMask.LVGF_HEADER ^ GroupMask.LVGF_ALIGN ^ GroupMask.LVGF_STATE);
group.pszHeader = this.Header;
group.uAlign = (uint)this.HeaderAlignment;
group.stateMask = (uint)this.StateMask;
group.state = (uint)this.State;
if (withId) {
group.iGroupId = this.GroupId;
group.mask ^= (uint)GroupMask.LVGF_GROUPID;
}
if (!String.IsNullOrEmpty(this.Footer)) {
group.pszFooter = this.Footer;
group.mask ^= (uint)GroupMask.LVGF_FOOTER;
}
if (!String.IsNullOrEmpty(this.Subtitle)) {
group.pszSubtitle = this.Subtitle;
group.mask ^= (uint)GroupMask.LVGF_SUBTITLE;
}
if (!String.IsNullOrEmpty(this.Task)) {
group.pszTask = this.Task;
group.mask ^= (uint)GroupMask.LVGF_TASK;
}
if (!String.IsNullOrEmpty(this.TopDescription)) {
group.pszDescriptionTop = this.TopDescription;
group.mask ^= (uint)GroupMask.LVGF_DESCRIPTIONTOP;
}
if (!String.IsNullOrEmpty(this.BottomDescription)) {
group.pszDescriptionBottom = this.BottomDescription;
group.mask ^= (uint)GroupMask.LVGF_DESCRIPTIONBOTTOM;
}
int imageIndex = this.GetImageIndex(this.TitleImage);
if (imageIndex >= 0) {
group.iTitleImage = imageIndex;
group.mask ^= (uint)GroupMask.LVGF_TITLEIMAGE;
}
imageIndex = this.GetImageIndex(this.ExtendedImage);
if (imageIndex >= 0) {
group.iExtendedImage = imageIndex;
group.mask ^= (uint)GroupMask.LVGF_EXTENDEDIMAGE;
}
if (!String.IsNullOrEmpty(this.SubsetTitle)) {
group.pszSubsetTitle = this.SubsetTitle;
group.mask ^= (uint)GroupMask.LVGF_SUBSET;
}
if (this.VirtualItemCount > 0) {
group.cItems = this.VirtualItemCount;
group.mask ^= (uint)GroupMask.LVGF_ITEMS;
}
return group;
}
private bool GetOneState(GroupState mask) {
if (this.Created)
this.State = this.GetState();
return (this.State & mask) == mask;
}
/// <summary>
/// Get the current state of this group from the underlying control
/// </summary>
protected GroupState GetState() {
return NativeMethods.GetGroupState(this.ListView, this.GroupId, GroupState.LVGS_ALL);
}
/// <summary>
/// Get the current state of this group from the underlying control
/// </summary>
protected int SetState(GroupState newState, GroupState mask) {
NativeMethods.LVGROUP2 group = new NativeMethods.LVGROUP2();
group.cbSize = ((uint)Marshal.SizeOf(typeof(NativeMethods.LVGROUP2)));
group.mask = (uint)GroupMask.LVGF_STATE;
group.state = (uint)newState;
group.stateMask = (uint)mask;
return NativeMethods.SetGroupInfo(this.ListView, this.GroupId, group);
}
private void SetOneState(bool value, GroupState mask)
{
this.StateMask ^= mask;
if (value)
this.State ^= mask;
else
this.State &= ~mask;
if (this.Created)
this.SetState(this.State, mask);
}
#endregion
}
}

View File

@@ -0,0 +1,559 @@
/*
* Munger - An Interface pattern on getting and setting values from object through Reflection
*
* Author: Phillip Piper
* Date: 28/11/2008 17:15
*
* Change log:
* v2.5.1
* 2012-05-01 JPP - Added IgnoreMissingAspects property
* v2.5
* 2011-05-20 JPP - Accessing through an indexer when the target had both a integer and
* a string indexer didn't work reliably.
* v2.4.1
* 2010-08-10 JPP - Refactored into Munger/SimpleMunger. 3x faster!
* v2.3
* 2009-02-15 JPP - Made Munger a public class
* 2009-01-20 JPP - Made the Munger capable of handling indexed access.
* Incidentally, this removed the ugliness that the last change introduced.
* 2009-01-18 JPP - Handle target objects from a DataListView (normally DataRowViews)
* v2.0
* 2008-11-28 JPP Initial version
*
* TO DO:
*
* Copyright (C) 2006-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Reflection;
namespace BrightIdeasSoftware
{
/// <summary>
/// An instance of Munger gets a value from or puts a value into a target object. The property
/// to be peeked (or poked) is determined from a string. The peeking or poking is done using reflection.
/// </summary>
/// <remarks>
/// Name of the aspect to be peeked can be a field, property or parameterless method. The name of an
/// aspect to poke can be a field, writable property or single parameter method.
/// <para>
/// Aspect names can be dotted to chain a series of references.
/// </para>
/// <example>Order.Customer.HomeAddress.State</example>
/// </remarks>
public class Munger
{
#region Life and death
/// <summary>
/// Create a do nothing Munger
/// </summary>
public Munger()
{
}
/// <summary>
/// Create a Munger that works on the given aspect name
/// </summary>
/// <param name="aspectName">The name of the </param>
public Munger(String aspectName)
{
this.AspectName = aspectName;
}
#endregion
#region Static utility methods
/// <summary>
/// A helper method to put the given value into the given aspect of the given object.
/// </summary>
/// <remarks>This method catches and silently ignores any errors that occur
/// while modifying the target object</remarks>
/// <param name="target">The object to be modified</param>
/// <param name="propertyName">The name of the property/field to be modified</param>
/// <param name="value">The value to be assigned</param>
/// <returns>Did the modification work?</returns>
public static bool PutProperty(object target, string propertyName, object value) {
try {
Munger munger = new Munger(propertyName);
return munger.PutValue(target, value);
}
catch (MungerException) {
// Not a lot we can do about this. Something went wrong in the bowels
// of the property. Let's take the ostrich approach and just ignore it :-)
// Normally, we would never just silently ignore an exception.
// However, in this case, this is a utility method that explicitly
// contracts to catch and ignore errors. If this is not acceptible,
// the programmer should not use this method.
}
return false;
}
/// <summary>
/// Gets or sets whether Mungers will silently ignore missing aspect errors.
/// </summary>
/// <remarks>
/// <para>
/// By default, if a Munger is asked to fetch a field/property/method
/// that does not exist from a model, it returns an error message, since that
/// condition is normally a programming error. There are some use cases where
/// this is not an error, and the munger should simply keep quiet.
/// </para>
/// <para>By default this is true during release builds.</para>
/// </remarks>
public static bool IgnoreMissingAspects {
get { return ignoreMissingAspects; }
set { ignoreMissingAspects = value; }
}
private static bool ignoreMissingAspects
#if !DEBUG
= true
#endif
;
#endregion
#region Public properties
/// <summary>
/// The name of the aspect that is to be peeked or poked.
/// </summary>
/// <remarks>
/// <para>
/// This name can be a field, property or parameter-less method.
/// </para>
/// <para>
/// The name can be dotted, which chains references. If any link in the chain returns
/// null, the entire chain is considered to return null.
/// </para>
/// </remarks>
/// <example>"DateOfBirth"</example>
/// <example>"Owner.HomeAddress.Postcode"</example>
public string AspectName
{
get { return aspectName; }
set {
aspectName = value;
// Clear any cache
aspectParts = null;
}
}
private string aspectName;
#endregion
#region Public interface
/// <summary>
/// Extract the value indicated by our AspectName from the given target.
/// </summary>
/// <remarks>If the aspect name is null or empty, this will return null.</remarks>
/// <param name="target">The object that will be peeked</param>
/// <returns>The value read from the target</returns>
public Object GetValue(Object target) {
if (this.Parts.Count == 0)
return null;
try {
return this.EvaluateParts(target, this.Parts);
} catch (MungerException ex) {
if (Munger.IgnoreMissingAspects)
return null;
return String.Format("'{0}' is not a parameter-less method, property or field of type '{1}'",
ex.Munger.AspectName, ex.Target.GetType());
}
}
/// <summary>
/// Extract the value indicated by our AspectName from the given target, raising exceptions
/// if the munger fails.
/// </summary>
/// <remarks>If the aspect name is null or empty, this will return null.</remarks>
/// <param name="target">The object that will be peeked</param>
/// <returns>The value read from the target</returns>
public Object GetValueEx(Object target) {
if (this.Parts.Count == 0)
return null;
return this.EvaluateParts(target, this.Parts);
}
/// <summary>
/// Poke the given value into the given target indicated by our AspectName.
/// </summary>
/// <remarks>
/// <para>
/// If the AspectName is a dotted path, all the selectors bar the last
/// are used to find the object that should be updated, and the last
/// selector is used as the property to update on that object.
/// </para>
/// <para>
/// So, if 'target' is a Person and the AspectName is "HomeAddress.Postcode",
/// this method will first fetch "HomeAddress" property, and then try to set the
/// "Postcode" property on the home address object.
/// </para>
/// </remarks>
/// <param name="target">The object that will be poked</param>
/// <param name="value">The value that will be poked into the target</param>
/// <returns>bool indicating whether the put worked</returns>
public bool PutValue(Object target, Object value)
{
if (this.Parts.Count == 0)
return false;
SimpleMunger lastPart = this.Parts[this.Parts.Count - 1];
if (this.Parts.Count > 1) {
List<SimpleMunger> parts = new List<SimpleMunger>(this.Parts);
parts.RemoveAt(parts.Count - 1);
try {
target = this.EvaluateParts(target, parts);
} catch (MungerException ex) {
this.ReportPutValueException(ex);
return false;
}
}
if (target != null) {
try {
return lastPart.PutValue(target, value);
} catch (MungerException ex) {
this.ReportPutValueException(ex);
}
}
return false;
}
#endregion
#region Implementation
/// <summary>
/// Gets the list of SimpleMungers that match our AspectName
/// </summary>
private IList<SimpleMunger> Parts {
get {
if (aspectParts == null)
aspectParts = BuildParts(this.AspectName);
return aspectParts;
}
}
private IList<SimpleMunger> aspectParts;
/// <summary>
/// Convert a possibly dotted AspectName into a list of SimpleMungers
/// </summary>
/// <param name="aspect"></param>
/// <returns></returns>
private IList<SimpleMunger> BuildParts(string aspect) {
List<SimpleMunger> parts = new List<SimpleMunger>();
if (!String.IsNullOrEmpty(aspect)) {
foreach (string part in aspect.Split('.')) {
parts.Add(new SimpleMunger(part.Trim()));
}
}
return parts;
}
/// <summary>
/// Evaluate the given chain of SimpleMungers against an initial target.
/// </summary>
/// <param name="target"></param>
/// <param name="parts"></param>
/// <returns></returns>
private object EvaluateParts(object target, IList<SimpleMunger> parts) {
foreach (SimpleMunger part in parts) {
if (target == null)
break;
target = part.GetValue(target);
}
return target;
}
private void ReportPutValueException(MungerException ex) {
//TODO: How should we report this error?
System.Diagnostics.Debug.WriteLine("PutValue failed");
System.Diagnostics.Debug.WriteLine(String.Format("- Culprit aspect: {0}", ex.Munger.AspectName));
System.Diagnostics.Debug.WriteLine(String.Format("- Target: {0} of type {1}", ex.Target, ex.Target.GetType()));
System.Diagnostics.Debug.WriteLine(String.Format("- Inner exception: {0}", ex.InnerException));
}
#endregion
}
/// <summary>
/// A SimpleMunger deals with a single property/field/method on its target.
/// </summary>
/// <remarks>
/// Munger uses a chain of these resolve a dotted aspect name.
/// </remarks>
/// <remarks>
/// Create a SimpleMunger
/// </remarks>
/// <param name="aspectName"></param>
public class SimpleMunger(String aspectName)
{
#region Life and death
#endregion
#region Public properties
/// <summary>
/// The name of the aspect that is to be peeked or poked.
/// </summary>
/// <remarks>
/// <para>
/// This name can be a field, property or method.
/// When using a method to get a value, the method must be parameter-less.
/// When using a method to set a value, the method must accept 1 parameter.
/// </para>
/// <para>
/// It cannot be a dotted name.
/// </para>
/// </remarks>
public string AspectName {
get { return aspectName; }
}
private readonly string aspectName = aspectName;
#endregion
#region Public interface
/// <summary>
/// Get a value from the given target
/// </summary>
/// <param name="target"></param>
/// <returns></returns>
public Object GetValue(Object target) {
if (target == null)
return null;
this.ResolveName(target, this.AspectName, 0);
try {
if (this.resolvedPropertyInfo != null)
return this.resolvedPropertyInfo.GetValue(target, null);
if (this.resolvedMethodInfo != null)
return this.resolvedMethodInfo.Invoke(target, null);
if (this.resolvedFieldInfo != null)
return this.resolvedFieldInfo.GetValue(target);
// If that didn't work, try to use the indexer property.
// This covers things like dictionaries and DataRows.
if (this.indexerPropertyInfo != null)
return this.indexerPropertyInfo.GetValue(target, new object[] { this.AspectName });
} catch (Exception ex) {
// Lots of things can do wrong in these invocations
throw new MungerException(this, target, ex);
}
// If we get to here, we couldn't find a match for the aspect
throw new MungerException(this, target, new MissingMethodException());
}
/// <summary>
/// Poke the given value into the given target indicated by our AspectName.
/// </summary>
/// <param name="target">The object that will be poked</param>
/// <param name="value">The value that will be poked into the target</param>
/// <returns>bool indicating if the put worked</returns>
public bool PutValue(object target, object value) {
if (target == null)
return false;
this.ResolveName(target, this.AspectName, 1);
try {
if (this.resolvedPropertyInfo != null) {
this.resolvedPropertyInfo.SetValue(target, value, null);
return true;
}
if (this.resolvedMethodInfo != null) {
this.resolvedMethodInfo.Invoke(target, new object[] { value });
return true;
}
if (this.resolvedFieldInfo != null) {
this.resolvedFieldInfo.SetValue(target, value);
return true;
}
// If that didn't work, try to use the indexer property.
// This covers things like dictionaries and DataRows.
if (this.indexerPropertyInfo != null) {
this.indexerPropertyInfo.SetValue(target, value, new object[] { this.AspectName });
return true;
}
} catch (Exception ex) {
// Lots of things can do wrong in these invocations
throw new MungerException(this, target, ex);
}
return false;
}
#endregion
#region Implementation
private void ResolveName(object target, string name, int numberMethodParameters) {
if (cachedTargetType == target.GetType() && cachedName == name && cachedNumberParameters == numberMethodParameters)
return;
cachedTargetType = target.GetType();
cachedName = name;
cachedNumberParameters = numberMethodParameters;
resolvedFieldInfo = null;
resolvedPropertyInfo = null;
resolvedMethodInfo = null;
indexerPropertyInfo = null;
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance /*| BindingFlags.NonPublic*/;
foreach (PropertyInfo pinfo in target.GetType().GetProperties(flags)) {
if (pinfo.Name == name) {
resolvedPropertyInfo = pinfo;
return;
}
// See if we can find an string indexer property while we are here.
// We also need to allow for old style <object> keyed collections.
if (indexerPropertyInfo == null && pinfo.Name == "Item") {
ParameterInfo[] par = pinfo.GetGetMethod().GetParameters();
if (par.Length > 0) {
Type parameterType = par[0].ParameterType;
if (parameterType == typeof(string) || parameterType == typeof(object))
indexerPropertyInfo = pinfo;
}
}
}
foreach (FieldInfo info in target.GetType().GetFields(flags)) {
if (info.Name == name) {
resolvedFieldInfo = info;
return;
}
}
foreach (MethodInfo info in target.GetType().GetMethods(flags)) {
if (info.Name == name && info.GetParameters().Length == numberMethodParameters) {
resolvedMethodInfo = info;
return;
}
}
}
private Type cachedTargetType;
private string cachedName;
private int cachedNumberParameters;
private FieldInfo resolvedFieldInfo;
private PropertyInfo resolvedPropertyInfo;
private MethodInfo resolvedMethodInfo;
private PropertyInfo indexerPropertyInfo;
#endregion
}
/// <summary>
/// These exceptions are raised when a munger finds something it cannot process
/// </summary>
/// <remarks>
/// Create a MungerException
/// </remarks>
/// <param name="munger"></param>
/// <param name="target"></param>
/// <param name="ex"></param>
public class MungerException(SimpleMunger munger, object target, Exception ex) : ApplicationException("Munger failed", ex)
{
/// <summary>
/// Get the munger that raised the exception
/// </summary>
public SimpleMunger Munger {
get { return munger; }
}
private readonly SimpleMunger munger = munger;
/// <summary>
/// Gets the target that threw the exception
/// </summary>
public object Target {
get { return target; }
}
private readonly object target = target;
}
/*
* We don't currently need this
* 2010-08-06
*
internal class SimpleBinder : Binder
{
public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, System.Globalization.CultureInfo culture) {
//return Type.DefaultBinder.BindToField(
throw new NotImplementedException();
}
public override object ChangeType(object value, Type type, System.Globalization.CultureInfo culture) {
throw new NotImplementedException();
}
public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] names, out object state) {
throw new NotImplementedException();
}
public override void ReorderArgumentArray(ref object[] args, object state) {
throw new NotImplementedException();
}
public override MethodBase SelectMethod(BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers) {
throw new NotImplementedException();
}
public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType, Type[] indexes, ParameterModifier[] modifiers) {
if (match == null)
throw new ArgumentNullException("match");
if (match.Length == 0)
return null;
return match[0];
}
}
*/
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,87 @@
/*
* NullableDictionary - A simple Dictionary that can handle null as a key
*
* Author: Phillip Piper
* Date: 31-March-2011 5:53 pm
*
* Change log:
* 2011-03-31 JPP - Split into its own file
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace BrightIdeasSoftware {
/// <summary>
/// A simple-minded implementation of a Dictionary that can handle null as a key.
/// </summary>
/// <typeparam name="TKey">The type of the dictionary key</typeparam>
/// <typeparam name="TValue">The type of the values to be stored</typeparam>
/// <remarks>This is not a full implementation and is only meant to handle
/// collecting groups by their keys, since groups can have null as a key value.</remarks>
internal class NullableDictionary<TKey, TValue> : Dictionary<TKey, TValue> {
private bool hasNullKey;
private TValue nullValue;
new public TValue this[TKey key] {
get {
if (key != null)
return base[key];
if (this.hasNullKey)
return this.nullValue;
throw new KeyNotFoundException();
}
set {
if (key == null) {
this.hasNullKey = true;
this.nullValue = value;
} else
base[key] = value;
}
}
new public bool ContainsKey(TKey key) {
return key == null ? this.hasNullKey : base.ContainsKey(key);
}
new public IList Keys {
get {
ArrayList list = new ArrayList(base.Keys);
if (this.hasNullKey)
list.Add(null);
return list;
}
}
new public IList<TValue> Values {
get {
List<TValue> list = new List<TValue>(base.Values);
if (this.hasNullKey)
list.Add(this.nullValue);
return list;
}
}
}
}

View File

@@ -0,0 +1,321 @@
/*
* OLVListItem - A row in an ObjectListView
*
* Author: Phillip Piper
* Date: 31-March-2011 5:53 pm
*
* Change log:
* 2015-08-22 JPP - Added OLVListItem.SelectedBackColor and SelectedForeColor
* 2015-06-09 JPP - Added HasAnyHyperlinks property
* v2.8
* 2014-09-27 JPP - Remove faulty caching of CheckState
* 2014-05-06 JPP - Added OLVListItem.Enabled flag
* vOld
* 2011-03-31 JPP - Split into its own file
*
* Copyright (C) 2011-2015 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace BrightIdeasSoftware {
/// <summary>
/// OLVListItems are specialized ListViewItems that know which row object they came from,
/// and the row index at which they are displayed, even when in group view mode. They
/// also know the image they should draw against themselves
/// </summary>
public class OLVListItem : ListViewItem {
#region Constructors
/// <summary>
/// Create a OLVListItem for the given row object
/// </summary>
public OLVListItem(object rowObject) {
this.rowObject = rowObject;
}
/// <summary>
/// Create a OLVListItem for the given row object, represented by the given string and image
/// </summary>
public OLVListItem(object rowObject, string text, Object image)
: base(text, -1) {
this.rowObject = rowObject;
this.imageSelector = image;
}
#endregion.
#region Properties
/// <summary>
/// Gets the bounding rectangle of the item, including all subitems
/// </summary>
new public Rectangle Bounds {
get {
try {
return base.Bounds;
}
catch (System.ArgumentException) {
// If the item is part of a collapsed group, Bounds will throw an exception
return Rectangle.Empty;
}
}
}
/// <summary>
/// Gets or sets how many pixels will be left blank around each cell of this item
/// </summary>
/// <remarks>This setting only takes effect when the control is owner drawn.</remarks>
public Rectangle? CellPadding {
get { return this.cellPadding; }
set { this.cellPadding = value; }
}
private Rectangle? cellPadding;
/// <summary>
/// Gets or sets how the cells of this item will be vertically aligned
/// </summary>
/// <remarks>This setting only takes effect when the control is owner drawn.</remarks>
public StringAlignment? CellVerticalAlignment {
get { return this.cellVerticalAlignment; }
set { this.cellVerticalAlignment = value; }
}
private StringAlignment? cellVerticalAlignment;
/// <summary>
/// Gets or sets the checkedness of this item.
/// </summary>
/// <remarks>
/// Virtual lists don't handle checkboxes well, so we have to intercept attempts to change them
/// through the items, and change them into something that will work.
/// Unfortunately, this won't work if this property is set through the base class, since
/// the property is not declared as virtual.
/// </remarks>
new public bool Checked {
get {
return base.Checked;
}
set {
if (this.Checked != value) {
if (value)
((ObjectListView)this.ListView).CheckObject(this.RowObject);
else
((ObjectListView)this.ListView).UncheckObject(this.RowObject);
}
}
}
/// <summary>
/// Enable tri-state checkbox.
/// </summary>
/// <remarks>.NET's Checked property was not built to handle tri-state checkboxes,
/// and will return True for both Checked and Indeterminate states.</remarks>
public CheckState CheckState {
get {
switch (this.StateImageIndex) {
case 0:
return System.Windows.Forms.CheckState.Unchecked;
case 1:
return System.Windows.Forms.CheckState.Checked;
case 2:
return System.Windows.Forms.CheckState.Indeterminate;
default:
return System.Windows.Forms.CheckState.Unchecked;
}
}
set {
switch (value) {
case System.Windows.Forms.CheckState.Unchecked:
this.StateImageIndex = 0;
break;
case System.Windows.Forms.CheckState.Checked:
this.StateImageIndex = 1;
break;
case System.Windows.Forms.CheckState.Indeterminate:
this.StateImageIndex = 2;
break;
}
}
}
/// <summary>
/// Gets if this item has any decorations set for it.
/// </summary>
public bool HasDecoration {
get {
return this.decorations != null && this.decorations.Count > 0;
}
}
/// <summary>
/// Gets or sets the decoration that will be drawn over this item
/// </summary>
/// <remarks>Setting this replaces all other decorations</remarks>
public IDecoration Decoration {
get {
if (this.HasDecoration)
return this.Decorations[0];
else
return null;
}
set {
this.Decorations.Clear();
if (value != null)
this.Decorations.Add(value);
}
}
/// <summary>
/// Gets the collection of decorations that will be drawn over this item
/// </summary>
public IList<IDecoration> Decorations {
get {
if (this.decorations == null)
this.decorations = new List<IDecoration>();
return this.decorations;
}
}
private IList<IDecoration> decorations;
/// <summary>
/// Gets whether or not this row can be selected and activated
/// </summary>
public bool Enabled
{
get { return this.enabled; }
internal set { this.enabled = value; }
}
private bool enabled;
/// <summary>
/// Gets whether any cell on this item is showing a hyperlink
/// </summary>
public bool HasAnyHyperlinks {
get {
foreach (OLVListSubItem subItem in this.SubItems) {
if (!String.IsNullOrEmpty(subItem.Url))
return true;
}
return false;
}
}
/// <summary>
/// Get or set the image that should be shown against this item
/// </summary>
/// <remarks><para>This can be an Image, a string or an int. A string or an int will
/// be used as an index into the small image list.</para></remarks>
public Object ImageSelector {
get { return imageSelector; }
set {
imageSelector = value;
if (value is Int32)
this.ImageIndex = (Int32)value;
else if (value is String)
this.ImageKey = (String)value;
else
this.ImageIndex = -1;
}
}
private Object imageSelector;
/// <summary>
/// Gets or sets the the model object that is source of the data for this list item.
/// </summary>
public object RowObject {
get { return rowObject; }
set { rowObject = value; }
}
private object rowObject;
/// <summary>
/// Gets or sets the color that will be used for this row's background when it is selected and
/// the control is focused.
/// </summary>
/// <remarks>
/// <para>To work reliably, this property must be set during a FormatRow event.</para>
/// <para>
/// If this is not set, the normal selection BackColor will be used.
/// </para>
/// </remarks>
public Color? SelectedBackColor {
get { return this.selectedBackColor; }
set { this.selectedBackColor = value; }
}
private Color? selectedBackColor;
/// <summary>
/// Gets or sets the color that will be used for this row's foreground when it is selected and
/// the control is focused.
/// </summary>
/// <remarks>
/// <para>To work reliably, this property must be set during a FormatRow event.</para>
/// <para>
/// If this is not set, the normal selection ForeColor will be used.
/// </para>
/// </remarks>
public Color? SelectedForeColor
{
get { return this.selectedForeColor; }
set { this.selectedForeColor = value; }
}
private Color? selectedForeColor;
#endregion
#region Accessing
/// <summary>
/// Return the sub item at the given index
/// </summary>
/// <param name="index">Index of the subitem to be returned</param>
/// <returns>An OLVListSubItem</returns>
public virtual OLVListSubItem GetSubItem(int index) {
if (index >= 0 && index < this.SubItems.Count)
return (OLVListSubItem)this.SubItems[index];
return null;
}
/// <summary>
/// Return bounds of the given subitem
/// </summary>
/// <remarks>This correctly calculates the bounds even for column 0.</remarks>
public virtual Rectangle GetSubItemBounds(int subItemIndex) {
if (subItemIndex == 0) {
Rectangle r = this.Bounds;
Point sides = NativeMethods.GetScrolledColumnSides(this.ListView, subItemIndex);
r.X = sides.X + 1;
r.Width = sides.Y - sides.X;
return r;
}
OLVListSubItem subItem = this.GetSubItem(subItemIndex);
return subItem == null ? new Rectangle() : subItem.Bounds;
}
#endregion
}
}

View File

@@ -0,0 +1,173 @@
/*
* OLVListSubItem - A single cell in an ObjectListView
*
* Author: Phillip Piper
* Date: 31-March-2011 5:53 pm
*
* Change log:
* 2011-03-31 JPP - Split into its own file
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
namespace BrightIdeasSoftware {
/// <summary>
/// A ListViewSubItem that knows which image should be drawn against it.
/// </summary>
[Browsable(false)]
public class OLVListSubItem : ListViewItem.ListViewSubItem {
#region Constructors
/// <summary>
/// Create a OLVListSubItem
/// </summary>
public OLVListSubItem() {
}
/// <summary>
/// Create a OLVListSubItem that shows the given string and image
/// </summary>
public OLVListSubItem(object modelValue, string text, Object image) {
this.ModelValue = modelValue;
this.Text = text;
this.ImageSelector = image;
}
#endregion
#region Properties
/// <summary>
/// Gets or sets how many pixels will be left blank around this cell
/// </summary>
/// <remarks>This setting only takes effect when the control is owner drawn.</remarks>
public Rectangle? CellPadding {
get { return this.cellPadding; }
set { this.cellPadding = value; }
}
private Rectangle? cellPadding;
/// <summary>
/// Gets or sets how this cell will be vertically aligned
/// </summary>
/// <remarks>This setting only takes effect when the control is owner drawn.</remarks>
public StringAlignment? CellVerticalAlignment {
get { return this.cellVerticalAlignment; }
set { this.cellVerticalAlignment = value; }
}
private StringAlignment? cellVerticalAlignment;
/// <summary>
/// Gets or sets the model value is being displayed by this subitem.
/// </summary>
public object ModelValue
{
get { return modelValue; }
private set { modelValue = value; }
}
private object modelValue;
/// <summary>
/// Gets if this subitem has any decorations set for it.
/// </summary>
public bool HasDecoration {
get {
return this.decorations != null && this.decorations.Count > 0;
}
}
/// <summary>
/// Gets or sets the decoration that will be drawn over this item
/// </summary>
/// <remarks>Setting this replaces all other decorations</remarks>
public IDecoration Decoration {
get {
return this.HasDecoration ? this.Decorations[0] : null;
}
set {
this.Decorations.Clear();
if (value != null)
this.Decorations.Add(value);
}
}
/// <summary>
/// Gets the collection of decorations that will be drawn over this item
/// </summary>
public IList<IDecoration> Decorations {
get {
if (this.decorations == null)
this.decorations = new List<IDecoration>();
return this.decorations;
}
}
private IList<IDecoration> decorations;
/// <summary>
/// Get or set the image that should be shown against this item
/// </summary>
/// <remarks><para>This can be an Image, a string or an int. A string or an int will
/// be used as an index into the small image list.</para></remarks>
public Object ImageSelector {
get { return imageSelector; }
set { imageSelector = value; }
}
private Object imageSelector;
/// <summary>
/// Gets or sets the url that should be invoked when this subitem is clicked
/// </summary>
public string Url
{
get { return this.url; }
set { this.url = value; }
}
private string url;
/// <summary>
/// Gets or sets whether this cell is selected
/// </summary>
public bool Selected
{
get { return this.selected; }
set { this.selected = value; }
}
private bool selected;
#endregion
#region Implementation Properties
/// <summary>
/// Return the state of the animatation of the image on this subitem.
/// Null means there is either no image, or it is not an animation
/// </summary>
internal ImageRenderer.AnimationState AnimationState;
#endregion
}
}

View File

@@ -0,0 +1,388 @@
/*
* OlvListViewHitTestInfo - All information gathered during a OlvHitTest() operation
*
* Author: Phillip Piper
* Date: 31-March-2011 5:53 pm
*
* Change log:
* 2011-03-31 JPP - Split into its own file
*
* Copyright (C) 2011-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace BrightIdeasSoftware {
/// <summary>
/// An indication of where a hit was within ObjectListView cell
/// </summary>
public enum HitTestLocation {
/// <summary>
/// Nowhere
/// </summary>
Nothing,
/// <summary>
/// On the text
/// </summary>
Text,
/// <summary>
/// On the image
/// </summary>
Image,
/// <summary>
/// On the checkbox
/// </summary>
CheckBox,
/// <summary>
/// On the expand button (TreeListView)
/// </summary>
ExpandButton,
/// <summary>
/// in a button (cell must have ButtonRenderer)
/// </summary>
Button,
/// <summary>
/// in the cell but not in any more specific location
/// </summary>
InCell,
/// <summary>
/// UserDefined location1 (used for custom renderers)
/// </summary>
UserDefined,
/// <summary>
/// On the expand/collapse widget of the group
/// </summary>
GroupExpander,
/// <summary>
/// Somewhere on a group
/// </summary>
Group,
/// <summary>
/// Somewhere in a column header
/// </summary>
Header,
/// <summary>
/// Somewhere in a column header checkbox
/// </summary>
HeaderCheckBox,
/// <summary>
/// Somewhere in a header divider
/// </summary>
HeaderDivider,
}
/// <summary>
/// A collection of ListViewHitTest constants
/// </summary>
[Flags]
public enum HitTestLocationEx {
/// <summary>
///
/// </summary>
LVHT_NOWHERE = 0x00000001,
/// <summary>
///
/// </summary>
LVHT_ONITEMICON = 0x00000002,
/// <summary>
///
/// </summary>
LVHT_ONITEMLABEL = 0x00000004,
/// <summary>
///
/// </summary>
LVHT_ONITEMSTATEICON = 0x00000008,
/// <summary>
///
/// </summary>
LVHT_ONITEM = (LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON),
/// <summary>
///
/// </summary>
LVHT_ABOVE = 0x00000008,
/// <summary>
///
/// </summary>
LVHT_BELOW = 0x00000010,
/// <summary>
///
/// </summary>
LVHT_TORIGHT = 0x00000020,
/// <summary>
///
/// </summary>
LVHT_TOLEFT = 0x00000040,
/// <summary>
///
/// </summary>
LVHT_EX_GROUP_HEADER = 0x10000000,
/// <summary>
///
/// </summary>
LVHT_EX_GROUP_FOOTER = 0x20000000,
/// <summary>
///
/// </summary>
LVHT_EX_GROUP_COLLAPSE = 0x40000000,
/// <summary>
///
/// </summary>
LVHT_EX_GROUP_BACKGROUND = -2147483648, // 0x80000000
/// <summary>
///
/// </summary>
LVHT_EX_GROUP_STATEICON = 0x01000000,
/// <summary>
///
/// </summary>
LVHT_EX_GROUP_SUBSETLINK = 0x02000000,
/// <summary>
///
/// </summary>
LVHT_EX_GROUP = (LVHT_EX_GROUP_BACKGROUND | LVHT_EX_GROUP_COLLAPSE | LVHT_EX_GROUP_FOOTER | LVHT_EX_GROUP_HEADER | LVHT_EX_GROUP_STATEICON | LVHT_EX_GROUP_SUBSETLINK),
/// <summary>
///
/// </summary>
LVHT_EX_GROUP_MINUS_FOOTER_AND_BKGRD = (LVHT_EX_GROUP_COLLAPSE | LVHT_EX_GROUP_HEADER | LVHT_EX_GROUP_STATEICON | LVHT_EX_GROUP_SUBSETLINK),
/// <summary>
///
/// </summary>
LVHT_EX_ONCONTENTS = 0x04000000, // On item AND not on the background
/// <summary>
///
/// </summary>
LVHT_EX_FOOTER = 0x08000000,
}
/// <summary>
/// Instances of this class encapsulate the information gathered during a OlvHitTest()
/// operation.
/// </summary>
/// <remarks>Custom renderers can use HitTestLocation.UserDefined and the UserData
/// object to store more specific locations for use during event handlers.</remarks>
public class OlvListViewHitTestInfo {
/// <summary>
/// Create a OlvListViewHitTestInfo
/// </summary>
public OlvListViewHitTestInfo(OLVListItem olvListItem, OLVListSubItem subItem, int flags, OLVGroup group, int iColumn)
{
this.item = olvListItem;
this.subItem = subItem;
this.location = ConvertNativeFlagsToDotNetLocation(olvListItem, flags);
this.HitTestLocationEx = (HitTestLocationEx)flags;
this.Group = group;
this.ColumnIndex = iColumn;
this.ListView = olvListItem == null ? null : (ObjectListView)olvListItem.ListView;
switch (location) {
case ListViewHitTestLocations.StateImage:
this.HitTestLocation = HitTestLocation.CheckBox;
break;
case ListViewHitTestLocations.Image:
this.HitTestLocation = HitTestLocation.Image;
break;
case ListViewHitTestLocations.Label:
this.HitTestLocation = HitTestLocation.Text;
break;
default:
if ((this.HitTestLocationEx & HitTestLocationEx.LVHT_EX_GROUP_COLLAPSE) == HitTestLocationEx.LVHT_EX_GROUP_COLLAPSE)
this.HitTestLocation = HitTestLocation.GroupExpander;
else if ((this.HitTestLocationEx & HitTestLocationEx.LVHT_EX_GROUP_MINUS_FOOTER_AND_BKGRD) != 0)
this.HitTestLocation = HitTestLocation.Group;
else
this.HitTestLocation = HitTestLocation.Nothing;
break;
}
}
/// <summary>
/// Create a OlvListViewHitTestInfo when the header was hit
/// </summary>
public OlvListViewHitTestInfo(ObjectListView olv, int iColumn, bool isOverCheckBox, int iDivider) {
this.ListView = olv;
this.ColumnIndex = iColumn;
this.HeaderDividerIndex = iDivider;
this.HitTestLocation = isOverCheckBox ? HitTestLocation.HeaderCheckBox : (iDivider < 0 ? HitTestLocation.Header : HitTestLocation.HeaderDivider);
}
private static ListViewHitTestLocations ConvertNativeFlagsToDotNetLocation(OLVListItem hitItem, int flags)
{
// Untangle base .NET behaviour.
// In Windows SDK, the value 8 can have two meanings here: LVHT_ONITEMSTATEICON or LVHT_ABOVE.
// .NET changes these to be:
// - LVHT_ABOVE becomes ListViewHitTestLocations.AboveClientArea (which is 0x100).
// - LVHT_ONITEMSTATEICON becomes ListViewHitTestLocations.StateImage (which is 0x200).
// So, if we see the 8 bit set in flags, we change that to either a state image hit
// (if we hit an item) or to AboveClientAream if nothing was hit.
if ((8 & flags) == 8)
return (ListViewHitTestLocations)(0xf7 & flags | (hitItem == null ? 0x100 : 0x200));
// Mask off the LVHT_EX_XXXX values since ListViewHitTestLocations doesn't have them
return (ListViewHitTestLocations)(flags & 0xffff);
}
#region Public fields
/// <summary>
/// Where is the hit location?
/// </summary>
public HitTestLocation HitTestLocation;
/// <summary>
/// Where is the hit location?
/// </summary>
public HitTestLocationEx HitTestLocationEx;
/// <summary>
/// Which group was hit?
/// </summary>
public OLVGroup Group;
/// <summary>
/// Custom renderers can use this information to supply more details about the hit location
/// </summary>
public Object UserData;
#endregion
#region Public read-only properties
/// <summary>
/// Gets the item that was hit
/// </summary>
public OLVListItem Item {
get { return item; }
internal set { item = value; }
}
private OLVListItem item;
/// <summary>
/// Gets the subitem that was hit
/// </summary>
public OLVListSubItem SubItem {
get { return subItem; }
internal set { subItem = value; }
}
private OLVListSubItem subItem;
/// <summary>
/// Gets the part of the subitem that was hit
/// </summary>
public ListViewHitTestLocations Location {
get { return location; }
internal set { location = value; }
}
private ListViewHitTestLocations location;
/// <summary>
/// Gets the ObjectListView that was tested
/// </summary>
public ObjectListView ListView {
get { return listView; }
internal set { listView = value; }
}
private ObjectListView listView;
/// <summary>
/// Gets the model object that was hit
/// </summary>
public Object RowObject {
get {
return this.Item == null ? null : this.Item.RowObject;
}
}
/// <summary>
/// Gets the index of the row under the hit point or -1
/// </summary>
public int RowIndex {
get { return this.Item == null ? -1 : this.Item.Index; }
}
/// <summary>
/// Gets the index of the column under the hit point
/// </summary>
public int ColumnIndex {
get { return columnIndex; }
internal set { columnIndex = value; }
}
private int columnIndex;
/// <summary>
/// Gets the index of the header divider
/// </summary>
public int HeaderDividerIndex {
get { return headerDividerIndex; }
internal set { headerDividerIndex = value; }
}
private int headerDividerIndex = -1;
/// <summary>
/// Gets the column that was hit
/// </summary>
public OLVColumn Column {
get {
int index = this.ColumnIndex;
return index < 0 || this.ListView == null ? null : this.ListView.GetColumn(index);
}
}
#endregion
/// <summary>
/// Returns a string that represents the current object.
/// </summary>
/// <returns>
/// A string that represents the current object.
/// </returns>
/// <filterpriority>2</filterpriority>
public override string ToString()
{
return string.Format("HitTestLocation: {0}, HitTestLocationEx: {1}, Item: {2}, SubItem: {3}, Location: {4}, Group: {5}, ColumnIndex: {6}",
this.HitTestLocation, this.HitTestLocationEx, this.item, this.subItem, this.location, this.Group, this.ColumnIndex);
}
internal class HeaderHitTestInfo
{
public int ColumnIndex;
public bool IsOverCheckBox;
public int OverDividerIndex;
}
}
}

View File

@@ -0,0 +1,262 @@
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
namespace BrightIdeasSoftware
{
/// <summary>
/// A TreeDataSourceAdapter knows how to build a tree structure from a binding list.
/// </summary>
/// <remarks>To build a tree</remarks>
public class TreeDataSourceAdapter : DataSourceAdapter
{
#region Life and death
/// <summary>
/// Create a data source adaptor that knows how to build a tree structure
/// </summary>
/// <param name="tlv"></param>
public TreeDataSourceAdapter(DataTreeListView tlv)
: base(tlv) {
this.treeListView = tlv;
this.treeListView.CanExpandGetter = delegate(object model) { return this.CalculateHasChildren(model); };
this.treeListView.ChildrenGetter = delegate(object model) { return this.CalculateChildren(model); };
}
#endregion
#region Properties
/// <summary>
/// Gets or sets the name of the property/column that uniquely identifies each row.
/// </summary>
/// <remarks>
/// <para>
/// The value contained by this column must be unique across all rows
/// in the data source. Odd and unpredictable things will happen if two
/// rows have the same id.
/// </para>
/// <para>Null cannot be a valid key value.</para>
/// </remarks>
public virtual string KeyAspectName {
get { return keyAspectName; }
set {
if (keyAspectName == value)
return;
keyAspectName = value;
this.keyMunger = new Munger(this.KeyAspectName);
this.InitializeDataSource();
}
}
private string keyAspectName;
/// <summary>
/// Gets or sets the name of the property/column that contains the key of
/// the parent of a row.
/// </summary>
/// <remarks>
/// <para>
/// The test condition for deciding if one row is the parent of another is functionally
/// equivilent to this:
/// <code>
/// Object.Equals(candidateParentRow[this.KeyAspectName], row[this.ParentKeyAspectName])
/// </code>
/// </para>
/// <para>Unlike key value, parent keys can be null but a null parent key can only be used
/// to identify root objects.</para>
/// </remarks>
public virtual string ParentKeyAspectName {
get { return parentKeyAspectName; }
set {
if (parentKeyAspectName == value)
return;
parentKeyAspectName = value;
this.parentKeyMunger = new Munger(this.ParentKeyAspectName);
this.InitializeDataSource();
}
}
private string parentKeyAspectName;
/// <summary>
/// Gets or sets the value that identifies a row as a root object.
/// When the ParentKey of a row equals the RootKeyValue, that row will
/// be treated as root of the TreeListView.
/// </summary>
/// <remarks>
/// <para>
/// The test condition for deciding a root object is functionally
/// equivilent to this:
/// <code>
/// Object.Equals(candidateRow[this.ParentKeyAspectName], this.RootKeyValue)
/// </code>
/// </para>
/// <para>The RootKeyValue can be null.</para>
/// </remarks>
public virtual object RootKeyValue {
get { return rootKeyValue; }
set {
if (Equals(rootKeyValue, value))
return;
rootKeyValue = value;
this.InitializeDataSource();
}
}
private object rootKeyValue;
/// <summary>
/// Gets or sets whether or not the key columns (id and parent id) should
/// be shown to the user.
/// </summary>
/// <remarks>This must be set before the DataSource is set. It has no effect
/// afterwards.</remarks>
public virtual bool ShowKeyColumns {
get { return showKeyColumns; }
set { showKeyColumns = value; }
}
private bool showKeyColumns = true;
#endregion
#region Implementation properties
/// <summary>
/// Gets the DataTreeListView that is being managed
/// </summary>
protected DataTreeListView TreeListView {
get { return treeListView; }
}
private readonly DataTreeListView treeListView;
#endregion
#region Implementation
/// <summary>
///
/// </summary>
protected override void InitializeDataSource() {
base.InitializeDataSource();
this.TreeListView.RebuildAll(true);
}
/// <summary>
///
/// </summary>
protected override void SetListContents() {
this.TreeListView.Roots = this.CalculateRoots();
}
/// <summary>
///
/// </summary>
/// <param name="property"></param>
/// <returns></returns>
protected override bool ShouldCreateColumn(PropertyDescriptor property) {
// If the property is a key column, and we aren't supposed to show keys, don't show it
if (!this.ShowKeyColumns && (property.Name == this.KeyAspectName || property.Name == this.ParentKeyAspectName))
return false;
return base.ShouldCreateColumn(property);
}
/// <summary>
///
/// </summary>
/// <param name="e"></param>
protected override void HandleListChangedItemChanged(System.ComponentModel.ListChangedEventArgs e) {
// If the id or the parent id of a row changes, we just rebuild everything.
// We can't do anything more specific. We don't know what the previous values, so we can't
// tell the previous parent to refresh itself. If the id itself has changed, things that used
// to be children will no longer be children. Just rebuild everything.
// It seems PropertyDescriptor is only filled in .NET 4 :(
if (e.PropertyDescriptor != null &&
(e.PropertyDescriptor.Name == this.KeyAspectName ||
e.PropertyDescriptor.Name == this.ParentKeyAspectName))
this.InitializeDataSource();
else
base.HandleListChangedItemChanged(e);
}
/// <summary>
///
/// </summary>
/// <param name="index"></param>
protected override void ChangePosition(int index) {
// We can't use our base method directly, since the normal position management
// doesn't know about our tree structure. They treat our dataset as a flat list
// but we have a collapsable structure. This means that the 5'th row to them
// may not even be visible to us
// To display the n'th row, we have to make sure that all its ancestors
// are expanded. Then we will be able to select it.
object model = this.CurrencyManager.List[index];
object parent = this.CalculateParent(model);
while (parent != null && !this.TreeListView.IsExpanded(parent)) {
this.TreeListView.Expand(parent);
parent = this.CalculateParent(parent);
}
base.ChangePosition(index);
}
private IEnumerable CalculateRoots() {
foreach (object x in this.CurrencyManager.List) {
object parentKey = this.GetParentValue(x);
if (Object.Equals(this.RootKeyValue, parentKey))
yield return x;
}
}
private bool CalculateHasChildren(object model) {
object keyValue = this.GetKeyValue(model);
if (keyValue == null)
return false;
foreach (object x in this.CurrencyManager.List) {
object parentKey = this.GetParentValue(x);
if (Object.Equals(keyValue, parentKey))
return true;
}
return false;
}
private IEnumerable CalculateChildren(object model) {
object keyValue = this.GetKeyValue(model);
if (keyValue != null) {
foreach (object x in this.CurrencyManager.List) {
object parentKey = this.GetParentValue(x);
if (Object.Equals(keyValue, parentKey))
yield return x;
}
}
}
private object CalculateParent(object model) {
object parentValue = this.GetParentValue(model);
if (parentValue == null)
return null;
foreach (object x in this.CurrencyManager.List) {
object key = this.GetKeyValue(x);
if (Object.Equals(parentValue, key))
return x;
}
return null;
}
private object GetKeyValue(object model) {
return this.keyMunger == null ? null : this.keyMunger.GetValue(model);
}
private object GetParentValue(object model) {
return this.parentKeyMunger == null ? null : this.parentKeyMunger.GetValue(model);
}
#endregion
private Munger keyMunger;
private Munger parentKeyMunger;
}
}

View File

@@ -0,0 +1,352 @@
/*
* Virtual groups - Classes and interfaces needed to implement virtual groups
*
* Author: Phillip Piper
* Date: 28/08/2009 11:10am
*
* Change log:
* 2011-02-21 JPP - Correctly honor group comparer and collapsible groups settings
* v2.3
* 2009-08-28 JPP - Initial version
*
* To do:
*
* Copyright (C) 2009-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace BrightIdeasSoftware
{
/// <summary>
/// A IVirtualGroups is the interface that a virtual list must implement to support virtual groups
/// </summary>
public interface IVirtualGroups
{
/// <summary>
/// Return the list of groups that should be shown according to the given parameters
/// </summary>
/// <param name="parameters"></param>
/// <returns></returns>
IList<OLVGroup> GetGroups(GroupingParameters parameters);
/// <summary>
/// Return the index of the item that appears at the given position within the given group.
/// </summary>
/// <param name="group"></param>
/// <param name="indexWithinGroup"></param>
/// <returns></returns>
int GetGroupMember(OLVGroup group, int indexWithinGroup);
/// <summary>
/// Return the index of the group to which the given item belongs
/// </summary>
/// <param name="itemIndex"></param>
/// <returns></returns>
int GetGroup(int itemIndex);
/// <summary>
/// Return the index at which the given item is shown in the given group
/// </summary>
/// <param name="group"></param>
/// <param name="itemIndex"></param>
/// <returns></returns>
int GetIndexWithinGroup(OLVGroup group, int itemIndex);
/// <summary>
/// A hint that the given range of items are going to be required
/// </summary>
/// <param name="fromGroupIndex"></param>
/// <param name="fromIndex"></param>
/// <param name="toGroupIndex"></param>
/// <param name="toIndex"></param>
void CacheHint(int fromGroupIndex, int fromIndex, int toGroupIndex, int toIndex);
}
/// <summary>
/// This is a safe, do nothing implementation of a grouping strategy
/// </summary>
public class AbstractVirtualGroups : IVirtualGroups
{
/// <summary>
/// Return the list of groups that should be shown according to the given parameters
/// </summary>
/// <param name="parameters"></param>
/// <returns></returns>
public virtual IList<OLVGroup> GetGroups(GroupingParameters parameters) {
return new List<OLVGroup>();
}
/// <summary>
/// Return the index of the item that appears at the given position within the given group.
/// </summary>
/// <param name="group"></param>
/// <param name="indexWithinGroup"></param>
/// <returns></returns>
public virtual int GetGroupMember(OLVGroup group, int indexWithinGroup) {
return -1;
}
/// <summary>
/// Return the index of the group to which the given item belongs
/// </summary>
/// <param name="itemIndex"></param>
/// <returns></returns>
public virtual int GetGroup(int itemIndex) {
return -1;
}
/// <summary>
/// Return the index at which the given item is shown in the given group
/// </summary>
/// <param name="group"></param>
/// <param name="itemIndex"></param>
/// <returns></returns>
public virtual int GetIndexWithinGroup(OLVGroup group, int itemIndex) {
return -1;
}
/// <summary>
/// A hint that the given range of items are going to be required
/// </summary>
/// <param name="fromGroupIndex"></param>
/// <param name="fromIndex"></param>
/// <param name="toGroupIndex"></param>
/// <param name="toIndex"></param>
public virtual void CacheHint(int fromGroupIndex, int fromIndex, int toGroupIndex, int toIndex) {
}
}
/// <summary>
/// Provides grouping functionality to a FastObjectListView
/// </summary>
public class FastListGroupingStrategy : AbstractVirtualGroups
{
/// <summary>
/// Create groups for FastListView
/// </summary>
/// <param name="parmameters"></param>
/// <returns></returns>
public override IList<OLVGroup> GetGroups(GroupingParameters parmameters) {
// There is a lot of overlap between this method and ObjectListView.MakeGroups()
// Any changes made here may need to be reflected there
// This strategy can only be used on FastObjectListViews
FastObjectListView folv = (FastObjectListView)parmameters.ListView;
// Separate the list view items into groups, using the group key as the descrimanent
int objectCount = 0;
NullableDictionary<object, List<object>> map = new NullableDictionary<object, List<object>>();
foreach (object model in folv.FilteredObjects) {
object key = parmameters.GroupByColumn.GetGroupKey(model);
if (!map.ContainsKey(key))
map[key] = new List<object>();
map[key].Add(model);
objectCount++;
}
// Sort the items within each group
// TODO: Give parameters a ModelComparer property
OLVColumn primarySortColumn = parmameters.SortItemsByPrimaryColumn ? parmameters.ListView.GetColumn(0) : parmameters.PrimarySort;
ModelObjectComparer sorter = new ModelObjectComparer(primarySortColumn, parmameters.PrimarySortOrder,
parmameters.SecondarySort, parmameters.SecondarySortOrder);
foreach (object key in map.Keys) {
map[key].Sort(sorter);
}
// Make a list of the required groups
List<OLVGroup> groups = new List<OLVGroup>();
foreach (object key in map.Keys) {
string title = parmameters.GroupByColumn.ConvertGroupKeyToTitle(key);
if (!String.IsNullOrEmpty(parmameters.TitleFormat)) {
int count = map[key].Count;
string format = (count == 1 ? parmameters.TitleSingularFormat : parmameters.TitleFormat);
try {
title = String.Format(format, title, count);
} catch (FormatException) {
title = "Invalid group format: " + format;
}
}
OLVGroup lvg = new OLVGroup(title);
lvg.Collapsible = folv.HasCollapsibleGroups;
lvg.Key = key;
lvg.SortValue = key as IComparable;
lvg.Contents = map[key].ConvertAll<int>(delegate(object x) { return folv.IndexOf(x); });
lvg.VirtualItemCount = map[key].Count;
if (parmameters.GroupByColumn.GroupFormatter != null)
parmameters.GroupByColumn.GroupFormatter(lvg, parmameters);
groups.Add(lvg);
}
// Sort the groups
if (parmameters.GroupByOrder != SortOrder.None)
groups.Sort(parmameters.GroupComparer ?? new OLVGroupComparer(parmameters.GroupByOrder));
// Build an array that remembers which group each item belongs to.
this.indexToGroupMap = new List<int>(objectCount);
this.indexToGroupMap.AddRange(new int[objectCount]);
for (int i = 0; i < groups.Count; i++) {
OLVGroup group = groups[i];
List<int> members = (List<int>)group.Contents;
foreach (int j in members)
this.indexToGroupMap[j] = i;
}
return groups;
}
private List<int> indexToGroupMap;
/// <summary>
///
/// </summary>
/// <param name="group"></param>
/// <param name="indexWithinGroup"></param>
/// <returns></returns>
public override int GetGroupMember(OLVGroup group, int indexWithinGroup) {
return (int)group.Contents[indexWithinGroup];
}
/// <summary>
///
/// </summary>
/// <param name="itemIndex"></param>
/// <returns></returns>
public override int GetGroup(int itemIndex) {
return this.indexToGroupMap[itemIndex];
}
/// <summary>
///
/// </summary>
/// <param name="group"></param>
/// <param name="itemIndex"></param>
/// <returns></returns>
public override int GetIndexWithinGroup(OLVGroup group, int itemIndex) {
return group.Contents.IndexOf(itemIndex);
}
}
/// <summary>
/// This is the COM interface that a ListView must be given in order for groups in virtual lists to work.
/// </summary>
/// <remarks>
/// This interface is NOT documented by MS. It was found on Greg Chapell's site. This means that there is
/// no guarantee that it will work on future versions of Windows, nor continue to work on current ones.
/// </remarks>
[ComImport(),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("44C09D56-8D3B-419D-A462-7B956B105B47")]
internal interface IOwnerDataCallback
{
/// <summary>
/// Not sure what this does
/// </summary>
/// <param name="i"></param>
/// <param name="pt"></param>
void GetItemPosition(int i, out NativeMethods.POINT pt);
/// <summary>
/// Not sure what this does
/// </summary>
/// <param name="t"></param>
/// <param name="pt"></param>
void SetItemPosition(int t, NativeMethods.POINT pt);
/// <summary>
/// Get the index of the item that occurs at the n'th position of the indicated group.
/// </summary>
/// <param name="groupIndex">Index of the group</param>
/// <param name="n">Index within the group</param>
/// <param name="itemIndex">Index of the item within the whole list</param>
void GetItemInGroup(int groupIndex, int n, out int itemIndex);
/// <summary>
/// Get the index of the group to which the given item belongs
/// </summary>
/// <param name="itemIndex">Index of the item within the whole list</param>
/// <param name="occurrenceCount">Which occurences of the item is wanted</param>
/// <param name="groupIndex">Index of the group</param>
void GetItemGroup(int itemIndex, int occurrenceCount, out int groupIndex);
/// <summary>
/// Get the number of groups that contain the given item
/// </summary>
/// <param name="itemIndex">Index of the item within the whole list</param>
/// <param name="occurrenceCount">How many groups does it occur within</param>
void GetItemGroupCount(int itemIndex, out int occurrenceCount);
/// <summary>
/// A hint to prepare any cache for the given range of requests
/// </summary>
/// <param name="i"></param>
/// <param name="j"></param>
void OnCacheHint(NativeMethods.LVITEMINDEX i, NativeMethods.LVITEMINDEX j);
}
/// <summary>
/// A default implementation of the IOwnerDataCallback interface
/// </summary>
[Guid("6FC61F50-80E8-49b4-B200-3F38D3865ABD")]
internal class OwnerDataCallbackImpl(VirtualObjectListView olv) : IOwnerDataCallback
{
VirtualObjectListView olv = olv;
#region IOwnerDataCallback Members
public void GetItemPosition(int i, out NativeMethods.POINT pt) {
//System.Diagnostics.Debug.WriteLine("GetItemPosition");
throw new NotSupportedException();
}
public void SetItemPosition(int t, NativeMethods.POINT pt) {
//System.Diagnostics.Debug.WriteLine("SetItemPosition");
throw new NotSupportedException();
}
public void GetItemInGroup(int groupIndex, int n, out int itemIndex) {
//System.Diagnostics.Debug.WriteLine(String.Format("-> GetItemInGroup({0}, {1})", groupIndex, n));
itemIndex = this.olv.GroupingStrategy.GetGroupMember(this.olv.OLVGroups[groupIndex], n);
//System.Diagnostics.Debug.WriteLine(String.Format("<- {0}", itemIndex));
}
public void GetItemGroup(int itemIndex, int occurrenceCount, out int groupIndex) {
//System.Diagnostics.Debug.WriteLine(String.Format("GetItemGroup({0}, {1})", itemIndex, occurrenceCount));
groupIndex = this.olv.GroupingStrategy.GetGroup(itemIndex);
//System.Diagnostics.Debug.WriteLine(String.Format("<- {0}", groupIndex));
}
public void GetItemGroupCount(int itemIndex, out int occurrenceCount) {
//System.Diagnostics.Debug.WriteLine(String.Format("GetItemGroupCount({0})", itemIndex));
occurrenceCount = 1;
}
public void OnCacheHint(NativeMethods.LVITEMINDEX from, NativeMethods.LVITEMINDEX to) {
//System.Diagnostics.Debug.WriteLine(String.Format("OnCacheHint({0}, {1}, {2}, {3})", from.iGroup, from.iItem, to.iGroup, to.iItem));
this.olv.GroupingStrategy.CacheHint(from.iGroup, from.iItem, to.iGroup, to.iItem);
}
#endregion
}
}

View File

@@ -0,0 +1,343 @@
/*
* VirtualListDataSource - Encapsulate how data is provided to a virtual list
*
* Author: Phillip Piper
* Date: 28/08/2009 11:10am
*
* Change log:
* v2.4
* 2010-04-01 JPP - Added IFilterableDataSource
* v2.3
* 2009-08-28 JPP - Initial version (Separated from VirtualObjectListView.cs)
*
* To do:
*
* Copyright (C) 2009-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// A VirtualListDataSource is a complete manner to provide functionality to a virtual list.
/// An object that implements this interface provides a VirtualObjectListView with all the
/// information it needs to be fully functional.
/// </summary>
/// <remarks>Implementors must provide functioning implementations of at least GetObjectCount()
/// and GetNthObject(), otherwise nothing will appear in the list.</remarks>
public interface IVirtualListDataSource
{
/// <summary>
/// Return the object that should be displayed at the n'th row.
/// </summary>
/// <param name="n">The index of the row whose object is to be returned.</param>
/// <returns>The model object at the n'th row, or null if the fetching was unsuccessful.</returns>
Object GetNthObject(int n);
/// <summary>
/// Return the number of rows that should be visible in the virtual list
/// </summary>
/// <returns>The number of rows the list view should have.</returns>
int GetObjectCount();
/// <summary>
/// Get the index of the row that is showing the given model object
/// </summary>
/// <param name="model">The model object sought</param>
/// <returns>The index of the row showing the model, or -1 if the object could not be found.</returns>
int GetObjectIndex(Object model);
/// <summary>
/// The ListView is about to request the given range of items. Do
/// whatever caching seems appropriate.
/// </summary>
/// <param name="first"></param>
/// <param name="last"></param>
void PrepareCache(int first, int last);
/// <summary>
/// Find the first row that "matches" the given text in the given range.
/// </summary>
/// <param name="value">The text typed by the user</param>
/// <param name="first">Start searching from this index. This may be greater than the 'to' parameter,
/// in which case the search should descend</param>
/// <param name="last">Do not search beyond this index. This may be less than the 'from' parameter.</param>
/// <param name="column">The column that should be considered when looking for a match.</param>
/// <returns>Return the index of row that was matched, or -1 if no match was found</returns>
int SearchText(string value, int first, int last, OLVColumn column);
/// <summary>
/// Sort the model objects in the data source.
/// </summary>
/// <param name="column"></param>
/// <param name="order"></param>
void Sort(OLVColumn column, SortOrder order);
//-----------------------------------------------------------------------------------
// Modification commands
// THINK: Should we split these four into a separate interface?
/// <summary>
/// Add the given collection of model objects to this control.
/// </summary>
/// <param name="modelObjects">A collection of model objects</param>
void AddObjects(ICollection modelObjects);
/// <summary>
/// Insert the given collection of model objects to this control at the position
/// </summary>
/// <param name="index">Index where the collection will be added</param>
/// <param name="modelObjects">A collection of model objects</param>
void InsertObjects(int index, ICollection modelObjects);
/// <summary>
/// Remove all of the given objects from the control
/// </summary>
/// <param name="modelObjects">Collection of objects to be removed</param>
void RemoveObjects(ICollection modelObjects);
/// <summary>
/// Set the collection of objects that this control will show.
/// </summary>
/// <param name="collection"></param>
void SetObjects(IEnumerable collection);
/// <summary>
/// Update/replace the nth object with the given object
/// </summary>
/// <param name="index"></param>
/// <param name="modelObject"></param>
void UpdateObject(int index, object modelObject);
}
/// <summary>
/// This extension allow virtual lists to filter their contents
/// </summary>
public interface IFilterableDataSource
{
/// <summary>
/// All subsequent retrievals on this data source should be filtered
/// through the given filters. null means no filtering of that kind.
/// </summary>
/// <param name="modelFilter"></param>
/// <param name="listFilter"></param>
void ApplyFilters(IModelFilter modelFilter, IListFilter listFilter);
}
/// <summary>
/// A do-nothing implementation of the VirtualListDataSource interface.
/// </summary>
/// <remarks>
/// Creates an AbstractVirtualListDataSource
/// </remarks>
/// <param name="listView"></param>
public class AbstractVirtualListDataSource(VirtualObjectListView listView) : IVirtualListDataSource, IFilterableDataSource
{
/// <summary>
/// The list view that this data source is giving information to.
/// </summary>
protected VirtualObjectListView listView = listView;
/// <summary>
///
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public virtual object GetNthObject(int n) {
return null;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public virtual int GetObjectCount() {
return -1;
}
/// <summary>
///
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public virtual int GetObjectIndex(object model) {
return -1;
}
/// <summary>
///
/// </summary>
/// <param name="from"></param>
/// <param name="to"></param>
public virtual void PrepareCache(int from, int to) {
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <param name="first"></param>
/// <param name="last"></param>
/// <param name="column"></param>
/// <returns></returns>
public virtual int SearchText(string value, int first, int last, OLVColumn column) {
return -1;
}
/// <summary>
///
/// </summary>
/// <param name="column"></param>
/// <param name="order"></param>
public virtual void Sort(OLVColumn column, SortOrder order) {
}
/// <summary>
///
/// </summary>
/// <param name="modelObjects"></param>
public virtual void AddObjects(ICollection modelObjects) {
}
/// <summary>
///
/// </summary>
/// <param name="index"></param>
/// <param name="modelObjects"></param>
public virtual void InsertObjects(int index, ICollection modelObjects) {
}
/// <summary>
///
/// </summary>
/// <param name="modelObjects"></param>
public virtual void RemoveObjects(ICollection modelObjects) {
}
/// <summary>
///
/// </summary>
/// <param name="collection"></param>
public virtual void SetObjects(IEnumerable collection) {
}
/// <summary>
/// Update/replace the nth object with the given object
/// </summary>
/// <param name="index"></param>
/// <param name="modelObject"></param>
public virtual void UpdateObject(int index, object modelObject) {
}
/// <summary>
/// This is a useful default implementation of SearchText method, intended to be called
/// by implementors of IVirtualListDataSource.
/// </summary>
/// <param name="value"></param>
/// <param name="first"></param>
/// <param name="last"></param>
/// <param name="column"></param>
/// <param name="source"></param>
/// <returns></returns>
static public int DefaultSearchText(string value, int first, int last, OLVColumn column, IVirtualListDataSource source) {
if (first <= last) {
for (int i = first; i <= last; i++) {
string data = column.GetStringValue(source.GetNthObject(i));
if (data.StartsWith(value, StringComparison.CurrentCultureIgnoreCase))
return i;
}
} else {
for (int i = first; i >= last; i--) {
string data = column.GetStringValue(source.GetNthObject(i));
if (data.StartsWith(value, StringComparison.CurrentCultureIgnoreCase))
return i;
}
}
return -1;
}
#region IFilterableDataSource Members
/// <summary>
///
/// </summary>
/// <param name="modelFilter"></param>
/// <param name="listFilter"></param>
virtual public void ApplyFilters(IModelFilter modelFilter, IListFilter listFilter) {
}
#endregion
}
/// <summary>
/// This class mimics the behavior of VirtualObjectListView v1.x.
/// </summary>
/// <remarks>
/// Creates a VirtualListVersion1DataSource
/// </remarks>
/// <param name="listView"></param>
public class VirtualListVersion1DataSource(VirtualObjectListView listView) : AbstractVirtualListDataSource(listView)
{
#region Public properties
/// <summary>
/// How will the n'th object of the data source be fetched?
/// </summary>
public RowGetterDelegate RowGetter {
get { return rowGetter; }
set { rowGetter = value; }
}
private RowGetterDelegate rowGetter;
#endregion
#region IVirtualListDataSource implementation
/// <summary>
///
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public override object GetNthObject(int n) {
if (this.RowGetter == null)
return null;
else
return this.RowGetter(n);
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <param name="first"></param>
/// <param name="last"></param>
/// <param name="column"></param>
/// <returns></returns>
public override int SearchText(string value, int first, int last, OLVColumn column) {
return DefaultSearchText(value, first, last, column, this);
}
#endregion
}
}

1911
ObjectListView/OLVColumn.cs Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,536 @@
/*
* DesignSupport - Design time support for the various classes within ObjectListView
*
* Author: Phillip Piper
* Date: 12/08/2009 8:36 PM
*
* Change log:
* 2012-08-27 JPP - Fall back to more specific type name for the ListViewDesigner if
* the first GetType() fails.
* v2.5.1
* 2012-04-26 JPP - Filter group events from TreeListView since it can't have groups
* 2011-06-06 JPP - Vastly improved ObjectListViewDesigner, based off information in
* "'Inheriting' from an Internal WinForms Designer" on CodeProject.
* v2.3
* 2009-08-12 JPP - Initial version
*
* To do:
*
* Copyright (C) 2009-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace BrightIdeasSoftware.Design
{
/// <summary>
/// Designer for <see cref="ObjectListView"/> and its subclasses.
/// </summary>
/// <remarks>
/// <para>
/// This designer removes properties and events that are available on ListView but that are not
/// useful on ObjectListView.
/// </para>
/// <para>
/// We can't inherit from System.Windows.Forms.Design.ListViewDesigner, since it is marked internal.
/// So, this class uses reflection to create a ListViewDesigner and then forwards messages to that designer.
/// </para>
/// </remarks>
public class ObjectListViewDesigner : ControlDesigner
{
#region Initialize & Dispose
/// <summary>
/// Initializes the designer with the specified component.
/// </summary>
/// <param name="component">The <see cref="T:System.ComponentModel.IComponent"/> to associate the designer with. This component must always be an instance of, or derive from, <see cref="T:System.Windows.Forms.Control"/>. </param>
public override void Initialize(IComponent component) {
// Debug.WriteLine("ObjectListViewDesigner.Initialize");
// Use reflection to bypass the "internal" marker on ListViewDesigner
// If we can't get the unversioned designer, look specifically for .NET 4.0 version of it.
Type tListViewDesigner = Type.GetType("System.Windows.Forms.Design.ListViewDesigner, System.Design") ??
Type.GetType("System.Windows.Forms.Design.ListViewDesigner, System.Design, " +
"Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
if (tListViewDesigner == null) throw new ArgumentException("Could not load ListViewDesigner");
this.listViewDesigner = (ControlDesigner)Activator.CreateInstance(tListViewDesigner, BindingFlags.Instance | BindingFlags.Public, null, null, null);
this.designerFilter = this.listViewDesigner;
// Fetch the methods from the ListViewDesigner that we know we want to use
this.listViewDesignGetHitTest = tListViewDesigner.GetMethod("GetHitTest", BindingFlags.Instance | BindingFlags.NonPublic);
this.listViewDesignWndProc = tListViewDesigner.GetMethod("WndProc", BindingFlags.Instance | BindingFlags.NonPublic);
Debug.Assert(this.listViewDesignGetHitTest != null, "Required method (GetHitTest) not found on ListViewDesigner");
Debug.Assert(this.listViewDesignWndProc != null, "Required method (WndProc) not found on ListViewDesigner");
// Tell the Designer to use properties of default designer as well as the properties of this class (do before base.Initialize)
TypeDescriptor.CreateAssociation(component, this.listViewDesigner);
IServiceContainer site = (IServiceContainer)component.Site;
if (site != null && GetService(typeof(DesignerCommandSet)) == null) {
site.AddService(typeof(DesignerCommandSet), new CDDesignerCommandSet(this));
} else {
Debug.Fail("site != null && GetService(typeof (DesignerCommandSet)) == null");
}
this.listViewDesigner.Initialize(component);
base.Initialize(component);
RemoveDuplicateDockingActionList();
}
/// <summary>
/// Initializes a newly created component.
/// </summary>
/// <param name="defaultValues">A name/value dictionary of default values to apply to properties. May be null if no default values are specified.</param>
public override void InitializeNewComponent(IDictionary defaultValues) {
// Debug.WriteLine("ObjectListViewDesigner.InitializeNewComponent");
base.InitializeNewComponent(defaultValues);
this.listViewDesigner.InitializeNewComponent(defaultValues);
}
/// <summary>
/// Releases the unmanaged resources used by the <see cref="T:System.Windows.Forms.Design.ControlDesigner"/> and optionally releases the managed resources.
/// </summary>
/// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources. </param>
protected override void Dispose(bool disposing) {
// Debug.WriteLine("ObjectListViewDesigner.Dispose");
if (disposing) {
if (this.listViewDesigner != null) {
this.listViewDesigner.Dispose();
// Normally we would now null out the designer, but this designer
// still has methods called AFTER it is disposed.
}
}
base.Dispose(disposing);
}
/// <summary>
/// Removes the duplicate DockingActionList added by this designer to the <see cref="DesignerActionService"/>.
/// </summary>
/// <remarks>
/// <see cref="ControlDesigner.Initialize"/> adds an internal DockingActionList : 'Dock/Undock in Parent Container'.
/// But the default designer has already added that action list. So we need to remove one.
/// </remarks>
private void RemoveDuplicateDockingActionList() {
// This is a true hack -- in a class that is basically a huge hack itself.
// Reach into the bowel of our base class, get a private field, and use that fields value to
// remove an action from the designer.
// In ControlDesigner, there is "private DockingActionList dockingAction;"
// Don't you just love Reflector?!
FieldInfo fi = typeof(ControlDesigner).GetField("dockingAction", BindingFlags.Instance | BindingFlags.NonPublic);
if (fi != null) {
DesignerActionList dockingAction = (DesignerActionList)fi.GetValue(this);
if (dockingAction != null) {
DesignerActionService service = (DesignerActionService)GetService(typeof(DesignerActionService));
if (service != null) {
service.Remove(this.Control, dockingAction);
}
}
}
}
#endregion
#region IDesignerFilter overrides
/// <summary>
/// Adjusts the set of properties the component exposes through a <see cref="T:System.ComponentModel.TypeDescriptor"/>.
/// </summary>
/// <param name="properties">An <see cref="T:System.Collections.IDictionary"/> containing the properties for the class of the component. </param>
protected override void PreFilterProperties(IDictionary properties) {
// Debug.WriteLine("ObjectListViewDesigner.PreFilterProperties");
// Always call the base PreFilterProperties implementation
// before you modify the properties collection.
base.PreFilterProperties(properties);
// Give the listviewdesigner a chance to filter the properties
// (though we already know it's not going to do anything)
this.designerFilter.PreFilterProperties(properties);
// I'd like to just remove the redundant properties, but that would
// break backward compatibility. The deserialiser that handles the XXX.Designer.cs file
// works off the designer, so even if the property exists in the class, the deserialiser will
// throw an error if the associated designer actually removes that property.
// So we shadow the unwanted properties, and give the replacement properties
// non-browsable attributes so that they are hidden from the user
List<string> unwantedProperties = new List<string>(new string[] {
"BackgroundImage", "BackgroundImageTiled", "HotTracking", "HoverSelection",
"LabelEdit", "VirtualListSize", "VirtualMode" });
// Also hid Tooltip properties, since giving a tooltip to the control through the IDE
// messes up the tooltip handling
foreach (string propertyName in properties.Keys) {
if (propertyName.StartsWith("ToolTip")) {
unwantedProperties.Add(propertyName);
}
}
// If we are looking at a TreeListView, remove group related properties
// since TreeListViews can't show groups
if (this.Control is TreeListView) {
unwantedProperties.AddRange(new string[] {
"GroupImageList", "GroupWithItemCountFormat", "GroupWithItemCountSingularFormat", "HasCollapsibleGroups",
"SpaceBetweenGroups", "ShowGroups", "SortGroupItemsByPrimaryColumn", "ShowItemCountOnGroups"
});
}
// Shadow the unwanted properties, and give the replacement properties
// non-browsable attributes so that they are hidden from the user
foreach (string unwantedProperty in unwantedProperties) {
PropertyDescriptor propertyDesc = TypeDescriptor.CreateProperty(
typeof(ObjectListView),
(PropertyDescriptor)properties[unwantedProperty],
new BrowsableAttribute(false));
properties[unwantedProperty] = propertyDesc;
}
}
/// <summary>
/// Allows a designer to add to the set of events that it exposes through a <see cref="T:System.ComponentModel.TypeDescriptor"/>.
/// </summary>
/// <param name="events">The events for the class of the component. </param>
protected override void PreFilterEvents(IDictionary events) {
// Debug.WriteLine("ObjectListViewDesigner.PreFilterEvents");
base.PreFilterEvents(events);
this.designerFilter.PreFilterEvents(events);
// Remove the events that don't make sense for an ObjectListView.
// See PreFilterProperties() for why we do this dance rather than just remove the event.
List<string> unwanted = new List<string>(new string[] {
"AfterLabelEdit",
"BeforeLabelEdit",
"DrawColumnHeader",
"DrawItem",
"DrawSubItem",
"RetrieveVirtualItem",
"SearchForVirtualItem",
"VirtualItemsSelectionRangeChanged"
});
// If we are looking at a TreeListView, remove group related events
// since TreeListViews can't show groups
if (this.Control is TreeListView) {
unwanted.AddRange(new string[] {
"AboutToCreateGroups",
"AfterCreatingGroups",
"BeforeCreatingGroups",
"GroupTaskClicked",
"GroupExpandingCollapsing",
"GroupStateChanged"
});
}
foreach (string unwantedEvent in unwanted) {
EventDescriptor eventDesc = TypeDescriptor.CreateEvent(
typeof(ObjectListView),
(EventDescriptor)events[unwantedEvent],
new BrowsableAttribute(false));
events[unwantedEvent] = eventDesc;
}
}
/// <summary>
/// Allows a designer to change or remove items from the set of attributes that it exposes through a <see cref="T:System.ComponentModel.TypeDescriptor"/>.
/// </summary>
/// <param name="attributes">The attributes for the class of the component. </param>
protected override void PostFilterAttributes(IDictionary attributes) {
// Debug.WriteLine("ObjectListViewDesigner.PostFilterAttributes");
this.designerFilter.PostFilterAttributes(attributes);
base.PostFilterAttributes(attributes);
}
/// <summary>
/// Allows a designer to change or remove items from the set of events that it exposes through a <see cref="T:System.ComponentModel.TypeDescriptor"/>.
/// </summary>
/// <param name="events">The events for the class of the component. </param>
protected override void PostFilterEvents(IDictionary events) {
// Debug.WriteLine("ObjectListViewDesigner.PostFilterEvents");
this.designerFilter.PostFilterEvents(events);
base.PostFilterEvents(events);
}
#endregion
#region Overrides
/// <summary>
/// Gets the design-time action lists supported by the component associated with the designer.
/// </summary>
/// <returns>
/// The design-time action lists supported by the component associated with the designer.
/// </returns>
public override DesignerActionListCollection ActionLists {
get {
// We want to change the first action list so it only has the commands we want
DesignerActionListCollection actionLists = this.listViewDesigner.ActionLists;
if (actionLists.Count > 0 && !(actionLists[0] is ListViewActionListAdapter)) {
actionLists[0] = new ListViewActionListAdapter(this, actionLists[0]);
}
return actionLists;
}
}
/// <summary>
/// Gets the collection of components associated with the component managed by the designer.
/// </summary>
/// <returns>
/// The components that are associated with the component managed by the designer.
/// </returns>
public override ICollection AssociatedComponents {
get {
ArrayList components = new ArrayList(base.AssociatedComponents);
components.AddRange(this.listViewDesigner.AssociatedComponents);
return components;
}
}
/// <summary>
/// Indicates whether a mouse click at the specified point should be handled by the control.
/// </summary>
/// <returns>
/// true if a click at the specified point is to be handled by the control; otherwise, false.
/// </returns>
/// <param name="point">A <see cref="T:System.Drawing.Point"/> indicating the position at which the mouse was clicked, in screen coordinates. </param>
protected override bool GetHitTest(Point point) {
// The ListViewDesigner wants to allow column dividers to be resized
return (bool)this.listViewDesignGetHitTest.Invoke(listViewDesigner, new object[] { point });
}
/// <summary>
/// Processes Windows messages and optionally routes them to the control.
/// </summary>
/// <param name="m">The <see cref="T:System.Windows.Forms.Message"/> to process. </param>
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x4e:
case 0x204e:
// The listview designer is interested in HDN_ENDTRACK notifications
this.listViewDesignWndProc.Invoke(listViewDesigner, new object[] { m });
break;
default:
base.WndProc(ref m);
break;
}
}
#endregion
#region Implementation variables
private ControlDesigner listViewDesigner;
private IDesignerFilter designerFilter;
private MethodInfo listViewDesignGetHitTest;
private MethodInfo listViewDesignWndProc;
#endregion
#region Custom action list
/// <summary>
/// This class modifies a ListViewActionList, by removing the "Edit Items" and "Edit Groups" actions.
/// </summary>
/// <remarks>
/// <para>
/// That class is internal, so we cannot simply subclass it, which would be simplier.
/// </para>
/// <para>
/// Action lists use reflection to determine if that action can be executed, so we not
/// only have to modify the returned collection of actions, but we have to implement
/// the properties and commands that the returned actions use. </para>
/// </remarks>
private class ListViewActionListAdapter(ObjectListViewDesigner designer, DesignerActionList wrappedList) : DesignerActionList(wrappedList.Component)
{
public override DesignerActionItemCollection GetSortedActionItems() {
DesignerActionItemCollection items = wrappedList.GetSortedActionItems();
items.RemoveAt(2); // remove Edit Groups
items.RemoveAt(0); // remove Edit Items
return items;
}
private void EditValue(ComponentDesigner componentDesigner, IComponent iComponent, string propertyName) {
// One more complication. The ListViewActionList classes uses an internal class, EditorServiceContext, to
// edit the items/columns/groups collections. So, we use reflection to bypass the data hiding.
Type tEditorServiceContext = Type.GetType("System.Windows.Forms.Design.EditorServiceContext, System.Design");
tEditorServiceContext.InvokeMember("EditValue", BindingFlags.InvokeMethod | BindingFlags.Static, null, null, new object[] { componentDesigner, iComponent, propertyName });
}
private void SetValue(object target, string propertyName, object value) {
TypeDescriptor.GetProperties(target)[propertyName].SetValue(target, value);
}
public void InvokeColumnsDialog() {
EditValue(this.designer, base.Component, "Columns");
}
// Don't need these since we removed their corresponding actions from the list.
// Keep the methods just in case.
//public void InvokeGroupsDialog() {
// EditValue(this.designer, base.Component, "Groups");
//}
//public void InvokeItemsDialog() {
// EditValue(this.designer, base.Component, "Items");
//}
public ImageList LargeImageList {
get { return ((ListView)base.Component).LargeImageList; }
set { SetValue(base.Component, "LargeImageList", value); }
}
public ImageList SmallImageList {
get { return ((ListView)base.Component).SmallImageList; }
set { SetValue(base.Component, "SmallImageList", value); }
}
public View View {
get { return ((ListView)base.Component).View; }
set { SetValue(base.Component, "View", value); }
}
ObjectListViewDesigner designer = designer;
DesignerActionList wrappedList = wrappedList;
}
#endregion
#region DesignerCommandSet
private class CDDesignerCommandSet(ComponentDesigner componentDesigner) : DesignerCommandSet
{
public override ICollection GetCommands(string name) {
// Debug.WriteLine("CDDesignerCommandSet.GetCommands:" + name);
if (componentDesigner != null) {
if (name.Equals("Verbs")) {
return componentDesigner.Verbs;
}
if (name.Equals("ActionLists")) {
return componentDesigner.ActionLists;
}
}
return base.GetCommands(name);
}
private readonly ComponentDesigner componentDesigner = componentDesigner;
}
#endregion
}
/// <summary>
/// This class works in conjunction with the OLVColumns property to allow OLVColumns
/// to be added to the ObjectListView.
/// </summary>
/// <remarks>
/// Create a OLVColumnCollectionEditor
/// </remarks>
/// <param name="t"></param>
public class OLVColumnCollectionEditor(Type t) : System.ComponentModel.Design.CollectionEditor(t)
{
/// <summary>
/// What type of object does this editor create?
/// </summary>
/// <returns></returns>
protected override Type CreateCollectionItemType() {
return typeof(OLVColumn);
}
/// <summary>
/// Edit a given value
/// </summary>
/// <param name="context"></param>
/// <param name="provider"></param>
/// <param name="value"></param>
/// <returns></returns>
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
if (context == null)
throw new ArgumentNullException("context");
if (provider == null)
throw new ArgumentNullException("provider");
// Figure out which ObjectListView we are working on. This should be the Instance of the context.
ObjectListView olv = context.Instance as ObjectListView;
Debug.Assert(olv != null, "Instance must be an ObjectListView");
// Edit all the columns, not just the ones that are visible
base.EditValue(context, provider, olv.AllColumns);
// Set the columns on the ListView to just the visible columns
List<OLVColumn> newColumns = olv.GetFilteredColumns(View.Details);
olv.Columns.Clear();
olv.Columns.AddRange(newColumns.ToArray());
return olv.Columns;
}
/// <summary>
/// What text should be shown in the list for the given object?
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
protected override string GetDisplayText(object value) {
OLVColumn col = value as OLVColumn;
if (col == null || String.IsNullOrEmpty(col.AspectName))
return base.GetDisplayText(value);
return String.Format("{0} ({1})", base.GetDisplayText(value), col.AspectName);
}
}
/// <summary>
/// Control how the overlay is presented in the IDE
/// </summary>
internal class OverlayConverter : ExpandableObjectConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
return destinationType == typeof(string) || base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(string)) {
ImageOverlay imageOverlay = value as ImageOverlay;
if (imageOverlay != null) {
return imageOverlay.Image == null ? "(none)" : "(set)";
}
TextOverlay textOverlay = value as TextOverlay;
if (textOverlay != null) {
return String.IsNullOrEmpty(textOverlay.Text) ? "(none)" : "(set)";
}
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
}

View File

@@ -0,0 +1,42 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows10.0.26100.0</TargetFramework>
<Deterministic>false</Deterministic>
<RootNamespace>BrightIdeasSoftware</RootNamespace>
<AssemblyName>ObjectListView</AssemblyName>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
<NoWarn>$(NoWarn);WFO1000</NoWarn>
<EnableWinFormsAnalyzers>false</EnableWinFormsAnalyzers>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)' == 'x64'">
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)' == 'ARM64'">
<PlatformTarget>ARM64</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Content Include="CustomDictionary.xml" Link="CustomDictionary.xml" />
<Content Include="Resources\clear-filter.png" Link="Resources\clear-filter.png" />
<Content Include="Resources\coffee.jpg" Link="Resources\coffee.jpg" />
<Content Include="Resources\filter-icons3.png" Link="Resources\filter-icons3.png" />
<Content Include="Resources\filter.png" Link="Resources\filter.png" />
<Content Include="Resources\sort-ascending.png" Link="Resources\sort-ascending.png" />
<Content Include="Resources\sort-descending.png" Link="Resources\sort-descending.png" />
</ItemGroup>
<ItemGroup>
<Folder Include="CellEditing\" />
<Folder Include="DragDrop\" />
<Folder Include="Filtering\" />
<Folder Include="Implementation\" />
<Folder Include="Utilities\" />
<Folder Include="SubControls\" />
<Folder Include="Resources\" />
<Folder Include="Rendering\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Drawing.Common" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" />
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/01/nuspec.xsd">
<metadata minClientVersion="2.12">
<id>ObjectListView.Updated</id>
<title>ObjectListView (Updated)</title>
<version>$version$</version>
<authors>Phillip Piper</authors>
<owners>$author$</owners>
<license type="file">LICENSE</license>
<icon>.editoricon.png</icon>
<projectUrl>https://github.com/ennerperez/ObjectListView</projectUrl>
<description>
ObjectListView is a .NET ListView wired on caffeine, guarana and steroids.
More calmly, it is a C# wrapper around a .NET ListView, which makes the ListView much easier to use and teaches it lots of neat new tricks.
</description>
<summary>$description$</summary>
<copyright>$copyright$</copyright>
<tags>.Net WinForms ListView Controls</tags>
<repository type="git" url="https://github.com/ennerperez/ObjectListView" />
<dependencies>
<group targetFramework=".NETFramework4.0" />
<group targetFramework=".NETStandard2.0">
<dependency id="System.Drawing.Common" version="4.7.0" />
</group>
</dependencies>
</metadata>
<files>
<file src="..\.editoricon.png" target=".editoricon.png" />
<file src="..\..\README.md" target="README.md" />
<file src="..\..\CHANGELOG.md" target="CHANGELOG.md" />
<file src="..\..\LICENSE" target="LICENSE" />
<!-- NETFX -->
<file src="..\ObjectListView\bin\release\ObjectListView.dll" target="lib\net40\ObjectListView.dll" />
<!-- NETCORE -->
<file src="..\ObjectListView.NetCore\bin\release\netcoreapp3.1\ObjectListView.dll" target="lib\netstandard2.0\ObjectListView.dll" />
</files>
</package>

View File

@@ -0,0 +1,22 @@
using System.Reflection;
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("ObjectListView")]
[assembly: AssemblyDescription("A much easier to use ListView and friends")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Bright Ideas Software")]
[assembly: AssemblyProduct("ObjectListView")]
[assembly: AssemblyCopyright("Copyright © 2006-2020")]
[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("ef28c7a8-77ae-442d-abc3-bb023fa31e57")]

View File

@@ -0,0 +1,113 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18444
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BrightIdeasSoftware.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BrightIdeasSoftware.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ClearFiltering {
get {
object obj = ResourceManager.GetObject("ClearFiltering", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ColumnFilterIndicator {
get {
object obj = ResourceManager.GetObject("ColumnFilterIndicator", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Filtering {
get {
object obj = ResourceManager.GetObject("Filtering", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SortAscending {
get {
object obj = ResourceManager.GetObject("SortAscending", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SortDescending {
get {
object obj = ResourceManager.GetObject("SortDescending", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More