{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE OverloadedStrings #-} ----------------------------------------------------------------------------- --f -- Module : IDE.Pane.Files -- Copyright : (c) Juergen Nicklisch-Franken, Hamish Mackenzie -- License : GNU-GPL -- -- Maintainer : -- Stability : provisional -- Portability : portable -- -- | The pane of ide that shows a list of all the files in the workspace -- ------------------------------------------------------------------------------- module IDE.Pane.Files ( IDEFiles(..) , FilesState(..) ) where import Prelude hiding (catch) import Data.Maybe (fromMaybe, maybeToList, listToMaybe, isJust) import Control.Monad (forM, void, forM_, when) import Data.Typeable (Typeable) import IDE.Core.State (catchIDE, window, getIDE, MessageLevel(..), ipdPackageId, wsPackages, workspace, readIDE, IDEAction, ideMessage, reflectIDE, reifyIDE, IDEM, IDEPackage) import IDE.Pane.SourceBuffer (fileNew, goToSourceDefinition') import Control.Applicative ((<$>)) import System.FilePath ((), takeFileName, dropFileName, addTrailingPathSeparator, takeDirectory, takeExtension, makeRelative, splitDirectories) import Distribution.Package (PackageIdentifier(..)) import System.Directory (removeDirectoryRecursive, removeDirectory, createDirectory, doesFileExist, removeFile, doesDirectoryExist, getDirectoryContents, getPermissions, readable) import IDE.Core.CTypes (Location(..), packageIdentifierToString) import Graphics.UI.Frame.Panes (RecoverablePane(..), PanePath, RecoverablePane, Pane(..)) import Graphics.UI.Frame.ViewFrame (getMainWindow, getNotebook) import Graphics.UI.Editor.Basics (Connection(..)) import Control.Monad.IO.Class (MonadIO(..)) import IDE.Utils.GUIUtils (showErrorDialog, showInputDialog, treeViewContextMenu', __, showDialogOptions) import Control.Exception (SomeException(..), catch) import Data.Text (Text) import qualified Data.Text as T (isPrefixOf, words, isSuffixOf, unpack, pack) import Data.Monoid ((<>)) import IDE.Core.Types (ipdLib, WorkspaceAction, Workspace(..), wsAllPackages, WorkspaceM, runPackage, runWorkspace, PackageAction, PackageM, IDEPackage(..), IDE(..), Prefs(..), MonadIDE(..), ipdPackageDir) import Control.Monad.Reader.Class (MonadReader(..)) import IDE.Workspaces (makePackage, projectAddPackage', projectRemovePackage, workspaceTry, workspaceTryQuiet, packageTry) import Data.List (isSuffixOf, find, stripPrefix, isPrefixOf, sortBy, sort) import Data.Ord (comparing) import Data.Char (toUpper, toLower) import System.Log.Logger (debugM) import Data.Tree (Forest, Tree(..)) import IDE.Pane.Modules (addModule) import IDE.Pane.PackageEditor (packageEditText) import IDE.Package (packageTest, packageRun, packageClean) import GI.Gtk.Objects.Label (labelNew, Label(..)) import GI.Gtk.Objects.Widget (toWidget) -- * The Files pane -- | The representation of the Files pane data IDEFiles = IDEFiles { deprecatedLabel :: Label } deriving Typeable -- | The additional state used when recovering the pane -- (none, the package directories come from the IDE state) data FilesState = FilesState deriving(Eq,Ord,Read,Show,Typeable) instance Pane IDEFiles IDEM where primPaneName _ = __ "Files" getAddedIndex _ = 0 getTopWidget = liftIO . toWidget . deprecatedLabel paneId b = "*Files" instance RecoverablePane IDEFiles FilesState IDEM where saveState p = return (Just FilesState) recoverState pp FilesState = do nb <- getNotebook pp buildPane pp nb builder builder pp nb windows = reifyIDE $ \ ideR -> do deprecatedLabel <- labelNew $ Just "The Files pane is deprecated and has been combined with the Workspace pane" return (Just IDEFiles {..}, [])