Index: code/branches/presentation3/data/gui/scripts/QuestGUI.lua
===================================================================
--- code/branches/presentation3/data/gui/scripts/QuestGUI.lua	(revision 6912)
+++ code/branches/presentation3/data/gui/scripts/QuestGUI.lua	(revision 7072)
@@ -3,16 +3,284 @@
 local P = createMenuSheet("QuestGUI")
 
-function P.show()
-    P.window:show() -- TODO: Do this through parent...
-    P.visible = true
-
+P.rootWindow = nil
+P.detailsWindows = {}
+P.quests = {}
+P.hints = {}
+P.player = nil
+
+-- design parameters
+P.indentWidth = 20
+P.scrollbarWidth = 13
+P.buttonHeight = 30
+P.titleHeight = 26
+P.borderWidth = 5
+
+function P.onShow()
+
+    local questsList = winMgr:getWindow("orxonox/QuestGUI/QuestsList")
+
+    P.player = orxonox.GUIManager:getInstance():getPlayer(P.name)
+    P.rootWindow = P.createQuestGUI();
+
+    questsList:addChildWindow(P.rootWindow)
+end
+
+function P.onHide()
+    P.cleanup()
+end
+
+function P.createQuestGUI()
     local questManager = orxonox.QuestManager:getInstance()
 
-    local questsList = winMgr:getWindow("orxonox/QuestGUI/QuestsList")
-
-    local window = questManager:getQuestGUI(P.name)
-
-    questsList:addChildWindow(window)
-
+    local depth = 0
+    local index = 0
+
+    local questWindow = winMgr:createWindow("MenuWidgets/ScrollablePane", "orxonox/QuestGUI/Quests")
+    questWindow:setSize(CEGUI.UVector2(CEGUI.UDim(1, 0),CEGUI.UDim(1, 0)))
+
+    -- Iterate through all parent-quests.
+    local numParentQuests = orxonox.QuestManager:getInstance():getNumParentQuests(P.player)
+    local i = 0
+    while i <= numParentQuests-1 do
+        local quest = orxonox.QuestManager:getInstance():getParentQuest(P.player, i)
+        index = P.createQuestNodes(questWindow, quest, depth, index)
+        i = i+1
+    end
+
+    return questWindow
+end
+
+function P.createQuestNodes(root, parent, depth, index)
+    local number = table.getn(P.quests)+1
+    local name = "orxonox/QuestGUI/Quests/" .. number
+    local node = winMgr:createWindow("MenuWidgets/TabButton", name)
+    node:setText(orxonox.QuestManager:getInstance():getDescription(parent):getTitle())
+    node:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.indentWidth*depth), CEGUI.UDim(0, P.buttonHeight*index)))
+    node:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.indentWidth*depth-P.scrollbarWidth), CEGUI.UDim(0, P.buttonHeight)))
+    orxonox.GUIManager:subscribeEventHelper(node, "Clicked", P.name .. ".openDetails_clicked")
+    root:addChildWindow(node)
+    
+    table.insert(P.quests, parent)
+
+    index = index+1
+
+    -- Iterate through all sub-quests.
+    local numQuests = orxonox.QuestManager:getInstance():getNumSubQuests(parent, P.player)
+    local i = 0
+    while i <= numQuests-1 do
+        local quest = orxonox.QuestManager:getInstance():getSubQuest(parent, P.player, i)
+        index = P.createQuestNodes(root, quest, depth+1, index)
+        i = i+1
+    end
+
+    return index;
+end
+
+function P.cleanup()
+    winMgr:destroyWindow(P.rootWindow)
+    for k,v in pairs(P.detailsWindows) do
+        if v ~= nil then
+            winMgr:destroyWindow(v)
+            P.detailsWindows[k] = nil
+        end
+    end
+    P.detailsWindows = {}
+
+    P.quests = {}
+    P.hints = {}
+    P.player = nil
+
+    winMgr:destroyWindow(P.rootWindow)
+    P.rootWindow = nil
+end
+
+function P.openDetails_clicked(e)
+    --Get some numbers from the window
+    local we = CEGUI.toWindowEventArgs(e)
+    local name = we.window:getName()
+    local match = string.gmatch(name, "%d+")
+    local questNr = tonumber(match())
+
+    name = name .. "/Details" .. P.getNewDetailNumber()
+    quest = P.quests[questNr]
+
+    local details = winMgr:createWindow("MenuWidgets/FrameWindow", name)
+    details:setSize(CEGUI.UVector2(CEGUI.UDim(0.7, 0), CEGUI.UDim(0.7, 0)))
+    details:setPosition(CEGUI.UVector2(CEGUI.UDim(0.1, 0), CEGUI.UDim(0.1, 0)))
+    details:setText(orxonox.QuestManager:getInstance():getDescription(quest):getTitle())
+    details:setProperty("Alpha", 1.0)
+    details:setProperty("InheritsAlpha", "setFalse")
+    orxonox.GUIManager:subscribeEventHelper(details, "CloseClicked", P.name .. ".closeDetails_clicked")
+
+    table.insert(P.detailsWindows, details)
+
+    name = name .. "/Scrollable"
+    local window = winMgr:createWindow("MenuWidgets/ScrollablePane", name)
+    window:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -2*P.borderWidth),CEGUI.UDim(1.0, -P.titleHeight)))
+    window:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderWidth), CEGUI.UDim(0, P.titleHeight)))
+    details:addChildWindow(window)
+
+    local offset = 0
+
+    local status = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Status")
+    window:addChildWindow(status)
+    status:setProperty("HorzFormatting", "WordWrapLeftAligned")
+    status:setProperty("VertFormatting", "TopAligned")
+    if quest:isActive(P.player) then
+        status:setText("This quest is active.")
+    elseif quest:isCompleted(P.player) then
+        status:setText("This quest was completed.")
+    elseif quest:isFailed(P.player) then
+        status:setText("This quest was failed.")
+    end
+    status:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
+    status:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
+    local height = getStaticTextWindowHeight(status)
+    status:setHeight(CEGUI.UDim(0, height))
+    offset = offset + height
+
+    local descriptionTitle = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description/Title");
+    window:addChildWindow(descriptionTitle)
+    descriptionTitle:setProperty("HorzFormatting", "HorzCentred")
+    descriptionTitle:setProperty("VertFormatting", "TopAligned")
+    descriptionTitle:setText("Description:")
+    descriptionTitle:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
+    descriptionTitle:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
+    height = getStaticTextWindowHeight(descriptionTitle)
+    descriptionTitle:setHeight(CEGUI.UDim(0, height))
+    offset = offset + height
+
+    local description = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description");
+    window:addChildWindow(description)
+    description:setProperty("HorzFormatting", "WordWrapLeftAligned")
+    description:setProperty("VertFormatting", "TopAligned")
+    description:setText(orxonox.QuestManager:getInstance():getDescription(quest):getDescription())
+    description:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
+    description:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
+    height = getStaticTextWindowHeight(description)
+    description:setHeight(CEGUI.UDim(0, height))
+    offset = offset + height
+
+    -- Display the hints of this quest
+    local numHints = orxonox.QuestManager:getInstance():getNumHints(quest, P.player)
+    if numHints > 0 then
+        local hintsTitle = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Hints/Title");
+        window:addChildWindow(hintsTitle)
+        hintsTitle:setProperty("HorzFormatting", "HorzCentred")
+        hintsTitle:setProperty("VertFormatting", "TopAligned")
+        hintsTitle:setText("Hints:")
+        hintsTitle:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
+        hintsTitle:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
+        height = getStaticTextWindowHeight(hintsTitle)
+        hintsTitle:setHeight(CEGUI.UDim(0, height))
+        offset = offset + height
+    end
+    local i = 0
+    while i <= numHints-1 do
+        local hint = orxonox.QuestManager:getInstance():getHints(quest, P.player, i)
+        table.insert(P.hints, hint)
+        local number = table.getn(P.hints)
+        local node = winMgr:createWindow("MenuWidgets/TabButton", name .. "/Hints" .. number)
+        node:setText(orxonox.QuestManager:getInstance():getDescription(hint):getTitle())
+        node:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
+        node:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.scrollbarWidth), CEGUI.UDim(0, P.buttonHeight)))
+        window:addChildWindow(node)
+        offset = offset + P.buttonHeight
+
+        orxonox.GUIManager:subscribeEventHelper(node, "Clicked", P.name .. ".openHintDetails_clicked")
+        i = i+1
+    end
+
+    local window = winMgr:getWindow("orxonox/QuestGUI/Background")
+    window:addChildWindow(details)
+end
+
+function P.getNewDetailNumber()
+    local number = table.getn(P.detailsWindows)
+    for k,v in pairs(P.detailsWindows) do
+        if v == nil then
+            number = k-1
+        end
+    end
+    return number+1
+end
+
+function P.closeDetails_clicked(e)
+    local we = CEGUI.toWindowEventArgs(e)
+    local name = we.window:getName()
+    local match = string.gmatch(name, "%d+")
+    match()
+    local detailsNr = tonumber(match())
+
+    winMgr:destroyWindow(P.detailsWindows[detailsNr])
+    P.detailsWindows[detailsNr] = nil
+end
+
+function P.openHintDetails_clicked(e)
+    --Get some numbers from the window
+    local we = CEGUI.toWindowEventArgs(e)
+    local name = we.window:getName()
+    local match = string.gmatch(name, "%d+")
+    match()
+    match()
+    local hintNr = tonumber(match())
+
+    name = name .. "/Details" .. P.getNewDetailNumber()
+    hint = P.hints[hintNr]
+
+    local details = winMgr:createWindow("MenuWidgets/FrameWindow", name)
+    details:setSize(CEGUI.UVector2(CEGUI.UDim(0.7, 0), CEGUI.UDim(0.7, 0)))
+    details:setPosition(CEGUI.UVector2(CEGUI.UDim(0.1, 0), CEGUI.UDim(0.1, 0)))
+    details:setText(orxonox.QuestManager:getInstance():getDescription(hint):getTitle())
+    details:setProperty("Alpha", 1.0)
+    details:setProperty("InheritsAlpha", "setFalse")
+    orxonox.GUIManager:subscribeEventHelper(details, "CloseClicked", P.name .. ".closeHintDetails_clicked")
+
+    table.insert(P.detailsWindows, details)
+
+    name = name .. "/Scrollable"
+    local window = winMgr:createWindow("MenuWidgets/ScrollablePane", name)
+    window:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -2*P.borderWidth),CEGUI.UDim(1.0, -P.titleHeight)))
+    window:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderWidth), CEGUI.UDim(0, P.titleHeight)))
+    details:addChildWindow(window)
+
+    local offset = 0
+    
+    local descriptionTitle = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description/Title");
+    window:addChildWindow(descriptionTitle)
+    descriptionTitle:setProperty("HorzFormatting", "HorzCentred")
+    descriptionTitle:setProperty("VertFormatting", "TopAligned")
+    descriptionTitle:setText("Description:")
+    descriptionTitle:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
+    descriptionTitle:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
+    height = getStaticTextWindowHeight(descriptionTitle)
+    descriptionTitle:setHeight(CEGUI.UDim(0, height))
+    offset = offset + height
+
+    local description = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description");
+    window:addChildWindow(description)
+    description:setProperty("HorzFormatting", "WordWrapLeftAligned")
+    description:setProperty("VertFormatting", "TopAligned")
+    description:setText(orxonox.QuestManager:getInstance():getDescription(hint):getDescription())
+    description:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
+    description:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
+    height = getStaticTextWindowHeight(description)
+    description:setHeight(CEGUI.UDim(0, height))
+
+    local window = winMgr:getWindow("orxonox/QuestGUI/Background")
+    window:addChildWindow(details)
+end
+
+function P.closeHintDetails_clicked(e)
+    local we = CEGUI.toWindowEventArgs(e)
+    local name = we.window:getName()
+    local match = string.gmatch(name, "%d+")
+    match()
+    match()
+    match()
+    local detailsNr = tonumber(match())
+
+    winMgr:destroyWindow(P.detailsWindows[detailsNr])
+    P.detailsWindows[detailsNr] = nil
 end
 
