packages feed

phoityne-0.0.3.0: app/Phoityne/IO/GUI/GTK/Interface.hs

{-# LANGUAGE GADTs               #-}
{-# LANGUAGE LambdaCase          #-}
{-# LANGUAGE MultiWayIf          #-}
{-# LANGUAGE BinaryLiterals      #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DeriveDataTypeable  #-}

module Phoityne.IO.GUI.GTK.Interface (
  module Phoityne.IO.GUI.GTK.ConsoleView
, module Phoityne.IO.GUI.GTK.BindingTable
, module Phoityne.IO.GUI.GTK.BreakPointTable 
, module Phoityne.IO.GUI.GTK.TextEditor
, module Phoityne.IO.GUI.GTK.TraceTable
, module Phoityne.IO.GUI.GTK.FolderTree
, module Phoityne.IO.GUI.GTK.SearchResultTable

-- Main
, WidgetStore
, MainWindowCloseEventHandler
, MainWindowKeyPressEventHandler
, CallbackHandlerId
, getBuilder
, start
, setupMainWindow
, addCallback
, delCallback
, putStrStatusBar

-- ToolButton
, DebugStartBTClickedEventHandler
, DebugStopBTClickedEventHandler
, StepOverBTClickedEventHandler
, StepInBTClickedEventHandler
, BuildBTClickedEventHandler
, SaveBTClickedEventHandler
, IndentBTClickedEventHandler
, UnIndentBTClickedEventHandler
, CommentBTClickedEventHandler
, UnCommentBTClickedEventHandler
, setupToolButton
, changeTBsOnGHCiStartting
, changeTBsOnGHCiStarted
, changeTBsOnGHCiStopped
, changeTBsOnDebugStarted
, changeTBsOnDebugStopped
, changeTBsOnBuildStart
, changeTBsOnBuildFinish
, isDebugStart
, isBuildStart
, isGHCiStarted

-- Dialog
, getNameByFolderTreeDialog
, getSearchKeyBySearchDialog
, getSearchKeyFromSearchDialog
, getReplaceByReplaceDialog
, initSearchDialog
, initReplaceDialog
) where

-- モジュール
import Phoityne.IO.GUI.GTK.Constant
import Phoityne.IO.GUI.GTK.BreakPointTable
import Phoityne.IO.GUI.GTK.TextEditor
import Phoityne.IO.GUI.GTK.BindingTable
import Phoityne.IO.GUI.GTK.TraceTable
import Phoityne.IO.GUI.GTK.FolderTree
import Phoityne.IO.GUI.GTK.SearchResultTable
import Phoityne.IO.GUI.GTK.ConsoleView

-- システム
import Paths_phoityne
import Data.Maybe
import Control.Monad.IO.Class
import Graphics.UI.Gtk
import qualified Data.Text as T

-- |
--
--
type WidgetStore = Builder

type DebugStartBTClickedEventHandler = IO ()

type DebugStopBTClickedEventHandler = IO ()

type StepOverBTClickedEventHandler = IO ()

type StepInBTClickedEventHandler = IO ()

type ContinueBTClickedEventHandler = IO ()

type BuildBTClickedEventHandler = IO ()

type SaveBTClickedEventHandler = IO ()

type IndentBTClickedEventHandler = IO ()

type UnIndentBTClickedEventHandler = IO ()

type CommentBTClickedEventHandler = IO ()

type UnCommentBTClickedEventHandler = IO ()

type StartGHCiBTClickedEventHandler = IO ()

type StopGHCiBTClickedEventHandler = IO ()

-- |
--
--
type CallbackHandlerId = HandlerId



-- |=====================================================================
--  Main
--

-- |
--   priorityHighIdle
--   priorityDefaultIdle
--
addCallback :: IO Bool -> IO CallbackHandlerId
addCallback f = idleAdd f priorityDefaultIdle


-- |
--
--
delCallback :: CallbackHandlerId -> IO ()
delCallback = idleRemove 


-- |
--
--
getGladeFile :: IO String
getGladeFile = getDataFileName _GLADE_FILE


-- |
--
--
getBuilder :: IO Builder
getBuilder = do
  initGUI

  builder <- builderNew
  gfile   <- getGladeFile
  builderAddFromFile builder gfile

  return builder


-- |
--
--
start :: Builder -> IO ()
start builder = do
  window <- builderGetObject builder castToWindow _WINDOW_NAME
  widgetShowAll window
  mainGUI


-- |
--
--
type MainWindowCloseEventHandler = IO ()
type MainWindowKeyPressEventHandler = String -> Bool -> Bool -> IO Bool

-- |
--
--
setupMainWindow :: Builder
                -> String
                -> MainWindowCloseEventHandler
                -> MainWindowKeyPressEventHandler
                -> IO ()
setupMainWindow builder title closeEvt keyEvt = do

  settings <- fromJust <$> settingsGetDefault
  settingsSetStringProperty settings "gtk-font-name" _FONT_DESC ""
  settingsSetStringProperty settings "gtk-menu-bar-accel" "" ""

  window <- builderGetObject builder castToWindow _WINDOW_NAME

  set window [windowTitle := title]

  on window deleteEvent   $ mainWindowCloseEventHandler window closeEvt
  on window keyPressEvent $ mainWindowKeyPressEventHandler window keyEvt

  mainPaned <- builderGetObject builder castToPaned _NAME_MAIN_PANED
  panedSetPosition mainPaned 200

  codePaned <- builderGetObject builder castToPaned _NAME_CODE_PANED
  panedSetPosition codePaned 350

  note <- builderGetObject builder castToNotebook _NAME_CODE_NOTE
  on note switchPage $ switchPageEventHandler note builder

  return ()

-- |
--  Event Handler
--
mainWindowCloseEventHandler :: Window -> MainWindowCloseEventHandler -> EventM EAny Bool
mainWindowCloseEventHandler self proc = liftIO $ do
  proc
  widgetDestroy self
  mainQuit

  return True


-- |
--  Event Handler
--
mainWindowKeyPressEventHandler :: Window -> MainWindowKeyPressEventHandler -> EventM EKey Bool
mainWindowKeyPressEventHandler _ evh = do
  name <- eventKeyName
  mods <- eventModifier

  liftIO $ evh (T.unpack name) (elem Shift mods) (elem Control mods)

-- |
--
--
isGHCiStarted :: Builder -> IO Bool
isGHCiStarted builder = do
  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetGetSensitive bt

-- |
--
--
isDebugStart :: Builder -> IO Bool
isDebugStart builder = do
  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetGetSensitive bt

-- |
--
--
isBuildStart :: Builder -> IO Bool
isBuildStart builder = do
  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  isBuild <- widgetGetSensitive bt

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  isGHCiStop <- widgetGetSensitive bt

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  isGHCiStart <- widgetGetSensitive bt

  return $ (False == isBuild) && (True == isGHCiStop) && (False == isGHCiStart)

-- |
--
--
switchPageEventHandler :: Notebook -> Builder -> Int -> IO ()
switchPageEventHandler note builder pageId = do
  path <- notebookGetNthPage note pageId >>= \case
    Nothing -> return "[ERROR] text editor not found."
    Just child -> notebookGetMenuLabelText note child >>= \case
      Nothing -> return "[ERROR] text editor not found."
      Just a  -> return a    
  
  putStrStatusBar builder path


-- |
--
--
putStrStatusBar :: Builder -> String -> IO ()
putStrStatusBar builder msg = do
  bar <- builderGetObject builder castToStatusbar _NAME_STATUS_BAR
  contId <- statusbarGetContextId bar _STATUS_BAR_CONTEXT_ID
  statusbarRemoveAll bar (fromIntegral (toInteger contId))
  statusbarPush bar contId msg
  return ()


-- |=====================================================================
--  Dialog 
--

-- |
--
--
getNameByFolderTreeDialog :: Builder -> String -> String -> String -> Bool -> IO (Maybe String)
getNameByFolderTreeDialog builder title msg value isEnabled = do
  dialog <- builderGetObject builder castToDialog "TreeFolderCreateFolderDialog"
  entry  <- builderGetObject builder castToEntry "TreeFolderCreateFolderEntry"
  label  <- builderGetObject builder castToLabel "TreeFolderCreateFolderLabel"

  entrySetText entry value
  set dialog [windowTitle := title]
  set entry [entryEditable := isEnabled]

  if isEnabled then widgetShowAll entry else widgetHide entry

  labelSetText label msg

  res <- dialogRun dialog >>= \case
    ResponseUser 0 -> do
                      name <- entryGetText entry
                      return $ if null name then Nothing else Just name
    _              -> return Nothing

  widgetHide dialog

  return res


-- |
--
--
getSearchKeyBySearchDialog :: Builder -> String -> IO (Maybe String)
getSearchKeyBySearchDialog builder defaultStr = do
  dialog <- builderGetObject builder castToDialog "SearchDialog"
  entry  <- builderGetObject builder castToEntry "SearchDialogEntry"
  entrySetText entry defaultStr

  widgetGrabFocus entry
  res <- dialogRun dialog >>= \case
    ResponseUser 0 -> do
                      value <- entryGetText entry
                      return $ if null value then Nothing else Just value
    _              -> return Nothing

  widgetHide dialog

  return res

-- |
--
--
getSearchKeyFromSearchDialog :: Builder -> IO String
getSearchKeyFromSearchDialog builder = do
  entry  <- builderGetObject builder castToEntry "SearchDialogEntry"
  entryGetText entry

-- |
--
--
getReplaceByReplaceDialog :: Builder  -> IO (Maybe (String, String))
getReplaceByReplaceDialog builder = do
  initReplaceDialog builder
  dialog <- builderGetObject builder castToDialog "ReplaceDialog"
  searchEntry  <- builderGetObject builder castToEntry "ReplaceDialogSearchEntry"
  replaceEntry <- builderGetObject builder castToEntry "ReplaceDialogReplaceEntry"

  res <- dialogRun dialog >>= \case
    ResponseUser 0 -> do
                      searchVal <- entryGetText searchEntry
                      replaceVal <- entryGetText replaceEntry
                      getResult searchVal replaceVal
    _              -> return Nothing

  widgetHide dialog
  return res
  
  where
    getResult sVal rVal
      | null sVal && null rVal = return Nothing
      | otherwise = return $ Just (sVal, rVal)

-- |
--
--
initSearchDialog :: Builder -> IO ()
initSearchDialog builder = do
  entry  <- builderGetObject builder castToEntry "SearchDialogEntry"
  entrySetText entry ""

-- |
--
--
initReplaceDialog :: Builder -> IO ()
initReplaceDialog builder = do
  searchEntry  <- builderGetObject builder castToEntry "ReplaceDialogSearchEntry"
  replaceEntry <- builderGetObject builder castToEntry "ReplaceDialogReplaceEntry"
  entrySetText searchEntry ""
  entrySetText replaceEntry ""


-- |=====================================================================
--  
--


-- |
--
--
setupToolButton :: Builder
                -> DebugStartBTClickedEventHandler
                -> DebugStopBTClickedEventHandler
                -> StepOverBTClickedEventHandler
                -> StepInBTClickedEventHandler
                -> ContinueBTClickedEventHandler
                -> BuildBTClickedEventHandler
                -> SaveBTClickedEventHandler
                -> IndentBTClickedEventHandler
                -> UnIndentBTClickedEventHandler
                -> CommentBTClickedEventHandler
                -> UnCommentBTClickedEventHandler
                -> StartGHCiBTClickedEventHandler
                -> StopGHCiBTClickedEventHandler
                -> IO ()
setupToolButton builder debugStartEvh debugStopEvh stepOverEvh stepInEvh continueEvh buildEvh saveEvh indentEvh unIndentEvh commentEvh unCommentEvh startGHCi stopGHCi= do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_SAVE
  onToolButtonClicked bt saveEvh
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  onToolButtonClicked bt buildEvh
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  onToolButtonClicked bt startGHCi
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  onToolButtonClicked bt stopGHCi
  widgetSetSensitive bt False

  ------------------------------------

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  onToolButtonClicked bt debugStartEvh
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  onToolButtonClicked bt debugStopEvh
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  onToolButtonClicked bt continueEvh
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  onToolButtonClicked bt stepOverEvh
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  onToolButtonClicked bt stepInEvh
  widgetSetSensitive bt False

  ------------------------------------

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_INDENT
  onToolButtonClicked bt indentEvh
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_UNINDENT
  onToolButtonClicked bt unIndentEvh
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_COMMENT
  onToolButtonClicked bt commentEvh
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_UNCOMMENT
  onToolButtonClicked bt unCommentEvh
  widgetSetSensitive bt True


-- |
--
--
changeTBsOnGHCiStartting :: Builder -> IO ()
changeTBsOnGHCiStartting builder = do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  widgetSetSensitive bt False


-- |
--
--
changeTBsOnGHCiStarted :: Builder -> IO ()
changeTBsOnGHCiStarted builder = do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  widgetSetSensitive bt False


-- |
--
--
changeTBsOnGHCiStopped :: Builder -> IO ()
changeTBsOnGHCiStopped builder = do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  widgetSetSensitive bt False


-- |
--
--
changeTBsOnBuildStart :: Builder -> IO ()
changeTBsOnBuildStart builder = do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  widgetSetSensitive bt False

-- |
--
--
changeTBsOnBuildFinish :: Builder -> IO ()
changeTBsOnBuildFinish builder = do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  widgetSetSensitive bt False


-- |
--
--
changeTBsOnDebugStarted :: Builder -> IO ()
changeTBsOnDebugStarted builder = do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  widgetSetSensitive bt True


-- |
--
--
changeTBsOnDebugStopped :: Builder -> IO ()
changeTBsOnDebugStopped builder = do

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_BUILD
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_START_GHCI
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STOP_GHCI
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_START
  widgetSetSensitive bt True

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_DEBUG_STOP
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_CONTINUE
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_OVER
  widgetSetSensitive bt False

  bt <- builderGetObject builder castToToolButton _NAME_TOOL_BT_STEP_IN
  widgetSetSensitive bt False