# HG changeset patch # User John Donoghue # Date 1372638800 14400 # Node ID 944ade6e7f66cc0ea985e09b72a16941bd5989df # Parent 1aebb613a5ac08d4c7ece9d041cd5a56e2a05f8e Make main window copy and paste global for current focused window * libgui/src/workspace-view.h, libgui/src/workspace-view.cc (workspace_view::copyClipboard): New function. * libgui/src/qtinfo/webinfo.h, libgui/src/qtinfo/webinfo.cc (webinfo::pasteClipboard): New function. (webinfo::copyClipboard): New function. * libgui/src/octave-dock-widget.h, libgui/src/octave-dock-widget.cc (octave_dock_widget::copyClipboard): New function. (octave_dock_widget::pasteClipboard): New function. (octave_dock_widget::focusWidget): New function. (octave_dock_widget::octave_dock_widget): Connect copy/paste to main window signals. * libgui/src/main-window.cc (main_window::copyClipboard): process current directory copy if is focused. (main_window::pasteClipboard): process current directory paste if is focused. * libgui/src/m-editor/file-editor.h, libgui/src/m-editor/file-editor.cc (file_editor::copyClipboard): New function. (file_editor::pasteClipboard): New function. * libgui/src/history-dock-widget.h, libgui/src/history-dock-widget.cc (history_dock_widget::pasteClipboard): New function. (history_dock_widget::copyClipboard): New function. * libgui/src/files-dock-widget.h, libgui/src/files-dock-widget.cc (files_dock_widget::copyClipboard): New function. (files_dock_widget::pasteClipboard): New function. * libgui/src/documentation-dock-widget.h, libgui/src/documentation-dock-widget.cc (documentation_dock_widget::copyClipboard): New function. (documentation_dock_widget::pasteClipboard): New function. * libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h, libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cc (QWinTerminalImpl::copyClipboard): dont copy unless is focused widget. (QWinTerminalImpl::pasteClipboard): dont paste unless is focused widget. * libgui/qterminal/libqterminal/unix/TerminalView.h, libgui/qterminal/libqterminal/unix/TerminalView.cc (TerminalView::copyClipboard): only copy is focused widget. (TerminalView::pasteClipboard): only paste is focused widget. diff --git a/libgui/qterminal/libqterminal/unix/TerminalView.cpp b/libgui/qterminal/libqterminal/unix/TerminalView.cpp --- a/libgui/qterminal/libqterminal/unix/TerminalView.cpp +++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp @@ -2260,7 +2260,7 @@ void TerminalView::copyClipboard() { - if ( !_screenWindow ) + if ( !_screenWindow || !hasFocus()) return; QString text = _screenWindow->selectedText(_preserveLineBreaks); @@ -2278,7 +2278,10 @@ void TerminalView::pasteClipboard() { - emitSelection(false,false); + if(hasFocus ()) + { + emitSelection(false,false); + } } void TerminalView::pasteSelection() diff --git a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp --- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp +++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp @@ -1436,6 +1436,8 @@ void QWinTerminalImpl::copyClipboard (void) { + if(!hasFocus()) return; + QClipboard *clipboard = QApplication::clipboard (); QString selection = d->getSelection (); @@ -1456,6 +1458,8 @@ void QWinTerminalImpl::pasteClipboard (void) { + if(!hasFocus()) return; + QString text = QApplication::clipboard()->text (QClipboard::Clipboard); if (! text.isEmpty ()) diff --git a/libgui/src/documentation-dock-widget.cc b/libgui/src/documentation-dock-widget.cc --- a/libgui/src/documentation-dock-widget.cc +++ b/libgui/src/documentation-dock-widget.cc @@ -37,3 +37,14 @@ _webinfo = new webinfo (this); setWidget (_webinfo); } + +void +documentation_dock_widget::copyClipboard () +{ + _webinfo->copyClipboard (); +} +void +documentation_dock_widget::pasteClipboard () +{ + _webinfo->pasteClipboard (); +} diff --git a/libgui/src/documentation-dock-widget.h b/libgui/src/documentation-dock-widget.h --- a/libgui/src/documentation-dock-widget.h +++ b/libgui/src/documentation-dock-widget.h @@ -35,6 +35,10 @@ documentation_dock_widget (QWidget *parent = 0); +protected slots: + void copyClipboard (); + void pasteClipboard (); + private: webinfo *_webinfo; diff --git a/libgui/src/files-dock-widget.cc b/libgui/src/files-dock-widget.cc --- a/libgui/src/files-dock-widget.cc +++ b/libgui/src/files-dock-widget.cc @@ -708,3 +708,35 @@ emit find_files_signal(dir); } +void +files_dock_widget::copyClipboard () +{ + if (_file_tree_view->hasFocus ()) + contextmenu_copy_selection (true); + if (_current_directory->hasFocus ()) + { + QClipboard *clipboard = QApplication::clipboard (); + + QLineEdit * edit = _current_directory->lineEdit (); + if (edit && edit->hasSelectedText ()) + { + clipboard->setText (edit->selectedText ()); + } + } +} + +void +files_dock_widget::pasteClipboard () +{ + if (_current_directory->hasFocus ()) + { + QClipboard *clipboard = QApplication::clipboard (); + QString str = clipboard->text (); + QLineEdit * edit = _current_directory->lineEdit (); + if (edit && str.length () > 0) + edit->insert (str); + } +} + + + diff --git a/libgui/src/files-dock-widget.h b/libgui/src/files-dock-widget.h --- a/libgui/src/files-dock-widget.h +++ b/libgui/src/files-dock-widget.h @@ -103,6 +103,10 @@ void popdownmenu_findfiles (bool); void popdownmenu_home (bool); + /* from octave_doc_widget */ + void copyClipboard (); + void pasteClipboard (); + signals: /** Emitted, whenever the user requested to open a file. */ diff --git a/libgui/src/history-dock-widget.cc b/libgui/src/history-dock-widget.cc --- a/libgui/src/history-dock-widget.cc +++ b/libgui/src/history-dock-widget.cc @@ -169,3 +169,28 @@ { _history_model->setStringList (QStringList ()); } + +void +history_dock_widget::copyClipboard () +{ + if(_history_list_view->hasFocus()) + handle_contextmenu_copy(true); + if(_filter_line_edit->hasFocus () && _filter_line_edit->hasSelectedText ()) + { + QClipboard *clipboard = QApplication::clipboard (); + clipboard->setText ( _filter_line_edit->selectedText ()); + } +} + +void +history_dock_widget::pasteClipboard () +{ + if(_filter_line_edit->hasFocus ()) + { + QClipboard *clipboard = QApplication::clipboard (); + QString str = clipboard->text (); + if (str.length() > 0) + _filter_line_edit->insert (str); + } +} + diff --git a/libgui/src/history-dock-widget.h b/libgui/src/history-dock-widget.h --- a/libgui/src/history-dock-widget.h +++ b/libgui/src/history-dock-widget.h @@ -62,6 +62,9 @@ void handle_contextmenu_create_script(bool flag); void ctxMenu(const QPoint &pos); + void copyClipboard (); + void pasteClipboard (); + private: void construct (); diff --git a/libgui/src/m-editor/file-editor.cc b/libgui/src/m-editor/file-editor.cc --- a/libgui/src/m-editor/file-editor.cc +++ b/libgui/src/m-editor/file-editor.cc @@ -1171,4 +1171,25 @@ _tab_widget->setCurrentWidget (f); } +void +file_editor::copyClipboard () +{ + QWidget * foc_w = focusWidget (); + + if(foc_w && foc_w->inherits ("octave_qscintilla")) + { + request_copy (); + } +} +void +file_editor::pasteClipboard () +{ + QWidget * foc_w = focusWidget (); + + if(foc_w && foc_w->inherits ("octave_qscintilla")) + { + request_paste (); + } +} + #endif diff --git a/libgui/src/m-editor/file-editor.h b/libgui/src/m-editor/file-editor.h --- a/libgui/src/m-editor/file-editor.h +++ b/libgui/src/m-editor/file-editor.h @@ -152,6 +152,10 @@ // Tells the editor to react on changed settings. void notice_settings (const QSettings *settings); +protected slots: + void copyClipboard (); + void pasteClipboard (); + private slots: void request_open_file (const QString& fileName, int line = -1, diff --git a/libgui/src/main-window.cc b/libgui/src/main-window.cc --- a/libgui/src/main-window.cc +++ b/libgui/src/main-window.cc @@ -613,13 +613,34 @@ void main_window::copyClipboard (void) { - emit copyClipboard_signal (); + if (_current_directory_combo_box->hasFocus ()) + { + QLineEdit * edit = _current_directory_combo_box->lineEdit (); + if (edit && edit->hasSelectedText ()) + { + QClipboard *clipboard = QApplication::clipboard (); + clipboard->setText (edit->selectedText ()); + } + } + else + emit copyClipboard_signal (); } void main_window::pasteClipboard (void) { - emit pasteClipboard_signal (); + if (_current_directory_combo_box->hasFocus ()) + { + QLineEdit * edit = _current_directory_combo_box->lineEdit (); + QClipboard *clipboard = QApplication::clipboard (); + QString str = clipboard->text (); + if (edit && str.length () > 0) + { + edit->insert (str); + } + } + else + emit pasteClipboard_signal (); } // Connect the signals emitted when the Octave thread wants to create diff --git a/libgui/src/octave-dock-widget.cc b/libgui/src/octave-dock-widget.cc --- a/libgui/src/octave-dock-widget.cc +++ b/libgui/src/octave-dock-widget.cc @@ -21,7 +21,7 @@ */ - +#include #include #include #include @@ -76,6 +76,9 @@ title_widget->setLayout (h_layout); setTitleBarWidget (title_widget); + // copy & paste handling + connect (p, SIGNAL (copyClipboard_signal ()), this, SLOT (copyClipboard ())); + connect (p, SIGNAL (pasteClipboard_signal()), this, SLOT (pasteClipboard ())); } octave_dock_widget::~octave_dock_widget () @@ -193,3 +196,11 @@ emit active_changed (false); } +// get focus widget +QWidget * +octave_dock_widget::focusWidget () +{ + QWidget * w = QApplication::focusWidget (); + if(w && w->focusProxy ()) w = w->focusProxy (); + return w; +} diff --git a/libgui/src/octave-dock-widget.h b/libgui/src/octave-dock-widget.h --- a/libgui/src/octave-dock-widget.h +++ b/libgui/src/octave-dock-widget.h @@ -58,6 +58,7 @@ QDockWidget::closeEvent (e); } + QWidget * focusWidget(); public slots: @@ -91,6 +92,13 @@ if (visible) emit active_changed (true); } + /** slots to handle copy & paste */ + virtual void copyClipboard () + { + } + virtual void pasteClipboard () + { + } private slots: diff --git a/libgui/src/qtinfo/webinfo.cc b/libgui/src/qtinfo/webinfo.cc --- a/libgui/src/qtinfo/webinfo.cc +++ b/libgui/src/qtinfo/webinfo.cc @@ -31,6 +31,8 @@ #include "webinfo.h" #include #include +#include +#include #include "file-ops.h" #include "help.h" @@ -218,3 +220,30 @@ _text_browser->setFont (_font_web); } +void +webinfo::copyClipboard () +{ + if (_search_line_edit->hasFocus () && _search_line_edit->hasSelectedText ()) + { + QClipboard *clipboard = QApplication::clipboard (); + + clipboard->setText (_search_line_edit->selectedText ()); + } + if (_text_browser->hasFocus ()) + { + _text_browser->copy (); + } +} + +void +webinfo::pasteClipboard () +{ + if (_search_line_edit->hasFocus ()) + { + QClipboard *clipboard = QApplication::clipboard (); + QString str = clipboard->text (); + if (str.length () > 0) + _search_line_edit->insert (str); + } +} + diff --git a/libgui/src/qtinfo/webinfo.h b/libgui/src/qtinfo/webinfo.h --- a/libgui/src/qtinfo/webinfo.h +++ b/libgui/src/qtinfo/webinfo.h @@ -49,6 +49,9 @@ void zoom_in (); void zoom_out (); + void copyClipboard (); + void pasteClipboard (); + private: QTextBrowser *_text_browser; QTabBar *_tab_bar; diff --git a/libgui/src/workspace-view.cc b/libgui/src/workspace-view.cc --- a/libgui/src/workspace-view.cc +++ b/libgui/src/workspace-view.cc @@ -266,3 +266,11 @@ } setToolTip (tool_tip); } + +void +workspace_view::copyClipboard () +{ + if (view->hasFocus ()) + handle_contextmenu_copy (); +} + diff --git a/libgui/src/workspace-view.h b/libgui/src/workspace-view.h --- a/libgui/src/workspace-view.h +++ b/libgui/src/workspace-view.h @@ -69,6 +69,8 @@ void handle_model_changed (void); + void copyClipboard(); + private: void relay_contextmenu_command (const QString& cmdname);