Changeset e51abc748ac27b1dfa0fccd9de3ba9cdecb743f0

Show
Ignore:
Timestamp:
01/06/07 23:33:33 (6 years ago)
Author:
Philipp Kern <phil@…>
Parents:
93ca35407082705407d4ec2fb58c684dab77407d
Children:
0f676825acafe08500114fc64f438732f780fb0a
git-committer:
Philipp Kern <phil@0x539.de> / 2007-01-06T22:33:33Z+0000
Message:

[project @ StatusBar? showing cursor position and current language]

Original author: Armin Burgmeier <armin@…>
Date: 2005-05-06 19:48:57+00:00

Files:
2 added
11 modified

Legend:

Unmodified
Added
Removed
  • Makefile.am

    r623510b re51abc7  
    2626noinst_HEADERS += inc/logview.hpp 
    2727noinst_HEADERS += inc/document.hpp 
     28noinst_HEADERS += inc/statusbar.hpp 
    2829noinst_HEADERS += inc/header.hpp 
    2930noinst_HEADERS += inc/folder.hpp 
     
    5657gobby_SOURCES += src/logview.cpp 
    5758gobby_SOURCES += src/document.cpp 
     59gobby_SOURCES += src/statusbar.cpp 
    5860gobby_SOURCES += src/header.cpp 
    5961gobby_SOURCES += src/folder.cpp 
  • TODO

    r93ca354 re51abc7  
    1414 * Initialise size of paned widgets 
    1515 * configure should detect the presence of gtksourceview automatically 
    16  * Implement a statusbar 
    17    - Cursor position 
    18    - Current highlighting scheme 
    19    - Current syncronisation state  
    2016 * Prompt before overwriting existing files when explicitly choosing path 
    2117 * Chat command infrastructure (/me, /ignore) 
  • inc/document.hpp

    rfa007f9 re51abc7  
    3333{ 
    3434 
     35class Folder; 
     36 
    3537class Document : public Gtk::ScrolledWindow 
    3638{ 
    3739public: 
    3840        typedef std::map<Glib::ustring, Glib::ustring> MimeMap; 
     41        typedef sigc::signal<void> signal_update_type; 
    3942 
    40         Document(obby::document& doc); 
     43        Document(obby::document& doc, const Folder& folder); 
    4144        virtual ~Document(); 
    4245 
     
    4447        obby::document& get_document(); 
    4548 
     49        // Statusbar information 
     50        void get_cursor_position(unsigned int& row, unsigned int& col); 
     51        unsigned int get_unsynced_changes_count() const; 
     52#ifdef WITH_GTKSOURCEVIEW 
     53        Glib::RefPtr<Gtk::SourceLanguage> get_language() const; 
     54#endif 
     55 
     56        /** Signal which will be emitted if the document gets updated in a way 
     57         * that is interesting for the status bar. 
     58         */ 
     59        signal_update_type update_event() const; 
     60 
    4661protected: 
    47         void on_insert(const Gtk::TextBuffer::iterator& begin, 
    48                        const Glib::ustring& text, 
    49                        int bytes); 
    50         void on_erase(const Gtk::TextBuffer::iterator& begin, 
    51                       const Gtk::TextBuffer::iterator& end); 
     62        void on_insert_before(const Gtk::TextBuffer::iterator& begin, 
     63                              const Glib::ustring& text, 
     64                              int bytes); 
     65        void on_erase_before(const Gtk::TextBuffer::iterator& begin, 
     66                             const Gtk::TextBuffer::iterator& end); 
    5267 
    5368        void on_obby_insert(const obby::insert_record& record); 
    5469        void on_obby_delete(const obby::delete_record& record); 
    5570 
     71        void on_insert_after(const Gtk::TextBuffer::iterator& begin, 
     72                             const Glib::ustring& text, 
     73                             int bytes); 
     74        void on_erase_after(const Gtk::TextBuffer::iterator& begin, 
     75                            const Gtk::TextBuffer::iterator& end); 
     76 
     77        void on_cursor_changed(const Gtk::TextBuffer::iterator& location, 
     78                               const Glib::RefPtr<Gtk::TextBuffer::Mark>& mark); 
     79 
    5680        obby::document& m_doc; 
     81        const Folder& m_folder; 
     82 
    5783#ifdef WITH_GTKSOURCEVIEW 
    5884        Gtk::SourceView m_view; 
     
    6288#endif 
    6389        bool m_editing; 
     90         
     91        signal_update_type m_signal_update; 
    6492 
    6593public: 
     
    6896        static const MimeMap& m_mime_map; 
    6997#endif 
    70  
    7198}; 
    7299 
  • inc/folder.hpp

    raf22cb3 re51abc7  
    2020#define _GOBBY_FOLDER_HPP_ 
    2121 
     22#include <sigc++/signal.h> 
    2223#include <gtkmm/notebook.h> 
    2324#include <obby/user.hpp> 
    2425#include <obby/document.hpp> 
     26#include "document.hpp" 
     27#include "sourceview/sourcelanguage.hpp" 
    2528 
    2629namespace Gobby 
     
    3336{ 
    3437public: 
     38        typedef sigc::signal<void, Document&> signal_document_update_type; 
     39 
    3540        Folder(); 
    3641        ~Folder(); 
     
    4449        void obby_document_remove(obby::document& document); 
    4550 
     51        signal_document_update_type document_update_event() const; 
     52 
    4653protected: 
     54        // Signal handlers 
     55        virtual void on_switch_page(GtkNotebookPage* page, guint page_num); 
     56        virtual void on_document_update(Document& document); 
     57 
     58        signal_document_update_type m_signal_document_update; 
    4759}; 
    4860 
  • inc/sourceview/sourcelanguage.hpp

    r1d79f14 re51abc7  
    4747private: 
    4848        friend class SourceLanguage_Class; 
    49         static CppClassType sourcelanguage_class_; 
    5049 
    5150        // noncopyable 
     
    5756// though... 
    5857public: 
     58        static CppClassType sourcelanguage_class_; 
    5959        SourceLanguage(); 
    6060        explicit SourceLanguage(const Glib::ConstructParams& construct_params); 
  • inc/window.hpp

    ra0556f0 re51abc7  
    2929#include "userlist.hpp" 
    3030#include "chat.hpp" 
     31#include "statusbar.hpp" 
    3132 
    3233namespace Gobby 
     
    5455 
    5556        void on_chat(const Glib::ustring& message); 
     57        void on_document_update(Document& document); 
    5658 
    5759        // Obby signal handlers 
     
    7779        Gtk::VBox m_mainbox; 
    7880        Header m_header; 
     81        StatusBar m_statusbar; 
    7982 
    8083        Gtk::VPaned m_mainpaned; 
  • src/document.cpp

    r6c9d740 re51abc7  
    1717 */ 
    1818 
     19#include <obby/client_document.hpp> 
    1920#ifdef WITH_GTKSOURCEVIEW 
    2021#include "sourceview/sourcelanguagesmanager.hpp" 
    2122#endif 
    2223#include "document.hpp" 
     24#include "folder.hpp" 
    2325 
    2426#ifdef WITH_GTKSOURCEVIEW 
     
    2729#endif 
    2830 
    29 Gobby::Document::Document(obby::document& doc) 
    30  : Gtk::ScrolledWindow(), m_doc(doc), m_editing(true) 
     31Gobby::Document::Document(obby::document& doc, const Folder& folder) 
     32 : Gtk::ScrolledWindow(), m_doc(doc), m_folder(folder), m_editing(true) 
    3133#ifdef WITH_GTKSOURCEVIEW 
    3234   ,m_lang_manager(Gtk::SourceLanguagesManager::create() ) 
     
    8486        // Textbuffer signal handlers 
    8587        buf->signal_insert().connect( 
    86                 sigc::mem_fun(*this, &Document::on_insert), false); 
     88                sigc::mem_fun(*this, &Document::on_insert_before), false); 
    8789        buf->signal_erase().connect( 
    88                 sigc::mem_fun(*this, &Document::on_erase), false); 
     90                sigc::mem_fun(*this, &Document::on_erase_before), false); 
     91        buf->signal_insert().connect( 
     92                sigc::mem_fun(*this, &Document::on_insert_after), true); 
     93        buf->signal_erase().connect( 
     94                sigc::mem_fun(*this, &Document::on_erase_after), true); 
     95        buf->signal_mark_set().connect( 
     96                sigc::mem_fun(*this, &Document::on_cursor_changed) ); 
    8997 
    9098        // Obby signal handlers 
     
    117125} 
    118126 
    119 void Gobby::Document::on_insert(const Gtk::TextBuffer::iterator& begin, 
    120                                 const Glib::ustring& text, 
    121                                 int bytes) 
     127Gobby::Document::signal_update_type Gobby::Document::update_event() const 
     128{ 
     129        return m_signal_update; 
     130} 
     131         
     132void Gobby::Document::get_cursor_position(unsigned int& row, 
     133                                          unsigned int& col) 
     134{ 
     135        // Get insert mark 
     136        Glib::RefPtr<Gtk::TextBuffer::Mark> mark = 
     137                m_view.get_buffer()->get_mark("insert"); 
     138 
     139        // Get corresponding iterator 
     140        // Gtk::TextBuffer::Mark::get_iter is not const. Why not? It prevents 
     141        // this function from being const. 
     142        const Gtk::TextBuffer::iterator iter = mark->get_iter(); 
     143 
     144        // Read line and column 
     145        row = iter.get_line(); 
     146        col = iter.get_line_offset(); 
     147} 
     148 
     149unsigned int Gobby::Document::get_unsynced_changes_count() const 
     150{ 
     151        obby::client_document* doc =  
     152                dynamic_cast<obby::client_document*>(&m_doc); 
     153 
     154        // Changes in Server/Host documents are always synced 
     155        if(doc == NULL) 
     156                return 0; 
     157 
     158        return doc->get_unsynced_changes_count(); 
     159} 
     160 
     161#ifdef WITH_GTKSOURCEVIEW 
     162Glib::RefPtr<Gtk::SourceLanguage> Gobby::Document::get_language() const 
     163{ 
     164        return m_view.get_buffer()->get_language(); 
     165} 
     166#endif 
     167 
     168void Gobby::Document::on_insert_before(const Gtk::TextBuffer::iterator& begin, 
     169                                       const Glib::ustring& text, 
     170                                       int bytes) 
    122171{ 
    123172        if(m_editing) return; 
     
    135184} 
    136185 
    137 void Gobby::Document::on_erase(const Gtk::TextBuffer::iterator& begin, 
    138                                const Gtk::TextBuffer::iterator& end) 
     186void Gobby::Document::on_erase_before(const Gtk::TextBuffer::iterator& begin, 
     187                                      const Gtk::TextBuffer::iterator& end) 
    139188{ 
    140189        if(m_editing) return; 
     
    190239} 
    191240 
     241void Gobby::Document::on_insert_after(const Gtk::TextBuffer::iterator& begin, 
     242                                      const Glib::ustring& text, 
     243                                      int bytes) 
     244{ 
     245        // Document changed: Update statusbar 
     246        m_signal_update.emit(); 
     247} 
     248 
     249void Gobby::Document::on_erase_after(const Gtk::TextBuffer::iterator& begin, 
     250                                     const Gtk::TextBuffer::iterator& end) 
     251{ 
     252        // Document changed: Update statusbar 
     253        m_signal_update.emit(); 
     254} 
     255 
     256void Gobby::Document::on_cursor_changed( 
     257        const Gtk::TextBuffer::iterator& location, 
     258        const Glib::RefPtr<Gtk::TextBuffer::Mark>& mark 
     259) 
     260{ 
     261        // Insert mark changed position: Update status bar 
     262        if(mark->get_name() == "insert") 
     263                m_signal_update.emit(); 
     264} 
     265 
    192266#ifdef WITH_GTKSOURCEVIEW 
    193267const Gobby::Document::MimeMap& Gobby::Document::create_mime_map() 
     
    204278        map["cc"] = "text/x-c++"; 
    205279        map["css"] = "text/css"; 
     280        map["cs"] = "text/x-csharp"; 
    206281        map["diff"] = "text/x-diff"; 
    207282        map["f"] = "text/x-fortran"; 
  • src/folder.cpp

    r81f826c re51abc7  
    6161void Gobby::Folder::obby_document_insert(obby::document& document) 
    6262{ 
    63         Document* new_doc = new Document(document); 
     63        Document* new_doc = new Document(document, *this); 
     64        new_doc->update_event().connect( 
     65                sigc::bind( 
     66                        sigc::mem_fun(*this, &Folder::on_document_update), 
     67                        sigc::ref(*new_doc) 
     68                ) 
     69        ); 
     70 
    6471        append_page(*new_doc, document.get_title()); 
    6572        new_doc->show_all(); 
     
    8087} 
    8188 
     89Gobby::Folder::signal_document_update_type 
     90Gobby::Folder::document_update_event() const 
     91{ 
     92        return m_signal_document_update; 
     93} 
     94 
     95void Gobby::Folder::on_switch_page(GtkNotebookPage* page, guint page_num) 
     96{ 
     97        m_signal_document_update.emit( 
     98                *static_cast<Document*>(get_nth_page(page_num)) 
     99        ); 
     100        Gtk::Notebook::on_switch_page(page, page_num); 
     101} 
     102 
     103void Gobby::Folder::on_document_update(Document& document) 
     104{ 
     105        if(get_current_page() == page_num(document) ) 
     106                m_signal_document_update.emit(document); 
     107} 
     108 
  • src/sourceview/sourcebuffer.cpp

    r1d79f14 re51abc7  
    525525Glib::RefPtr<Gtk::SourceLanguage> Gtk::SourceBuffer::get_language() const 
    526526{ 
    527         return Glib::wrap(gtk_source_buffer_get_language( 
    528                 const_cast<GtkSourceBuffer*>(gobj()) 
    529         ) ); 
     527        GtkSourceBuffer* self = const_cast<GtkSourceBuffer*>(gobj() ); 
     528        if(gtk_source_buffer_get_language(self) == NULL) 
     529                return Glib::RefPtr<Gtk::SourceLanguage>(NULL); 
     530 
     531        return Glib::wrap(gtk_source_buffer_get_language(self), true); 
    530532} 
    531533 
  • src/sourceview/sourcelanguage.cpp

    r1d79f14 re51abc7  
    2929                class_init_func_ = &SourceLanguage_Class::class_init_function; 
    3030                register_derived_type(gtk_source_language_get_type() ); 
     31 
     32                Glib::wrap_register( 
     33                        GTK_TYPE_SOURCE_LANGUAGE, 
     34                        &Gtk::SourceLanguage_Class::wrap_new 
     35                ); 
    3136        } 
    3237 
     
    146151Glib::wrap(GtkSourceLanguage* object, bool take_copy) 
    147152{ 
    148         // The Code below does not work - don't know why 
    149         return Glib::RefPtr<Gtk::SourceLanguage>(new Gtk::SourceLanguage(GTK_SOURCE_LANGUAGE( (GObject*)(object)))); 
    150 /*      return Glib::RefPtr<Gtk::SourceLanguage>( 
     153        Gtk::SourceLanguage::sourcelanguage_class_.init(); 
     154        return Glib::RefPtr<Gtk::SourceLanguage>( 
    151155                dynamic_cast<Gtk::SourceLanguage*>(Glib::wrap_auto( 
    152156                        reinterpret_cast<GObject*>(object), 
    153157                        take_copy 
    154158                ) ) 
    155         );*/ 
     159        ); 
    156160} 
  • src/window.cpp

    r623510b re51abc7  
    6565        m_chat.chat_event().connect( 
    6666                sigc::mem_fun(*this, &Window::on_chat) ); 
     67        m_folder.document_update_event().connect( 
     68                sigc::mem_fun(*this, &Window::on_document_update) ); 
    6769 
    6870        m_frame_chat.set_shadow_type(Gtk::SHADOW_IN); 
     
    8385        m_mainbox.pack_start(m_header, Gtk::PACK_SHRINK); 
    8486        m_mainbox.pack_start(m_mainpaned, Gtk::PACK_EXPAND_WIDGET); 
     87        m_mainbox.pack_start(m_statusbar, Gtk::PACK_SHRINK); 
    8588 
    8689        add(m_mainbox); 
     
    138141                m_userlist.obby_start(); 
    139142                m_chat.obby_start(); 
     143                m_statusbar.obby_start(); 
    140144 
    141145                // Let the local user join 
     
    231235                        m_userlist.obby_end(); 
    232236                        m_chat.obby_end(); 
     237                        m_statusbar.obby_end(); 
    233238 
    234239                        m_running = false; 
     
    336341} 
    337342 
     343void Gobby::Window::on_document_update(Document& document) 
     344{ 
     345        // Update statusbar 
     346        m_statusbar.update(document); 
     347} 
     348 
    338349void Gobby::Window::on_obby_login_failed(const std::string& reason) 
    339350{ 
     
    352363        // Send documents to components 
    353364        obby::buffer::document_iterator iter = m_buffer->document_begin(); 
    354         for(iter; iter != m_buffer->document_end(); ++ iter) 
     365        for(; iter != m_buffer->document_end(); ++ iter) 
    355366                on_obby_document_insert(*iter); 
    356367} 
     
    379390                        m_userlist.obby_start(); 
    380391                        m_chat.obby_start(); 
     392                        m_statusbar.obby_start(); 
    381393 
    382394                        m_running = true; 
     
    389401        m_userlist.obby_user_join(user); 
    390402        m_chat.obby_user_join(user); 
     403        m_statusbar.obby_user_join(user); 
    391404} 
    392405 
     
    398411        m_userlist.obby_user_part(user); 
    399412        m_chat.obby_user_part(user); 
     413        m_statusbar.obby_user_part(user); 
    400414} 
    401415 
     
    406420        m_userlist.obby_document_insert(document); 
    407421        m_chat.obby_document_insert(document); 
     422        m_statusbar.obby_document_insert(document); 
    408423} 
    409424 
     
    414429        m_userlist.obby_document_remove(document); 
    415430        m_chat.obby_document_remove(document); 
     431        m_statusbar.obby_document_remove(document); 
    416432} 
    417433