811 lines
33 KiB
C#
811 lines
33 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Windows.Forms;
|
|
using SebWindowsConfig.Entities;
|
|
using SebWindowsConfig.Utilities;
|
|
using DictObj = System.Collections.Generic.Dictionary<string, object>;
|
|
using ListObj = System.Collections.Generic.List<object>;
|
|
|
|
namespace SebWindowsConfig.Controls
|
|
{
|
|
public partial class AdditionalResources : UserControl
|
|
{
|
|
private IFileCompressor _fileCompressor;
|
|
private SEBURLFilter urlFilter;
|
|
|
|
|
|
public AdditionalResources()
|
|
{
|
|
InitializeComponent();
|
|
|
|
_fileCompressor = new FileCompressor();
|
|
|
|
groupBoxAdditionalResourceDetails.Visible = false;
|
|
|
|
SEBSettings.additionalResourcesList = (ListObj)SEBSettings.settingsCurrent[SEBSettings.KeyAdditionalResources];
|
|
textBoxAdditionalResourcesTitle.Text = "";
|
|
treeViewAdditionalResources.Nodes.Clear();
|
|
foreach (DictObj l0Resource in SEBSettings.additionalResourcesList)
|
|
{
|
|
var l0Node = treeViewAdditionalResources.Nodes.Add(l0Resource[SEBSettings.KeyAdditionalResourcesIdentifier].ToString(), GetDisplayTitle(l0Resource));
|
|
foreach (DictObj l1Resource in (ListObj)l0Resource[SEBSettings.KeyAdditionalResources])
|
|
{
|
|
var l1Node = l0Node.Nodes.Add(l1Resource[SEBSettings.KeyAdditionalResourcesIdentifier].ToString(), GetDisplayTitle(l1Resource));
|
|
foreach (DictObj l2Resource in (ListObj)l1Resource[SEBSettings.KeyAdditionalResources])
|
|
{
|
|
l1Node.Nodes.Add(l2Resource[SEBSettings.KeyAdditionalResourcesIdentifier].ToString(), GetDisplayTitle(l2Resource));
|
|
}
|
|
}
|
|
}
|
|
|
|
urlFilter = new SEBURLFilter();
|
|
}
|
|
|
|
private string GetDisplayTitle(DictObj resource)
|
|
{
|
|
return string.Concat(
|
|
resource[SEBSettings.KeyAdditionalResourcesTitle],
|
|
(bool) resource[SEBSettings.KeyAdditionalResourcesActive] ? "" : " (inactive)",
|
|
(bool) resource[SEBSettings.KeyAdditionalResourcesAutoOpen] ? " (A)" : "",
|
|
resource.ContainsKey(SEBSettings.KeyAdditionalResourcesShowButton) ? (bool) resource[SEBSettings.KeyAdditionalResourcesShowButton] ? " (B)" : "" : "",
|
|
!string.IsNullOrEmpty((string)resource[SEBSettings.KeyAdditionalResourcesResourceData]) ? " (E)" : "",
|
|
!string.IsNullOrEmpty((string)resource[SEBSettings.KeyAdditionalResourcesUrl]) ? " (U)" : "");
|
|
}
|
|
|
|
private void buttonAdditionalResourcesAdd_Click(object sender, EventArgs e)
|
|
{
|
|
// Get the process list
|
|
SEBSettings.additionalResourcesList = (ListObj)SEBSettings.settingsCurrent[SEBSettings.KeyAdditionalResources];
|
|
|
|
int newIndex = treeViewAdditionalResources.Nodes.Count;
|
|
SEBSettings.additionalResourcesList.Insert(newIndex, CreateNewResource(newIndex.ToString()));
|
|
|
|
treeViewAdditionalResources.SelectedNode = treeViewAdditionalResources.Nodes.Add(newIndex.ToString(), "New Resource");
|
|
treeViewAdditionalResources.Focus();
|
|
}
|
|
|
|
private DictObj CreateNewResource(string identifier)
|
|
{
|
|
DictObj resourceData = new DictObj();
|
|
resourceData[SEBSettings.KeyAdditionalResourcesIdentifier] = identifier;
|
|
return SetDefaultValuesOnResource(resourceData);
|
|
}
|
|
|
|
private void buttonAdditionalResourcesAddSubResource_Click(object sender, EventArgs e)
|
|
{
|
|
var node = treeViewAdditionalResources.SelectedNode;
|
|
if (node == null)
|
|
{
|
|
MessageBox.Show("No node selected");
|
|
return;
|
|
}
|
|
if (node.Level == 2)
|
|
{
|
|
MessageBox.Show("Maximum 3 levels");
|
|
return;
|
|
}
|
|
|
|
var selectedResource = GetSelectedResource();
|
|
ListObj resourceList = (ListObj)selectedResource[SEBSettings.KeyAdditionalResources];
|
|
|
|
var newIndex = node.Nodes.Count;
|
|
if (node.Level == 0)
|
|
{
|
|
resourceList.Add(CreateNewResource(node.Index + "." + newIndex));
|
|
treeViewAdditionalResources.SelectedNode = treeViewAdditionalResources.SelectedNode.Nodes.Add(node.Index + "." + newIndex, "New Resource");
|
|
}
|
|
if (node.Level == 1)
|
|
{
|
|
resourceList.Add(CreateNewResource(node.Parent.Index + "." + node.Index + "." + newIndex));
|
|
treeViewAdditionalResources.SelectedNode = treeViewAdditionalResources.SelectedNode.Nodes.Add(node.Parent.Index + "." + node.Index + "." + newIndex, "New Resource");
|
|
}
|
|
treeViewAdditionalResources.Focus();
|
|
}
|
|
|
|
private void treeViewAdditionalResources_AfterSelect(object sender, TreeViewEventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
if (selectedResource != null)
|
|
{
|
|
textBoxAdditionalResourcesTitle.Text = (string)selectedResource[SEBSettings.KeyAdditionalResourcesTitle];
|
|
checkBoxAdditionalResourceActive.Checked = (bool)selectedResource[SEBSettings.KeyAdditionalResourcesActive];
|
|
textBoxAdditionalResourceUrl.Text = (string)selectedResource[SEBSettings.KeyAdditionalResourcesUrl];
|
|
checkBoxAdditionalResourceAutoOpen.Checked = (bool)selectedResource[SEBSettings.KeyAdditionalResourcesAutoOpen];
|
|
textBoxLinkURL.Text = (string)selectedResource[SEBSettings.KeyAdditionalResourcesLinkUrl];
|
|
textBoxRefererFilter.Text = (string) selectedResource[SEBSettings.KeyAdditionalResourcesRefererFilter];
|
|
checkBoxResetSession.Checked = (bool) selectedResource[SEBSettings.KeyAdditionalResourcesResetSession];
|
|
textBoxKey.Text = (string) selectedResource[SEBSettings.KeyAdditionalResourcesKey];
|
|
checkBoxConfirm.Checked = (bool)selectedResource[SEBSettings.KeyAdditionalResourcesConfirm];
|
|
textBoxConfirmBoxText.Text = (string) selectedResource[SEBSettings.KeyAdditionalResourcesConfirmText];
|
|
checkBoxShowButton.Checked = (bool) selectedResource[SEBSettings.KeyAdditionalResourcesShowButton];
|
|
|
|
comboBoxModifiers.SelectedItem = string.IsNullOrEmpty((string) selectedResource[SEBSettings.KeyAdditionalResourcesModifiers]) ? null : (string)selectedResource[SEBSettings.KeyAdditionalResourcesModifiers];
|
|
|
|
InitializeUrlFilters(selectedResource);
|
|
|
|
if (!string.IsNullOrEmpty((string)selectedResource[SEBSettings.KeyAdditionalResourcesResourceData]))
|
|
{
|
|
buttonAdditionalResourceRemoveResourceData.Visible = true;
|
|
buttonAdditionalResourceEmbededResourceOpen.Visible = true;
|
|
labelAdditionalResourcesResourceDataLaunchWith.Visible = true;
|
|
labelAdditionalResourcesFilename.Visible = true;
|
|
comboBoxAdditionalResourcesResourceDataLauncher.Visible = true;
|
|
textBoxAdditionalResourceUrl.Enabled = false;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Visible = true;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Enabled = false;
|
|
|
|
var indexBefore = (int) selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataLauncher];
|
|
comboBoxAdditionalResourcesResourceDataLauncher.DataSource = GetLaunchers();
|
|
comboBoxAdditionalResourcesResourceDataLauncher.SelectedIndex = indexBefore;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Text =
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataFilename].ToString();
|
|
}
|
|
else
|
|
{
|
|
buttonAdditionalResourceRemoveResourceData.Visible = false;
|
|
buttonAdditionalResourceEmbededResourceOpen.Visible = false;
|
|
labelAdditionalResourcesResourceDataLaunchWith.Visible = false;
|
|
labelAdditionalResourcesFilename.Visible = false;
|
|
comboBoxAdditionalResourcesResourceDataLauncher.Visible = false;
|
|
textBoxAdditionalResourceUrl.Enabled = true;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Visible = false;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty((string) selectedResource[SEBSettings.KeyAdditionalResourcesUrl]))
|
|
{
|
|
buttonAdditionalResourceChooseEmbededResource.Enabled = false;
|
|
}
|
|
else
|
|
{
|
|
buttonAdditionalResourceChooseEmbededResource.Enabled = true;
|
|
}
|
|
|
|
if (((ListObj) selectedResource[SEBSettings.KeyAdditionalResourcesResourceIcons]).Count > 0)
|
|
{
|
|
var icon =
|
|
(DictObj) ((ListObj) selectedResource[SEBSettings.KeyAdditionalResourcesResourceIcons])[0];
|
|
var memoryStream =
|
|
_fileCompressor.DeCompressAndDecode(
|
|
(string) icon[SEBSettings.KeyAdditionalResourcesResourceIconsIconData]);
|
|
var image = Image.FromStream(memoryStream);
|
|
pictureBoxAdditionalResourceIcon.Image = image;
|
|
}
|
|
else
|
|
{
|
|
pictureBoxAdditionalResourceIcon.Image = null;
|
|
}
|
|
|
|
}
|
|
groupBoxAdditionalResourceDetails.Visible = selectedResource != null;
|
|
}
|
|
|
|
public void InitializeUrlFilters(DictObj resourceConfig)
|
|
{
|
|
var filterControl = new FilterRuleControl();
|
|
|
|
if (resourceConfig.ContainsKey(SEBSettings.KeyURLFilterRules))
|
|
{
|
|
foreach (DictObj config in resourceConfig[SEBSettings.KeyURLFilterRules] as ListObj)
|
|
{
|
|
var rule = FilterRule.FromConfig(config);
|
|
|
|
filterControl.AddRule(rule);
|
|
}
|
|
}
|
|
|
|
filterControl.Dock = DockStyle.Fill;
|
|
filterControl.DataChanged += (rules) =>
|
|
{
|
|
var configs = new ListObj();
|
|
|
|
foreach (var rule in rules)
|
|
{
|
|
var config = FilterRule.ToConfig(rule);
|
|
|
|
configs.Add(config);
|
|
}
|
|
|
|
resourceConfig[SEBSettings.KeyURLFilterRules] = configs;
|
|
};
|
|
|
|
UrlFilterGroupBox.Controls.Clear();
|
|
UrlFilterGroupBox.Controls.Add(filterControl);
|
|
}
|
|
|
|
private List<string> GetLaunchers()
|
|
{
|
|
var res = new List<string>();
|
|
foreach (DictObj permittedProcess in SEBSettings.permittedProcessList)
|
|
{
|
|
res.Add((string)permittedProcess[SEBSettings.KeyTitle]);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
private DictObj GetSelectedResource()
|
|
{
|
|
var node = treeViewAdditionalResources.SelectedNode;
|
|
|
|
if (node.Level == 0)
|
|
{
|
|
return SetDefaultValuesOnResource((DictObj)SEBSettings.additionalResourcesList[node.Index]);
|
|
}
|
|
else if (node.Level == 1)
|
|
{
|
|
DictObj rootResource = (DictObj)SEBSettings.additionalResourcesList[node.Parent.Index];
|
|
ListObj level1List = (ListObj)rootResource[SEBSettings.KeyAdditionalResources];
|
|
return SetDefaultValuesOnResource((DictObj)level1List[node.Index]);
|
|
}
|
|
else if (node.Level == 2)
|
|
{
|
|
DictObj rootResource = (DictObj)SEBSettings.additionalResourcesList[treeViewAdditionalResources.SelectedNode.Parent.Parent.Index];
|
|
ListObj level1List = (ListObj)rootResource[SEBSettings.KeyAdditionalResources];
|
|
DictObj level1Resource = (DictObj)level1List[treeViewAdditionalResources.SelectedNode.Parent.Index];
|
|
ListObj level2List = (ListObj)level1Resource[SEBSettings.KeyAdditionalResources];
|
|
return SetDefaultValuesOnResource((DictObj)level2List[node.Index]);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private DictObj SetDefaultValuesOnResource(DictObj resourceData)
|
|
{
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResources))
|
|
resourceData[SEBSettings.KeyAdditionalResources] = new ListObj();
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesActive))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesActive] = true;
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesAutoOpen))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesAutoOpen] = false;
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesIdentifier))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesIdentifier] = "";
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesResourceIcons))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesResourceIcons] = new ListObj();
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesTitle))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesTitle] = "New Resource";
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesUrl))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesUrl] = "";
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesURLFilterRules))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesURLFilterRules] = new ListObj();
|
|
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesResourceData))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesResourceData] = "";
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesResourceDataFilename))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesResourceDataFilename] = "";
|
|
if(!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesResourceDataLauncher))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesResourceDataLauncher] = 0;
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesLinkUrl))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesLinkUrl] = "";
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesRefererFilter))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesRefererFilter] = "";
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesResetSession))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesResetSession] = false;
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesKey))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesKey] = "";
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesModifiers))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesModifiers] = "";
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesConfirm))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesConfirm] = false;
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesConfirmText))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesConfirmText] = "";
|
|
if (!resourceData.ContainsKey(SEBSettings.KeyAdditionalResourcesShowButton))
|
|
resourceData[SEBSettings.KeyAdditionalResourcesShowButton] = true;
|
|
|
|
return resourceData;
|
|
}
|
|
|
|
private void UpdateAdditionalResourceIdentifiers()
|
|
{
|
|
foreach (TreeNode l0Node in treeViewAdditionalResources.Nodes)
|
|
{
|
|
DictObj l0resource = (DictObj)SEBSettings.additionalResourcesList[l0Node.Index];
|
|
l0resource[SEBSettings.KeyAdditionalResourcesIdentifier] = l0Node.Index.ToString();
|
|
foreach (TreeNode l1Node in l0Node.Nodes)
|
|
{
|
|
ListObj l1resources = (ListObj)l0resource[SEBSettings.KeyAdditionalResources];
|
|
DictObj l1resource = (DictObj) l1resources[l1Node.Index];
|
|
l1resource[SEBSettings.KeyAdditionalResourcesIdentifier] = l0Node.Index + "." + l1Node.Index;
|
|
foreach (TreeNode l2Node in l1Node.Nodes)
|
|
{
|
|
ListObj l2resources = (ListObj)l1resource[SEBSettings.KeyAdditionalResources];
|
|
DictObj l2resource = (DictObj)l2resources[l2Node.Index];
|
|
l2resource[SEBSettings.KeyAdditionalResourcesIdentifier] = l0Node.Index + "." + l1Node.Index + "." + l2Node.Index;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void buttonAdditionalResourcesMoveUp_Click(object sender, EventArgs e)
|
|
{
|
|
var nodeToMove = treeViewAdditionalResources.SelectedNode;
|
|
if (nodeToMove.Index == 0)
|
|
return;
|
|
|
|
var oldIndex = nodeToMove.Index;
|
|
|
|
var parent = treeViewAdditionalResources.SelectedNode.Parent;
|
|
if (parent == null)
|
|
{
|
|
var nodeToMoveDown = treeViewAdditionalResources.Nodes[oldIndex - 1];
|
|
treeViewAdditionalResources.Nodes.RemoveAt(oldIndex - 1);
|
|
treeViewAdditionalResources.Nodes.Insert(oldIndex, nodeToMoveDown);
|
|
DictObj resourceToMoveDown = (DictObj)SEBSettings.additionalResourcesList[oldIndex - 1];
|
|
SEBSettings.additionalResourcesList.RemoveAt(oldIndex -1);
|
|
SEBSettings.additionalResourcesList.Insert(oldIndex, resourceToMoveDown);
|
|
}
|
|
else
|
|
{
|
|
var nodeToMoveDown = parent.Nodes[oldIndex - 1];
|
|
parent.Nodes.RemoveAt(oldIndex - 1);
|
|
parent.Nodes.Insert(oldIndex, nodeToMoveDown);
|
|
DictObj parentResource = new DictObj();
|
|
if (parent.Level == 0)
|
|
{
|
|
parentResource = (DictObj)SEBSettings.additionalResourcesList[parent.Index];
|
|
}
|
|
if (parent.Level == 1)
|
|
{
|
|
DictObj l0Resource = (DictObj)SEBSettings.additionalResourcesList[parent.Parent.Index];
|
|
ListObj l0ResourcesList = (ListObj)l0Resource[SEBSettings.KeyAdditionalResources];
|
|
parentResource = (DictObj)l0ResourcesList[parent.Index];
|
|
}
|
|
ListObj parentResourceList = (ListObj) parentResource[SEBSettings.KeyAdditionalResources];
|
|
DictObj resourceToMoveDown = (DictObj)parentResourceList[oldIndex - 1];
|
|
parentResourceList.RemoveAt(oldIndex -1);
|
|
parentResourceList.Insert(oldIndex, resourceToMoveDown);
|
|
}
|
|
|
|
UpdateAdditionalResourceIdentifiers();
|
|
}
|
|
|
|
private void buttonAdditionalResourcesMoveDown_Click(object sender, EventArgs e)
|
|
{
|
|
var nodeToMove = treeViewAdditionalResources.SelectedNode;
|
|
|
|
var oldIndex = nodeToMove.Index;
|
|
|
|
var parent = treeViewAdditionalResources.SelectedNode.Parent;
|
|
if (parent == null)
|
|
{
|
|
if (nodeToMove.Index == treeViewAdditionalResources.Nodes.Count -1)
|
|
return;
|
|
var nodeToMoveUp = treeViewAdditionalResources.Nodes[oldIndex + 1];
|
|
treeViewAdditionalResources.Nodes.RemoveAt(oldIndex + 1);
|
|
treeViewAdditionalResources.Nodes.Insert(oldIndex, nodeToMoveUp);
|
|
DictObj resourceToMoveUp = (DictObj) SEBSettings.additionalResourcesList[oldIndex + 1];
|
|
SEBSettings.additionalResourcesList.RemoveAt(oldIndex + 1);
|
|
SEBSettings.additionalResourcesList.Insert(oldIndex, resourceToMoveUp);
|
|
}
|
|
else
|
|
{
|
|
if (nodeToMove.Index == parent.Nodes.Count -1 )
|
|
return;
|
|
var nodeToMoveUp = parent.Nodes[nodeToMove.Index + 1];
|
|
parent.Nodes.RemoveAt(nodeToMove.Index + 1);
|
|
parent.Nodes.Insert(oldIndex, nodeToMoveUp);
|
|
DictObj parentResource = new DictObj();
|
|
if (parent.Level == 0)
|
|
{
|
|
parentResource = (DictObj)SEBSettings.additionalResourcesList[parent.Index];
|
|
}
|
|
if (parent.Level == 1)
|
|
{
|
|
DictObj l0Resource = (DictObj)SEBSettings.additionalResourcesList[parent.Parent.Index];
|
|
ListObj l0ResourcesList = (ListObj)l0Resource[SEBSettings.KeyAdditionalResources];
|
|
parentResource = (DictObj)l0ResourcesList[parent.Index];
|
|
}
|
|
ListObj parentResourceList = (ListObj)parentResource[SEBSettings.KeyAdditionalResources];
|
|
DictObj resourceToMoveDown = (DictObj)parentResourceList[oldIndex + 1];
|
|
parentResourceList.RemoveAt(oldIndex + 1);
|
|
parentResourceList.Insert(oldIndex, resourceToMoveDown);
|
|
}
|
|
|
|
UpdateAdditionalResourceIdentifiers();
|
|
}
|
|
|
|
private void buttonadditionalResourcesRemove_Click(object sender, EventArgs e)
|
|
{
|
|
var node = treeViewAdditionalResources.SelectedNode;
|
|
|
|
if (node != null)
|
|
{
|
|
if (node.Level == 0)
|
|
{
|
|
SEBSettings.additionalResourcesList.RemoveAt(node.Index);
|
|
}
|
|
else if (node.Level == 1)
|
|
{
|
|
DictObj rootResource = (DictObj)SEBSettings.additionalResourcesList[node.Parent.Index];
|
|
ListObj level1List = (ListObj)rootResource[SEBSettings.KeyAdditionalResources];
|
|
level1List.RemoveAt(node.Index);
|
|
}
|
|
else if (node.Level == 2)
|
|
{
|
|
DictObj rootResource = (DictObj)SEBSettings.additionalResourcesList[treeViewAdditionalResources.SelectedNode.Parent.Parent.Index];
|
|
ListObj level1List = (ListObj)rootResource[SEBSettings.KeyAdditionalResources];
|
|
DictObj level1Resource = (DictObj)level1List[treeViewAdditionalResources.SelectedNode.Parent.Index];
|
|
ListObj level2List = (ListObj)level1Resource[SEBSettings.KeyAdditionalResources];
|
|
level2List.RemoveAt(node.Index);
|
|
}
|
|
node.Remove();
|
|
|
|
UpdateAdditionalResourceIdentifiers();
|
|
}
|
|
|
|
groupBoxAdditionalResourceDetails.Visible = treeViewAdditionalResources.SelectedNode != null;
|
|
}
|
|
|
|
private void checkBoxAdditionalResourceActive_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesActive] = checkBoxAdditionalResourceActive.Checked;
|
|
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
}
|
|
|
|
private void checkBoxAdditionalResourceAutoOpen_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesAutoOpen] = checkBoxAdditionalResourceAutoOpen.Checked;
|
|
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
}
|
|
|
|
private void textBoxAdditionalResourcesTitle_TextChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesTitle] = textBoxAdditionalResourcesTitle.Text;
|
|
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
}
|
|
|
|
private void textBoxAdditionalResourceUrl_TextChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesUrl] = textBoxAdditionalResourceUrl.Text;
|
|
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
|
|
buttonAdditionalResourcesChooseEmbeddedFolder.Enabled =
|
|
buttonAdditionalResourceChooseEmbededResource.Enabled = string.IsNullOrEmpty(textBoxAdditionalResourceUrl.Text);
|
|
}
|
|
|
|
private void buttonAdditionalResourceChooseEmbededResource_Click(object sender, EventArgs e)
|
|
{
|
|
var openFileDialog = new OpenFileDialog
|
|
{
|
|
CheckFileExists = true,
|
|
CheckPathExists = true,
|
|
Multiselect = false
|
|
};
|
|
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
var fileInfo = new FileInfo(openFileDialog.FileName);
|
|
var resourceData = _fileCompressor.CompressAndEncodeFile(openFileDialog.FileName);
|
|
DictObj selectedResource = GetSelectedResource();
|
|
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataFilename] = fileInfo.Name;
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceData] = resourceData;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Visible = true;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Enabled = false;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Text = fileInfo.Name;
|
|
|
|
SetIconFromFile(openFileDialog.FileName);
|
|
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
EmbeddedResourceChosen();
|
|
}
|
|
catch (OutOfMemoryException)
|
|
{
|
|
MessageBox.Show("The chosen resource file is too large!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void buttonAdditionalResourcesChooseEmbeddedFolder_Click(object sender, EventArgs e)
|
|
{
|
|
var chooseFolderDialog = new FolderBrowserDialog
|
|
{
|
|
ShowNewFolderButton = false,
|
|
Description = "Choose a folder to embed, including subdirectories. Afterwards you can select the file to start when the resource is selected"
|
|
};
|
|
if (chooseFolderDialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
try
|
|
{
|
|
var resourceData = _fileCompressor.CompressAndEncodeDirectory(chooseFolderDialog.SelectedPath, out List<string> containingFilenames);
|
|
DictObj selectedResource = GetSelectedResource();
|
|
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceData] = resourceData;
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.DataSource = containingFilenames;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Visible = true;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Enabled = true;
|
|
|
|
EmbeddedResourceChosen();
|
|
}
|
|
catch (OutOfMemoryException)
|
|
{
|
|
MessageBox.Show("The chosen resource folder is too large!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetIconFromUrl(string url)
|
|
{
|
|
if (!Uri.IsWellFormedUriString(url, UriKind.Absolute))
|
|
return;
|
|
|
|
try
|
|
{
|
|
var uri = new Uri(textBoxAdditionalResourceUrl.Text);
|
|
DictObj selectedResource = GetSelectedResource();
|
|
|
|
var ic = new DictObj();
|
|
ic[SEBSettings.KeyAdditionalResourcesResourceIconsIconData] =
|
|
_fileCompressor.CompressAndEncodeFavicon(uri);
|
|
ic[SEBSettings.KeyAdditionalResourcesResourceIconsFormat] = "png";
|
|
|
|
var icons = (ListObj)selectedResource[SEBSettings.KeyAdditionalResourcesResourceIcons];
|
|
if (icons.Count > 0)
|
|
{
|
|
icons[0] = ic;
|
|
}
|
|
else
|
|
{
|
|
icons.Add(ic);
|
|
}
|
|
|
|
var memoryStream = _fileCompressor.DeCompressAndDecode((string)ic[SEBSettings.KeyAdditionalResourcesResourceIconsIconData]);
|
|
var image = Image.FromStream(memoryStream);
|
|
pictureBoxAdditionalResourceIcon.Image = image;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.AddError(string.Format("Unable to extract Icon of Url {0}", url), this, ex);
|
|
}
|
|
}
|
|
|
|
private void comboBoxAdditionalResourcesChooseFileToLaunch_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (comboBoxAdditionalResourcesChooseFileToLaunch.SelectedItem != null)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataFilename] = comboBoxAdditionalResourcesChooseFileToLaunch.SelectedItem;
|
|
}
|
|
}
|
|
|
|
private void SetIconFromFile(string filename)
|
|
{
|
|
if (!File.Exists(filename))
|
|
return;
|
|
try
|
|
{
|
|
var icon = Icon.ExtractAssociatedIcon(filename);
|
|
if (icon != null)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
|
|
var ic = new DictObj();
|
|
ic[SEBSettings.KeyAdditionalResourcesResourceIconsIconData] =
|
|
_fileCompressor.CompressAndEncodeIcon(icon);
|
|
ic[SEBSettings.KeyAdditionalResourcesResourceIconsFormat] = "png";
|
|
|
|
var icons = (ListObj)selectedResource[SEBSettings.KeyAdditionalResourcesResourceIcons];
|
|
if (icons.Count > 0)
|
|
{
|
|
icons[0] = ic;
|
|
}
|
|
else
|
|
{
|
|
icons.Add(ic);
|
|
}
|
|
|
|
var memoryStream = _fileCompressor.DeCompressAndDecode((string)ic[SEBSettings.KeyAdditionalResourcesResourceIconsIconData]);
|
|
var image = Image.FromStream(memoryStream);
|
|
pictureBoxAdditionalResourceIcon.Image = image;
|
|
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.AddError(string.Format("Unable to extract Icon of File {0}",filename),this,ex);
|
|
}
|
|
}
|
|
|
|
private void EmbeddedResourceChosen()
|
|
{
|
|
buttonAdditionalResourceRemoveResourceData.Visible = true;
|
|
buttonAdditionalResourceEmbededResourceOpen.Visible = true;
|
|
labelAdditionalResourcesResourceDataLaunchWith.Visible = true;
|
|
labelAdditionalResourcesFilename.Visible = true;
|
|
comboBoxAdditionalResourcesResourceDataLauncher.Visible = true;
|
|
|
|
textBoxAdditionalResourceUrl.Text = "";
|
|
textBoxAdditionalResourceUrl.Enabled = false;
|
|
|
|
comboBoxAdditionalResourcesResourceDataLauncher.DataSource = GetLaunchers();
|
|
}
|
|
|
|
private void buttonAdditionalResourceEmbededResourceOpen_Click(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
var filename = (string) selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataFilename];
|
|
var path =
|
|
_fileCompressor.DecompressDecodeAndSaveFile(
|
|
(string)selectedResource[SEBSettings.KeyAdditionalResourcesResourceData], filename, selectedResource[SEBSettings.KeyAdditionalResourcesIdentifier].ToString());
|
|
Process.Start(path + filename);
|
|
}
|
|
|
|
private void buttonAdditionalResourceRemoveResourceData_Click(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceData] = "";
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceIconsIconData] = "";
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataFilename] = "";
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataLauncher] = 0;
|
|
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
|
|
buttonAdditionalResourceRemoveResourceData.Visible = false;
|
|
buttonAdditionalResourceEmbededResourceOpen.Visible = false;
|
|
labelAdditionalResourcesResourceDataLaunchWith.Visible = false;
|
|
labelAdditionalResourcesFilename.Visible = false;
|
|
comboBoxAdditionalResourcesResourceDataLauncher.Visible = false;
|
|
comboBoxAdditionalResourcesChooseFileToLaunch.Visible = false;
|
|
|
|
pictureBoxAdditionalResourceIcon.Image = null;
|
|
|
|
textBoxAdditionalResourceUrl.Enabled = true;
|
|
}
|
|
|
|
private void comboBoxAdditionalResourcesResourceDataLauncher_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
if ((int) selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataLauncher] !=
|
|
comboBoxAdditionalResourcesResourceDataLauncher.SelectedIndex)
|
|
{
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResourceDataLauncher] =
|
|
comboBoxAdditionalResourcesResourceDataLauncher.SelectedIndex;
|
|
}
|
|
}
|
|
|
|
private void buttonAdditionalResourcesChooseIcon_Click(object sender, EventArgs e)
|
|
{
|
|
var openFileDialog = new OpenFileDialog
|
|
{
|
|
CheckFileExists = true,
|
|
CheckPathExists = true,
|
|
Multiselect = false,
|
|
Filter = "PNG Images|*.png"
|
|
};
|
|
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
|
|
var icon = new DictObj();
|
|
icon[SEBSettings.KeyAdditionalResourcesResourceIconsIconData] =
|
|
_fileCompressor.CompressAndEncodeFile(openFileDialog.FileName);
|
|
icon[SEBSettings.KeyAdditionalResourcesResourceIconsFormat] = "png";
|
|
|
|
var icons = (ListObj)selectedResource[SEBSettings.KeyAdditionalResourcesResourceIcons];
|
|
if (icons.Count > 0)
|
|
{
|
|
icons[0] = icon;
|
|
}
|
|
else
|
|
{
|
|
icons.Add(icon);
|
|
}
|
|
|
|
var memoryStream = _fileCompressor.DeCompressAndDecode((string)icon[SEBSettings.KeyAdditionalResourcesResourceIconsIconData]);
|
|
var image = Image.FromStream(memoryStream);
|
|
pictureBoxAdditionalResourceIcon.Image = image;
|
|
}
|
|
}
|
|
|
|
private void textBoxAdditionalResourceUrl_Leave(object sender, EventArgs e)
|
|
{
|
|
SetIconFromUrl(textBoxAdditionalResourceUrl.Text);
|
|
CreateURLFilterRule(textBoxAdditionalResourceUrl.Text);
|
|
|
|
// Make sure URL filter is enabled and show message box if not
|
|
if ((Boolean)SEBSettings.settingsCurrent[SEBSettings.KeyURLFilterEnable] == false)
|
|
{
|
|
SEBSettings.settingsCurrent[SEBSettings.KeyURLFilterEnable] = true;
|
|
MessageBox.Show("URL Filter Enabled", "When adding an external additional resource, an according URL filter must be defined " +
|
|
"and URL filtering enabled. You can edit the filter(s) for the resource in its URL Filter list. " +
|
|
"You may also have to create filter rules for your exam in Network/Filter settings (SEB internally only creates a rule exactly matching the Start URL). " +
|
|
"For full control of displayed content, 'Filter also embedded content' (Network/Filter tab) should be activated as well.", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
}
|
|
}
|
|
|
|
private void CreateURLFilterRule(string resourceURLString)
|
|
{
|
|
urlFilter.UpdateFilterRules();
|
|
|
|
// Check if resource URL gets allowed by current filter rules and if not, add a rule for the resource URL
|
|
if (Uri.TryCreate(resourceURLString, UriKind.Absolute, out Uri resourceURL))
|
|
{
|
|
if (urlFilter.TestURLAllowed(resourceURL) != URLFilterRuleActions.allow)
|
|
{
|
|
// If resource URL is not allowed: Create one using the full resource URL
|
|
DictObj selectedResource = GetSelectedResource();
|
|
ListObj resourceURLFilterRules;
|
|
if (selectedResource.TryGetValue(SEBSettings.KeyURLFilterRules, out object keyURLFilterRulesValue))
|
|
{
|
|
resourceURLFilterRules = (ListObj)keyURLFilterRulesValue;
|
|
} else
|
|
{
|
|
resourceURLFilterRules = new ListObj();
|
|
}
|
|
DictObj newURLFilterRule = new DictObj();
|
|
newURLFilterRule.Add(SEBSettings.KeyURLFilterRuleAction, (int)URLFilterRuleActions.allow);
|
|
newURLFilterRule.Add(SEBSettings.KeyURLFilterRuleActive, true);
|
|
newURLFilterRule.Add(SEBSettings.KeyURLFilterRuleExpression, resourceURLString);
|
|
newURLFilterRule.Add(SEBSettings.KeyURLFilterRuleRegex, false);
|
|
// Add this resource URL allow rule to the URL filters of this additional resource
|
|
resourceURLFilterRules.Add(newURLFilterRule);
|
|
selectedResource[SEBSettings.KeyURLFilterRules] = resourceURLFilterRules;
|
|
// Update UI
|
|
InitializeUrlFilters(selectedResource);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void checkBoxShowButton_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesShowButton] = checkBoxShowButton.Checked;
|
|
|
|
treeViewAdditionalResources.SelectedNode.Text = GetDisplayTitle(selectedResource);
|
|
}
|
|
|
|
private void textBoxLinkURL_TextChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesLinkUrl] = textBoxLinkURL.Text;
|
|
}
|
|
|
|
private void checkBoxResetSession_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesResetSession] = checkBoxResetSession.Checked;
|
|
}
|
|
|
|
private void textBoxRefererFilter_TextChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesRefererFilter] = textBoxRefererFilter.Text;
|
|
}
|
|
|
|
private void textBoxKey_TextChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesKey] = textBoxKey.Text;
|
|
}
|
|
|
|
private void comboBoxModifiers_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesModifiers] = comboBoxModifiers.SelectedItem;
|
|
}
|
|
|
|
private void checkBoxConfirm_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesConfirm] = checkBoxConfirm.Checked;
|
|
}
|
|
|
|
private void textBoxConfirmBoxText_TextChanged(object sender, EventArgs e)
|
|
{
|
|
DictObj selectedResource = GetSelectedResource();
|
|
selectedResource[SEBSettings.KeyAdditionalResourcesConfirmText] = textBoxConfirmBoxText.Text;
|
|
}
|
|
}
|
|
}
|