packages feed

lhae-0.0.3: src/Run.hs

module Run (program) 
    where

import Control.Monad (when)
import Graphics.UI.WX (Prop ((:=)),on)
import qualified Graphics.UI.WX as WX
import qualified Graphics.UI.WXCore as WXC
import Config (Config,initI18n)
import I18n (__)

import qualified Model
import qualified View
import qualified Controller

import qualified View.Modes as VMode
import qualified View.Component.TextWindow as VTextWindow
import qualified View.Component.Notebook as VNotebook

import qualified Controller.Grid as CGrid
import qualified Controller.FormulaInput as CFormulaInput
import qualified Controller.SaveConfig as CSaveConfig

import qualified Controller.Menu.File.NewClose as CFileNewClose
import qualified Controller.Menu.File.Open as CFileOpen
import qualified Controller.Menu.File.Save as CFileSave
import qualified Controller.Menu.File.Import.Csv as CFileImportCsv
import qualified Controller.Menu.File.Export.Image as CFileExportImage
import qualified Controller.Menu.File.Export.Diagram.BarChart as CFileExportBarChart
import qualified Controller.Menu.File.Export.Diagram.BoxPlot as CFileExportBoxPlot

import qualified Controller.Menu.Table.Add as CAdd
import qualified Controller.Menu.Table.Copy as CCopy
import qualified Controller.Menu.Table.Delete as CDelete
import qualified Controller.Menu.Table.Transpose as CTranspose
import qualified Controller.Menu.Table.Rename as CRename
import qualified Controller.Menu.Table.Filter as CFilter

import qualified Controller.Menu.Statistics.FrequencyDistribution as CStatsFD
import qualified Controller.Menu.Statistics.Descriptive as CDescriptive
import qualified Controller.Menu.Statistics.Pivot as CPivot

program :: Config -> IO ()
program config = do
  initI18n config

  frame <- WX.frame [WX.text := "lhae"]
  formulaInput <- VTextWindow.newSingleLine frame []
  notebook <- VNotebook.new frame
  current <- WX.varCreate Nothing

  let view = View.View frame formulaInput notebook current
  model <- Model.new
  ctrl <- Controller.new config model view
  let ifGridOpen eventHandler = do
               opened <- View.isGridOpen view
               when opened $ Controller.withCtrlData eventHandler ctrl
      call eventHandler = Controller.withCtrlData eventHandler ctrl  

  windowEH <- WXC.windowGetEventHandler notebook --frame
  notebookId <- WXC.windowGetId notebook
  WXC.evtHandlerOnEvent windowEH notebookId notebookId 
     [WXC.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED] () 
     (\_ -> return ()) (\_ -> call CGrid.changePageEventHandler)

  WX.set formulaInput 
        [ WX.processEnter := True
        , WX.enabled := False
        , on WX.command := do call CFormulaInput.eventHandler
                              VMode.gridMode view
        , on WX.focus := 
                 \onFocus -> when (not onFocus) $ VMode.gridMode view
        ]

  fileMenu <- WX.menuPane [WX.text := "&" ++ (__ "File")]
  fileNew <- WX.menuItem fileMenu [WX.text := "&" ++ (__ "New") ++ "\tCtrl+N"]
  fileOpen <- WX.menuItem fileMenu [WX.text := "&" ++ (__ "Open") ++ " ...\tCtrl+O"]
  fileImport <- WX.menuPane [WX.text := "&" ++ (__ "Import")]
  _ <- WX.menuSub fileMenu fileImport []
  fileImportCsv <- WX.menuItem fileImport [WX.text := (__ "From CSV file") ++ " ..."]
  WX.menuLine fileMenu
  fileSaveAs <- WX.menuItem fileMenu [WX.text := (__ "Save as") ++ " ..."]
  fileSave <- WX.menuItem fileMenu [WX.text := "&" ++ (__ "Save") ++ "\tCtrl+S"]
  fileExport <- WX.menuPane [WX.text := "&" ++ (__ "Export")]
  _ <- WX.menuSub fileMenu fileExport []
  fileExportImage <- WX.menuItem fileExport [WX.text := (__ "As image") ++ " ..."]
  fileExportBarChart <- WX.menuItem fileExport [WX.text := (__ "As bar chart") ++ " ..."]
  fileExportBoxPlot <- WX.menuItem fileExport [WX.text := (__ "As box plot") ++ " ..."]
  WX.menuLine fileMenu
  fileClose <- WX.menuItem fileMenu [WX.text := "&" ++ (__ "Close") ++ "\tCtrl+C"]
  fileCloseAll <- WX.menuItem fileMenu [WX.text := (__ "Close all")]
  fileQuit <- WX.menuQuit fileMenu [WX.text := "&" ++ (__ "Quit") ++ "\tCtrl+Q"]

  tableMenu <- WX.menuPane [WX.text := "&" ++ (__ "Table")]
  tableAdd <- WX.menuPane [WX.text := (__ "Add")]
  _ <- WX.menuSub tableMenu tableAdd []
  tableAddColumn <- WX.menuItem tableAdd [WX.text := (__ "Columns") ++ " ..."]
  tableAddRow <- WX.menuItem tableAdd [WX.text := (__ "Rows") ++ " ..."]
  tableCopy <- WX.menuPane [WX.text := (__ "Copy")]
  _ <- WX.menuSub tableMenu tableCopy []
  tableCopyColumn <- WX.menuItem tableCopy [WX.text := (__ "Columns") ++ " ..."]
  tableCopyRow <- WX.menuItem tableCopy [WX.text := (__ "Rows") ++ " ..."]
  tableCopyFormula <- WX.menuItem tableCopy [WX.text := (__ "Formula") ++ " ..."]
  tableDelete <- WX.menuPane [WX.text := (__ "Delete")]
  _ <- WX.menuSub tableMenu tableDelete []
  tableDeleteColumn <- WX.menuItem tableDelete [WX.text := (__ "Columns") ++ " ..."]
  tableDeleteRow <- WX.menuItem tableDelete [WX.text := (__ "Rows") ++ " ..."]
  tableTranspose <- WX.menuPane [WX.text := (__ "Transpose")]
  _ <- WX.menuSub tableMenu tableTranspose []
  tableTransposeTable <- WX.menuItem tableTranspose [WX.text := (__ "Table")]
  tableTransposeColumn <- WX.menuItem tableTranspose [WX.text := (__ "Columns") ++ " ..."]
  tableTransposeRow <- WX.menuItem tableTranspose [WX.text := (__ "Rows") ++ " ..."]
  tableRename <- WX.menuPane [WX.text := (__ "Rename")]
  _ <- WX.menuSub tableMenu tableRename []
  tableRenameColumn <- WX.menuItem tableRename [WX.text := (__ "Column") ++ " ..."]
  tableRenameRow <- WX.menuItem tableRename [WX.text := (__ "Row") ++ " ..."]
  tableFilter <- WX.menuPane [WX.text := (__ "Filter")]
  _ <- WX.menuSub tableMenu tableFilter []
  tableFilterRow <- WX.menuItem tableFilter [WX.text := (__ "Rows") ++ " ..."]
  tableFilterColumn <- WX.menuItem tableFilter [WX.text := (__ "Columns") ++ " ..."]

  statisticsMenu <- WX.menuPane [WX.text := "&" ++ (__ "Statistics")]
  statsFreqDist <- WX.menuItem statisticsMenu [WX.text := (__ "Frequency Distribution") ++ " ..."]
  statsDescriptive <- WX.menuItem statisticsMenu [WX.text := (__ "Descriptive") ++ " ..."]
  statsPivot <- WX.menuItem statisticsMenu [WX.text := (__ "Pivot table") ++ " ..."]

  WX.set frame 
    [ WX.menuBar := [fileMenu,tableMenu,statisticsMenu] 
    , WX.layout := WX.column 0 
      [ WX.hfill $ WX.widget formulaInput
      , WX.fill $ WX.widget notebook
      ]
    , on (WX.menu fileNew) := call CFileNewClose.newEventHandler

    , on (WX.menu fileExportBoxPlot) := ifGridOpen CFileExportBoxPlot.eventHandler

    , on (WX.menu fileOpen) := call CFileOpen.eventHandler
    , on (WX.menu fileSaveAs) := ifGridOpen CFileSave.saveAsEventHandler
    , on (WX.menu fileSave) := ifGridOpen CFileSave.saveEventHandler
    , on (WX.menu fileImportCsv) := call CFileImportCsv.eventHandler    
    , on (WX.menu fileExportImage) := ifGridOpen CFileExportImage.eventHandler
    , on (WX.menu fileExportBarChart) := ifGridOpen CFileExportBarChart.eventHandler
    , on (WX.menu fileExportBoxPlot) := ifGridOpen CFileExportBoxPlot.eventHandler
    , on (WX.menu fileClose) := ifGridOpen CFileNewClose.closeEventHandler
    , on (WX.menu fileCloseAll) := ifGridOpen CFileNewClose.closeAllEventHandler
    , on (WX.menu fileQuit) := WX.close frame

    , on (WX.menu tableAddColumn) := ifGridOpen CAdd.columnEventHandler
    , on (WX.menu tableAddRow) := ifGridOpen CAdd.rowEventHandler
    , on (WX.menu tableCopyColumn) := ifGridOpen CCopy.columnEventHandler
    , on (WX.menu tableCopyRow) := ifGridOpen CCopy.rowEventHandler
    , on (WX.menu tableCopyFormula) := ifGridOpen CCopy.formulaEventHandler
    , on (WX.menu tableDeleteColumn) := ifGridOpen CDelete.columnEventHandler
    , on (WX.menu tableDeleteRow) := ifGridOpen CDelete.rowEventHandler
    , on (WX.menu tableTransposeColumn) := ifGridOpen CTranspose.columnEventHandler
    , on (WX.menu tableTransposeRow) := ifGridOpen CTranspose.rowEventHandler
    , on (WX.menu tableTransposeTable) := ifGridOpen CTranspose.tableEventHandler
    , on (WX.menu tableRenameColumn) := ifGridOpen CRename.columnEventHandler
    , on (WX.menu tableRenameRow) := ifGridOpen CRename.rowEventHandler
    , on (WX.menu tableFilterColumn) := ifGridOpen CFilter.columnEventHandler
    , on (WX.menu tableFilterRow) := ifGridOpen CFilter.rowEventHandler

    , on (WX.menu statsFreqDist) := ifGridOpen CStatsFD.eventHandler
    , on (WX.menu statsDescriptive) := ifGridOpen CDescriptive.eventHandler
    , on (WX.menu statsPivot) := ifGridOpen CPivot.eventHandler

    , on WX.closing := do ifGridOpen CFileNewClose.closeAllEventHandler
                          call CSaveConfig.eventHandler
                          WX.propagateEvent
    ]