]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiSelection.cpp
Make the InsetInfo dialog a bit less esoteric.
[lyx.git] / src / frontends / qt4 / GuiSelection.cpp
1 // -*- C++ -*-
2 /**
3  * \file qt4/GuiSelection.cpp
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author John Levon
8  * \author Abdelrazak Younes
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #include <config.h>
14
15 #include "GuiSelection.h"
16
17 #include "qt_helpers.h"
18
19 #include "support/debug.h"
20 #include "support/lstrings.h"
21
22 #include <QApplication>
23 #include <QClipboard>
24 #include <QString>
25
26
27 namespace lyx {
28 namespace frontend {
29
30
31 GuiSelection::GuiSelection()
32         : schedule_check_(true),
33         selection_supported_(qApp->clipboard()->supportsSelection())
34 {
35         connect(qApp->clipboard(), SIGNAL(selectionChanged()),
36                 this, SLOT(on_dataChanged()));
37 }
38
39
40 void GuiSelection::haveSelection(bool own)
41 {
42         if (!selection_supported_)
43                 return;
44
45         // Tell qt that we have a selection by setting a dummy selection.
46         // We don't use the interface provided by Qt for setting the
47         // selection for performance reasons (see documentation of
48         // Selection::put()). Instead we only tell here that we have a
49         // selection by setting the selection to the empty string.
50         // The real selection is set in GuiApplication::x11EventFilter when
51         // an application actually requests it.
52         // This way calling Selection::have() is cheap and we can do it as
53         // often as we want.
54         //LYXERR(Debug::SELECTION, "GuiSelection: setting dummy selection");
55         if (own)
56                 qApp->clipboard()->setText(QString(), QClipboard::Selection);
57         // We don't need to do anything if own = false, as this case is
58         // handled by QT.
59         // FIXME (gb): This is wrong. What is missing here is rather a call of
60         //else
61         //      qApp->clipboard()->clear(QClipboard::Selection);
62         // Since we do not issue this call we rather implement
63         // "persistent selections" as far as X is concerned.
64 }
65
66
67 docstring const GuiSelection::get() const
68 {
69         QString const str = qApp->clipboard()->text(QClipboard::Selection)
70                                 .normalized(QString::NormalizationForm_C);
71         LYXERR(Debug::SELECTION, "GuiSelection::get: " << str);
72         if (str.isNull())
73                 return docstring();
74
75         return internalLineEnding(str);
76 }
77
78
79 void GuiSelection::put(docstring const & str)
80 {
81         LYXERR(Debug::SELECTION, "GuiSelection::put: " << to_utf8(str));
82
83         qApp->clipboard()->setText(externalLineEnding(str),
84                                    QClipboard::Selection);
85 }
86
87
88 void GuiSelection::on_dataChanged()
89 {
90         schedule_check_ = true;
91         LYXERR(Debug::SELECTION, "GuiSelection::on_dataChanged");
92 }
93
94
95 bool GuiSelection::empty() const
96 {
97         if (!selection_supported_)
98                 return true;
99
100         // Cache which is to speed up selection-status read
101         // (4 calls when open Edit menu).
102         static bool text_selection_empty;
103         if (schedule_check_) {
104                 text_selection_empty = qApp->clipboard()->
105                         text(QClipboard::Selection).isEmpty();
106                 schedule_check_ = false;
107         }
108
109         LYXERR(Debug::SELECTION, "GuiSelection::filled: " << !text_selection_empty);
110         return text_selection_empty;
111 }
112
113 } // namespace frontend
114 } // namespace lyx
115
116 #include "moc_GuiSelection.cpp"