private void ButtonAddExtension_Click(object sender, EventArgs e) { FormExtensionSelect dialog = new FormExtensionSelect(); try { for (int i = 0; i < consumerExtensionDetails.Length; i++) dialog.ComboBoxExtension.Items.Add(consumerExtensionDetails[i].ExtensionAttribute.ExtensionName); if (consumerExtensionDetails.Length > 0) dialog.ComboBoxExtension.SelectedIndex = 0; if (dialog.ShowDialog() == DialogResult.OK) { // Ensure that single-instance extensions are not added more than once. int selected = dialog.ComboBoxExtension.SelectedIndex; if (! consumerExtensionDetails[selected].ExtensionAttribute.AllowMultipleInstances) { int i = 0; while ((i < activeExtensions.Length) && (activeExtensions[i].ExtensionDetails != consumerExtensionDetails[selected])) i++; if (i < activeExtensions.Length) { MessageBox.Show("Multiple instances of this extension are not allowed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); return; } } // Determine the next available extension ID. int extensionID = 0; for (int i = 0; i < activeExtensions.Length; i++) if (activeExtensions[i].ExtensionID > extensionID) extensionID = activeExtensions[i].ExtensionID; extensionID++; // Activate the extension. ActiveExtensionInfo extensionInfo = ActivateExtension(consumerExtensionDetails[selected], extensionID, "Extension " + extensionID); // Add it to the active extension array. ActiveExtensionInfo[] newInfo = new ActiveExtensionInfo[activeExtensions.Length + 1]; activeExtensions.CopyTo(newInfo, 0); newInfo[activeExtensions.Length] = extensionInfo; activeExtensions = newInfo; // Update the saved configuration. UpdateActiveExtensionConfig(); // Update the user interface. UpdateSortedActiveExtensions(); RebuildPageMenu(); RepopulateExtensionsDialog(); } } finally { dialog.Dispose(); } }
private void ButtonRemoveExtension_Click(object sender, EventArgs e) { int i = extensionsDialog.ListBoxExtensions.SelectedIndex; if (i >= 0) { // Dispose of the extension. DeactivateExtension(activeExtensions[i]); // Remove it from the active extension array. ActiveExtensionInfo[] newInfo = new ActiveExtensionInfo[activeExtensions.Length - 1]; for (int j = 0; j < i; j++) newInfo[j] = activeExtensions[j]; for (int j = i + 1; j < activeExtensions.Length; j++) newInfo[j - 1] = activeExtensions[j]; activeExtensions = newInfo; // Update the saved configuration. UpdateActiveExtensionConfig(); // Update the user interface. UpdateSortedActiveExtensions(); RebuildPageMenu(); RepopulateExtensionsDialog(); } }
private void ComboBoxProvider_SelectedIndexChanged(object sender, EventArgs e) { if (! repopulatingExtensionsDialog) { // Unload the current provider and load the new one. if (gpsProvider != null) DeactivateExtension(gpsProvider); int selected = extensionsDialog.ComboBoxProvider.SelectedIndex; gpsProvider = ActivateExtension(providerExtensionDetails[selected], -1, providerExtensionDetails[selected].ExtensionDLL); // Update the saved configuration. configSource.Configs["Settings"].Set("GPS Provider Dll", providerExtensionDetails[selected].ExtensionDLL); configSource.Save(); // Update the user interface. RebuildPageMenu(); RepopulateExtensionsDialog(); } }
private void ActivateExtensions() { // First unload all currently loaded extensions, if any. DeactivateExtensions(); // Create a GPS provider object, if one was specified. string gpsProviderDll = configSource.Configs["Settings"].GetString("GPS Provider Dll", ""); if (gpsProviderDll != "") { // Find the corresponding extension details. int i = 0; while ((i < providerExtensionDetails.Length) && (providerExtensionDetails[i].ExtensionDLL != gpsProviderDll)) i++; if (i >= providerExtensionDetails.Length) throw new Exception("Invalid GPS provider DLL setting: " + gpsProviderDll); // Create the extension. gpsProvider = ActivateExtension(providerExtensionDetails[i], -1, gpsProviderDll); } // Read in the active extension list. int numActiveExtensions = configSource.Configs["Settings"].GetInt("Num Active Extensions", 0); activeExtensions = new ActiveExtensionInfo[numActiveExtensions]; for (int i = 0; i < numActiveExtensions; i++) { string section = "Active Extension " + i; Nini.Config.IConfig config = configSource.Configs[section]; if (config == null) throw new Exception("Missing configuration file section: " + section); int extensionID = config.GetInt("Extension ID", 0); string extensionDll = config.GetString("Extension Dll", ""); // Find the corresponding extension details. int j = 0; while ((j < consumerExtensionDetails.Length) && (consumerExtensionDetails[j].ExtensionDLL != extensionDll)) j++; if (j >= consumerExtensionDetails.Length) throw new Exception("Invalid GPS extension DLL setting for active extension " + i + ": " + extensionDll); ExtensionDetails extensionDetails = consumerExtensionDetails[j]; // Ensure that the extension ID is unique. j = 0; while ((j < i) && (activeExtensions[j].ExtensionID != extensionID)) j++; if (j < i) throw new Exception("Active extensions " + i + " and " + j + " have a duplicate extension ID: " + extensionID); // Create and configure the extension. activeExtensions[i] = ActivateExtension(extensionDetails, extensionID, "Extension " + extensionID); } UpdateSortedActiveExtensions(); RebuildPageMenu(); }
private void DeactivateExtensions() { if (gpsProvider != null) { DeactivateExtension(gpsProvider); gpsProvider = null; } if (activeExtensions != null) { for (int i = 0; i < activeExtensions.Length; i++) { if (activeExtensions[i] != null) DeactivateExtension(activeExtensions[i]); } activeExtensions = null; } }
private void DeactivateExtension(ActiveExtensionInfo extensionInfo) { if (extensionInfo.Control != null) pluginPanel.Controls.Remove(extensionInfo.Control); if (extensionInfo.MenuButton != null) pageMenuPanel.ContentControls.Remove(extensionInfo.MenuButton); extensionInfo.Extension.ExtensionDispose(); }
private ActiveExtensionInfo ActivateExtension(ExtensionDetails extensionDetails, int extensionID, string configSection) { // TODO: error recovery from exceptions during ExtensionInit? ActiveExtensionInfo extensionInfo = new ActiveExtensionInfo(); extensionInfo.ExtensionID = extensionID; extensionInfo.ExtensionDetails = extensionDetails; extensionInfo.Extension = (IExtension)Activator.CreateInstance(extensionDetails.ExtensionType); if (configSource.Configs[configSection] == null) configSource.AddConfig(configSection); extensionInfo.Extension.ExtensionInit(this, extensionID, new NiniIConfigWrapper(configSource.Configs[configSection])); if (extensionInfo.ExtensionDetails.ExtensionAttribute.HasUserInterface) { extensionInfo.Control = extensionInfo.Extension.GetUserInterface(); extensionInfo.Control.Visible = false; pluginPanel.Controls.Add(extensionInfo.Control); extensionInfo.Control.Location = new Point(0, 0); extensionInfo.Extension.ResizeUserInterface(pluginPanel.ClientSize); } if (extensionInfo.ExtensionDetails.ExtensionAttribute.IsProvider) { extensionInfo.Extension.NewGPSFix += new GPSFixEvent(Extension_NewGPSFix); extensionInfo.Extension.NewGPSSatelliteData += new GPSSatelliteDataEvent(Extension_NewGPSSatelliteData); } return extensionInfo; }