From de2c64ee60852b1a904fd12517481537c420df9f Mon Sep 17 00:00:00 2001 From: oyvang Date: Wed, 13 May 2015 13:33:59 +0200 Subject: [PATCH 1/3] fixed terminal view and compile and run --- juci/directories.cc | 13 ++++++- juci/source.cc | 3 +- juci/terminal.cc | 90 +++++++++++++++++++++------------------------ juci/terminal.h | 6 +-- juci/window.cc | 51 +++++++++++++++++-------- juci/window.h | 3 +- 6 files changed, 95 insertions(+), 71 deletions(-) diff --git a/juci/directories.cc b/juci/directories.cc index ba3008c..3134d6f 100644 --- a/juci/directories.cc +++ b/juci/directories.cc @@ -99,7 +99,18 @@ int Directories::Controller::count(const std::string path) { boost::algorithm::trim(project_name_var); if (variabel_start == std::string::npos) { // not a variabel variabel_start = line.find("(", 0); - variabel_end = line.find(")", variabel_start); + + variabel_end = line.find(' ', variabel_start); + if(variabel_end != std::string::npos){ + return line.substr(variabel_start+1, + (variabel_end)-variabel_start-1); + } + variabel_end = line.find("#", variabel_start); + if(variabel_end != std::string::npos){ + return line.substr(variabel_start+1, + (variabel_end)-variabel_start-1); + } + variabel_end = line.find(")", variabel_start); return line.substr(variabel_start+1, (variabel_end)-variabel_start-1); } diff --git a/juci/source.cc b/juci/source.cc index ea6a213..30b63ff 100644 --- a/juci/source.cc +++ b/juci/source.cc @@ -356,7 +356,7 @@ void Source::Controller::OnOpenFile(const string &filepath) { notebook_->index()); view().OnUpdateSyntax(model().ExtractTokens(start_offset, end_offset), model().config()); - } + buffer()->signal_end_user_action().connect([this]() { if (!go) { @@ -392,6 +392,7 @@ void Source::Controller::OnOpenFile(const string &filepath) { syntax.unlock(); } }); + } } Glib::RefPtr Source::Controller::buffer() { return view().get_buffer(); diff --git a/juci/terminal.cc b/juci/terminal.cc index e7f1ede..4b624e2 100644 --- a/juci/terminal.cc +++ b/juci/terminal.cc @@ -1,6 +1,8 @@ #include "terminal.h" #include #include +// #include +// #include Terminal::View::View(){ @@ -21,32 +23,17 @@ void Terminal::Controller::SetFolderCommand( boost::filesystem::path folder_command_ = "cd "+ path_ + "; "; } -bool Terminal::Controller::Compile(){ - if (running.try_lock()) { - std::thread execute([=]() { - Terminal().get_buffer()->set_text(""); - ExecuteCommand("cmake ."); - if (ExistInConsole(cmake_sucsess)){ - ExecuteCommand("make"); - } - }); - execute.detach(); - running.unlock(); - if (ExistInConsole(make_built)) return true; - } - PrintMessage("juCi++ ERROR: Failed to compile project in directory" - + path_ + "\n"); - return false; +void Terminal::Controller::Compile(){ + Terminal().get_buffer()->set_text(""); + ExecuteCommand("cmake .", "r"); + if (ExistInConsole(cmake_sucsess)){ + ExecuteCommand("make", "r"); + } } void Terminal::Controller::Run(std::string executable) { - if (running.try_lock()) { - std::thread execute([=]() { - ExecuteCommand("./"+executable); - }); - execute.detach(); - running.unlock(); - } + PrintMessage("juCi++ execute: " + executable + "\n"); + ExecuteCommand("./"+executable, "w"); } void Terminal::Controller::PrintMessage(std::string message){ @@ -54,22 +41,6 @@ void Terminal::Controller::PrintMessage(std::string message){ insert(Terminal().get_buffer()-> end(),"> "+message); } -// bool Terminal::Controller::FindExecutable(std::string executable) { -// std::string build = Terminal().get_buffer()->get_text(); -// double pos = build.find(make_built); -// Gtk::TextIter start = Terminal().get_buffer()->get_iter_at_offset(pos); -// Gtk::TextIter end = Terminal().get_buffer()->get_iter_at_offset(pos); -// while (!end.ends_line()) { -// end.forward_char(); -// } -// build = Terminal().get_buffer()->get_text(start, end); -// pos = build.find_last_of(" "); -// build = build.substr(pos+1); -// std::cout << "DEBUG: BUILD TARGET = "<< build << std::endl; -// std::cout << "EDEBUG: ECUTABLE FILE = "<< executable << std::endl; -// if(build != executable) return false; -// return true; -// } bool Terminal::Controller::ExistInConsole(std::string string) { double pos = Terminal().get_buffer()-> @@ -78,17 +49,38 @@ bool Terminal::Controller::ExistInConsole(std::string string) { return true; } -void Terminal::Controller::ExecuteCommand(std::string command) { - command = folder_command_+command; +void Terminal::Controller::ExecuteCommand(std::string command, std::string mode) { + std::cout << "EXECUTE COMMAND: "<< command << std::endl; - FILE* p = popen(command.c_str(), "r"); - if (p == NULL) { - PrintMessage("juCi++ ERROR: Failed to run command" + command + "\n"); - }else { - char buffer[1028]; - while (fgets(buffer, 1028, p) != NULL) { - PrintMessage(buffer); + if(mode == "w"){ + command = path_ + " " +command + " > some_file.txt"; + system(command.c_str()); + }else{ + + FILE* p = popen(command.c_str(), mode.c_str()); + command = folder_command_+command; + if (p == NULL) { + PrintMessage("juCi++ ERROR: Failed to run command" + command + "\n"); + }else { + char buffer[1028]; + while (fgets(buffer, 1028, p) != NULL) { + PrintMessage(buffer); + } + pclose(p); } - pclose(p); } + + + + // // run a process and create a streambuf that reads its stdout and stderr + // redi::ipstream proc(command, redi::pstreams::pstderr); + // std::string line; + // // read child's stdout + // while (std::getline(proc.out(), line)) + // PrintMessage(line+ "\n"); + + // // read child's stderr + // while (std::getline(proc.err(), line)) + // PrintMessage(line+ "\n"); + } diff --git a/juci/terminal.h b/juci/terminal.h index 650758f..a3fa6a6 100644 --- a/juci/terminal.h +++ b/juci/terminal.h @@ -25,17 +25,15 @@ namespace Terminal { Gtk::TextView& Terminal(){return view_.textview();} void SetFolderCommand(boost::filesystem::path CMake_path); void Run(std::string executable); - bool Compile(); + void Compile(); private: - void ExecuteCommand(std::string command); + void ExecuteCommand(std::string command, std::string mode); bool OnButtonRealeaseEvent(GdkEventKey* key); bool ExistInConsole(std::string string); - // bool FindExecutable(std::string executable); void PrintMessage(std::string message); Terminal::View view_; std::string folder_command_; std::string path_; - std::mutex running; const std::string cmake_sucsess = "Build files have been written to:"; const std::string make_built = "Built target"; const std::string make_executable = "Linking CXX executable"; diff --git a/juci/window.cc b/juci/window.cc index 94bd534..a09ee86 100644 --- a/juci/window.cc +++ b/juci/window.cc @@ -49,14 +49,23 @@ Window::Window() : Gtk::AccelKey(keybindings_.config_ .key_map()["compile_and_run"]), [this]() { - notebook_.OnSaveFile(); - std::string path = notebook_.CurrentPagePath(); - terminal_.SetFolderCommand(path); - if(terminal_.Compile()) { - std::string executable = notebook_.directories(). - GetCmakeVarValue(path,"add_executable"); - terminal_.Run(executable); - } + if (running.try_lock()) { + std::thread execute([=]() { + notebook_.OnSaveFile(); + std::string path = notebook_.CurrentPagePath(); + int pos = path.find_last_of("/\\"); + if(pos != std::string::npos){ + path.erase(path.begin()+pos,path.end()); + terminal_.SetFolderCommand(path); + } + terminal_.Compile(); + std::string executable = notebook_.directories(). + GetCmakeVarValue(path,"add_executable"); + terminal_.Run(executable); + }); + execute.detach(); + running.unlock(); + } }); keybindings_. @@ -66,11 +75,20 @@ Window::Window() : Gtk::AccelKey(keybindings_.config_ .key_map()["compile"]), [this]() { - notebook_.OnSaveFile(); - std::string path = - notebook_.CurrentPagePath(); - terminal_.SetFolderCommand(path); - terminal_.Compile(); + if (running.try_lock()) { + std::thread execute([=]() { + notebook_.OnSaveFile(); + std::string path = notebook_.CurrentPagePath(); + int pos = path.find_last_of("/\\"); + if(pos != std::string::npos){ + path.erase(path.begin()+pos,path.end()); + terminal_.SetFolderCommand(path); + } + terminal_.Compile(); + }); + execute.detach(); + running.unlock(); + } }); this->signal_button_release_event(). @@ -87,9 +105,12 @@ Window::Window() : keybindings_.BuildMenu(); window_box_.pack_start(menu_.view(), Gtk::PACK_SHRINK); + window_box_.pack_start(notebook_.entry_view(), Gtk::PACK_SHRINK); - window_box_.pack_start(notebook_.view()); - window_box_.pack_end(terminal_.view(),Gtk::PACK_SHRINK); + paned_.set_position(300); + paned_.pack1(notebook_.view(), true, false); + paned_.pack2(terminal_.view(), true, true); + window_box_.pack_end(paned_); show_all_children(); } // Window constructor diff --git a/juci/window.h b/juci/window.h index e9c5424..2166c35 100644 --- a/juci/window.h +++ b/juci/window.h @@ -25,11 +25,12 @@ public: Keybindings::Controller& keybindings() { return keybindings_; } private: + std::mutex running; + Gtk::VPaned paned_; //signal handlers void OnWindowHide(); void OnOpenFile(); void OnFileOpenFolder(); - bool OnMouseRelease(GdkEventButton* button); }; From e597f1e222b157f2b0cabe37312f81556678241a Mon Sep 17 00:00:00 2001 From: oyvang Date: Wed, 13 May 2015 15:57:41 +0200 Subject: [PATCH 2/3] add logs to notebook --- juci/notebook.cc | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/juci/notebook.cc b/juci/notebook.cc index 4c6888e..9785cf0 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -1,5 +1,6 @@ -#include "notebook.h" #include +#include "notebook.h" +#include "logging.h" Notebook::Model::Model() { cc_extension_ = ".cc"; @@ -24,11 +25,13 @@ Notebook::Controller::Controller(Gtk::Window* window, Keybindings::Controller& k ispopup = false; view().pack1(directories_.widget(), true, true); CreateKeybindings(keybindings); + INFO("Notebook Controller Sucsess"); } // Constructor void Notebook::Controller::CreateKeybindings(Keybindings::Controller &keybindings) { + INFO("Notebook create signal handlers"); directories().m_TreeView.signal_row_activated() .connect(sigc::mem_fun(*this, &Notebook::Controller::OnDirectoryNavigation)); @@ -138,6 +141,7 @@ void Notebook::Controller::CreateKeybindings(Keybindings::Controller [this]() { Search(false); }); + INFO("Notebook signal handlers sucsess"); } bool Notebook::Controller:: OnMouseRelease(GdkEventButton* button) { @@ -153,6 +157,7 @@ bool Notebook::Controller::OnKeyRelease(GdkEventKey* key) { } bool Notebook::Controller::GeneratePopup(int key_id) { + INFO("Notebook genereate popup, getting iters"); // Get function to fill popup with suggests item vector under is for testing Gtk::TextIter beg = CurrentTextView().get_buffer()->get_insert()->get_iter(); Gtk::TextIter end = CurrentTextView().get_buffer()->get_insert()->get_iter(); @@ -165,6 +170,7 @@ bool Notebook::Controller::GeneratePopup(int key_id) { end.backward_search("\"", Gtk::TEXT_SEARCH_VISIBLE_ONLY, tmp, tmp1, line) || end.backward_search("//", Gtk::TEXT_SEARCH_VISIBLE_ONLY, tmp, tmp1, line); + INFO("Notebook genereate popup, checking key_id"); if (illegal_chars) { return false; } @@ -187,6 +193,7 @@ bool Notebook::Controller::GeneratePopup(int key_id) { } else { return false; } + INFO("Notebook genereate popup, getting autocompletions"); std::vector acdata; text_vec_.at(CurrentPage())-> GetAutoCompleteSuggestions(beg.get_line()+1, @@ -229,16 +236,19 @@ bool Notebook::Controller::GeneratePopup(int key_id) { popup_.get_vbox()->pack_start(popup_scroll_); popup_.set_transient_for(*window_); popup_.show_all(); - + INFO("Notebook genereate popup, moving popup"); int popup_x = popup_.get_width(); int popup_y = items.size() * 20; PopupSetSize(popup_scroll_, popup_x, popup_y); int x, y; FindPopupPosition(CurrentTextView(), popup_x, popup_y, x, y); popup_.move(x, y+15); + INFO("Notebook genereate popup, create handler"); PopupSelectHandler(popup_, listview_, &items); ispopup = true; + INFO("Notebook genereate popup, run popup"); popup_.run(); + INFO("Notebook genereate popup, hide popup"); popup_.hide(); ispopup = false; return true; @@ -261,6 +271,7 @@ bool Notebook::Controller::ScrollEventCallback(GdkEventScroll* scroll_event) { return true; } Notebook::Controller::~Controller() { + INFO("Notebook destructor"); for (auto &i : text_vec_) delete i; for (auto &i : linenumbers_vec_) delete i; for (auto &i : editor_vec_) delete i; @@ -276,6 +287,7 @@ Gtk::Box& Notebook::Controller::entry_view() { } void Notebook::Controller::OnNewPage(std::string name) { + INFO("Notebook Generate new page"); OnCreatePage(); text_vec_.back()->OnNewEmptyFile(); Notebook().append_page(*editor_vec_.back(), name); @@ -294,6 +306,7 @@ MapBuffers(std::map *buffers) { } void Notebook::Controller::OnOpenFile(std::string path) { + INFO("Notebook open file"); OnCreatePage(); text_vec_.back()->OnOpenFile(path); text_vec_.back()->set_is_saved(true); @@ -309,6 +322,7 @@ void Notebook::Controller::OnOpenFile(std::string path) { } void Notebook::Controller::OnCreatePage() { + INFO("Notebook create page"); text_vec_.push_back(new Source::Controller(source_config(), this)); linenumbers_vec_.push_back(new Source::Controller(source_config(), this)); scrolledline_vec_.push_back(new Gtk::ScrolledWindow()); @@ -329,6 +343,7 @@ void Notebook::Controller::OnCreatePage() { } void Notebook::Controller::OnCloseCurrentPage() { + INFO("Notebook close page"); // TODO(oyvang) zalox, forgi) // Save a temp file, in case you close one you dont want to close? if (Pages() != 0) { @@ -372,6 +387,7 @@ void Notebook::Controller::OnEditCut() { } std::string Notebook::Controller::GetCursorWord() { + INFO("Notebook get cursor word"); int page = CurrentPage(); std::string word; Gtk::TextIter start, end; @@ -399,6 +415,7 @@ void Notebook::Controller::OnEditSearch() { } void Notebook::Controller::Search(bool forward) { + INFO("Notebook search"); int page = CurrentPage(); std::string search_word; search_word = entry_.text(); @@ -460,6 +477,7 @@ void Notebook::Controller::OnBufferChange() { void Notebook::Controller ::OnDirectoryNavigation(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column) { + INFO("Notebook directory navigation"); Gtk::TreeModel::iterator iter = directories().m_refTreeModel->get_iter(path); if (iter) { Gtk::TreeModel::Row row = *iter; @@ -539,6 +557,7 @@ void Notebook::Controller::PopupSelectHandler(Gtk::Dialog &popup, void Notebook::Controller::PopupSetSize(Gtk::ScrolledWindow &scroll, int ¤t_x, int ¤t_y) { + INFO("Notebook popup set size"); int textview_x = CurrentTextView().get_width(); int textview_y = 150; bool is_never_scroll_x = true; @@ -573,6 +592,7 @@ void Notebook::Controller::FindPopupPosition(Gtk::TextView& textview, int popup_y, int &x, int &y) { + INFO("Notebook popup find position"); Gdk::Rectangle temp1, temp2; textview.get_cursor_locations( CurrentTextView(). @@ -602,6 +622,7 @@ void Notebook::Controller::FindPopupPosition(Gtk::TextView& textview, } void Notebook::Controller:: OnSaveFile() { + INFO("Notebook save file"); if (text_vec_.at(CurrentPage())->is_saved()) { std::ofstream file; file.open (text_vec_.at(CurrentPage())->path()); @@ -622,6 +643,7 @@ void Notebook::Controller:: OnSaveFile() { std::string Notebook::Controller::OnSaveFileAs(){ + INFO("Notebook save as"); Gtk::FileChooserDialog dialog("Please choose a file", Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.set_transient_for(*window_); From 9087f660ca8647d069cbe0c4f51ec82bfac8e6db Mon Sep 17 00:00:00 2001 From: oyvang Date: Wed, 13 May 2015 16:18:09 +0200 Subject: [PATCH 3/3] fixed bug with complie and run --- juci/notebook.cc | 8 +++++++- juci/window.cc | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/juci/notebook.cc b/juci/notebook.cc index 9785cf0..cb3e159 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -643,17 +643,23 @@ void Notebook::Controller:: OnSaveFile() { std::string Notebook::Controller::OnSaveFileAs(){ - INFO("Notebook save as"); + INFO("Notebook save as"); Gtk::FileChooserDialog dialog("Please choose a file", Gtk::FILE_CHOOSER_ACTION_SAVE); + DEBUG("SET TRANSISTEN FPR"); dialog.set_transient_for(*window_); dialog.set_position(Gtk::WindowPosition::WIN_POS_CENTER_ALWAYS); dialog.add_button("_Cancel", Gtk::RESPONSE_CANCEL); dialog.add_button("_Save", Gtk::RESPONSE_OK); + //dialog.set_current_name("Untitled"); + DEBUG("RUN DIALOG"); int result = dialog.run(); + DEBUG("DIALOG RUNNING"); switch (result) { case(Gtk::RESPONSE_OK): { + DEBUG("get_filename()"); std::string path = dialog.get_filename(); + DEBUG_VAR(path); unsigned pos = path.find_last_of("/\\"); std::cout << path<< std::endl; //notebook_.OnSaveFile(path); diff --git a/juci/window.cc b/juci/window.cc index 3cc5b89..ba4c391 100644 --- a/juci/window.cc +++ b/juci/window.cc @@ -54,9 +54,9 @@ Window::Window() : Gtk::AccelKey(keybindings_.config_ .key_map()["compile_and_run"]), [this]() { + notebook_.OnSaveFile(); if (running.try_lock()) { std::thread execute([=]() { - notebook_.OnSaveFile(); std::string path = notebook_.CurrentPagePath(); int pos = path.find_last_of("/\\"); if(pos != std::string::npos){ @@ -80,9 +80,9 @@ Window::Window() : Gtk::AccelKey(keybindings_.config_ .key_map()["compile"]), [this]() { + notebook_.OnSaveFile(); if (running.try_lock()) { - std::thread execute([=]() { - notebook_.OnSaveFile(); + std::thread execute([=]() { std::string path = notebook_.CurrentPagePath(); int pos = path.find_last_of("/\\"); if(pos != std::string::npos){