Преглед на файлове

Read document by FbReadThread

Kandrashin Denis преди 12 години
родител
ревизия
468718630b
променени са 12 файла, в които са добавени 80 реда и са изтрити 260 реда
  1. 2 2
      source/fb2code.cpp
  2. 1 1
      source/fb2code.hpp
  3. 3 1
      source/fb2dock.cpp
  4. 0 140
      source/fb2main.cpp
  5. 22 28
      source/fb2page.cpp
  6. 2 4
      source/fb2page.hpp
  7. 36 16
      source/fb2read.cpp
  8. 8 37
      source/fb2read.hpp
  9. 5 5
      source/fb2temp.cpp
  10. 1 1
      source/fb2temp.hpp
  11. 0 23
      source/fb2text.cpp
  12. 0 2
      source/fb2text.hpp

+ 2 - 2
source/fb2code.cpp

@@ -434,9 +434,9 @@ void FbCodeEdit::clipboardDataChanged()
     }
 }
 
-bool FbCodeEdit::read(QIODevice *device)
+bool FbCodeEdit::read(QIODevice &device)
 {
-    QByteArray data = device->readAll();
+    QByteArray data = device.readAll();
     QXmlInputSource source;
     source.setData(data);
     setPlainText(source.data());

+ 1 - 1
source/fb2code.hpp

@@ -90,7 +90,7 @@ public:
 
     QString text() const { return toPlainText(); }
 
-    bool read(QIODevice *device);
+    bool read(QIODevice &device);
 
     void load(const QByteArray data)
         { setPlainText(QString::fromUtf8(data.data())); }

+ 3 - 1
source/fb2dock.cpp

@@ -130,7 +130,9 @@ bool FbMainDock::load(const QString &filename)
 
     if (currentWidget() == m_code) {
         m_code->clear();
-        return m_code->read(&file);
+        return m_code->read(file);
+    } else {
+        m_text->page()->read(file);
     }
 
     return false;

+ 0 - 140
source/fb2main.cpp

@@ -586,13 +586,6 @@ FbMainWindow *FbMainWindow::findFbMainWindow(const QString &fileName)
     return 0;
 }
 /*
-void FbMainWindow::checkScintillaUndo()
-{
-    if (!codeEdit) return;
-    actionUndo->setEnabled(codeEdit->isUndoAvailable());
-    actionRedo->setEnabled(codeEdit->isRedoAvailable());
-}
-
 void FbMainWindow::viewText(FbTextPage *page)
 {
     if (textFrame && centralWidget() == textFrame) return;
@@ -707,139 +700,6 @@ void FbMainWindow::viewHead()
     actionPictures->setEnabled(false);
     actionInspect->setEnabled(true);
 }
-
-void FbMainWindow::viewCode()
-{
-    if (codeEdit && centralWidget() == codeEdit) return;
-
-    bool load = false;
-    QByteArray xml;
-    if (textFrame) {
-        textFrame->view()->save(&xml);
-        isSwitched = true;
-        load = true;
-    }
-
-    FB2DELETE(textFrame);
-    FB2DELETE(dockTree);
-    FB2DELETE(dockImgs);
-    FB2DELETE(headTree);
-
-    if (!codeEdit) {
-        codeEdit = new FbCodeEdit;
-    }
-    if (load) codeEdit->load(xml);
-    setCentralWidget(codeEdit);
-    codeEdit->setFocus();
-
-    FB2DELETE(toolEdit);
-    QToolBar *tool = toolEdit = addToolBar(tr("Edit"));
-    tool->addSeparator();
-    tool->addAction(actionUndo);
-    tool->addAction(actionRedo);
-    tool->addSeparator();
-    tool->addAction(actionCut);
-    tool->addAction(actionCopy);
-    tool->addAction(actionPaste);
-    tool->addSeparator();
-    tool->addAction(actionZoomIn);
-    tool->addAction(actionZoomOut);
-    tool->addAction(actionZoomReset);
-    tool->setMovable(false);
-
-    connect(codeEdit, SIGNAL(textChanged()), this, SLOT(documentWasModified()));
-    connect(codeEdit, SIGNAL(textChanged()), this, SLOT(checkScintillaUndo()));
-
-    connect(codeEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool)));
-    connect(codeEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool)));
-
-    connect(actionUndo, SIGNAL(triggered()), codeEdit, SLOT(undo()));
-    connect(actionRedo, SIGNAL(triggered()), codeEdit, SLOT(redo()));
-
-    connect(actionCut, SIGNAL(triggered()), codeEdit, SLOT(cut()));
-    connect(actionCopy, SIGNAL(triggered()), codeEdit, SLOT(copy()));
-    connect(actionPaste, SIGNAL(triggered()), codeEdit, SLOT(paste()));
-
-    connect(actionFind, SIGNAL(triggered()), codeEdit, SLOT(find()));
-
-    connect(actionZoomIn, SIGNAL(triggered()), codeEdit, SLOT(zoomIn()));
-    connect(actionZoomOut, SIGNAL(triggered()), codeEdit, SLOT(zoomOut()));
-    connect(actionZoomReset, SIGNAL(triggered()), codeEdit, SLOT(zoomReset()));
-
-    actionContents->setEnabled(false);
-    actionPictures->setEnabled(false);
-    actionInspect->setEnabled(false);
-}
-
-void FbMainWindow::viewHtml()
-{
-    if (codeEdit && centralWidget() == codeEdit) return;
-    if (!textFrame) return;
-
-    QString html = textFrame->view()->page()->mainFrame()->toHtml();
-    isSwitched = true;
-
-    FB2DELETE(textFrame);
-    FB2DELETE(dockTree);
-    FB2DELETE(dockImgs);
-    FB2DELETE(headTree);
-
-    if (!codeEdit) {
-        codeEdit = new FbCodeEdit;
-    }
-
-    codeEdit->setPlainText(html);
-    setCentralWidget(codeEdit);
-    codeEdit->setFocus();
-
-    FB2DELETE(toolEdit);
-    QToolBar *tool = toolEdit = addToolBar(tr("Edit"));
-    tool->addSeparator();
-    tool->addAction(actionUndo);
-    tool->addAction(actionRedo);
-    tool->addSeparator();
-    tool->addAction(actionCut);
-    tool->addAction(actionCopy);
-    tool->addAction(actionPaste);
-    tool->addSeparator();
-    tool->addAction(actionZoomIn);
-    tool->addAction(actionZoomOut);
-    tool->addAction(actionZoomReset);
-    tool->setMovable(false);
-
-    connect(codeEdit, SIGNAL(textChanged()), this, SLOT(documentWasModified()));
-    connect(codeEdit, SIGNAL(textChanged()), this, SLOT(checkScintillaUndo()));
-
-    connect(codeEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool)));
-    connect(codeEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool)));
-
-    connect(actionUndo, SIGNAL(triggered()), codeEdit, SLOT(undo()));
-    connect(actionRedo, SIGNAL(triggered()), codeEdit, SLOT(redo()));
-
-    connect(actionCut, SIGNAL(triggered()), codeEdit, SLOT(cut()));
-    connect(actionCopy, SIGNAL(triggered()), codeEdit, SLOT(copy()));
-    connect(actionPaste, SIGNAL(triggered()), codeEdit, SLOT(paste()));
-
-    connect(actionFind, SIGNAL(triggered()), codeEdit, SLOT(find()));
-
-    connect(actionZoomIn, SIGNAL(triggered()), codeEdit, SLOT(zoomIn()));
-    connect(actionZoomOut, SIGNAL(triggered()), codeEdit, SLOT(zoomOut()));
-    connect(actionZoomReset, SIGNAL(triggered()), codeEdit, SLOT(zoomReset()));
-
-    actionContents->setEnabled(false);
-    actionPictures->setEnabled(false);
-    actionInspect->setEnabled(false);
-}
-
-void FbMainWindow::viewTree()
-{
-    if (dockTree) dockTree->deleteLater(); else createTree();
-}
-
-void FbMainWindow::viewImgs()
-{
-    if (dockImgs) dockImgs->deleteLater(); else createImgs();
-}
 */
 void FbMainWindow::status(const QString &text)
 {

+ 22 - 28
source/fb2page.cpp

@@ -43,8 +43,14 @@ FbTextPage::FbTextPage(QObject *parent)
 
     setContentEditable(true);
     setNetworkAccessManager(new FbNetworkAccessManager(this));
+    connect(this, SIGNAL(linkHovered(QString,QString,QString)), parent, SLOT(linkHovered(QString,QString,QString)));
     connect(this, SIGNAL(loadFinished(bool)), SLOT(loadFinished()));
     connect(this, SIGNAL(contentsChanged()), SLOT(fixContents()));
+
+    QFile file(":blank.fb2");
+    if (file.open(QFile::ReadOnly | QFile::Text)) {
+        read(file);
+    }
 }
 
 FbNetworkAccessManager *FbTextPage::temp()
@@ -52,42 +58,30 @@ FbNetworkAccessManager *FbTextPage::temp()
     return qobject_cast<FbNetworkAccessManager*>(networkAccessManager());
 }
 
-void FbTextPage::binary(const QString &name, const QByteArray &data)
-{
-    if (FbNetworkAccessManager *t = temp()) t->data(name, data);
-}
-
-bool FbTextPage::load(const QString &filename, const QString &xml)
+bool FbTextPage::read(QIODevice &device)
 {
-    QXmlInputSource source;
-    if (xml.isEmpty()) {
-        QFile file(filename);
-        if (!file.open(QFile::ReadOnly | QFile::Text)) {
-            qCritical() << QObject::tr("Cannot read file %1: %2.").arg(filename).arg(file.errorString());
-            return false;
-        }
-        source.setData(file.readAll());
-    } else {
-        source.setData(xml);
-    }
+    QXmlInputSource *source = new QXmlInputSource();
+    source->setData(device.readAll());
 
-    bool ok = FbReadHandler::load(this, source, m_html);
-    if (ok) QTimer::singleShot(1000, this, SLOT(onTimer()));
+    FbReadThread *thread = new FbReadThread(this, source);
+    connect(thread, SIGNAL(html(QObject*,QString)), this, SLOT(html(QObject*,QString)));
+    thread->start();
 
-    return ok;
+    return true;
 }
 
-void FbTextPage::onTimer()
+void FbTextPage::html(QObject *temp, const QString &html)
 {
-    QUrl url = createUrl();
-    temp()->setPath(url.path());
-    mainFrame()->setHtml(m_html, url);
-}
+    FbNetworkAccessManager *manager = qobject_cast<FbNetworkAccessManager*>(temp);
+    if (!manager) { temp->deleteLater(); return; }
 
-void FbTextPage::html(const QString &html, const QUrl &url)
-{
+    QUrl url = FbTextPage::createUrl();
+    setNetworkAccessManager(manager);
+    manager->setPath(url.path());
+    manager->setParent(this);
+
+    QWebSettings::clearMemoryCaches();
     mainFrame()->setHtml(html, url);
-    temp()->setPath(url.path());
 }
 
 bool FbTextPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)

+ 2 - 4
source/fb2page.hpp

@@ -29,7 +29,7 @@ class FbTextPage : public QWebPage
 public:
     explicit FbTextPage(QObject *parent = 0);
     FbNetworkAccessManager *temp();
-    bool load(const QString &filename, const QString &xml = QString());
+    bool read(QIODevice &device);
     void push(QUndoCommand * command, const QString &text = QString());
     FbTextElement element(const QString &location);
     FbTextElement current();
@@ -45,7 +45,7 @@ public:
     static QUrl createUrl();
 
 public slots:
-    void html(const QString &html, const QUrl &url);
+    void html(QObject *temp, const QString &html);
     void insertBody();
     void insertTitle();
     void insertAnnot();
@@ -72,8 +72,6 @@ protected:
     void update();
 
 private slots:
-    void onTimer();
-    void binary(const QString &name, const QByteArray &data);
     void loadFinished();
     void fixContents();
 

+ 36 - 16
source/fb2read.cpp

@@ -1,30 +1,56 @@
-#include <QtGui>
+#include "fb2read.hpp"
+
 #include <QtDebug>
 
-#include "fb2page.hpp"
-#include "fb2read.hpp"
+#include "fb2temp.hpp"
 #include "fb2xml2.h"
 
 //---------------------------------------------------------------------------
 //  FbReadThread
 //---------------------------------------------------------------------------
 
-FbReadThread::FbReadThread(const QString &html, QObject *parent)
+FbReadThread::FbReadThread(QObject *parent, QXmlInputSource *source)
     : QThread(parent)
-    , m_html(html)
+    , m_source(source)
 {
-    connect(this, SIGNAL(html(QString,QUrl)), parent, SLOT(html(QString,QUrl)));
+    m_temp = new FbNetworkAccessManager(this);
 }
 
-void FbReadThread::run()
+FbReadThread::~FbReadThread()
 {
+    delete m_source;
+}
 
-    sleep(1);
-    QUrl url = FbTextPage::createUrl();
-    emit html(m_html, url);
+void FbReadThread::run()
+{
+    if (parse()) {
+        emit html(m_temp, m_html);
+    } else {
+        delete m_temp;
+    }
     deleteLater();
 }
 
+bool FbReadThread::parse()
+{
+    QXmlStreamWriter writer(&m_html);
+    FbReadHandler handler(writer);
+
+    connect(&handler, SIGNAL(binary(QString,QByteArray)), m_temp, SLOT(binary(QString,QByteArray)));
+
+#ifdef FB2_USE_LIBXML2
+    XML2::XmlReader reader;
+#else
+    QXmlSimpleReader reader;
+#endif
+
+    reader.setContentHandler(&handler);
+    reader.setLexicalHandler(&handler);
+    reader.setErrorHandler(&handler);
+
+    return reader.parse(m_source);
+}
+
 /*
 FbReadThread::FbReadThread(QObject *parent, const QString &filename, const QString &xml)
     : QThread(parent)
@@ -36,12 +62,6 @@ FbReadThread::FbReadThread(QObject *parent, const QString &filename, const QStri
     connect(this, SIGNAL(html(QString)), parent, SLOT(html(QString)));
 }
 
-FbReadThread::~FbReadThread()
-{
-    stop();
-    wait();
-}
-
 void FbReadThread::stop()
 {
     QMutexLocker locker(&mutex);

+ 8 - 37
source/fb2read.hpp

@@ -8,44 +8,19 @@
 #include <QThread>
 #include <QXmlDefaultHandler>
 
-class FbReadThread : public QThread
-{
-    Q_OBJECT
-
-public:
-    FbReadThread(const QString &html, QObject *parent = 0);
-
-signals:
-    void html(const QString &html, const QUrl &url);
-
-protected:
-    void run();
+class FbNetworkAccessManager;
 
-private:
-    const QString m_html;
-};
-
-
-class FbTextPage;
-/*
 class FbReadThread : public QThread
 {
     Q_OBJECT
-public:
-    FbReadThread(QObject *parent, const QString &filename, const QString &xml = QString());
-    ~FbReadThread();
 
 public:
-    void setPage(FbTextPage *page) { m_page = page; }
-    FbTextPage * page() const { return m_page; }
-    QObject * temp() const { return m_temp; }
-    QString * data() { return &m_html; }
+    FbReadThread(QObject *parent, QXmlInputSource *source);
+    ~FbReadThread();
 
 signals:
-    void html(QString name);
-
-public slots:
-    void stop();
+    void binary(const QString &name, const QByteArray &data);
+    void html(QObject *temp, const QString &html);
 
 protected:
     void run();
@@ -54,15 +29,11 @@ private:
     bool parse();
 
 private:
-    FbTextPage *m_page;
-    QObject *m_temp;
-    const QString m_filename;
-    const QString m_xml;
+    QXmlInputSource *m_source;
+    FbNetworkAccessManager *m_temp;
     QString m_html;
-    bool m_abort;
-    QMutex mutex;
 };
-*/
+
 class FbReadHandler : public QObject, public FbXmlHandler
 {
     Q_OBJECT

+ 5 - 5
source/fb2temp.cpp

@@ -201,6 +201,11 @@ FbNetworkAccessManager::FbNetworkAccessManager(QObject *parent)
 //    QWebSettings::clearMemoryCaches();
 }
 
+void FbNetworkAccessManager::binary(const QString &name, const QByteArray &data)
+{
+    m_files.set(name, data);
+}
+
 QNetworkReply * FbNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
 {
     const QUrl &url = request.url();
@@ -237,11 +242,6 @@ QByteArray FbNetworkAccessManager::data(int index) const
     return QByteArray();
 }
 
-void FbNetworkAccessManager::data(const QString &name, const QByteArray &data)
-{
-    m_files.set(name, data);
-}
-
 //---------------------------------------------------------------------------
 //  FbListModel
 //---------------------------------------------------------------------------

+ 1 - 1
source/fb2temp.hpp

@@ -91,7 +91,7 @@ public:
     void setPath(const QString &path) { m_path = path; }
 
 public slots:
-    void data(const QString &name, const QByteArray &data);
+    void binary(const QString &name, const QByteArray &data);
 
 public:
     QString add(const QString &path, QByteArray &data) { return m_files.add(path, data); }

+ 0 - 23
source/fb2text.cpp

@@ -491,24 +491,6 @@ void FbTextEdit::linkHovered(const QString &link, const QString &title, const QS
     noteView().hint(element, QRect(point, size));
 }
 
-void FbTextEdit::html(QString html)
-{
-/*
-    if (!m_thread) return;
-    static int number = 0;
-    QWebSettings::clearMemoryCaches();
-    QUrl url = FbTextPage::createUrl();
-    FbTextPage *page = m_thread->page();
-    setPage(page);
-    page->setParent(this);
-    page->temp()->setPath(url.path());
-    setHtml(html, url);
-    connect(page, SIGNAL(linkHovered(QString,QString,QString)), SLOT(linkHovered(QString,QString,QString)));
-    m_thread->deleteLater();
-    m_thread = 0;
-*/
-}
-
 bool FbTextEdit::save(QIODevice *device, const QString &codec)
 {
     FbSaveWriter writer(*this, device);
@@ -539,11 +521,6 @@ QString FbTextEdit::toHtml()
     return page()->mainFrame()->toHtml();
 }
 
-void FbTextEdit::data(QString name, QByteArray data)
-{
-    files()->data(name, data);
-}
-
 void FbTextEdit::zoomIn()
 {
     qreal zoom = zoomFactor();

+ 0 - 2
source/fb2text.hpp

@@ -98,8 +98,6 @@ protected:
     virtual void mouseMoveEvent(QMouseEvent *event);
 
 public slots:
-    void html(QString html);
-    void data(QString name, QByteArray data);
     void viewContents(bool show);
     void viewPictures(bool show);
     void viewInspector(bool show);