summaryrefslogtreecommitdiffstats
path: root/kate/kpybrowser/kpybrowser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kate/kpybrowser/kpybrowser.cpp')
-rw-r--r--kate/kpybrowser/kpybrowser.cpp397
1 files changed, 397 insertions, 0 deletions
diff --git a/kate/kpybrowser/kpybrowser.cpp b/kate/kpybrowser/kpybrowser.cpp
new file mode 100644
index 0000000..9023e65
--- /dev/null
+++ b/kate/kpybrowser/kpybrowser.cpp
@@ -0,0 +1,397 @@
+/***************************************************************************
+ kpybrowser.cpp - description
+ -------------------
+ begin : Fri Aug 24 15:11:58 MST 2001
+ copyright : (C) 2001 by Christian Bird
+ email : chrisb@lineo.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "kpybrowser.h"
+#include <qheader.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <qregexp.h>
+
+#include "kpybrowser.moc"
+
+#include <iostream>
+
+static const char *container_xpm[] = {
+ "16 16 119 2",
+ " c None",
+ ". c #020202",
+ "+ c #484848",
+ "@ c #141414",
+ "# c #CBCBCB",
+ "$ c #E9E9E9",
+ "% c #2F2F2F",
+ "& c #3E3E3E",
+ "* c #006B9E",
+ "= c #003D5A",
+ "- c #757575",
+ "; c #A4A4A4",
+ "> c #727272",
+ ", c #282828",
+ "' c #C1E1ED",
+ ") c #D3EDF6",
+ "! c #79BFD6",
+ "~ c #E4E4E4",
+ "{ c #202121",
+ "] c #3CB9ED",
+ "^ c #3AA3C5",
+ "/ c #77BCD6",
+ "( c #82C3D9",
+ "_ c #0873A5",
+ ": c #003C5B",
+ "< c #464646",
+ "[ c #1E1E1E",
+ "} c #19AFEE",
+ "| c #0787B6",
+ "1 c #38A2C5",
+ "2 c #5DB1D0",
+ "3 c #76BBD5",
+ "4 c #81C2D8",
+ "5 c #85C4D9",
+ "6 c #0770A1",
+ "7 c #4F4F4F",
+ "8 c #169ACB",
+ "9 c #106CA1",
+ "0 c #127CAD",
+ "a c #0784B2",
+ "b c #56B0CD",
+ "c c #72B9D4",
+ "d c #91C9DB",
+ "e c #3F3F3F",
+ "f c #2B2B2B",
+ "g c #1380B2",
+ "h c #0B5482",
+ "i c #0E5E91",
+ "j c #0E6597",
+ "k c #116FA0",
+ "l c #127FB1",
+ "m c #58AECD",
+ "n c #70B8D3",
+ "o c #454545",
+ "p c #FCFCFC",
+ "q c #E9E4E4",
+ "r c #8AA9B9",
+ "s c #296C8E",
+ "t c #0E5C8D",
+ "u c #0F6698",
+ "v c #1175A4",
+ "w c #404040",
+ "x c #444444",
+ "y c #F6F6F6",
+ "z c #F1F1F1",
+ "A c #EBEBEB",
+ "B c #EAEAEA",
+ "C c #DBD7D6",
+ "D c #81A0B0",
+ "E c #286C8F",
+ "F c #0F6596",
+ "G c #1172A4",
+ "H c #57A1C0",
+ "I c #424242",
+ "J c #EEEEEE",
+ "K c #E6E6E6",
+ "L c #E1E1E1",
+ "M c #DCDCDC",
+ "N c #D5D5D5",
+ "O c #D7D7D7",
+ "P c #CBC9C8",
+ "Q c #88A6B5",
+ "R c #276C8C",
+ "S c #276892",
+ "T c #363636",
+ "U c #C4C4C4",
+ "V c #DFDFDF",
+ "W c #DEDEDE",
+ "X c #DBDBDB",
+ "Y c #D6D6D6",
+ "Z c #D1D1D1",
+ "` c #CCCCCC",
+ " . c #C5C5C5",
+ ".. c #BFBFBF",
+ "+. c #C1BEBE",
+ "@. c #6E6D6D",
+ "#. c #686868",
+ "$. c #C0C0C0",
+ "%. c #CECECE",
+ "&. c #CACACA",
+ "*. c #C6C6C6",
+ "=. c #BBBBBB",
+ "-. c #B6B6B6",
+ ";. c #AEAEAE",
+ ">. c #323232",
+ ",. c #606060",
+ "'. c #AFAFAF",
+ "). c #B5B5B5",
+ "!. c #B0B0B0",
+ "~. c #AAAAAA",
+ "{. c #6C6B6B",
+ "]. c #2E2E2E",
+ "^. c #585858",
+ "/. c #9D9D9D",
+ "(. c #A7A7A7",
+ "_. c #6A6969",
+ ":. c #393939",
+ "<. c #292929",
+ "[. c #3A3835",
+ " . + ",
+ " @ # $ + + % ",
+ " & * = - ; # $ + . + > . ",
+ " , ' ) ! * = - ; # ~ $ $ . ",
+ " { ] ^ / ' ) ( _ : - ; # $ < ",
+ " [ } | 1 2 3 4 ' ) 5 6 = - 7 ",
+ " [ 8 9 0 a | 1 b c d ' ) ! e ",
+ " f g h i j k l | | 1 m n ' e ",
+ " o p q r s h t u v 0 | | n w ",
+ " x y z A B C D E h i F G H w ",
+ " I J B K L M N O P Q R h S w ",
+ " T U V W X Y Z ` ... .+.@.o ",
+ " . T #.$.%.&.*.$.=.-.;.@.< ",
+ " . >.,.'.=.).!.~.{.o ",
+ " . ].^./.(._.:.",
+ " . <.[. "
+};
+
+void
+getOpenNodes (QValueList < QString > *open_nodes, PyBrowseNode * node)
+{
+ if (node == NULL)
+ return;
+ if (node->isOpen ())
+ {
+ open_nodes->append (node->getQualifiedName ());
+ }
+
+ getOpenNodes (open_nodes,
+ dynamic_cast < PyBrowseNode * >(node->firstChild ()));
+ getOpenNodes (open_nodes,
+ dynamic_cast < PyBrowseNode * >(node->nextSibling ()));
+}
+
+
+KPyBrowser::KPyBrowser (QWidget * parent, const char *name):
+KListView (parent, name)
+{
+
+ addColumn(i18n("Name"));
+ header ()->hide ();
+ class_root =
+ new PyBrowseNode (this, QString ("Classes"), i18n("Classes"),
+ PYOTHER);
+ class_root->setPixmap (0, QPixmap (container_xpm));
+ function_root =
+ new PyBrowseNode (this, QString ("Globals"), i18n("Globals"),
+ PYOTHER);
+ function_root->setPixmap (0, QPixmap (container_xpm));
+ setRootIsDecorated (1);
+ connect (this, SIGNAL (executed (QListViewItem *)), this,
+ SLOT (nodeSelected (QListViewItem *)));
+ setTooltipColumn (1);
+ setShowToolTips (1);
+ tooltip = new KPBToolTip (this);
+}
+
+KPyBrowser::~KPyBrowser ()
+{
+}
+
+void
+KPyBrowser::nodeSelected (QListViewItem * node)
+{
+ PyBrowseNode *browse_node = dynamic_cast < PyBrowseNode * >(node);
+
+ if (!browse_node)
+ {
+ return;
+ }
+
+ QString method_name;
+ int line_no;
+
+ line_no = browse_node->getLine();
+ method_name = browse_node->getName();
+ if (browse_node->getType () == PYCLASS)
+ {
+ method_name = QString ("class ") + browse_node->getName ();
+ }
+ else if (browse_node->getType () == PYMETHOD
+ || browse_node->getType () == PYFUNCTION)
+ {
+ method_name = QString ("def ") + browse_node->getName ();
+ }
+ emit selected(method_name, line_no);
+}
+
+void
+KPyBrowser::parseText (QString & pytext)
+{
+ QRegExp class_rx (QString ("^class [a-zA-Z0-9_,\\s\\(\\).]+:"));
+ QRegExp function_rx (QString ("^def [a-zA-Z_]+[^#]*:"));
+ QRegExp method_rx (QString ("[\\s]+def [a-zA-Z_]+[^#]*:"));
+
+ int paren_i;
+ QStringList lines = QStringList::split ("\n", pytext, TRUE);
+ QStringList::Iterator iter;
+ QString *line;
+ QString class_name, method_name, function_name, class_sig, method_sig,
+ function_sig;
+ PyBrowseNode *last_class_node = NULL;
+ PyBrowseNode *last_method_node = NULL;
+ PyBrowseNode *last_function_node = NULL;
+
+ QValueList < QString > open_nodes;
+ getOpenNodes (&open_nodes, class_root);
+ getOpenNodes (&open_nodes, function_root);
+
+
+ int line_no, state = 0;
+
+ if (class_root != NULL)
+ {
+ delete class_root;
+ }
+ if (function_root != NULL)
+ {
+ delete function_root;
+ }
+ class_root =
+ new PyBrowseNode (this, QString ("Classes"), i18n("Classes"),
+ PYOTHER);
+ class_root->setPixmap (0, QPixmap (container_xpm));
+ function_root =
+ new PyBrowseNode (this, QString ("Globals"), i18n("Globals"),
+ PYOTHER);
+ function_root->setPixmap (0, QPixmap (container_xpm));
+ node_dict.insert (class_root->getQualifiedName (), class_root);
+ node_dict.insert (function_root->getQualifiedName (), function_root);
+
+
+ line_no = 0;
+
+ for (iter = lines.begin(); iter != lines.end(); ++iter)
+ {
+ line_no++;
+ line = &(*iter);
+ if (class_rx.search(*line) >= 0)
+ {
+ //KMessageBox::information(this, *line, QString("Found class on line %1").arg(line_no));
+ //strip out the beginning class and ending colon
+ class_sig = line->stripWhiteSpace ().mid (6);
+ class_sig = class_sig.left (class_sig.length () - 1);
+ paren_i = class_sig.find ("(");
+ class_name = class_sig.left (paren_i);
+
+ last_class_node =
+ new PyBrowseNode (class_root, class_name, class_sig, PYCLASS);
+ last_class_node->setLine (line_no);
+ last_class_node->setClass (class_name);
+ node_dict.insert (last_class_node->getQualifiedName (),
+ last_class_node);
+ state = 1;
+ }
+ if ((method_rx.search(*line) >= 0) && (state == 1))
+ {
+ //strip off the leading def and the ending colon
+ method_sig = line->stripWhiteSpace ().mid (4);
+ method_sig = method_sig.left (method_sig.find (":"));
+ paren_i = method_sig.find ("(");
+ method_name = method_sig.left (paren_i);
+ last_method_node =
+ new PyBrowseNode (last_class_node, method_name, method_sig,
+ PYMETHOD);
+ last_method_node->setLine (line_no);
+ last_method_node->setClass (last_class_node->getClass ());
+ node_dict.insert (last_method_node->getQualifiedName (),
+ last_method_node);
+ }
+ if ((function_rx.search(*line) >= 0))
+ {
+ //KMessageBox::information(this, *line, QString("Found function on line %1").arg(line_no));
+ function_sig = line->stripWhiteSpace ().mid (4);
+ function_sig = function_sig.left (function_sig.find (":"));
+ paren_i = function_sig.find ("(");
+ function_name = function_sig.left (paren_i);
+ last_function_node =
+ new PyBrowseNode (function_root, function_name, function_sig,
+ PYFUNCTION);
+ last_function_node->setLine (line_no);
+ node_dict.insert (last_function_node->getQualifiedName (),
+ last_function_node);
+ state = 0;
+ }
+ }
+
+ //now go through the list of old open nodes and open them in the new
+ //tree. For each node name in the open_nodes list, attempt to find that
+ //node and in the new dict and open it.
+ QValueList<QString>::iterator it;
+ PyBrowseNode *tmp_node;
+ for (it=open_nodes.begin(); it != open_nodes.end(); ++it)
+ {
+ tmp_node = node_dict[(*it)];
+ if (tmp_node)
+ {
+ tmp_node->setOpen(1);
+ }
+ }
+
+}
+
+
+void
+KPyBrowser::tip (const QPoint & p, QRect & r, QString & str)
+{
+ QListViewItem *item = (QListViewItem *) itemAt (p);
+ if (item == NULL)
+ {
+ str = "";
+ return;
+ }
+ r = itemRect (item);
+ //r.setY(r.y() + 10);
+
+ PyBrowseNode *browse_node = dynamic_cast < PyBrowseNode * >(item);
+
+ if (browse_node)
+ {
+ if (r.isValid ())
+ str = browse_node->getSig ();
+ else
+ str = "";
+ }
+ else
+ {
+ str = item->text (0);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////
+// KateFileList::KFLToolTip implementation
+
+KPyBrowser::KPBToolTip::KPBToolTip (QWidget * parent):QToolTip (parent)
+{
+}
+
+void
+KPyBrowser::KPBToolTip::maybeTip (const QPoint & p)
+{
+ QString str;
+ QRect r;
+
+ ((KPyBrowser *) parentWidget ())->tip (p, r, str);
+
+ if (!str.isEmpty () && r.isValid ())
+ tip (r, str);
+}