public MainForm(string[] CmdLineArgs) { InitializeComponent(); Panel1.Dock = DockStyle.Fill; Panel2.Dock = DockStyle.Fill; m_CmdLineArgs = CmdLineArgs; m_Font = ScriptTextbox.Font; Globals.prepare_application_data_dir(); LoadConfig(); // New, empty document m_Document = new Document(ScriptTextbox, ListView1); ApplyDocumentNameToGui(); m_CompilationData = null; m_State = State.ScriptTab; SetState(State.ScriptTab); }
// Timer tick during compilation process private void CompilationTimer_Tick(object sender, EventArgs e) { if (m_CompilationData == null) return; // !!! // Show progress int ItemCount = m_CompilationData.GetItemCount(); int DoneCount = m_CompilationData.GetProgress(); MainStatusStrip.Items[1].Text = string.Format("{0}/{1}", DoneCount, ItemCount); ((ToolStripProgressBar)MainStatusStrip.Items[2]).Value = DoneCount; bool UpdateBegun = false; // New finished tasks int[] FinishedIndices = m_CompilationData.LoadFinishedIndices(); if (FinishedIndices.Length > 0) { UpdateBegun = true; ListView1.BeginUpdate(); } foreach (int FinishedIndex in FinishedIndices) { string Output, s1, s2; bool Succeeded; int NumErrors, NumWarnings, ListViewItemIndex; m_CompilationData.GetTaskOutput(FinishedIndex, out ListViewItemIndex, out Output, out Succeeded, out NumErrors, out NumWarnings); if (Succeeded) s1 = "Succeeded"; else s1 = "Failed"; if (NumErrors > 0 && NumWarnings > 0) s2 = string.Format(" ({0} errors, {1} warnings)", NumErrors, NumWarnings); else if (NumErrors > 0) s2 = string.Format(" ({0} errors)", NumErrors); else if (NumWarnings > 0) s2 = string.Format(" ({0} warnings)", NumWarnings); else s2 = ""; ListView1.Items[ListViewItemIndex].SubItems[2].Text = s1; ListView1.Items[ListViewItemIndex].SubItems[3].Text = s1 + s2; Task t = (Task)(ListView1.Items[ListViewItemIndex].Tag); t.Output = Output; // Update output textbox if this item is selected if (ListView1.Items[ListViewItemIndex].Selected && ListView1.SelectedItems.Count == 1) OutputTextBox.Text = Output; } // Work done if (m_CompilationData.IsAllDone()) { SetState(State.BuildTab); int[] UnfinishedTaskIndices = m_CompilationData.GetUnfinishedIndices(); if (UnfinishedTaskIndices.Length > 0 && !UpdateBegun) { UpdateBegun = true; ListView1.BeginUpdate(); } foreach (int UnfinishedIndex in UnfinishedTaskIndices) ListView1.Items[m_CompilationData.GetTaskListViewIndex(UnfinishedIndex)].SubItems[2].Text = "Aborted"; if (m_CompilationData.IsAborting()) MainStatusStrip.Items[0].Text = "Compilation aborted."; else { int Succeeded, Failed; m_CompilationData.GetStats(out Succeeded, out Failed); MainStatusStrip.Items[0].Text = string.Format("Build: {0} succeeded, {1} failed, {2} up-to-date", Succeeded, Failed, m_UpToDateTaskCount); } if (!m_CompilationData.IsAborting()) UpdateTaskFileTime(); m_CompilationData = null; } if (UpdateBegun) ListView1.EndUpdate(); }
// Begin build process private void Build(WhatToBuild What, bool Rebuild) { if (m_State != State.BuildTab) return; string FxcPath; if (!EnsureFxcPath(out FxcPath)) return; if (!EnsureDocumentHasFileName()) return; m_CompilationData = new CompilationData(FxcPath, m_Document.GetFileDirectory()); m_UpToDateTaskCount = 0; ListView1.BeginUpdate(); foreach (ListViewItem Item in ListView1.Items) { if (What == WhatToBuild.All || (What == WhatToBuild.Selected && Item.Selected) || (What == WhatToBuild.Checked && Item.Checked)) { Task t = (Task)Item.Tag; if (Rebuild || TaskShouldBeBuilt(t)) { Item.SubItems[2].Text = "Compiling..."; m_CompilationData.AddItem(new CompilationDataItem(t.Parameters, Item.Index)); } else if (!Rebuild) { Item.SubItems[2].Text = "Up-To-Date"; m_UpToDateTaskCount++; } } else Item.SubItems[2].Text = ""; } ListView1.EndUpdate(); if (m_CompilationData.GetItemCount() > 0) { int NumThreads = Math.Min(m_NumCompilationThreads, m_CompilationData.GetItemCount()); m_CompilationData.SetThreadCount(NumThreads); for (int i = 0; i < NumThreads; i++) { Thread th = new Thread(new ParameterizedThreadStart(CompilationThreadProc)); th.Start(m_CompilationData); } SetState(State.Compilation); MainStatusStrip.Items[0].Text = "Compilation in progres..."; MainStatusStrip.Items[1].Text = string.Format("0/{0}", m_CompilationData.GetItemCount()); ((ToolStripProgressBar)MainStatusStrip.Items[2]).Maximum = m_CompilationData.GetItemCount(); ((ToolStripProgressBar)MainStatusStrip.Items[2]).Value = 0; MainStatusStrip.Items[2].Visible = true; // Yield to start threads Thread.Sleep(0); } else MainStatusStrip.Items[0].Text = "Nothing to build."; }