{-|
    Initialises and shows the file manager.
-}

import Control.Monad( forM_ )
import Control.Concurrent
import Graphics.UI.Gtk
import Buttons
import Components
import DirectoryOperations
import DirectoryTree
import Menu
import Popup
import TreeFunctions
import TreeViewOperations
import Types
import Browser

{-|
    Function to build the GUI.
-}

main :: IO( )
main = do
    --Initialise windows
    initGUI
    windowNew >>= ( \m -> do
    onDestroy m mainQuit

    --Create containers for components
    vBoxNew False 4 >>= ( \v -> do
    browservbox <- vBoxNew False 3
    labelsearchbox <- hBoxNew False 3
    locationbarbox <- hBoxNew False 3
    viewbrowser <- hBoxNew False 2
    filesystem <- hBoxNew False 0

    createFileBrowser >>= ( \b -> do
    buttonsToolbar <- toolbarNew
    tooltips <- tooltipsNew
    toolbarSetTooltips buttonsToolbar True
    sep1 <- separatorToolItemNew
    sep2 <- separatorToolItemNew
    menuBar <- ( menu b m )
    contextMenu b ( fileTree b )
    contextMenu b ( dirTree b )
    --Map tooltips to buttons with separator in between
    [ deletebutton, movebutton, copybutton, renamebutton ] 
        <- mapM ( toolButton tooltips buttonsToolbar ) operationButtons
    toolbarInsert buttonsToolbar sep2 ( -1 )
    [ homebutton, documentsbutton, upbutton, refreshbutton ]
        <- mapM ( toolButton tooltips buttonsToolbar ) browseButtons
    toolbarInsert buttonsToolbar sep1 ( -1 )
    [ aboutbutton, closebutton ]
        <- mapM ( toolButton tooltips buttonsToolbar ) programButtons
            
    --Create search area
    searchbox <- entryNew
    entrySetText searchbox "Search"
    searchlabel <- imageNewFromFile =<< iconpath searchButton
    searchbutton <- buttonNew
    tooltipsSetTip tooltips searchbutton "Search directory for Regex expression" []
    containerAdd searchbutton searchlabel

    --Add button "listeners"
    searchbutton `onClicked` ( searchDir searchbox b )
    searchbox `onEntryActivate` ( searchDir searchbox b )
    ( location b ) `onEntryActivate` ( entryGetText ( location b ) >>= (\l -> refreshBrowser l b ) )
    closebutton `onToolButtonClicked` ( widgetDestroy m )
    deletebutton `onToolButtonClicked` ( operateSelection deleteFolder deleteFile b )
    movebutton `onToolButtonClicked` ( operateSelection moveFolder moveFile b )
    copybutton `onToolButtonClicked` ( operateSelection copyFolder copyFile b )
    renamebutton `onToolButtonClicked` ( operateSelection renameFolder renameFile b )
    aboutbutton `onToolButtonClicked` ( aboutHaskellFM )
    homebutton `onToolButtonClicked` ( getHomeFolder >>= ( \h -> refreshBrowser h b ) )
    documentsbutton `onToolButtonClicked` ( getDocumentsFolder >>= ( \d -> refreshBrowser d b ) )
    refreshbutton `onToolButtonClicked` ( refreshView b )
    upbutton `onToolButtonClicked` ( upDirectory b )
    ( dirTree b ) `onCursorChanged` ( toggleButtonSetActive ( switch b ) True )
    ( fileTree b ) `onCursorChanged` ( toggleButtonSetActive ( switch b ) False )
    ( fileTree b ) `onRowActivated` ( \tp _-> openSelection b )
    ( dirTree b ) `onRowActivated` ( \tp _-> openDirectory b )
    ( treeTree b ) `onRowActivated` ( \tp _-> ( getPathAtActivation tp ( treeStore b ) ) >>= (\p -> refreshBrowser p b ) )
    ( treeTree b ) `onRowExpanded` ( \_ tp-> addSubTree tp ( treeStore b ) )

    --Set separators drawn
    forM_ [sep1,sep2] $ \sep -> separatorToolItemSetDraw sep True

    --Pack components
    forM_ [ treeScroll b, dirScroll b, fileScroll b] $ \scrol -> 
        boxPackStart viewbrowser scrol PackGrow 0
    boxPackStart browservbox buttonsToolbar PackNatural 0
    boxPackStart v menuBar PackNatural 0
    boxPackStart v browservbox PackGrow 0
    boxPackStart locationbarbox ( location b ) PackGrow 0
    boxPackEnd labelsearchbox searchbutton PackNatural 0
    boxPackEnd labelsearchbox searchbox PackNatural 0
    boxPackStart locationbarbox labelsearchbox PackNatural 0        
    boxPackStart browservbox locationbarbox PackNatural 0
    boxPackStart browservbox viewbrowser PackGrow 0 )

    --Config window
    set m [ windowTitle := "HaskellFM",
           windowDefaultWidth := 900,
           windowDefaultHeight := 700,
           containerChild := v,
           containerBorderWidth := 5 ]

    --Display window
    widgetShowAll m
    mainGUI ) )
