{--
HSFM, a filemanager written in Haskell.
Copyright (C) 2016 Julian Ospald

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software 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, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
--}

{-# OPTIONS_HADDOCK ignore-exports #-}

module HSFM.GUI.Gtk.Data where


import Control.Concurrent.MVar
  (
    MVar
  )
import Control.Concurrent.STM
  (
    TVar
  )
import Graphics.UI.Gtk hiding (MenuBar)
import HSFM.FileSystem.FileType
import HSFM.FileSystem.UtilTypes
import HSFM.History
import System.INotify
  (
    INotify
  )



    ------------------
    --[ Base Types ]--
    ------------------


-- |Monolithic object passed to various GUI functions in order
-- to keep the API stable and not alter the parameters too much.
-- This only holds GUI widgets that are needed to be read during
-- runtime.
data MyGUI = MkMyGUI {
  -- |main Window
    rootWin :: !Window

  -- widgets on the main window
  , menubar        :: !MenuBar
  , statusBar      :: !Statusbar
  , clearStatusBar :: !Button

  , notebook1      :: !Notebook
  , leftNbBtn      :: !ToggleButton
  , leftNbIcon     :: !Image

  , notebook2      :: !Notebook
  , rightNbBtn     :: !ToggleButton
  , rightNbIcon    :: !Image

  -- other
  , fprop    :: !FilePropertyGrid
  , settings :: !(TVar FMSettings)

  , operationBuffer :: !(TVar FileOperation)
}


-- |This describes the contents of the current view and is separated from MyGUI,
-- because we might want to have multiple views.
data MyView = MkMyView {
    view            :: !(TVar FMView)
  , cwd             :: !(MVar Item)
  , rawModel        :: !(TVar (ListStore Item))
  , sortedModel     :: !(TVar (TypedTreeModelSort Item))
  , filteredModel   :: !(TVar (TypedTreeModelFilter Item))
  , inotify         :: !(MVar INotify)
  , notebook        :: !Notebook -- current notebook

  -- the first part of the tuple represents the "go back"
  -- the second part the "go forth" in the history
  , history         :: !(MVar BrowsingHistory)

  -- sub-widgets
  , scroll       :: !ScrolledWindow
  , viewBox      :: !Box
  , backViewB    :: !Button
  , upViewB      :: !Button
  , forwardViewB :: !Button
  , homeViewB    :: !Button
  , refreshViewB :: !Button
  , urlBar       :: !Entry
}


data MenuBar = MkMenuBar {
    menubarFileQuit  :: !ImageMenuItem
  , menubarHelpAbout :: !ImageMenuItem
}

data RightClickMenu = MkRightClickMenu {
    rcMenu           :: !Menu
  , rcFileOpen       :: !ImageMenuItem
  , rcFileExecute    :: !ImageMenuItem
  , rcFileNewRegFile :: !ImageMenuItem
  , rcFileNewDir     :: !ImageMenuItem
  , rcFileNewTab     :: !ImageMenuItem
  , rcFileNewTerm    :: !ImageMenuItem
  , rcFileCut        :: !ImageMenuItem
  , rcFileCopy       :: !ImageMenuItem
  , rcFileRename     :: !ImageMenuItem
  , rcFilePaste      :: !ImageMenuItem
  , rcFileDelete     :: !ImageMenuItem
  , rcFileProperty   :: !ImageMenuItem
  , rcFileIconView   :: !ImageMenuItem
  , rcFileTreeView   :: !ImageMenuItem
}

data FilePropertyGrid = MkFilePropertyGrid {
    fpropGrid      :: !Grid
  , fpropFnEntry   :: !Entry
  , fpropLocEntry  :: !Entry
  , fpropTsEntry   :: !Entry
  , fpropModEntry  :: !Entry
  , fpropAcEntry   :: !Entry
  , fpropFTEntry   :: !Entry
  , fpropPermEntry :: !Entry
  , fpropLDEntry   :: !Entry
}


-- |FM-wide settings.
data FMSettings = MkFMSettings {
    showHidden :: !Bool
  , isLazy     :: !Bool
  , iconSize   :: !Int
}

data FMView = FMTreeView !TreeView
            | FMIconView !IconView

type Item = File FileInfo



fmViewToContainer :: FMView -> Container
fmViewToContainer (FMTreeView x) =  castToContainer . toGObject $ x
fmViewToContainer (FMIconView x) =  castToContainer . toGObject $ x