Browse Source

New class: Fb2NodeDlg

Kandrashin Denis 13 years ago
parent
commit
15ef0f5b11
3 changed files with 217 additions and 84 deletions
  1. 68 67
      fb2edit.pro
  2. 117 11
      source/fb2head.cpp
  3. 32 6
      source/fb2head.hpp

+ 68 - 67
fb2edit.pro

@@ -1,67 +1,68 @@
-HEADERS = \
-    source/fb2xml.h \
-    source/fb2xml2.h \
-    source/fb2app.hpp \
-    source/fb2code.hpp \
-    source/fb2head.hpp \
-    source/fb2main.hpp \
-    source/fb2read.hpp \
-    source/fb2temp.hpp \
-    source/fb2tree.hpp \
-    source/fb2view.hpp \
-    source/fb2utils.h \
-    source/fb2save.hpp \
-    source/fb2dlgs.hpp
-
-SOURCES = \
-    source/fb2app.cpp \
-    source/fb2code.cpp \
-    source/fb2head.cpp \
-    source/fb2main.cpp \
-    source/fb2read.cpp \
-    source/fb2save.cpp \
-    source/fb2temp.cpp \
-    source/fb2tree.cpp \
-    source/fb2view.cpp \
-    source/fb2xml.cpp \
-    source/fb2xml2.cpp \
-    source/fb2utils.cpp \
-    source/fb2dlgs.cpp
-
-RESOURCES = \
-    3rdparty/gnome/gnome.qrc \
-    source/res/fb2edit.qrc \
-    source/js/javascript.qrc \
-    3rdparty/fb2/fb2.qrc
-
-TARGET = fb2edit
-
-TRANSLATIONS = source/ts/ru.ts
-
-VERSION = 0.01.1
-
-QT += xml
-QT += webkit
-QT += network
-
-OTHER_FILES += \
-    source/res/style.css \
-    source/res/blank.fb2 \
-    source/js/export.js \
-    source/js/set_cursor.js \
-    source/js/get_status.js \
-    source/js/get_location.js \
-    source/js/insert_title.js \
-    CMakeLists.txt
-
-if (unix) {
-
-    DEFINES += FB2_USE_LIBXML2
-    INCLUDEPATH += /usr/include/libxml2
-    LIBS += -lxml2
-
-}
-
-FORMS += \
-    source/fb2note.ui \
-    source/fb2find.ui
+HEADERS = \
+    source/fb2xml.h \
+    source/fb2xml2.h \
+    source/fb2app.hpp \
+    source/fb2code.hpp \
+    source/fb2head.hpp \
+    source/fb2main.hpp \
+    source/fb2read.hpp \
+    source/fb2temp.hpp \
+    source/fb2tree.hpp \
+    source/fb2view.hpp \
+    source/fb2utils.h \
+    source/fb2save.hpp \
+    source/fb2dlgs.hpp
+
+SOURCES = \
+    source/fb2app.cpp \
+    source/fb2code.cpp \
+    source/fb2head.cpp \
+    source/fb2main.cpp \
+    source/fb2read.cpp \
+    source/fb2save.cpp \
+    source/fb2temp.cpp \
+    source/fb2tree.cpp \
+    source/fb2view.cpp \
+    source/fb2xml.cpp \
+    source/fb2xml2.cpp \
+    source/fb2utils.cpp \
+    source/fb2dlgs.cpp
+
+RESOURCES = \
+    3rdparty/gnome/gnome.qrc \
+    source/res/fb2edit.qrc \
+    source/js/javascript.qrc \
+    3rdparty/fb2/fb2.qrc
+
+TARGET = fb2edit
+
+TRANSLATIONS = source/ts/ru.ts
+
+VERSION = 0.01.1
+
+QT += xml
+QT += webkit
+QT += network
+
+OTHER_FILES += \
+    source/res/style.css \
+    source/res/blank.fb2 \
+    source/js/export.js \
+    source/js/set_cursor.js \
+    source/js/get_status.js \
+    source/js/get_location.js \
+    source/js/insert_title.js \
+    CMakeLists.txt
+
+if (unix) {
+
+    DEFINES += FB2_USE_LIBXML2
+    INCLUDEPATH += /usr/include/libxml2
+    LIBS += -lxml2
+
+}
+
+FORMS += \
+    source/fb2note.ui \
+    source/fb2find.ui \
+    source/new_node.ui

+ 117 - 11
source/fb2head.cpp

@@ -2,6 +2,8 @@
 
 #include <QtDebug>
 #include <QAction>
+#include <QDialogButtonBox>
+#include <QGridLayout>
 #include <QHeaderView>
 #include <QToolBar>
 #include <QWebFrame>
@@ -34,12 +36,48 @@ const QDomDocument & Fb2Scheme::fb2()
 }
 
 FB2_BEGIN_KEYHASH(Fb2Scheme)
-    FB2_KEY( Element , "xs:element"     );
-    FB2_KEY( Content , "xs:choice"      );
-    FB2_KEY( Content , "xs:complexType" );
-    FB2_KEY( Content , "xs:sequence"    );
+    FB2_KEY( XsElement     , "xs:element"     );
+    FB2_KEY( XsChoice      , "xs:choice"      );
+    FB2_KEY( XsComplexType , "xs:complexType" );
+    FB2_KEY( XsSequence    , "xs:sequence"    );
 FB2_END_KEYHASH
 
+void Fb2Scheme::items(QStringList &list) const
+{
+    Fb2Scheme child = typeScheme().firstChildElement();
+    while (!child.isNull()) {
+        switch (toKeyword(child.tagName())) {
+            case XsElement: {
+                    QString name = child.attribute("name");
+                    if (!list.contains(name)) list << name;
+                } break;
+            case XsChoice:
+            case XsComplexType:
+            case XsSequence: {
+                    child.items(list);
+                } break;
+            default: ;
+        }
+        child = child.nextSiblingElement();
+    }
+}
+
+Fb2Scheme Fb2Scheme::typeScheme() const
+{
+    QString typeName = type();
+    if (typeName.isEmpty()) return *this;
+
+    Fb2Scheme child = fb2().firstChildElement("xs:schema").firstChildElement();
+    while (!child.isNull()) {
+        if (child.tagName() == "xs:complexType") {
+            if (child.attribute("name") == typeName) return child.element(typeName);
+        }
+        child = child.nextSiblingElement();
+    }
+
+    return Fb2Scheme();
+}
+
 QString Fb2Scheme::info() const
 {
     QDomElement element = *this;
@@ -56,6 +94,7 @@ QString Fb2Scheme::info() const
 
 QString Fb2Scheme::type() const
 {
+    if (isNull()) return QString();
     QString result = attribute("type");
     if (!result.isEmpty()) return result;
     Fb2Scheme child = firstChildElement("xs:complexType");
@@ -75,10 +114,12 @@ Fb2Scheme Fb2Scheme::element(const QString &name) const
     Fb2Scheme child = parent.firstChildElement();
     while (!child.isNull()) {
         switch (toKeyword(child.tagName())) {
-            case Element: {
+            case XsElement: {
                     if (child.attribute("name") == name) return child;
                 } break;
-            case Content: {
+            case XsChoice:
+            case XsComplexType:
+            case XsSequence: {
                     Fb2Scheme result = child.element(name);
                     if (!result.isNull()) return result;
                 } break;
@@ -88,9 +129,9 @@ Fb2Scheme Fb2Scheme::element(const QString &name) const
     }
 
     QString type = this->type();
-    if (type.isEmpty()) return QDomElement();
+    if (type.isEmpty()) return *this;
 
-    child = fb2().firstChildElement().firstChildElement();
+    child = fb2().firstChildElement("xs:schema").firstChildElement();
     while (!child.isNull()) {
         if (child.tagName() == "xs:complexType") {
             if (child.attribute("name") == type) return child.element(name);
@@ -98,7 +139,7 @@ Fb2Scheme Fb2Scheme::element(const QString &name) const
         child = child.nextSiblingElement();
     }
 
-    return QDomElement();
+    return Fb2Scheme();
 }
 
 //---------------------------------------------------------------------------
@@ -146,6 +187,7 @@ Fb2HeadItem::Fb2HeadItem(QWebElement &element, Fb2HeadItem *parent)
         if (style == "annotation") return;
         if (style == "history") return;
     } else if (m_name == "img") {
+        m_name == "image";
         m_text = element.attribute("alt");
     }
     addChildren(element);
@@ -408,14 +450,14 @@ Fb2HeadView::Fb2HeadView(Fb2WebView &view, QWidget *parent)
 
     actionInsert = act = new QAction(FB2::icon("list-add"), tr("&Append"), this);
     act->setPriority(QAction::LowPriority);
-    act->setShortcuts(QKeySequence::New);
+    connect(act, SIGNAL(triggered()), SLOT(insertNode()));
 
     actionModify = act = new QAction(FB2::icon("list-add"), tr("&Modify"), this);
     act->setPriority(QAction::LowPriority);
 
     actionDelete = act = new QAction(FB2::icon("list-remove"), tr("&Delete"), this);
     act->setPriority(QAction::LowPriority);
-    act->setShortcuts(QKeySequence::Delete);
+    connect(act, SIGNAL(triggered()), SLOT(deleteNode()));
 
     //setItemDelegate(new QItemDelegate(this));
     setRootIsDecorated(false);
@@ -481,3 +523,67 @@ void Fb2HeadView::collapsed(const QModelIndex &index)
         expand(index);
     }
 }
+
+void Fb2HeadView::insertNode()
+{
+    Fb2HeadModel * m = qobject_cast<Fb2HeadModel*>(model());
+    if (!m) return;
+    QModelIndex current = currentIndex();
+    Fb2HeadItem * i = m->item(current);
+    if (!i) return;
+    Fb2NodeDlg dlg(*this, i->scheme());
+    dlg.exec();
+}
+
+void Fb2HeadView::deleteNode()
+{
+}
+
+//---------------------------------------------------------------------------
+//  Fb2NodeDlg
+//---------------------------------------------------------------------------
+
+Fb2NodeDlg::Fb2NodeDlg(Fb2HeadView &view, Fb2Scheme scheme)
+    : QDialog(&view)
+    , m_scheme(scheme)
+{
+    setWindowTitle(tr("Insert tag"));
+
+    QGridLayout * layout = new QGridLayout(this);
+
+    QLabel * label = new QLabel(this);
+    label->setObjectName(QString::fromUtf8("label"));
+    label->setText(tr("Tag name:"));
+    layout->addWidget(label, 0, 0, 1, 1);
+
+    QStringList list;
+    scheme.items(list);
+
+    m_combo = new QComboBox(this);
+    m_combo->setEditable(true);
+    m_combo->addItems(list);
+    layout->addWidget(m_combo, 0, 1, 1, 1);
+
+    m_text = new QLabel(this);
+    m_text->setStyleSheet(QString::fromUtf8("border-style:outset;border-width:1px;border-radius:10px;padding:6px;"));
+    m_text->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop);
+    m_text->setMinimumSize(QSize(300, 100));
+    m_text->setWordWrap(true);
+    layout->addWidget(m_text, 1, 0, 1, 2);
+
+    QDialogButtonBox * buttons = new QDialogButtonBox(this);
+    buttons->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
+    buttons->setOrientation(Qt::Horizontal);
+    layout->addWidget(buttons, 2, 0, 1, 2);
+
+    layout->setColumnStretch(1, 1);
+
+    connect(m_combo, SIGNAL(editTextChanged(QString)), SLOT(comboChanged(QString)));
+    connect(buttons, SIGNAL(accepted()), SLOT(accept()));
+    connect(buttons, SIGNAL(rejected()), SLOT(reject()));
+}
+
+void Fb2NodeDlg::comboChanged(const QString &text)
+{
+    m_text->setText(m_scheme.element(text).info());
+}

+ 32 - 6
source/fb2head.hpp

@@ -2,8 +2,12 @@
 #define FB2HEAD_H
 
 #include <QAbstractItemModel>
+#include <QDialog>
+#include <QComboBox>
+#include <QLabel>
 #include <QDomDocument>
 #include <QDomElement>
+#include <QStringList>
 #include <QTreeView>
 #include <QWebElement>
 #include <QWebView>
@@ -20,8 +24,10 @@ class Fb2WebView;
 class Fb2Scheme : public QDomElement
 {
     FB2_BEGIN_KEYLIST
-        Element,
-        Content,
+        XsElement,
+        XsChoice,
+        XsComplexType,
+        XsSequence,
     FB2_END_KEYLIST
 
 private:
@@ -35,9 +41,12 @@ public:
 
     static const QDomDocument & fb2();
     Fb2Scheme element(const QString &name) const;
+    void items(QStringList &list) const;
     QString info() const;
     QString type() const;
 
+private:
+    Fb2Scheme typeScheme() const;
 };
 
 class Fb2HeadItem: public QObject
@@ -86,6 +95,8 @@ public:
 
     QString sub(const QString &key) const;
 
+    Fb2Scheme scheme() const;
+
 private:
     class HintHash : public QHash<QString, QString>
     {
@@ -94,7 +105,6 @@ private:
     };
 
 private:
-    Fb2Scheme scheme() const;
     void addChildren(QWebElement &parent);
     QString value() const;
     QString hint() const;
@@ -117,6 +127,7 @@ public:
     virtual ~Fb2HeadModel();
     void select(const QModelIndex &index);
     void expand(QTreeView *view);
+    Fb2HeadItem * item(const QModelIndex &index) const;
 
 public:
     virtual Qt::ItemFlags flags(const QModelIndex &index) const;
@@ -128,9 +139,6 @@ public:
     virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
     virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
 
-protected:
-    Fb2HeadItem * item(const QModelIndex &index) const;
-
 private:
     QWebView & m_view;
     Fb2HeadItem * m_root;
@@ -154,6 +162,8 @@ public slots:
 private slots:
     void activated(const QModelIndex &index);
     void collapsed(const QModelIndex &index);
+    void insertNode();
+    void deleteNode();
 
 protected:
     void currentChanged(const QModelIndex &current, const QModelIndex &previous);
@@ -168,4 +178,20 @@ private:
     QAction * actionDelete;
 };
 
+class Fb2NodeDlg : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit Fb2NodeDlg(Fb2HeadView &view, Fb2Scheme scheme);
+
+private slots:
+    void comboChanged(const QString &text);
+
+private:
+    const Fb2Scheme m_scheme;
+    QComboBox * m_combo;
+    QLabel * m_text;
+};
+
 #endif // FB2HEAD_H