jConfigureVC : Configure VC7 proj files (.vcproj)

Download jconfigurevc.zip

Synopsis:

jconfigurevc.xml
ConfigFile.cs
ConfigFileGUI.cs
ConfigureVC7.cs
Converter.cs
DirTree.cs
DirTreePicker.cs
MainWindow.cs
PersistedValues.cs
ProjectChooser.cs
ProjectTypeEnumerator.cs
Setting.cs
SettingEnumerator.cs
SettingsFactory.cs
SettingsFile.cs
Status.cs
Utils.cs
VcProjWriter.cs


jconfigurevc.xml

Synopsis
<?xml version="1.0" encoding="utf-8" ?>
<ProjectTypes>

<!--
  <ProjectType name='Console'>
    <Configuration name='Debug'>
      <setting name='OutputDirectory' value='\projects\$(ConfigurationName)\$(ProjectName)' />
      <setting name='IntermediateDirectory' value='\projects\$(ConfigurationName)\$(ProjectName)' />
      <setting name='Optimization' value='0' />
      <setting name='GlobalOptimizations' value='false' />
      <setting name='InlineFunctionExpansion' value='0' />
      <setting name='FavorSizeOrSpeed' value='1' />
      <setting name='OmitFramePointers' value='true' />
      <setting name='StringPooling' value='true' />
      <setting name='RuntimeLibrary' value='3' />
      <setting name='BufferSecurityCheck' value='false' />
      <setting name='EnableFunctionLevelLinking' value='true' />
      <setting name='DebugInformationFormat' value='3' />
      <setting name='UsePrecompiledHeader' value='0' />
      <setting name='MinimalRebuild' value='false' />
      <setting name='BasicRuntimeChecks' value='3' />
      <setting name='WarningLevel' value='3' />
      <setting name='Detect64BitPortabilityProblems' value='true' />
      <setting name='LinkIncremental' value='1' />
      <setting name='OutputFile' value='' />
      <setting name='GenerateDebugInformation' value='true' />
      <setting name='ProgramDatabaseFile' value='' />
      <setting name='SubSystem' value='1' />
      <setting name='OptimizeReferences' value='2' />
      <setting name='EnableCOMDATFolding' value='2' />
      <setting name='TargetMachine' value='1' />
    </Configuration>
    <Configuration name='Release'>
      <setting name='OutputDirectory' value='\projects\$(ConfigurationName)\$(ProjectName)' />
      <setting name='IntermediateDirectory' value='\projects\$(ConfigurationName)\$(ProjectName)' />
      <setting name='Optimization' value='2' />
      <setting name='GlobalOptimizations' value='true' />
      <setting name='InlineFunctionExpansion' value='2' />
      <setting name='FavorSizeOrSpeed' value='1' />
      <setting name='OmitFramePointers' value='true' />
      <setting name='StringPooling' value='true' />
      <setting name='RuntimeLibrary' value='0' />
      <setting name='BufferSecurityCheck' value='false' />
      <setting name='EnableFunctionLevelLinking' value='true' />
      <setting name='DebugInformationFormat' value='3' />
      <setting name='UsePrecompiledHeader' value='0' />
      <setting name='MinimalRebuild' value='false' />
      <setting name='BasicRuntimeChecks' value='3' />
      <setting name='WarningLevel' value='3' />
      <setting name='Detect64BitPortabilityProblems' value='true' />
      <setting name='LinkIncremental' value='1' />
      <setting name='OutputFile' value='' />
      <setting name='GenerateDebugInformation' value='false' />
      <setting name='ProgramDatabaseFile' value='' />
      <setting name='SubSystem' value='1' />
      <setting name='OptimizeReferences' value='2' />
      <setting name='EnableCOMDATFolding' value='2' />
      <setting name='TargetMachine' value='1' />
    </Configuration>
  </ProjectType>
 -->
</ProjectTypes>

ConfigFile.cs

Synopsis
using System;
using System.Xml;

namespace ConfigureVC
{
  /// <summary>
  /// Summary description for ConfigFile.
  /// </summary>
  public class ConfigFile
  {
    private XmlDocument mDoc = new XmlDocument();
    public ConfigFile()
    {
      string path = PersistedValues.ConfigFileDirectory + @"\" + PersistedValues.ConfigFilename;
      try
      {
        mDoc.Load(path);
      }
      catch(Exception ex)
      {
        System.Windows.Forms.MessageBox.Show("Can't open file '" + path + "':\n  " + ex.Message);
      }
    }
    public ProjectTypeEnumerator GetProjectTypeEnumerator() 
    {
      return new ProjectTypeEnumerator(mDoc);
    }
    public SettingsEnumerator GetSettingsEnumerator(string projecttype) 
    {
      return new SettingsEnumerator(mDoc, projecttype);
    }
  }
}

ConfigFileGUI.cs

Synopsis
using System;
using System.Windows.Forms;

namespace ConfigureVC
{
	/// <summary>
	/// Summary description for ConfigFileGUI.
	/// </summary>
	public class ConfigFileGUI
	{
    public static void GetProjectTypes(ListBox.ObjectCollection list)
    {
      ConfigFile cf = new ConfigFile();
      ProjectTypeEnumerator ptypes = cf.GetProjectTypeEnumerator();
      for(ptypes.Reset(); ptypes.MoveNext(); )
        list.Add(ptypes.Current);
    }
    public static void ChooseFile()
    {
      OpenFileDialog dlg = new OpenFileDialog();

      dlg.CheckFileExists = true;
      dlg.CheckPathExists = true;
      dlg.InitialDirectory = PersistedValues.ConfigFileDirectory;
      dlg.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.*";
      
      if (dlg.ShowDialog() != DialogResult.OK) return;
      PersistedValues.ConfigFileDirectory = dlg.FileName.Substring(0, dlg.FileName.LastIndexOf("\\"));
      PersistedValues.ConfigFilename = dlg.FileName.Substring(dlg.FileName.LastIndexOf("\\") + 1);
    }
  }
}

ConfigureVC7.cs

Synopsis
using System;
using System.Threading;

namespace ConfigureVC
{
  /// <summary>
  /// Summary description for ConfigureVC7.
  /// </summary>
  public class ConfigureVC7
  {
    private string mFile;
    public string File
    {
      set { mFile = value; }
    }

    public void Configure(string projecttype)
    {
      SettingsFile f = new SettingsFile(mFile);
      f.Load();
      Configure(f, projecttype);
      f.Save();
    }
    private void Configure(SettingsFile f, string projecttype)
    {
      ConfigFile cfg = new ConfigFile();
      SettingsEnumerator settings = cfg.GetSettingsEnumerator(projecttype);
      for(settings.Reset(); settings.MoveNext(); )
      {
        SettingsEnumerator.Setting s = settings.Current;
        f.SetValue(s.Name, s.Value);
      }
    }
  }
}

Converter.cs

Synopsis
using System;
using System.Windows.Forms;

namespace ConfigureVC
{
  /// <summary>
  /// Summary description for Converter.
  /// </summary>
  class Converter
  {
    public static void Convert(Status status, string file, string projecttype)
    {
      Cursor.Current = Cursors.WaitCursor;
      ConvertFile(file, projecttype);
      status.FileConverted(file);
      Cursor.Current = Cursors.Default;
    }

    public static void Convert(Status status, ListBox.ObjectCollection files, string projecttype)
    {
      Cursor.Current = Cursors.WaitCursor;
      int totalcount = files.Count;
      int count = 0;
      foreach (string file in files)
      {
        ConvertFile(file, projecttype);
        count++;
        status.FileConverted(count, totalcount, file);
      }
      Cursor.Current = Cursors.Default;
    }
    private static void ConvertFile(string file, string projecttype)
    {
      ConfigureVC7 cfg = new ConfigureVC7();
      cfg.File = file;
      cfg.Configure(projecttype);
    }
  }
}

DirTree.cs

Synopsis
using System;
using System.Windows.Forms;
using System.IO;

namespace DirectoryTree
{
  /// <summary>
  /// Summary description for UserControl1.
  /// </summary>
  public class DirTree : System.Windows.Forms.UserControl
  {
    private const int cClosedDirImage = 0;
    private const int cOpenDirImage = 1;
    private const int cFileImage = 2;
    
    private string mFilter = "*.*";
    private string mDrive = "C:\\";
    private string mPath = "C:\\";

    private System.Windows.Forms.TreeView mTreeView;
    private System.Windows.Forms.ImageList mImageList;
    private System.ComponentModel.IContainer components;
    private TreeNode RootNode = new TreeNode("C:\\", cOpenDirImage, cOpenDirImage);

    public DirTree()
    {
      InitializeComponent();
      InitializeTree();
    }

    /// <summary> 
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if(components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

		#region Component Designer generated code
    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      this.components = new System.ComponentModel.Container();
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(DirTree));
      this.mTreeView = new System.Windows.Forms.TreeView();
      this.mImageList = new System.Windows.Forms.ImageList(this.components);
      this.SuspendLayout();
      // 
      // mTreeView
      // 
      this.mTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
      this.mTreeView.ImageList = this.mImageList;
      this.mTreeView.Name = "mTreeView";
      this.mTreeView.Size = new System.Drawing.Size(150, 150);
      this.mTreeView.TabIndex = 0;
      this.mTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.mTreeView_AfterSelect);
      // 
      // mImageList
      // 
      this.mImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
      this.mImageList.ImageSize = new System.Drawing.Size(16, 16);
      this.mImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
      this.mImageList.TransparentColor = System.Drawing.Color.Transparent;
      // 
      // DirTree
      // 
      this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                  this.mTreeView});
      this.Name = "DirTree";
      this.ResumeLayout(false);

    }
		#endregion

    public string Path
    {
      get
      {
        if (mTreeView.SelectedNode == null) return mPath;
        if (IsFile(mTreeView.SelectedNode))
          mPath = mTreeView.SelectedNode.Text.Substring(0, mTreeView.SelectedNode.Text.LastIndexOf("\\"));
        else
          mPath = mTreeView.SelectedNode.Text;
        return mPath;
      }
    }
    public string Filter
    {
      set { mFilter = value; }
      get { return mFilter; }
    }
    public string Drive
    {
      set
      {
        mDrive = value;
        RootNode.Text = mDrive;
        ClearTree();
      }
      get { return mDrive; }
    }
    private void DirTree_Resize (object sender, System.EventArgs e)
    {
      mTreeView.SetBounds(0, 0, mTreeView.ClientRectangle.Width, mTreeView.ClientRectangle.Height);
    }
    private string BuildDirectory(TreeNode node)
    {
      string dir = node.Text;
      if (dir[dir.Length - 1] != '\\')
        dir += "\\";
      return dir;
    }
    private void mTreeView_AfterSelect (object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
      if (HasSubNodes(e.Node) || IsFile(e.Node)) return;
      PopulateNode(e.Node);
    }
    private void InitializeTree()
    {
      try
      {
        mTreeView.Nodes.Add(RootNode);
        ClearTree();
      }
      catch(Exception exx)
      {
        System.Console.WriteLine(exx.Message.ToString());
      }
    }
    private void PopulateNode(TreeNode node)
    {
      this.Cursor = Cursors.WaitCursor;
      string rootdir = BuildDirectory(node);
      AddSubDirectories(node, rootdir);
      AddFiles(node, rootdir);
      node.Expand();
      this.Cursor = Cursors.Default;
    }
    private void AddSubDirectories(TreeNode node, string rootdir)
    {
      foreach (string dir in Directory.GetDirectories(rootdir))
        node.Nodes.Add(new TreeNode(dir, cClosedDirImage, cOpenDirImage));
    }
    private void AddFiles(TreeNode node, string rootdir)
    {
      foreach (string file in Directory.GetFiles(rootdir, mFilter))
        node.Nodes.Add(new TreeNode(file, cFileImage, cFileImage));
    }
    private bool IsFile(TreeNode node)
    {
      return node.ImageIndex == cFileImage;
    }
    private bool HasSubNodes(TreeNode node)
    {
      return node.Nodes.Count > 0;
    }
    private void ClearTree()
    {
      RootNode.Nodes.Clear();
      PopulateNode(RootNode);
    }
  }
}

DirTreePicker.cs

Synopsis
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace DirectoryTree
{
	/// <summary>
	/// Summary description for DirTreePicker.
	/// </summary>
	public class DirTreePicker : System.Windows.Forms.Form
	{
    private DirectoryTree.DirTree mDirTree;
    private System.Windows.Forms.Button mOK;
    private System.Windows.Forms.Button mCancel;
    private System.ComponentModel.IContainer components = null;

		public DirTreePicker()
		{
			InitializeComponent();
		}
    public string Drive
    {
      set { mDirTree.Drive = value; }
      get { return mDirTree.Drive; }
    }
    public string Filter
    {
      set { mDirTree.Filter = value; }
      get { return mDirTree.Filter; }
    }
    public string Path
    {
      get { return mDirTree.Path; }
    }
    /// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
      this.mDirTree = new DirectoryTree.DirTree();
      this.mOK = new System.Windows.Forms.Button();
      this.mCancel = new System.Windows.Forms.Button();
      this.SuspendLayout();
      // 
      // mDirTree
      // 
      this.mDirTree.Cursor = System.Windows.Forms.Cursors.Arrow;
      this.mDirTree.Drive = "C:\\";
      this.mDirTree.Filter = "*.*";
      this.mDirTree.Location = new System.Drawing.Point(8, 40);
      this.mDirTree.Name = "mDirTree";
      this.mDirTree.Size = new System.Drawing.Size(448, 336);
      this.mDirTree.TabIndex = 11;
      // 
      // mOK
      // 
      this.mOK.Location = new System.Drawing.Point(48, 8);
      this.mOK.Name = "mOK";
      this.mOK.TabIndex = 12;
      this.mOK.Text = "OK";
      this.mOK.Click += new System.EventHandler(this.mOK_Click);
      // 
      // mCancel
      // 
      this.mCancel.Location = new System.Drawing.Point(144, 8);
      this.mCancel.Name = "mCancel";
      this.mCancel.TabIndex = 13;
      this.mCancel.Text = "Cancel";
      this.mCancel.Click += new System.EventHandler(this.mCancel_Click);
      // 
      // DirTreePicker
      // 
      this.Layout += new System.Windows.Forms.LayoutEventHandler(this.DirTreePicker_Layout);
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(464, 389);
      this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                  this.mCancel,
                                                                  this.mOK,
                                                                  this.mDirTree});
      this.Name = "DirTreePicker";
      this.Text = "Folder Picker";
      this.ResumeLayout(false);

    }
		#endregion

    private void mOK_Click(object sender, System.EventArgs e)
    {
      this.DialogResult = DialogResult.OK;
      this.Dispose();
    }

    private void mCancel_Click(object sender, System.EventArgs e)
    {
      this.DialogResult = DialogResult.Cancel;
      this.Dispose();
    }
    private void DirTreePicker_Layout(object sender, LayoutEventArgs e)
    {
      const int cHGap = 5;
      const int cVGap = 7;
      mOK.Top = cVGap;
      mCancel.Top = cVGap;
      int space = (this.ClientSize.Width - cHGap - mOK.Width - mCancel.Width - cHGap) / 3;
      mOK.Left = space;
      mCancel.Left = mOK.Right + space;
      mDirTree.Top = mOK.Bottom + cVGap;
      mDirTree.Left = cHGap;
      mDirTree.Width = this.ClientSize.Width - cHGap - cHGap;
      mDirTree.Height = this.ClientSize.Height - mOK.Bottom - cVGap - cVGap;
    }
  }
}

MainWindow.cs

Synopsis
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;

namespace ConfigureVC
{
  /// <summary>
  /// Summary description for MainWindow.
  /// </summary>
  public class MainWindow : System.Windows.Forms.Form
  {
    private Status mStatus;
    private System.Windows.Forms.MainMenu mainMenu1;
    private System.Windows.Forms.MenuItem menuItem1;
    private System.Windows.Forms.MenuItem mFileSelectProjectMenu;
    private System.Windows.Forms.MenuItem mFileExitMenu;
    private System.Windows.Forms.ListBox mProjectTypes;
    private System.Windows.Forms.StatusBar mStatusBar;
    private System.Windows.Forms.MenuItem menuItem2;
    private System.Windows.Forms.MenuItem mConfigFileMenu;
    private System.Windows.Forms.ListBox mProjects;
    private System.Windows.Forms.ContextMenu mContextMenu;
    private System.Windows.Forms.Button mConvertAllBtn;
    private System.Windows.Forms.MenuItem menuItem4;
    private System.Windows.Forms.MenuItem mConvertMenu;
    private System.Windows.Forms.MenuItem mConvertAllMenu;
    private System.Windows.Forms.MenuItem menuItem5;
    private System.Windows.Forms.OpenFileDialog mProjectTreeChooser;
    private System.Windows.Forms.MenuItem mFileSelectProjectTreeMenu;
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    public MainWindow()
    {
      InitializeComponent();
      mProjects.Items.Clear();
      InitializeProjectTypes();
      mContextMenu.MenuItems.Add(mConvertMenu.CloneMenu());
      mContextMenu.MenuItems.Add(mConvertAllMenu.CloneMenu());
      mStatus = new Status(mConvertAllMenu, mContextMenu.MenuItems[1], mConvertAllBtn, 
        mStatusBar, mConvertMenu, mContextMenu.MenuItems[0],
        mProjects, mProjectTypes);
      mStatus.Initialize();
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if (components != null) 
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

		#region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      this.mConvertAllBtn = new System.Windows.Forms.Button();
      this.mainMenu1 = new System.Windows.Forms.MainMenu();
      this.menuItem1 = new System.Windows.Forms.MenuItem();
      this.mFileExitMenu = new System.Windows.Forms.MenuItem();
      this.menuItem4 = new System.Windows.Forms.MenuItem();
      this.mConvertMenu = new System.Windows.Forms.MenuItem();
      this.mConvertAllMenu = new System.Windows.Forms.MenuItem();
      this.menuItem5 = new System.Windows.Forms.MenuItem();
      this.mFileSelectProjectMenu = new System.Windows.Forms.MenuItem();
      this.mFileSelectProjectTreeMenu = new System.Windows.Forms.MenuItem();
      this.menuItem2 = new System.Windows.Forms.MenuItem();
      this.mConfigFileMenu = new System.Windows.Forms.MenuItem();
      this.mProjectTypes = new System.Windows.Forms.ListBox();
      this.mStatusBar = new System.Windows.Forms.StatusBar();
      this.mProjects = new System.Windows.Forms.ListBox();
      this.mContextMenu = new System.Windows.Forms.ContextMenu();
      this.mProjectTreeChooser = new System.Windows.Forms.OpenFileDialog();
      this.SuspendLayout();
      // 
      // mConvertAllBtn
      // 
      this.mConvertAllBtn.Location = new System.Drawing.Point(8, 0);
      this.mConvertAllBtn.Name = "mConvertAllBtn";
      this.mConvertAllBtn.Size = new System.Drawing.Size(72, 23);
      this.mConvertAllBtn.TabIndex = 0;
      this.mConvertAllBtn.Text = "Convert All";
      this.mConvertAllBtn.Click += new System.EventHandler(this.ConvertAllAction);
      // 
      // mainMenu1
      // 
      this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                              this.menuItem1,
                                                                              this.menuItem4,
                                                                              this.menuItem2});
      // 
      // menuItem1
      // 
      this.menuItem1.Index = 0;
      this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                              this.mFileExitMenu});
      this.menuItem1.Text = "File";
      // 
      // mFileExitMenu
      // 
      this.mFileExitMenu.Index = 0;
      this.mFileExitMenu.Text = "Exit";
      this.mFileExitMenu.Click += new System.EventHandler(this.mFileExitMenu_Click);
      // 
      // menuItem4
      // 
      this.menuItem4.Index = 1;
      this.menuItem4.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                              this.mConvertMenu,
                                                                              this.mConvertAllMenu,
                                                                              this.menuItem5,
                                                                              this.mFileSelectProjectMenu,
                                                                              this.mFileSelectProjectTreeMenu});
      this.menuItem4.Text = "Action";
      // 
      // mConvertMenu
      // 
      this.mConvertMenu.Index = 0;
      this.mConvertMenu.Text = "Convert";
      this.mConvertMenu.Click += new System.EventHandler(this.ConvertSingleProjectAction);
      // 
      // mConvertAllMenu
      // 
      this.mConvertAllMenu.Index = 1;
      this.mConvertAllMenu.Text = "Convert All";
      this.mConvertAllMenu.Click += new System.EventHandler(this.ConvertAllAction);
      // 
      // menuItem5
      // 
      this.menuItem5.Index = 2;
      this.menuItem5.Text = "-";
      // 
      // mFileSelectProjectMenu
      // 
      this.mFileSelectProjectMenu.Index = 3;
      this.mFileSelectProjectMenu.Text = "Select Project Files...";
      this.mFileSelectProjectMenu.Click += new System.EventHandler(this.mSelectProjectMenu_Click);
      // 
      // mFileSelectProjectTreeMenu
      // 
      this.mFileSelectProjectTreeMenu.Index = 4;
      this.mFileSelectProjectTreeMenu.Text = "Select Project Tree...";
      this.mFileSelectProjectTreeMenu.Click += new System.EventHandler(this.mFileSelectProjectTreeMenu_Click);
      // 
      // menuItem2
      // 
      this.menuItem2.Index = 2;
      this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                              this.mConfigFileMenu});
      this.menuItem2.Text = "Options";
      // 
      // mConfigFileMenu
      // 
      this.mConfigFileMenu.Index = 0;
      this.mConfigFileMenu.Text = "Select Config File...";
      this.mConfigFileMenu.Click += new System.EventHandler(this.mConfigFileMenu_Click);
      // 
      // mProjectTypes
      // 
      this.mProjectTypes.Location = new System.Drawing.Point(88, 0);
      this.mProjectTypes.Name = "mProjectTypes";
      this.mProjectTypes.Size = new System.Drawing.Size(392, 56);
      this.mProjectTypes.TabIndex = 3;
      this.mProjectTypes.SelectedIndexChanged += new System.EventHandler(this.mProjectTypes_SelectedIndexChanged);
      // 
      // mStatusBar
      // 
      this.mStatusBar.Location = new System.Drawing.Point(0, 339);
      this.mStatusBar.Name = "mStatusBar";
      this.mStatusBar.Size = new System.Drawing.Size(632, 22);
      this.mStatusBar.TabIndex = 4;
      this.mStatusBar.Text = "StatusBar";
      // 
      // mProjects
      // 
      this.mProjects.Location = new System.Drawing.Point(0, 56);
      this.mProjects.Name = "mProjects";
      this.mProjects.Size = new System.Drawing.Size(616, 264);
      this.mProjects.TabIndex = 5;
      this.mProjects.MouseDown += new System.Windows.Forms.MouseEventHandler(this.mProjects_MouseDown);
      this.mProjects.SelectedIndexChanged += new System.EventHandler(this.mProjects_SelectedIndexChanged);
      // 
      // mProjectTreeChooser
      // 
      this.mProjectTreeChooser.CheckFileExists = false;
      // 
      // MainWindow
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(632, 361);
      this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                  this.mProjects,
                                                                  this.mStatusBar,
                                                                  this.mProjectTypes,
                                                                  this.mConvertAllBtn});
      this.Menu = this.mainMenu1;
      this.Name = "MainWindow";
      this.Text = "Configure VC7 Projects";
      this.Layout += new System.Windows.Forms.LayoutEventHandler(this.MainWindow_Layout);
      this.ResumeLayout(false);

    }
		#endregion

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main() 
    {
      Application.Run(new MainWindow());
    }
    private void InitializeProjectTypes()
    {
      ConfigFileGUI.GetProjectTypes(mProjectTypes.Items);
    }
    private void MainWindow_Layout(object sender, LayoutEventArgs e)
    {
      const int cHGap = 5;
      const int cVGap = 7;
      mConvertAllBtn.Top = cVGap;
      mConvertAllBtn.Left = cHGap;
      mProjectTypes.Top = cVGap;
      mProjectTypes.Left = cHGap + mConvertAllBtn.Width + cHGap;
      mProjectTypes.Width = this.ClientSize.Width
        - mProjectTypes.Left
        - cHGap;
      //
      mProjects.Top = cVGap + mProjectTypes.Height + cVGap;
      mProjects.Height = this.ClientSize.Height
        - mProjects.Top
        - mStatusBar.Height;
      mProjects.Left = cHGap;
      mProjects.Width = this.ClientSize.Width
        - mProjects.Left
        - cHGap;
    }
    private void mFileExitMenu_Click(object sender, System.EventArgs e)
    {
      this.Close();
    }
    private void mSelectProjectMenu_Click(object sender, System.EventArgs e)
    {
      ProjectChooser.ChooseFiles(mProjects, mStatus);
    }
    private void mFileSelectProjectTreeMenu_Click(object sender, System.EventArgs e)
    {
      ProjectChooser.ChooseDirectory(mProjects, mStatus);
    }
    private void mConfigFileMenu_Click(object sender, System.EventArgs e)
    {
      ConfigFileGUI.ChooseFile();
    }
    private void mProjectTypes_SelectedIndexChanged(object sender, EventArgs e)
    {
      mStatus.ProjectTypeSelected();
    }
    private void mProjects_SelectedIndexChanged(object sender, EventArgs e)
    {
      mStatus.ProjectSelected();
    }
    private void mProjects_MouseDown(object sender, MouseEventArgs e)
    {
      if (e.Button == MouseButtons.Left) return;
      if (mProjects.Items.Count == 0) return;
      mProjects.SelectedIndex =  mProjects.IndexFromPoint(e.X, e.Y);
      if (mProjects.SelectedIndex < 0) return;
      mContextMenu.Show(mProjects, new Point(e.X, e.Y));
    }
    private void ConvertSingleProjectAction(object sender, System.EventArgs e)
    {
      if (!mStatus.ReadyToConvert()) return;
      Converter.Convert(mStatus, (string) mProjects.SelectedItem, mProjectTypes.Text);
    }
    private void ConvertAllAction(object sender, System.EventArgs e)
    {
      if (!mStatus.ReadyToConvert()) return;
      Converter.Convert(mStatus, mProjects.Items, mProjectTypes.Text);
    }
  }
}

PersistedValues.cs

Synopsis
using System;
using Microsoft.Win32;


namespace ConfigureVC
{
  /// <summary>
  /// Summary description for PersistedValues.
  /// </summary>
  public class PersistedValues
  {
    const string cRootKey = @"Software\arrizza\ConfigureVC";
    public static string LastDirectoryVisited
    {
      get { return ReadValue("LastDirectoryVisited", @"d:\"); }
      set { WriteValue("LastDirectoryVisited", value); }
    }
    public static string ConfigFileDirectory
    {
      get { return ReadValue("ConfigFileDirectory", Utils.StartupDirectory); }
      set { WriteValue("ConfigFileDirectory", value); }
    }
    public static string ConfigFilename
    {
      get { return ReadValue("ConfigFilename", "jConfigureVC.xml" ); }
      set { WriteValue("ConfigFilename", value); }
    }
    //-----------------------------
    private static string ReadValue(string name, string defvalue)
    {
      return CheckValue(name, GetStringValue(name), defvalue);
    }
    private static void WriteValue(string name, string val)
    {
      RegistryKey key = Registry.LocalMachine.OpenSubKey(cRootKey, true);
      key.SetValue(name, val);
      key.Close();
    }
    private static string CheckValue(string name, string val, string defvalue)
    {
      if (val == null)
      {
        val = defvalue;
        WriteValue(name, val);
      }
      return val;
    }
    private static string GetStringValue(string name)
    {
      RegistryKey key = GetKey();
      string val = (string) key.GetValue(name);
      key.Close();
      return val;
    }
    private static RegistryKey GetKey()
    {
      RegistryKey key = Registry.LocalMachine.CreateSubKey(cRootKey);
      key.Flush();
      return key;
    }
  }
}

ProjectChooser.cs

Synopsis
using System;
using System.Windows.Forms;
using System.Collections;
using System.IO;

namespace ConfigureVC
{
  /// <summary>
  /// Summary description for FileChooser.
  /// </summary>
  class ProjectChooser
  {
    public static void ChooseFiles(ListBox projects, Status status)
    {
      ProjectChooser pc = new ProjectChooser(projects, status);
      pc.ChooseFilesDialog();
    }
    public static void ChooseDirectory(ListBox projects, Status status)
    {
      ProjectChooser pc = new ProjectChooser(projects, status);
      pc.ChooseDirectoryDialog();
    }

    ListBox mProjects;
    Status mStatus;
    private ProjectChooser(ListBox projects, Status status)
    {
      mProjects = projects;
      mStatus = status;
    }
    private void ChooseFilesDialog()
    {
      OpenFileDialog mProjectFileChooser = new OpenFileDialog();

      mProjectFileChooser.Multiselect = true;
      mProjectFileChooser.CheckFileExists = true;
      mProjectFileChooser.CheckPathExists = true;
      mProjectFileChooser.InitialDirectory = PersistedValues.LastDirectoryVisited;
      mProjectFileChooser.Filter = "VC Projects (*.vcproj)|*.vcproj|All files (*.*)|*.*";
      if (mProjectFileChooser.ShowDialog() == DialogResult.OK)
        SaveChosenFiles(mProjectFileChooser.FileNames);
    }
    private void ChooseDirectoryDialog()
    {
      DirectoryTree.DirTreePicker dt = new DirectoryTree.DirTreePicker();
      dt.Filter = "*.vcproj";
      if (dt.ShowDialog() == DialogResult.OK)
        SaveFilesInDirectories(dt.Path);
    }
    private void SaveChosenFiles(string[] files)
    {
      SaveLastDirectory(files[0]);
      SaveUniqueFiles(files);
      mStatus.ProjectsChosen();
    }
    private void SaveLastDirectory(string file)
    {
      PersistedValues.LastDirectoryVisited = file.Substring(0, file.LastIndexOf("\\"));
    }
    private void SaveUniqueFiles(string[] files)
    {
      foreach (string file in files)
      {
        if (mProjects.Items.Contains(file)) continue;
        mProjects.Items.Add(file);
      }
    }
    private void SaveFilesInDirectories(string path)
    {
      ArrayList dirs = new ArrayList();
      dirs.Add(path);
      while (dirs.Count != 0)
      {
        string dir = (string) dirs[0];
        dirs.RemoveAt(0);
        dirs.AddRange(Directory.GetDirectories(dir));
        SaveUniqueFiles(Directory.GetFiles(dir, "*.vcproj"));
      }
      mStatus.ProjectsChosen();
    }
  }
}

ProjectTypeEnumerator.cs

Synopsis
using System;
using System.Collections;
using System.Xml;

namespace ConfigureVC
{
	/// <summary>
	/// Summary description for ProjectTypeEnumerator.
	/// </summary>
  public class ProjectTypeEnumerator: IEnumerator
  {
    private XmlDocument mDoc;
    private XmlNodeList mProjectTypeNodes;
    private int mProjectTypeIndex;
    public ProjectTypeEnumerator(XmlDocument doc) 
    {
      mDoc = doc;
      Reset();
    }
    public void Reset() 
    {
      mProjectTypeNodes = mDoc.SelectNodes("//ProjectTypes/ProjectType");
      mProjectTypeIndex = -1;
    }
    public bool MoveNext() 
    {
      mProjectTypeIndex++;
      return mProjectTypeIndex < mProjectTypeNodes.Count;
    }
    public string Current 
    {
      get 
      {
        XmlNode nameattr = mProjectTypeNodes[mProjectTypeIndex].SelectSingleNode("@name");
        return nameattr.Value;
      }
    }
    object IEnumerator.Current 
    {
      get { return Current; }
    }
  }
}

Setting.cs

Synopsis
using System;
using System.Xml;

namespace ConfigureVC
{
  //---------------------
  public abstract class Setting
  {
    protected XmlDocument mDoc;
    protected string mAttrName;

    protected XmlNode mParentNode;
    protected XmlNode mAttrNode;

    public Setting(XmlDocument doc, string attrname)
    {
      mDoc = doc;
      mAttrName = attrname;
    }
    public abstract void Set(string xpath, string value);

    protected void GetNodes(string xpath)
    {
      mAttrNode = null;
      mParentNode = mDoc.SelectSingleNode(xpath);
      if (mParentNode == null) return;
      mAttrNode = mParentNode.SelectSingleNode("@" + mAttrName);
    }
    protected void AppendNewSetting()
    {
      string ns = mDoc.GetNamespaceOfPrefix("");
      mAttrNode = mDoc.CreateNode(XmlNodeType.Attribute, mAttrName, ns);
      mAttrNode.Value = "";
      mParentNode.Attributes.Append((XmlAttribute) mAttrNode);
    }
    protected void Delete() 
    {
      mParentNode.Attributes.Remove((XmlAttribute) mAttrNode);
    }
  }

  //---------------------
  public class IntSetting : Setting
  {
    public IntSetting(XmlDocument doc, string attrname)
      : base(doc, attrname)
    {
    }

    public override void Set(string xpath, string value)
    {
      int parm = Int32.Parse(value);
      Set(xpath, parm);
    }

    public void Set(string xpath, int value)
    {
      GetNodes(xpath);
      if (mAttrNode == null) 
        CreateNew(value);
      else 
        Set(value);
    }
    private void Set(int value) 
    {
      //this is a string compare of two numerics
      //watch out for leading zeros and other padding...
      if (value.ToString().Equals(mAttrNode.Value)) return;
      mAttrNode.Value = value.ToString();
    }
    private void CreateNew(int value)
    {
      AppendNewSetting();
      Set(value);
    }
  }
  
  //---------------------
  public class BoolSetting : Setting
  { 
    public BoolSetting(XmlDocument doc, string attrname)
      : base(doc, attrname)
    {
    }
    public override void Set(string xpath, string value)
    {
      bool parm;
      if (value.ToLower().Equals("true"))
        parm = true;
      else if (value.ToLower().Equals("false"))
        parm = false;
      else
        throw new Exception("SetValue(): Bad value for boolean parm: '" + value + "'");
      Set(xpath, parm);
    }

    private void Set(string xpath, bool value)
    {
      GetNodes(xpath);
      if (mAttrNode == null) 
        CreateNew(value);
      else 
        Set(value);
    }
    private void Set(bool value) 
    {
      if (mAttrNode.Value.Equals("TRUE") == value) return;
      mAttrNode.Value = value ? "TRUE" : "FALSE";
    }
    private void CreateNew(bool value)
    {
      if (value == false) return;

      AppendNewSetting();
      Set(value);
    }
  }
  //---------------------
  public class StringSetting : Setting
  { 
    public StringSetting(XmlDocument doc, string attrname)
      : base(doc, attrname)
    {
    }
    public override void Set(string xpath, string value)
    {
      GetNodes(xpath);
      if (mAttrNode == null) 
      {
        if (!value.Equals(""))
          CreateNew(value);
      }
      else if (value.Equals(""))
        Delete();
      else
        Set(value);
    }
    private void Set(string value) 
    {
      if (mAttrNode.Value.Equals(value)) return;
      mAttrNode.Value = value;
    }
    private void CreateNew(string value)
    {
      AppendNewSetting();
      Set(value);
    }
  }
}

SettingEnumerator.cs

Synopsis
using System;
using System.Collections;
using System.Xml;

namespace ConfigureVC
{
	/// <summary>
	/// Summary description for SettingEnumerator.
	/// </summary>
  public class SettingsEnumerator: IEnumerator 
  {
    private XmlDocument mDoc;
    private XmlNodeList mConfigurationNodes;
    private XmlNodeList mSettingsNodes;
    private int mConfigurationIndex;
    private int mSettingsIndex;
    private string mProjectType;

    public class Setting
    {
      public Setting(string name, string val)
      {
        Name = name;
        Value = val;
      }
      public string Name;
      public string Value;
    }
    
    public SettingsEnumerator(XmlDocument doc, string projecttype) 
    {
      mDoc = doc;
      mProjectType = projecttype;
      Reset();
    }
    public void Reset() 
    {
      mConfigurationNodes = mDoc.SelectNodes("//ProjectTypes/ProjectType[@name='" + mProjectType + "']/Configuration");
      mConfigurationIndex = -1;
      mSettingsIndex = -1;
    }
    public bool MoveNext() 
    {
      if (mConfigurationIndex != -1)
      {
        mSettingsIndex++;
        if (mSettingsIndex < mSettingsNodes.Count)
          return true;
      }

      mConfigurationIndex++;
      if (mConfigurationIndex >= mConfigurationNodes.Count)
        return false;

      mSettingsNodes = mConfigurationNodes[mConfigurationIndex].SelectNodes("setting");
      mSettingsIndex = -1;
      return true;
    }
    
    public Setting Current 
    {
      get 
      {
        XmlNode nameattr;
        if (mSettingsIndex == -1)
        {
          nameattr = mConfigurationNodes[mConfigurationIndex].SelectSingleNode("@name");
          return new Setting("Configuration", nameattr.Value);
        }
        //return setting node
        nameattr = mSettingsNodes[mSettingsIndex].SelectSingleNode("@name");
        XmlNode valueattr = mSettingsNodes[mSettingsIndex].SelectSingleNode("@value");
        return new Setting(nameattr.Value, valueattr.Value);
      }
    }
    
    // The current property on the IEnumerator interface:
    object IEnumerator.Current 
    {
      get 
      {
        return Current;
      }
    }
  }
}

SettingsFactory.cs

Synopsis
using System;
using System.Xml;
using System.Collections;

namespace ConfigureVC
{
  //todo: 
  //configuration: 
  //  DeleteExtensionsOnClean="*.xx;*.obj;*.ilk;*.pdb;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.bat;$(TargetPath)"
  //compiler:
  //  PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" 
  //  AdditionalIncludeDirectories="incdir"
  //  AdditionalUsingDirectories="usingref"
  //  PrecompiledHeaderThrough="pch.h"
  //  DisableSpecificWarnings="1386"
  //  ForcedIncludeFiles="forcinc"
  //  ForcedUsingFiles="forceusing"
  //  UndefinePreprocessorDefinitions="undefthisone"
  //linker:
  //  AdditionalDependencies="xx.klib"
  //  AdditionalLibraryDirectories="addliibpath"
  //  IgnoreDefaultLibraryNames="ignore.lib"
  //  AddModuleNamesToAssembly="addmod"
  //  ForceSymbolReferences="symb"
  //  DelayLoadDLLs="delld"
  //  StripPrivateSymbols="strpuibvat"
  //  FunctionOrder="abcdfuncorder"
  //  MergeSections="nmergesect"

     
  public class SettingsFactory
  {
    private SettingType mSettingType;
    private string mAttrName;
    private XPathType mXPath;

    private static Hashtable mSettingsMap = new Hashtable();
    private static bool mInitialized = false;
    private enum XPathType {eCompiler, eLinker, eConfig}
    private enum SettingType {eInt32, eBool, eString}

    static SettingsFactory() 
    {
      if (mInitialized) return;
      mInitialized = true;

      //configuration
      AddStringSetting("OutputDirectory",         XPathType.eConfig);
      AddStringSetting("IntermediateDirectory",   XPathType.eConfig);
      AddInt32Setting("ConfigurationType",        XPathType.eConfig);
      AddInt32Setting("UseOfMFC",                 XPathType.eConfig);
      AddInt32Setting("UseOfATL",                 XPathType.eConfig);
      AddBoolSetting("ATLMinimizesCRunTimeLibraryUsage", XPathType.eConfig);
      AddInt32Setting("CharacterSet",             XPathType.eConfig);
      AddBoolSetting("ManagedExtensions",         XPathType.eConfig);
      AddBoolSetting("WholeProgramOptimization",  XPathType.eConfig);

      //Compiler
      AddInt32Setting("Optimization",             XPathType.eCompiler);
      AddBoolSetting("GlobalOptimizations",       XPathType.eCompiler);
      AddInt32Setting("InlineFunctionExpansion",  XPathType.eCompiler);
      AddBoolSetting("EnableIntrinsicFunctions",  XPathType.eCompiler);
      AddBoolSetting("ImproveFloatingPointConsistency",XPathType.eCompiler);
      AddInt32Setting("FavorSizeOrSpeed",         XPathType.eCompiler);
      AddBoolSetting("OmitFramePointers",         XPathType.eCompiler);
      AddBoolSetting("EnableFiberSafeOptimizations",  XPathType.eCompiler);
      AddInt32Setting("OptimizeForProcessor",         XPathType.eCompiler);
      AddInt32Setting("OptimizeForWindowsApplication",XPathType.eCompiler);
      AddBoolSetting("MinimalRebuild",            XPathType.eCompiler);
      AddBoolSetting("IgnoreStandardIncludePath", XPathType.eCompiler);
      AddInt32Setting("GeneratePreprocessedFile", XPathType.eCompiler);
      AddBoolSetting("KeepComments",              XPathType.eCompiler);
      AddBoolSetting("StringPooling",             XPathType.eCompiler);
      AddBoolSetting("ExceptionHandling",         XPathType.eCompiler);
      AddInt32Setting("BasicRuntimeChecks",       XPathType.eCompiler);
      AddBoolSetting("SmallerTypeCheck",          XPathType.eCompiler);
      AddInt32Setting("RuntimeLibrary",           XPathType.eCompiler);
      AddInt32Setting("StructMemberAlignment",    XPathType.eCompiler);
      AddBoolSetting("BufferSecurityCheck",       XPathType.eCompiler);
      AddBoolSetting("EnableFunctionLevelLinking",XPathType.eCompiler);
      AddBoolSetting("DisableLanguageExtensions", XPathType.eCompiler);
      AddBoolSetting("DefaultCharIsUnsigned",     XPathType.eCompiler);
      AddBoolSetting("TreatWChar_tAsBuiltInType", XPathType.eCompiler);
      AddBoolSetting("ForceConformanceInForLoopScope", XPathType.eCompiler);
      AddBoolSetting("RuntimeTypeInfo",           XPathType.eCompiler);
      AddInt32Setting("UsePrecompiledHeader",     XPathType.eCompiler);
      AddBoolSetting("ExpandAttributedSource",    XPathType.eCompiler);
      AddInt32Setting("AssemblerOutput",          XPathType.eCompiler);
      AddInt32Setting("BrowseInformation",        XPathType.eCompiler);
      AddInt32Setting("WarningLevel",             XPathType.eCompiler);
      AddBoolSetting("WarnAsError",               XPathType.eCompiler);
      AddBoolSetting("SuppressStartupBanner",     XPathType.eCompiler);
      AddBoolSetting("Detect64BitPortabilityProblems", XPathType.eCompiler);
      AddInt32Setting("DebugInformationFormat",   XPathType.eCompiler);
      AddInt32Setting("CompileAsManaged",         XPathType.eCompiler);
      AddInt32Setting("CallingConvention",        XPathType.eCompiler);
      AddInt32Setting("CompileAs",                XPathType.eCompiler);
      AddBoolSetting("ShowIncludes",              XPathType.eCompiler);
      AddBoolSetting("UndefineAllPreprocessorDefinitions", XPathType.eCompiler);

      //Linker
		  AddBoolSetting("RegisterOutput", XPathType.eLinker);
		  AddBoolSetting("IgnoreImportLibrary", XPathType.eLinker);
		  AddInt32Setting("ShowProgress", XPathType.eLinker);
		  AddStringSetting("OutputFile", XPathType.eLinker);
		  AddStringSetting("Version", XPathType.eLinker);
		  AddInt32Setting("LinkIncremental", XPathType.eLinker);
		  //jaa: ?? AddBoolSetting("SuppressStartupBanner", XPathType.eLinker);
		  AddBoolSetting("IgnoreAllDefaultLibraries", XPathType.eLinker);
		  AddStringSetting("ModuleDefinitionFile", XPathType.eLinker);
		  AddStringSetting("EmbedManagedResourceFile", XPathType.eLinker);
		  AddBoolSetting("IgnoreEmbeddedIDL", XPathType.eLinker);
		  AddBoolSetting("GenerateDebugInformation", XPathType.eLinker);
		  AddStringSetting("ProgramDatabaseFile", XPathType.eLinker);
		  AddBoolSetting("GenerateMapFile", XPathType.eLinker);
		  AddStringSetting("MapFileName", XPathType.eLinker);
		  AddBoolSetting("MapExports", XPathType.eLinker);
		  AddBoolSetting("MapLines", XPathType.eLinker);
		  AddInt32Setting("SubSystem", XPathType.eLinker);
		  AddInt32Setting("HeapReserveSize", XPathType.eLinker);
		  AddInt32Setting("HeapCommitSize", XPathType.eLinker);
		  AddInt32Setting("StackReserveSize", XPathType.eLinker);
		  AddInt32Setting("StackCommitSize", XPathType.eLinker);
		  AddInt32Setting("LargeAddressAware", XPathType.eLinker);
		  AddInt32Setting("TerminalServerAware", XPathType.eLinker);
		  AddBoolSetting("SwapRunFromCD", XPathType.eLinker);
		  AddBoolSetting("SwapRunFromNet", XPathType.eLinker);
		  AddInt32Setting("OptimizeReferences", XPathType.eLinker);
		  AddInt32Setting("EnableCOMDATFolding", XPathType.eLinker);
		  AddInt32Setting("OptimizeForWindows98", XPathType.eLinker);
		  AddStringSetting("EntryPointSymbol", XPathType.eLinker);
		  AddBoolSetting("ResourceOnlyDLL", XPathType.eLinker);
		  AddBoolSetting("SetChecksum", XPathType.eLinker);
		  AddInt32Setting("BaseAddress", XPathType.eLinker);
		  AddBoolSetting("TurnOffAssemblyGeneration", XPathType.eLinker);
		  AddBoolSetting("SupportUnloadOfDelayLoadedDLL", XPathType.eLinker);
		  AddStringSetting("ImportLibrary", XPathType.eLinker);
		  AddInt32Setting("TargetMachine", XPathType.eLinker);
    }
    private static void AddBoolSetting(string name, XPathType xpt)
    {
      mSettingsMap.Add(name, new SettingsFactory(SettingType.eBool, name, xpt));
    }
    private static void AddInt32Setting(string name, XPathType xpt)
    {
      mSettingsMap.Add(name, new SettingsFactory(SettingType.eInt32, name, xpt));
    }
    private static void AddStringSetting(string name, XPathType xpt)
    {
      mSettingsMap.Add(name, new SettingsFactory(SettingType.eString, name, xpt));
    }
    private SettingsFactory(SettingType t, string a, XPathType xp)
    {
      mSettingType = t;
      mAttrName = a;
      mXPath = xp;
    }
    public static SettingsFactory GetFor(string settingname)
    {
      return (SettingsFactory) mSettingsMap[settingname];
    }
    public Setting GetSetting(XmlDocument doc)
    {
      switch(mSettingType)
      {
        case SettingType.eInt32  : return new IntSetting(doc, mAttrName);
        case SettingType.eBool   : return new BoolSetting(doc, mAttrName);
        case SettingType.eString : return  new StringSetting(doc, mAttrName);
        default: throw new Exception("SetValue(): Bad Parm type: '" + mSettingType.ToString() + "'");
      }
    }
    public string GetXPath(SettingsFile sf)
    {
      switch (mXPath)
      {
        case XPathType.eCompiler: return sf.CompilerXPath;
        case XPathType.eLinker: return sf.LinkerXPath;
        case XPathType.eConfig: return sf.ConfigurationXPath;
        default: throw new Exception("GetXPath(): Bad XPath enum");
      }
    }
  }
}

SettingsFile.cs

Synopsis
using System;
using System.IO;
using System.Text;
using System.Xml;

namespace ConfigureVC 
{
  /// <summary>
  /// Summary description for SettingsFile.
  /// </summary>
  public class SettingsFile 
  {
    private string mFile;
    private string mConfiguration; //the current configuration Debug or Release
    private XmlDocument mDoc = new XmlDocument();

    public SettingsFile(string fname) 
    {
      mFile = fname;
      mConfiguration = "Debug";
    }
    public void Load() 
    {
      Stream s = new FileStream(mFile, FileMode.Open);
      mDoc.Load(s);
      s.Close();
    }
    public void Save() 
    {
      VcProjWriter w = new VcProjWriter(new FileStream(mFile, FileMode.Create));
      mDoc.Save(w);
      w.Close();
    }
    public void SetValue(string setting, string value)
    {
      if (setting.ToLower().Equals("configuration"))
        Configuration = value;
      else
        SetValue(SettingsFactory.GetFor(setting), setting, value);
    }
    //-------------- PRIVATE FROM HERE ON ----------------------------
    private void SetValue(SettingsFactory factory, string setting, string value)
    {
      if (factory == null) throw new Exception("SetValue(): unknown setting: '" + setting + "'");
      factory.GetSetting(mDoc).Set(factory.GetXPath(this), value);
    }
    private string Configuration 
    {
      set { mConfiguration = value; }
    }
    internal string LinkerXPath
    {
      get { return ConfigurationXPath + "/Tool[@Name='VCLinkerTool']"; }
    }
    internal string CompilerXPath
    {
      get { return ConfigurationXPath + "/Tool[@Name='VCCLCompilerTool']"; }
    }
    internal string ConfigurationXPath
    {
      get { return "//VisualStudioProject/Configurations/Configuration[@Name='" + mConfiguration + "|Win32']"; }
    }
  }
}

Status.cs

Synopsis
using System;
using System.Windows.Forms;

namespace ConfigureVC
{
  /// <summary>
  /// Summary description for Status.
  /// </summary>
  class Status
  {
    MenuItem mConvertAllMenu;
    MenuItem mConvertAllPopupMenu;
    Button mConvertAllBtn;
    StatusBar mStatusBar;
    MenuItem mConvertMenu;
    MenuItem mConvertPopupMenu;
    ListBox mProjects;
    ListBox mProjectTypes;

    public Status(MenuItem convertall, MenuItem convertallpopup, Button convertallbtn,
      StatusBar statusbar, MenuItem convert, MenuItem convertpopup,
      ListBox projects, ListBox projecttypes)
    {
      mConvertAllMenu = convertall;
      mConvertAllPopupMenu = convertallpopup;
      mConvertAllBtn = convertallbtn;
      mStatusBar = statusbar;
      mConvertMenu = convert;
      mConvertPopupMenu = convertpopup;
      mProjects = projects;
      mProjectTypes = projecttypes;
    }

    public void Initialize()
    {
      StatusText = "Select a project...";
      InitializeAllItems();
    }
    public bool ReadyToConvert()
    {
      return ProjectTypeHasBeenSelected() && ProjectFilesHaveBeenSelected();
    }
    public void ProjectsChosen()
    {
      EnableForConvertAll();
    }
    public void ProjectTypeSelected()
    {
      if (mProjects.SelectedIndex != -1)
        EnableForConvertSingle();
      EnableForConvertAll();
    }
    public void ProjectSelected()
    {
      EnableForConvertSingle();
    }
    public void FileConverted(string file)
    {
      StatusText = "Project has been converted: " + file;
    }
    public void FileConverted(int count, int totalcount, string file)
    {
      StatusText = "Project " + count + " of " + totalcount + " has been converted: " + file;
    }

    //-----------------
    private void EnableForConvertAll()
    {
      if (!ReadyToConvert()) return;
      mConvertAllMenu.Enabled = true;
      mConvertAllPopupMenu.Enabled = true;
      mConvertAllBtn.Enabled = true;
    }
    private string StatusText
    {
      set { mStatusBar.Text = value; }
    }
    private void EnableForConvertSingle()
    {
      if (!ReadyToConvert()) return;
      mConvertMenu.Enabled = true;
      mConvertPopupMenu.Enabled = true;
    }
    private void InitializeAllItems()
    {
      mConvertMenu.Enabled = false;
      mConvertAllMenu.Enabled = false;
      mConvertAllBtn.Enabled = false;
      mConvertPopupMenu.Enabled = false;
      mConvertAllPopupMenu.Enabled = false;
    }
    private bool ProjectTypeHasBeenSelected()
    {
      if (mProjectTypes.Text != null && !mProjectTypes.Text.Equals("")) return true;
      StatusText = "Select a Project Type to apply...";
      return false;
    }
    private bool ProjectFilesHaveBeenSelected()
    {
      if (mProjects.Items.Count > 0) return true;
      StatusText = "Select at least one Project file to apply changes to...";
      return false;
    }
  }
}

Utils.cs

Synopsis
using System;
using System.Runtime.InteropServices;


namespace ConfigureVC
{
  public class Utils
  {
    internal delegate string getcmdlineDelegate();
    internal static getcmdlineDelegate func = new getcmdlineDelegate(getcmdline);
    
    public static string StartupDirectory
    {
      get 
      {
        string commandLine = func().Trim();
        if (commandLine[0] == '\"')
        {
          commandLine = commandLine.Substring(1, commandLine.IndexOf("\"", 1));
        }
        else
        {
          int ispace = commandLine.IndexOf(" ");
          if (ispace > 0)
            commandLine = commandLine.Substring(0, ispace);
        }
        return commandLine.Substring(0, commandLine.LastIndexOf('\\'));
      }
    }

    [ DllImport( "Kernel32.dll", CharSet=CharSet.Auto )] 
    private static extern IntPtr GetCommandLine();   
    internal static string getcmdline()
    {
      return Marshal.PtrToStringAuto( GetCommandLine() );
    }
  }
}

VcProjWriter.cs

Synopsis
using System;
using System.IO;
using System.Xml;

namespace ConfigureVC
{
  /// <summary>
  /// Summary description for VcProjWriter.
  /// </summary>
  class VcProjWriter : XmlTextWriter
  {
    int mIndentLevel;
    public VcProjWriter(Stream s)
      :  base(s, System.Text.Encoding.GetEncoding("Windows-1252"))
    {
      mIndentLevel = 0;
      Formatting = Formatting.Indented;
      Indentation = 8;
      IndentChar = ' ';
    }
    public override void WriteStartElement(string prefix, string name, string ns)
    {
      base.WriteStartElement(prefix, name, ns);
      mIndentLevel++;
    }
    public override void WriteEndElement()
    {
      mIndentLevel--;
      base.WriteEndElement();
    }
    public override void WriteFullEndElement()
    {
      mIndentLevel--;
      base.WriteFullEndElement();
    }
    public override void WriteStartAttribute(string prefix, string name, string ns)
    {
      base.Flush();
      base.BaseStream.WriteByte(0x0D);
      base.BaseStream.WriteByte(0x0A);
      for(int i = 0; i < (base.Indentation * mIndentLevel) - 1; ++i)
        base.BaseStream.WriteByte(Convert.ToByte(base.IndentChar));
      base.Flush();
      base.WriteStartAttribute(prefix, name, ns);
      base.Flush();
    }
  }
}






Contact me about content on this page using john_web-at-arrizza-dot-com
For Web Master or site problems contact: webadmin-at-arrizza-dot-com
Copyright John Arrizza (c) 2001-2010