ide: fixed menu enabling/disabling on debugger state change and different build scena...
authorRejean Loyer <rejean.loyer@gmail.com>
Sun, 12 Jun 2011 00:53:58 +0000 (20:53 -0400)
committerRejean Loyer <rejean.loyer@gmail.com>
Sun, 12 Jun 2011 00:53:58 +0000 (20:53 -0400)
ide/src/debugger/Debugger.ec
ide/src/ide.ec
ide/src/project/ProjectView.ec

index 977e759..04d065b 100644 (file)
@@ -550,6 +550,12 @@ class Debugger
    ProgramThread progThread { };
 #endif
 
+   void ChangeState(DebuggerState value)
+   {
+      state = value;
+      if(ide) ide.AdjustDebugMenus();
+   }
+
    void CleanUp()
    {
       // Stop(); // Don't need to call Stop here, because ~ProjectView() will call it explicitly.
@@ -583,7 +589,7 @@ class Debugger
       targetDir = null;
       targetFile = null;
       
-      state = none;
+      ChangeState(none);
       event = none;
       breakType = none;
 
@@ -635,7 +641,7 @@ class Debugger
       {
          if(targetProcessId)
          {
-            ide.DebugUpdateMenus(running, true);
+            //ide.AdjustDebugMenus();
             GdbDebugBreak(false);
          }
       }
@@ -660,16 +666,6 @@ class Debugger
       }
    }
 
-   property bool isInDebugMode
-   {
-      get
-      {
-         if(state == running || state == stopped)
-            return true;
-         return false;
-      }
-   }
-
    void Restart()
    {
       switch(state)
@@ -683,6 +679,10 @@ class Debugger
             break;
          case stopped:
             GdbAbortExec();
+         case none:
+         case terminated:
+            if(!GdbInit())
+               break;
          case loaded:
             GdbExecRun();
             break;
@@ -801,7 +801,7 @@ class Debugger
       bool returnedExitCode = false;
       char verboseExitCode[128];
       
-      state = loaded;
+      ChangeState(loaded); // this state change seems to be superfluous, might be in case of gdb crash
       targetProcessId = 0;
 
       if(code)
@@ -824,7 +824,7 @@ class Debugger
          }
       }
 
-      ide.DebugUpdateMenus(loaded, false);
+      //ide.AdjustDebugMenus();
 
 #if defined(__unix__)
       progThread.terminate = true;
@@ -1701,7 +1701,7 @@ class Debugger
 
          if(ide)
          {
-            ide.DebugUpdateMenus(running, true);
+            //ide.AdjustDebugMenus();
             ide.Update(null);
          }
          app.Unlock();
@@ -1709,9 +1709,9 @@ class Debugger
             serialSemaphore.Wait();
          else
          {
-            state = loaded;
+            ChangeState(loaded);
             targetProcessId = 0;
-            ide.DebugUpdateMenus(loaded, false);
+            //ide.AdjustDebugMenus();
          }
          app.Lock();
       }
@@ -1818,7 +1818,7 @@ class Debugger
 
       prjConfig = project.config;
 
-      state = loaded;
+      ChangeState(loaded);
       sentKill = false;
       sentBreakInsert = false;
       symbols = true;
@@ -1884,8 +1884,8 @@ class Debugger
 
             if(!GdbTargetSet())
             {
-               //state = terminated;
-               //ide.DebugUpdateMenus(loaded, false);
+               //ChangeState(terminated);
+               //ide.AdjustDebugMenus();
                result = false;
             }
 
@@ -1961,7 +1961,7 @@ class Debugger
          }
       }
       gdbTimer.Stop();
-      state = terminated;
+      ChangeState(terminated); // this state change seems to be superfluous, is it safety for something?
       prjConfig = null;
 
       if(ide.workspace)
@@ -1974,7 +1974,7 @@ class Debugger
       
       ide.outputView.debugBox.Logf("Debugging stopped\n");
       ClearBreakDisplay();
-      ide.DebugUpdateMenus(loaded, false);
+      //ide.AdjustDebugMenus();
       ide.Update(null);
 
 #if defined(__unix__)
@@ -2577,7 +2577,7 @@ class Debugger
                   // Why was SelectFrame missing here?
                   SelectFrame(activeFrameLevel);
                   GoToStackFrameLine(activeFrameLevel, true);
-                  ide.DebugUpdateMenus(stopped, false);
+                  //ide.AdjustDebugMenus();
                   ide.Activate();
                   ide.Update(null);
                }
@@ -2602,7 +2602,7 @@ class Debugger
                      // Why was SelectFrame missing here?
                      SelectFrame(activeFrameLevel);
                      GoToStackFrameLine(activeFrameLevel, true);
-                     ide.DebugUpdateMenus(stopped, false);
+                     //ide.AdjustDebugMenus();
                      ide.Activate();
                      ide.Update(null);
                      if(bp.type == BreakpointType::runToCursor)
@@ -2631,10 +2631,10 @@ class Debugger
    {
       if(state != terminated)
       {
-         state = terminated;
+         ChangeState(terminated);
          targetProcessId = 0;
          ClearBreakDisplay();
-         ide.DebugUpdateMenus(loaded, false);
+         //ide.AdjustDebugMenus();
 
          if(gdbHandle)
          {
@@ -2647,7 +2647,7 @@ class Debugger
             ide.outputView.debugBox.Logf("Debugging stopped\n");
             ide.Update(null);
          }
-         //state = terminated;
+         //ChangeState(terminated);
       }
    }
 
@@ -2715,7 +2715,7 @@ class Debugger
                   if(sentKill)
                   {
                      sentKill = false;
-                     state = loaded;
+                     ChangeState(loaded);
                      targetProcessId = 0;
                      if(outTokens.count > 1 && TokenizeListItem(outTokens[1], item))
                      {
@@ -2979,10 +2979,10 @@ class Debugger
             }
             else if(!strcmp(outTokens[0], "^exit"))
             {
-               state = terminated;
-               ide.DebugUpdateMenus(loaded, false);
+               ChangeState(terminated);
+               //ide.AdjustDebugMenus();
                // ide.outputView.debugBox.Logf("Exit\n");
-               ide.Update(null);
+               //ide.Update(null);
                gdbReady = true;
                serialSemaphore.Release();
             }
@@ -3022,29 +3022,29 @@ class Debugger
                      }
                      else if(!strcmp(item.value, "Cannot find bounds of current function"))
                      {
-                        state = stopped;
+                        ChangeState(stopped);
                         gdbHandle.Printf("-exec-continue\n");
                      }
                      else if(!strcmp(item.value, "ptrace: No such process."))
                      {
-                        state = loaded;
+                        ChangeState(loaded);
                         targetProcessId = 0;
-                        ide.DebugUpdateMenus(loaded, false);
+                        //ide.AdjustDebugMenus();
                      }
                      else if(!strcmp(item.value, "Function \\\"WinMain\\\" not defined."))
                      {
                      }
                      else if(!strcmp(item.value, "You can't do that without a process to debug."))
                      {
-                        state = loaded;
+                        ChangeState(loaded);
                         targetProcessId = 0;
-                        ide.DebugUpdateMenus(loaded, false);
+                        //ide.AdjustDebugMenus();
                      }
                      else if(strstr(item.value, "No such file or directory."))
                      {
-                        state = loaded;
+                        ChangeState(loaded);
                         targetProcessId = 0;
-                        ide.DebugUpdateMenus(loaded, false);
+                        //ide.AdjustDebugMenus();
                      }
                      else
                      {
@@ -3094,7 +3094,7 @@ class Debugger
                }
                else if(!strcmp(outTokens[0], "*stopped"))
                {
-                  state = stopped;
+                  ChangeState(stopped);
                   
                   if(outTokens.count > 1 && TokenizeListItem(outTokens[1], item))
                   {
@@ -3172,7 +3172,7 @@ class Debugger
                            }
 
                            event = stepEnd;
-                           ide.DebugUpdateMenus(stopped, false);
+                           //ide.AdjustDebugMenus();
                            ide.Update(null);
                         }
                         else if(!strcmp(reason, "function-finished"))
@@ -3204,7 +3204,7 @@ class Debugger
                            }
 
                            event = functionEnd;
-                           ide.DebugUpdateMenus(stopped, false);
+                           //ide.AdjustDebugMenus();
                            ide.Update(null);
                         }
                         else if(!strcmp(reason, "signal-received"))
@@ -3245,16 +3245,14 @@ class Debugger
                                  case stop:
                                     break;
                                  default:
-                                    ide.DebugUpdateMenus(stopped, false);
                                     event = breakEvent;
-                                    ide.Update(null);
+                                    //ide.AdjustDebugMenus(); ide.Update(null);
                               }
                            }
                            else
                            {
                               event = signal;
-                              ide.DebugUpdateMenus(stopped, false);
-                              ide.Update(null);
+                              //ide.AdjustDebugMenus(); ide.Update(null);
                            }
                         }
                         else if(!strcmp(reason, "watchpoint-trigger"))
@@ -3296,9 +3294,8 @@ class Debugger
 
                   if(targetProcessId)
                   {
-                     state = running;
-                     ide.DebugUpdateMenus(running, false);
-                     ide.Update(null);
+                     ChangeState(running);
+                     //ide.AdjustDebugMenus(); ide.Update(null);
                   }
                   else if(!oldProcessID)
                   {
@@ -3306,7 +3303,7 @@ class Debugger
                      // TO VERIFY: The rest of this block has not been thoroughly tested in this particular location
                      gdbHandle.Printf("-gdb-exit\n");
                      gdbTimer.Stop();
-                     state = terminated; //loaded;
+                     ChangeState(terminated); //loaded;
                      prjConfig = null;
 
                      if(ide.workspace)
@@ -3321,8 +3318,7 @@ class Debugger
                      
                      ide.outputView.debugBox.Logf("Debugging stopped\n");
                      ClearBreakDisplay();
-                     ide.DebugUpdateMenus(loaded, false);
-                     ide.Update(null);
+                     //ide.AdjustDebugMenus(); ide.Update(null);
 
                #if defined(__unix__)
                      if(FileExists(progFifoPath)) //fileCreated)
index 9a850ea..13bce1a 100644 (file)
@@ -212,11 +212,14 @@ class IDE : Window
    hasHorzScroll = true;
    hasMenuBar = true;
    hasStatusBar = true;
-   state = maximized;
 #ifdef _DEBUG
    //stayOnTop = true;
+   size = { 800, 600 };
+   anchor = { top = 0, right = 0, bottom = 0 };
+#else
+   state = maximized;
+   anchor = { left = 0, top = 0, right = 0, bottom = 0 };
 #endif
-   anchor = Anchor { left = 0, top = 0, right = 0, bottom = 0 };
    menu = Menu {  };
 
    MenuItem * driverItems, * skinItems;
@@ -263,8 +266,8 @@ class IDE : Window
                if(!ide.findInFilesDialog || !ide.findInFilesDialog.SearchAbort())
                   ide.ShowCodeEditor(); 
                break;
-            case ctrlC:
-               ide.StopBuild(true);
+            case ctrlS:
+               ide.projectView.stopBuild = true;
                break;
             default:
             {
@@ -480,9 +483,6 @@ class IDE : Window
    ToolBox toolBox { parent = this };
    Sheet sheet { parent = this };
 
-   bool buildInProgress;
-   bool stopBuild;
-
    char * tmpPrjDir;
    property char * tmpPrjDir { set { delete tmpPrjDir; if(value) tmpPrjDir = CopyString(value); } get { return tmpPrjDir; } };
 
@@ -691,15 +691,18 @@ class IDE : Window
          {
             if(projectView)
             {
-               if(findInFilesDialog)
-                  findInFilesDialog.SearchStop();
-               projectView.visible = false;
-               if(projectView.Destroy(0))
-                  MenuWindowCloseAll(null, 0);
+               if(!ide.DontTerminateDebugSession("Project Close"))
                {
-                  char workingDir[MAX_LOCATION];
-                  GetWorkingDir(workingDir, MAX_LOCATION);
-                  findInFilesDialog.currentDirectory = workingDir;
+                  if(findInFilesDialog)
+                     findInFilesDialog.SearchStop();
+                  projectView.visible = false;
+                  if(projectView.Destroy(0))
+                     MenuWindowCloseAll(null, 0);
+                  {
+                     char workingDir[MAX_LOCATION];
+                     GetWorkingDir(workingDir, MAX_LOCATION);
+                     findInFilesDialog.currentDirectory = workingDir;
+                  }
                }
             }
             return true;
@@ -819,25 +822,16 @@ class IDE : Window
       {
          if(projectView)
          {
-            debugStartResumeItem.disabled = true;
+            debugStartResumeItem.disabled = true; // a very rare exception to calling AdjustDebugMenus
             if(!projectView.DebugStart())
-               debugStartResumeItem.disabled = false;
+               debugStartResumeItem.disabled = false; // same exception
          }
          return true;
       }
       bool MenuDebugResume(MenuItem selection, Modifiers mods)
       {
          if(projectView)
-         {
-            /*if(projectView.IsProjectModified())
-            {
-               debugStartResumeItem.disabled = true;
-               if(!projectView.DebugStart(null, null))
-                  debugStartResumeItem.disabled = false;
-            }
-            else*/
-               projectView.DebugResume();
-         }
+            projectView.DebugResume();
          return true;
       }
       MenuItem debugRestartItem
@@ -1234,7 +1228,7 @@ class IDE : Window
             projectView = null;
             text = titleECEREIDE;
             
-            UpdateDisabledMenus();
+            AdjustMenus();
 
             viewProjectItem.disabled = true;
          }
@@ -1247,28 +1241,7 @@ class IDE : Window
       projectView.project = project;
       SetText("%s - %s", project.topNode.name, titleECEREIDE);
 
-      UpdateDisabledMenus();
-      if(project.targetType == executable)
-         DebugUpdateMenus(loaded, false);
-      /*
-      projectCloseItem.disabled = false;
-      projectBuildItem.disabled = false;
-      projectRebuildItem.disabled = false;
-      projectRegenerateItem.disabled = false;
-      projectCompileItem.disabled = false;
-      projectLinkItem.disabled = false;
-      projectCleanItem.disabled = false;
-      viewProjectItem.disabled = false;
-      
-      if(project.config.targetType == executable)
-      {
-         projectRunItem.disabled = false;
-         debugStartResumeItem.disabled = false;
-         DebugUpdateMenus(loaded, false);
-      }
-      projectActiveConfigItem.disabled = false;
-      projectSettingsItem.disabled = false;
-      */
+      AdjustMenus();
 
       ide.breakpointsView.LoadFromWorkspace();
       ide.watchesView.LoadFromWorkspace();
@@ -1299,7 +1272,7 @@ class IDE : Window
       if(this)
       {
          Window child;
-         bool inDebugMode = debugger.isInDebugMode;
+         bool inDebugMode = debugger.isActive;
          bool callStackVisible = expand ? false : callStackView.visible;
          bool threadsVisible = expand ? false : threadsView.visible;
          bool watchesVisible = expand ? false : watchesView.visible;
@@ -1352,48 +1325,9 @@ class IDE : Window
       return false;
    }
 
-   void DisableBuildItems(bool disabled, bool debugStart)
-   {
-      if(projectView)
-      {
-         projectNewItem.disabled = disabled;
-         projectOpenItem.disabled = disabled;
-         projectCompileItem.disabled = disabled;
-         projectRebuildItem.disabled = disabled;
-         projectRegenerateItem.disabled = disabled;
-         projectLinkItem.disabled = disabled;
-         projectBuildItem.disabled = disabled;
-         projectCleanItem.disabled = disabled;
-         projectCloseItem.disabled = disabled;
-         projectRunItem.disabled = disabled;
-
-         debugStartResumeItem.disabled = debugStart;
-         if(disabled)
-         {
-            debugRestartItem.disabled = true;
-            debugBreakItem.disabled = true;
-            debugStopItem.disabled = true;
-         }
-         /*else if(!debugStart)
-         {
-            debugRestartItem.disabled = false;
-            debugBreakItem.disabled = false;
-            debugStopItem.disabled = false;
-         }*/
-
-         buildInProgress = disabled;
-         if(!disabled) stopBuild = false;
-      }
-   }
-
-   void StopBuild(bool state)
-   {
-      stopBuild = state;
-   }
-
    bool ShouldStopBuild()
    {
-      return stopBuild;  
+      return projectView.stopBuild;
    }
 
    void DocumentSaved(Window document, char * fileName)
@@ -1443,66 +1377,86 @@ class IDE : Window
       }
    }
 
-   void UpdateDisabledMenus()
+   void AdjustMenus()
    {
-      projectQuickItem.disabled = (bool)projectView;
-      projectAddItem.disabled = !projectView;
-      projectCloseItem.disabled = !projectView;
-
-      activeCompilerItem.disabled = !projectView;
-      projectActiveConfigItem.disabled = !projectView;
-      projectSettingsItem.disabled = !projectView;
-
-      projectBrowseFolderItem.disabled = !projectView;
-      projectRunItem.disabled = projectView && project.targetType != executable;
-      projectBuildItem.disabled = !projectView;
-      projectLinkItem.disabled = !projectView;
-      projectRebuildItem.disabled = !projectView;
-      projectCleanItem.disabled = !projectView;
-      projectRegenerateItem.disabled = !projectView;
-      projectCompileItem.disabled = !projectView;
-
-      /*  What is this? This completely ignore the debugger's state!
-      debugStartResumeItem.disabled = !projectView; // && project.targetType == executable);
-      debugRestartItem.disabled = true;
-      debugBreakItem.disabled = true;
-      debugStopItem.disabled = true;
-
-      debugStepIntoItem.disabled = true;
-      debugStepOverItem.disabled = true;
-      debugStepOutItem.disabled = true;
-      debugRunToCursorItem.disabled = true;
-      debugSkipStepOverItem.disabled = true;
-      debugSkipStepOutItem.disabled = true;
-      debugSkipRunToCursorItem.disabled = true;
-      */
-      DebugUpdateMenus(ide.debugger.state, false);
+      // TODO: still a bit more clearing thing up, having things where they belong etc...
+      //       remove duplication or superfluous action as much as possible...
+      //       here and in AdjustBuildMenus
+
+      bool unavailable = !projectView;
+
+      projectQuickItem.disabled           = !unavailable;
+
+      projectAddItem.disabled             = unavailable;
+      projectCloseItem.disabled           = unavailable;
+
+      activeCompilerItem.disabled         = unavailable;
+      projectActiveConfigItem.disabled    = unavailable;
+      projectSettingsItem.disabled        = unavailable;
+
+      projectBrowseFolderItem.disabled    = unavailable;
 
-      viewProjectItem.disabled = !projectView;
+      projectRunItem.disabled             = unavailable || !project || project.targetType != executable;
+      projectBuildItem.disabled           = unavailable;
+      projectLinkItem.disabled            = unavailable;
+      projectRebuildItem.disabled         = unavailable;
+      projectCleanItem.disabled           = unavailable;
+      projectRegenerateItem.disabled      = unavailable;
+      projectCompileItem.disabled         = unavailable;
+
+      AdjustDebugMenus();
+
+      viewProjectItem.disabled            = unavailable;
    }
-   
-   void DebugUpdateMenus(DebuggerState state, bool breaking)
+
+   void AdjustBuildMenus()
    {
-      debugStartResumeItem.text           = (state == loaded) ? "Start" : "Resume";
-      debugStartResumeItem.NotifySelect   = (state == loaded) ? MenuDebugStart : MenuDebugResume;
-      debugStartResumeItem.disabled       = (state == running);
-      debugBreakItem.disabled             = (state != running || breaking);
-      debugStopItem.disabled              = (state == loaded);
-      debugRestartItem.disabled           = (state == loaded);
-
-      debugStepIntoItem.disabled          = (state == running);
-      debugStepOverItem.disabled          = (state == running);
-      debugStepOutItem.disabled           = (state == running) || (state == loaded);
-      debugSkipStepOverItem.disabled      = (state == running);
-      debugSkipStepOutItem.disabled       = (state == running) || (state == loaded);
+      bool unavailable = !projectView || !projectView.project || projectView.buildInProgress;
+
+      projectNewItem.disabled          = unavailable;
+      projectOpenItem.disabled         = unavailable;
+      projectCloseItem.disabled        = unavailable;
+
+      projectRunItem.disabled          = unavailable;
+      projectBuildItem.disabled        = unavailable;
+      projectLinkItem.disabled         = unavailable;
+      projectRebuildItem.disabled      = unavailable;
+      projectCleanItem.disabled        = unavailable;
+      projectRegenerateItem.disabled   = unavailable;
+      projectCompileItem.disabled      = unavailable;
+   }
+
+   void AdjustDebugMenus()
+   {
+      bool unavailable = !projectView || !projectView.project ||
+               projectView.project.targetType != executable ||
+               projectView.buildInProgress.actualBuild;
+      bool active = ide.debugger.isActive;
+      bool executing = ide.debugger.state == running;
+      //bool holding = ide.debugger.state == stopped;
+
+      debugStartResumeItem.disabled       = unavailable || executing;
+
+      debugStartResumeItem.text           = active ? "Resume" : "Start";
+      debugStartResumeItem.NotifySelect   = active ? MenuDebugResume : MenuDebugStart;
+
+      debugBreakItem.disabled             = unavailable || !executing;
+      debugStopItem.disabled              = unavailable || !active;
+      debugRestartItem.disabled           = unavailable || !active;
+
+      debugStepIntoItem.disabled          = unavailable || executing;
+      debugStepOverItem.disabled          = unavailable || executing;
+      debugStepOutItem.disabled           = unavailable || executing || !active;
+      debugSkipStepOverItem.disabled      = unavailable || executing;
+      debugSkipStepOutItem.disabled       = unavailable || executing || !active;
 
       if((Designer)GetActiveDesigner())
       {
          CodeEditor codeEditor = ((Designer)GetActiveDesigner()).codeEditor;
          if(codeEditor)
          {
-            codeEditor.debugRunToCursor.disabled      = (state == running);
-            codeEditor.debugSkipRunToCursor.disabled  = (state == running);
+            codeEditor.debugRunToCursor.disabled      = unavailable || executing;
+            codeEditor.debugSkipRunToCursor.disabled  = unavailable || executing;
          }
       }
    }
@@ -2189,7 +2143,7 @@ class IDE : Window
                   sprintf(name, "Compile %s", node.name);
                   projectCompileItem = 
                   {
-                     copyText = true, text = name, c, ctrlF7, disabled = buildInProgress;
+                     copyText = true, text = name, c, ctrlF7, disabled = projectView.buildInProgress;
 
                      bool NotifySelect(MenuItem selection, Modifiers mods)
                      {
@@ -2215,8 +2169,8 @@ class IDE : Window
 
    bool OnClose(bool parentClosing)
    {
-      //return !buildInProgress;
-      if(buildInProgress)
+      //return !projectView.buildInProgress;
+      if(projectView && projectView.buildInProgress)
          return false;
       if(DontTerminateDebugSession("Close IDE"))
          return false;
index 2e2057d..30614b7 100644 (file)
@@ -107,7 +107,14 @@ static char * iconNames[] =
 
 enum PrepareMakefileMethod { normal, force, forceExists };
 
-enum BuildType { build, rebuild, relink, run, debug };
+enum BuildType { build, rebuild, relink, run, start, restart };
+enum BuildState
+{
+   none, buildingMainProject, buildingSecondaryProject, compilingFile;
+
+   property bool { get { return this != none; } }
+   property bool actualBuild { get { return this == buildingMainProject || this == buildingSecondaryProject;  } }
+};
 
 class ProjectView : Window
 {
@@ -126,7 +133,7 @@ class ProjectView : Window
    saveDialog = projectFileDialog;
    
    DataRow resourceRow;
-   bool buildInProgress;
+   BuildState buildInProgress;
    BitmapResource icons[NodeIcons];
    Project project;
    Workspace workspace;
@@ -203,6 +210,8 @@ class ProjectView : Window
    bool drawingInProjectSettingsDialogHeader;
    ProjectSettings projectSettingsDialog;
 
+   bool stopBuild;
+
    ListBox fileList
    {
       multiSelect = true, fullRowSelect = false, hasVertScroll = true, hasHorzScroll = true;
@@ -229,6 +238,7 @@ class ProjectView : Window
             ProjectNode node = (ProjectNode)row.tag;
             if(node.type == NodeTypes::project || node.type == resources || node.type == file || node.type == folder)
             {
+               bool buildMenuUnavailable = buildInProgress;
                PopupMenu popupMenu;
                Menu popupContent { };
                
@@ -236,11 +246,11 @@ class ProjectView : Window
                {
                   //if(node == ((Project)workspace.projects.first).topNode)
                   {
-                     MenuItem { popupContent, "Build", b, NotifySelect = ProjectBuild }.disabled = buildInProgress;
-                     MenuItem { popupContent, "Relink", l, NotifySelect = ProjectLink }.disabled = buildInProgress;
-                     MenuItem { popupContent, "Rebuild", r, NotifySelect = ProjectRebuild }.disabled = buildInProgress;
-                     MenuItem { popupContent, "Clean", c, NotifySelect = ProjectClean }.disabled = buildInProgress;
-                     MenuItem { popupContent, "Regenerate Makefile", m, NotifySelect = ProjectRegenerate }.disabled = buildInProgress;
+                     MenuItem { popupContent, "Build", b, NotifySelect = ProjectBuild }.disabled = buildMenuUnavailable;
+                     MenuItem { popupContent, "Relink", l, NotifySelect = ProjectLink }.disabled = buildMenuUnavailable;
+                     MenuItem { popupContent, "Rebuild", r, NotifySelect = ProjectRebuild }.disabled = buildMenuUnavailable;
+                     MenuItem { popupContent, "Clean", c, NotifySelect = ProjectClean }.disabled = buildMenuUnavailable;
+                     MenuItem { popupContent, "Regenerate Makefile", m, NotifySelect = ProjectRegenerate }.disabled = buildMenuUnavailable;
                      MenuDivider { popupContent };
                   }
                   MenuItem { popupContent, "New File...", l, Key { l, ctrl = true }, NotifySelect = ProjectNewFile };
@@ -253,7 +263,7 @@ class ProjectView : Window
                   MenuDivider { popupContent };
                   if(node != ((Project)workspace.projects.first).topNode)
                   {
-                     MenuItem { popupContent, "Remove project from workspace", r, NotifySelect = ProjectRemove }.disabled = buildInProgress;
+                     MenuItem { popupContent, "Remove project from workspace", r, NotifySelect = ProjectRemove }.disabled = buildMenuUnavailable;
                      MenuDivider { popupContent };
                   }
                   MenuItem { popupContent, "Active Configuration...", s, Key { f5, alt = true } , NotifySelect = MenuConfig };
@@ -278,7 +288,7 @@ class ProjectView : Window
                else if(node.type == file)
                {
                   MenuItem { popupContent, "Open", o, NotifySelect = FileOpenFile };
-                  MenuItem { popupContent, "Compile", c, Key { f7, ctrl = true}, NotifySelect = FileCompile }.disabled = buildInProgress;
+                  MenuItem { popupContent, "Compile", c, Key { f7, ctrl = true}, NotifySelect = FileCompile }.disabled = buildMenuUnavailable;
                   MenuDivider { popupContent };
                   MenuItem { popupContent, "Remove", r, NotifySelect = FileRemoveFile };
                   MenuDivider { popupContent };
@@ -404,7 +414,7 @@ class ProjectView : Window
                      }
                      prj.RotateActiveConfig(!key.shift);
                      if(prj == project)
-                        ide.UpdateDisabledMenus();
+                        ide.AdjustMenus();
                      return false;
                   }
                   break;
@@ -593,7 +603,7 @@ class ProjectView : Window
             DeleteFile(fileName);
       }
 
-      ide.StopBuild(false);
+      stopBuild = false;
 
       // Check if we have to save
       strcpy(fileName, prj.topNode.path);
@@ -614,7 +624,8 @@ class ProjectView : Window
       {
          if(!node.isExcluded)
          {
-            buildInProgress = true;
+            buildInProgress = compilingFile;
+            ide.AdjustBuildMenus();
 
             //ide.outputView.ShowClearSelectTab(build);
             // this stuff doesn't even appear
@@ -624,10 +635,9 @@ class ProjectView : Window
             else
                ide.outputView.buildBox.Logf("Compiling single file %s in project %s...\n", node.name, prj.name);
 
-            ide.DisableBuildItems(true, false);
             prj.Compile(node);
-            ide.DisableBuildItems(false, false);
-            buildInProgress = false;
+            buildInProgress = none;
+            ide.AdjustBuildMenus();
          }
          else
             ide.outputView.buildBox.Logf("File %s is excluded from current build configuration.\n", node.name);
@@ -979,16 +989,16 @@ class ProjectView : Window
             prj = node.project;
       }
       if(/*prj != project || */!prj.configIsInDebugSession || !ide.DontTerminateDebugSession("Project Build"))
-         BuildInterrim(prj, build, false);
+         BuildInterrim(prj, build);
       return true;
    }
 
-   bool BuildInterrim(Project prj, BuildType buildType, bool disableDebugStart)
+   bool BuildInterrim(Project prj, BuildType buildType)
    {
       if(ProjectPrepareForToolchain(prj, normal, true, true))
       {
          ide.outputView.buildBox.Logf("Building project %s using the %s configuration...\n", prj.name, prj.configName);
-         return Build(prj, buildType, disableDebugStart);
+         return Build(prj, buildType);
       }
       return false;
    }
@@ -1014,7 +1024,7 @@ class ProjectView : Window
          ide.outputView.buildBox.Logf("Relinking project %s using the %s configuration...\n", prj.name, prj.configName);
          if(prj.config)
             prj.config.linkingModified = true;
-         Build(prj, relink, false);
+         Build(prj, relink);
       }
       return true;
    }
@@ -1030,7 +1040,7 @@ class ProjectView : Window
             prj.config.compilingModified = true;
             prj.config.makingModified = true;
          }*/ // -- should this still be used depite the new solution of BuildType?
-         Build(prj, rebuild, false);
+         Build(prj, rebuild);
       }
       return true;
    }
@@ -1042,12 +1052,12 @@ class ProjectView : Window
       {
          ide.outputView.buildBox.Logf("Cleaning project %s using the %s configuration...\n", prj.name, prj.configName);
          
-         buildInProgress = true;
-         ide.DisableBuildItems(true, false);
+         buildInProgress = prj == project ? buildingMainProject : buildingSecondaryProject;
+         ide.AdjustBuildMenus();
 
          prj.Clean();
-         ide.DisableBuildItems(false, false);
-         buildInProgress = false;
+         buildInProgress = none;
+         ide.AdjustBuildMenus();
       }
       return true;
    }
@@ -1168,7 +1178,7 @@ class ProjectView : Window
    bool MenuConfig(MenuItem selection, Modifiers mods)
    {
       if(ProjectActiveConfig { parent = parent.parent, master = parent, project = project }.Modal() == ok)
-         ide.UpdateDisabledMenus();
+         ide.AdjustMenus();
       return true;
    }
 
@@ -1198,7 +1208,7 @@ class ProjectView : Window
       projectSettingsDialog.Modal();
 
       Update(null);
-      ide.UpdateDisabledMenus();
+      ide.AdjustMenus();
       return true;
    }
 
@@ -1251,12 +1261,12 @@ class ProjectView : Window
    }
    */
 
-   bool Build(Project prj, BuildType buildType, bool disableDebugStart)
+   bool Build(Project prj, BuildType buildType)
    {
       bool result = true;
       Window document;
 
-      ide.StopBuild(false);
+      stopBuild = false;
       for(document = master.firstChild; document; document = document.next)
       {
          if(document.modifiedDocument)
@@ -1281,7 +1291,7 @@ class ProjectView : Window
          //        In building, we want to stop if we're debugging the 'same' executable
          if(buildType != run) ///* && prj == project*/ && prj.configIsInDebugSession)
          {
-            if(buildType == debug)
+            if(buildType == start || buildType == restart)
             {
                if(ide.debugger && ide.debugger.isPrepared)
                {
@@ -1334,9 +1344,9 @@ class ProjectView : Window
                delete objDir;
             }
          }
-         buildInProgress = true;
-         //if(prj == project)    // Why did we put these here? There was nothing to prevent building an added project multiple times at once
-            ide.DisableBuildItems(true, true);
+         buildInProgress = prj == project ? buildingMainProject : buildingSecondaryProject;
+         ide.AdjustBuildMenus();
+         if(buildType == start || buildType == restart) ide.AdjustDebugMenus();
 
          result = prj.Build(buildType == run, null);
 
@@ -1348,9 +1358,9 @@ class ProjectView : Window
 
             prj.config.symbolGenModified = false;
          }
-         //if(prj == project)
-            ide.DisableBuildItems(false, disableDebugStart);
-         buildInProgress = false;
+         buildInProgress = none;
+         ide.AdjustBuildMenus();
+         if(buildType == start || buildType == restart) ide.AdjustDebugMenus();
 
          ide.workspace.modified = true;
 
@@ -1406,11 +1416,11 @@ class ProjectView : Window
       if(ide.workspace.commandLineArgs)
          //ide.debugger.GetCommandLineArgs(args);
          strcpy(args, ide.workspace.commandLineArgs);
-      if(ide.debugger.isInDebugMode)
+      if(ide.debugger.isActive)
          project.Run(args);
       /*else if(project.config.targetType == sharedLibrary || project.config.targetType == staticLibrary)
          MessageBox { type = ok, text = "Run", contents = "Shared and static libraries cannot be run like executables." }.Modal();*/
-      else if(BuildInterrim(project, run, false))
+      else if(BuildInterrim(project, run))
          project.Run(args);
       return true;
    }
@@ -1425,7 +1435,7 @@ class ProjectView : Window
       else if(project.debug ||
          MessageBox { type = okCancel, text = "Starting Debug", contents = "Attempting to debug non-debug configuration\nProceed anyways?" }.Modal() == ok)
       {
-         if(/*!IsProjectModified() ||*/ BuildInterrim(project, debug, true))
+         if(/*!IsProjectModified() ||*/ BuildInterrim(project, start))
          {
             CompilerConfig compiler = ideSettings.GetCompilerConfig(ide.workspace.compiler);
             if(compiler.type.isVC)
@@ -1461,7 +1471,7 @@ class ProjectView : Window
 
    bool DebugRestart()
    {
-      if(/*!IsProjectModified() ||*/ BuildInterrim(project, debug, true))
+      if(/*!IsProjectModified() ||*/ BuildInterrim(project, restart))
       {
          ide.debugger.Restart();
          return true;
@@ -1489,14 +1499,14 @@ class ProjectView : Window
 
    bool DebugStepInto()
    {
-      if((ide.debugger.isInDebugMode) || (!buildInProgress && BuildInterrim(project, debug, true)))
+      if((ide.debugger.isActive) || (!buildInProgress && BuildInterrim(project, start)))
          ide.debugger.StepInto();
       return true;
    }
 
    bool DebugStepOver(bool skip)
    {
-      if((ide.debugger.isInDebugMode) || (!buildInProgress && BuildInterrim(project, debug, true)))
+      if((ide.debugger.isActive) || (!buildInProgress && BuildInterrim(project, start)))
          ide.debugger.StepOver(skip);
       return true;
    }