public void buildGui()
    	{
    		var topPanel = this.add_Panel();
    		Path = topPanel.insert_Above<TextBox>(20);
			sourceCode = topPanel.add_SourceCodeEditor();
			dataGridView = sourceCode.insert_Above<Panel>(100).add_DataGridView();
			leftPanel = topPanel.insert_Left<Panel>(300);									
			
			Path.onEnter(loadFiles);
			Path.onDrop(
				(fileOrFolder)=>{
									Path.set_Text(fileOrFolder);
									loadFiles(fileOrFolder);
								}); 	   	   	   	   
			dataGridView.SelectionChanged+= 
				(sender,e) => {
						if (dataGridView.SelectedRows.size() == 1)
						{
							var selectedRow = dataGridView.SelectedRows[0]; 
							var filePath = selectedRow.Cells[0].Value.str();
							var filename = selectedRow.Cells[1].Value.str();
							var lineNumber = selectedRow.Cells[2].Value.str();
							"opening up source code: {0}".info(filePath);
							sourceCode.open(filePath.pathCombine(filename));  
							sourceCode.gotoLine(lineNumber.toInt() + 1);
							dataGridView.focus();
						}
				  };
								
		}
        private void buildGui()
        {
        	var controls = this.add_1x1("original text", "translated text");
        	
        	source_TextBox = controls[0].add_TextBox(true);
        	translation_TextBox = controls[1].add_TextBox(true);       	
			source_TextBox.TextChanged +=(sender,e) => translateText(source_TextBox.Text);
			
			source_TextBox.set_Text("Good morning from London");
     	}   
		public API_MSBuild_Gui buildGui(Panel _topPanel)
		{
			topPanel = _topPanel;
			msBuild = new API_MSBuild(); 
			buildEnabled = true;
			consoleOut_TextArea = topPanel.insert_Right(300).add_GroupBox("Console Out details").add_TextArea_With_SearchPanel().wordWrap(false);
			tableList = topPanel.clear().add_TableList("VisualStudio MSBuild results");
			tableList.add_Columns("Project", "Path", "Status", "Time", "Console Out");
			 
			startBuild = (pathToProject) =>
								{
									var buildStatus = "SKIPPED";
									var buildResult = false;
									if (buildEnabled)
									{															
										buildResult = msBuild.build_Ok(pathToProject); 
										buildStatus = buildResult ? "OK" :  "FAILED";																				
									}
									else
									{
										"buildEnabled was set to false, so skipping build for: {0}".error(pathToProject);
										msBuild.ConsoleOut = new StringBuilder();
									}
										
									tableList.add_ListViewItem(	pathToProject.fileName(), 
															   	pathToProject, 
															   	buildStatus, 
															   	msBuild.BuildDuration.timeSpan_ToString(),
															   	msBuild.ConsoleOut.str())
											 .foreColor(buildResult, Color.Green, Color.Red);
										
							   	}; 
			 
			tableList.afterSelect_get_Cell(4, (value)=>consoleOut_TextArea.set_Text(value)); 
			buildEnabled_CheckBox  	= tableList.insert_Below(50,"Config")
									 			.add_CheckBox("Build Enabled",3,0,(value) => buildEnabled = value).check();
			//currentTarget_TextBox	= buildEnabled_CheckBox.append_Label("Current Target").top(8).autoSize().append_TextBox("").width(300);
			status_Label 			= buildEnabled_CheckBox.append_Label("...").autoSize().top(8);
			
			tableList.add_ContextMenu()
					 .add_MenuItem("Recompile project" , true ,
					 	()=>{		 			
					 			startBuild(tableList.selected().values().second());
							})
					 .add_MenuItem("Open Project folder" ,  true,
					 	()=>{		 			
					 			tableList.selected().values()
					 								.second()
					 								.directoryName()
					 								.startProcess();
							})
					.add_MenuItem("Clear table" ,
						()=> tableList.clearRows() ); 
			
			//tableList.onDoubleClick_get_Row((row)=> buildProject(row.values().second()));
			tableList.columns_Width(200,200,50, 100,-2);
			
			buildProjects = (fileOrFolder, onBuildComplete)=>
								{
									//currentTarget_TextBox.set_Text(fileOrFolder);
									O2Thread.mtaThread(
										()=>{												
												var start = DateTime.Now;
												tableList.listView().backColor(Color.Azure);
												"Loading file(s) from: {0}".info(fileOrFolder);
												if (fileOrFolder.fileExists())
												{
													status_Label.set_Text("[1/1] Building: {0}".format(fileOrFolder.fileName()));
													startBuild(fileOrFolder);
												}
												else
												{
													var files = fileOrFolder.csproj_Files();
													"Found {0} csproj files to process: {0}".debug(files.size());
													var processed = 1;
													foreach(var file in files)
													{
														status_Label.set_Text("[{0}/{1}] Building: {2}".format(processed ++, files.size(), file.fileName()));
														startBuild(file);																											
													}
												}
												status_Label.set_Text("Build complete");
												tableList.listView().backColor(Color.White);		
												"Build Projects action was completed in: {0}".info(start.timeSpan_ToString());
												onBuildComplete();
											});
								};	
			
			tableList.listView().onDrop((fileOrFolder)=> buildProjects(fileOrFolder, ()=>{}));
			return this;
		}
        public static TextBox add_DropArea(this IStep step, int left, int top, int width, int height, Action<string> onDroppedFile)
        {
            var colorWhenNotReadyToDrop = Color.LightCoral;
            var colorWhenReadyToDrop = Color.LightGreen;
            var dropArea = new TextBox();
            dropArea.Multiline = true;
            dropArea.BackColor = colorWhenNotReadyToDrop;
            dropArea.Left = left;
            dropArea.Top = top;
            dropArea.Width = width;
            dropArea.Height = height;
            dropArea.AllowDrop = true;

            dropArea.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;

            dropArea.DragDrop += (sender, e) =>
            {
                var fileOrDirectory = Dnd.tryToGetFileOrDirectoryFromDroppedObject(e);
                dropArea.set_Text(fileOrDirectory);
                onDroppedFile(fileOrDirectory);
            };
            dropArea.DragEnter += (sender, e) =>
            {
                e.Effect = DragDropEffects.Copy;
                dropArea.BackColor = colorWhenReadyToDrop;
            };
            dropArea.DragLeave += (sender, e) => dropArea.BackColor = colorWhenNotReadyToDrop;

            step.add_Control(dropArea);

            return dropArea;
        }
        public static IStep add_SelectFolder(this List<IStep> steps, string stepTitle, string defaultFolder, Action<string> setResult)
        {
            // textbox
            var textBox = new TextBox();
            textBox.TextChanged += (sender, e) =>
            {
                setResult(textBox.Text);
                PublicDI.log.info("in TextChanged");
            };
            textBox.Text = defaultFolder;
            textBox.Width = 400;
            textBox.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
            textBox.AllowDrop = true;
            textBox.DragDrop += (sender, e) => textBox.set_Text(Dnd.tryToGetFileOrDirectoryFromDroppedObject(e));
            textBox.DragEnter += (sender, e) => e.Effect = DragDropEffects.Copy;

            // button
            var button = new Button();
            button.Text = "Select Folder";
            button.Width += 20;
            button.Click += (sender, e) =>
            {
                var folderBrowserDialog = new FolderBrowserDialog();
                folderBrowserDialog.SelectedPath = defaultFolder;
                if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
                {
                    textBox.Text = folderBrowserDialog.SelectedPath;
                    folderBrowserDialog.Dispose();
                }
            };

            // panel
            var panel = new FlowLayoutPanel();
            panel.Dock = DockStyle.Fill;// AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;

            panel.Controls.Add(textBox);
            panel.Controls.Add(button);

            var newStep = new TemplateStep(panel, 10, stepTitle);
            steps.Add(newStep);
            return newStep;
        }
        public static IStep add_SelectFile(this List<IStep> steps, string stepTitle, string defaultFolder, int top, int textBoxLeft, int textBoxWidth, Action<string> setResult, Action<TextBox, Button> callbackWithControls)
        {
            // textbox
            var textBox = new TextBox();
            textBox.TextChanged += (sender, e) => setResult(textBox.Text);
            textBox.Text = defaultFolder;
            if (top > -1)
                textBox.Top = top;
            if (textBoxLeft > -1)
                textBox.Left = textBoxLeft;
            textBox.Width = (textBoxWidth > -1) ? textBoxWidth : 90;
            textBox.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
            textBox.AllowDrop = true;
            textBox.DragDrop += (sender, e) => textBox.set_Text(Dnd.tryToGetFileOrDirectoryFromDroppedObject(e));
            textBox.DragEnter += (sender, e) => e.Effect = DragDropEffects.Copy;

            // button
            var button = new Button();
            if (top > -1)
                button.Top = top;
            button.Top -= 2;
            button.Text = "Select File";
            button.Width += 20;
            button.Left = textBox.Width + textBox.Left + 2;
            button.Anchor = AnchorStyles.Right | AnchorStyles.Top;
            button.Click += (sender, e) =>
            {
                var openFileDialog = new OpenFileDialog();
                openFileDialog.InitialDirectory = defaultFolder;
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    textBox.Text = openFileDialog.FileName;
                    openFileDialog.Dispose();
                }
            };

            // panel
            var step = steps.add_Panel("stepTitle");
            //var panel = new FlowLayoutPanel();
            //panel.Dock = DockStyle.Fill;// AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;

            step.add_Control(textBox);
            step.add_Control(button);
            callbackWithControls(textBox, button);
            //var newStep = new TemplateStep(panel, 10, stepTitle);
            //steps.Add(newStep);
            return step;
        }