summaryrefslogtreecommitdiffstats
path: root/quanta/parts/kafka/wkafkapart.h
diff options
context:
space:
mode:
Diffstat (limited to 'quanta/parts/kafka/wkafkapart.h')
-rw-r--r--quanta/parts/kafka/wkafkapart.h473
1 files changed, 473 insertions, 0 deletions
diff --git a/quanta/parts/kafka/wkafkapart.h b/quanta/parts/kafka/wkafkapart.h
new file mode 100644
index 00000000..6b045150
--- /dev/null
+++ b/quanta/parts/kafka/wkafkapart.h
@@ -0,0 +1,473 @@
+/***************************************************************************
+ wkafkapart.h
+ -------------------
+
+ copyright : (C) 2003, 2004 - Nicolas Deschildre
+ email : ndeschildre@kdewebdev.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef WKAFKAPART_H
+#define WKAFKAPART_H
+
+class KConfig;
+namespace DOM
+{
+ class Node;
+}
+
+class Document;
+class Node;
+class Parser;
+class kNodeAttrs;
+class NodeModifsSet;
+class NodeEnhancer;
+struct DTDStruct;
+class NodeSelectionInd;
+class NodeModifsSet;
+
+#include <qmap.h>
+#include <qobject.h>
+#include <qptrdict.h>
+
+#include "kafkahtmlpart.h"
+
+/**
+ * This class assures the synchronisation of the two trees : the quanta and the
+ * kafka tree.
+ * By Quanta Node, i mean Node (cf quanta/parser/node.h)
+ * By Kafka Node, i mean DOM::Node (cf <dom/dom_node.h>)
+ * It is a singleton class.
+ */
+class KafkaDocument : public QObject
+{
+Q_OBJECT
+public:
+ /** Returns a reference to the KafkaDocument object */
+ static KafkaDocument* const ref(QWidget *parent = 0L, QWidget *widgetParent = 0L, const char *name = 0L)
+ {
+ static KafkaDocument *m_ref;
+ if (!m_ref) m_ref = new KafkaDocument(parent, widgetParent, name);
+ return m_ref;
+ }
+
+ ~KafkaDocument();
+
+
+ /* ----------------------------- LOADING/UNLOADING -----------------------------------------*/
+
+ /**
+ * Builds kafka's own tree from the Quanta tree.
+ * If the current Document is empty, it will create a minimum tree.
+ * @param the Document we want to load.
+ */
+ void loadDocument(Document *doc);
+
+ /**
+ * Unloads the kafka tree.
+ */
+ void unloadDocument();
+
+ /**
+ * Reloads the Document.
+ */
+ void reloadDocument();
+
+ /**
+ * Called to get KafkaDocument's state.
+ * @return Returns true if KafkaDocument is loaded.
+ */
+ bool isLoaded() {return _docLoaded;}
+
+
+ /* ----------------------------------- KAFKA<->QUANTA NODES LINK ----------------------------------*/
+
+ /**
+ * @param _node The DOM::Node we want the attributess.
+ * @return Return the corresponding kNodeAttrs of the DOM::Node.
+ */
+ kNodeAttrs *getAttrs(DOM::Node _domNode);
+
+ /**
+ * This function search the corresponding quanta Node to the kafka DOM::Node
+ * @param _domNode The DOM::Node we seek its corresponding Node.
+ * @return The Node corresponding to _domNode.
+ */
+ Node *getNode(DOM::Node _domNode);
+
+ /**
+ * Connects the domNode to the corresponding Quanta Node with an intermediate class :
+ * a kNodeAttrs which links the node and the DOM::Node.
+ * This is MANDATORY, even if node is null, to use this function at each
+ * DOM::Node insertion !!
+ * @param domNode The DOM::Node to connect to the Node.
+ * @param node The Node to connect to the DOM::Node. Can be null.
+ * @return Returns the kNodeAttr which links them.
+ */
+ kNodeAttrs* connectDomNodeToQuantaNode(DOM::Node domNode, Node *node);
+
+ /**
+ * Disconnects the domNode from its corresponding Quanta Node.
+ * @param _domNode The DOM::Node to disconnect from its Node.
+ */
+ void disconnectDomNodeFromQuantaNode(DOM::Node _domNode);
+
+ /**
+ * Disconnects all the domNode from their Quanta Node.
+ */
+ void disconnectAllDomNodes();
+
+
+ /* --------------------------- CURSOR AND SELECTION HANDLING --------------------------*/
+
+ /**
+ * Set the cursor and selection coordinates.
+ * @param nodeSelection The coordinates of the selection and cursor.
+ */
+ void setCursorAndSelection(NodeSelectionInd *nodeSelection);
+
+ void setCursor(Node* node, int cursorOffset);
+
+ /* --------------------------- KAFKA/QUANTA NODES CREATION -----------------------------*/
+
+ /**
+ * This function build a kafka DOM:::Node from a Quanta Node.
+ * @param _node The node from which we build the DOM::Node
+ * @param insertNode Specifies if we should insert the Node.
+ * @return Returns if the insertion was successful if asked, else true.
+ */
+ bool buildKafkaNodeFromNode(Node *_node, bool insertNode = true);
+
+ /**
+ * This function synchronizes the Node from the DOM::Node. If the Node is a text Node,
+ * we try to keep its indentation while updating it.
+ * @param node The Node to synchronize.
+ * @param domNode The Node is synchronized from this DOM::Node.
+ */
+ void buildNodeFromKafkaNode(Node *node, DOM::Node domNode);
+
+ /**
+ * This function creates and synchronize a Node from the DOM::Node. It adds
+ * the closing Node if necessary, and the node and its closing Node can surround Nodes
+ * and thus make them its childs. Usefull when adding a Node on a selected range of Nodes.
+ * It also create empty Nodes between Nodes.
+ * @param domNode The Node returned is synchronized from this DOM::Node.
+ * @param nodeParent The parent Node of the Node returned.
+ * @param beginNode The new Node will be placed before or within _beginNode.
+ * @param beginOffset NOT IMLEMENTED If set to 0 or -1, the new Node will be placed before _beginNode,
+ * else _beginNode will be splitted at offset #beginOffset and the new Node will be placed
+ * inbetween.
+ * @param endNode NOT IMPLEMENTED If not null and if the new Node has a closing tag, set the closing node
+ * after or within endNode.
+ * @param endOffset NOT IMPLEMENTED If set to -1, the closing node will be placed after _endNode, else _endNode
+ * will be splitted at offset #endOffset and the closing Node will be placed inbetween.
+ * @param modifs The NodeModifSet to log the changes made.
+ * @return Returns the new main Node created from the DOM::Node.
+ */
+ Node * buildNodeFromKafkaNode(DOM::Node domNode, Node *nodeParent,
+ Node *beginNode, int beginOffset, Node *endNode, int endOffset,
+ NodeModifsSet *modifs);
+
+
+ /* ------------------------------- TEXT ENTITIES ENCODING/DECODING ---------------------*/
+
+ /**
+ * This function returns the special XML character (e.g. space, �...)
+ * from its encoded form (e.g. &nbsp;)
+ * @return Returns the special character.
+ */
+ QString getDecodedChar(const QString &encodedChar);
+
+ /**
+ * This function returns the text decoded from its XML-encoded form.
+ * @param encodedText The text to decode.
+ * @param translateWhiteSpacesAndLineBreaks Specifies if whiteSpaces and line breaks should be
+ * compressed. Set it to false if we are inside PRE tag.
+ * @param removeLeftWhitespaces Specify if we should remove ALL whitespaces at the left of the string
+ * e.g. if the current text is the first child of a BLOCK Node (e.g. P)
+ * @param removeLeftWhitespaces Specify if we should remove ALL whitespaces at the right of the string
+ * e.g. if the current text is the last child of a BLOCK Node (e.g. P)
+ * @return Returns the text decoded.
+ */
+ QString getDecodedText(const QString &encodedText, bool translateWhiteSpacesAndLineBreaks = true,
+ bool removeLeftWhitespaces = false, bool removeRightWhitespaces = false);
+
+ /**
+ * This function returns the XML-encoded character (e.g. &nbsp;)
+ * from the XML special character (e.g. space, �...)
+ * @param decodedChar The character to encode.
+ * @param previousDecodedchar The previous decoded character.
+ * @return Returns the XML-encoded character.
+ */
+ QString getEncodedChar(const QString &decodedChar, const QString &previousDecodedChar);
+
+ /**
+ * This function returns the text with all the special XML characters encoded.
+ * @param decodedText The text to encode.
+ * @param bLine The start line of the returned encoded text.
+ * @param bCol The start col of the returned encoded text.
+ * @param eLine Returns the end line of the returned encoded text.
+ * @param eCol Returns the end col of the return encoded text.
+ * @param translateWhiteSpaces Specifies if we should translate the whitespaces
+ * into &nbsp; Set it to false for PRE Tag.
+ * @return Return the XML-encoded text.
+ */
+ QString getEncodedText(const QString &decodedText, int bLine, int bCol, int &eLine, int &eCol,
+ bool translateWhiteSpaces = true);
+
+ /**
+ * This function behaves essentially like the above function except that it doesn't
+ * return the position of the encoded text.
+ */
+ QString getEncodedText(const QString &decodedText);
+
+ /**
+ * This function generates the code corresponding to the XML node.
+ * @param _node The Node we want to generate its code.
+ * @param bLine The start line of the returned generated code.
+ * @param bCol The start col of the returned generated code.
+ * @param eLine Returns the end line of the returned generated code.
+ * @param eCol Returns the end col of the return generated code.
+ * @param encodeText Specify, if node is a Text Node, if we should encode the text
+ * (e.g. whitespace => &nbsp;)
+ * @return Returns the code.
+ */
+ QString generateCodeFromNode(Node *node, int bLine, int bCol, int &eLine, int &eCol,
+ bool encodeText = true);
+
+
+ /* ------------------------- KAFKA<->QUANTA POSITION TRANSLATION -------------------------------*/
+
+ /**
+ * Returns the kafka cursor position corresponding to the quanta cursor position.
+ * @param line The quanta line cursor position.
+ * @param col The quanta column cursor position.
+ * @param domNode Returns the DOM::Node in which the cursor is located.
+ * @param offset Returns the offset of the cursor.
+ */
+ void translateQuantaIntoKafkaCursorPosition(uint line, uint col, DOM::Node &domNode, long &offset);
+
+ /**
+ * Returns the internal Node offset corresponding to the Quanta cursor position.
+ * @param line The quanta line cursor position.
+ * @param col The quanta column cursor position.
+ * @param node Returns the node where is located the node internal offset.
+ * @param offset Returns the node internal corresponding offset.
+ */
+ void translateQuantaIntoNodeCursorPosition(uint line, uint col, Node **node, long &offset);
+
+ /**
+ * Returns the internal Node offset corresponding to the kafka cursor position.
+ * @param domNode The kafka DOM::Node cursor position.
+ * @param domNodeOffset The kafka offset cursor position.
+ * @param node Returns the node where is located the node internal offset.
+ * @param offset Returns the node internal corresponding offset.
+ */
+ void translateKafkaIntoNodeCursorPosition(DOM::Node domNode, long domNodeOffset, Node **node, long &offset);
+
+ /**
+ * Returns the quanta cursor position corresponding to the kafka cursor position.
+ * @param domNode The kafka DOM::Node cursor position.
+ * @param offset The kafka offset cursor position.
+ * @param line Returns the line cursor position.
+ * @param col Returns the col cursor position.
+ */
+ void translateKafkaIntoQuantaCursorPosition(DOM::Node domNode, int offset, int &line, int &col);
+
+ /**
+ * Returns the kafka cursor position corresponding to the internal Node offset.
+ * @param node The node.
+ * @param offset The internal offset of Node.
+ * @param domNode Returns the corresponding DOM::Node of node. Can be null.
+ * @param domNodeOffset Returns the offset inside the DOM::Node.
+ */
+ void translateNodeIntoKafkaCursorPosition(Node *node, int offset, DOM::Node &domNode,
+ long &domNodeOffset);
+
+ /**
+ * Returns the quanta cursor position corresponding to the internal Node offset.
+ * @param node The node.
+ * @param offset The internal offset of Node.
+ * @param line Returns the line position of the corresponding Quanta cursor.
+ * @param col Returns the col position of the corresponding Quanta cursor.
+ */
+ void translateNodeIntoQuantaCursorPosition(Node *node, int offset, uint &line, uint &col);
+
+
+ /** ----------------- DOM::NODE TREE MODIFICATIONS --------------------*/
+
+ /**
+ * Insert a DOM::Node in the DOM::Node tree. It takes care to handle the exceptions and
+ * to postEnhance (cf htmlenhancer.h)
+ * @param node The node to insert.
+ * @param parent The new parent of node. If null, insert node at the top level.
+ * @param nextSibling The new next sibling of node. If null, append node at the end of the child list.
+ * @param rootNode The root DOM::Node of the DOM::Node tree. Useful when no parent is provided.
+ * @return Returns true if the operation was successfull.
+ */
+ bool insertDomNode(DOM::Node node, DOM::Node parent = DOM::Node(),
+ DOM::Node nextSibling = DOM::Node(), DOM::Node rootNode = DOM::Node());
+
+
+ /**
+ * Removes a DOM::Node from the DOM::Node Tree. It takes care to handle the exceptions
+ * and to postUnenhance (cf htmlenhancer.h)
+ * @param node The Node to remove from the tree.
+ * @retun Returns true if the operation was successfull..
+ */
+ bool removeDomNode(DOM::Node node);
+
+
+ /** ------------------ DOM::NODE TREE NAVIGATION -----------------------------------------*/
+
+ /**
+ * @param domNode The DOM::Node the search starts from.
+ * @return Returns the next previous sibling which has no special behavior (cf htmlenhancer.h)
+ * Sibling here (contrary to node.h) has the same meaning as in dom/dom_node.h
+ */
+ DOM::Node getPrevSiblingNSpecial(DOM::Node domNode);
+
+ /**
+ * @param domNode The DOM::Node the search starts from.
+ * @return Returns the next next sibling which has no special behavior (cf htmlenhancer.h)
+ * Sibling here (contrary to node.h) has the same meaning as in dom/dom_node.h
+ */
+ DOM::Node getNextSiblingNSpecial(DOM::Node domNode);
+
+ /* --------------------------------- MISCELLANEOUS ------------------------------------------*/
+
+ /**
+ * Read the config.
+ * @param m_config The config to read.
+ */
+ void readConfig(KConfig *m_config);
+
+ /**
+ * Returns the default DTD of the current Document.
+ */
+ const DTDStruct* defaultDTD();
+
+ /**
+ * @return Returns the current KafkaWidget.
+ */
+ KafkaWidget *getKafkaWidget() {return m_kafkaPart;}
+
+ /**
+ * @return Returns the current Document.
+ */
+ Document *getCurrentDoc() {return m_currentDoc;}
+
+ /**
+ * Prints in stdout the current Node tree + Node->DOM::Node->Node relationship.
+ * @node The startNode
+ * @indent The number of little dots per parent relationship.
+ */
+ void coutLinkTree(Node *node, int indent);
+
+ /**
+ * In order to have khtml works whatever DTD is loaded, they must always exists
+ * and be valid.
+ */
+ DOM::Node html, body, head;
+
+signals:
+ /**
+ * Emitted when an error occurs when loading kafka. Can be called multiple times.
+ * @param node The node which caused this error.
+ */
+ void loadingError(Node *node);
+
+ /**
+ * Called whenever a DOM::Node get the focus
+ */
+ void newCursorPosition(int col, int row);
+
+ /**
+ * Called whenever a DOM::Node get the focus
+ */
+ void nodeGetFocus(Node *_node);
+
+ /**
+ * Called when the wKafkaPart is loaded.
+ */
+ void loaded();
+
+ /**
+ * Called when the wKafkaPart is unloaded.
+ */
+ void unloaded();
+
+public slots:
+ /**
+ * Called whenever a DOM::Node is inserted in the Kafka tree.
+ * @param domNode is the Node inserted.
+ * @param insertChilds Specifies if the _domNode's child should be inserted
+ * @param modifs The changes made are logged into modifs.
+ */
+ void slotDomNodeInserted(DOM::Node domNode, bool insertChilds, NodeModifsSet *modifs);
+
+ /**
+ * Called whenever DOM::Node's attributes are modified.
+ * @param domNode is the Node modified.
+ * @param modifs The changes made are logged into modifs.
+ */
+ void slotDomNodeModified(DOM::Node domNode, NodeModifsSet *modifs);
+
+ /**
+ * Called whenever a DOM::Node is about to be removed from the Kafka tree.
+ * @param domNode is the Node to be deleted.
+ * @param deleteChilds Specifies if we should delete the child nodes of _node
+ * @param modifs The changes made are logged into modifs.
+ */
+ void slotDomNodeAboutToBeRemoved(DOM::Node domNode, bool deleteChilds, NodeModifsSet *modifs);
+
+ /**
+ * Called whenever a DOM::Node is moved.
+ * @param domNode The DOM::Node to move.
+ * @param newParent The new parent DOM::Node of domNode.
+ * @param before domNode will be inserted before before.
+ * @param modifs The changes made are logged into modifs.
+ */
+ void slotDomNodeIsAboutToBeMoved(DOM::Node domNode, DOM::Node newParent, DOM::Node before, NodeModifsSet *modifs);
+
+ /**
+ * Called whenever a DOM::Node get the focus
+ */
+ void slotdomNodeNewCursorPos(DOM::Node _domNode, int offset);
+
+ void slotCut();
+ void slotCopy();
+ void slotPaste();
+
+ void slotCut(Node* startNode, int startOffset, Node* endNode, int endOffset,
+ Node** cursorNode, long cursorOffset, QString const& plainText);
+ void slotCopy(Node* startNode, int startOffset, Node* endNode, int endOffset, QString const& plainText);
+
+public:
+ //use a QPtrList aferwards
+ NodeEnhancer *mainEnhancer;
+
+private:
+ /**
+ * Create a KafkaWidget.
+ */
+ KafkaDocument(QWidget *parent, QWidget *widgetParent, const char *name);
+
+ QMap<QString, QString> decodedChars;
+ QMap<QString, QString> encodedChars;
+ QPtrDict<kNodeAttrs> domNodeProps;
+ QGuardedPtr<KafkaWidget> m_kafkaPart;
+ Document *m_currentDoc;
+ bool _docLoaded;
+
+};
+
+#endif