]> git.lyx.org Git - features.git/commitdiff
Fix clipboard/selection encoding
authorGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Sun, 3 Sep 2006 07:02:38 +0000 (07:02 +0000)
committerGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Sun, 3 Sep 2006 07:02:38 +0000 (07:02 +0000)
* src/frontends/qt[34]/qt_helpers.[Ch]
(toqstr): add variant for docstring
(qstring_to_ucs4): Use docstring and port from qt4 to qt3

* Many other files: Many std::string -> lyx::docstring conversions

* src/support/lstrings.[Ch]
(subst): Add variant for docstring and char_type
(externalLineEnding): std::string -> lyx::docstring
(internalLineEnding): std::string -> lyx::docstring

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14871 a592a061-630c-0410-9148-cb99ea01b6c8

36 files changed:
src/BufferView_pimpl.C
src/buffer.C
src/buffer.h
src/cursor.C
src/cursor.h
src/frontends/Clipboard.h
src/frontends/Selection.h
src/frontends/gtk/GuiClipboard.C
src/frontends/gtk/GuiClipboard.h
src/frontends/gtk/GuiSelection.C
src/frontends/gtk/GuiSelection.h
src/frontends/qt3/GuiClipboard.C
src/frontends/qt3/GuiClipboard.h
src/frontends/qt3/GuiSelection.C
src/frontends/qt3/GuiSelection.h
src/frontends/qt3/qt_helpers.C
src/frontends/qt3/qt_helpers.h
src/frontends/qt4/GuiClipboard.C
src/frontends/qt4/GuiClipboard.h
src/frontends/qt4/GuiSelection.C
src/frontends/qt4/GuiSelection.h
src/frontends/qt4/qt_helpers.C
src/frontends/qt4/qt_helpers.h
src/insets/insettabular.C
src/insets/insettabular.h
src/insets/insettext.C
src/insets/insettext.h
src/lyx_cb.C
src/lyxfind.C
src/lyxtext.h
src/mathed/math_nestinset.C
src/support/lstrings.C
src/support/lstrings.h
src/support/textutils.h
src/text2.C
src/text3.C

index 8b550378c77242d7139aa4b26926c6a61217ef0f..97f031505118f2a7948ecff88df114efaa67c003 100644 (file)
@@ -83,6 +83,7 @@
 using lyx::frontend::Clipboard;
 using lyx::frontend::Gui;
 
+using lyx::docstring;
 using lyx::pos_type;
 
 using lyx::support::addPath;
@@ -460,7 +461,7 @@ void BufferView::Pimpl::scroll(int /*lines*/)
 
 void BufferView::Pimpl::selectionRequested()
 {
-       static string sel;
+       static docstring sel;
 
        if (!available())
                return;
index a10470487a745e3ee2ae3c79b9ff0353fdc8ef19..19b239229e15be2c37ff06efae81979a1d417fef 100644 (file)
@@ -93,6 +93,7 @@ namespace io = boost::iostreams;
 #include <fstream>
 
 
+using lyx::docstring;
 using lyx::pos_type;
 using lyx::pit_type;
 
@@ -504,13 +505,13 @@ bool Buffer::readDocument(LyXLex & lex)
 // needed to insert the selection
 void Buffer::insertStringAsLines(ParagraphList & pars,
        pit_type & pit, pos_type & pos,
-       LyXFont const & fn, string const & str, bool autobreakrows)
+       LyXFont const & fn, docstring const & str, bool autobreakrows)
 {
        LyXFont font = fn;
 
        // insert the string, don't insert doublespace
        bool space_inserted = true;
-       for (string::const_iterator cit = str.begin();
+       for (docstring::const_iterator cit = str.begin();
            cit != str.end(); ++cit) {
                Paragraph & par = pars[pit];
                if (*cit == '\n') {
@@ -541,9 +542,11 @@ void Buffer::insertStringAsLines(ParagraphList & pars,
                                }
                                space_inserted = true;
                        }
+/* FIXME: not needed anymore?
                } else if (!isPrintable(*cit)) {
                        // Ignore unprintables
                        continue;
+*/
                } else {
                        // just insert the character
                        par.insertChar(pos, *cit, font);
index ac12660313763193947206e57f13c3a24b9ece82..d3c8d20e655a076334bb23c78fed8ab6157ee14a 100644 (file)
@@ -107,7 +107,7 @@ public:
        ///
        void insertStringAsLines(ParagraphList & plist,
                lyx::pit_type &, lyx::pos_type &,
-               LyXFont const &, std::string const &, bool);
+               LyXFont const &, lyx::docstring const &, bool);
        ///
        ParIterator getParFromID(int id) const;
        /// do we have a paragraph with this id?
index a0603328452a98586598dff1ac35714762b88263..d59de28474e5f9b3a01375dec670c4f459f2d253 100644 (file)
@@ -54,6 +54,7 @@
 #include <limits>
 
 using lyx::char_type;
+using lyx::docstring;
 using lyx::pit_type;
 
 using std::string;
@@ -1114,10 +1115,10 @@ void LCursor::errorMessage(string const & msg) const
 }
 
 
-string LCursor::selectionAsString(bool label) const
+docstring LCursor::selectionAsString(bool label) const
 {
        if (!selection())
-               return string();
+               return docstring();
 
        if (inTexted()) {
                Buffer const & buffer = *bv().buffer();
@@ -1130,7 +1131,7 @@ string LCursor::selectionAsString(bool label) const
                size_t const endpos = selEnd().pos();
 
                if (startpit == endpit)
-                       return pars[startpit].asString(buffer, startpos, endpos, label);
+                       return lyx::from_utf8(pars[startpit].asString(buffer, startpos, endpos, label));
 
                // First paragraph in selection
                string result = pars[startpit].
@@ -1145,13 +1146,13 @@ string LCursor::selectionAsString(bool label) const
                // Last paragraph in selection
                result += pars[endpit].asString(buffer, 0, endpos, label);
 
-               return result;
+               return lyx::from_utf8(result);
        }
 
        if (inMathed())
-               return lyx::cap::grabSelection(*this);
+               return lyx::from_utf8(lyx::cap::grabSelection(*this));
 
-       return string();
+       return docstring();
 }
 
 
index ae0dcf900bed44bb1bdd0f26bd1b1423ced8ee25..8238f2422ace78d198c385f6c6679c8d93e721cf 100644 (file)
@@ -86,7 +86,7 @@ public:
        ///
        void selHandle(bool selecting);
        //
-       std::string selectionAsString(bool label) const;
+       lyx::docstring selectionAsString(bool label) const;
        ///
        std::string currentState();
 
index d871b114e704d81c205f11fea56d31392ef31e97..c49bd4b0c61c009d9c94dd2ae5e18afca9a02c9a 100644 (file)
@@ -14,7 +14,7 @@
 #ifndef BASE_CLIPBOARD_H
 #define BASE_CLIPBOARD_H
 
-#include <string>
+#include "support/docstring.h"
 
 namespace lyx {
 namespace frontend {
@@ -32,13 +32,13 @@ public:
         * This should be called when the user requests to paste from the
         * clipboard.
         */
-       virtual std::string const get() const = 0;
+       virtual docstring const get() const = 0;
        /**
         * Fill the window system clipboard.
         * This should be called when the user requests to cut or copy to
         * the clipboard.
         */
-       virtual void put(std::string const &) = 0;
+       virtual void put(docstring const &) = 0;
 };
 
 } // namespace frontend
index 45ce213cd0556adbcfe65e1a305d89a89441fb5c..cc24d4445082d832a4d00e0a9b38aac9cb060aba 100644 (file)
@@ -14,7 +14,7 @@
 #ifndef BASE_SELECTION_H
 #define BASE_SELECTION_H
 
-#include <string>
+#include "support/docstring.h"
 
 namespace lyx {
 namespace frontend {
@@ -36,13 +36,13 @@ public:
         * This should be called when the user presses the middle mouse
         * button.
         */
-       virtual std::string const get() const = 0;
+       virtual docstring const get() const = 0;
        /**
         * Fill the X selection.
         * Does nothing on systems that don't have a selection.
         * This should be called whenever some text is highlighted.
         */
-       virtual void put(std::string const &) = 0;
+       virtual void put(docstring const &) = 0;
 };
 
 } // namespace frontend
index 60895d462d56b7ce114bbfb27311ac6ba38c42b7..c3a6d3ece41a52a180381e61e76e019fe27a3c2f 100644 (file)
@@ -31,29 +31,23 @@ using std::string;
 namespace lyx {
 namespace frontend {
 
-// ENCODING: Gtk::Clipboard returns UTF-8, we assume that the backend
-// wants ISO-8859-1 and convert it to that.
-// FIXME: Wrong!
-string const GuiClipboard::get() const
+docstring const GuiClipboard::get() const
 {
        Glib::RefPtr<Gtk::Clipboard> clipboard =
                Gtk::Clipboard::get(GDK_SELECTION_CLIPBOARD);
-       string const str = Glib::convert_with_fallback(
-                       clipboard->wait_for_text(), "ISO-8859-1", "UTF-8");
+       string const str = clipboard->wait_for_text();
        lyxerr[Debug::ACTION] << "GuiClipboard::get: " << str << endl;
-       return str;
+       return lyx::from_utf8(str);
 }
 
 
-// ENCODING: we assume that the backend passes us ISO-8859-1 and
-// convert from that to UTF-8 before passing to GTK
-// FIXME: Wrong!
-void GuiClipboard::put(string const & str)
+void GuiClipboard::put(docstring const & str)
 {
-       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << str << endl;
+       string const utf8 = lyx::to_utf8(str);
+       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << utf8 << endl;
        Glib::RefPtr<Gtk::Clipboard> clipboard =
                Gtk::Clipboard::get(GDK_SELECTION_CLIPBOARD);
-       clipboard->set_text(Glib::convert(str, "UTF-8", "ISO-8859-1"));
+       clipboard->set_text(utf8);
 }
 
 } // namespace frontend
index adb1ec7ed0b3a84a8589365ea53adb0a0c2bcbc8..a8a524e787c4760cbee38590abc4f13f1d71f2cb 100644 (file)
@@ -29,9 +29,9 @@ public:
         */
        //@{
 
-       std::string const get() const;
+       docstring const get() const;
 
-       void put(std::string const & str);
+       void put(docstring const & str);
        //@}
 };
 
index cae4af7abe772b32e0d832c1cc789e494b6cb21f..0f30996095e242c28bd68d2e6f730ce48e099191 100644 (file)
@@ -31,29 +31,23 @@ using std::string;
 namespace lyx {
 namespace frontend {
 
-// ENCODING: Gtk::Clipboard returns UTF-8, we assume that the backend
-// wants ISO-8859-1 and convert it to that.
-// FIXME: Wrong!
-string const GuiSelection::get() const
+docstring const GuiSelection::get() const
 {
        Glib::RefPtr<Gtk::Clipboard> clipboard =
                Gtk::Clipboard::get(GDK_SELECTION_PRIMARY);
-       string const str = Glib::convert_with_fallback(
-                       clipboard->wait_for_text(), "ISO-8859-1", "UTF-8");
+       string const str = clipboard->wait_for_text();
        lyxerr[Debug::ACTION] << "GuiClipboard::get: " << str << endl;
-       return str;
+       return lyx::from_utf8(str);
 }
 
 
-// ENCODING: we assume that the backend passes us ISO-8859-1 and
-// convert from that to UTF-8 before passing to GTK
-// FIXME: Wrong!
-void GuiSelection::put(string const & str)
+void GuiSelection::put(docstring const & str)
 {
-       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << str << endl;
+       string const utf8 = lyx::to_utf8(str);
+       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << utf8 << endl;
        Glib::RefPtr<Gtk::Clipboard> clipboard =
                Gtk::Clipboard::get(GDK_SELECTION_PRIMARY);
-       clipboard->set_text(Glib::convert(str, "UTF-8", "ISO-8859-1"));
+       clipboard->set_text(utf8);
 }
 
 } // namespace frontend
index 4d62ad892324e6d027b75daf5f5feea85360607c..6d2118deab601b9acda49c5aeb62475263c9717e 100644 (file)
@@ -40,9 +40,9 @@ public:
                old_work_area_->haveSelection(own);
        }
 
-       std::string const get() const;
+       docstring const get() const;
 
-       void put(std::string const & str);
+       void put(docstring const & str);
        //@}
 
 private:
index c91b788670233fa3cf2b4701b659d3ac46ace89b..f9bd404541695d1b8f3ef4b7dfa617209976e091 100644 (file)
@@ -26,26 +26,25 @@ using lyx::support::internalLineEnding;
 using lyx::support::externalLineEnding;
 
 using std::endl;
-using std::string;
 
 namespace lyx {
 namespace frontend {
 
-string const GuiClipboard::get() const
+docstring const GuiClipboard::get() const
 {
        QString const str = qApp->clipboard()->text(QClipboard::Clipboard);
-       lyxerr[Debug::ACTION] << "GuiClipboard::get: " << (const char*) str
+       lyxerr[Debug::ACTION] << "GuiClipboard::get: " << fromqstr(str)
                              << endl;
        if (str.isNull())
-               return string();
+               return docstring();
 
-       return internalLineEnding(fromqstr(str));
+       return internalLineEnding(qstring_to_ucs4(str));
 }
 
 
-void GuiClipboard::put(string const & str)
+void GuiClipboard::put(docstring const & str)
 {
-       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << str << endl;
+       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << lyx::to_utf8(str) << endl;
 
        qApp->clipboard()->setText(toqstr(externalLineEnding(str)),
                                   QClipboard::Clipboard);
index 47f14f9c07087f166fdb68548f73e084e03bea3f..3ee4922f06814ed2a40e61094396ddfb8ddfc106 100644 (file)
@@ -29,9 +29,9 @@ public:
         */
        //@{
 
-       std::string const get() const;
+       docstring const get() const;
 
-       void put(std::string const & str);
+       void put(docstring const & str);
        //@}
 };
 
index 4e10badc559b0c17a52bca97e1358f1a127ac3b5..e6cd9552ba96d16ad1b908a260eef6b12575621c 100644 (file)
@@ -26,26 +26,25 @@ using lyx::support::internalLineEnding;
 using lyx::support::externalLineEnding;
 
 using std::endl;
-using std::string;
 
 namespace lyx {
 namespace frontend {
 
-string const GuiSelection::get() const
+docstring const GuiSelection::get() const
 {
        QString const str = qApp->clipboard()->text(QClipboard::Selection);
        lyxerr[Debug::ACTION] << "GuiSelection::get: " << (const char*) str
                              << endl;
        if (str.isNull())
-               return string();
+               return docstring();
 
-       return internalLineEnding(fromqstr(str));
+       return internalLineEnding(qstring_to_ucs4(str));
 }
 
 
-void GuiSelection::put(string const & str)
+void GuiSelection::put(docstring const & str)
 {
-       lyxerr[Debug::ACTION] << "GuiSelection::put: " << str << endl;
+       lyxerr[Debug::ACTION] << "GuiSelection::put: " << lyx::to_utf8(str) << endl;
 
        qApp->clipboard()->setText(toqstr(externalLineEnding(str)),
                                   QClipboard::Selection);
index 3f1c1365e12ed5b7a8cb2a21bb1ea9bd17b92a16..919c741e83b28aed5d187fd8e6b78ff62377691f 100644 (file)
@@ -40,9 +40,9 @@ public:
                old_work_area_->haveSelection(own);
        }
 
-       std::string const get() const;
+       docstring const get() const;
 
-       void put(std::string const & str);
+       void put(docstring const & str);
        //@}
 
 private:
index 0317ff2b2e30df409958a7e8bf8c08ddef44370f..e02319fec8991f3deffbcc6f3a3b92711d97ab91 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "support/lstrings.h"
 #include "support/convert.h"
+#include "support/unicode.h"
 
 #include <qcombobox.h>
 #include <qlineedit.h>
@@ -28,6 +29,8 @@
 
 
 using lyx::support::isStrDbl;
+using lyx::char_type;
+using lyx::docstring;
 
 using std::make_pair;
 using std::string;
@@ -114,6 +117,15 @@ QString const toqstr(string const & str)
 }
 
 
+QString const toqstr(docstring const & str)
+{
+       std::vector<unsigned short> ucs2 =
+               ucs4_to_ucs2(str.c_str(), str.length());
+       ucs2.push_back('\0');
+       return QString::fromUcs2(&ucs2[0]);
+}
+
+
 QString const qt_(char const * str)
 {
        return toqstr(_(str));
@@ -134,6 +146,15 @@ string const fromqstr(QString const & str)
 }
 
 
+docstring const qstring_to_ucs4(QString const & str)
+{
+       unsigned short const * const ucs2 = str.ucs2();
+       std::vector<char_type> const ucs4 = ucs2_to_ucs4(
+               std::vector<unsigned short>(ucs2, ucs2 + str.length()));
+       return docstring(ucs4.begin(), ucs4.end());
+}
+
+
 string const formatted(string const & text, int w)
 {
        string sout;
index 1f317a8cb5745b1e27dbee4224e8d7c555afeaae..9b64cb9830781e556f2a8a53b2b26320c891b5fb 100644 (file)
@@ -15,6 +15,7 @@
 #include <utility>
 
 #include "lyxlength.h"
+#include "support/docstring.h"
 
 class LengthCombo;
 class QComboBox;
@@ -55,6 +56,12 @@ QString const toqstr(char const * str);
 QString const toqstr(std::string const & str);
 
 
+/**
+ * toqstr - convert UCS4 encoded docstring to QString
+ */
+QString const toqstr(lyx::docstring const & str);
+
+
 /**
  * qt_ - i18nize string and convert to unicode
  *
@@ -78,4 +85,10 @@ QString const qt_(std::string const & str);
  */
 std::string const fromqstr(QString const & str);
 
+
+/**
+ * qstring_to_ucs4 - convert QString to UCS4 encoded docstring
+ */
+lyx::docstring const qstring_to_ucs4(QString const & str);
+
 #endif // QTHELPERS_H
index 192f2a03896d841bfeb19621bfd35b84cdba9693..ea7d891ad32026c1bd27621c3e756a258b2ccf62 100644 (file)
@@ -26,26 +26,25 @@ using lyx::support::internalLineEnding;
 using lyx::support::externalLineEnding;
 
 using std::endl;
-using std::string;
 
 namespace lyx {
 namespace frontend {
 
-string const GuiClipboard::get() const
+docstring const GuiClipboard::get() const
 {
        QString const str = qApp->clipboard()->text(QClipboard::Clipboard);
        lyxerr[Debug::ACTION] << "GuiClipboard::get: " << fromqstr(str)
                              << endl;
        if (str.isNull())
-               return string();
+               return docstring();
 
-       return internalLineEnding(fromqstr(str));
+       return internalLineEnding(qstring_to_ucs4(str));
 }
 
 
-void GuiClipboard::put(string const & str)
+void GuiClipboard::put(docstring const & str)
 {
-       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << str << endl;
+       lyxerr[Debug::ACTION] << "GuiClipboard::put: " << lyx::to_utf8(str) << endl;
 
        qApp->clipboard()->setText(toqstr(externalLineEnding(str)),
                                   QClipboard::Clipboard);
index 8ccd709d608cac1e93b025b96b230dcdd125bfb2..5f577edf93519db482f62f6c39c4610fe2c564e1 100644 (file)
@@ -30,8 +30,8 @@ public:
        /** Clipboard overloaded methods
         */
        //@{
-       std::string const get() const;
-       void put(std::string const & str);
+       docstring const get() const;
+       void put(docstring const & str);
        //@}
 };
 
index 2844296d330e4017458d6402a78bb8c1a29a9745..83c3dfb625bcefb028be1e492232a8c23275048d 100644 (file)
@@ -26,7 +26,6 @@ using lyx::support::internalLineEnding;
 using lyx::support::externalLineEnding;
 
 using std::endl;
-using std::string;
 
 namespace lyx {
 namespace frontend {
@@ -43,21 +42,21 @@ void GuiSelection::haveSelection(bool own)
 }
 
 
-string const GuiSelection::get() const
+docstring const GuiSelection::get() const
 {
        QString const str = qApp->clipboard()->text(QClipboard::Selection);
        lyxerr[Debug::ACTION] << "GuiSelection::get: " << fromqstr(str)
                              << endl;
        if (str.isNull())
-               return string();
+               return docstring();
 
-       return internalLineEnding(fromqstr(str));
+       return internalLineEnding(qstring_to_ucs4(str));
 }
 
 
-void GuiSelection::put(string const & str)
+void GuiSelection::put(docstring const & str)
 {
-       lyxerr[Debug::ACTION] << "GuiSelection::put: " << str << endl;
+       lyxerr[Debug::ACTION] << "GuiSelection::put: " << lyx::to_utf8(str) << endl;
 
        qApp->clipboard()->setText(toqstr(externalLineEnding(str)),
                                   QClipboard::Selection);
index 20a104e2a53e06a3863107318e3931d7a0b677c3..ed6210f7133859525d799b5da98637a628227588 100644 (file)
@@ -31,8 +31,8 @@ public:
         */
        //@{
        void haveSelection(bool own);
-       std::string const get() const;
-       void put(std::string const & str);
+       docstring const get() const;
+       void put(docstring const & str);
        //@}
 };
 
index 662bb8493c541134085e3dbd19ebbd6628de2abd..ea3e8d48ff7d5a200d1afa386572980da4e36332 100644 (file)
@@ -31,6 +31,7 @@
 
 using lyx::support::isStrDbl;
 using lyx::char_type;
+using lyx::docstring;
 
 using std::vector;
 using std::make_pair;
@@ -130,7 +131,7 @@ QString const ucs4_to_qstring(char_type const * str, size_t ls)
 }
 
 
-QString const ucs4_to_qstring(vector<char_type> const & ucs4)
+QString const toqstr(docstring const & ucs4)
 {
        QString s;
        size_t const ls = ucs4.size();
@@ -142,12 +143,12 @@ QString const ucs4_to_qstring(vector<char_type> const & ucs4)
 }
 
 
-vector<char_type> qstring_to_ucs4(QString const & qstr)
+docstring const qstring_to_ucs4(QString const & qstr)
 {
        int ls = qstr.size();
-       vector<char_type> ucs4;
+       docstring ucs4;
        for (int i = 0; i < ls; ++i)
-               ucs4.push_back(static_cast<boost::uint32_t>(qstr[i].unicode()));
+               ucs4 += static_cast<char_type>(qstr[i].unicode());
 
        return ucs4;
 }
index bab194d43a2b4e2ca40f10ac535e243f81750e49..01d1196540fadfefa33cd4331043ef607d6f3004 100644 (file)
@@ -66,11 +66,11 @@ QString const toqstr(std::string const & str);
  *
  * QString uses ucs2 (a.k.a utf16) internally.
  */
-QString const ucs4_to_qstring(lyx::char_type const * str, size_t ls);
+QString const toqstr(lyx::docstring const & ucs4);
 
-QString const ucs4_to_qstring(std::vector<lyx::char_type> const & ucs4);
+QString const ucs4_to_qstring(lyx::char_type const * str, size_t ls);
 
-std::vector<lyx::char_type> qstring_to_ucs4(QString const & qstr);
+lyx::docstring const qstring_to_ucs4(QString const & qstr);
 
 void qstring_to_ucs4(QString const & qstr, std::vector<lyx::char_type> & ucs4);
 
index 6099d73b521ecf46054d29ef6ef41255cab7ce03..055ca76456e1df49b372495ed62f94ab696bc76c 100644 (file)
@@ -49,6 +49,8 @@
 #include <iostream>
 #include <limits>
 
+using lyx::docstring;
+
 using lyx::cap::dirtyTabularStack;
 using lyx::cap::tabularStackDirty;
 
@@ -658,7 +660,8 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_FILE_INSERT_ASCII: {
                // FIXME: We don't know the encoding of filenames
                string const tmpstr = getContentsOfAsciiFile(&cur.bv(), lyx::to_utf8(cmd.argument()), false);
-               if (!tmpstr.empty() && !insertAsciiString(cur.bv(), tmpstr, false))
+               // FIXME: We don't know the encoding of the file
+               if (!tmpstr.empty() && !insertAsciiString(cur.bv(), lyx::from_utf8(tmpstr), false))
                        cur.undispatched();
                break;
        }
@@ -696,14 +699,14 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_CLIPBOARD_PASTE:
        case LFUN_PRIMARY_SELECTION_PASTE: {
-               string const clip = (cmd.action == LFUN_CLIPBOARD_PASTE) ?
+               docstring const clip = (cmd.action == LFUN_CLIPBOARD_PASTE) ?
                        cur.bv().owner()->gui().clipboard().get() :
                        cur.bv().owner()->gui().selection().get();
                if (clip.empty())
                        break;
                // pass to InsertAsciiString, but
                // only if we have multi-cell content
-               if (clip.find_first_of("\t\n") != string::npos) {
+               if (clip.find_first_of(lyx::from_ascii("\t\n")) != docstring::npos) {
                        if (insertAsciiString(cur.bv(), clip, false)) {
                                // content has been replaced,
                                // so cursor might be invalid
@@ -1784,7 +1787,7 @@ bool InsetTabular::copySelection(LCursor & cur)
        ostringstream os;
        OutputParams const runparams;
        paste_tabular->plaintext(cur.buffer(), os, runparams, 0, true, '\t');
-       cur.bv().owner()->gui().clipboard().put(os.str());
+       cur.bv().owner()->gui().clipboard().put(lyx::from_utf8(os.str()));
        // mark tabular stack dirty
        // FIXME: this is a workaround for bug 1919. Should be removed for 1.5,
        // when we (hopefully) have a one-for-all paste mechanism.
@@ -1903,7 +1906,7 @@ bool InsetTabular::forceDefaultParagraphs(idx_type cell) const
 }
 
 
-bool InsetTabular::insertAsciiString(BufferView & bv, string const & buf,
+bool InsetTabular::insertAsciiString(BufferView & bv, docstring const & buf,
                                     bool usePaste)
 {
        if (buf.length() <= 0)
@@ -1912,10 +1915,11 @@ bool InsetTabular::insertAsciiString(BufferView & bv, string const & buf,
        col_type cols = 1;
        row_type rows = 1;
        col_type maxCols = 1;
-       string::size_type const len = buf.length();
-       string::size_type p = 0;
+       docstring::size_type const len = buf.length();
+       docstring::size_type p = 0;
 
-       while (p < len && (p = buf.find_first_of("\t\n", p)) != string::npos) {
+       while (p < len &&
+              (p = buf.find_first_of(lyx::from_ascii("\t\n"), p)) != docstring::npos) {
                switch (buf[p]) {
                case '\t':
                        ++cols;
@@ -1947,7 +1951,7 @@ bool InsetTabular::insertAsciiString(BufferView & bv, string const & buf,
                row = tabular.row_of_cell(cell);
        }
 
-       string::size_type op = 0;
+       docstring::size_type op = 0;
        idx_type const cells = loctab->getNumberOfCells();
        p = 0;
        cols = ocol;
@@ -1955,7 +1959,7 @@ bool InsetTabular::insertAsciiString(BufferView & bv, string const & buf,
        col_type const columns = loctab->columns();
 
        while (cell < cells && p < len && row < rows &&
-              (p = buf.find_first_of("\t\n", p)) != string::npos)
+              (p = buf.find_first_of(lyx::from_ascii("\t\n"), p)) != docstring::npos)
        {
                if (p >= len)
                        break;
index afaa49c3104e5a76a93dd14a12dee4dcd2ec48f3..ba7fa10013e39c7554921446253d9c97db2f6765 100644 (file)
@@ -187,7 +187,7 @@ private:
        void getSelection(LCursor & cur, row_type & rs, row_type & re,
                          col_type & cs, col_type & ce) const;
        ///
-       bool insertAsciiString(BufferView &, std::string const & buf, bool usePaste);
+       bool insertAsciiString(BufferView &, lyx::docstring const & buf, bool usePaste);
        /// are we operating on several cells?
        bool tablemode(LCursor & cur) const;
 
index b770460620988af6d7a5c6d15d719de663c22b71..ea646457d6722aa4fb5e3d0837e8f2cfb816218f 100644 (file)
@@ -52,6 +52,7 @@
 #include <boost/bind.hpp>
 #include <boost/current_function.hpp>
 
+using lyx::docstring;
 using lyx::pos_type;
 
 using lyx::graphics::PreviewLoader;
@@ -377,7 +378,7 @@ void InsetText::markNew(bool track_changes)
 }
 
 
-void InsetText::setText(string const & data, LyXFont const & font)
+void InsetText::setText(docstring const & data, LyXFont const & font)
 {
        clear();
        Paragraph & first = paragraphs().front();
index 10274a8b3c46c1f9bd1b597f8ca0d3169beaf5ac..147c76cca6dc36ee61889b91811acd22083514c1 100644 (file)
@@ -77,7 +77,7 @@ public:
        ///
        Code lyxCode() const { return TEXT_CODE; }
        ///
-       void setText(std::string const &, LyXFont const &);
+       void setText(lyx::docstring const &, LyXFont const &);
        ///
        void setAutoBreakRows(bool);
        ///
index 9086b5fd3ec1b1053fca2a800c9d4f13dc31ef75..0775b55d6a89b2e8b830caee56fbb5263a8d72db 100644 (file)
@@ -55,6 +55,7 @@
 #include <cerrno>
 #include <fstream>
 
+using lyx::docstring;
 using lyx::support::addName;
 using lyx::support::bformat;
 using lyx::support::destroyDir;
@@ -357,7 +358,8 @@ void insertAsciiFile(BufferView * bv, string const & f, bool asParagraph)
        if (!bv->available())
                return;
 
-       string const tmpstr = getContentsOfAsciiFile(bv, f, asParagraph);
+       // FIXME: We don't know the encoding of the file
+       docstring const tmpstr = lyx::from_utf8(getContentsOfAsciiFile(bv, f, asParagraph));
        if (tmpstr.empty())
                return;
 
index 559d7ccbc6fa39a17d855aaa8a1a13491597d1f6..1b0b299e4ce58968c43588e3cb9c6ff962136157 100644 (file)
@@ -206,7 +206,7 @@ bool stringSelected(BufferView * bv, string const & searchstr,
        // if nothing selected or selection does not equal search
        // string search and select next occurance and return
        string const & str1 = searchstr;
-       string const str2 = bv->cursor().selectionAsString(false);
+       string const str2 = lyx::to_utf8(bv->cursor().selectionAsString(false));
        if ((cs && str1 != str2) || lowercase(str1) != lowercase(str2)) {
                find(bv, searchstr, cs, mw, fw);
                return false;
index 4ec3824e002703bbe725d7c394f10254e063a315..4356776a5d6747e5dc7ed534b50e6d09070c7e7e 100644 (file)
@@ -260,9 +260,9 @@ public:
        /* these things are for search and replace */
 
        /// needed to insert the selection
-       void insertStringAsLines(LCursor & cur, std::string const & str);
+       void insertStringAsLines(LCursor & cur, lyx::docstring const & str);
        /// needed to insert the selection
-       void insertStringAsParagraphs(LCursor & cur, std::string const & str);
+       void insertStringAsParagraphs(LCursor & cur, lyx::docstring const & str);
 
        /// current text width
        int width() const;
index 484f317d8bab31300b71af98da7211d454e7063f..bf0baadd861ff364d700b2e1348187f93eedf364 100644 (file)
@@ -1086,9 +1086,9 @@ void MathNestInset::lfunMousePress(LCursor & cur, FuncRequest & cmd)
        } else if (cmd.button() == mouse_button::button2) {
                MathArray ar;
                if (cur.selection())
-                       asArray(bv.cursor().selectionAsString(false), ar);
+                       asArray(lyx::to_utf8(bv.cursor().selectionAsString(false)), ar);
                else
-                       asArray(bv.owner()->gui().selection().get(), ar);
+                       asArray(lyx::to_utf8(bv.owner()->gui().selection().get()), ar);
 
                cur.insert(ar);
                bv.mouseSetCursor(cur);
index fe8a86c5a164b6ac86d0d162d1af9d42066b9b58..46072dc6aa26060ff1c4225eb3d9637ee3d62f19 100644 (file)
@@ -338,11 +338,15 @@ int tokenPos(string const & a, char delim, string const & tok)
 }
 
 
-string const subst(string const & a, char oldchar, char newchar)
+namespace {
+
+template<typename Ch> inline
+std::basic_string<Ch> const subst(std::basic_string<Ch> const & a, Ch oldchar, Ch newchar)
 {
-       string tmp(a);
-       string::iterator lit = tmp.begin();
-       string::iterator end = tmp.end();
+       typedef std::basic_string<Ch> String;
+       String tmp(a);
+       typename String::iterator lit = tmp.begin();
+       typename String::iterator end = tmp.end();
        for (; lit != end; ++lit)
                if ((*lit) == oldchar)
                        (*lit) = newchar;
@@ -350,13 +354,14 @@ string const subst(string const & a, char oldchar, char newchar)
 }
 
 
-string const subst(string const & a,
-                  string const & oldstr, string const & newstr)
+template<typename String> inline
+String const subst(String const & a,
+                  String const & oldstr, String const & newstr)
 {
        BOOST_ASSERT(!oldstr.empty());
-       string lstr = a;
-       string::size_type i = 0;
-       string::size_type const olen = oldstr.length();
+       String lstr = a;
+       typename String::size_type i = 0;
+       typename String::size_type const olen = oldstr.length();
        while ((i = lstr.find(oldstr, i)) != string::npos) {
                lstr.replace(i, olen, newstr);
                i += newstr.length(); // We need to be sure that we dont
@@ -365,6 +370,35 @@ string const subst(string const & a,
        return lstr;
 }
 
+}
+
+
+string const subst(string const & a, char oldchar, char newchar)
+{
+       return subst<char>(a, oldchar, newchar);
+}
+
+
+docstring const subst(docstring const & a,
+               char_type oldchar, char_type newchar)
+{
+       return subst<char_type>(a, oldchar, newchar);
+}
+
+
+string const subst(string const & a,
+               string const & oldstr, string const & newstr)
+{
+       return subst<string>(a, oldstr, newstr);
+}
+
+
+docstring const subst(docstring const & a,
+               docstring const & oldstr, docstring const & newstr)
+{
+       return subst<docstring>(a, oldstr, newstr);
+}
+
 
 string const trim(string const & a, char const * p)
 {
@@ -546,23 +580,24 @@ int findToken(char const * const str[], string const & search_token)
 }
 
 
-string const externalLineEnding(string const & str)
+docstring const externalLineEnding(docstring const & str)
 {
 #if defined(__APPLE__)
        // The MAC clipboard uses \r for lineendings, and we use \n
        return subst(str, '\n', '\r');
 #elif defined (_WIN32) || (defined (__CYGWIN__) && defined (X_DISPLAY_MISSING))
        // Windows clipboard uses \r\n for lineendings, and we use \n
-       return subst(str, "\n", "\r\n");
+       return subst(str, lyx::from_ascii("\n"), lyx::from_ascii("\r\n"));
 #else
        return str;
 #endif
 }
 
 
-string const internalLineEnding(string const & str)
+docstring const internalLineEnding(docstring const & str)
 {
-       string s = subst(str, "\r\n", "\n");
+       docstring const s = subst(str,
+                       lyx::from_ascii("\r\n"), lyx::from_ascii("\n"));
        return subst(s, '\r', '\n');
 }
 
index 204570117f24e53bb21a1d5298176632b79c3ecb..a7470744ec8e2ae27d3b689488a96c0e47cb1af1 100644 (file)
@@ -130,10 +130,18 @@ int tokenPos(std::string const & a, char delim, std::string const & tok);
 /// Substitute all \a oldchar with \a newchar
 std::string const subst(std::string const & a, char oldchar, char newchar);
 
+/// Substitute all \a oldchar with \a newchar
+docstring const subst(docstring const & a,
+               char_type oldchar, char_type newchar);
+
 /// substitutes all instances of \a oldstr with \a newstr
 std::string const subst(std::string const & a,
                   std::string const & oldstr, std::string const & newstr);
 
+/// substitutes all instances of \a oldstr with \a newstr
+docstring const subst(docstring const & a,
+               docstring const & oldstr, docstring const & newstr);
+
 /** Trims characters off the end and beginning of a string.
     \code
     trim("ccabccc", "c") == "ab".
@@ -188,10 +196,10 @@ std::string const getStringFromVector(std::vector<std::string> const & vec,
 int findToken(char const * const str[], std::string const & search_token);
 
 /// Convert internal line endings to line endings as expected by the OS
-std::string const externalLineEnding(std::string const & str);
+docstring const externalLineEnding(docstring const & str);
 
 /// Convert line endings in any formnat to internal line endings
-std::string const internalLineEnding(std::string const & str);
+docstring const internalLineEnding(docstring const & str);
 
 
 #ifdef I_AM_NOT_AFRAID_OF_HEADER_LIBRARIES
index 4424f6bcdaed86b4f00fe287d7567f2feef45e9f..fdbc3c0a13e18bc1fb07980784cab9ab0b85a51a 100644 (file)
@@ -18,7 +18,7 @@
 
 /// return true if the char is a line separator
 inline
-bool isLineSeparatorChar(char c)
+bool isLineSeparatorChar(lyx::char_type c)
 {
        return c == ' ';
 }
index ce1529d9b3e74d18a48a767a59182c269562674a..37d1a3056642828a072d2f1498a4ef4f7adf159a 100644 (file)
@@ -583,10 +583,10 @@ string LyXText::getStringToIndex(LCursor const & cur)
 {
        BOOST_ASSERT(this == cur.text());
 
-       string idxstring;
-       if (cur.selection()) {
+       docstring idxstring;
+       if (cur.selection())
                idxstring = cur.selectionAsString(false);
-       else {
+       else {
                // Try implicit word selection. If there is a change
                // in the language the implicit word selection is
                // disabled.
@@ -601,7 +601,7 @@ string LyXText::getStringToIndex(LCursor const & cur)
                        idxstring = tmpcur.selectionAsString(false);
        }
 
-       return idxstring;
+       return lyx::to_utf8(idxstring);
 }
 
 
@@ -647,7 +647,7 @@ void LyXText::insertInset(LCursor & cur, InsetBase * inset)
 
 
 // needed to insert the selection
-void LyXText::insertStringAsLines(LCursor & cur, string const & str)
+void LyXText::insertStringAsLines(LCursor & cur, docstring const & str)
 {
        cur.buffer().insertStringAsLines(pars_, cur.pit(), cur.pos(),
                                         current_font, str, autoBreakRows_);
@@ -656,9 +656,9 @@ void LyXText::insertStringAsLines(LCursor & cur, string const & str)
 
 // turn double CR to single CR, others are converted into one
 // blank. Then insertStringAsLines is called
-void LyXText::insertStringAsParagraphs(LCursor & cur, string const & str)
+void LyXText::insertStringAsParagraphs(LCursor & cur, docstring const & str)
 {
-       string linestr = str;
+       docstring linestr = str;
        bool newline_inserted = false;
 
        for (string::size_type i = 0, siz = linestr.size(); i < siz; ++i) {
index d0aea0fc32fcc04fccb5b20d4ee1aa25ca4d02a9..4b5d0477e0de6b8f757883a22f2d847f4a106c49 100644 (file)
@@ -144,7 +144,7 @@ namespace {
        void mathDispatch(LCursor & cur, FuncRequest const & cmd, bool display)
        {
                recordUndo(cur);
-               string sel = cur.selectionAsString(false);
+               string sel = lyx::to_utf8(cur.selectionAsString(false));
                //lyxerr << "selection is: '" << sel << "'" << endl;
 
                // It may happen that sel is empty but there is a selection
@@ -904,7 +904,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_CLIPBOARD_PASTE: {
                cur.clearSelection();
-               string const clip = bv->owner()->gui().clipboard().get();
+               docstring const clip = bv->owner()->gui().clipboard().get();
                if (!clip.empty()) {
                        recordUndo(cur);
                        if (cmd.argument() == "paragraph")
@@ -917,7 +917,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_PRIMARY_SELECTION_PASTE: {
                cur.clearSelection();
-               string const clip = bv->owner()->gui().selection().get();
+               docstring const clip = bv->owner()->gui().selection().get();
                if (!clip.empty()) {
                        recordUndo(cur);
                        if (cmd.argument() == "paragraph")
@@ -1449,7 +1449,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_THESAURUS_ENTRY: {
-               string arg = lyx::to_utf8(cmd.argument());
+               docstring arg = cmd.argument();
                if (arg.empty()) {
                        arg = cur.selectionAsString(false);
                        // FIXME
@@ -1459,7 +1459,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                                arg = cur.selectionAsString(false);
                        }
                }
-               bv->owner()->getDialogs().show("thesaurus", arg);
+               bv->owner()->getDialogs().show("thesaurus", lyx::to_utf8(arg));
                break;
        }