summaryrefslogtreecommitdiff
path: root/objects/rtfl_objview.cc
diff options
context:
space:
mode:
Diffstat (limited to 'objects/rtfl_objview.cc')
-rw-r--r--objects/rtfl_objview.cc218
1 files changed, 218 insertions, 0 deletions
diff --git a/objects/rtfl_objview.cc b/objects/rtfl_objview.cc
new file mode 100644
index 0000000..bed41bd
--- /dev/null
+++ b/objects/rtfl_objview.cc
@@ -0,0 +1,218 @@
+/*
+ * RTFL
+ *
+ * Copyright 2013-2015 Sebastian Geerken <sgeerken@dillo.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 3 of the License, or
+ * (at your option) any later version; with the following exception:
+ *
+ * The copyright holders of RTFL give you permission to link this file
+ * statically or dynamically against all versions of the graphviz
+ * library, which are published by AT&T Corp. under one of the following
+ * licenses:
+ *
+ * - Common Public License version 1.0 as published by International
+ * Business Machines Corporation (IBM), or
+ * - Eclipse Public License version 1.0 as published by the Eclipse
+ * Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <unistd.h>
+#include <FL/Fl.H>
+#include "common/fltk_lines.hh"
+#include "objview_window.hh"
+#include "objview_controller.hh"
+#include "objdelete_controller.hh"
+#include "objident_controller.hh"
+
+using namespace rtfl::objects;
+using namespace rtfl::common;
+
+static void printHelp (const char *argv0)
+{
+ fprintf
+ (stderr, "Usage: %s <options>\n"
+ "\n"
+ "Options:\n"
+ " -a <aspect> Show,\n"
+ " -A <aspect> hide aspects. <aspect> may be '*'.\n"
+ " -b Do,\n"
+ " -B do not apply \".rtfl\" and filtering identities "
+ "(what \n"
+ " \"rtfl-objbase\" does).\n"
+ " -m Show,\n"
+ " -M hide the messages of all object boxes.\n"
+ " -o Show,\n"
+ " -O hide the contents of all object boxes.\n"
+ " -p <prio> Set priority. <prio> is a number or '*'.\n"
+ " -t <types> Show,\n"
+ " -T <types> hide command types. <types> is a sequence of any "
+ "of the\n"
+ " characters 'c', 'i', 'm', 'a', 'f', 's', 't', "
+ "'d'.\n"
+ " -v <viewer> Use <viewer> to view code. Contains '%%p' as "
+ "variable for\n"
+ " the path, and '%%n' for the line number.\n"
+ "\n"
+ "See RTFL documentation for more details.\n",
+ argv0);
+}
+
+static bool toggleCommandTypes (ObjViewWindow *window, const char *arg,
+ bool val)
+{
+ for (const char *s = arg; *s; s++) {
+ switch (*s) {
+ case 'c':
+ window->showCreateCommands (val);
+ break;
+
+ case 'i':
+ window->showIndentCommands (val);
+ break;
+
+ case 'm':
+ window->showMessageCommands (val);
+ break;
+
+ case 'a':
+ window->showMarkCommands (val);
+ break;
+
+ case 'f':
+ window->showFunctionCommands (val);
+ break;
+
+ case 's':
+ window->showAssocCommands (val);
+ break;
+
+ case 't':
+ window->showAddAttrCommands (val);
+ break;
+
+ case 'd':
+ window->showDeleteCommands (val);
+ break;
+
+ default:
+ return false;
+ }
+ }
+
+ return true;
+}
+
+int main(int argc, char **argv)
+{
+ ObjViewWindow *window = new ObjViewWindow(800, 600, "RTFL: Objects view");
+
+ int opt;
+ bool baseFiltering = true;
+
+ while ((opt = getopt(argc, argv, "a:A:bBMmOop:t:T:v:")) != -1) {
+ switch (opt) {
+ case 'a':
+ if (strcmp (optarg, "*") == 0)
+ window->setAspectsInitiallySet (true);
+ else
+ window->addAspect (optarg, true);
+ break;
+
+ case 'A':
+ if (strcmp (optarg, "*") == 0)
+ window->setAspectsInitiallySet (false);
+ else
+ window->addAspect (optarg, false);
+ break;
+
+ case 'b':
+ baseFiltering = true;
+ break;
+
+ case 'B':
+ baseFiltering = false;
+ break;
+
+ case 'm':
+ window->showObjectMessages (true);
+ break;
+
+ case 'M':
+ window->showObjectMessages (false);
+ break;
+
+ case 'o':
+ window->showObjectContents (true);
+ break;
+
+ case 'O':
+ window->showObjectContents (false);
+ break;
+
+ case 'p':
+ if (strcmp (optarg, "*") == 0)
+ window->setAnyPriority ();
+ else
+ window->setPriority (atoi (optarg));
+ break;
+
+ case 't':
+ if (!toggleCommandTypes (window, optarg, true)) {
+ printHelp (argv[0]);
+ delete window;
+ return 1;
+ }
+ break;
+
+ case 'T':
+ if (!toggleCommandTypes (window, optarg, false)) {
+ printHelp (argv[0]);
+ delete window;
+ return 1;
+ }
+ break;
+
+ case 'v':
+ window->setCodeViewer (optarg);
+ break;
+
+ default:
+ printHelp (argv[0]);
+ delete window;
+ return 1;
+ }
+ }
+
+ int errorCode;
+ ObjViewController viewController (window->getObjViewGraph ());
+
+ if (baseFiltering) {
+ FltkDefaultSource source;
+ ObjIdentController identController (&viewController);
+ ObjDeleteController deleteController (&identController);
+ ObjectsParser parser (&deleteController);
+ source.setup (&parser);
+ window->show();
+ errorCode = Fl::run();
+ } else {
+ FltkLinesSource source;
+ ObjectsParser parser (&viewController);
+ source.setup (&parser);
+ window->show();
+ errorCode = Fl::run();
+ }
+
+ delete window;
+ return errorCode;
+}