├── EasyJob.sln
├── EasyJob
├── App.xaml
├── App.xaml.cs
├── AssemblyInfo.cs
├── Documentation
│ ├── HelpDocumentation.xml
│ └── Videos
│ │ ├── HelpAddActionButtonArguments.mp4
│ │ ├── HelpAddActionButtonDescription.mp4
│ │ ├── HelpAddActionButtonScript.mp4
│ │ ├── HelpAddActionButtonScriptPathType.mp4
│ │ ├── HelpAddActionButtonScriptType.mp4
│ │ ├── HelpAddActionButtonText.mp4
│ │ ├── HelpConfigurationBlockButtonsAdd.mp4
│ │ ├── HelpConfigurationBlockButtonsCopy.mp4
│ │ ├── HelpConfigurationBlockButtonsEdit.mp4
│ │ ├── HelpConfigurationBlockButtonsPaste.mp4
│ │ ├── HelpConfigurationBlockButtonsRemove.mp4
│ │ ├── HelpConfigurationBlockButtonsReorder.mp4
│ │ ├── HelpConfigurationBlockTabsAdd.mp4
│ │ ├── HelpConfigurationBlockTabsRemove.mp4
│ │ ├── HelpConfigurationBlockTabsRename.mp4
│ │ ├── HelpConfigurationClearEventsWhenReload.mp4
│ │ ├── HelpConfigurationConsoleBackground.mp4
│ │ ├── HelpConfigurationConsoleForeground.mp4
│ │ ├── HelpConfigurationConsoleIgnoreColorTags.mp4
│ │ ├── HelpConfigurationDefaultCMDPath.mp4
│ │ ├── HelpConfigurationDefaultPowershellPath.mp4
│ │ ├── HelpConfigurationHideAbout.mp4
│ │ ├── HelpConfigurationHideClearEventsList.mp4
│ │ ├── HelpConfigurationHideColorTags.mp4
│ │ ├── HelpConfigurationHideFileOpenAppFolder.mp4
│ │ ├── HelpConfigurationHideFileReloadConfig.mp4
│ │ ├── HelpConfigurationHideHelp.mp4
│ │ ├── HelpConfigurationHideSettings.mp4
│ │ ├── HelpConfigurationHideSettingsConfiguration.mp4
│ │ ├── HelpConfigurationHideSettingsWorkflow.mp4
│ │ ├── HelpConfigurationHideSettingsWorkflowAddButtonToCurrentTab.mp4
│ │ ├── HelpConfigurationHideSettingsWorkflowAddTab.mp4
│ │ ├── HelpConfigurationHideSettingsWorkflowRemoveCurrentTab.mp4
│ │ ├── HelpConfigurationHideSettingsWorkflowRenameCurrentTab.mp4
│ │ ├── HelpConfigurationHideSettingsWorkflowReorderButtonsInCurrentTab.mp4
│ │ ├── HelpConfigurationHideSettingsWorkflowReorderTabs.mp4
│ │ ├── HelpConfigurationHideTroubleshooting.mp4
│ │ └── HelpConfigurationPowerShellArguments.mp4
├── EasyJob.csproj
├── EasyJob.csproj.user
├── EasyJobPS
│ ├── EasyJobPS.psd1
│ └── EasyJobPS.psm1
├── Images
│ ├── ColorTags
│ │ ├── tag01.png
│ │ ├── tag02.png
│ │ ├── tag03.png
│ │ ├── tag04.png
│ │ ├── tag05.png
│ │ ├── tag06.png
│ │ ├── tag07.png
│ │ ├── tag08.png
│ │ ├── tag09.png
│ │ ├── tag10.png
│ │ ├── tag11.png
│ │ ├── tag12.png
│ │ ├── tag13.png
│ │ └── tag14.png
│ ├── about.png
│ ├── add.png
│ ├── addbutton.png
│ ├── addtab.png
│ ├── clear.png
│ ├── close.png
│ ├── colortags.png
│ ├── configuration.png
│ ├── convert.png
│ ├── copy.png
│ ├── down.png
│ ├── editbutton.png
│ ├── exit.png
│ ├── find.png
│ ├── folder.png
│ ├── github.png
│ ├── help.png
│ ├── icon.ico
│ ├── paste.png
│ ├── play.png
│ ├── reload.png
│ ├── removebutton.png
│ ├── removetab.png
│ ├── renametab.png
│ ├── reorderbuttons.png
│ ├── reordertabs.png
│ ├── stop.png
│ ├── troubleshoot.png
│ ├── up.png
│ └── workflow.png
├── LICENSE.txt
├── MainWindow.xaml
├── MainWindow.xaml.cs
├── Serialization
│ ├── AnswerDialog
│ │ ├── Answer.cs
│ │ └── AnswerData.cs
│ ├── Config
│ │ ├── Config.cs
│ │ ├── ConfigArgument.cs
│ │ ├── ConfigButton.cs
│ │ ├── ConfigRestrictions.cs
│ │ └── ConfigTab.cs
│ ├── TabItems
│ │ ├── ActionButton.cs
│ │ └── TabData.cs
│ └── TasksList
│ │ └── TaskListTask.cs
├── Utils
│ ├── CommonUtils.cs
│ ├── ConfigUtils.cs
│ └── ScrollViewerExtensions.cs
├── Windows
│ ├── AboutDialog.xaml
│ ├── AboutDialog.xaml.cs
│ ├── AddActionButtonDialog.xaml
│ ├── AddActionButtonDialog.xaml.cs
│ ├── AnswerDialog.xaml
│ ├── AnswerDialog.xaml.cs
│ ├── ColorTagsDialog.xaml
│ ├── ColorTagsDialog.xaml.cs
│ ├── ConfigurationDialog.xaml
│ ├── ConfigurationDialog.xaml.cs
│ ├── EditActionButtonDialog.xaml
│ ├── EditActionButtonDialog.xaml.cs
│ ├── HelpDialog.xaml
│ ├── HelpDialog.xaml.cs
│ ├── NewTabDialog.xaml
│ ├── NewTabDialog.xaml.cs
│ ├── RenameTabDialog.xaml
│ ├── RenameTabDialog.xaml.cs
│ ├── ReorderActionButtonsDialog.xaml
│ ├── ReorderActionButtonsDialog.xaml.cs
│ ├── ReorderTabsDialog.xaml
│ ├── ReorderTabsDialog.xaml.cs
│ ├── TroubleshootingWindow.xaml
│ └── TroubleshootingWindow.xaml.cs
└── config.json
├── EasyJobPSTools
├── EasyJobPSTools.csproj
├── EasyJobPSTools.psd1
├── EasyJobPSTools.psm1
├── EasyJobPSTools.sln
├── Program.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── Utils
│ └── CommonUtils.cs
├── Windows
│ ├── ShowEJInputBox.xaml
│ └── ShowEJInputBox.xaml.cs
└── app.config
├── LICENSE.txt
├── README.md
├── WpfRichText
├── AttachedProperties
│ └── RichTextboxAssistant.cs
├── Commands
│ ├── CommandReference.cs
│ └── DelegateCommand.cs
├── Controls
│ ├── RichTextEditor.xaml
│ └── RichTextEditor.xaml.cs
├── WpfRichText.csproj
├── WpfRichText.sln
└── XamlToHtmlParser
│ ├── HtmlCssParser.cs
│ ├── HtmlFromXamlConverter.cs
│ ├── HtmlLexicalAnalyzer.cs
│ ├── HtmlParser.cs
│ ├── HtmlSchema.cs
│ ├── HtmlToXamlConverter.cs
│ └── HtmlTokenType.cs
├── assets
└── icon.png
└── ej
├── build
├── build1.PNG
└── build2.PNG
├── color_tags
├── tag01.png
├── tag02.png
├── tag03.png
├── tag04.png
├── tag05.png
├── tag06.png
├── tag07.png
├── tag08.png
├── tag09.png
├── tag10.png
├── tag11.png
├── tag12.png
├── tag13.png
└── tag14.png
├── feature1_1_9_0.png
├── feature2_1_1_5.png
├── feature3_1_1_9_0.PNG
├── main_window1_1_1_5.png
├── main_window2_1_1_4.png
├── main_window3_1_1_4.png
└── troubleshooting1_1_0_9_0.png
/EasyJob.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.31624.102
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyJob", "EasyJob\EasyJob.csproj", "{E4A73656-4B1A-4A18-AC41-6AC59E1C8EB3}"
7 | EndProject
8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfRichText", "WpfRichText\WpfRichText.csproj", "{BD7ECC34-44C8-4D3C-B0E5-0384E2F2DE02}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyJobPSTools", "EasyJobPSTools\EasyJobPSTools.csproj", "{D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}"
11 | EndProject
12 | Global
13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 | Debug|Any CPU = Debug|Any CPU
15 | Release|Any CPU = Release|Any CPU
16 | EndGlobalSection
17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
18 | {E4A73656-4B1A-4A18-AC41-6AC59E1C8EB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
19 | {E4A73656-4B1A-4A18-AC41-6AC59E1C8EB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
20 | {E4A73656-4B1A-4A18-AC41-6AC59E1C8EB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
21 | {E4A73656-4B1A-4A18-AC41-6AC59E1C8EB3}.Release|Any CPU.Build.0 = Release|Any CPU
22 | {BD7ECC34-44C8-4D3C-B0E5-0384E2F2DE02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
23 | {BD7ECC34-44C8-4D3C-B0E5-0384E2F2DE02}.Debug|Any CPU.Build.0 = Debug|Any CPU
24 | {BD7ECC34-44C8-4D3C-B0E5-0384E2F2DE02}.Release|Any CPU.ActiveCfg = Release|Any CPU
25 | {BD7ECC34-44C8-4D3C-B0E5-0384E2F2DE02}.Release|Any CPU.Build.0 = Release|Any CPU
26 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
28 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
29 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Release|Any CPU.Build.0 = Release|Any CPU
30 | EndGlobalSection
31 | GlobalSection(SolutionProperties) = preSolution
32 | HideSolutionNode = FALSE
33 | EndGlobalSection
34 | GlobalSection(ExtensibilityGlobals) = postSolution
35 | SolutionGuid = {92C31FCF-A509-4155-9117-FDEC0F8333AD}
36 | EndGlobalSection
37 | EndGlobal
38 |
--------------------------------------------------------------------------------
/EasyJob/App.xaml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/EasyJob/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Reflection;
7 | using System.Threading.Tasks;
8 | using System.Windows;
9 |
10 | namespace EasyJob
11 | {
12 | ///
13 | /// Interaction logic for App.xaml
14 | ///
15 | public partial class App : Application
16 | {
17 | protected override void OnStartup(StartupEventArgs e)
18 | {
19 | base.OnStartup(e);
20 |
21 | SetDropDownMenuToBeRightAligned();
22 | }
23 |
24 | private static void SetDropDownMenuToBeRightAligned()
25 | {
26 | var menuDropAlignmentField = typeof(SystemParameters).GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
27 | Action setAlignmentValue = () =>
28 | {
29 | if (SystemParameters.MenuDropAlignment && menuDropAlignmentField != null) menuDropAlignmentField.SetValue(null, false);
30 | };
31 |
32 | setAlignmentValue();
33 |
34 | SystemParameters.StaticPropertyChanged += (sender, e) =>
35 | {
36 | setAlignmentValue();
37 | };
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/EasyJob/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 |
3 | [assembly: ThemeInfo(
4 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
5 | //(used if a resource is not found in the page,
6 | // or application resource dictionaries)
7 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
8 | //(used if a resource is not found in the page,
9 | // app, or any theme specific resource dictionaries)
10 | )]
11 |
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpAddActionButtonArguments.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpAddActionButtonArguments.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpAddActionButtonDescription.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpAddActionButtonDescription.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpAddActionButtonScript.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpAddActionButtonScript.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpAddActionButtonScriptPathType.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpAddActionButtonScriptPathType.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpAddActionButtonScriptType.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpAddActionButtonScriptType.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpAddActionButtonText.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpAddActionButtonText.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsAdd.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsAdd.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsCopy.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsCopy.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsEdit.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsEdit.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsPaste.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsPaste.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsRemove.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsRemove.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsReorder.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockButtonsReorder.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockTabsAdd.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockTabsAdd.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockTabsRemove.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockTabsRemove.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationBlockTabsRename.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationBlockTabsRename.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationClearEventsWhenReload.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationClearEventsWhenReload.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationConsoleBackground.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationConsoleBackground.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationConsoleForeground.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationConsoleForeground.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationConsoleIgnoreColorTags.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationConsoleIgnoreColorTags.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationDefaultCMDPath.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationDefaultCMDPath.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationDefaultPowershellPath.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationDefaultPowershellPath.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideAbout.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideAbout.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideClearEventsList.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideClearEventsList.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideColorTags.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideColorTags.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideFileOpenAppFolder.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideFileOpenAppFolder.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideFileReloadConfig.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideFileReloadConfig.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideHelp.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideHelp.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettings.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettings.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsConfiguration.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsConfiguration.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflow.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflow.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowAddButtonToCurrentTab.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowAddButtonToCurrentTab.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowAddTab.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowAddTab.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowRemoveCurrentTab.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowRemoveCurrentTab.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowRenameCurrentTab.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowRenameCurrentTab.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowReorderButtonsInCurrentTab.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowReorderButtonsInCurrentTab.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowReorderTabs.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideSettingsWorkflowReorderTabs.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationHideTroubleshooting.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationHideTroubleshooting.mp4
--------------------------------------------------------------------------------
/EasyJob/Documentation/Videos/HelpConfigurationPowerShellArguments.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Documentation/Videos/HelpConfigurationPowerShellArguments.mp4
--------------------------------------------------------------------------------
/EasyJob/EasyJob.csproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Designer
7 |
8 |
9 |
10 |
11 | Code
12 |
13 |
14 | Code
15 |
16 |
17 | Code
18 |
19 |
20 | Code
21 |
22 |
23 | Code
24 |
25 |
26 | Code
27 |
28 |
29 | Code
30 |
31 |
32 | Code
33 |
34 |
35 | Code
36 |
37 |
38 | Code
39 |
40 |
41 | Code
42 |
43 |
44 |
45 |
46 | Designer
47 |
48 |
49 | Designer
50 |
51 |
52 | Designer
53 |
54 |
55 | Designer
56 |
57 |
58 | Designer
59 |
60 |
61 | Designer
62 |
63 |
64 | Designer
65 |
66 |
67 | Designer
68 |
69 |
70 | Designer
71 |
72 |
73 | Designer
74 |
75 |
76 | Designer
77 |
78 |
79 | Designer
80 |
81 |
82 | Designer
83 |
84 |
85 |
--------------------------------------------------------------------------------
/EasyJob/EasyJobPS/EasyJobPS.psd1:
--------------------------------------------------------------------------------
1 | # Module manifest for module 'EasyJobPS'
2 | # Generated by: Akshin Mustafayev
3 | # Generated on: 10/8/2021
4 |
5 | @{
6 |
7 | # Script module or binary module file associated with this manifest.
8 | RootModule = 'EasyJobPS.psm1'
9 |
10 | # Version number of this module.
11 | ModuleVersion = '1.0'
12 |
13 | # ID used to uniquely identify this module
14 | GUID = 'd6c56376-ae08-4c23-b901-9bc75144e0c6'
15 |
16 | # Author of this module
17 | Author = 'Akshin Mustafayev'
18 |
19 | # Company or vendor of this module
20 | CompanyName = 'Akshin Mustafayev'
21 |
22 | # Copyright statement for this module
23 | Copyright = '(c) 2021 Akshin Mustafayev. Apache-2.0 license.'
24 |
25 | # Description of the functionality provided by this module
26 | Description = 'Module for implementing EasyJob additional helper functions'
27 |
28 | # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
29 | FunctionsToExport = 'Show-EJInputBox'
30 |
31 | }
--------------------------------------------------------------------------------
/EasyJob/EasyJobPS/EasyJobPS.psm1:
--------------------------------------------------------------------------------
1 | [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
2 |
3 | function Show-EJInputBox {
4 | <#
5 | .SYNOPSIS
6 | Shows Input-Box for you script.
7 |
8 | .DESCRIPTION
9 | Shows Input-Box for you script. This might be necessary
10 | when you want to get som input while executing your script,
11 | since EasyJob does not support Read from console.
12 |
13 | .PARAMETER Title
14 | Specifies Title for message box.
15 |
16 | .PARAMETER Message
17 | Specifies Message for message box.
18 |
19 | .INPUTS
20 | None.
21 |
22 | .OUTPUTS
23 | String value of the input from the box.
24 |
25 | .EXAMPLE
26 | C:\PS> $Result = Show-EJInputBox -Title "Specify your name" -Message "What is your name?"
27 | C:\PS> Write-Host "Your name is $Result"
28 | Your name is test
29 |
30 | .LINK
31 | https://github.com/akshinmustafayev/EasyJob
32 | #>
33 |
34 | param (
35 | [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()] [string]$Title,
36 | [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()] [string]$Message
37 | )
38 |
39 | $Result = [Microsoft.VisualBasic.Interaction]::InputBox($Message, $Title)
40 | return $Result
41 | }
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag01.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag02.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag03.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag04.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag05.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag06.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag07.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag08.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag09.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag10.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag11.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag12.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag13.png
--------------------------------------------------------------------------------
/EasyJob/Images/ColorTags/tag14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/ColorTags/tag14.png
--------------------------------------------------------------------------------
/EasyJob/Images/about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/about.png
--------------------------------------------------------------------------------
/EasyJob/Images/add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/add.png
--------------------------------------------------------------------------------
/EasyJob/Images/addbutton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/addbutton.png
--------------------------------------------------------------------------------
/EasyJob/Images/addtab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/addtab.png
--------------------------------------------------------------------------------
/EasyJob/Images/clear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/clear.png
--------------------------------------------------------------------------------
/EasyJob/Images/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/close.png
--------------------------------------------------------------------------------
/EasyJob/Images/colortags.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/colortags.png
--------------------------------------------------------------------------------
/EasyJob/Images/configuration.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/configuration.png
--------------------------------------------------------------------------------
/EasyJob/Images/convert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/convert.png
--------------------------------------------------------------------------------
/EasyJob/Images/copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/copy.png
--------------------------------------------------------------------------------
/EasyJob/Images/down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/down.png
--------------------------------------------------------------------------------
/EasyJob/Images/editbutton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/editbutton.png
--------------------------------------------------------------------------------
/EasyJob/Images/exit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/exit.png
--------------------------------------------------------------------------------
/EasyJob/Images/find.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/find.png
--------------------------------------------------------------------------------
/EasyJob/Images/folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/folder.png
--------------------------------------------------------------------------------
/EasyJob/Images/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/github.png
--------------------------------------------------------------------------------
/EasyJob/Images/help.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/help.png
--------------------------------------------------------------------------------
/EasyJob/Images/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/icon.ico
--------------------------------------------------------------------------------
/EasyJob/Images/paste.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/paste.png
--------------------------------------------------------------------------------
/EasyJob/Images/play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/play.png
--------------------------------------------------------------------------------
/EasyJob/Images/reload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/reload.png
--------------------------------------------------------------------------------
/EasyJob/Images/removebutton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/removebutton.png
--------------------------------------------------------------------------------
/EasyJob/Images/removetab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/removetab.png
--------------------------------------------------------------------------------
/EasyJob/Images/renametab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/renametab.png
--------------------------------------------------------------------------------
/EasyJob/Images/reorderbuttons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/reorderbuttons.png
--------------------------------------------------------------------------------
/EasyJob/Images/reordertabs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/reordertabs.png
--------------------------------------------------------------------------------
/EasyJob/Images/stop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/stop.png
--------------------------------------------------------------------------------
/EasyJob/Images/troubleshoot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/troubleshoot.png
--------------------------------------------------------------------------------
/EasyJob/Images/up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/up.png
--------------------------------------------------------------------------------
/EasyJob/Images/workflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/EasyJob/Images/workflow.png
--------------------------------------------------------------------------------
/EasyJob/Serialization/AnswerDialog/Answer.cs:
--------------------------------------------------------------------------------
1 | namespace EasyJob.Serialization.AnswerDialog
2 | {
3 | public class Answer
4 | {
5 | public string AnswerQuestion { get; set; }
6 | public string AnswerResult { get; set; }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/AnswerDialog/AnswerData.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace EasyJob.Serialization.AnswerDialog
4 | {
5 | public class AnswerData
6 | {
7 | private List _Answers = new List();
8 |
9 | public List Answers
10 | {
11 | get { return _Answers; }
12 | set { _Answers = value; }
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/Config/Config.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace EasyJob.Serialization
4 | {
5 | public class Config
6 | {
7 | public string default_powershell_path { get; set; }
8 | public string default_cmd_path { get; set; }
9 | public string powershell_arguments { get; set; }
10 | public string console_background { get; set; }
11 | public string console_foreground { get; set; }
12 | public bool console_ignore_color_tags { get; set; }
13 | public bool clear_events_when_reload { get; set; }
14 | public ConfigRestrictions restrictions { get; set; }
15 | public List tabs { get; set; }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/Config/ConfigArgument.cs:
--------------------------------------------------------------------------------
1 | namespace EasyJob.Serialization
2 | {
3 | public class ConfigArgument
4 | {
5 | private string _argument_question;
6 | private string _argument_answer;
7 |
8 | ///
9 | /// Initializes a new instance of the class.
10 | ///
11 | /// The argument question.
12 | /// The argument answer.
13 | public ConfigArgument(string argument_question, string argument_answer)
14 | {
15 | this._argument_question = argument_question;
16 | this._argument_answer = argument_answer;
17 | }
18 |
19 | ///
20 | /// Gets or sets the argument question.
21 | ///
22 | ///
23 | /// The argument question.
24 | ///
25 | public string ArgumentQuestion { get => _argument_question; set => _argument_question = value; }
26 | ///
27 | /// Gets or sets the argument answer.
28 | ///
29 | ///
30 | /// The argument answer.
31 | ///
32 | public string ArgumentAnswer { get => _argument_answer; set => _argument_answer = value; }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/Config/ConfigButton.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace EasyJob.Serialization
5 | {
6 | public class ConfigButton
7 | {
8 | private Guid _id;
9 | private string _text;
10 | private string _description;
11 | private string _script;
12 | private string _scriptpathtype;
13 | private string _scripttype;
14 | private List _arguments;
15 |
16 | ///
17 | /// Initializes a new instance of the class.
18 | ///
19 | /// The text.
20 | /// The description.
21 | /// The script.
22 | /// The scriptpathtype.
23 | /// The scripttype.
24 | /// The arguments.
25 | ///
26 | public ConfigButton(Guid id, string text, string description, string script, string scriptpathtype, string scripttype, List arguments)
27 | {
28 | this._id = id.Equals(Guid.Empty) ? Guid.NewGuid() : id;
29 | this._text = text;
30 | this._description = description;
31 | this._script = script;
32 | this._scriptpathtype = scriptpathtype;
33 | this._scripttype = scripttype;
34 | this._arguments = arguments;
35 | }
36 |
37 | ///
38 | /// Gets or sets the identifier.
39 | ///
40 | ///
41 | /// The identifier.
42 | ///
43 | public Guid Id { get => _id; set => _id = value; }
44 |
45 | ///
46 | /// Gets or sets the text.
47 | ///
48 | ///
49 | /// The text.
50 | ///
51 | public string Text { get => _text; set => _text = value; }
52 |
53 | ///
54 | /// Gets or sets the description.
55 | ///
56 | ///
57 | /// The description.
58 | ///
59 | public string Description { get => _description; set => _description = value; }
60 |
61 | ///
62 | /// Gets or sets the script.
63 | ///
64 | ///
65 | /// The script.
66 | ///
67 | public string Script { get => _script; set => _script = value; }
68 |
69 | ///
70 | /// Gets or sets the type of the script path.
71 | ///
72 | ///
73 | /// The type of the script path.
74 | ///
75 | public string ScriptPathType { get => _scriptpathtype; set => _scriptpathtype = value; }
76 |
77 | ///
78 | /// Gets or sets the type of the script.
79 | ///
80 | ///
81 | /// The type of the script.
82 | ///
83 | public string ScriptType { get => _scripttype; set => _scripttype = value; }
84 |
85 | ///
86 | /// Gets or sets the arguments.
87 | ///
88 | ///
89 | /// The arguments.
90 | ///
91 | public List Arguments { get => _arguments; set => _arguments = value; }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/Config/ConfigRestrictions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace EasyJob.Serialization
8 | {
9 | public class ConfigRestrictions
10 | {
11 | public bool block_tabs_remove { get; set; }
12 | public bool block_buttons_remove { get; set; }
13 | public bool block_tabs_add { get; set; }
14 | public bool block_buttons_add { get; set; }
15 | public bool block_buttons_reorder { get; set; }
16 | public bool block_buttons_edit { get; set; }
17 | public bool block_tabs_rename { get; set; }
18 | public bool block_buttons_paste { get; set; }
19 | public bool block_buttons_copy { get; set; }
20 | public bool hide_menu_item_file_reload_config { get; set; }
21 | public bool hide_menu_item_file_open_app_folder { get; set; }
22 | public bool hide_menu_item_file_clear_events_list { get; set; }
23 | public bool hide_menu_item_settings { get; set; }
24 | public bool hide_menu_item_settings_workflow { get; set; }
25 | public bool hide_menu_item_settings_workflow_reorder_tabs { get; set; }
26 | public bool hide_menu_item_settings_workflow_add_tab { get; set; }
27 | public bool hide_menu_item_settings_workflow_remove_current_tab { get; set; }
28 | public bool hide_menu_item_settings_workflow_rename_current_tab { get; set; }
29 | public bool hide_menu_item_settings_workflow_add_button_to_current_tab { get; set; }
30 | public bool hide_menu_item_settings_workflow_reorder_buttons_in_current_tab { get; set; }
31 | public bool hide_menu_item_settings_configuration { get; set; }
32 | public bool hide_menu_item_help { get; set; }
33 | public bool hide_menu_item_help_troubleshooting { get; set; }
34 | public bool hide_menu_item_help_colortags { get; set; }
35 | public bool hide_menu_item_help_about { get; set; }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/Config/ConfigTab.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace EasyJob.Serialization
5 | {
6 | public class ConfigTab
7 | {
8 | private Guid _id;
9 | private string _header;
10 | private List _buttons;
11 |
12 | ///
13 | /// Initializes a new instance of the class.
14 | ///
15 | /// The identifier.
16 | /// The header.
17 | /// The buttons.
18 | public ConfigTab(Guid id, string header, List buttons)
19 | {
20 | this._id = id.Equals(Guid.Empty) ? Guid.NewGuid() : id;
21 | this._header = header;
22 | this._buttons = buttons;
23 | }
24 |
25 | ///
26 | /// Gets or sets the identifier.
27 | ///
28 | ///
29 | /// The identifier.
30 | ///
31 | public Guid ID { get => _id; set => _id = value; }
32 |
33 |
34 | ///
35 | /// Gets or sets the header.
36 | ///
37 | ///
38 | /// The header.
39 | ///
40 | public string Header { get => _header; set => _header = value; }
41 | ///
42 | /// Gets or sets the buttons.
43 | ///
44 | ///
45 | /// The buttons.
46 | ///
47 | public List Buttons { get => _buttons; set => _buttons = value; }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/TabItems/ActionButton.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Windows.Controls;
4 | using EasyJob.Serialization.AnswerDialog;
5 |
6 | namespace EasyJob.TabItems
7 | {
8 | public class ActionButton
9 | {
10 | ///
11 | /// Gets or sets the identifier.
12 | ///
13 | ///
14 | /// The identifier.
15 | ///
16 | public Guid ID { get; set; }
17 |
18 | ///
19 | /// Gets or sets the button text.
20 | ///
21 | ///
22 | /// The button text.
23 | ///
24 | public string ButtonText { get; set; }
25 |
26 | ///
27 | /// Gets or sets the button description.
28 | ///
29 | ///
30 | /// The button description.
31 | ///
32 | public string ButtonDescription { get; set; }
33 |
34 | ///
35 | /// Gets or sets the button script.
36 | ///
37 | ///
38 | /// The button script.
39 | ///
40 | public string ButtonScript { get; set; }
41 |
42 | ///
43 | /// Gets or sets the type of the button script path.
44 | ///
45 | ///
46 | /// The type of the button script path.
47 | ///
48 | public string ButtonScriptPathType { get; set; }
49 |
50 | ///
51 | /// Gets or sets the type of the button script.
52 | ///
53 | ///
54 | /// The type of the button script.
55 | ///
56 | public string ButtonScriptType { get; set; }
57 |
58 | ///
59 | /// Gets or sets the button arguments.
60 | ///
61 | ///
62 | /// The button arguments.
63 | ///
64 | public List ButtonArguments { get; set; }
65 |
66 | ///
67 | /// Gets or sets the context menu.
68 | ///
69 | ///
70 | /// The context menu.
71 | ///
72 | public ContextMenu contextMenu { get; set; }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/TabItems/TabData.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Threading.Tasks;
5 |
6 | namespace EasyJob.TabItems
7 | {
8 | public class TabData : INotifyPropertyChanged
9 | {
10 | private string _TabTextBoxText;
11 |
12 | ///
13 | /// Initializes a new instance of the class.
14 | ///
15 | public TabData()
16 | {
17 |
18 | }
19 |
20 | ///
21 | /// Initializes a new instance of the class.
22 | ///
23 | /// The tab text box text.
24 | public TabData(string tabTextBoxText)
25 | {
26 | this._TabTextBoxText = tabTextBoxText;
27 | ID = Guid.NewGuid();
28 | TabHeader = tabTextBoxText;
29 | TabActionButtons = new List();
30 | }
31 |
32 | ///
33 | /// Gets or sets the identifier.
34 | ///
35 | ///
36 | /// The identifier.
37 | ///
38 | public Guid ID { get; set; }
39 |
40 | ///
41 | /// Gets or sets the tab header.
42 | ///
43 | ///
44 | /// The tab header.
45 | ///
46 | public string TabHeader { get; set; }
47 | ///
48 | /// Gets or sets the console background.
49 | ///
50 | ///
51 | /// The console background.
52 | ///
53 | public string ConsoleBackground { get; set; }
54 | ///
55 | /// Gets or sets the console foreground.
56 | ///
57 | ///
58 | /// The console foreground.
59 | ///
60 | public string ConsoleForeground { get; set; }
61 | ///
62 | /// Gets or sets the tab action buttons.
63 | ///
64 | ///
65 | /// The tab action buttons.
66 | ///
67 | public List TabActionButtons { get; set; }
68 | ///
69 | /// Gets or sets the tab text box text.
70 | ///
71 | ///
72 | /// The tab text box text.
73 | ///
74 | public string TabTextBoxText {
75 | get
76 | {
77 | return this._TabTextBoxText;
78 | }
79 | set
80 | {
81 | if (_TabTextBoxText != value)
82 | {
83 | _TabTextBoxText = value;
84 | Task.Run(() => {
85 | OnChange("TabTextBoxText");
86 | });
87 | }
88 | }
89 | }
90 |
91 | ///
92 | /// Occurs when a property value changes.
93 | ///
94 | public event PropertyChangedEventHandler PropertyChanged;
95 | ///
96 | /// Called when [change].
97 | ///
98 | /// The information.
99 | protected void OnChange(string info)
100 | {
101 | if (PropertyChanged != null)
102 | {
103 | PropertyChanged(this, new PropertyChangedEventArgs(info));
104 | }
105 | }
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/EasyJob/Serialization/TasksList/TaskListTask.cs:
--------------------------------------------------------------------------------
1 | namespace EasyJob.Serialization.TasksList
2 | {
3 | public class TaskListTask
4 | {
5 | public int TaskID { get; set; }
6 | public string TaskFile { get; set; }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/EasyJob/Utils/CommonUtils.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Reflection;
6 | using System.Windows;
7 |
8 | namespace EasyJob.Utils
9 | {
10 | public class CommonUtils
11 | {
12 | public static void OpenLinkInBrowser(string url)
13 | {
14 | try
15 | {
16 | Process proc = new Process();
17 | proc.StartInfo.UseShellExecute = true;
18 | proc.StartInfo.FileName = url;
19 | proc.Start();
20 | }
21 | catch (Exception ex) { MessageBox.Show(ex.Message); }
22 | }
23 |
24 | public static string ReadAssemblyFile(string name)
25 | {
26 | // Determine path
27 | var assembly = Assembly.GetExecutingAssembly();
28 | string resourcePath = name;
29 | // Format: "{Namespace}.{Folder}.{filename}.{Extension}"
30 | if (!name.StartsWith(nameof(EasyJob)))
31 | {
32 | resourcePath = assembly.GetManifestResourceNames()
33 | .Single(str => str.EndsWith(name));
34 | }
35 |
36 | using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
37 | using (StreamReader reader = new StreamReader(stream))
38 | {
39 | return reader.ReadToEnd();
40 | }
41 | }
42 |
43 | public static string ApplyConsoleColorTagsToText(string Text)
44 | {
45 | string[][] colorCodes = new string[][] {
46 | new string[] { @"\c01EJ", "/c01EJ", "" },
47 | new string[] { @"\c02EJ", "/c02EJ", "" },
48 | new string[] { @"\c03EJ", "/c03EJ", "" },
49 | new string[] { @"\c04EJ", "/c04EJ", "" },
50 | new string[] { @"\c05EJ", "/c05EJ", "" },
51 | new string[] { @"\c06EJ", "/c06EJ", "" },
52 | new string[] { @"\c07EJ", "/c07EJ", "" },
53 | new string[] { @"\c08EJ", "/c08EJ", "" },
54 | new string[] { @"\c09EJ", "/c09EJ", "" },
55 | new string[] { @"\c10EJ", "/c10EJ", "" },
56 | new string[] { @"\c11EJ", "/c11EJ", "" },
57 | new string[] { @"\c12EJ", "/c12EJ", "" },
58 | new string[] { @"\c13EJ", "/c13EJ", "" },
59 | new string[] { @"\c14EJ", "/c14EJ", "" }
60 | };
61 |
62 | for (int i = 0; i <= colorCodes.GetLength(0) - 1; i++)
63 | {
64 | if (Text.Contains(colorCodes[i][0]) == true && Text.Contains(colorCodes[i][1]) == false)
65 | {
66 | Text = Text.Replace(colorCodes[i][0], colorCodes[i][2]);
67 | Text = Text + "";
68 | }
69 | else if (Text.Contains(colorCodes[i][0]) == false && Text.Contains(colorCodes[i][1]) == true)
70 | {
71 | Text = Text.Replace(colorCodes[i][1], "");
72 | }
73 | else if (Text.Contains(colorCodes[i][0]) == true && Text.Contains(colorCodes[i][1]) == true)
74 | {
75 | Text = Text.Replace(colorCodes[i][0], colorCodes[i][2]);
76 | Text = Text.Replace(colorCodes[i][1], "");
77 | }
78 | }
79 |
80 | return Text;
81 | }
82 |
83 | public static string ConvertPartToRelative(string Path)
84 | {
85 | Path = Path.Replace(AppDomain.CurrentDomain.BaseDirectory, "");
86 | return Path;
87 | }
88 |
89 | public static string ApplicationStartupPath()
90 | {
91 | return AppDomain.CurrentDomain.BaseDirectory;
92 | }
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/EasyJob/Utils/ConfigUtils.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using EasyJob.Serialization.AnswerDialog;
3 | using EasyJob.TabItems;
4 | using Newtonsoft.Json;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Collections.ObjectModel;
8 | using System.IO;
9 | using System.Linq;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using System.Windows;
13 |
14 | namespace EasyJob.Utils
15 | {
16 | public class ConfigUtils
17 | {
18 | public static string ConfigJsonPath = AppDomain.CurrentDomain.BaseDirectory + "config.json";
19 |
20 |
21 | public static ObservableCollection ConvertTabsFromConfigToUI(Config config)
22 | {
23 | ObservableCollection tabs = new ObservableCollection();
24 |
25 | foreach (ConfigTab configTab in config.tabs)
26 | {
27 | List actionButtons = new List();
28 |
29 | foreach (ConfigButton configButton in configTab.Buttons)
30 | {
31 | List configArguments = new List();
32 | foreach (ConfigArgument configArgument in configButton.Arguments)
33 | {
34 | configArguments.Add(new Answer { AnswerQuestion = configArgument.ArgumentQuestion, AnswerResult = configArgument.ArgumentAnswer });
35 | }
36 |
37 | actionButtons.Add(new ActionButton { ID = configButton.Id, ButtonText = configButton.Text, ButtonDescription = configButton.Description, ButtonScript = configButton.Script, ButtonScriptPathType = configButton.ScriptPathType, ButtonScriptType = configButton.ScriptType, ButtonArguments = configArguments });
38 | }
39 |
40 | tabs.Add(new TabData { ID = configTab.ID, TabHeader = configTab.Header, ConsoleBackground = config.console_background, ConsoleForeground = config.console_foreground, TabActionButtons = actionButtons, TabTextBoxText = "" });
41 | }
42 |
43 | return tabs;
44 | }
45 |
46 | ///
47 | /// Saves the configs.
48 | ///
49 | /// The tabs.
50 | ///
51 | public static List ConvertTabsFromUIToConfig(IEnumerable tabs)
52 | {
53 | List configTabs = new List();
54 | List buttons = null;
55 | List configArguments = null;
56 |
57 | foreach (TabData tab in tabs)
58 | {
59 | buttons = new List();
60 | foreach (ActionButton button in tab.TabActionButtons)
61 | {
62 | configArguments = new List();
63 | foreach (Answer answer in button.ButtonArguments)
64 | {
65 | configArguments.Add(new ConfigArgument(answer.AnswerQuestion, answer.AnswerResult));
66 | }
67 |
68 | buttons.Add(new ConfigButton(button.ID, button.ButtonText, button.ButtonDescription, button.ButtonScript, button.ButtonScriptPathType, button.ButtonScriptType, configArguments));
69 | }
70 |
71 | configTabs.Add(new ConfigTab(tab.ID, tab.TabHeader, buttons));
72 | }
73 |
74 | return configTabs;
75 | }
76 |
77 | public static bool SaveFromConfigToFile(Config config)
78 | {
79 | try
80 | {
81 | string confifJson = JsonConvert.SerializeObject(config);
82 | File.WriteAllText(ConfigJsonPath, confifJson, Encoding.UTF8);
83 |
84 | return true;
85 | }
86 | catch (Exception ex)
87 | {
88 | MessageBox.Show(ex.Message);
89 | return false;
90 | }
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/EasyJob/Utils/ScrollViewerExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 |
9 | namespace EasyJob.Utils
10 | {
11 | public class ScrollViewerExtensions
12 | {
13 | public static readonly DependencyProperty AlwaysScrollToEndProperty = DependencyProperty.RegisterAttached("AlwaysScrollToEnd", typeof(bool), typeof(ScrollViewerExtensions), new PropertyMetadata(false, AlwaysScrollToEndChanged));
14 | private static bool _autoScroll;
15 |
16 | private static void AlwaysScrollToEndChanged(object sender, DependencyPropertyChangedEventArgs e)
17 | {
18 | ScrollViewer scroll = sender as ScrollViewer;
19 | if (scroll != null)
20 | {
21 | bool alwaysScrollToEnd = (e.NewValue != null) && (bool)e.NewValue;
22 | if (alwaysScrollToEnd)
23 | {
24 | scroll.ScrollToEnd();
25 | scroll.ScrollChanged += ScrollChanged;
26 | }
27 | else { scroll.ScrollChanged -= ScrollChanged; }
28 | }
29 | else { throw new InvalidOperationException("The attached AlwaysScrollToEnd property can only be applied to ScrollViewer instances."); }
30 | }
31 |
32 | public static bool GetAlwaysScrollToEnd(ScrollViewer scroll)
33 | {
34 | if (scroll == null) { throw new ArgumentNullException("scroll"); }
35 | return (bool)scroll.GetValue(AlwaysScrollToEndProperty);
36 | }
37 |
38 | public static void SetAlwaysScrollToEnd(ScrollViewer scroll, bool alwaysScrollToEnd)
39 | {
40 | if (scroll == null) { throw new ArgumentNullException("scroll"); }
41 | scroll.SetValue(AlwaysScrollToEndProperty, alwaysScrollToEnd);
42 | }
43 |
44 | private static void ScrollChanged(object sender, ScrollChangedEventArgs e)
45 | {
46 | ScrollViewer scroll = sender as ScrollViewer;
47 | if (scroll == null) { throw new InvalidOperationException("The attached AlwaysScrollToEnd property can only be applied to ScrollViewer instances."); }
48 |
49 | // User scroll event : set or unset autoscroll mode
50 | if (e.ExtentHeightChange == 0) { _autoScroll = scroll.VerticalOffset == scroll.ScrollableHeight; }
51 |
52 | // Content scroll event : autoscroll eventually
53 | if (_autoScroll && e.ExtentHeightChange != 0) { scroll.ScrollToVerticalOffset(scroll.ExtentHeight); }
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/EasyJob/Windows/AboutDialog.xaml:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/EasyJob/Windows/AboutDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Utils;
2 | using HtmlAgilityPack;
3 | using System;
4 | using System.Diagnostics;
5 | using System.IO;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Windows;
9 |
10 | namespace EasyJob.Windows
11 | {
12 | ///
13 | /// Interaction logic for AboutDialog.xaml
14 | ///
15 | public partial class AboutDialog : Window
16 | {
17 | ///
18 | /// Initializes a new instance of the class.
19 | ///
20 | public AboutDialog()
21 | {
22 | InitializeComponent();
23 | LoadDataInfoIntoTheForm();
24 | }
25 |
26 | public void LoadDataInfoIntoTheForm()
27 | {
28 | AboutTitle.Content = "EasyJob Executor " + Assembly.GetExecutingAssembly().GetName().Version.ToString();
29 | AboutInfo.Content = "Author: Akshin Mustafayev. Contrubutions made to the project by the Github community";
30 | string readme = CommonUtils.ReadAssemblyFile("LICENSE.txt");
31 | RichTextBox1.Document.Blocks.Clear();
32 | var plainText = ConvertToPlainText(readme);
33 | RichTextBox1.AppendText(plainText);
34 | }
35 |
36 | private static void ConvertContentTo(HtmlNode node, TextWriter outText)
37 | {
38 | foreach (HtmlNode subnode in node.ChildNodes)
39 | {
40 | ConvertTo(subnode, outText);
41 | }
42 | }
43 |
44 | ///
45 | /// Converts to plain text.
46 | ///
47 | /// The HTML.
48 | ///
49 | public static string ConvertToPlainText(string html)
50 | {
51 | HtmlDocument doc = new HtmlDocument();
52 | doc.LoadHtml(html);
53 |
54 | StringWriter sw = new StringWriter();
55 | ConvertTo(doc.DocumentNode, sw);
56 | sw.Flush();
57 | return sw.ToString();
58 | }
59 |
60 | private static void ConvertTo(HtmlNode node, TextWriter outText)
61 | {
62 | string html;
63 | switch (node.NodeType)
64 | {
65 | case HtmlNodeType.Comment:
66 | // don't output comments
67 | break;
68 |
69 | case HtmlNodeType.Document:
70 | ConvertContentTo(node, outText);
71 | break;
72 |
73 | case HtmlNodeType.Text:
74 | // script and style must not be output
75 | string parentName = node.ParentNode.Name;
76 | if ((parentName == "script") || (parentName == "style"))
77 | break;
78 |
79 | // get text
80 | html = ((HtmlTextNode)node).Text;
81 |
82 | // is it in fact a special closing node output as text?
83 | if (HtmlNode.IsOverlappedClosingElement(html))
84 | break;
85 |
86 | // check the text is meaningful and not a bunch of whitespaces
87 | if (html.Trim().Length > 0)
88 | {
89 | outText.Write(HtmlEntity.DeEntitize(html));
90 | }
91 | break;
92 |
93 | case HtmlNodeType.Element:
94 | switch (node.Name)
95 | {
96 | case "p":
97 | // treat paragraphs as crlf
98 | outText.Write("\r\n");
99 | break;
100 | case "br":
101 | outText.Write("\r\n");
102 | break;
103 | }
104 |
105 | if (node.HasChildNodes)
106 | {
107 | ConvertContentTo(node, outText);
108 | }
109 | break;
110 | }
111 |
112 | }
113 |
114 | private void GetInspirationButton_Click(object sender, RoutedEventArgs e)
115 | {
116 | CommonUtils.OpenLinkInBrowser("https://www.youtube.com/watch?v=l0U7SxXHkPY");
117 | }
118 |
119 | private void CheckNewReleasesButton_Click(object sender, RoutedEventArgs e)
120 | {
121 | CommonUtils.OpenLinkInBrowser("https://github.com/akshinmustafayev/EasyJob/releases");
122 | }
123 |
124 | private void GithubImage_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
125 | {
126 | CommonUtils.OpenLinkInBrowser("https://github.com/akshinmustafayev/EasyJob");
127 | }
128 | }
129 | }
130 |
--------------------------------------------------------------------------------
/EasyJob/Windows/AddActionButtonDialog.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
38 |
41 |
42 |
43 |
44 |
45 |
46 |
49 |
52 |
53 |
54 |
55 |
56 |
57 |
60 |
61 |
62 | Relative
63 | Absolute
64 |
65 |
66 |
67 |
68 |
71 |
72 |
73 | PowerShell
74 | Batch
75 |
76 |
77 |
78 |
79 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/EasyJob/Windows/AddActionButtonDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using EasyJob.Serialization.AnswerDialog;
3 | using EasyJob.Utils;
4 | using Microsoft.Win32;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Linq;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 | using System.Windows;
11 | using System.Windows.Controls;
12 | using System.Windows.Data;
13 | using System.Windows.Documents;
14 | using System.Windows.Input;
15 | using System.Windows.Media;
16 | using System.Windows.Media.Imaging;
17 | using System.Windows.Shapes;
18 |
19 | namespace EasyJob.Windows
20 | {
21 | ///
22 | /// Interaction logic for AddActionButtonDialog.xaml
23 | ///
24 | public partial class AddActionButtonDialog : Window
25 | {
26 | public ConfigButton configButton;
27 | public AddActionButtonDialog()
28 | {
29 | InitializeComponent();
30 | configButton = null;
31 | }
32 |
33 | private void OKButton_Click(object sender, RoutedEventArgs e)
34 | {
35 | List configArguments = new List();
36 | foreach (Answer answer in ButtonScriptArguments.Items) { configArguments.Add(new ConfigArgument(answer.AnswerQuestion, answer.AnswerResult)); };
37 | string buttonScriptPathTypeValue = ConvertScriptPathTypeComboBoxToString(ButtonScriptPathType);
38 | string buttonScriptTypeValue = ConvertScriptTypeComboBoxToString(ButtonScriptType);
39 | ConfigButton newConfigButton = new ConfigButton(Guid.NewGuid() ,ButtonText.Text, ButtonDescription.Text, ButtonScript.Text, buttonScriptPathTypeValue, buttonScriptTypeValue, configArguments);
40 | configButton = newConfigButton;
41 |
42 | DialogResult = true;
43 | }
44 |
45 | private string ConvertScriptTypeComboBoxToString(ComboBox cb)
46 | {
47 | if(cb.SelectedIndex == 0)
48 | {
49 | return "powershell";
50 | }
51 | else
52 | {
53 | return "bat";
54 | }
55 | }
56 |
57 | private string ConvertScriptPathTypeComboBoxToString(ComboBox cb)
58 | {
59 | if (cb.SelectedIndex == 0)
60 | {
61 | return "relative";
62 | }
63 | else
64 | {
65 | return "absolute";
66 | }
67 | }
68 |
69 | private void CANCELButton_Click(object sender, RoutedEventArgs e)
70 | {
71 | DialogResult = false;
72 | }
73 |
74 | private void ADDButton_Click(object sender, RoutedEventArgs e)
75 | {
76 | try
77 | {
78 | ButtonScriptArguments.Items.Add(new Answer { AnswerQuestion = ButtonScriptArgumentText.Text, AnswerResult = "" });
79 | ButtonScriptArgumentText.Text = "";
80 | }
81 | catch { }
82 | }
83 |
84 | private void DeleteArgumentButton_Click(object sender, RoutedEventArgs e)
85 | {
86 | try
87 | {
88 | Button btn = sender as Button;
89 | ButtonScriptArguments.Items.Remove((Answer)btn.DataContext);
90 | }
91 | catch { }
92 | }
93 |
94 | private void HelpButton_Click(object sender, RoutedEventArgs e)
95 | {
96 | Button button = sender as Button;
97 | HelpDialog hd = new HelpDialog(button.Name);
98 | hd.ShowDialog();
99 | }
100 |
101 | private void SelectFileButton_Click(object sender, RoutedEventArgs e)
102 | {
103 | OpenFileDialog ofd = new OpenFileDialog();
104 | ofd.Multiselect = false;
105 | ofd.InitialDirectory = CommonUtils.ApplicationStartupPath();
106 | if (ofd.ShowDialog() == true)
107 | {
108 | if(ButtonScriptPathType.SelectedIndex == 0)
109 | {
110 | ButtonScript.Text = CommonUtils.ConvertPartToRelative(ofd.FileName);
111 | }
112 | else
113 | {
114 | ButtonScript.Text = ofd.FileName;
115 | }
116 | }
117 | }
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/EasyJob/Windows/AnswerDialog.xaml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/EasyJob/Windows/AnswerDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization.AnswerDialog;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Collections.ObjectModel;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 | using System.Windows;
9 | using System.Windows.Controls;
10 | using System.Windows.Data;
11 | using System.Windows.Documents;
12 | using System.Windows.Input;
13 | using System.Windows.Media;
14 | using System.Windows.Media.Imaging;
15 | using System.Windows.Shapes;
16 |
17 | namespace EasyJob.Windows
18 | {
19 | ///
20 | /// Interaction logic for AnswerDialog.xaml
21 | ///
22 | public partial class AnswerDialog : Window
23 | {
24 | public AnswerData answerData = null;
25 | public AnswerDialog(AnswerData _answerData)
26 | {
27 | InitializeComponent();
28 | answerData = _answerData;
29 | if (_answerData != null)
30 | {
31 | foreach (Answer answer in _answerData.Answers)
32 | {
33 | answer.AnswerResult = "";
34 | }
35 | AnswerDialogItems.ItemsSource = _answerData.Answers;
36 | }
37 | }
38 |
39 | private void OKButton_Click(object sender, RoutedEventArgs e)
40 | {
41 | bool AllowConfirm = true;
42 | answerData.Answers = (List)AnswerDialogItems.ItemsSource;
43 | foreach (Answer answer in answerData.Answers)
44 | {
45 | if(answer.AnswerResult == "" || answer.AnswerResult == null)
46 | {
47 | AllowConfirm = false;
48 | }
49 | }
50 | if(AllowConfirm == false)
51 | {
52 | MessageBox.Show("Please provide value to all textboxes!", "Fill all data", MessageBoxButton.OK, MessageBoxImage.Warning);
53 | return;
54 | }
55 | DialogResult = true;
56 | }
57 |
58 | private void CANCELButton_Click(object sender, RoutedEventArgs e)
59 | {
60 | DialogResult = false;
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/EasyJob/Windows/ColorTagsDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 | using System.Windows.Data;
9 | using System.Windows.Documents;
10 | using System.Windows.Input;
11 | using System.Windows.Media;
12 | using System.Windows.Media.Imaging;
13 | using System.Windows.Shapes;
14 |
15 | namespace EasyJob.Windows
16 | {
17 | ///
18 | /// Interaction logic for ColorTagsDialog.xaml
19 | ///
20 | public partial class ColorTagsDialog : Window
21 | {
22 | public ColorTagsDialog()
23 | {
24 | InitializeComponent();
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/EasyJob/Windows/ConfigurationDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using EasyJob.Utils;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.IO;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 | using System.Windows;
10 | using System.Windows.Controls;
11 | using System.Windows.Data;
12 | using System.Windows.Documents;
13 | using System.Windows.Input;
14 | using System.Windows.Media;
15 | using System.Windows.Media.Imaging;
16 | using System.Windows.Shapes;
17 |
18 | namespace EasyJob.Windows
19 | {
20 | ///
21 | /// Interaction logic for Configuration.xaml
22 | ///
23 | public partial class ConfigurationDialog : Window
24 | {
25 | private Config config;
26 |
27 | public ConfigurationDialog(Config _config)
28 | {
29 | InitializeComponent();
30 | config = _config;
31 | LoadConfiguration();
32 | }
33 |
34 | private void LoadConfiguration()
35 | {
36 | // Common parameters
37 | DefaultPowerShellPath.Text = config.default_powershell_path;
38 | DefaultCMDPath.Text = config.default_cmd_path;
39 | PowerShellArguments.Text = config.powershell_arguments;
40 | ConsoleBackground.Text = config.console_background;
41 | ConsoleForeground.Text = config.console_foreground;
42 | SetComboBoxFromValue(ConsoleIgnoreColorTags, config.console_ignore_color_tags);
43 | SetComboBoxFromValue(ClearEventsWhenReload, config.clear_events_when_reload);
44 |
45 | // Restrictions
46 | SetComboBoxFromValue(BlockTabsRemove, config.restrictions.block_tabs_remove);
47 | SetComboBoxFromValue(BlockButtonsRemove, config.restrictions.block_buttons_remove);
48 | SetComboBoxFromValue(BlockTabsAdd, config.restrictions.block_tabs_add);
49 | SetComboBoxFromValue(BlockButtonsAdd, config.restrictions.block_buttons_add);
50 | SetComboBoxFromValue(BlockButtonsReorder, config.restrictions.block_buttons_reorder);
51 | SetComboBoxFromValue(BlockButtonsEdit, config.restrictions.block_buttons_edit);
52 | SetComboBoxFromValue(BlockTabsRename, config.restrictions.block_tabs_rename);
53 | SetComboBoxFromValue(BlockButtonsPaste, config.restrictions.block_buttons_paste);
54 | SetComboBoxFromValue(BlockButtonsCopy, config.restrictions.block_buttons_copy);
55 | SetComboBoxFromValue(HideFileReloadConfigMenuItem, config.restrictions.hide_menu_item_file_reload_config);
56 | SetComboBoxFromValue(HideFileOpenAppFolderMenuItem, config.restrictions.hide_menu_item_file_open_app_folder);
57 | SetComboBoxFromValue(HideFileClearEventsListMenuItem, config.restrictions.hide_menu_item_file_clear_events_list);
58 | SetComboBoxFromValue(HideSettingsMenuItem, config.restrictions.hide_menu_item_settings);
59 | SetComboBoxFromValue(HideSettingsWorkflowMenuItem, config.restrictions.hide_menu_item_settings_workflow);
60 | SetComboBoxFromValue(HideSettingsWorkflowReorderTabsMenuItem, config.restrictions.hide_menu_item_settings_workflow_reorder_tabs);
61 | SetComboBoxFromValue(HideSettingsWorkflowAddTabMenuItem, config.restrictions.hide_menu_item_settings_workflow_add_tab);
62 | SetComboBoxFromValue(HideSettingsWorkflowRemoveCurrentTabMenuItem, config.restrictions.hide_menu_item_settings_workflow_remove_current_tab);
63 | SetComboBoxFromValue(HideSettingsWorkflowRenameCurrentTabMenuItem, config.restrictions.hide_menu_item_settings_workflow_rename_current_tab);
64 | SetComboBoxFromValue(HideSettingsWorkflowAddButtonToCurrentTabMenuItem, config.restrictions.hide_menu_item_settings_workflow_add_button_to_current_tab);
65 | SetComboBoxFromValue(HideSettingsWorkflowReorderButtonsInCurrentTabMenuItem, config.restrictions.hide_menu_item_settings_workflow_reorder_buttons_in_current_tab);
66 | SetComboBoxFromValue(HideSettingsConfigurationMenuItem, config.restrictions.hide_menu_item_settings_configuration);
67 | SetComboBoxFromValue(HideHelpMenuItem, config.restrictions.hide_menu_item_help);
68 | SetComboBoxFromValue(HideHelpTroubleshootingMenuItem, config.restrictions.hide_menu_item_help_troubleshooting);
69 | SetComboBoxFromValue(HideHelpColorTagsMenuItem, config.restrictions.hide_menu_item_help_colortags);
70 | SetComboBoxFromValue(HideHelpAboutMenuItem, config.restrictions.hide_menu_item_help_about);
71 | }
72 |
73 | private void SetComboBoxFromValue(ComboBox comboBox, bool value)
74 | {
75 | if(value == true)
76 | {
77 | comboBox.SelectedIndex = 0;
78 | }
79 | else
80 | {
81 | comboBox.SelectedIndex = 1;
82 | }
83 | }
84 |
85 | private bool GetComboBoxValue(ComboBox comboBox)
86 | {
87 | if (comboBox.SelectedIndex == 0)
88 | {
89 | return true;
90 | }
91 | else
92 | {
93 | return false;
94 | }
95 | }
96 |
97 | private void SaveButton_Click(object sender, RoutedEventArgs e)
98 | {
99 | config.default_powershell_path = DefaultPowerShellPath.Text;
100 | config.default_cmd_path = DefaultCMDPath.Text;
101 | config.powershell_arguments = PowerShellArguments.Text;
102 | config.console_background = ConsoleBackground.Text;
103 | config.console_foreground = ConsoleForeground.Text;
104 | config.console_ignore_color_tags = GetComboBoxValue(ConsoleIgnoreColorTags);
105 | config.clear_events_when_reload = GetComboBoxValue(ClearEventsWhenReload);
106 |
107 | config.restrictions.block_tabs_remove = GetComboBoxValue(BlockTabsRemove);
108 | config.restrictions.block_buttons_remove = GetComboBoxValue(BlockButtonsRemove);
109 | config.restrictions.block_tabs_add = GetComboBoxValue(BlockTabsAdd);
110 | config.restrictions.block_buttons_add = GetComboBoxValue(BlockButtonsAdd);
111 | config.restrictions.block_buttons_reorder = GetComboBoxValue(BlockButtonsReorder);
112 | config.restrictions.block_buttons_edit = GetComboBoxValue(BlockButtonsEdit);
113 | config.restrictions.block_tabs_rename = GetComboBoxValue(BlockTabsRename);
114 | config.restrictions.block_buttons_paste = GetComboBoxValue(BlockButtonsPaste);
115 | config.restrictions.block_buttons_copy = GetComboBoxValue(BlockButtonsCopy);
116 | config.restrictions.hide_menu_item_file_reload_config = GetComboBoxValue(HideFileReloadConfigMenuItem);
117 | config.restrictions.hide_menu_item_file_open_app_folder = GetComboBoxValue(HideFileOpenAppFolderMenuItem);
118 | config.restrictions.hide_menu_item_file_clear_events_list = GetComboBoxValue(HideFileClearEventsListMenuItem);
119 | config.restrictions.hide_menu_item_settings = GetComboBoxValue(HideSettingsMenuItem);
120 | config.restrictions.hide_menu_item_settings_workflow = GetComboBoxValue(HideSettingsWorkflowMenuItem);
121 | config.restrictions.hide_menu_item_settings_workflow_reorder_tabs = GetComboBoxValue(HideSettingsWorkflowReorderTabsMenuItem);
122 | config.restrictions.hide_menu_item_settings_workflow_add_tab = GetComboBoxValue(HideSettingsWorkflowAddTabMenuItem);
123 | config.restrictions.hide_menu_item_settings_workflow_remove_current_tab = GetComboBoxValue(HideSettingsWorkflowRemoveCurrentTabMenuItem);
124 | config.restrictions.hide_menu_item_settings_workflow_rename_current_tab = GetComboBoxValue(HideSettingsWorkflowRenameCurrentTabMenuItem);
125 | config.restrictions.hide_menu_item_settings_workflow_add_button_to_current_tab = GetComboBoxValue(HideSettingsWorkflowAddButtonToCurrentTabMenuItem);
126 | config.restrictions.hide_menu_item_settings_workflow_reorder_buttons_in_current_tab = GetComboBoxValue(HideSettingsWorkflowReorderButtonsInCurrentTabMenuItem);
127 | config.restrictions.hide_menu_item_settings_configuration = GetComboBoxValue(HideSettingsConfigurationMenuItem);
128 | config.restrictions.hide_menu_item_help = GetComboBoxValue(HideHelpMenuItem);
129 | config.restrictions.hide_menu_item_help_troubleshooting = GetComboBoxValue(HideHelpTroubleshootingMenuItem);
130 | config.restrictions.hide_menu_item_help_colortags = GetComboBoxValue(HideHelpColorTagsMenuItem);
131 | config.restrictions.hide_menu_item_help_about = GetComboBoxValue(HideHelpAboutMenuItem);
132 |
133 | if(ConfigUtils.SaveFromConfigToFile(config) == true)
134 | {
135 | MessageBox.Show("Settings saved!", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
136 | }
137 | }
138 |
139 | private void HelpButton_Click(object sender, RoutedEventArgs e)
140 | {
141 | Button button = sender as Button;
142 | HelpDialog hd = new HelpDialog(button.Name);
143 | hd.ShowDialog();
144 | }
145 | }
146 | }
147 |
--------------------------------------------------------------------------------
/EasyJob/Windows/EditActionButtonDialog.xaml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
30 |
31 |
32 |
33 |
34 |
37 |
38 |
39 |
40 |
41 |
42 |
45 |
48 |
49 |
50 |
51 |
52 |
53 |
56 |
57 |
58 | Relative
59 | Absolute
60 |
61 |
62 |
63 |
64 |
67 |
68 |
69 | PowerShell
70 | Batch
71 |
72 |
73 |
74 |
75 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
--------------------------------------------------------------------------------
/EasyJob/Windows/EditActionButtonDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using EasyJob.Serialization.AnswerDialog;
3 | using EasyJob.TabItems;
4 | using EasyJob.Utils;
5 | using Microsoft.Win32;
6 | using System;
7 | using System.Collections.Generic;
8 | using System.Linq;
9 | using System.Text;
10 | using System.Threading.Tasks;
11 | using System.Windows;
12 | using System.Windows.Controls;
13 | using System.Windows.Data;
14 | using System.Windows.Documents;
15 | using System.Windows.Input;
16 | using System.Windows.Media;
17 | using System.Windows.Media.Imaging;
18 | using System.Windows.Shapes;
19 |
20 | namespace EasyJob.Windows
21 | {
22 | ///
23 | /// Interaction logic for EditButtonDialog.xaml
24 | ///
25 | public partial class EditActionButtonDialog : Window
26 | {
27 | public ActionButton actionButton = null;
28 |
29 | public EditActionButtonDialog(ActionButton _actionButton)
30 | {
31 | InitializeComponent();
32 |
33 | actionButton = _actionButton;
34 | ButtonText.Text = actionButton.ButtonText;
35 | ButtonDescription.Text = actionButton.ButtonDescription;
36 | ButtonScript.Text = actionButton.ButtonScript;
37 | if (actionButton.ButtonScriptPathType == "relative") { ButtonScriptPathType.SelectedIndex = 0; }
38 | else { ButtonScriptPathType.SelectedIndex = 1; }
39 | if (actionButton.ButtonScriptType == "powershell"){ ButtonScriptType.SelectedIndex = 0; }
40 | else { ButtonScriptType.SelectedIndex = 1; }
41 | List answers = actionButton.ButtonArguments;
42 | foreach (Answer ans in answers)
43 | {
44 | ButtonScriptArguments.Items.Add(new Answer { AnswerQuestion = ans.AnswerQuestion, AnswerResult = ans.AnswerResult });
45 | }
46 | }
47 |
48 | private string ConvertScriptTypeComboBoxToString(ComboBox cb)
49 | {
50 | if (cb.SelectedIndex == 0)
51 | {
52 | return "powershell";
53 | }
54 | else
55 | {
56 | return "bat";
57 | }
58 | }
59 |
60 | private string ConvertScriptPathTypeComboBoxToString(ComboBox cb)
61 | {
62 | if (cb.SelectedIndex == 0)
63 | {
64 | return "relative";
65 | }
66 | else
67 | {
68 | return "absolute";
69 | }
70 | }
71 |
72 | private void ADDButton_Click(object sender, RoutedEventArgs e)
73 | {
74 | try
75 | {
76 | ButtonScriptArguments.Items.Add(new Answer { AnswerQuestion = ButtonScriptArgumentText.Text, AnswerResult = "" });
77 | ButtonScriptArgumentText.Text = "";
78 | }
79 | catch { }
80 | }
81 |
82 | private void DeleteArgumentButton_Click(object sender, RoutedEventArgs e)
83 | {
84 | try
85 | {
86 | Button btn = sender as Button;
87 | ButtonScriptArguments.Items.Remove((Answer)btn.DataContext);
88 | }
89 | catch { }
90 | }
91 |
92 | private void SaveButton_Click(object sender, RoutedEventArgs e)
93 | {
94 | actionButton.ButtonText = ButtonText.Text;
95 | actionButton.ButtonDescription = ButtonDescription.Text;
96 | actionButton.ButtonScript = ButtonScript.Text;
97 | actionButton.ButtonScriptPathType = ConvertScriptPathTypeComboBoxToString(ButtonScriptPathType);
98 | actionButton.ButtonScriptType = ConvertScriptTypeComboBoxToString(ButtonScriptType);
99 |
100 | actionButton.ButtonArguments.Clear();
101 | foreach (Answer ans in ButtonScriptArguments.Items)
102 | {
103 | actionButton.ButtonArguments.Add(new Answer { AnswerQuestion = ans.AnswerQuestion, AnswerResult = ans.AnswerResult });
104 | }
105 |
106 | DialogResult = true;
107 | }
108 |
109 | private void CancelButton_Click(object sender, RoutedEventArgs e)
110 | {
111 | DialogResult = false;
112 | }
113 |
114 | private void HelpButton_Click(object sender, RoutedEventArgs e)
115 | {
116 | Button button = sender as Button;
117 | HelpDialog hd = new HelpDialog(button.Name);
118 | hd.ShowDialog();
119 | }
120 |
121 | private void SelectFileButton_Click(object sender, RoutedEventArgs e)
122 | {
123 | OpenFileDialog ofd = new OpenFileDialog();
124 | ofd.Multiselect = false;
125 | ofd.InitialDirectory = CommonUtils.ApplicationStartupPath();
126 | if (ofd.ShowDialog() == true)
127 | {
128 | if (ButtonScriptPathType.SelectedIndex == 0)
129 | {
130 | ButtonScript.Text = CommonUtils.ConvertPartToRelative(ofd.FileName);
131 | }
132 | else
133 | {
134 | ButtonScript.Text = ofd.FileName;
135 | }
136 | }
137 | }
138 | }
139 | }
140 |
--------------------------------------------------------------------------------
/EasyJob/Windows/HelpDialog.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
34 |
39 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/EasyJob/Windows/HelpDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Utils;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.IO;
5 | using System.Linq;
6 | using System.Reflection;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 | using System.Windows;
10 | using System.Windows.Controls;
11 | using System.Windows.Data;
12 | using System.Windows.Documents;
13 | using System.Windows.Input;
14 | using System.Windows.Media;
15 | using System.Windows.Media.Imaging;
16 | using System.Windows.Shapes;
17 | using System.Xml;
18 | using System.Xml.Linq;
19 |
20 | namespace EasyJob.Windows
21 | {
22 | ///
23 | /// Interaction logic for HelpDialog.xaml
24 | ///
25 | public partial class HelpDialog : Window
26 | {
27 | public HelpDialog(string helpitem)
28 | {
29 | InitializeComponent();
30 | LoadXml(helpitem);
31 | }
32 |
33 | private void LoadXml(string helpitem)
34 | {
35 | XmlDocument doc = new XmlDocument();
36 | doc.LoadXml(CommonUtils.ReadAssemblyFile(@"EasyJob.Documentation.HelpDocumentation.xml"));
37 |
38 | XmlNodeList nodeList = doc.SelectNodes("/items/item[name='" + helpitem + "']");
39 |
40 | HelpHeading.Text = nodeList[0]["heading"].InnerText;
41 | HelpUsed.Text = nodeList[0]["used"].InnerText;
42 | HelpDescription.Text = nodeList[0]["description"].InnerText;
43 | if (nodeList[0]["video"].InnerText != "" || nodeList[0]["video"].InnerText != null)
44 | {
45 | try
46 | {
47 | HelpVideo.HorizontalAlignment = HorizontalAlignment.Stretch;
48 | HelpVideo.VerticalAlignment = VerticalAlignment.Stretch;
49 | HelpVideo.Stretch = Stretch.Fill;
50 | HelpVideo.Volume = 0;
51 | HelpVideo.Source = new Uri(@"Documentation\Videos\" + nodeList[0]["video"].InnerText, UriKind.Relative);
52 | HelpVideo.Position = TimeSpan.FromSeconds(0);
53 | HelpVideo.Play();
54 | }
55 | catch { }
56 | }
57 | }
58 |
59 | private void ReloadVideoButton_Click(object sender, RoutedEventArgs e)
60 | {
61 | HelpVideo.Position = TimeSpan.FromSeconds(0);
62 | HelpVideo.Play();
63 | }
64 |
65 | private void StopVideoButton_Click(object sender, RoutedEventArgs e)
66 | {
67 | HelpVideo.Stop();
68 | }
69 |
70 | private void PlayVideoButton_Click(object sender, RoutedEventArgs e)
71 | {
72 | HelpVideo.Play();
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/EasyJob/Windows/NewTabDialog.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/EasyJob/Windows/NewTabDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using EasyJob.TabItems;
3 | using EasyJob.Utils;
4 | using Newtonsoft.Json;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Collections.ObjectModel;
8 | using System.IO;
9 | using System.Linq;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using System.Windows;
13 | using System.Windows.Controls;
14 | using System.Windows.Data;
15 | using System.Windows.Documents;
16 | using System.Windows.Input;
17 | using System.Windows.Media;
18 | using System.Windows.Media.Imaging;
19 | using System.Windows.Shapes;
20 |
21 | namespace EasyJob.Windows
22 | {
23 | ///
24 | /// Interaction logic for NewTabDialog.xaml
25 | ///
26 | public partial class NewTabDialog : Window
27 | {
28 | public string configJson = "";
29 | public Config config;
30 | ObservableCollection TabItems = null;
31 |
32 | public NewTabDialog()
33 | {
34 | InitializeComponent();
35 | LoadConfig();
36 | }
37 |
38 | public void LoadConfig()
39 | {
40 | if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + "config.json"))
41 | {
42 | try
43 | {
44 | configJson = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "config.json");
45 | config = JsonConvert.DeserializeObject(configJson);
46 |
47 | TabItems = ConfigUtils.ConvertTabsFromConfigToUI(config);
48 | }
49 | catch (Exception ex)
50 | {
51 | MessageBox.Show(ex.Message);
52 | }
53 | }
54 | else
55 | {
56 | MessageBox.Show("File " + AppDomain.CurrentDomain.BaseDirectory + "config.json does not exist.");
57 | }
58 | }
59 |
60 | public bool SaveConfig()
61 | {
62 | string path = AppDomain.CurrentDomain.BaseDirectory + "config.json";
63 | if (File.Exists(path))
64 | {
65 | try
66 | {
67 | config.tabs.Clear();
68 | config.tabs = ConfigUtils.ConvertTabsFromUIToConfig(TabItems);
69 |
70 | if (ConfigUtils.SaveFromConfigToFile(config) == true)
71 | {
72 | return true;
73 | }
74 | else
75 | {
76 | return false;
77 | }
78 | }
79 | catch
80 | {
81 | return false;
82 | }
83 | }
84 | else
85 | {
86 | //SaveConfig();
87 | }
88 |
89 | return false;
90 | }
91 |
92 | private void CreateNewTabButton_Click(object sender, RoutedEventArgs e)
93 | {
94 | if (!string.IsNullOrEmpty(CreateNewTabTextBox.Text))
95 | {
96 | TabData tabData = new TabData(CreateNewTabTextBox.Text);
97 | TabItems.Add(tabData);
98 |
99 | if (SaveConfig())
100 | {
101 | DialogResult = true;
102 | }
103 | else
104 | {
105 | MessageBox.Show("Error trying to save added Tab.");
106 | }
107 | }
108 | else
109 | {
110 | MessageBox.Show("Tab header name should not be empty.");
111 | }
112 | }
113 | private void CancelButton_Click(object sender, RoutedEventArgs e)
114 | {
115 | DialogResult = false;
116 | }
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/EasyJob/Windows/RenameTabDialog.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/EasyJob/Windows/RenameTabDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 | using System.Windows.Data;
9 | using System.Windows.Documents;
10 | using System.Windows.Input;
11 | using System.Windows.Media;
12 | using System.Windows.Media.Imaging;
13 | using System.Windows.Shapes;
14 |
15 | namespace EasyJob.Windows
16 | {
17 | ///
18 | /// Interaction logic for RenameTabDialog.xaml
19 | ///
20 | public partial class RenameTabDialog : Window
21 | {
22 | public string NewTabName = "";
23 |
24 | public RenameTabDialog(string SelectedTabHeader)
25 | {
26 | InitializeComponent();
27 | RenameTabTextBox.Text = SelectedTabHeader;
28 | }
29 |
30 | private void CancelRenameButton_Click(object sender, RoutedEventArgs e)
31 | {
32 | DialogResult = false;
33 | }
34 |
35 | private void RenameTabButton_Click(object sender, RoutedEventArgs e)
36 | {
37 | if(RenameTabTextBox.Text.Length > 0)
38 | {
39 | NewTabName = RenameTabTextBox.Text;
40 | DialogResult = true;
41 | }
42 | else
43 | {
44 | MessageBox.Show("Please specify new name for the tab");
45 | }
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/EasyJob/Windows/ReorderActionButtonsDialog.xaml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/EasyJob/Windows/ReorderActionButtonsDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using EasyJob.TabItems;
3 | using EasyJob.Utils;
4 | using Newtonsoft.Json;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Collections.ObjectModel;
8 | using System.IO;
9 | using System.Linq;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using System.Windows;
13 | using System.Windows.Controls;
14 | using System.Windows.Data;
15 | using System.Windows.Documents;
16 | using System.Windows.Input;
17 | using System.Windows.Media;
18 | using System.Windows.Media.Imaging;
19 | using System.Windows.Shapes;
20 |
21 | namespace EasyJob.Windows
22 | {
23 | ///
24 | /// Interaction logic for ReorderActionButtonsDialog.xaml
25 | ///
26 | public partial class ReorderActionButtonsDialog : Window
27 | {
28 | public Config config;
29 | public int currentTabIndex = 0;
30 | public bool changesOccured = false;
31 | ObservableCollection TabItems = null;
32 | ObservableCollection ActionButtons = null;
33 |
34 | public ReorderActionButtonsDialog(int _currentTabIndex, Config _config)
35 | {
36 | InitializeComponent();
37 | config = _config;
38 | currentTabIndex = _currentTabIndex;
39 | LoadConfig();
40 | }
41 |
42 | public void LoadConfig()
43 | {
44 | try
45 | {
46 | MainWindowActionButtonsList.ItemsSource = null;
47 |
48 | TabItems = ConfigUtils.ConvertTabsFromConfigToUI(config);
49 |
50 | List list = TabItems[currentTabIndex].TabActionButtons;
51 | ObservableCollection collection = new ObservableCollection(list);
52 |
53 | ActionButtons = collection;
54 |
55 | MainWindowActionButtonsList.ItemsSource = ActionButtons;
56 | }
57 | catch (Exception ex)
58 | {
59 | MessageBox.Show(ex.Message);
60 | }
61 | }
62 |
63 | public bool SaveConfig()
64 | {
65 | if (File.Exists(ConfigUtils.ConfigJsonPath))
66 | {
67 | try
68 | {
69 | config.tabs.Clear();
70 | config.tabs = ConfigUtils.ConvertTabsFromUIToConfig(TabItems);
71 |
72 | if (ConfigUtils.SaveFromConfigToFile(config) == true)
73 | {
74 | return true;
75 | }
76 | else
77 | {
78 | return false;
79 | }
80 | }
81 | catch
82 | {
83 | return false;
84 | }
85 | }
86 | else
87 | {
88 | SaveConfig();
89 | }
90 |
91 | return false;
92 | }
93 |
94 | private void ActionButtonsRedorderDown_Click(object sender, RoutedEventArgs e)
95 | {
96 | if (MainWindowActionButtonsList.SelectedIndex == -1)
97 | {
98 | MessageBox.Show("Please select item to reorder");
99 | return;
100 | }
101 |
102 | var selectedIndex = MainWindowActionButtonsList.SelectedIndex;
103 |
104 | if (selectedIndex + 1 < ActionButtons.Count)
105 | {
106 | var itemToMoveDown = ActionButtons[selectedIndex];
107 | ActionButtons.RemoveAt(selectedIndex);
108 | ActionButtons.Insert(selectedIndex + 1, itemToMoveDown);
109 | MainWindowActionButtonsList.SelectedIndex = selectedIndex + 1;
110 |
111 | List myList = new List(ActionButtons);
112 | TabItems[currentTabIndex].TabActionButtons = myList;
113 | }
114 |
115 | changesOccured = true;
116 |
117 | SaveConfig();
118 | }
119 |
120 | private void ActionButtonsReorderUp_Click(object sender, RoutedEventArgs e)
121 | {
122 | if (MainWindowActionButtonsList.SelectedIndex == -1)
123 | {
124 | MessageBox.Show("Please select item to reorder");
125 | return;
126 | }
127 |
128 | var selectedIndex = MainWindowActionButtonsList.SelectedIndex;
129 |
130 | if (selectedIndex > 0)
131 | {
132 | var itemToMoveUp = ActionButtons[selectedIndex];
133 | ActionButtons.RemoveAt(selectedIndex);
134 | ActionButtons.Insert(selectedIndex - 1, itemToMoveUp);
135 | MainWindowActionButtonsList.SelectedIndex = selectedIndex - 1;
136 | List myList = new List(ActionButtons);
137 | TabItems[currentTabIndex].TabActionButtons = myList;
138 | }
139 |
140 | changesOccured = true;
141 |
142 | SaveConfig();
143 | }
144 | }
145 | }
146 |
--------------------------------------------------------------------------------
/EasyJob/Windows/ReorderTabsDialog.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
41 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/EasyJob/Windows/ReorderTabsDialog.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using EasyJob.TabItems;
3 | using EasyJob.Utils;
4 | using Newtonsoft.Json;
5 | using System;
6 | using System.Collections.ObjectModel;
7 | using System.IO;
8 | using System.Text;
9 | using System.Windows;
10 |
11 | namespace EasyJob.Windows
12 | {
13 | ///
14 | /// Interaction logic for ReorderTabsDialog.xaml
15 | ///
16 | public partial class ReorderTabsDialog : Window
17 | {
18 | public Config config;
19 | ObservableCollection TabItems = null;
20 | public bool changesOccured = false;
21 |
22 | public ReorderTabsDialog(Config _config)
23 | {
24 | InitializeComponent();
25 | config = _config;
26 | LoadConfig();
27 | }
28 |
29 | public void LoadConfig()
30 | {
31 | try
32 | {
33 | MainWindowTabsList.ItemsSource = null;
34 | TabItems = ConfigUtils.ConvertTabsFromConfigToUI(config);
35 | MainWindowTabsList.ItemsSource = TabItems;
36 | }
37 | catch (Exception ex)
38 | {
39 | MessageBox.Show(ex.Message);
40 | }
41 | }
42 |
43 | public bool SaveConfig()
44 | {
45 | if (File.Exists(ConfigUtils.ConfigJsonPath))
46 | {
47 | try
48 | {
49 | config.tabs.Clear();
50 | config.tabs = ConfigUtils.ConvertTabsFromUIToConfig(TabItems);
51 |
52 | if (ConfigUtils.SaveFromConfigToFile(config) == true)
53 | {
54 | return true;
55 | }
56 | else
57 | {
58 | return false;
59 | }
60 | }
61 | catch
62 | {
63 | return false;
64 | }
65 | }
66 | else
67 | {
68 | SaveConfig();
69 | }
70 |
71 | return false;
72 | }
73 |
74 | private void TabsRedorderDown_Click(object sender, RoutedEventArgs e)
75 | {
76 | if(MainWindowTabsList.SelectedIndex == -1)
77 | {
78 | MessageBox.Show("Please select item to reorder");
79 | return;
80 | }
81 |
82 | var selectedIndex = MainWindowTabsList.SelectedIndex;
83 |
84 | if (selectedIndex + 1 < TabItems.Count)
85 | {
86 | var itemToMoveDown = TabItems[selectedIndex];
87 | TabItems.RemoveAt(selectedIndex);
88 | TabItems.Insert(selectedIndex + 1, itemToMoveDown);
89 | MainWindowTabsList.SelectedIndex = selectedIndex + 1;
90 | }
91 |
92 | changesOccured = true;
93 |
94 | SaveConfig();
95 | }
96 |
97 | private void TabsReorderUp_Click(object sender, RoutedEventArgs e)
98 | {
99 | if (MainWindowTabsList.SelectedIndex == -1)
100 | {
101 | MessageBox.Show("Please select item to reorder");
102 | return;
103 | }
104 |
105 | changesOccured = true;
106 |
107 | var selectedIndex = MainWindowTabsList.SelectedIndex;
108 |
109 | if (selectedIndex > 0)
110 | {
111 | var itemToMoveUp = TabItems[selectedIndex];
112 | TabItems.RemoveAt(selectedIndex);
113 | TabItems.Insert(selectedIndex - 1, itemToMoveUp);
114 | MainWindowTabsList.SelectedIndex = selectedIndex - 1;
115 | }
116 |
117 | SaveConfig();
118 | }
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/EasyJob/Windows/TroubleshootingWindow.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/EasyJob/Windows/TroubleshootingWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJob.Serialization;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Diagnostics;
5 | using System.IO;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Runtime.InteropServices;
9 | using System.Text;
10 | using System.Threading.Tasks;
11 | using System.Windows;
12 | using System.Windows.Controls;
13 | using System.Windows.Data;
14 | using System.Windows.Documents;
15 | using System.Windows.Input;
16 | using System.Windows.Media;
17 | using System.Windows.Media.Imaging;
18 | using System.Windows.Shapes;
19 | using System.Windows.Threading;
20 |
21 | namespace EasyJob.Windows
22 | {
23 | ///
24 | /// Interaction logic for TroubleshootingWindow.xaml
25 | ///
26 | public partial class TroubleshootingWindow : Window
27 | {
28 | Config config = null;
29 |
30 | public TroubleshootingWindow(Config _config)
31 | {
32 | InitializeComponent();
33 | config = _config;
34 | FillKnownData();
35 | }
36 |
37 | private void FillKnownData()
38 | {
39 | OSDescription.Text = RuntimeInformation.OSDescription;
40 | FrameworkDescription.Text = RuntimeInformation.FrameworkDescription;
41 | OsD.Text = RuntimeInformation.OSArchitecture.ToString();
42 |
43 | PowerShellPath.Text = config.default_powershell_path;
44 |
45 | if(config.powershell_arguments == "")
46 | {
47 | PowerShellArguments.Text = "empty";
48 | PowerShellArguments.Foreground = new SolidColorBrush(Color.FromRgb(128, 128, 128));
49 | }
50 | else
51 | {
52 | PowerShellArguments.Text = config.powershell_arguments;
53 | }
54 |
55 | if(File.Exists(config.default_powershell_path))
56 | {
57 | try
58 | {
59 | var versionInfo = FileVersionInfo.GetVersionInfo(config.default_powershell_path);
60 | PowerShellVersion.Text = versionInfo.FileVersion;
61 | }
62 | catch
63 | {
64 | PowerShellVersion.Text = "unable to get version";
65 | PowerShellVersion.Foreground = new SolidColorBrush(Color.FromRgb(128, 128, 128));
66 | }
67 | }
68 |
69 | if(Directory.Exists(System.IO.Path.GetPathRoot(Environment.SystemDirectory) + @"Program Files\WindowsPowerShell\Modules"))
70 | {
71 | try
72 | {
73 | string[] dirs = Directory.GetDirectories(System.IO.Path.GetPathRoot(Environment.SystemDirectory) + @"Program Files\WindowsPowerShell\Modules", "*", SearchOption.TopDirectoryOnly);
74 | foreach (string dir in dirs)
75 | {
76 | PowerShellModules.Text = PowerShellModules.Text + dir + Environment.NewLine;
77 | }
78 | }
79 | catch { }
80 | }
81 | if (Directory.Exists(System.IO.Path.GetPathRoot(Environment.SystemDirectory) + @"Windows\System32\WindowsPowerShell\v1.0\Modules"))
82 | {
83 | try
84 | {
85 | string[] dirs = Directory.GetDirectories(System.IO.Path.GetPathRoot(Environment.SystemDirectory) + @"Windows\System32\WindowsPowerShell\v1.0\Modules", "*", SearchOption.TopDirectoryOnly);
86 | foreach (string dir in dirs)
87 | {
88 | PowerShellModules.Text = PowerShellModules.Text + dir + Environment.NewLine;
89 | }
90 | }
91 | catch { }
92 | }
93 | if (Directory.Exists(System.IO.Path.GetPathRoot(Environment.SystemDirectory) + @"Program Files (x86)\WindowsPowerShell\Modules"))
94 | {
95 | try
96 | {
97 | string[] dirs = Directory.GetDirectories(System.IO.Path.GetPathRoot(Environment.SystemDirectory) + @"Program Files (x86)\WindowsPowerShell\Modules", "*", SearchOption.TopDirectoryOnly);
98 | foreach (string dir in dirs)
99 | {
100 | PowerShellModules.Text = PowerShellModules.Text + dir + Environment.NewLine;
101 | }
102 | }
103 | catch { }
104 | }
105 |
106 | }
107 |
108 | private void TroubleshootingWindow_Loaded(object sender, RoutedEventArgs e)
109 | {
110 | /*
111 | try
112 | {
113 | Task.Factory.StartNew(() =>
114 | {
115 | string URL = "https://google.com";
116 | HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
117 | request.ContentType = "text/html";
118 | HttpWebResponse response = request.GetResponse() as HttpWebResponse;
119 | using (Stream responseStream = response.GetResponseStream())
120 | {
121 | StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
122 | MessageBox.Show(reader.ReadToEnd());
123 | }
124 |
125 | }).ContinueWith((task) =>
126 | {
127 | // do this on the UI thread once the task has finished..
128 | }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
129 | }
130 | catch (Exception ex) { MessageBox.Show(ex.Message); }
131 | */
132 | }
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/EasyJob/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "default_powershell_path": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
3 | "default_cmd_path": "C:\\Windows\\System32\\cmd.exe",
4 | "powershell_arguments": "",
5 | "console_background": "Black",
6 | "console_foreground": "White",
7 | "console_ignore_color_tags": false,
8 | "clear_events_when_reload": true,
9 | "restrictions": {
10 | "block_tabs_remove": false,
11 | "block_buttons_remove": false,
12 | "block_tabs_add": false,
13 | "block_buttons_add": false,
14 | "block_buttons_reorder": false,
15 | "block_buttons_edit": false,
16 | "block_tabs_rename": false,
17 | "block_buttons_paste": false,
18 | "block_buttons_copy": false,
19 | "hide_menu_item_file_reload_config": false,
20 | "hide_menu_item_file_open_app_folder": false,
21 | "hide_menu_item_file_clear_events_list": false,
22 | "hide_menu_item_settings": false,
23 | "hide_menu_item_settings_workflow": false,
24 | "hide_menu_item_settings_workflow_reorder_tabs": false,
25 | "hide_menu_item_settings_workflow_add_tab": false,
26 | "hide_menu_item_settings_workflow_remove_current_tab": false,
27 | "hide_menu_item_settings_workflow_rename_current_tab": false,
28 | "hide_menu_item_settings_workflow_add_button_to_current_tab": false,
29 | "hide_menu_item_settings_workflow_reorder_buttons_in_current_tab": false,
30 | "hide_menu_item_settings_configuration": false,
31 | "hide_menu_item_help": false,
32 | "hide_menu_item_help_troubleshooting": false,
33 | "hide_menu_item_help_colortags": false,
34 | "hide_menu_item_help_about": false
35 | },
36 | "tabs": [
37 | {
38 | "ID": "357f9827-f4f7-439f-b62c-792e880fd06c",
39 | "Header": "Common actions",
40 | "Buttons": [
41 | {
42 | "Id": "5e371407-140f-4fa2-abf3-2cec4bb174b2",
43 | "Text": "test01",
44 | "Description": "Some test script",
45 | "Script": "scripts\\common\\test01.ps1",
46 | "ScriptPathType": "relative",
47 | "ScriptType": "powershell",
48 | "Arguments": []
49 | },
50 | {
51 | "Id": "9159b485-39e5-42d6-adb4-275753db9027",
52 | "Text": "test02",
53 | "Description": "Some second test script",
54 | "Script": "scripts\\test02.ps1",
55 | "ScriptPathType": "relative",
56 | "ScriptType": "powershell",
57 | "Arguments": []
58 | },
59 | {
60 | "Id": "eaaff0bf-2a9f-4037-bdd6-e8405830d90e",
61 | "Text": "bat",
62 | "Description": "Some second test script",
63 | "Script": "scripts\\1.bat",
64 | "ScriptPathType": "relative",
65 | "ScriptType": "cmd",
66 | "Arguments": []
67 | },
68 | {
69 | "Id": "5ec086d9-7987-43ef-84fb-1d8481b05aea",
70 | "Text": "Absolute script",
71 | "Description": "",
72 | "Script": "C:\\scripts\\absolute_script.ps1",
73 | "ScriptPathType": "absolute",
74 | "ScriptType": "powershell",
75 | "Arguments": []
76 | },
77 | {
78 | "Id": "a7b94662-4d66-4a8a-af33-b326a99215cf",
79 | "Text": "test03",
80 | "Description": "Some test 03 script with arguments",
81 | "Script": "scripts\\common\\test03.ps1",
82 | "ScriptPathType": "relative",
83 | "ScriptType": "powershell",
84 | "Arguments": [
85 | {
86 | "ArgumentQuestion": "Enter IP address or DNS name",
87 | "ArgumentAnswer": ""
88 | }
89 | ]
90 | },
91 | {
92 | "Id": "aabc2bf5-e26c-4a73-8e89-e702f14eaa8b",
93 | "Text": "test04",
94 | "Description": "Some test 04 script with arguments",
95 | "Script": "scripts\\common\\test04.ps1",
96 | "ScriptPathType": "relative",
97 | "ScriptType": "powershell",
98 | "Arguments": [
99 | {
100 | "ArgumentQuestion": "What is your name?",
101 | "ArgumentAnswer": ""
102 | },
103 | {
104 | "ArgumentQuestion": "What is your surname",
105 | "ArgumentAnswer": ""
106 | },
107 | {
108 | "ArgumentQuestion": "No, really what is your name?",
109 | "ArgumentAnswer": ""
110 | }
111 | ]
112 | }
113 | ]
114 | },
115 | {
116 | "ID": "fa774e10-7772-4074-8d8e-c57b09e9377e",
117 | "Header": "Second Tab",
118 | "Buttons": [
119 | {
120 | "Id": "b3ebb860-7682-4613-8f82-0ca59226b0f9",
121 | "Text": "Some button",
122 | "Description": "no description",
123 | "Script": "scripts\\some_button_script.ps1",
124 | "ScriptPathType": "relative",
125 | "ScriptType": "powershell",
126 | "Arguments": []
127 | },
128 | {
129 | "Id": "f9fc3c8f-fb36-432d-96c9-09c4169d540e",
130 | "Text": "Test11",
131 | "Description": "no description",
132 | "Script": "scripts\\some_button_script2.ps1",
133 | "ScriptPathType": "relative",
134 | "ScriptType": "powershell",
135 | "Arguments": []
136 | }
137 | ]
138 | },
139 | {
140 | "ID": "a744a5e3-4dc0-4f42-abac-ee67dd17c6a1",
141 | "Header": "Third Tab",
142 | "Buttons": [
143 | {
144 | "Id": "5839ed21-7c33-4aac-9b3c-663cc794e3f5",
145 | "Text": "Some button 1",
146 | "Description": "no description",
147 | "Script": "scripts\\some_button_script.ps1",
148 | "ScriptPathType": "relative",
149 | "ScriptType": "powershell",
150 | "Arguments": []
151 | },
152 | {
153 | "Id": "7ecdea7a-8865-45d7-a037-0dd4dd1cb996",
154 | "Text": "Button asd",
155 | "Description": "",
156 | "Script": "D:\\net50\\test04.ps1",
157 | "ScriptPathType": "absolute",
158 | "ScriptType": "powershell",
159 | "Arguments": []
160 | }
161 | ]
162 | }
163 | ]
164 | }
--------------------------------------------------------------------------------
/EasyJobPSTools/EasyJobPSTools.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}
8 | Library
9 | EasyJobPSTools
10 | EasyJobPSTools
11 | v4.8
12 | 512
13 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
14 | 4
15 | true
16 |
17 |
18 |
19 |
20 |
21 | AnyCPU
22 | true
23 | full
24 | false
25 | ..\bin\Debug\EasyJobPSTools\
26 | DEBUG;TRACE
27 | prompt
28 | 4
29 | false
30 |
31 |
32 | AnyCPU
33 | pdbonly
34 | true
35 | ..\bin\Release\EasyJobPSTools\
36 | TRACE
37 | prompt
38 | 4
39 | false
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | 4.0
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | Code
64 |
65 |
66 | True
67 | True
68 | Resources.resx
69 |
70 |
71 | True
72 | Settings.settings
73 | True
74 |
75 |
76 |
77 | ShowEJInputBox.xaml
78 |
79 |
80 | ResXFileCodeGenerator
81 | Resources.Designer.cs
82 |
83 |
84 |
85 | Always
86 |
87 |
88 | SettingsSingleFileGenerator
89 | Settings.Designer.cs
90 |
91 |
92 |
93 |
94 | Designer
95 | MSBuild:Compile
96 |
97 |
98 |
99 |
100 | 0.9.4
101 |
102 |
103 | 4.7.0
104 |
105 |
106 | 4.5.0
107 |
108 |
109 |
110 |
111 | Always
112 |
113 |
114 |
115 |
--------------------------------------------------------------------------------
/EasyJobPSTools/EasyJobPSTools.psd1:
--------------------------------------------------------------------------------
1 | # Module manifest for module 'EasyJobPSTools'
2 | # Generated by: Akshin Mustafayev
3 | # Generated on: 10/8/2021
4 |
5 | @{
6 |
7 | # Script module or binary module file associated with this manifest.
8 | RootModule = 'EasyJobPSTools.psm1'
9 |
10 | # Version number of this module.
11 | ModuleVersion = '1.0'
12 |
13 | # ID used to uniquely identify this module
14 | GUID = 'd6c56376-ae08-4c23-b901-9bc75144e0c6'
15 |
16 | # Author of this module
17 | Author = 'Akshin Mustafayev'
18 |
19 | # Company or vendor of this module
20 | CompanyName = 'Akshin Mustafayev'
21 |
22 | # Copyright statement for this module
23 | Copyright = '(c) 2021 Akshin Mustafayev. GNU Affero General Public License v3.0.'
24 |
25 | # Description of the functionality provided by this module
26 | Description = 'Module for implementing EasyJob additional helper functions'
27 |
28 | # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
29 | FunctionsToExport = 'Show-EJInputBox', 'Show-EJSelectFileWindow', 'Show-EJSelectFolderWindow'
30 |
31 | }
--------------------------------------------------------------------------------
/EasyJobPSTools/EasyJobPSTools.psm1:
--------------------------------------------------------------------------------
1 | Add-Type -Path "$PSScriptRoot\ModernWpf.dll"
2 | Add-Type -Path "$PSScriptRoot\EasyJobPSTools.dll"
3 |
4 | function Show-EJInputBox {
5 | <#
6 | .SYNOPSIS
7 | Shows Input-Box for you script.
8 |
9 | .DESCRIPTION
10 | Shows Input-Box for you script. This might be necessary
11 | when you want to get some input while executing your script,
12 | since EasyJob does not support Read from console.
13 |
14 | .PARAMETER Header
15 | Specifies Title for input box.
16 |
17 | .PARAMETER Text
18 | Specifies Text for the input box.
19 |
20 | .PARAMETER AllowEmptyResult
21 | Specifies if user can not enter any text and press OK.
22 |
23 | .INPUTS
24 | None.
25 |
26 | .OUTPUTS
27 | String value of the input from the box.
28 |
29 | .EXAMPLE
30 | C:\PS> $Result = Show-EJInputBox -Header "Specify your name" -Text "What is your name?" -AllowEmptyResult $false
31 | C:\PS> Write-Host "Your name is $Result"
32 | Your name is test
33 |
34 | .LINK
35 | https://github.com/akshinmustafayev/EasyJobPSTools
36 | https://github.com/akshinmustafayev/EasyJob
37 | #>
38 |
39 | param (
40 | [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()] [string]$Header,
41 | [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()] [string]$Text,
42 | [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()] $AllowEmptyResult
43 | )
44 |
45 | $Result = [EasyJobPSTools.Program]::ShowEJInputBoxWindow($Header, $Text, $AllowEmptyResult)
46 | return $Result
47 | }
48 |
49 | function Show-EJSelectFileWindow {
50 | <#
51 | .SYNOPSIS
52 | Shows select file Window and returns selected file path.
53 |
54 | .DESCRIPTION
55 | Shows select file Window. This might be necessary
56 | when you want to get selected file path and use it
57 | in your script.
58 |
59 | .PARAMETER FileType
60 | Specifies File type which you would like for user to select.
61 | This parameter may be empty. If it is empty then any file type is espected
62 |
63 | .INPUTS
64 | None.
65 |
66 | .OUTPUTS
67 | String path value of the selected file.
68 |
69 | .EXAMPLE
70 | C:\PS> $Result = Show-EJSelectFileWindow
71 | D:\temp\excel_list.xlsx
72 |
73 | .EXAMPLE
74 | C:\PS> $Result = Show-EJSelectFileWindow -FileType "txt files (*.txt)|*.txt|All files (*.*)|*.*"
75 | D:\temp\testfile.txt
76 |
77 | .LINK
78 | https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.filedialog.filter?view=windowsdesktop-5.0#System_Windows_Forms_FileDialog_Filter
79 | https://github.com/akshinmustafayev/EasyJobPSTools
80 | https://github.com/akshinmustafayev/EasyJob
81 | #>
82 |
83 | param (
84 | [Parameter(Mandatory = $false)] [string]$FileType
85 | )
86 |
87 | if($null -eq $FileType){
88 | $Result = [EasyJobPSTools.Program]::ShowEJSelectFileWindow()
89 | return $Result
90 | }
91 | else{
92 | $Result = [EasyJobPSTools.Program]::ShowEJSelectFileWindow($FileType)
93 | return $Result
94 | }
95 | }
96 |
97 | function Show-EJSelectFolderWindow {
98 | <#
99 | .SYNOPSIS
100 | Shows select folder Window and returns selected folder path.
101 |
102 | .DESCRIPTION
103 | Shows select folder Window. This might be necessary
104 | when you want to get selected folder path and use it
105 | in your script.
106 |
107 | .INPUTS
108 | None.
109 |
110 | .OUTPUTS
111 | String path value of the selected folder.
112 |
113 | .EXAMPLE
114 | C:\PS> $Result = Show-EJSelectFolderWindow
115 | D:\temp\
116 |
117 | .LINK
118 | https://github.com/akshinmustafayev/EasyJobPSTools
119 | https://github.com/akshinmustafayev/EasyJob
120 | #>
121 |
122 | $Result = [EasyJobPSTools.Program]::ShowEJSelectFolderWindow()
123 | return $Result
124 | }
125 |
--------------------------------------------------------------------------------
/EasyJobPSTools/EasyJobPSTools.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.31624.102
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyJobPSTools", "EasyJobPSTools.csproj", "{D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {D4CD0099-4071-4516-8ADC-95ADCD8A7A4C}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {0D0B0E81-ED08-435B-82D0-A80FABEA9637}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Program.cs:
--------------------------------------------------------------------------------
1 | using EasyJobPSTools.Windows;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using System.Windows.Forms;
8 |
9 | namespace EasyJobPSTools
10 | {
11 | public class Program
12 | {
13 | public static string ShowEJInputBoxWindow(string Header, string Text, bool AllowEmptyResult)
14 | {
15 | ShowEJInputBox sejib = new ShowEJInputBox(Header, Text, AllowEmptyResult);
16 | if (sejib.ShowDialog() == true)
17 | {
18 | return sejib.windowResult;
19 | }
20 | else
21 | {
22 | return "";
23 | }
24 | }
25 |
26 | public static string ShowEJSelectFileWindow()
27 | {
28 | OpenFileDialog ofd = new OpenFileDialog();
29 | if (ofd.ShowDialog() == DialogResult.OK)
30 | {
31 | return ofd.FileName;
32 | }
33 | else
34 | {
35 | return "";
36 | }
37 | }
38 |
39 | public static string ShowEJSelectFileWindow(string fileType)
40 | {
41 | OpenFileDialog ofd = new OpenFileDialog();
42 | ofd.Filter = fileType;
43 | if (ofd.ShowDialog() == DialogResult.OK)
44 | {
45 | return ofd.FileName;
46 | }
47 | else
48 | {
49 | return "";
50 | }
51 | }
52 |
53 | public static string ShowEJSelectFolderWindow()
54 | {
55 | using (var fbd = new FolderBrowserDialog())
56 | {
57 | DialogResult result = fbd.ShowDialog();
58 |
59 | if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
60 | {
61 | return fbd.SelectedPath;
62 | }
63 | else
64 | {
65 | return "";
66 | }
67 | }
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // General Information about an assembly is controlled through the following
8 | // set of attributes. Change these attribute values to modify the information
9 | // associated with an assembly.
10 | [assembly: AssemblyTitle("EasyJobPSTools")]
11 | [assembly: AssemblyDescription("PowerShell tools for the EasyJob")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("Akshin Mustafayev")]
14 | [assembly: AssemblyProduct("EasyJobPSTools")]
15 | [assembly: AssemblyCopyright("Copyright © 2021")]
16 | [assembly: AssemblyTrademark("Akshin Mustafayev")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Setting ComVisible to false makes the types in this assembly not visible
20 | // to COM components. If you need to access a type in this assembly from
21 | // COM, set the ComVisible attribute to true on that type.
22 | [assembly: ComVisible(true)]
23 |
24 | //In order to begin building localizable applications, set
25 | //CultureYouAreCodingWith in your .csproj file
26 | //inside a . For example, if you are using US english
27 | //in your source files, set the to en-US. Then uncomment
28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
29 | //the line below to match the UICulture setting in the project file.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
36 | //(used if a resource is not found in the page,
37 | // or application resource dictionaries)
38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
39 | //(used if a resource is not found in the page,
40 | // app, or any theme specific resource dictionaries)
41 | )]
42 |
43 |
44 | // Version information for an assembly consists of the following four values:
45 | //
46 | // Major Version
47 | // Minor Version
48 | // Build Number
49 | // Revision
50 | //
51 | // You can specify all the values or you can default the Build and Revision Numbers
52 | // by using the '*' as shown below:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.0.1.0")]
55 | [assembly: AssemblyFileVersion("1.0.1.0")]
56 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace EasyJobPSTools.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EasyJobPSTools.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace EasyJobPSTools.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Utils/CommonUtils.cs:
--------------------------------------------------------------------------------
1 | using ModernWpf;
2 | using ModernWpf.Controls;
3 | using System.Windows;
4 |
5 | namespace EasyJobPSTools.Utils
6 | {
7 | public class CommonUtils
8 | {
9 | public static void FixModernWpfUI()
10 | {
11 | if (Application.Current is null)
12 | {
13 | var app = new Application { ShutdownMode = ShutdownMode.OnExplicitShutdown };
14 |
15 | var themeResources = new ThemeResources();
16 | themeResources.BeginInit();
17 | app.Resources.MergedDictionaries.Add(themeResources);
18 | themeResources.EndInit();
19 |
20 | app.Resources.MergedDictionaries.Add(new XamlControlsResources());
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Windows/ShowEJInputBox.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/EasyJobPSTools/Windows/ShowEJInputBox.xaml.cs:
--------------------------------------------------------------------------------
1 | using EasyJobPSTools.Utils;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 | using System.Windows.Controls;
9 | using System.Windows.Data;
10 | using System.Windows.Documents;
11 | using System.Windows.Input;
12 | using System.Windows.Media;
13 | using System.Windows.Media.Imaging;
14 | using System.Windows.Shapes;
15 |
16 | namespace EasyJobPSTools.Windows
17 | {
18 | ///
19 | /// Interaction logic for ShowEJInputBox.xaml
20 | ///
21 | public partial class ShowEJInputBox : Window
22 | {
23 | private string _Header;
24 | private string _Text;
25 | private bool _AllowEmptyResult;
26 | public string windowResult = "";
27 |
28 | public ShowEJInputBox(string Header, string Text, bool AllowEmptyResult)
29 | {
30 | CommonUtils.FixModernWpfUI();
31 | InitializeComponent();
32 |
33 | FormError.Visibility = Visibility.Collapsed;
34 |
35 | _Header = Header;
36 | _Text = Text;
37 | _AllowEmptyResult = AllowEmptyResult;
38 |
39 | this.Title = Header;
40 | FormText.Text = Text;
41 | }
42 |
43 | private void OKButton_Click(object sender, RoutedEventArgs e)
44 | {
45 | if (FormAnswer.Text.Length == 0 && _AllowEmptyResult == false)
46 | {
47 | FormError.Text = "Please input value";
48 | FormError.Visibility = Visibility.Visible;
49 | }
50 | else
51 | {
52 | windowResult = FormAnswer.Text;
53 | DialogResult = true;
54 | }
55 | }
56 |
57 | private void CancelButton_Click(object sender, RoutedEventArgs e)
58 | {
59 | DialogResult = false;
60 | }
61 |
62 | private void FormAnswer_TextChanged(object sender, TextChangedEventArgs e)
63 | {
64 | if (_AllowEmptyResult == false)
65 | {
66 | if(FormAnswer.Text.Length > 0 && FormError.Visibility == Visibility.Visible)
67 | {
68 | FormError.Visibility = Visibility.Collapsed;
69 | }
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/EasyJobPSTools/app.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/WpfRichText/AttachedProperties/RichTextboxAssistant.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using System.Windows;
5 | using System.Windows.Documents;
6 | using System.Windows.Controls;
7 | using System.IO;
8 | using System.Windows.Input;
9 | using System.Windows.Markup;
10 | using System.Windows.Data;
11 |
12 | namespace WpfRichText
13 | {
14 | ///
15 | public static class RichTextBoxAssistant
16 | {
17 | ///
18 | public static readonly DependencyProperty BoundDocument =
19 | DependencyProperty.RegisterAttached("BoundDocument", typeof(string), typeof(RichTextBoxAssistant),
20 | new FrameworkPropertyMetadata(null,
21 | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
22 | OnBoundDocumentChanged)
23 | );
24 |
25 | private static void OnBoundDocumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
26 | {
27 | RichTextBox box = d as RichTextBox;
28 |
29 | if (box == null)
30 | return;
31 |
32 | RemoveEventHandler(box);
33 |
34 | string newXAML = GetBoundDocument(d);
35 |
36 | box.Document.Blocks.Clear();
37 |
38 | if (!string.IsNullOrEmpty(newXAML))
39 | {
40 | using (MemoryStream xamlMemoryStream = new MemoryStream(Encoding.UTF8.GetBytes(newXAML)))
41 | {
42 | ParserContext parser = new ParserContext();
43 | parser.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
44 | parser.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
45 | //FlowDocument doc = new FlowDocument();
46 | Section section = XamlReader.Load(xamlMemoryStream, parser) as Section;
47 |
48 | box.Document.Blocks.Add(section);
49 |
50 | }
51 | }
52 |
53 | AttachEventHandler(box);
54 |
55 | }
56 |
57 | private static void RemoveEventHandler(RichTextBox box)
58 | {
59 | Binding binding = BindingOperations.GetBinding(box, BoundDocument);
60 |
61 | if (binding != null)
62 | {
63 | if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default ||
64 | binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus)
65 | {
66 |
67 | box.LostFocus -= HandleLostFocus;
68 | }
69 | else
70 | {
71 | box.TextChanged -= HandleTextChanged;
72 | }
73 | }
74 | }
75 |
76 | private static void AttachEventHandler(RichTextBox box)
77 | {
78 | Binding binding = BindingOperations.GetBinding(box, BoundDocument);
79 |
80 | if (binding != null)
81 | {
82 | if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default ||
83 | binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus)
84 | {
85 |
86 | box.LostFocus += HandleLostFocus;
87 | }
88 | else
89 | {
90 | box.TextChanged += HandleTextChanged;
91 | }
92 | }
93 | }
94 |
95 | private static void HandleLostFocus(object sender, RoutedEventArgs e)
96 | {
97 | RichTextBox box = sender as RichTextBox;
98 |
99 | TextRange tr = new TextRange(box.Document.ContentStart, box.Document.ContentEnd);
100 |
101 | using (MemoryStream ms = new MemoryStream())
102 | {
103 | tr.Save(ms, DataFormats.Xaml);
104 | string xamlText = Encoding.UTF8.GetString(ms.ToArray());
105 | SetBoundDocument(box, xamlText);
106 | }
107 | }
108 |
109 | private static void HandleTextChanged(object sender, RoutedEventArgs e)
110 | {
111 | // TODO: TextChanged is currently not working!
112 | RichTextBox box = sender as RichTextBox;
113 |
114 | TextRange tr = new TextRange(box.Document.ContentStart,
115 | box.Document.ContentEnd);
116 |
117 | using (MemoryStream ms = new MemoryStream())
118 | {
119 | tr.Save(ms, DataFormats.Xaml);
120 | string xamlText = Encoding.UTF8.GetString(ms.ToArray());
121 | SetBoundDocument(box, xamlText);
122 | }
123 | }
124 |
125 | ///
126 | ///
127 | ///
128 | ///
129 | ///
130 | public static string GetBoundDocument(DependencyObject dependencyObject)
131 | {
132 | if (dependencyObject != null)
133 | {
134 | var html = dependencyObject.GetValue(BoundDocument) as string;
135 | var xaml = string.Empty;
136 |
137 | if (!string.IsNullOrEmpty(html))
138 | xaml = HtmlToXamlConverter.ConvertHtmlToXaml(html, false);
139 |
140 | return xaml;
141 | }
142 | return string.Empty;
143 | }
144 | ///
145 | ///
146 | ///
147 | ///
148 | ///
149 | public static void SetBoundDocument(DependencyObject dependencyObject, string value)
150 | {
151 | if (dependencyObject != null)
152 | {
153 | var xaml = value;
154 | var html = HtmlFromXamlConverter.ConvertXamlToHtml(xaml, false);
155 | dependencyObject.SetValue(BoundDocument, html);
156 | }
157 | }
158 | }
159 |
160 |
161 | }
--------------------------------------------------------------------------------
/WpfRichText/Commands/CommandReference.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows;
3 | using System.Windows.Input;
4 |
5 | namespace WpfRichText
6 | {
7 | ///
8 | /// This class facilitates associating a key binding in XAML markup to a command
9 | /// defined in a View Model by exposing a Command dependency property.
10 | /// The class derives from Freezable to work around a limitation in WPF when data-binding from XAML.
11 | ///
12 | public class CommandReference : Freezable, ICommand
13 | {
14 | ///
15 | public CommandReference()
16 | {
17 | // Blank
18 | }
19 |
20 | ///
21 | public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));
22 |
23 | ///
24 | public ICommand Command
25 | {
26 | get { return (ICommand)GetValue(CommandProperty); }
27 | set { SetValue(CommandProperty, value); }
28 | }
29 |
30 | #region ICommand Members
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | public bool CanExecute(object parameter)
37 | {
38 | if (Command != null)
39 | return Command.CanExecute(parameter);
40 | return false;
41 | }
42 | ///
43 | ///
44 | ///
45 | ///
46 | public void Execute(object parameter)
47 | {
48 | Command.Execute(parameter);
49 | }
50 | ///
51 | ///
52 | ///
53 | public event EventHandler CanExecuteChanged;
54 |
55 | private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
56 | {
57 | CommandReference commandReference = d as CommandReference;
58 | ICommand oldCommand = e.OldValue as ICommand;
59 | ICommand newCommand = e.NewValue as ICommand;
60 |
61 | if (oldCommand != null)
62 | {
63 | oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
64 | }
65 | if (newCommand != null)
66 | {
67 | newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
68 | }
69 | }
70 |
71 | #endregion
72 |
73 | #region Freezable
74 | ///
75 | ///
76 | ///
77 | ///
78 | protected override Freezable CreateInstanceCore()
79 | {
80 | throw new NotImplementedException();
81 | }
82 |
83 | #endregion
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/WpfRichText/Controls/RichTextEditor.xaml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/WpfRichText/Controls/RichTextEditor.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Collections.ObjectModel;
4 | using System.Globalization;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Windows;
8 | using System.Windows.Controls;
9 | using System.Windows.Data;
10 | using System.Windows.Documents;
11 | using System.Windows.Input;
12 | using System.Windows.Media;
13 | using System.Windows.Media.Imaging;
14 | using System.Windows.Navigation;
15 | using System.Windows.Shapes;
16 |
17 | namespace WpfRichText
18 | {
19 | ///
20 | /// Interaction logic for BindableRichTextbox.xaml
21 | ///
22 | public partial class RichTextEditor : UserControl
23 | {
24 | ///
25 | public static readonly DependencyProperty TextProperty =
26 | DependencyProperty.Register("Text", typeof(string), typeof(RichTextEditor),
27 | new PropertyMetadata(string.Empty));
28 |
29 | ///
30 | public RichTextEditor()
31 | {
32 | InitializeComponent();
33 | }
34 |
35 | ///
36 | public string Text
37 | {
38 | get { return GetValue(TextProperty) as string; }
39 | set
40 | {
41 | SetValue(TextProperty, value);
42 | }
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/WpfRichText/WpfRichText.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | net5.0-windows
4 | Library
5 |
6 |
7 |
8 |
9 | false
10 | true
11 | true
12 |
13 |
14 |
15 | false
16 | Auto
17 | ..\bin\Debug\
18 |
19 |
20 |
21 | false
22 | ..\bin\Release\
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/WpfRichText/WpfRichText.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.31624.102
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfRichText", "WpfRichText\WpfRichText.csproj", "{78147C43-DB7B-4571-BC7A-E7F0075B4B78}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Debug|Mixed Platforms = Debug|Mixed Platforms
12 | Debug|x86 = Debug|x86
13 | Release|Any CPU = Release|Any CPU
14 | Release|Mixed Platforms = Release|Mixed Platforms
15 | Release|x86 = Release|x86
16 | EndGlobalSection
17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
18 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
19 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Debug|Any CPU.Build.0 = Debug|Any CPU
20 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
21 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
22 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Debug|x86.ActiveCfg = Debug|Any CPU
23 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Release|Any CPU.ActiveCfg = Release|Any CPU
24 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Release|Any CPU.Build.0 = Release|Any CPU
25 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
26 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Release|Mixed Platforms.Build.0 = Release|Any CPU
27 | {78147C43-DB7B-4571-BC7A-E7F0075B4B78}.Release|x86.ActiveCfg = Release|Any CPU
28 | EndGlobalSection
29 | GlobalSection(SolutionProperties) = preSolution
30 | HideSolutionNode = FALSE
31 | EndGlobalSection
32 | GlobalSection(ExtensibilityGlobals) = postSolution
33 | SolutionGuid = {1ADBABE2-7721-42E2-AE94-7B66D165C486}
34 | EndGlobalSection
35 | EndGlobal
36 |
--------------------------------------------------------------------------------
/WpfRichText/XamlToHtmlParser/HtmlTokenType.cs:
--------------------------------------------------------------------------------
1 | //---------------------------------------------------------------------------
2 | //
3 | // File: HtmlTokenType.cs
4 | //
5 | // Copyright (C) Microsoft Corporation. All rights reserved.
6 | //
7 | // Description: Definition of token types supported by HtmlLexicalAnalyzer
8 | //
9 | //---------------------------------------------------------------------------
10 |
11 | namespace WpfRichText
12 | {
13 | ///
14 | /// types of lexical tokens for html-to-xaml converter
15 | ///
16 | internal enum HtmlTokenType
17 | {
18 | OpeningTagStart,
19 | ClosingTagStart,
20 | TagEnd,
21 | EmptyTagEnd,
22 | EqualSign,
23 | Name,
24 | Atom, // any attribute value not in quotes
25 | Text, //text content when accepting text
26 | Comment,
27 | EOF,
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/assets/icon.png
--------------------------------------------------------------------------------
/ej/build/build1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/build/build1.PNG
--------------------------------------------------------------------------------
/ej/build/build2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/build/build2.PNG
--------------------------------------------------------------------------------
/ej/color_tags/tag01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag01.png
--------------------------------------------------------------------------------
/ej/color_tags/tag02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag02.png
--------------------------------------------------------------------------------
/ej/color_tags/tag03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag03.png
--------------------------------------------------------------------------------
/ej/color_tags/tag04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag04.png
--------------------------------------------------------------------------------
/ej/color_tags/tag05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag05.png
--------------------------------------------------------------------------------
/ej/color_tags/tag06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag06.png
--------------------------------------------------------------------------------
/ej/color_tags/tag07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag07.png
--------------------------------------------------------------------------------
/ej/color_tags/tag08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag08.png
--------------------------------------------------------------------------------
/ej/color_tags/tag09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag09.png
--------------------------------------------------------------------------------
/ej/color_tags/tag10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag10.png
--------------------------------------------------------------------------------
/ej/color_tags/tag11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag11.png
--------------------------------------------------------------------------------
/ej/color_tags/tag12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag12.png
--------------------------------------------------------------------------------
/ej/color_tags/tag13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag13.png
--------------------------------------------------------------------------------
/ej/color_tags/tag14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/color_tags/tag14.png
--------------------------------------------------------------------------------
/ej/feature1_1_9_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/feature1_1_9_0.png
--------------------------------------------------------------------------------
/ej/feature2_1_1_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/feature2_1_1_5.png
--------------------------------------------------------------------------------
/ej/feature3_1_1_9_0.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/feature3_1_1_9_0.PNG
--------------------------------------------------------------------------------
/ej/main_window1_1_1_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/main_window1_1_1_5.png
--------------------------------------------------------------------------------
/ej/main_window2_1_1_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/main_window2_1_1_4.png
--------------------------------------------------------------------------------
/ej/main_window3_1_1_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/main_window3_1_1_4.png
--------------------------------------------------------------------------------
/ej/troubleshooting1_1_0_9_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/akshinmustafayev/EasyJob/2469fe858a77b467afab3dd451cfa56df56d3fbb/ej/troubleshooting1_1_0_9_0.png
--------------------------------------------------------------------------------