packages feed

manatee-terminal-0.0.8: Manatee/Extension/Terminal/TerminalView.hs

-- Author:     Andy Stewart <lazycat.manatee@gmail.com>
-- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
-- 
-- Copyright (C) 2010 Andy Stewart, all rights reserved.
-- 
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- any later version.
-- 
-- 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, see <http://www.gnu.org/licenses/>.

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveDataTypeable #-}
module Manatee.Extension.Terminal.TerminalView where

import Control.Applicative
import Control.Concurrent.STM 
import Data.Map (Map)
import Data.Text.Lazy (Text)
import Data.Typeable
import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)
import Graphics.UI.Gtk.Gdk.SerializedEvent
import Graphics.UI.Gtk.Vte.Vte
import Manatee.Core.DBus
import Manatee.Core.PageFrame
import Manatee.Core.PageView
import Manatee.Core.Types
import Manatee.Extension.Terminal.TerminalBuffer
import Manatee.Toolkit.Gtk.Gtk
import Paths_manatee_terminal
import System.FilePath

import qualified Data.Map as M

data TerminalView =
    TerminalView {terminalViewPlugId               :: TVar PagePlugId
                 ,terminalViewFrame                :: PageFrame
                 ,terminalViewView                 :: Terminal
                 ,terminalViewBuffer               :: TerminalBuffer
                 }
    deriving Typeable

instance PageBuffer TerminalBuffer where
  pageBufferGetName             = readTVarIO . terminalBufferDirectory
  pageBufferSetName _ _         = return ()
  pageBufferClient              = terminalBufferClient
  pageBufferCreateView a pId    = PageViewWrap <$> terminalViewNew a pId
  pageBufferMode                = terminalBufferMode
  pageBufferPackageName _       = fmap takeFileName getDataDir

instance PageView TerminalView where
    pageViewBuffer              = PageBufferWrap . terminalViewBuffer
    pageViewPlugId              = terminalViewPlugId
    pageViewBox                 = pageFrameBox . terminalViewFrame
    pageViewScrolledWindow      = terminalViewScrolledWindow
    pageViewFocus               = widgetGrabFocus . terminalViewView
    pageViewCopy                = terminalViewCopy
    pageViewPaste               = terminalViewPaste
    pageViewHandleKeyAction     = terminalViewHandleKeyAction

-- | New terminal view.
terminalViewNew :: TerminalBuffer -> PagePlugId -> IO TerminalView
terminalViewNew buffer plugId = do
  -- Create UI frame.
  pFrame <- pageFrameNewWithModeName (pageModeName $ terminalBufferMode buffer)
  
  -- Create view.
  terminal <- terminalNew
  terminalForkCommand terminal Nothing Nothing Nothing Nothing False False False
  pageFrameAddChild pFrame terminal
  pId <- newTVarIO plugId
  let terminalView = TerminalView pId pFrame terminal buffer 

  -- Send `RenderProcessExit` signal when exit current temrinal.
  terminal `on` childExited $ 
    mkDaemonSignal (pageViewClient terminalView) RenderProcessExit (RenderProcessExitArgs (terminalBufferPageId buffer))

  -- Return view.
  return terminalView

-- | Handle key action.
terminalViewHandleKeyAction :: TerminalView -> Text -> SerializedEvent -> IO ()
terminalViewHandleKeyAction view keystoke sEvent = 
  case M.lookup keystoke terminalViewKeymap of
    Just action -> action view
    Nothing -> widgetPropagateEvent (terminalViewView view) sEvent

-- | Keymap.
terminalViewKeymap :: Map Text (TerminalView -> IO ())
terminalViewKeymap = 
  M.fromList []

-- | Terminal view copy.
terminalViewCopy :: TerminalView -> IO Bool
terminalViewCopy view = do
  terminalCopyClipboard (terminalViewView view)
  return True

-- | Terminal view paste.
terminalViewPaste :: TerminalView -> IO Bool
terminalViewPaste view = do
  terminalPasteClipboard (terminalViewView view)
  return True

-- | Scrolled window.
terminalViewScrolledWindow :: TerminalView -> ScrolledWindow  
terminalViewScrolledWindow =
    pageFrameScrolledWindow . terminalViewFrame