Changeset 08eae59d49170034303842da09846cc88a3216fe

Show
Ignore:
Timestamp:
03/07/08 10:56:02 (6 years ago)
Author:
Armin Burgmeier <armin@…>
Parents:
da3e3a0201b8e4eb8cc106101386ca2e7234c06e
Children:
77f22cf1f41f0254633ba54553333e8ab1d75823
git-committer:
Armin Burgmeier <armin@arbur.net> / 2008-07-03T10:56:02Z+0200
Message:

Added Cut/Copy/Paste functionality

2008-07-03 Armin Burgmeier <armin@…>

  • inc/commands/edit-commands.hpp:
  • src/commands/edit-commands.cpp: Implemented Cut/Copy/Paste functionality.
  • src/core/folder.cpp: Emit signal_document_changed when the last document is about to be removed before the document has actually been removed, so that signal handlers that still have a reference to the last document can still make use of it.
  • src/core/header.cpp: Added a shortcut (<control><stift>L) for Save All, as in gedit.
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • ChangeLog

    rda3e3a0 r08eae59  
     12008-07-03  Armin Burgmeier  <armin@0x539.de> 
     2 
     3        * inc/commands/edit-commands.hpp: 
     4        * src/commands/edit-commands.cpp: Implemented Cut/Copy/Paste 
     5        functionality. 
     6 
     7        * src/core/folder.cpp: Emit signal_document_changed when the last 
     8        document is about to be removed before the document has actually been 
     9        removed, so that signal handlers that still have a reference to the 
     10        last document can still make use of it. 
     11 
     12        * src/core/header.cpp: Added a shortcut (<control><stift>L) for Save 
     13        All, as in gedit. 
     14 
    1152008-07-02  Armin Burgmeier  <armin@0x539.de> 
    216 
  • inc/commands/edit-commands.hpp

    rda3e3a0 r08eae59  
    6767        } 
    6868 
     69        static void on_mark_set_static(GtkTextBuffer* buffer, 
     70                                       GtkTextIter* iter, 
     71                                       GtkTextMark* mark, 
     72                                       gpointer user_data) 
     73        { 
     74                static_cast<EditCommands*>(user_data)->on_mark_set(); 
     75        } 
     76 
     77        static void on_changed_static(GtkTextBuffer* buffer, 
     78                                      gpointer user_data) 
     79        { 
     80                static_cast<EditCommands*>(user_data)->on_changed(); 
     81        } 
     82 
    6983        void on_sync_complete(); 
    7084        void on_active_user_changed(InfTextUser* active_user); 
     85        void on_mark_set(); 
     86        void on_changed(); 
     87 
    7188        void on_can_undo_changed(InfAdoptedUser* user, bool can_undo); 
    7289        void on_can_redo_changed(InfAdoptedUser* user, bool can_redo); 
     
    7491        void on_undo(); 
    7592        void on_redo(); 
     93        void on_cut(); 
     94        void on_copy(); 
     95        void on_paste(); 
    7696 
    7797        DocWindow* m_current_document; 
     
    81101        gulong m_can_redo_changed_handler; 
    82102        gulong m_synchronization_complete_handler; 
     103        gulong m_mark_set_handler; 
     104        gulong m_changed_handler; 
    83105 
    84106        Gtk::Window& m_parent; 
  • src/commands/edit-commands.cpp

    rda3e3a0 r08eae59  
    3434        m_header.action_edit_redo->signal_activate().connect( 
    3535                sigc::mem_fun(*this, &EditCommands::on_redo)); 
     36        m_header.action_edit_cut->signal_activate().connect( 
     37                sigc::mem_fun(*this, &EditCommands::on_cut)); 
     38        m_header.action_edit_copy->signal_activate().connect( 
     39                sigc::mem_fun(*this, &EditCommands::on_copy)); 
     40        m_header.action_edit_paste->signal_activate().connect( 
     41                sigc::mem_fun(*this, &EditCommands::on_paste)); 
    3642        m_folder.signal_document_changed().connect( 
    3743                sigc::mem_fun(*this, &EditCommands::on_document_changed)); 
     
    5561                        inf_adopted_session_get_algorithm( 
    5662                                INF_ADOPTED_SESSION(session)); 
     63                GtkTextBuffer* buffer = GTK_TEXT_BUFFER( 
     64                        m_current_document->get_text_buffer()); 
    5765 
    5866                if(m_synchronization_complete_handler != 0) 
     
    7280                } 
    7381 
     82                g_signal_handler_disconnect(G_OBJECT(buffer), 
     83                                            m_mark_set_handler); 
     84                g_signal_handler_disconnect(G_OBJECT(buffer), 
     85                                            m_changed_handler); 
     86 
    7487                m_active_user_changed_connection.disconnect(); 
    7588        } 
     
    8194                InfTextSession* session = document->get_session(); 
    8295                InfTextUser* active_user = document->get_active_user(); 
     96                GtkTextBuffer* buffer = 
     97                        GTK_TEXT_BUFFER(document->get_text_buffer()); 
    8398 
    8499                m_active_user_changed_connection = 
     
    88103                                        &EditCommands:: 
    89104                                                on_active_user_changed)); 
     105 
     106                m_mark_set_handler = g_signal_connect_after( 
     107                        G_OBJECT(buffer), "mark-set", 
     108                        G_CALLBACK(&on_mark_set_static), this); 
     109                // The selection might change without mark-set being emitted 
     110                // when the document changes, for example when all 
     111                // currently selected text is deleted. 
     112                m_changed_handler = g_signal_connect_after( 
     113                        G_OBJECT(buffer), "changed", 
     114                        G_CALLBACK(&on_changed_static), this); 
    90115 
    91116                if(inf_session_get_status(INF_SESSION(session)) == 
     
    116141                // Set initial sensitivity for active user: 
    117142                on_active_user_changed(active_user); 
     143                // Set initial sensitivity for cut/copy/paste: 
     144                on_mark_set(); 
    118145        } 
    119146        else 
     
    121148                m_header.action_edit_undo->set_sensitive(false); 
    122149                m_header.action_edit_redo->set_sensitive(false); 
     150                m_header.action_edit_cut->set_sensitive(false); 
     151                m_header.action_edit_copy->set_sensitive(false); 
     152                m_header.action_edit_paste->set_sensitive(false); 
    123153        } 
    124154} 
     
    152182{ 
    153183        g_assert(m_current_document != NULL); 
    154         InfTextSession* session = m_current_document->get_session(); 
    155         InfAdoptedAlgorithm* algorithm = inf_adopted_session_get_algorithm( 
    156                 INF_ADOPTED_SESSION(session)); 
    157184 
    158185        if(active_user != NULL) 
    159186        { 
     187                InfTextSession* session = m_current_document->get_session(); 
     188                InfAdoptedAlgorithm* algorithm = 
     189                        inf_adopted_session_get_algorithm( 
     190                                INF_ADOPTED_SESSION(session)); 
     191                GtkTextBuffer* buffer = GTK_TEXT_BUFFER( 
     192                        m_current_document->get_text_buffer()); 
     193 
    160194                m_header.action_edit_undo->set_sensitive( 
    161195                        inf_adopted_algorithm_can_undo( 
     
    164198                        inf_adopted_algorithm_can_redo( 
    165199                                algorithm, INF_ADOPTED_USER(active_user))); 
     200 
     201                m_header.action_edit_cut->set_sensitive( 
     202                        gtk_text_buffer_get_has_selection(buffer)); 
     203                m_header.action_edit_paste->set_sensitive(true); 
    166204        } 
    167205        else 
     
    169207                m_header.action_edit_undo->set_sensitive(false); 
    170208                m_header.action_edit_redo->set_sensitive(false); 
    171         } 
     209                m_header.action_edit_cut->set_sensitive(false); 
     210                m_header.action_edit_paste->set_sensitive(false); 
     211        } 
     212} 
     213 
     214void Gobby::EditCommands::on_mark_set() 
     215{ 
     216        g_assert(m_current_document != NULL); 
     217        GtkTextBuffer* buffer = 
     218                GTK_TEXT_BUFFER(m_current_document->get_text_buffer()); 
     219 
     220        m_header.action_edit_copy->set_sensitive( 
     221                gtk_text_buffer_get_has_selection(buffer)); 
     222 
     223        if(m_current_document->get_active_user() != NULL) 
     224        { 
     225                m_header.action_edit_cut->set_sensitive( 
     226                        gtk_text_buffer_get_has_selection(buffer)); 
     227        } 
     228} 
     229 
     230void Gobby::EditCommands::on_changed() 
     231{ 
     232        on_mark_set(); 
    172233} 
    173234 
     
    207268        ); 
    208269} 
     270 
     271void Gobby::EditCommands::on_cut() 
     272{ 
     273        g_assert(m_current_document != NULL); 
     274        g_assert(m_current_document->get_active_user() != NULL); 
     275 
     276        gtk_text_buffer_cut_clipboard( 
     277                GTK_TEXT_BUFFER(m_current_document->get_text_buffer()), 
     278                gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), 
     279                TRUE); 
     280} 
     281 
     282void Gobby::EditCommands::on_copy() 
     283{ 
     284        g_assert(m_current_document != NULL); 
     285 
     286        gtk_text_buffer_copy_clipboard( 
     287                GTK_TEXT_BUFFER(m_current_document->get_text_buffer()), 
     288                gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); 
     289} 
     290 
     291void Gobby::EditCommands::on_paste() 
     292{ 
     293        g_assert(m_current_document != NULL); 
     294        g_assert(m_current_document->get_active_user() != NULL); 
     295 
     296        gtk_text_buffer_paste_clipboard( 
     297                GTK_TEXT_BUFFER(m_current_document->get_text_buffer()), 
     298                gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), 
     299                NULL, TRUE); 
     300} 
  • src/core/folder.cpp

    r93f6a42 r08eae59  
    132132                                                                gpointer data) 
    133133                { 
    134                         printf("Notify subscr group\n"); 
    135134                        static_cast<TabLabel*>(data)->update_icon(); 
    136135                } 
     
    228227{ 
    229228        m_signal_document_removed.emit(window); 
     229 
     230        // TODO: We should actually remove the page here, but destroy the 
     231        // DocWindow after having emitted signal_document_changed. 
     232        if(get_n_pages() == 1) 
     233                m_signal_document_changed.emit(NULL); 
     234 
    230235        inf_session_close(INF_SESSION(window.get_session())); 
    231236        remove_page(window); 
    232  
    233         if(get_n_pages() == 0) 
    234                 m_signal_document_changed.emit(NULL); 
    235237} 
    236238 
  • src/core/header.cpp

    rda3e3a0 r08eae59  
    276276                        Gtk::AccelKey("<control><shift>S", 
    277277                                      "<Actions>/MenuFile/FileSaveAs")); 
    278         group_file->add(action_file_save_all); 
     278        group_file->add(action_file_save_all, 
     279                        Gtk::AccelKey("<control><shift>L", 
     280                                      "<Actions>/MenuFile/FileSaveAll")); 
    279281        group_file->add(action_file_quit); 
    280282