From 2d4449447814989ee3342c3f3267513c0b593525 Mon Sep 17 00:00:00 2001 From: oyvang Date: Fri, 13 Mar 2015 09:03:24 +0100 Subject: [PATCH 1/3] linenumbers --- juci/notebook.cc | 24 ++++++++++++++++-------- juci/notebook.h | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/juci/notebook.cc b/juci/notebook.cc index 371de09..dc771ed 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -7,6 +7,7 @@ Notebook::Model::Model() { Notebook::View::View() : view_(Gtk::ORIENTATION_VERTICAL){ + } Gtk::Box& Notebook::View::view() { view_.pack_start(notebook_); @@ -14,14 +15,9 @@ Gtk::Box& Notebook::View::view() { } Notebook::Controller::Controller(Keybindings::Controller& keybindings){ - scrolledwindow_vec_.push_back(new Gtk::ScrolledWindow()); - source_vec_.push_back(new Source::Controller); - scrolledwindow_vec_.back()->add(source_vec_.back()->view()); - source_vec_.back()->OnNewEmptyFile(); - notebook().append_page(*scrolledwindow_vec_.back(), "juCi++"); - notebook().set_focus_child(*scrolledwindow_vec_.back()); + OnNewPage("juCi++"); refClipboard = Gtk::Clipboard::get(); - + keybindings.action_group_menu()->add(Gtk::Action::create("FileMenu", Gtk::Stock::FILE)); /* File->New files */ @@ -115,8 +111,18 @@ Gtk::Box& Notebook::Controller::entry_view(){ void Notebook::Controller::OnNewPage(std::string name) { scrolledwindow_vec_.push_back(new Gtk::ScrolledWindow()); source_vec_.push_back(new Source::Controller); - scrolledwindow_vec_.back()->add(source_vec_.back()->view()); + label_vec_.push_back(new Gtk::Label); + label_vec_.back()->set_text("1\n"); + label_vec_.back()->set_justify(Gtk::Justification::JUSTIFY_RIGHT); + label_vec_.back()->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_START); + paned_vec_.push_back(new Gtk::Paned()); + paned_vec_.back()->set_orientation(Gtk::Orientation::ORIENTATION_HORIZONTAL); + paned_vec_.back()->add1(*label_vec_.back()); + paned_vec_.back()->pack2(source_vec_.back()->view(),true,false); + scrolledwindow_vec_.back()->add(*paned_vec_.back()); source_vec_.back()->OnNewEmptyFile(); + scrolledwindow_vec_.back()->set_policy(Gtk::PolicyType::POLICY_NEVER, + Gtk::PolicyType::POLICY_AUTOMATIC); notebook().append_page(*scrolledwindow_vec_.back(), name); notebook().show_all_children(); notebook().set_focus_child(*scrolledwindow_vec_.back()); @@ -161,6 +167,8 @@ void Notebook::Controller::OnOpenFile(std::string path) { source_vec_.push_back(new Source::Controller); scrolledwindow_vec_.back()->add(source_vec_.back()->view()); source_vec_.back()->OnOpenFile(path); + scrolledwindow_vec_.back()->set_policy(Gtk::PolicyType::POLICY_NEVER, + Gtk::PolicyType::POLICY_AUTOMATIC); unsigned pos = path.find_last_of("/\\"); notebook().append_page(*scrolledwindow_vec_.back(), path.substr(pos+1)); notebook().show_all_children(); diff --git a/juci/notebook.h b/juci/notebook.h index 1692270..1281076 100644 --- a/juci/notebook.h +++ b/juci/notebook.h @@ -35,6 +35,8 @@ namespace Notebook { Entry::Controller entry_; std::vector source_vec_; std::vector scrolledwindow_vec_; + std::vector label_vec_; + std::vector paned_vec_; Glib::RefPtr refClipboard; std::list listTargets; std::string GetCursorWord(); From 477dda390dc250cfc9fadfef814b91c1fd81fde6 Mon Sep 17 00:00:00 2001 From: oyvang Date: Fri, 20 Mar 2015 10:44:38 +0100 Subject: [PATCH 2/3] Working linenumbers --- juci/notebook.cc | 257 ++++++++++++++++++++++++++++++++--------------- juci/notebook.h | 63 +++++++----- 2 files changed, 214 insertions(+), 106 deletions(-) diff --git a/juci/notebook.cc b/juci/notebook.cc index dc771ed..d3d3b72 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -1,22 +1,21 @@ + #include "notebook.h" Notebook::Model::Model() { cc_extension = ".cc"; h_extension = ".h"; }; -Notebook::View::View() : - view_(Gtk::ORIENTATION_VERTICAL){ - - -} -Gtk::Box& Notebook::View::view() { - view_.pack_start(notebook_); - return view_; +Notebook::View::View(){ + linenumbers_.set_margin_top(30); + linenumbers_.set_justify(Gtk::Justification::JUSTIFY_RIGHT); + linenumbers_.set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_START); + //line.add(linenumbers_); + view_.pack_start(notebook_); } -Notebook::Controller::Controller(Keybindings::Controller& keybindings){ +Notebook::Controller::Controller(Keybindings::Controller& keybindings) { OnNewPage("juCi++"); - refClipboard = Gtk::Clipboard::get(); + refClipboard_ = Gtk::Clipboard::get(); keybindings.action_group_menu()->add(Gtk::Action::create("FileMenu", Gtk::Stock::FILE)); @@ -27,21 +26,21 @@ Notebook::Controller::Controller(Keybindings::Controller& keybindings){ "New empty file", "Create a new file"), [this]() { - is_new_file = true; + is_new_file_ = true; OnFileNewEmptyfile(); }); keybindings.action_group_menu()->add(Gtk::Action::create("FileNewCC", "New cc file"), Gtk::AccelKey("c"), [this]() { - is_new_file = true; + is_new_file_ = true; OnFileNewCCFile(); }); keybindings.action_group_menu()->add(Gtk::Action::create("FileNewH", "New h file"), Gtk::AccelKey("h"), [this]() { - is_new_file = true; + is_new_file_ = true; OnFileNewHeaderFile(); }); keybindings.action_group_menu()->add(Gtk::Action::create("WindowCloseTab", @@ -53,7 +52,7 @@ Notebook::Controller::Controller(Keybindings::Controller& keybindings){ keybindings.action_group_menu()->add(Gtk::Action::create("EditFind", Gtk::Stock::FIND), [this]() { - is_new_file = false; + is_new_file_ = false; OnEditSearch(); //TODO(Oyvang, Zalox, Forgi)Create function OnEditFind(); }); @@ -74,9 +73,9 @@ Notebook::Controller::Controller(Keybindings::Controller& keybindings){ }); entry_.view_.entry().signal_activate().connect( [this]() { - if(is_new_file){ + if(is_new_file_){ OnNewPage(entry_.text()); - entry_.OnHideEntries(is_new_file); + entry_.OnHideEntries(is_new_file_); }else{ Search(true); } @@ -84,11 +83,11 @@ Notebook::Controller::Controller(Keybindings::Controller& keybindings){ entry_.button_apply().signal_clicked().connect( [this]() { OnNewPage(entry_.text()); - entry_.OnHideEntries(is_new_file); + entry_.OnHideEntries(is_new_file_); }); entry_.button_close().signal_clicked().connect( [this]() { - entry_.OnHideEntries(is_new_file); + entry_.OnHideEntries(is_new_file_); }); entry_.button_next().signal_clicked().connect( [this]() { @@ -99,43 +98,120 @@ Notebook::Controller::Controller(Keybindings::Controller& keybindings){ Search(false); }); + source_vec_.back()->view(). + signal_scroll_event().connect( + sigc::mem_fun( + this, + &Notebook::Controller:: + scroll_event_callback)); + }//Constructor -Gtk::Box& Notebook::Controller::view() { + + +bool Notebook::Controller::scroll_event_callback(GdkEventScroll* scroll_event) { + + Glib::RefPtr adj = + scrolledeverything_vec_.back()-> + get_vscrollbar()->get_adjustment(); + + if(scroll_event->delta_y == -1) { + adj->set_value(adj->get_value()-10); + } else { + adj->set_value(adj->get_value()+10); + } + + source_vec_.back()->view().set_vadjustment(adj); + linenumbers.back()->view().set_vadjustment(adj); + + + return true; + } + +Notebook::Controller::~Controller() { + for (auto &i : source_vec_) delete i; + for (auto &i : label_vec_) delete i; + for (auto &i : box_h) delete i; + for (auto &i : box_l) delete i; + for (auto &i : box_m) delete i; + for (auto &i : scrolledeverything_vec_) delete i; + for (auto &i : scrolledwindow_vec_) delete i; +} + +Gtk::HBox& Notebook::Controller::view() { return view_.view(); } -Gtk::Box& Notebook::Controller::entry_view(){ - return entry_.view(); +Gtk::Box& Notebook::Controller::entry_view() { + return entry_.view();y } + + void Notebook::Controller::OnNewPage(std::string name) { + std::cout << "new page" << std::endl;y + OnCreatePage(); + std::cout << "oppretta pages" << std::endl; + source_vec_.back()->OnNewEmptyFile(); + Notebook().append_page(*box_m.back(), name); + Notebook().show_all_children(); + Notebook().set_current_page(Pages()-1); + BufferChangeHandler(source_vec_.back()->view().get_buffer()); +} + +void Notebook::Controller::OnOpenFile(std::string path) { + OnCreatePage(); + source_vec_.back()->OnOpenFile(path); + unsigned pos = path.find_last_of("/\\"); + Notebook().append_page(*scrolledwindow_vec_.back(), path.substr(pos+1)); + Notebook().show_all_children(); + Notebook().set_focus_child(*scrolledwindow_vec_.back()); + Notebook().set_current_page(Pages()-1); + BufferChangeHandler(source_vec_.back()->view().get_buffer()); + OnBufferChange(); +} + +void Notebook::Controller::OnCreatePage(){ scrolledwindow_vec_.push_back(new Gtk::ScrolledWindow()); source_vec_.push_back(new Source::Controller); - label_vec_.push_back(new Gtk::Label); - label_vec_.back()->set_text("1\n"); - label_vec_.back()->set_justify(Gtk::Justification::JUSTIFY_RIGHT); - label_vec_.back()->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_START); - paned_vec_.push_back(new Gtk::Paned()); - paned_vec_.back()->set_orientation(Gtk::Orientation::ORIENTATION_HORIZONTAL); - paned_vec_.back()->add1(*label_vec_.back()); - paned_vec_.back()->pack2(source_vec_.back()->view(),true,false); - scrolledwindow_vec_.back()->add(*paned_vec_.back()); - source_vec_.back()->OnNewEmptyFile(); - scrolledwindow_vec_.back()->set_policy(Gtk::PolicyType::POLICY_NEVER, - Gtk::PolicyType::POLICY_AUTOMATIC); - notebook().append_page(*scrolledwindow_vec_.back(), name); - notebook().show_all_children(); - notebook().set_focus_child(*scrolledwindow_vec_.back()); - notebook().set_current_page(pages()-1); + linenumbers.push_back(new Source::Controller); + scrolledeverything_vec_.push_back(new Gtk::ScrolledWindow()); + label_vec_.push_back(new Gtk::Label()); + // box_l.push_back(new Gtk::HBox()); + //box_h.push_back(new Gtk::HBox()); + box_m.push_back(new Gtk::HBox()); + scrolledeverything_vec_.back()->add(source_vec_.back()->view()); + linesscroll.add(linenumbers.back()->view()); + linenumbers.back()->view().get_buffer()->set_text("1\n"); + + linesscroll.get_vscrollbar()->hide(); + + linenumbers.back()->view().set_editable(false); + linenumbers.back()->view().set_sensitive(false); + box_m.back()->pack_start(linesscroll,false,false); + box_m.back()->pack_start(*scrolledeverything_vec_.back(), true, true); + } + void Notebook::Controller::OnCloseCurrentPage() { //TODO (oyvang, zalox, forgi) Save a temp file, in case you close one you dont want to close? - int page = currentPage(); - notebook().remove_page(page); + int page = CurrentPage(); + Notebook().remove_page(page); delete source_vec_.at(page); + delete label_vec_.at(page); + delete box_h.at(page); + delete box_l.at(page); + delete box_m.at(page); + delete scrolledeverything_vec_.at(page); delete scrolledwindow_vec_.at(page); + source_vec_.erase(source_vec_.begin()+ page); + label_vec_.erase(label_vec_.begin()+page); + box_h.erase(box_h.begin()+page); + box_l.erase(box_l.begin()+page); + box_m.erase(box_m.begin()+page); + scrolledeverything_vec_.erase(scrolledeverything_vec_.begin()+page); scrolledwindow_vec_.erase(scrolledwindow_vec_.begin()+page); + } void Notebook::Controller::OnFileNewEmptyfile() { entry_.OnShowSetFilenName(""); @@ -147,40 +223,26 @@ void Notebook::Controller::OnFileNewHeaderFile() { entry_.OnShowSetFilenName(model_.h_extension); } void Notebook::Controller::OnEditCopy() { - if (pages() != 0) { - buffer()->copy_clipboard(refClipboard); + if (Pages() != 0) { + Buffer()->copy_clipboard(refClipboard_); } } void Notebook::Controller::OnEditPaste() { - if (pages() != 0) { - buffer()->paste_clipboard(refClipboard); + if (Pages() != 0) { + Buffer()->paste_clipboard(refClipboard_); } } void Notebook::Controller::OnEditCut() { - if (pages() != 0) { - buffer()->cut_clipboard(refClipboard); + if (Pages() != 0) { + Buffer()->cut_clipboard(refClipboard_); } } -void Notebook::Controller::OnOpenFile(std::string path) { - scrolledwindow_vec_.push_back(new Gtk::ScrolledWindow()); - source_vec_.push_back(new Source::Controller); - scrolledwindow_vec_.back()->add(source_vec_.back()->view()); - source_vec_.back()->OnOpenFile(path); - scrolledwindow_vec_.back()->set_policy(Gtk::PolicyType::POLICY_NEVER, - Gtk::PolicyType::POLICY_AUTOMATIC); - unsigned pos = path.find_last_of("/\\"); - notebook().append_page(*scrolledwindow_vec_.back(), path.substr(pos+1)); - notebook().show_all_children(); - notebook().set_focus_child(*scrolledwindow_vec_.back()); - notebook().set_current_page(pages()-1); -} - std::string Notebook::Controller::GetCursorWord(){ std::string word; Gtk::TextIter start,end; - start = buffer()->get_insert()->get_iter(); - end = buffer()->get_insert()->get_iter(); + start = Buffer()->get_insert()->get_iter(); + end = Buffer()->get_insert()->get_iter(); if(!end.ends_line()) { while(!end.ends_word()){ end.forward_char(); @@ -191,16 +253,14 @@ std::string Notebook::Controller::GetCursorWord(){ start.backward_char(); } } - word = buffer()->get_text(start,end); - + word = Buffer()->get_text(start,end); //TODO(Oyvang)fix selected text return word; } -void Notebook::Controller::OnEditSearch(){ - search_match_end_ = buffer()->get_iter_at_offset(0); +void Notebook::Controller::OnEditSearch() { + search_match_end_ = Buffer()->get_iter_at_offset(0); entry_.OnShowSearch(GetCursorWord()); - } void Notebook::Controller::Search(bool forward){ @@ -210,7 +270,7 @@ void Notebook::Controller::Search(bool forward){ if(!forward){ if(search_match_start_ == 0 || search_match_start_.get_line_offset() == 0) { - search_match_start_= buffer()->end(); + search_match_start_= Buffer()->end(); } search_match_start_.backward_search(search_word, Gtk::TextSearchFlags::TEXT_SEARCH_TEXT_ONLY| @@ -218,36 +278,71 @@ void Notebook::Controller::Search(bool forward){ search_match_start_, search_match_end_); }else{ if(search_match_end_ == 0) { - search_match_end_= buffer()->begin(); + search_match_end_= Buffer()->begin(); } search_match_end_.forward_search(search_word, Gtk::TextSearchFlags::TEXT_SEARCH_TEXT_ONLY | Gtk::TextSearchFlags::TEXT_SEARCH_VISIBLE_ONLY, search_match_start_, search_match_end_); } +} - // std::cout << "matc_start - " - // << search_match_start_.get_line_offset() - // //<< test.get_line_offset() - // << " || match_end - " - // << search_match_end_.get_line_offset() - // << std::endl; +void Notebook::Controller::OnBufferChange() { + int page = CurrentPage(); + int line_nr = Buffer()->get_line_count(); + + + + Glib::RefPtr mark = Gtk::TextBuffer::Mark::create(); + Glib::RefPtr mark_lines = Gtk::TextBuffer::Mark::create(); + + if(source_vec_.at(page)->view().get_buffer()->get_insert()->get_iter().starts_line() && + source_vec_.at(page)->view().get_buffer()->get_insert()->get_iter().get_line() == Buffer()->end().get_line()){ + + + std::string lines ="1"; + for (int it = 2; it <= line_nr; ++it) { + lines.append("\n"+ std::to_string(it)+""); + +} + linenumbers.back()->view().get_buffer()->set_text(lines); + + + source_vec_.at(page)->view().get_buffer()->add_mark(mark, Buffer()->end()); + linenumbers.at(page)->view().get_buffer()->add_mark(mark_lines,linenumbers.at(page)->view().get_buffer()->end()); + + source_vec_.at(page)->view().scroll_to(mark); + linenumbers.at(page)->view().scroll_to(mark_lines); + }else{ + source_vec_.at(page)->view().get_buffer()->add_mark(mark, Buffer()->get_insert()->get_iter()); + } } -int Notebook::Controller::currentPage(){ - return notebook().get_current_page(); +int Notebook::Controller::CurrentPage() { + return Notebook().get_current_page(); } -Glib::RefPtr Notebook::Controller::buffer(){ - return source_vec_.at(currentPage())->view().get_buffer(); +Glib::RefPtr Notebook::Controller::Buffer() { + return source_vec_.at(CurrentPage())->view().get_buffer(); } -int Notebook::Controller::pages(){ - return notebook().get_n_pages(); +int Notebook::Controller::Pages() { + return Notebook().get_n_pages(); } -Gtk::Notebook& Notebook::Controller::notebook(){ +Gtk::Notebook& Notebook::Controller::Notebook() { return view_.notebook(); } +Gtk::Label& Notebook::Controller::Linenumbers() { + return view_.linenumbers(); +} + +void Notebook::Controller::BufferChangeHandler(Glib::RefPtr + buffer) { + buffer->signal_changed().connect( + [this]() { + OnBufferChange(); + }); +} diff --git a/juci/notebook.h b/juci/notebook.h index 1281076..395f541 100644 --- a/juci/notebook.h +++ b/juci/notebook.h @@ -16,46 +16,59 @@ namespace Notebook { class View { public: View(); - Gtk::Box& view(); - Gtk::Notebook& notebook() { return notebook_; } + Gtk::HBox& view() {return view_;} + Gtk::Notebook& notebook() {return notebook_; } + Gtk::Label& linenumbers() {return linenumbers_;} + Gtk::ScrolledWindow text, line; + protected: - Gtk::Box view_; + Gtk::HBox view_; Gtk::Notebook notebook_; + Gtk::Label linenumbers_; }; class Controller { public: + Gtk::ScrolledWindow linesscroll; Controller(Keybindings::Controller& keybindings); - Gtk::Box& view(); + ~Controller(); + Glib::RefPtr Buffer(); + int CurrentPage(); Gtk::Box& entry_view(); - void OnNewPage(std::string name); + Gtk::Notebook& Notebook(); + Gtk::Label& Linenumbers(); + void OnBufferChange(); void OnCloseCurrentPage(); - void OnOpenFile(std::string filename); - View view_; - Model model_; - Entry::Controller entry_; - std::vector source_vec_; - std::vector scrolledwindow_vec_; - std::vector label_vec_; - std::vector paned_vec_; - Glib::RefPtr refClipboard; - std::list listTargets; std::string GetCursorWord(); - Glib::RefPtr buffer(); - Gtk::Notebook& notebook(); - int currentPage(); - int pages(); - void OnFileNewEmptyfile(); - void OnFileNewCCFile(); - void OnFileNewHeaderFile(); void OnEditCopy(); - void OnEditPaste(); void OnEditCut(); + void OnEditPaste(); void OnEditSearch(); + void OnFileNewCCFile(); + void OnFileNewEmptyfile(); + void OnFileNewHeaderFile(); + void OnNewPage(std::string name); + void OnOpenFile(std::string filename); + void OnCreatePage(); + bool scroll_event_callback(GdkEventScroll* scroll_event); + int Pages(); + Gtk::HBox& view(); void Search(bool forward); - private: - bool is_new_file; + View view_; + Model model_; + bool is_new_file_; + Entry::Controller entry_; + std::vector source_vec_, linenumbers; + std::vector paned; + std::vector scrolledwindow_vec_, scrolledeverything_vec_; + std::vector label_vec_; + std::vector box_l, box_h, box_m; + std::list listTargets_; Gtk::TextIter search_match_end_; Gtk::TextIter search_match_start_; + Glib::RefPtr refClipboard_; + + protected: + void BufferChangeHandler(Glib::RefPtr buffer); }; // class controller } // namespace Notebook From a8e571432cb3f469aa4b76d2cd5564547af1644f Mon Sep 17 00:00:00 2001 From: oyvang Date: Fri, 20 Mar 2015 15:08:07 +0100 Subject: [PATCH 3/3] Linenumbers working, know bug->focus new tab --- juci/api.cc | 11 +- juci/notebook.cc | 276 ++++++++++++++++++++++++----------------------- juci/notebook.h | 26 +++-- 3 files changed, 161 insertions(+), 152 deletions(-) diff --git a/juci/api.cc b/juci/api.cc index 1057bf8..995d344 100644 --- a/juci/api.cc +++ b/juci/api.cc @@ -220,12 +220,15 @@ void libjuci::IterToWordEnd(Gtk::TextIter &iter) { Glib::RefPtr libjuci::BufferFromNotebook() { //finding focused view int i = 0; - while(!PluginApi::notebook_->source_vec_.at(i)->view().has_focus()) { - i++; + + while(!PluginApi::notebook_->CurrentTextView().has_focus()) { + i++; } + + return Glib::RefPtr(PluginApi::notebook_ - ->source_vec_.at(i) - ->view().get_buffer()); + ->CurrentTextView().get_buffer()); + } Gtk::TextIter libjuci::IterFromNotebook() { diff --git a/juci/notebook.cc b/juci/notebook.cc index d3d3b72..bdc0c30 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -2,14 +2,11 @@ #include "notebook.h" Notebook::Model::Model() { - cc_extension = ".cc"; - h_extension = ".h"; + cc_extension_ = ".cc"; + h_extension_ = ".h"; + scrollvalue_ = 20; }; Notebook::View::View(){ - linenumbers_.set_margin_top(30); - linenumbers_.set_justify(Gtk::Justification::JUSTIFY_RIGHT); - linenumbers_.set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_START); - //line.add(linenumbers_); view_.pack_start(notebook_); } @@ -98,9 +95,8 @@ Notebook::Controller::Controller(Keybindings::Controller& keybindings) { Search(false); }); - source_vec_.back()->view(). - signal_scroll_event().connect( - sigc::mem_fun( + text_vec_.back()->view(). + signal_scroll_event().connect(sigc::mem_fun( this, &Notebook::Controller:: scroll_event_callback)); @@ -109,140 +105,139 @@ Notebook::Controller::Controller(Keybindings::Controller& keybindings) { }//Constructor - + bool Notebook::Controller::scroll_event_callback(GdkEventScroll* scroll_event) { - + int page = CurrentPage(); + int direction_y = scroll_event->delta_y; + int direction_x = scroll_event->delta_x; + Glib::RefPtr adj = - scrolledeverything_vec_.back()-> + scrolledtext_vec_.at(page)-> get_vscrollbar()->get_adjustment(); - - if(scroll_event->delta_y == -1) { - adj->set_value(adj->get_value()-10); - } else { - adj->set_value(adj->get_value()+10); - } - - source_vec_.back()->view().set_vadjustment(adj); - linenumbers.back()->view().set_vadjustment(adj); - - - return true; - } + + if ( direction_y != 0 ) { + int dir_val = direction_y==-1?-model_.scrollvalue_:+model_.scrollvalue_; + adj->set_value(adj->get_value()+dir_val); + text_vec_.at(page)->view().set_vadjustment(adj); + linenumbers_vec_.at(page)->view().set_vadjustment(adj); + } + if ( direction_x != 0 ) { + int dir_val = direction_x==-1?-model_.scrollvalue_:+model_.scrollvalue_; + adj->set_value(adj->get_value()+dir_val); + text_vec_.at(page)->view().set_hadjustment(adj); + } + return true; +} Notebook::Controller::~Controller() { - for (auto &i : source_vec_) delete i; - for (auto &i : label_vec_) delete i; - for (auto &i : box_h) delete i; - for (auto &i : box_l) delete i; - for (auto &i : box_m) delete i; - for (auto &i : scrolledeverything_vec_) delete i; - for (auto &i : scrolledwindow_vec_) delete i; + for (auto &i : text_vec_) delete i; + for (auto &i : linenumbers_vec_) delete i; + for (auto &i : editor_vec_) delete i; + for (auto &i : scrolledtext_vec_) delete i; + for (auto &i : scrolledline_vec_) delete i; } Gtk::HBox& Notebook::Controller::view() { return view_.view(); } Gtk::Box& Notebook::Controller::entry_view() { - return entry_.view();y + return entry_.view(); } void Notebook::Controller::OnNewPage(std::string name) { - std::cout << "new page" << std::endl;y OnCreatePage(); std::cout << "oppretta pages" << std::endl; - source_vec_.back()->OnNewEmptyFile(); - Notebook().append_page(*box_m.back(), name); + text_vec_.back()->OnNewEmptyFile(); + Notebook().append_page(*editor_vec_.back(), name); Notebook().show_all_children(); Notebook().set_current_page(Pages()-1); - BufferChangeHandler(source_vec_.back()->view().get_buffer()); + Notebook().set_focus_child(text_vec_.at(Pages()-1)->view()); } void Notebook::Controller::OnOpenFile(std::string path) { OnCreatePage(); - source_vec_.back()->OnOpenFile(path); + text_vec_.back()->OnOpenFile(path); unsigned pos = path.find_last_of("/\\"); - Notebook().append_page(*scrolledwindow_vec_.back(), path.substr(pos+1)); + Notebook().append_page(*editor_vec_.back(), path.substr(pos+1)); Notebook().show_all_children(); - Notebook().set_focus_child(*scrolledwindow_vec_.back()); Notebook().set_current_page(Pages()-1); - BufferChangeHandler(source_vec_.back()->view().get_buffer()); + Notebook().set_focus_child(text_vec_.back()->view()); OnBufferChange(); } void Notebook::Controller::OnCreatePage(){ - scrolledwindow_vec_.push_back(new Gtk::ScrolledWindow()); - source_vec_.push_back(new Source::Controller); - linenumbers.push_back(new Source::Controller); - scrolledeverything_vec_.push_back(new Gtk::ScrolledWindow()); - label_vec_.push_back(new Gtk::Label()); - // box_l.push_back(new Gtk::HBox()); - //box_h.push_back(new Gtk::HBox()); - box_m.push_back(new Gtk::HBox()); - scrolledeverything_vec_.back()->add(source_vec_.back()->view()); - linesscroll.add(linenumbers.back()->view()); - linenumbers.back()->view().get_buffer()->set_text("1\n"); - - linesscroll.get_vscrollbar()->hide(); - - linenumbers.back()->view().set_editable(false); - linenumbers.back()->view().set_sensitive(false); - box_m.back()->pack_start(linesscroll,false,false); - box_m.back()->pack_start(*scrolledeverything_vec_.back(), true, true); - + text_vec_.push_back(new Source::Controller); + std::string temp = "TEXT "; + temp += text_vec_.size(); + text_vec_.back()->view().set_name(temp); + linenumbers_vec_.push_back(new Source::Controller); + scrolledline_vec_.push_back(new Gtk::ScrolledWindow()); + scrolledtext_vec_.push_back(new Gtk::ScrolledWindow()); + editor_vec_.push_back(new Gtk::HBox()); + scrolledtext_vec_.back()->add(text_vec_.back()->view()); + scrolledline_vec_.back()->add(linenumbers_vec_.back()->view()); + linenumbers_vec_.back()->view().get_buffer()->set_text("1 \n"); + linenumbers_vec_.back()->view().override_color(Gdk::RGBA("Black")); + linenumbers_vec_.back()-> + view().set_justification(Gtk::Justification::JUSTIFY_RIGHT); + scrolledline_vec_.back()->get_vscrollbar()->hide(); + linenumbers_vec_.back()->view().set_editable(false); + linenumbers_vec_.back()->view().set_sensitive(false); + editor_vec_.back()->pack_start(*scrolledline_vec_.back(),false,false); + editor_vec_.back()->pack_start(*scrolledtext_vec_.back(), true, true); + BufferChangeHandler(text_vec_.back()->view().get_buffer()); } void Notebook::Controller::OnCloseCurrentPage() { //TODO (oyvang, zalox, forgi) Save a temp file, in case you close one you dont want to close? - int page = CurrentPage(); - Notebook().remove_page(page); - delete source_vec_.at(page); - delete label_vec_.at(page); - delete box_h.at(page); - delete box_l.at(page); - delete box_m.at(page); - delete scrolledeverything_vec_.at(page); - delete scrolledwindow_vec_.at(page); - - source_vec_.erase(source_vec_.begin()+ page); - label_vec_.erase(label_vec_.begin()+page); - box_h.erase(box_h.begin()+page); - box_l.erase(box_l.begin()+page); - box_m.erase(box_m.begin()+page); - scrolledeverything_vec_.erase(scrolledeverything_vec_.begin()+page); - scrolledwindow_vec_.erase(scrolledwindow_vec_.begin()+page); + if(Pages()!=0){ + int page = CurrentPage(); + Notebook().remove_page(page); + delete text_vec_.at(page); + delete linenumbers_vec_.at(page); + delete scrolledtext_vec_.at(page); + delete scrolledline_vec_.at(page); + delete editor_vec_.at(page); + text_vec_.erase(text_vec_.begin()+ page); + linenumbers_vec_.erase(linenumbers_vec_.begin()+page); + scrolledtext_vec_.erase(scrolledtext_vec_.begin()+page); + scrolledline_vec_.erase(scrolledline_vec_.begin()+page); + editor_vec_.erase(editor_vec_.begin()+page); + } } void Notebook::Controller::OnFileNewEmptyfile() { entry_.OnShowSetFilenName(""); } void Notebook::Controller::OnFileNewCCFile() { - entry_.OnShowSetFilenName(model_.cc_extension); + entry_.OnShowSetFilenName(model_.cc_extension_); } void Notebook::Controller::OnFileNewHeaderFile() { - entry_.OnShowSetFilenName(model_.h_extension); + entry_.OnShowSetFilenName(model_.h_extension_); } void Notebook::Controller::OnEditCopy() { if (Pages() != 0) { - Buffer()->copy_clipboard(refClipboard_); + Buffer(text_vec_.at(CurrentPage()))->copy_clipboard(refClipboard_); } } void Notebook::Controller::OnEditPaste() { if (Pages() != 0) { - Buffer()->paste_clipboard(refClipboard_); + Buffer(text_vec_.at(CurrentPage()))->paste_clipboard(refClipboard_); } } void Notebook::Controller::OnEditCut() { if (Pages() != 0) { - Buffer()->cut_clipboard(refClipboard_); + Buffer(text_vec_.at(CurrentPage()))->cut_clipboard(refClipboard_); } } std::string Notebook::Controller::GetCursorWord(){ + int page = CurrentPage(); std::string word; Gtk::TextIter start,end; - start = Buffer()->get_insert()->get_iter(); - end = Buffer()->get_insert()->get_iter(); + start = Buffer(text_vec_.at(page))->get_insert()->get_iter(); + end = Buffer(text_vec_.at(page))->get_insert()->get_iter(); if(!end.ends_line()) { while(!end.ends_word()){ end.forward_char(); @@ -253,80 +248,96 @@ std::string Notebook::Controller::GetCursorWord(){ start.backward_char(); } } - word = Buffer()->get_text(start,end); + word = Buffer(text_vec_.at(page))->get_text(start,end); //TODO(Oyvang)fix selected text return word; } void Notebook::Controller::OnEditSearch() { - search_match_end_ = Buffer()->get_iter_at_offset(0); + search_match_end_ = + Buffer(text_vec_.at(CurrentPage()))->get_iter_at_offset(0); entry_.OnShowSearch(GetCursorWord()); } void Notebook::Controller::Search(bool forward){ + int page = CurrentPage(); std::string search_word; search_word = entry_.text(); Gtk::TextIter test; - if(!forward){ - if(search_match_start_ == 0 || search_match_start_.get_line_offset() == 0) { - search_match_start_= Buffer()->end(); + if ( !forward ) { + if ( search_match_start_ == 0 || + search_match_start_.get_line_offset() == 0) { + search_match_start_= Buffer(text_vec_.at(CurrentPage()))->end(); } - search_match_start_.backward_search(search_word, - Gtk::TextSearchFlags::TEXT_SEARCH_TEXT_ONLY| - Gtk::TextSearchFlags::TEXT_SEARCH_VISIBLE_ONLY, - search_match_start_, search_match_end_); - }else{ - if(search_match_end_ == 0) { - search_match_end_= Buffer()->begin(); + search_match_start_. + backward_search(search_word, + Gtk::TextSearchFlags::TEXT_SEARCH_TEXT_ONLY | + Gtk::TextSearchFlags::TEXT_SEARCH_VISIBLE_ONLY, + search_match_start_, + search_match_end_); + } else { + if ( search_match_end_ == 0 ) { + search_match_end_= Buffer(text_vec_.at(CurrentPage()))->begin(); } - search_match_end_.forward_search(search_word, - Gtk::TextSearchFlags::TEXT_SEARCH_TEXT_ONLY | - Gtk::TextSearchFlags::TEXT_SEARCH_VISIBLE_ONLY, - search_match_start_, search_match_end_); + search_match_end_. + forward_search(search_word, + Gtk::TextSearchFlags::TEXT_SEARCH_TEXT_ONLY | + Gtk::TextSearchFlags::TEXT_SEARCH_VISIBLE_ONLY, + search_match_start_, + search_match_end_); } } - void Notebook::Controller::OnBufferChange() { int page = CurrentPage(); - int line_nr = Buffer()->get_line_count(); - - - - - - Glib::RefPtr mark = Gtk::TextBuffer::Mark::create(); - Glib::RefPtr mark_lines = Gtk::TextBuffer::Mark::create(); - - if(source_vec_.at(page)->view().get_buffer()->get_insert()->get_iter().starts_line() && - source_vec_.at(page)->view().get_buffer()->get_insert()->get_iter().get_line() == Buffer()->end().get_line()){ - - - std::string lines ="1"; - for (int it = 2; it <= line_nr; ++it) { - lines.append("\n"+ std::to_string(it)+""); - -} - linenumbers.back()->view().get_buffer()->set_text(lines); - + int line_nr = Buffer(text_vec_.at(page))->get_line_count(); + + Glib::RefPtr + mark = Gtk::TextBuffer::Mark::create(); + Glib::RefPtr + mark_lines = Gtk::TextBuffer::Mark::create(); + + if(Buffer(text_vec_.at(page))->get_insert()->get_iter().starts_line() && + Buffer(text_vec_.at(page))->get_insert()->get_iter().get_line() == + Buffer(text_vec_.at(page))->end().get_line()) { + std::string lines ="1 "; + for ( int it = 2; it <= line_nr; ++it ) { + lines.append("\n"+ std::to_string(it)+" "); + } + Buffer(linenumbers_vec_.at(page))->set_text(lines); + + Buffer(text_vec_.at(page))-> + add_mark( + mark, + Buffer(text_vec_.at(page))->end()); + Buffer(linenumbers_vec_.at(page))-> + add_mark( + mark_lines, + Buffer(linenumbers_vec_.at(page))->end()); + + text_vec_.at(page)->view().scroll_to(mark); + linenumbers_vec_.at(page)->view().scroll_to(mark_lines); + }else{ + Buffer(text_vec_.at(page))-> + add_mark( + mark, + Buffer(text_vec_.at(page))-> + get_insert()->get_iter()); + } +} - source_vec_.at(page)->view().get_buffer()->add_mark(mark, Buffer()->end()); - linenumbers.at(page)->view().get_buffer()->add_mark(mark_lines,linenumbers.at(page)->view().get_buffer()->end()); - source_vec_.at(page)->view().scroll_to(mark); - linenumbers.at(page)->view().scroll_to(mark_lines); - }else{ - source_vec_.at(page)->view().get_buffer()->add_mark(mark, Buffer()->get_insert()->get_iter()); - } +Gtk::TextView& Notebook::Controller::CurrentTextView() { + return text_vec_.at(CurrentPage())->view(); } - int Notebook::Controller::CurrentPage() { return Notebook().get_current_page(); } -Glib::RefPtr Notebook::Controller::Buffer() { - return source_vec_.at(CurrentPage())->view().get_buffer(); +Glib::RefPtr +Notebook::Controller::Buffer( Source::Controller *source ) { + return source->view().get_buffer(); } int Notebook::Controller::Pages() { @@ -335,9 +346,6 @@ int Notebook::Controller::Pages() { Gtk::Notebook& Notebook::Controller::Notebook() { return view_.notebook(); } -Gtk::Label& Notebook::Controller::Linenumbers() { - return view_.linenumbers(); -} void Notebook::Controller::BufferChangeHandler(Glib::RefPtr buffer) { diff --git a/juci/notebook.h b/juci/notebook.h index 395f541..ccfdbb6 100644 --- a/juci/notebook.h +++ b/juci/notebook.h @@ -10,32 +10,30 @@ namespace Notebook { class Model { public: Model(); - std::string cc_extension; - std::string h_extension; + std::string cc_extension_; + std::string h_extension_; + int scrollvalue_; }; class View { public: View(); Gtk::HBox& view() {return view_;} Gtk::Notebook& notebook() {return notebook_; } - Gtk::Label& linenumbers() {return linenumbers_;} Gtk::ScrolledWindow text, line; protected: Gtk::HBox view_; Gtk::Notebook notebook_; - Gtk::Label linenumbers_; }; class Controller { public: - Gtk::ScrolledWindow linesscroll; Controller(Keybindings::Controller& keybindings); ~Controller(); - Glib::RefPtr Buffer(); + Glib::RefPtr Buffer( Source::Controller *source); + Gtk::TextView& CurrentTextView(); int CurrentPage(); Gtk::Box& entry_view(); Gtk::Notebook& Notebook(); - Gtk::Label& Linenumbers(); void OnBufferChange(); void OnCloseCurrentPage(); std::string GetCursorWord(); @@ -53,22 +51,22 @@ namespace Notebook { int Pages(); Gtk::HBox& view(); void Search(bool forward); + protected: + void BufferChangeHandler(Glib::RefPtr buffer); + private: View view_; Model model_; bool is_new_file_; Entry::Controller entry_; - std::vector source_vec_, linenumbers; - std::vector paned; - std::vector scrolledwindow_vec_, scrolledeverything_vec_; - std::vector label_vec_; - std::vector box_l, box_h, box_m; + std::vector text_vec_, linenumbers_vec_; + std::vector scrolledtext_vec_, scrolledline_vec_; + std::vector editor_vec_; std::list listTargets_; Gtk::TextIter search_match_end_; Gtk::TextIter search_match_start_; Glib::RefPtr refClipboard_; - protected: - void BufferChangeHandler(Glib::RefPtr buffer); + }; // class controller } // namespace Notebook