Abdelrazak Younes wrote:
And yet another one updated from latest SVN that contained some qt4 changes.

And the patch...


Index: src/BufferView.C
===================================================================
--- src/BufferView.C    (revision 14001)
+++ src/BufferView.C    (working copy)
@@ -42,6 +42,7 @@
 #include "frontends/Dialogs.h"
 #include "frontends/LyXView.h"
 #include "frontends/screen.h"
+#include "frontends/Clipboard.h"
 #include "frontends/WorkArea.h"
 
 #include "insets/insetcommand.h" // ChangeRefs
@@ -212,7 +213,7 @@
 
 string const BufferView::getClipboard() const
 {
-       return pimpl_->workarea().getClipboard();
+       return pimpl_->clipboard().getClipboard();
 }
 
 
@@ -338,7 +339,7 @@
 
 void BufferView::haveSelection(bool sel)
 {
-       pimpl_->workarea().haveSelection(sel);
+       pimpl_->clipboard().haveSelection(sel);
 }
 
 
Index: src/BufferView_pimpl.C
===================================================================
--- src/BufferView_pimpl.C      (revision 14001)
+++ src/BufferView_pimpl.C      (working copy)
@@ -64,6 +64,7 @@
 #include "frontends/LyXView.h"
 #include "frontends/LyXScreenFactory.h"
 #include "frontends/screen.h"
+#include "frontends/Clipboard.h"
 #include "frontends/WorkArea.h"
 #include "frontends/WorkAreaFactory.h"
 
@@ -143,6 +144,7 @@
        xsel_cache_.set = false;
 
        workarea_.reset(WorkAreaFactory::create(*owner_, width, height));
+       clipboard_.reset(WorkAreaFactory::getClipboard());
        screen_.reset(LyXScreenFactory::create(workarea()));
 
        // Setup the signals
@@ -320,6 +322,12 @@
 }
 
 
+Clipboard & BufferView::Pimpl::clipboard() const
+{
+       return *clipboard_.get();
+}
+
+
 LyXScreen & BufferView::Pimpl::screen() const
 {
        return *screen_.get();
@@ -618,7 +626,7 @@
                xsel_cache_.set = cur.selection();
                sel = cur.selectionAsString(false);
                if (!sel.empty())
-                       workarea().putClipboard(sel);
+                       clipboard().putClipboard(sel);
        }
 }
 
@@ -873,7 +881,7 @@
 
 void BufferView::Pimpl::stuffClipboard(string const & content) const
 {
-       workarea().putClipboard(content);
+       clipboard().putClipboard(content);
 }
 
 
Index: src/BufferView_pimpl.h
===================================================================
--- src/BufferView_pimpl.h      (revision 14001)
+++ src/BufferView_pimpl.h      (working copy)
@@ -39,6 +39,7 @@
 class LyXKeySym;
 class LyXView;
 class WorkArea;
+class Clipboard;
 class LyXScreen;
 class FuncRequest;
 class FuncStatus;
@@ -152,6 +153,8 @@
        boost::scoped_ptr<LyXScreen> screen_;
        ///
        boost::scoped_ptr<WorkArea> workarea_;
+       ///
+       boost::scoped_ptr<Clipboard> clipboard_;
        /// Estimated average par height for scrollbar
        int wh_;
        ///
@@ -181,6 +184,8 @@
        void menuInsertLyXFile(std::string const & filen);
        /// our workarea
        WorkArea & workarea() const;
+       /// our clipboard
+       Clipboard & clipboard() const;
        /// this is used to handle XSelection events in the right manner
        struct {
                CursorSlice cursor;
Index: src/frontends/Clipboard.h
===================================================================
--- src/frontends/Clipboard.h   (revision 0)
+++ src/frontends/Clipboard.h   (revision 0)
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+/**
+ * \file Clipboard.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef CLIPBOARD_H
+#define CLIPBOARD_H
+
+#include <string>
+
+/**
+ * The Clipboard class manages the clipboard.
+ */
+class Clipboard
+{
+public:
+       virtual ~Clipboard() {}
+
+       /// a selection exists
+       virtual void haveSelection(bool) = 0;
+       /// get the X clipboard contents
+       virtual std::string const getClipboard() const = 0;
+       /// fill the clipboard
+       virtual void putClipboard(std::string const &) = 0;
+};
+
+#endif // CLIPBOARD_H

Property changes on: src\frontends\Clipboard.h
___________________________________________________________________
Name: svn:eol-style
   + native

Index: src/frontends/gtk/GWorkArea.C
===================================================================
--- src/frontends/gtk/GWorkArea.C       (revision 14001)
+++ src/frontends/gtk/GWorkArea.C       (working copy)
@@ -504,7 +504,7 @@
 }
 
 
-void GWorkArea::haveSelection(bool toHave) const
+void GWorkArea::haveSelection(bool toHave)
 {
        if (toHave) {
                Glib::RefPtr<Gtk::Clipboard> clipboard =
@@ -533,7 +533,7 @@
 
 // ENCODING: we assume that the backend passes us ISO-8859-1 and
 // convert from that to UTF-8 before passing to GTK
-void GWorkArea::putClipboard(string const & str) const
+void GWorkArea::putClipboard(string const & str)
 {
        Glib::RefPtr<Gtk::Clipboard> clipboard =
                Gtk::Clipboard::get(GDK_SELECTION_PRIMARY);
Index: src/frontends/gtk/GWorkArea.h
===================================================================
--- src/frontends/gtk/GWorkArea.h       (revision 14001)
+++ src/frontends/gtk/GWorkArea.h       (working copy)
@@ -15,6 +15,7 @@
 #include "GPainter.h"
 
 #include "frontends/WorkArea.h"
+#include "frontends/Clipboard.h"
 
 #include <gtkmm.h>
 #include <gtk/gtk.h>
@@ -55,7 +56,7 @@
 };
 
 
-class GWorkArea : public WorkArea, public sigc::trackable {
+class GWorkArea : public WorkArea, public Clipboard, public sigc::trackable {
 public:
        GWorkArea(LyXView & owner, int width, int height);
        ~GWorkArea();
@@ -80,11 +81,11 @@
 
        virtual void setScrollbarParams(int height, int pos, int line_height);
        /// a selection exists
-       virtual void haveSelection(bool) const;
+       virtual void haveSelection(bool);
        ///
        virtual std::string const getClipboard() const;
        ///
-       virtual void putClipboard(std::string const &) const;
+       virtual void putClipboard(std::string const &);
        void inputCommit(gchar * str);
 private:
        bool onExpose(GdkEventExpose * event);
Index: src/frontends/gtk/WorkAreaFactory.C
===================================================================
--- src/frontends/gtk/WorkAreaFactory.C (revision 14001)
+++ src/frontends/gtk/WorkAreaFactory.C (working copy)
@@ -27,11 +27,20 @@
 
 namespace WorkAreaFactory {
 
+static GWorkArea * work_area_ = 0;
 
 WorkArea * create(LyXView & owner, int w, int h)
 {
-       return new lyx::frontend::GWorkArea(owner, w, h);
+       work_area_ = new lyx::frontend::GWorkArea(owner, w, h);
+       return work_area_;
 }
 
+/**
+The call to this method must be done after the WorkArea creation.
+*/
+Clipboard * getClipboard()
+{
+       return work_area_;
+}
 
 }
Index: src/frontends/Makefile.am
===================================================================
--- src/frontends/Makefile.am   (revision 14001)
+++ src/frontends/Makefile.am   (working copy)
@@ -31,6 +31,7 @@
        Timeout.h \
        Toolbars.C \
        Toolbars.h \
+       Clipboard.h \
        WorkArea.h \
        WorkAreaFactory.h \
        font_metrics.h \
Index: src/frontends/qt3/QWorkArea.C
===================================================================
--- src/frontends/qt3/QWorkArea.C       (revision 14001)
+++ src/frontends/qt3/QWorkArea.C       (working copy)
@@ -184,7 +184,7 @@
 }
 #endif  // Q_WS_MACX
 
-void QWorkArea::haveSelection(bool own) const
+void QWorkArea::haveSelection(bool own)
 {
        wa_ptr = const_cast<QWorkArea*>(this);
 
@@ -215,7 +215,7 @@
 }
 
 
-void QWorkArea::putClipboard(string const & str) const
+void QWorkArea::putClipboard(string const & str)
 {
        QApplication::clipboard()->setSelectionMode(true);
 #ifdef Q_OS_MAC
Index: src/frontends/qt3/QWorkArea.h
===================================================================
--- src/frontends/qt3/QWorkArea.h       (revision 14001)
+++ src/frontends/qt3/QWorkArea.h       (working copy)
@@ -13,7 +13,8 @@
 #ifndef QWORKAREA_H
 #define QWORKAREA_H
 
-#include "WorkArea.h"
+#include "frontends/WorkArea.h"
+#include "frontends/Clipboard.h"
 #include "QLPainter.h"
 #include "QContentPane.h"
 
@@ -31,7 +32,7 @@
  * It consists of a content pane widget, and a scrollbar.
  * Hopefully soon we can just use QScrollView ...
  */
-class QWorkArea : public WorkArea, public QWidget {
+class QWorkArea : public WorkArea, public Clipboard, public QWidget {
 public:
        friend class QContentPane;
 
@@ -48,11 +49,11 @@
        virtual void setScrollbarParams(int height, int pos, int line_height);
 
        /// a selection exists
-       virtual void haveSelection(bool) const;
+       virtual void haveSelection(bool);
        ///
        virtual std::string const getClipboard() const;
        ///
-       virtual void putClipboard(std::string const &) const;
+       virtual void putClipboard(std::string const &);
        ///
        virtual void dragEnterEvent(QDragEnterEvent * event);
        ///
Index: src/frontends/qt3/WorkAreaFactory.C
===================================================================
--- src/frontends/qt3/WorkAreaFactory.C (revision 14001)
+++ src/frontends/qt3/WorkAreaFactory.C (working copy)
@@ -15,9 +15,21 @@
 
 namespace WorkAreaFactory {
 
+       
+static QWorkArea * work_area_ = 0;
+
 WorkArea * create(LyXView & owner, int w, int h)
 {
-       return new QWorkArea(owner, w, h);
+       work_area_ = new lyx::frontend::QWorkArea(owner, w, h);
+       return work_area_;
 }
 
+/**
+The call to this method must be done after the WorkArea creation.
+*/
+Clipboard * getClipboard()
+{
+       return work_area_;
+}
+
 } // namespace WorkAreaFactory
Index: src/frontends/qt4/Application.C
===================================================================
--- src/frontends/qt4/Application.C     (revision 0)
+++ src/frontends/qt4/Application.C     (revision 0)
@@ -0,0 +1,193 @@
+/**
+ * \file qt4/Application.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include "Application.h"
+#include "qt_helpers.h"
+#include "BufferView.h"
+#include "debug.h"
+#include "support/lstrings.h"
+
+#include <QApplication>
+#include <QEventLoop>
+#include <QTranslator>
+#include <QTextCodec>
+#include <QClipboard>
+
+using lyx::support::subst;
+
+using std::map;
+using std::vector;
+using std::string;
+using std::endl;
+
+///////////////////////////////////////////////////////////////
+// You can find other X11 and MACX specific stuff
+// at the end of this file...
+///////////////////////////////////////////////////////////////
+
+namespace lyx {
+namespace frontend {
+
+Application::Application(int & argc, char ** argv)
+       : QApplication(argc, argv), clipboard_(this)
+{
+#ifdef Q_WS_X11
+       // doubleClickInterval() is 400 ms on X11 witch is just too long.
+       // On Windows and Mac OS X, the operating system's value is used.
+       // On Microsoft Windows, calling this function sets the double
+       // click interval for all applications. So we don't!
+       QApplication::setDoubleClickInterval(300);
+#endif
+
+#ifdef Q_WS_MACX
+       AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
+                             NewAEEventHandlerUPP(handleOpenDocuments),
+                             0, false);
+#endif
+}
+
+
+Application::~Application()
+{
+       size_t end = work_areas_.size();
+       for (size_t i = 0; i < end; ++i)
+               delete work_areas_[i];
+}
+
+
+QWorkArea * Application::newWorkArea(LyXView & owner, int w, int h)
+{
+       current_work_area_ = new QWorkArea(owner, w, h);
+       work_areas_.push_back(current_work_area_);
+       lyxerr[Debug::GUI] 
+       << "current_work_area_  " << current_work_area_
+       << "    work_areas_.size() " << work_areas_.size()
+               << endl;
+
+       return current_work_area_;
+}
+
+
+void Application::setCurrent(QWorkArea * const work_area_)
+{
+       // FIXME put some verification here.
+       current_work_area_ = work_area_;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+// X11 specific stuff goes here...
+#ifdef Q_WS_X11
+bool Application::x11EventFilter(XEvent * xev)
+{
+       switch (xev->type) {
+       case SelectionRequest:
+               lyxerr[Debug::GUI] << "X requested selection." << endl;
+               if (current_work_area_)
+                       current_work_area_->view().view()->selectionRequested();
+               break;
+       case SelectionClear:
+               lyxerr[Debug::GUI] << "Lost selection." << endl;
+               if (current_work_area_)
+                       current_work_area_->view().view()->selectionLost();
+               break;
+       }
+       return false;
+}
+#endif
+
+
+////////////////////////////////////////////////////////////////////////
+// Mac OSX specific stuff goes here...
+
+#ifdef Q_WS_MACX
+namespace{
+OSErr checkAppleEventForMissingParams(const AppleEvent& theAppleEvent)
+ {
+       DescType returnedType;
+       Size actualSize;
+       OSErr err = AEGetAttributePtr(&theAppleEvent, keyMissedKeywordAttr,
+                                     typeWildCard, &returnedType, nil, 0,
+                                     &actualSize);
+       switch (err) {
+       case errAEDescNotFound:
+               return noErr;
+       case noErr:
+               return errAEEventNotHandled;
+       default:
+               return err;
+       }
+ }
+} // namespace
+
+OSErr Application::handleOpenDocuments(const AppleEvent* inEvent,
+                                                                               
          AppleEvent* /*reply*/, long /*refCon*/)
+{
+       QString s_arg;
+       AEDescList documentList;
+       OSErr err = AEGetParamDesc(inEvent, keyDirectObject, typeAEList,
+                                  &documentList);
+       if (err != noErr)
+               return err;
+
+       err = checkAppleEventForMissingParams(*inEvent);
+       if (err == noErr) {
+               long documentCount;
+               err = AECountItems(&documentList, &documentCount);
+               for (long documentIndex = 1;
+                    err == noErr && documentIndex <= documentCount;
+                    documentIndex++) {
+                       DescType returnedType;
+                       Size actualSize;
+                       AEKeyword keyword;
+                       FSRef ref;
+                       char qstr_buf[1024];
+                       err = AESizeOfNthItem(&documentList, documentIndex,
+                                             &returnedType, &actualSize);
+                       if (err == noErr) {
+                               err = AEGetNthPtr(&documentList, documentIndex,
+                                                 typeFSRef, &keyword,
+                                                 &returnedType, (Ptr)&ref,
+                                                 sizeof(FSRef), &actualSize);
+                               if (err == noErr) {
+                                       FSRefMakePath(&ref, (UInt8*)qstr_buf,
+                                                     1024);
+                                       s_arg=QString::fromUtf8(qstr_buf);
+                                       
current_work_area_->view().view()->workAreaDispatch(
+                                               FuncRequest(LFUN_FILE_OPEN,
+                                                           fromqstr(s_arg)));
+                                       break;
+                               }
+                       }
+               } // for ...
+       }
+       AEDisposeDesc(&documentList);
+
+       return err;
+}
+
+bool Application::macEventFilter(EventRef event)
+{
+       if (GetEventClass(event) == kEventClassAppleEvent) {
+               EventRecord eventrec;
+               ConvertEventRefToEventRecord(event, &eventrec);
+               AEProcessAppleEvent(&eventrec);
+
+               return false;
+       }
+       return false;
+}
+
+#endif  // Q_WS_MACX
+
+} // namespace frontend
+} // namespace lyx

Property changes on: src\frontends\qt4\Application.C
___________________________________________________________________
Name: svn:eol-style
   + native

Index: src/frontends/qt4/Application.h
===================================================================
--- src/frontends/qt4/Application.h     (revision 0)
+++ src/frontends/qt4/Application.h     (revision 0)
@@ -0,0 +1,90 @@
+/**
+ * \file qt4/Application.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef LYX_APPLICATION_H
+#define LYX_APPLICATION_H
+
+#include "QWorkArea.h"
+#include "LyxClipboard.h"
+
+#include <QApplication>
+
+///////////////////////////////////////////////////////////////
+// Specific stuff
+#ifdef Q_WS_X11
+#include <X11/Xlib.h>
+#endif
+
+#ifdef Q_WS_MACX
+#include <Carbon/Carbon.h>
+#endif
+///////////////////////////////////////////////////////////////
+
+namespace lyx {
+namespace frontend {
+
+/// The Qt main application class
+/**
+There should be only one instance of this class. No Qt object
+initialisation should be done before the instanciation of this class.
+
+\todo The work areas handling could be moved to a base virtual class
+comon to all frontends.
+*/
+class Application : public QApplication
+{
+public:
+       Application(int & argc, char ** argv);
+       ~Application();
+
+       /// Create a new WorkArea.
+       QWorkArea * newWorkArea(LyXView & owner, int w, int h);
+
+       /// Delete a new WorkArea.
+       //void deleteWorkArea(QWorkArea *);
+       
+       /// Set the work area that has the current focus.
+       void setCurrent(QWorkArea * const);
+       
+       Clipboard * lyxClipboard() { return &clipboard_; }
+       
+private:
+       /// WorkArea container.
+       /**
+       \todo A map or a list would probably be better...
+       */
+       std::vector<QWorkArea *> work_areas_;
+
+       /// The work area that has the focus.
+       QWorkArea * current_work_area_;
+
+       LyxClipboard clipboard_;
+
+#ifdef Q_WS_X11
+public:
+       bool x11EventFilter (XEvent * ev);
+#endif
+
+#ifdef Q_WS_MACX
+public:
+       bool macEventFilter(EventRef event);
+private:
+//     static OSStatus handleOpenDocuments(
+       static pascal OSErr     handleOpenDocuments(
+               const AppleEvent* inEvent, AppleEvent*, long);
+#endif
+}; // Application
+
+} // namespace frontend
+} // namespace lyx
+
+#endif // LYX_APPLICATION_H

Property changes on: src\frontends\qt4\Application.h
___________________________________________________________________
Name: svn:eol-style
   + native

Index: src/frontends/qt4/lyx_gui.C
===================================================================
--- src/frontends/qt4/lyx_gui.C (revision 14001)
+++ src/frontends/qt4/lyx_gui.C (working copy)
@@ -46,11 +46,8 @@
 #include "QLImage.h"
 #include "qt_helpers.h"
 #include "socket_callback.h"
+#include "Application.h"
 
-#ifdef Q_WS_MACX
-#include <Carbon/Carbon.h>
-#endif
-
 #include <QApplication>
 #include <QEventLoop>
 #include <QTranslator>
@@ -60,6 +57,7 @@
 using lyx::support::package;
 
 using lyx::frontend::QtView;
+using lyx::frontend::Application;
 
 namespace os = lyx::support::os;
 
@@ -73,9 +71,6 @@
 using std::vector;
 using std::string;
 
-
-extern BufferList bufferlist;
-
 namespace {
 
 int getDPI()
@@ -95,59 +90,9 @@
 // in QLyXKeySym.C
 extern void initEncodings();
 
-#ifdef Q_WS_X11
-extern bool lyxX11EventFilter(XEvent * xev);
-#endif
-
-#ifdef Q_WS_MACX
-extern bool macEventFilter(EventRef event);
-extern pascal OSErr
-handleOpenDocuments(const AppleEvent* inEvent, AppleEvent* /*reply*/,
-                   long /*refCon*/);
-#endif
-
-class LQApplication : public QApplication
-{
-public:
-       LQApplication(int & argc, char ** argv);
-#ifdef Q_WS_X11
-       bool x11EventFilter (XEvent * ev) { return lyxX11EventFilter(ev); }
-#endif
-#ifdef Q_WS_MACX
-       bool macEventFilter(EventRef event);
-#endif
-};
-
-
-LQApplication::LQApplication(int & argc, char ** argv)
-       : QApplication(argc, argv)
-{
-#ifdef Q_WS_MACX
-       AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
-                             NewAEEventHandlerUPP(handleOpenDocuments),
-                             0, false);
-#endif
-}
-
-
-#ifdef Q_WS_MACX
-bool LQApplication::macEventFilter(EventRef event)
-{
-       if (GetEventClass(event) == kEventClassAppleEvent) {
-               EventRecord eventrec;
-               ConvertEventRefToEventRecord(event, &eventrec);
-               AEProcessAppleEvent(&eventrec);
-
-               return false;
-       }
-       return false;
-}
-#endif
-
-
 namespace {
 
-LQApplication * app = 0;
+Application * app = 0;
 
 }
 
@@ -181,9 +126,9 @@
        FontLoader::initFontPath();
 
 #ifdef Q_WS_WIN
-       static QApplication win_app(argc, argv);
+       static Application win_app(argc, argv);
 #else
-       app = new LQApplication(argc, argv);
+       app = new Application(argc, argv);
 #endif
 
        // install translation file for Qt built-in dialogs
Index: src/frontends/qt4/LyxClipboard.C
===================================================================
--- src/frontends/qt4/LyxClipboard.C    (revision 0)
+++ src/frontends/qt4/LyxClipboard.C    (revision 0)
@@ -0,0 +1,112 @@
+// -*- C++ -*-
+/**
+ * \file LyxClipboard.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include "LyxClipboard.h"
+#include "Application.h"
+#include "qt_helpers.h"
+
+#include "debug.h"
+
+#include <QClipboard>
+#include <QString>
+
+#include <string>
+
+#include "support/lstrings.h"
+using lyx::support::subst;
+
+using std::endl;
+using std::string;
+
+namespace {
+
+string toClipboardStr(string const & str)
+{
+#ifdef Q_WS_MACX
+       // The MAC clipboard uses \r for lineendings, and we use \n
+       return subst(str, '\n', '\r');
+#endif
+
+       return str;
+/*
+#ifdef Q_WS_WIN
+       // Windows clipboard uses \r\n for lineendings, and we use \n
+       return subst(str, '\n', '\r\n');
+#endif
+*/
+}
+
+
+string fromClipboardStr(string const & str)
+{
+#ifdef Q_WS_MACX
+       // The MAC clipboard uses \r for lineendings, and we use \n
+       return subst(str, '\r', '\n');
+#endif
+
+       return str;
+/*
+#ifdef Q_WS_WIN
+       // Windows clipboard uses \r\n for lineendings, and we use \n
+       return subst(str, '\r\n', '\n');
+#endif
+*/
+}
+
+} // namespace anon
+
+
+namespace lyx {
+namespace frontend {
+
+#ifdef Q_WS_X11
+QClipboard::Mode const CLIPBOARD_MODE = QClipboard::Selection;
+#else
+// FIXME external clipboard support is mostly broken for windows
+// because the following fixe would involves too much side effects WRT mouse 
selection.
+//QClipboard::Mode const CLIPBOARD_MODE = QClipboard::Clipboard;
+QClipboard::Mode const CLIPBOARD_MODE = QClipboard::Selection;
+#endif
+
+void LyxClipboard::haveSelection(bool own)
+{
+       if (!owner_->clipboard()->supportsSelection())
+               return;
+
+       if (own) {
+               owner_->clipboard()->setText(QString(), CLIPBOARD_MODE);
+       }
+       // We don't need to do anything if own = false, as this case is
+       // handled by QT.
+}
+
+
+string const LyxClipboard::getClipboard() const
+{
+       QString str = owner_->clipboard()->text(CLIPBOARD_MODE);
+       lyxerr[Debug::ACTION] << "getClipboard: " << (const char*) str << endl;
+       if (str.isNull())
+               return string();
+
+       return fromClipboardStr(fromqstr(str));
+}
+
+
+void LyxClipboard::putClipboard(string const & str)
+{
+       lyxerr[Debug::ACTION] << "putClipboard: " << str << endl;
+
+       owner_->clipboard()->setText(toqstr(toClipboardStr(str)), 
CLIPBOARD_MODE);
+}
+
+} // namespace frontend
+} // namespace lyx

Property changes on: src\frontends\qt4\LyxClipboard.C
___________________________________________________________________
Name: svn:eol-style
   + native

Index: src/frontends/qt4/LyxClipboard.h
===================================================================
--- src/frontends/qt4/LyxClipboard.h    (revision 0)
+++ src/frontends/qt4/LyxClipboard.h    (revision 0)
@@ -0,0 +1,49 @@
+// -*- C++ -*-
+/**
+ * \file LyxClipboard.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef LYX_CLIPBOARD_H
+#define LYX_CLIPBOARD_H
+
+#include "frontends/Clipboard.h"
+
+namespace lyx {
+namespace frontend {
+
+class Application;
+
+/**
+ * The Qt4 version of the Clipboard.
+ */
+class LyxClipboard: public Clipboard
+{
+public:
+       LyxClipboard(Application * owner): owner_(owner) {}
+
+       virtual ~LyxClipboard() {}
+
+       /** ClipBoard overloaded methods
+        */
+       //@{
+       void haveSelection(bool own);
+       std::string const getClipboard() const;
+       void putClipboard(std::string const & str);
+       //@}
+
+private:
+       Application * owner_;
+};
+
+} // namespace frontend
+} // namespace lyx
+
+#endif // LYX_CLIPBOARD_H

Property changes on: src\frontends\qt4\LyxClipboard.h
___________________________________________________________________
Name: svn:eol-style
   + native

Index: src/frontends/qt4/LyXScreenFactory.C
===================================================================
--- src/frontends/qt4/LyXScreenFactory.C        (revision 14001)
+++ src/frontends/qt4/LyXScreenFactory.C        (working copy)
@@ -18,7 +18,7 @@
 
 LyXScreen * create(WorkArea & owner)
 {
-       return &(static_cast<QWorkArea &>(owner));
+       return &(static_cast<lyx::frontend::QWorkArea &>(owner));
 }
 
 } // namespace LyXScreenFactory
Index: src/frontends/qt4/Makefile.am
===================================================================
--- src/frontends/qt4/Makefile.am       (revision 14001)
+++ src/frontends/qt4/Makefile.am       (working copy)
@@ -85,6 +85,8 @@
        QtLyXView.h \
        WorkAreaFactory.C \
        checkedwidgets.C checkedwidgets.h \
+       LyxClipboard.C LyxClipboard.h \
+       Application.C Application.h \
        lyx_gui.C \
        lcolorcache.h lcolorcache.C \
        panelstack.h panelstack.C \
Index: src/frontends/qt4/QLPainter.C
===================================================================
--- src/frontends/qt4/QLPainter.C       (revision 14001)
+++ src/frontends/qt4/QLPainter.C       (working copy)
@@ -33,6 +33,8 @@
 using std::endl;
 using std::string;
 
+namespace lyx {
+namespace frontend {
 
 QLPainter::~QLPainter()
 {
@@ -261,3 +263,6 @@
        QPainter qp(qwa_->paintDevice());
        qp.drawImage(x, y, image);
 }
+
+} // namespace frontend
+} // namespace lyx
Index: src/frontends/qt4/QLPainter.h
===================================================================
--- src/frontends/qt4/QLPainter.h       (revision 14001)
+++ src/frontends/qt4/QLPainter.h       (working copy)
@@ -23,6 +23,10 @@
 class QString;
 class QPixmap;
 class QImage;
+
+namespace lyx {
+namespace frontend {
+
 class QWorkArea;
 
 /**
@@ -149,4 +153,7 @@
        QWorkArea * qwa_;
 };
 
+} // namespace frontend
+} // namespace lyx
+
 #endif // QLPAINTER_H
Index: src/frontends/qt4/QWorkArea.C
===================================================================
--- src/frontends/qt4/QWorkArea.C       (revision 14001)
+++ src/frontends/qt4/QWorkArea.C       (working copy)
@@ -20,14 +20,13 @@
 
 #include "lcolorcache.h"
 #include "qt_helpers.h"
+#include "Application.h"
 #include "BufferView.h"
 #include "debug.h"
 #include "funcrequest.h"
 #include "LColor.h"
 #include "support/os.h"
 
-#include <QApplication>
-#include <QClipboard>
 #include <QLayout>
 #include <QMainWindow>
 #include <QMimeData>
@@ -39,22 +38,6 @@
 
 #include <boost/bind.hpp>
 
-///////////////////////////////////////////////////////////////
-// Specific stuff
-#ifdef Q_WS_X11
-#include <X11/Xlib.h>
-#endif
-
-#ifdef Q_WS_MACX
-#include <Carbon/Carbon.h>
-#include <support/lstrings.h>
-using lyx::support::subst;
-#endif
-
-// You can find other qt-immodule, X11 and MACX specific stuff
-// at the end of this file...
-///////////////////////////////////////////////////////////////
-
 using std::endl;
 using std::string;
 
@@ -62,8 +45,6 @@
 
 namespace {
 
-QWorkArea * wa_ptr = 0;
-
 /// return the LyX key state from Qt's
 key_modifier::state q_key_state(Qt::ButtonState state)
 {
@@ -114,6 +95,9 @@
 
 } // namespace anon
 
+namespace lyx {
+namespace frontend {
+
 // This is a 'heartbeat' generating synthetic mouse move events when the
 // cursor is at the top or bottom edge of the viewport. One scroll per 0.2 s
 SyntheticMouseEvent::SyntheticMouseEvent()
@@ -187,17 +171,6 @@
        setInputMethodEnabled(true);
 #endif
 
-#ifdef Q_WS_X11
-       // doubleClickInterval() is 400 ms on X11 witch is just too long.
-       // On Windows and Mac OS X, the operating system's value is used.
-       // On Microsoft Windows, calling this function sets the double
-       // click interval for all applications. So we don't!
-       QApplication::setDoubleClickInterval(300);
-#endif
-
-#ifdef Q_WS_MACX
-       wa_ptr = this;
-#endif
 }
 
 QWorkArea::~QWorkArea()
@@ -231,50 +204,6 @@
 }
 
 
-void QWorkArea::haveSelection(bool own) const
-{
-       /// \todo ask X11 and MAC devels why this wa_ptr is useful.
-       wa_ptr = const_cast<QWorkArea*>(this);
-
-       if (!QApplication::clipboard()->supportsSelection())
-               return;
-
-       if (own) {
-               QApplication::clipboard()->setText(QString(), 
QClipboard::Selection);
-       }
-       // We don't need to do anything if own = false, as this case is
-       // handled by QT.
-}
-
-
-string const QWorkArea::getClipboard() const
-{
-       QString str = QApplication::clipboard()->text(QClipboard::Selection);
-       lyxerr[Debug::ACTION] << "getClipboard: " << (const char*) str << endl;
-       if (str.isNull())
-               return string();
-#ifdef Q_WS_MACX
-       // The MAC clipboard uses \r for lineendings, and we use \n
-       return subst(fromqstr(str), '\r', '\n');
-#else
-       return fromqstr(str);
-#endif
-}
-
-
-void QWorkArea::putClipboard(string const & str) const
-{
-#ifdef Q_WS_MACX
-       // The MAC clipboard uses \r for lineendings, and we use \n
-       QApplication::clipboard()->setText(toqstr(subst(str, '\n', '\r')),
-                                          QClipboard::Selection);
-#else
-       QApplication::clipboard()->setText(toqstr(str), QClipboard::Selection);
-#endif
-       lyxerr[Debug::ACTION] << "putClipboard: " << str << endl;
-}
-
-
 void QWorkArea::dragEnterEvent(QDragEnterEvent * event)
 {
        if (event->mimeData()->hasUrls())
@@ -282,7 +211,6 @@
        /// \todo Ask lyx-devel is this is enough:
        /// if (event->mimeData()->hasFormat("text/plain"))
        ///     event->acceptProposedAction();
-
 }
 
 
@@ -394,7 +322,7 @@
 {
        // Wheel rotation by one notch results in a delta() of 120 (see
        // documentation of QWheelEvent)
-       int const lines = QApplication::wheelScrollLines() * e->delta() / 120;
+       int const lines = qApp->wheelScrollLines() * e->delta() / 120;
        verticalScrollBar()->setValue(verticalScrollBar()->value() -
                        lines *  verticalScrollBar()->lineStep());
        adjustViewWithScrollBar();
@@ -419,6 +347,7 @@
        }
 }
 
+
 void QWorkArea::keyPressEvent(QKeyEvent * e)
 {
        lyxerr[Debug::KEY] << BOOST_CURRENT_FUNCTION
@@ -513,6 +442,7 @@
                */
 }
 
+
 void QWorkArea::update(int x, int y, int w, int h)
 {
        //screen_device_.fromImage(paint_device_);
@@ -522,6 +452,7 @@
        viewport()->update(x, y, w, h);
 }
 
+
 void QWorkArea::paintEvent(QPaintEvent * e)
 {
        /*
@@ -554,6 +485,7 @@
        return paint_device_.copy(x, y, w, h);
 }
 
+
 void QWorkArea::drawScreen(int x, int y, QPixmap pixmap)
 {
        QPainter q(&paint_device_);
@@ -674,97 +606,7 @@
 }
 #endif
 
+} // namespace frontend
+} // namespace lyx
 
-////////////////////////////////////////////////////////////////////////
-// X11 specific stuff goes here...
-
-#ifdef Q_WS_X11
-bool lyxX11EventFilter(XEvent * xev)
-{
-       switch (xev->type) {
-       case SelectionRequest:
-               lyxerr[Debug::GUI] << "X requested selection." << endl;
-               if (wa_ptr)
-                       wa_ptr->view().view()->selectionRequested();
-               break;
-       case SelectionClear:
-               lyxerr[Debug::GUI] << "Lost selection." << endl;
-               if (wa_ptr)
-                       wa_ptr->view().view()->selectionLost();
-               break;
-       }
-       return false;
-}
-#endif
-
-
-////////////////////////////////////////////////////////////////////////
-// Mac OSX specific stuff goes here...
-
-#ifdef Q_WS_MACX
-namespace{
-OSErr checkAppleEventForMissingParams(const AppleEvent& theAppleEvent)
- {
-       DescType returnedType;
-       Size actualSize;
-       OSErr err = AEGetAttributePtr(&theAppleEvent, keyMissedKeywordAttr,
-                                     typeWildCard, &returnedType, nil, 0,
-                                     &actualSize);
-       switch (err) {
-       case errAEDescNotFound:
-               return noErr;
-       case noErr:
-               return errAEEventNotHandled;
-       default:
-               return err;
-       }
- }
-}
-
-pascal OSErr handleOpenDocuments(const AppleEvent* inEvent,
-                                AppleEvent* /*reply*/, long /*refCon*/)
-{
-       QString s_arg;
-       AEDescList documentList;
-       OSErr err = AEGetParamDesc(inEvent, keyDirectObject, typeAEList,
-                                  &documentList);
-       if (err != noErr)
-               return err;
-
-       err = checkAppleEventForMissingParams(*inEvent);
-       if (err == noErr) {
-               long documentCount;
-               err = AECountItems(&documentList, &documentCount);
-               for (long documentIndex = 1;
-                    err == noErr && documentIndex <= documentCount;
-                    documentIndex++) {
-                       DescType returnedType;
-                       Size actualSize;
-                       AEKeyword keyword;
-                       FSRef ref;
-                       char qstr_buf[1024];
-                       err = AESizeOfNthItem(&documentList, documentIndex,
-                                             &returnedType, &actualSize);
-                       if (err == noErr) {
-                               err = AEGetNthPtr(&documentList, documentIndex,
-                                                 typeFSRef, &keyword,
-                                                 &returnedType, (Ptr)&ref,
-                                                 sizeof(FSRef), &actualSize);
-                               if (err == noErr) {
-                                       FSRefMakePath(&ref, (UInt8*)qstr_buf,
-                                                     1024);
-                                       s_arg=QString::fromUtf8(qstr_buf);
-                                       wa_ptr->view().view()->workAreaDispatch(
-                                               FuncRequest(LFUN_FILE_OPEN,
-                                                           fromqstr(s_arg)));
-                                       break;
-                               }
-                       }
-               } // for ...
-       }
-       AEDisposeDesc(&documentList);
-       return err;
-}
-#endif  // Q_WS_MACX
-
 #include "QWorkArea_moc.cpp"
Index: src/frontends/qt4/QWorkArea.h
===================================================================
--- src/frontends/qt4/QWorkArea.h       (revision 14001)
+++ src/frontends/qt4/QWorkArea.h       (working copy)
@@ -22,7 +22,8 @@
 #undef emit
 #endif
 
-#include "WorkArea.h"
+#include "frontends/WorkArea.h"
+#include "frontends/Clipboard.h"
 #include "QLPainter.h"
 #include "LyXView.h"
 #include "screen.h"
@@ -49,6 +50,9 @@
 class QDropEvent;
 class QMouseEvent;
 
+namespace lyx {
+namespace frontend {
+
 /// for emulating triple click
 class double_click {
 public:
@@ -70,7 +74,6 @@
                state(e->button()), active(true) {}
 };
 
-
 /** Qt only emits mouse events when the mouse is being moved, but
  *  we want to generate 'pseudo' mouse events when the mouse button is
  *  pressed and the mouse cursor is below the bottom, or above the top
@@ -96,7 +99,8 @@
  * Qt-specific implementation of the work area
  * (buffer view GUI)
 */
-class QWorkArea : public QAbstractScrollArea, public WorkArea, public 
LyXScreen {
+class QWorkArea 
+       : public QAbstractScrollArea, public WorkArea, public LyXScreen {
 
        Q_OBJECT
 
@@ -113,16 +117,7 @@
        ///
        virtual void setScrollbarParams(int height, int pos, int line_height);
 
-       /// a selection exists
-       virtual void haveSelection(bool) const;
-
        ///
-       virtual std::string const getClipboard() const;
-
-       ///
-       virtual void putClipboard(std::string const &) const;
-
-       ///
        virtual void dragEnterEvent(QDragEnterEvent * event);
 
        ///
@@ -184,7 +179,7 @@
 #if USE_INPUT_METHODS
 protected:
        /// IM events
-       void QWorkArea::inputMethodEvent(QInputMethodEvent * e)
+       void inputMethodEvent(QInputMethodEvent * e);
 #endif
 
 public slots:
@@ -259,4 +254,7 @@
        Cursor_Shape cursor_shape_;
 };
 
+} // namespace frontend
+} // namespace lyx
+
 #endif // QWORKAREA_H
Index: src/frontends/qt4/WorkAreaFactory.C
===================================================================
--- src/frontends/qt4/WorkAreaFactory.C (revision 14001)
+++ src/frontends/qt4/WorkAreaFactory.C (working copy)
@@ -11,13 +11,25 @@
 #include <config.h>
 
 #include "frontends/WorkAreaFactory.h"
-#include "QWorkArea.h"
+#include "Application.h"
 
+using lyx::frontend::Application;
+
 namespace WorkAreaFactory {
 
 WorkArea * create(LyXView & owner, int w, int h)
 {
-       return new QWorkArea(owner, w, h);
+       Application * theApp = static_cast<Application *> qApp;
+
+       return theApp->newWorkArea(owner, w, h);
 }
 
+
+Clipboard * getClipboard()
+{
+       Application * theApp = static_cast<Application *> qApp;
+
+       return theApp->lyxClipboard();
+}
+
 } // namespace WorkAreaFactory
Index: src/frontends/WorkArea.h
===================================================================
--- src/frontends/WorkArea.h    (revision 14001)
+++ src/frontends/WorkArea.h    (working copy)
@@ -50,14 +50,6 @@
         * @param line_height the line-scroll amount, in pixels
         */
        virtual void setScrollbarParams(int height, int pos, int line_height) = 
0;
-
-       // FIXME: this is an odd place to have it, but xforms needs it here ...
-       /// a selection exists
-       virtual void haveSelection(bool) const = 0;
-       /// get the X clipboard contents
-       virtual std::string const getClipboard() const = 0;
-       /// fill the clipboard
-       virtual void putClipboard(std::string const &) const = 0;
 };
 
 #endif // WORKAREA_H
Index: src/frontends/WorkAreaFactory.h
===================================================================
--- src/frontends/WorkAreaFactory.h     (revision 14001)
+++ src/frontends/WorkAreaFactory.h     (working copy)
@@ -14,6 +14,7 @@
 
 class WorkArea;
 class LyXView;
+class Clipboard;
 
 namespace WorkAreaFactory {
        /**
@@ -21,6 +22,11 @@
         * a toolkit-specific instance.
         */
        WorkArea * create(LyXView & owner, int w, int h);
+
+       /**
+        * Get the  toolkit-specific clipboard instance.
+        */
+       Clipboard * getClipboard();
 }
 
 #endif // WORKAREA_FACTORY_H
Index: src/frontends/xforms/WorkAreaFactory.C
===================================================================
--- src/frontends/xforms/WorkAreaFactory.C      (revision 14001)
+++ src/frontends/xforms/WorkAreaFactory.C      (working copy)
@@ -16,9 +16,20 @@
 
 namespace WorkAreaFactory {
 
+static XWorkArea * work_area_ = 0;
+
 WorkArea * create(LyXView & owner, int w, int h)
 {
-       return new lyx::frontend::XWorkArea(owner, w, h);
+       work_area_ = new lyx::frontend::XWorkArea(owner, w, h);
+       return work_area_;
 }
 
+/**
+The call to this method must be done after the WorkArea creation.
+*/
+Clipboard * getClipboard()
+{
+       return work_area_;
 }
+
+}
Index: src/frontends/xforms/XWorkArea.C
===================================================================
--- src/frontends/xforms/XWorkArea.C    (revision 14001)
+++ src/frontends/xforms/XWorkArea.C    (working copy)
@@ -613,7 +613,7 @@
 }
 
 
-void XWorkArea::haveSelection(bool yes) const
+void XWorkArea::haveSelection(bool yes)
 {
        Window const owner = yes ? FL_ObjWin(work_area) : None;
        XSetSelectionOwner(fl_get_display(), XA_PRIMARY, owner, CurrentTime);
@@ -642,7 +642,7 @@
 }
 
 
-void XWorkArea::putClipboard(string const & s) const
+void XWorkArea::putClipboard(string const & s)
 {
        static string hold;
        hold = s;
Index: src/frontends/xforms/XWorkArea.h
===================================================================
--- src/frontends/xforms/XWorkArea.h    (revision 14001)
+++ src/frontends/xforms/XWorkArea.h    (working copy)
@@ -14,6 +14,7 @@
 #define XWORKAREA_H
 
 #include "frontends/WorkArea.h"
+#include "frontends/Clipboard.h"
 #include "XPainter.h"
 
 #include "LayoutEngine.h"
@@ -25,7 +26,7 @@
 namespace lyx {
 namespace frontend {
 
-class XWorkArea : public WorkArea {
+class XWorkArea : public WorkArea, public Clipboard {
 public:
        ///
        XWorkArea(LyXView & owner, int width, int height);
@@ -56,11 +57,11 @@
        /// xforms callback from scrollbar
        void scroll_cb();
        /// a selection exists
-       virtual void haveSelection(bool) const;
+       virtual void haveSelection(bool);
        ///
        virtual std::string const getClipboard() const;
        ///
-       virtual void putClipboard(std::string const &) const;
+       virtual void putClipboard(std::string const &);
 
        /// handles SelectionRequest X Event, to fill the clipboard
        int event_cb(XEvent * xev);

Reply via email to