--
-- Copyright (c) Krasimir Angelov 2008.
--
-- GTK implementation for "Project View".
-- It uses the Shim.ProjectContent extraction
-- algorithm.
--

module Yi.UI.Pango.ProjectTree
         ( projectTreeNew
         , loadProjectTree
         ) where

import Data.Tree
import Shim.ProjectContent
import qualified Graphics.UI.Gtk.ModelView as MView
import qualified Graphics.UI.Gtk as Gtk
import Graphics.UI.Gtk.Gdk.Pixbuf (Pixbuf)
import Graphics.UI.Gtk.ModelView.TreeView ( treeViewHeadersVisible
                                          , onRowActivated
                                          )
import System.Glib.Attributes
import Yi.Keymap
import Yi.Dired
import Yi.UI.Pango.Utils

projectTreeNew :: (Action -> IO ()) -> Gtk.TreeStore ProjectItem -> IO Gtk.TreeView
projectTreeNew post store = do
  projectTree <- MView.treeViewNewWithModel store
  set projectTree [treeViewHeadersVisible := False]

  col1 <- MView.treeViewColumnNew
  col2 <- MView.treeViewColumnNew

  renderer1 <- MView.cellRendererPixbufNew
  renderer2 <- MView.cellRendererTextNew

  MView.cellLayoutPackStart col1 renderer1 True 
  MView.cellLayoutPackStart col2 renderer2 True

  icoProject          <- loadIcon "project.png"
  icoDependencies     <- loadIcon "dependencies.png"
  icoPlainFolder      <- loadIcon "plain-folder.png"
  icoHsSourceFolder   <- loadIcon "hs-source-folder.png"
  icoExposedModule    <- loadIcon "exposed-module.png"
  icoHiddenModule     <- loadIcon "hidden-module.png"
  icoExposedFileModule<- loadIcon "exposed-file-module.png"
  icoHiddenFileModule <- loadIcon "hidden-file-module.png"
  icoCSource          <- loadIcon "c-source.png"
  icoHSource          <- loadIcon "h-source.png"
  icoTextFile         <- loadIcon "text-file.png"
  icoLicenseFile      <- loadIcon "license-file.png"
  icoPackage          <- loadIcon "package.png"
  icoSetupScript      <- loadIcon "setup-script.png"
  let icos = Icons icoProject
                   icoDependencies
                   icoPlainFolder
                   icoHsSourceFolder
                   icoExposedModule
                   icoHiddenModule
                   icoExposedFileModule
                   icoHiddenFileModule
                   icoCSource
                   icoHSource
                   icoTextFile
                   icoLicenseFile
                   icoPackage
                   icoSetupScript

  MView.cellLayoutSetAttributes col1 renderer1 store $ \row -> [MView.cellPixbuf := itemIcon icos row]
  MView.cellLayoutSetAttributes col2 renderer2 store $ \row -> [MView.cellText   := itemName row]

  MView.treeViewAppendColumn projectTree col1
  MView.treeViewAppendColumn projectTree col2
  
  onRowActivated projectTree $ \path _col -> do
    item <- MView.treeStoreGetValue store path
    case item of
      FileItem  {itemFPath=path} -> post (makeAction (fnewE path))
      ModuleItem{itemFPath=path} -> post (makeAction (fnewE path))
      _                          -> return ()

  return projectTree

loadProjectTree :: Gtk.TreeStore a -> Tree a -> IO ()
loadProjectTree projectStore tree = do
  MView.treeStoreClear projectStore
  MView.treeStoreInsertTree projectStore [] 0 tree

data Icons
  = Icons
      { icoProject          :: Pixbuf
      , icoDependencies     :: Pixbuf
      , icoPlainFolder      :: Pixbuf
      , icoHsSourceFolder   :: Pixbuf
      , icoExposedModule    :: Pixbuf
      , icoHiddenModule     :: Pixbuf
      , icoExposedFileModule:: Pixbuf
      , icoHiddenFileModule :: Pixbuf
      , icoCSource          :: Pixbuf
      , icoHSource          :: Pixbuf
      , icoTextFile         :: Pixbuf
      , icoLicenseFile      :: Pixbuf
      , icoPackage          :: Pixbuf
      , icoSetupScript      :: Pixbuf
      }

itemIcon icos (ProjectItem{})              = icoProject      icos
itemIcon icos (DependenciesItem{})         = icoDependencies icos
itemIcon icos (FolderItem{folderKind=kind})= folderIcon      icos kind
itemIcon icos (FileItem{fileKind=kind})    = fileIcon        icos kind
itemIcon icos (ModuleItem{moduleKind=kind})= moduleIcon      icos kind icoExposedModule icoHiddenModule
itemIcon icos (PackageItem{})              = icoPackage      icos

fileIcon icos (HsSource kind) = moduleIcon        icos kind icoExposedFileModule icoHiddenFileModule
fileIcon icos CSource         = icoCSource        icos
fileIcon icos HSource         = icoHSource        icos
fileIcon icos TextFile        = icoTextFile       icos
fileIcon icos SetupScript     = icoSetupScript    icos
fileIcon icos LicenseText     = icoLicenseFile    icos

folderIcon icos HsSourceFolder  = icoHsSourceFolder icos
folderIcon icos PlainFolder     = icoPlainFolder    icos

moduleIcon icos ExposedModule icoE _    = icoE icos
moduleIcon icos HiddenModule  _    icoH = icoH icos