// Called when a value is changed. protected override void SetValue(object sender, PropertySpecEventArgs e) { if (project == null) { return; } FieldInfo[] oFields; Type oType = typeof(Options); oFields = oType.GetFields(BindingFlags.Public | BindingFlags.Instance); // Loop through all the fields in the 'Options' class. for (int i = 0; i < oFields.Length; i++) { // If the current field is not an option, ignore it. if (!oFields[i].FieldType.IsSubclassOf(typeof(OptionBase))) { continue; } List <Attribute> attrs = AttributeUtility.GetAllAttributes(oFields[i], false); OptionNameAttribute oname = (OptionNameAttribute)AttributeUtility.GetAttribute <OptionNameAttribute>(attrs); string name = (oname != null) ? oname.OptionName : ""; if (e.Property.Name == name) { oFields[i].SetValue(pOptions, e.Value); return; } } }
// This method refreshes the property grid. public void RefreshGrid(string configuration, string platform) { // If we don't have a project yet, don't run this method. if (project == null) { return; } bag.Properties.Clear(); Configuration = configuration; Platform = platform; // Setup the new configuration. If it doesn't exist, add it. pOptions = ProjectOptions.GetNewConfiguration(Configuration, Platform).Options; /*=== Setup the property bag. ===*/ FieldInfo[] oFields; Type oType = typeof(Options); oFields = oType.GetFields(BindingFlags.Public | BindingFlags.Instance); // Loop through all the fields in the 'Options' class. for (int i = 0; i < oFields.Length; i++) { // If the current field is not an option, ignore it. if (!oFields[i].FieldType.IsSubclassOf(typeof(OptionBase))) { continue; } List <Attribute> attrs = AttributeUtility.GetAllAttributes(oFields[i], false); OptionInfo info = new OptionInfo(attrs); // Ignore options that shouldn't show up in the project options dialog. if (!info.IsProject) { continue; } OptionBase gOption = (OptionBase)oFields[i].GetValue(gOptions); OptionBase pOption = (OptionBase)oFields[i].GetValue(pOptions); PropertySpec ps = new PropertySpec(info.Name, pOption.GetOptionType()); ps.Category = info.Category; ps.Description = info.Description; ps.EditorTypeName = info.EditorType; ps.ConverterTypeName = info.ProjectTypeConverter; ps.DefaultValue = gOption; bag.Properties.Add(ps); } // Set the selected object to be the bag. this.SelectedObject = bag; }
/*=== utility ===*/ // This method refreshes the property grid. public void RefreshGrid() { bag.Properties.Clear(); /*=== Setup the property bag. ===*/ FieldInfo[] oFields; Type oType = typeof(Options); oFields = oType.GetFields(BindingFlags.Public | BindingFlags.Instance); // Loop through all the fields in the 'Options' class. for (int i = 0; i < oFields.Length; i++) { // If the current field is not an option, ignore it. if (!oFields[i].FieldType.IsSubclassOf(typeof(OptionBase))) { continue; } List <Attribute> attrs = AttributeUtility.GetAllAttributes(oFields[i], false); OptionInfo info = new OptionInfo(attrs); // Ignore options that shouldn't show up in the global options dialog. if (!info.IsGlobal) { continue; } OptionBase aOption = (OptionBase)oFields[i].GetValue(aOptions); OptionBase gOption = (OptionBase)oFields[i].GetValue(gOptions); PropertySpec ps = new PropertySpec(info.Name, gOption.GetOptionType()); ps.Category = info.Category; ps.Description = info.Description; ps.EditorTypeName = info.EditorType; ps.ConverterTypeName = info.GlobalTypeConverter; ps.DefaultValue = aOption; bag.Properties.Add(ps); } // Set the selected object to be the bag. this.SelectedObject = bag; }
// This method returns the command line argument string. public static CommandLineInfo GetCommandLineInfo(Project p) { /*=== Read the options. ===*/ Options gOptions = GetGlobalOptions().GetGlobalConfiguration().Options; Options pOptions = GetProjectOptions(p).GetActiveConfiguration().Options; /*=== Use reflection to build the command line string. ===*/ string cmd = ""; FieldInfo[] oFields; Type oType = typeof(Options); char[] trimchars = { '"' }; // Get the fields for type 'Options'. oFields = oType.GetFields(BindingFlags.Public | BindingFlags.Instance); /*=== Loop through the data members in the 'Options' object. ===*/ for (int i = 0; i < oFields.Length; i++) { /*=== If the current field is not an option, ignore it. ===*/ if (!oFields[i].FieldType.IsSubclassOf(typeof(OptionBase))) { continue; } /*=== Parse this option's attributes. ===*/ List <Attribute> attrs = AttributeUtility.GetAllAttributes(oFields[i], false); OptionInfo info = new OptionInfo(attrs); // If a commandline syntax isn't specified, ignore this option. if (info.CommandLine == "") { continue; } string tag = info.CommandLine; // Handle string list options. if (oFields[i].FieldType == typeof(StringListOption)) { StringListOption gOption = (StringListOption)oFields[i].GetValue(gOptions); StringListOption pOption = (StringListOption)oFields[i].GetValue(pOptions); int gsize = gOption.StringList.Count; int psize = pOption.StringList.Count; if (gsize > 0) { cmd += " " + tag + " "; cmd += '"' + gOption.StringList[0].Trim(trimchars) + '"'; for (int j = 1; j < gsize; j++) { cmd += "," + '"' + gOption.StringList[j].Trim(trimchars) + '"'; } } if (psize > 0) { int j = 0; if (gsize < 1) { cmd += " " + tag + " "; cmd += '"' + pOption.StringList[0].Trim(trimchars) + '"'; j = 1; } for (; j < psize; j++) { cmd += "," + '"' + pOption.StringList[j].Trim(trimchars) + '"'; } } } // Handle string options. else if (oFields[i].FieldType == typeof(StringOption)) { StringOption gOption = (StringOption)oFields[i].GetValue(gOptions); StringOption pOption = (StringOption)oFields[i].GetValue(pOptions); if (pOption.Value != "") { cmd += " " + tag + " " + '"' + pOption.Value.Trim(trimchars) + '"'; } else if (gOption.Value != "") { cmd += " " + tag + " " + '"' + gOption.Value.Trim(trimchars) + '"'; } } // Handle boolean options. else if (oFields[i].FieldType == typeof(BoolOption)) { BoolOption gOption = (BoolOption)oFields[i].GetValue(gOptions); BoolOption pOption = (BoolOption)oFields[i].GetValue(pOptions); bool on = pOption.UseDefault ? gOption.Value : pOption.Value; if (on) { cmd += " " + tag; } } // Handle int options. else if (oFields[i].FieldType == typeof(IntOption)) { IntOption gOption = (IntOption)oFields[i].GetValue(gOptions); IntOption pOption = (IntOption)oFields[i].GetValue(pOptions); int val = pOption.UseDefault ? gOption.Value : pOption.Value; cmd += " " + tag + " " + val; } } /*=== Setup the command line info data structure. ===*/ CommandLineInfo cmdinfo = new CommandLineInfo(); /*=== set the license path ===*/ if (pOptions.LicensePath.Value != "") { cmd += " -license " + '"' + pOptions.LicensePath.Value.Trim(trimchars) + '"'; } else if (gOptions.LicensePath.Value != "") { cmd += " -license " + '"' + gOptions.LicensePath.Value.Trim(trimchars) + '"'; } else { cmd += " -license " + '"' + opLicenseUtility.FullLicenseFileName + '"'; } cmdinfo.Arguments = cmd; /*=== set the executable path ===*/ if (pOptions.ExecutablePath.Value != "") { cmdinfo.ExecutablePath = pOptions.ExecutablePath.Value.Trim(trimchars); } else if (gOptions.ExecutablePath.Value != "") { cmdinfo.ExecutablePath = gOptions.ExecutablePath.Value.Trim(trimchars); } else { cmdinfo.ExecutablePath = Path.GetFullPath(Paths.GetFullAppPath() + "..\\Release\\opCpp.exe"); } return(cmdinfo); }