ndn: Add GUI

Change-Id: I7336bbb04121166d064b76cbad9f760c3dd16c2d
diff --git a/ndn/gui.py b/ndn/gui.py
new file mode 100644
index 0000000..c4097e4
--- /dev/null
+++ b/ndn/gui.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+
+from Tkinter import *
+
+LOG_LEVELS = [
+    "NONE",
+    "ERROR",
+    "WARN",
+    "INFO",
+    "DEBUG",
+    "TRACE",
+    "ALL"
+]
+
+class GuiFrame(Frame):
+    def __init__(self, notebook):
+        Frame.__init__(self, notebook)
+
+        self.row = 0
+        self.column = 0
+
+    def addEntryBox(self, label, variable, defaultValue=""):
+        variable.set(defaultValue)
+
+        Label(self, text=label).grid(row=self.row, sticky=E)
+        entry = Entry(self, textvariable=variable)
+        entry.grid(row=self.row, column=1)
+
+        self.row += 1
+
+    def addDropDown(self, label, variable, values, defaultValue=""):
+        variable.set(defaultValue)
+
+        Label(self, text=label).grid(row=self.row, sticky=E)
+
+        self.entry = apply(OptionMenu, (self, variable) + tuple(values))
+        self.entry.grid(row=self.row, column=1)
+
+        self.row += 1
+
+class NfdFrame(GuiFrame):
+    def __init__(self, notebook):
+        GuiFrame.__init__(self, notebook)
+
+        self.frameLabel = "NFD"
+
+        # log-level
+        self.logLevel = StringVar(self)
+        self.addDropDown("Log level:", self.logLevel, LOG_LEVELS, LOG_LEVELS[3])
+
+class NlsrFrame(GuiFrame):
+
+    HYPERBOLIC_STATES = [
+        "off",
+        "on",
+        "dry-run"
+    ]
+
+    def __init__(self, notebook):
+        GuiFrame.__init__(self, notebook)
+
+        self.frameLabel = "NLSR"
+
+        # general: network
+        self.network = StringVar(self)
+        self.addEntryBox("Network:", self.network, "/ndn/")
+
+        # general: site
+        self.site = StringVar(self)
+        self.addEntryBox("Site:", self.site, "/edu/site")
+
+        # general: router
+        self.router = StringVar(self)
+        self.addEntryBox("Router:", self.router, "/%C1.Router/cs/host")
+
+        # general: log-level
+        self.logLevel = StringVar(self)
+        self.addDropDown("Log level:", self.logLevel, LOG_LEVELS, LOG_LEVELS[3])
+
+        # hyperbolic: state
+        self.hyperbolicState = StringVar(self)
+        self.addDropDown("Hyperbolic routing:", self.hyperbolicState,
+                         self.HYPERBOLIC_STATES, self.HYPERBOLIC_STATES[0])
+
+        # hyperbolic: angle
+        self.angle = StringVar(self)
+        self.addEntryBox("Angle:", self.angle, "0.0")
+
+        # hyperbolic: radius
+        self.radius = StringVar(self)
+        self.addEntryBox("Radius:", self.radius, "0.0")
+
+        # fib: max-faces-per-prefix
+        self.maxFaces = StringVar(self)
+        self.addEntryBox("Max faces per prefix:", self.maxFaces, "0")
+
+
+    def getValues(self):
+        return {
+            "network": self.network.get(),
+            "site": self.site.get(),
+            "router": self.router.get(),
+            "log-level": self.logLevel.get(),
+            "hyperbolic-state": self.hyperbolicState.get(),
+            "angle": self.angle.get(),
+            "radius": self.radius.get(),
+            "max-faces-per-prefix": self.maxFaces.get()
+        }
+