From 70326b65a44d7a1b1bda5a998a2f00335af8854c Mon Sep 17 00:00:00 2001
From: Vadim Lopatin <coolreader.org@gmail.com>
Date: Thu, 29 Jan 2015 11:54:13 +0300
Subject: [PATCH] update builder

---
 src/dlangide/builders/extprocess.d     |  19 ++++++++++++++++---
 src/dlangide/ui/commands.d             |   4 ++--
 src/dlangide/ui/frame.d                |  12 ++++--------
 src/dlangide/workspace/workspace.d     |  12 ++++++++++++
 views/res/mdpi/configure.png           | Bin 0 -> 606 bytes
 views/res/mdpi/run-build-clean.png     | Bin 0 -> 865 bytes
 views/res/mdpi/run-build-configure.png | Bin 0 -> 803 bytes
 views/res/mdpi/run-build.png           | Bin 0 -> 759 bytes
 views/resources.list                   |   3 +++
 9 files changed, 37 insertions(+), 13 deletions(-)
 create mode 100644 views/res/mdpi/configure.png
 create mode 100644 views/res/mdpi/run-build-clean.png
 create mode 100644 views/res/mdpi/run-build-configure.png
 create mode 100644 views/res/mdpi/run-build.png

diff --git a/src/dlangide/builders/extprocess.d b/src/dlangide/builders/extprocess.d
index 4cccd2d..24eaf02 100644
--- a/src/dlangide/builders/extprocess.d
+++ b/src/dlangide/builders/extprocess.d
@@ -236,6 +236,7 @@ class ExternalProcess {
     }
 
     ExternalProcessState run(char[] program, char[][]args, char[] dir, TextWriter stdoutTarget, TextWriter stderrTarget = null) {
+        Log.d("ExternalProcess.run ", program, " ", args);
         _state = ExternalProcessState.None;
         _program = program;
         _args = args;
@@ -272,29 +273,39 @@ class ExternalProcess {
     }
 
     protected void waitForReadingCompletion() {
+        Log.d("waitForReadingCompletion - closing stdin");
         try {
 		    _pipes.stdin.close();
         } catch (Exception e) {
             Log.e("Cannot close stdin for ", _program, " ", e);
         }
+        Log.d("waitForReadingCompletion - closed stdin");
         try {
-            if (_stdoutReader && !_stdoutReader.finished)
+            if (_stdoutReader && !_stdoutReader.finished) {
+                Log.d("waitForReadingCompletion - waiting for stdout");
                 _stdoutReader.join(false);
+                Log.d("waitForReadingCompletion - joined stdout");
+            }
             _stdoutReader = null;
         } catch (Exception e) {
             Log.e("Exception while waiting for stdout reading completion for ", _program, " ", e);
         }
         try {
-            if (_stderrReader && !_stderrReader.finished)
+            if (_stderrReader && !_stderrReader.finished) {
+                Log.d("waitForReadingCompletion - waiting for stderr");
                 _stderrReader.join(false);
-            _stderrReader = null;
+                _stderrReader = null;
+                Log.d("waitForReadingCompletion - joined stderr");
+            }
         } catch (Exception e) {
             Log.e("Exception while waiting for stderr reading completion for ", _program, " ", e);
         }
+        Log.d("waitForReadingCompletion - done");
     }
 
     /// polls all available output from process streams
     ExternalProcessState poll() {
+        Log.d("ExternalProcess.poll");
         bool res = true;
         if (_state == ExternalProcessState.Error || _state == ExternalProcessState.None || _state == ExternalProcessState.Stopped)
             return _state;
@@ -315,6 +326,7 @@ class ExternalProcess {
 
     /// waits until termination
     ExternalProcessState wait() {
+        Log.d("ExternalProcess.wait");
         if (_state == ExternalProcessState.Error || _state == ExternalProcessState.None || _state == ExternalProcessState.Stopped)
             return _state;
         try {
@@ -330,6 +342,7 @@ class ExternalProcess {
 
     /// request process stop
     ExternalProcessState kill() {
+        Log.d("ExternalProcess.kill");
         if (_state == ExternalProcessState.Error || _state == ExternalProcessState.None || _state == ExternalProcessState.Stopped)
             return _state;
         if (_state == ExternalProcessState.Running) {
diff --git a/src/dlangide/ui/commands.d b/src/dlangide/ui/commands.d
index 13c0ac2..c68952f 100644
--- a/src/dlangide/ui/commands.d
+++ b/src/dlangide/ui/commands.d
@@ -47,8 +47,8 @@ const Action ACTION_FILE_EXIT = new Action(IDEActions.FileExit, "MENU_FILE_EXIT"
 const Action ACTION_WORKSPACE_BUILD = new Action(IDEActions.BuildWorkspace, "MENU_BUILD_WORKSPACE_BUILD"c);
 const Action ACTION_WORKSPACE_REBUILD = new Action(IDEActions.RebuildWorkspace, "MENU_BUILD_WORKSPACE_REBUILD"c);
 const Action ACTION_WORKSPACE_CLEAN = new Action(IDEActions.CleanWorkspace, "MENU_BUILD_WORKSPACE_CLEAN"c);
-const Action ACTION_PROJECT_BUILD = new Action(IDEActions.BuildProject, "MENU_BUILD_PROJECT_BUILD"c, null, KeyCode.F7, 0);
-const Action ACTION_PROJECT_REBUILD = new Action(IDEActions.RebuildProject, "MENU_BUILD_PROJECT_REBUILD"c, null, KeyCode.F7, KeyFlag.Control);
+const Action ACTION_PROJECT_BUILD = new Action(IDEActions.BuildProject, "MENU_BUILD_PROJECT_BUILD"c, "run-build", KeyCode.F7, 0);
+const Action ACTION_PROJECT_REBUILD = new Action(IDEActions.RebuildProject, "MENU_BUILD_PROJECT_REBUILD"c, "run-build-clean", KeyCode.F7, KeyFlag.Control);
 const Action ACTION_PROJECT_CLEAN = new Action(IDEActions.CleanProject, "MENU_BUILD_PROJECT_CLEAN"c, null);
 const Action ACTION_PROJECT_SET_STARTUP = new Action(IDEActions.SetStartupProject, "MENU_PROJECT_SET_AS_STARTUP"c, null);
 const Action ACTION_PROJECT_SETTINGS = new Action(IDEActions.ProjectSettings, "MENU_PROJECT_SETTINGS"c, null);
diff --git a/src/dlangide/ui/frame.d b/src/dlangide/ui/frame.d
index 7bc17cd..3faa8ac 100644
--- a/src/dlangide/ui/frame.d
+++ b/src/dlangide/ui/frame.d
@@ -147,7 +147,7 @@ class IDEFrame : AppFrame {
             TabItem tab = _tabs.tab(index);
             ProjectSourceFile file = cast(ProjectSourceFile)tab.objectParam;
             if (file) {
-                setCurrentProject(file.project);
+                //setCurrentProject(file.project);
                 // tab is source file editor
                 _wsPanel.selectItem(file);
                 focusEditor(file.filename);
@@ -341,6 +341,7 @@ class IDEFrame : AppFrame {
         tb.addButtons(ACTION_DEBUG_START);
         ToolBarComboBox cbBuildConfiguration = new ToolBarComboBox("buildConfig", ["Debug"d, "Release"d, "Unittest"d]);
         tb.addControl(cbBuildConfiguration);
+        tb.addButtons(ACTION_PROJECT_BUILD);
 
         tb = res.getOrAddToolbar("Edit");
         tb.addButtons(ACTION_EDIT_COPY, ACTION_EDIT_PASTE, ACTION_EDIT_CUT, ACTION_SEPARATOR,
@@ -474,15 +475,10 @@ class IDEFrame : AppFrame {
         _wsPanel.workspace = ws;
     }
 
-    Project currentProject;
-    void setCurrentProject(Project project) {
-        currentProject = project;
-    }
-
     void buildProject() {
-        if (!currentProject)
+        if (!currentWorkspace || !currentWorkspace.startupProject)
             return;
-        Builder op = new Builder(this, currentProject, _logPanel);
+        Builder op = new Builder(this, currentWorkspace.startupProject, _logPanel);
         setBackgroundOperation(op);
     }
 }
diff --git a/src/dlangide/workspace/workspace.d b/src/dlangide/workspace/workspace.d
index 7067a94..9727b54 100644
--- a/src/dlangide/workspace/workspace.d
+++ b/src/dlangide/workspace/workspace.d
@@ -38,6 +38,16 @@ class Workspace : WorkspaceItem {
         return _projects;
     }
 
+    protected Project _startupProject;
+
+    @property Project startupProject() { return _startupProject; }
+    @property void startupProject(Project project) { _startupProject = project; }
+
+    protected void fillStartupProject() {
+        if (!_startupProject && _projects.length)
+            _startupProject = _projects[0];
+    }
+
     /// tries to find source file in one of projects, returns found project source file item, or null if not found
     ProjectSourceFile findSourceFileItem(string filename) {
         foreach (Project p; _projects) {
@@ -60,6 +70,7 @@ class Workspace : WorkspaceItem {
     void addProject(Project p) {
         _projects ~= p;
         p.workspace = this;
+        fillStartupProject();
     }
 
     string absoluteToRelativePath(string path) {
@@ -130,6 +141,7 @@ class Workspace : WorkspaceItem {
             Log.e("Cannot read workspace file", e);
             return false;
         }
+        fillStartupProject();
         return true;
     }
     void close() {
diff --git a/views/res/mdpi/configure.png b/views/res/mdpi/configure.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c2f5eae94f95a896ddcada9b8ef5ed499dda8f6
GIT binary patch
literal 606
zcmV-k0-^nhP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006dNkl<ZcmZP|
z227kd!R-9`b6d`yJM(n^fxXvOtzOZZm7UH*l;+^DVEy~|?|uFE@8AEo@815OHht>v
zsOZRZ7MAAbL>Z7@kT><^s~7*jfB*LX$dSWefkIwD%nihh#OP-M8gLHi^#30}e)xa&
z>a|a7Y;1xI!~$&{Ey)E7=lz;FYsUW%Km$H}c>jOyyg7@rvom<NY~8HiKcTM&uK}%X
zEeS`D9sXZbT=c)9s`~${S1<qX-M{C5M@Rd+Teoli&&kcXf=@s5j-A^Nw6?eZuc)s1
zZ)NZJf9K9!|8L#8`G5NKssA@`-SkI5Kp+#VP7zTNrd_*tc6|Qy@&CR1cmLZsIQ`Gc
z$@#x=^QQlI@7?)dQBnRwSXj6hsFV{!b4F%5&w&H`R~<ci<p0*KTmS$0^ZWnKT|2+|
z2l!uibg*A9C@5G9ROSf8Y?yv-ZBpF5d*_82Gp7BwvbOqv=<uQcOP4M=29&Y}VgXRB
z;Ph}qQ@zWEjq6_L=H>hsmk|Fyb=s8w8#isd43ttN6kAMn4K;;}mMr)c5gGoUkB{$v
zYI^E_U^Kmyl$5X_7}ss>&1ExYP5U1m9ra&ZTl;@dNYMXv8&-ceGc%1ODz(j>H|ySn
zNj?8V!@~Y2r6m4eymaATFE7sqsDB9qpoZNOCiniIIJxit%-K`_g@gvr1PXHzom@M+
sJ5)Nm+xFJfRbCAY@&`o`4+9AR0Ht>d+)<QBjsO4v07*qoM6N<$f_m;b8~^|S

literal 0
HcmV?d00001

diff --git a/views/res/mdpi/run-build-clean.png b/views/res/mdpi/run-build-clean.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1040407185565d931d31b7a3e67c5b31c755653
GIT binary patch
literal 865
zcmV-n1D^beP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0009hNkl<Zc-nPR
zTTD`M7^l|O>cw7Kt)8ma9($>+R*%gti<KcF3KrRQnW@!sT4|snh(w^Kl^`f~B=v9(
z-~~8HVY(QSt=rJeOMq)mU%X7uFAmLG%f9WmegEIS@AuvQy!Fg%HXojunOTU(;|msx
z<;Z$5c2nggvcB-cZ^GelobY<R8Jy2BjCN&Z1sr@n-xH1t1OmcfFnDS$o@}~5Hq@my
zCm-G2-6v;fXE8T7hw15QEH5u(adDC5u(Y&<si`T<&(DL4ak+X<`CTph-Ns`0J9UTF
zs!L+A7!qwG8jXS^Npy5{B#{v31d@CtGKRJ`>lM1C(#e=hVt>svGBSek@o`WTjp+9{
zLg65Sp<zr;d`}44@%7s`ya~L6JYSgCrj$YdK=vw`==b{%dORL&BoaYlPJI0mfz4Ti
z(Bw0WMw{`<sYq~R@cMipn@U;Ia0?A(xiCDGRU`%a`udg=%faaAC>sukF*F#2oZJCw
zObo|(Hq_qT=<Q`-R_Ea@QI6O3cR^HSv4rYk`>%7@?Mqzc;o)JH8)1M6;I4HG?s@j0
zz_S-6^fol;G$7O$KsDS3rN05IT*S62B)<d*f;dJ|lz|iBE-*9{L_yhU+^}rNmDZiO
zRel`m+v#|z%!5srhnCXwuqrZPdYpX|Ka78t=ytogE-*1M37T?1r`4h9MKjE`B`}qX
zV1IfYntMVh^UtCpKMnd)+0oz0G))T_h5-j|AF)^*(fAJx_7bSSlL}|uRW#mDB;7d!
zn?eAKJOjIUyscf00^Zsl_+0f+D3lcV_~|ozE`oJx1gI<Gqg^fpRU<)tK`Lmi6vjsa
z{PVY6E*HPQzhA=nooz3zgO)-ROAoVeUtC+ItHgL-%m?#S3Zg0<Zo|chtxC9MK*`_8
zThEMog``WD3y<~!7+ntQGvusxszexU$bmy6Vh0*8JIGq;E?afx=6{mwlxe&k_4yP^
zopGsKl||E);;^GuJoDa^3$h{&%oE9Kk3l9UHPRHaI&%Z>f7YcEZ|YErQ(mjG_Ssa~
rM@?nvGGoaZ!l%o5R#SBDz*^i-eIz%TrYlt400000NkvXXu0mjfXGE9}

literal 0
HcmV?d00001

diff --git a/views/res/mdpi/run-build-configure.png b/views/res/mdpi/run-build-configure.png
new file mode 100644
index 0000000000000000000000000000000000000000..faf21851bbbb7706f7f8bbe8402e49f5c70e5e07
GIT binary patch
literal 803
zcmV+;1Kj+HP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008&Nkl<Zc-obc
z>r2y77{^x#6$FU|hC=8oFZ}~4Solh^dLc?m`a)Aov+`Zq3(;x1S;lgvrq0V&38qUo
z-KL_=%YMsUOx<RaH8-Q?HWlxtbNc&seo>Jafe#$ch4Ve1@AEu|^{;4cZH-!7T-;t*
zSlA}(%fF6Kak!kw{QSHN%m%<gQGb8`_0iGMWM)m~s=d8E?C<YGrBXi^i`#iS+uyOd
zwTW5VXLN|$X2`XZf5bgKJvY|Y*08?54yV%zM(pu;Xs_2x_x1I{>2hM%>xEiPAu{5U
zjYt^KiNEP-#4eVWmf&`~(cRq*u~-a=M2g(pdvG|uVQXUpa)lhq_sX<?=4~(-FgG^`
znM@A1a}fs9Bqj~xC@m|6R4T#p@-l2T8<Y5%-<qQ00)G}oQ4zz#!&P>>9b;o-uv+Zs
z?B&7W5TIXM0l8d(B6cB6CKFaxSLoMoM0-!3mgj$*7`J9;XDL{NgM+&h6BC%8o~Df^
zBXrtHl=YlL@7ELvWe-tXSC69NVg!eT!R4OEnC1iBAgBjLsTem&ESXH^VaR&Do@P=|
zjcAb9=7U^GASS1#pwVg(5p@NbcXRNzqaE{32TDrV@IUY05gHnLoJEQitxzalYBU<S
zTrQ03r|^h#6L$L-SS(g}c6T7|>_mJ*Jh)sg;^N{y1q1|^5W3HSA`T4=VTusROx)-Y
zdo32+axQc_9XK2gghC+*h_QW)j6<I&Nu{FD)Z9pD?Fb4ELUKwnj3xtVWfy6q17@=s
zT9VGdz`(6T545z1Qfq3f@S=tfzq5V_zZeEetpcB4Nn5Q}7>&lCU0{k$Y8HP$oS2y4
z%d4zdEh%Hu;bGwj2?;@$^c_k|AJZ0#1tTLP)yzGmQkhEV35V!SO$~+oY97)vZX@Pu
z41}+maVINt#%!L!?CdP0QfV~nf6*dpP7^fNfw(|}pceNZ<V=&})2yQeuku-45xZb6
hJtIv-w!TNv{s2^~{@PDmQ<?w(002ovPDHLkV1mdqb7%kn

literal 0
HcmV?d00001

diff --git a/views/res/mdpi/run-build.png b/views/res/mdpi/run-build.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ae4c73d369cb042c70816c84cf4584d36484ea1
GIT binary patch
literal 759
zcmV<T0to$yP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008MNkl<ZcmZuw
z-%FEW6#fdj_NFen>7od_=`ZM_i~flqP`b!e7-6PPb|Zlyte`Z4Ml`obl-ZWDH8*v?
z-R3surrXs0n46pEbW==lI*_MxUixA}54@a@_dP$J^PKZZG6n|+g;gjN!p_ajwe9Wg
z)pvJy>pq|FwbX?E{(k8aR4SFQlarIr<U5<qHga)sfkvZ&rKP1`^1a<|Z)K~~=_CQQ
zS}klK5b(3}^7688b91wDdU}eJlM`|3^*XZIY&{l>S<cSRP$(3N9HUe!B>}x&-*J3=
zjB2%t!^1=H_tw@H=I7@@6|ug)4*8whLZwpSxA!8ry}eynq8Z%T*%3}=vsnaZG8sBq
zxLht63<mIfKA#7%EpbeDcenHpBvh5CaUjvniQ^8K;0hSAx*A71ox$wvEY{Z6;C8zq
z$yi)meByLEKQK+|odrWGmByI43mY{(a=$0=!}|i^aF8n_7z`qjNN|$x^xehdI*&vm
zRAp848jHm-@pA-ULib_Kx4~9;if{1;_-yEa!{J0SnG`Id(I|*DB<lCv@AtF%C>D!k
zqxd>L47KMbRPNgtaNog@_ZEgVkKyrnQ7V-<n3+&Q2PC7>I7GeK`GQ+WB~x%Y+~|CJ
z0|WNEP+0HbrS3YkS`AiKR<OOjjZi4WS_P)3r$0$e3(_DxP^;C5njd3YEuO!6gihr{
zjDCDav=i9h-{;D*h}WcMOifK$cw8QjN6gyq50Gd<M5r~^=IH1Mxm-?Ew^%G29Mjv|
zD+!oPrq*ycEL3JenQFOQ#=*e>ACZugq*5uw<8k3*wOZda{}@-Oa+y|@E0ox>Gpo(h
zk-urgX-+_**L!+;TKf9>Bms>^Ba+ZQjL0o5EG&%k$oP1@ULRdu{d=#bqAj$U(j{=V
pW;-)8qu^Cer_-Qa8U3FR;}5H+b3Z)K5G4Qr002ovPDHLkV1m^taq$2E

literal 0
HcmV?d00001

diff --git a/views/resources.list b/views/resources.list
index 0e90c77..383c363 100644
--- a/views/resources.list
+++ b/views/resources.list
@@ -16,4 +16,7 @@ res/mdpi/edit-redo.png
 res/mdpi/edit-undo.png
 res/mdpi/project-development.png
 res/mdpi/project-open.png
+res/mdpi/run-build.png
+res/mdpi/run-build-clean.png
+res/mdpi/run-build-configure.png
 res/mdpi/tx_fabric.jpg