hxournal-0.6.6: lib/Application/HXournal/ModelAction/File.hs
{-# LANGUAGE OverloadedStrings, CPP, GADTs #-}
-----------------------------------------------------------------------------
-- |
-- Module : Application.HXournal.ModelAction.File
-- Copyright : (c) 2011, 2012 Ian-Woo Kim
--
-- License : BSD3
-- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>
-- Stability : experimental
-- Portability : GHC
--
-----------------------------------------------------------------------------
module Application.HXournal.ModelAction.File where
import Application.HXournal.Type.XournalState
import qualified Text.Xournal.Parse.Enumerator as PE
import Data.Maybe
import Control.Monad
import Control.Category
import Data.Label
import Prelude hiding ((.),id)
import Data.Xournal.Simple
import Graphics.Xournal.Render.BBoxMapPDF
import Graphics.Xournal.Render.PDFBackground
import Graphics.UI.Gtk hiding (get,set)
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C
#ifdef POPPLER
import qualified Graphics.UI.Gtk.Poppler.Document as Poppler
import qualified Graphics.UI.Gtk.Poppler.Page as PopplerPage
#endif
-- | get file content from xournal file and update xournal state
getFileContent :: Maybe FilePath
-> HXournalState
-> IO HXournalState
getFileContent (Just fname) xstate = do
-- xojcontent <- P.read_xournal fname
PE.parseXojFile fname >>= \x -> case x of
Left str -> do
putStrLn $ "file reading error : " ++ str
return xstate
Right xojcontent -> do
nxstate <- constructNewHXournalStateFromXournal xojcontent xstate
return $ set currFileName (Just fname) nxstate
getFileContent Nothing xstate = do
newxoj <- mkTXournalBBoxMapPDFBufFromNoBuf <=< mkTXournalBBoxMapPDF
$ defaultXournal
let newxojstate = ViewAppendState newxoj
xstate' = set currFileName Nothing
. set xournalstate newxojstate
$ xstate
return xstate'
-- |
constructNewHXournalStateFromXournal :: Xournal -> HXournalState -> IO HXournalState
constructNewHXournalStateFromXournal xoj' xstate = do
xoj <- mkTXournalBBoxMapPDFBufFromNoBuf <=< mkTXournalBBoxMapPDF $ xoj'
let startingxojstate = ViewAppendState xoj
return $ set xournalstate startingxojstate xstate
-- |
makeNewXojWithPDF :: FilePath -> IO (Maybe Xournal)
makeNewXojWithPDF fp = do
#ifdef POPPLER
let fname = C.pack fp
mdoc <- popplerGetDocFromFile fname
case mdoc of
Nothing -> do
putStrLn $ "no such file " ++ fp
return Nothing
Just doc -> do
n <- Poppler.documentGetNPages doc
pg <- Poppler.documentGetPage doc 0
(w,h) <- PopplerPage.pageGetSize pg
let dim = Dim w h
xoj = set s_title fname
. set s_pages (map (createPage dim fname) [1..n])
$ emptyXournal
return (Just xoj)
#else
error "makeNewXojWithPDF should not be used without poppler lib"
#endif
-- |
createPage :: Dimension -> B.ByteString -> Int -> Page
createPage dim fn n
| n == 1 = let bkg = BackgroundPdf "pdf" (Just "absolute") (Just fn ) n
in Page dim bkg [emptyLayer]
| otherwise = let bkg = BackgroundPdf "pdf" Nothing Nothing n
in Page dim bkg [emptyLayer]
-- |
toggleSave :: UIManager -> Bool -> IO ()
toggleSave ui b = do
agr <- uiManagerGetActionGroups ui >>= \x ->
case x of
[] -> error "No action group?"
y:_ -> return y
Just savea <- actionGroupGetAction agr "SAVEA"
actionSetSensitive savea b