module Graphics.UI.Gtk.SourceView.SourceIter (
SourceSearchFlags(..),
sourceIterForwardSearch,
sourceIterBackwardSearch,
) where
import Control.Monad (liftM)
import Data.Maybe (fromMaybe)
import System.Glib.FFI
import System.Glib.Flags (Flags, fromFlags)
import System.Glib.UTFString
import Graphics.UI.Gtk.Abstract.Object (makeNewObject)
import Graphics.UI.Gtk.SourceView.Types
import Graphics.UI.Gtk.Multiline.TextIter
data SourceSearchFlags = SourceSearchVisibleOnly
| SourceSearchTextOnly
| SourceSearchCaseInsensitive
deriving (Eq,Bounded,Show,Read)
instance Enum SourceSearchFlags where
fromEnum SourceSearchVisibleOnly = 1
fromEnum SourceSearchTextOnly = 2
fromEnum SourceSearchCaseInsensitive = 4
toEnum 1 = SourceSearchVisibleOnly
toEnum 2 = SourceSearchTextOnly
toEnum 4 = SourceSearchCaseInsensitive
toEnum unmatched = error ("SourceSearchFlags.toEnum: Cannot match " ++ show unmatched)
succ SourceSearchVisibleOnly = SourceSearchTextOnly
succ SourceSearchTextOnly = SourceSearchCaseInsensitive
succ _ = undefined
pred SourceSearchTextOnly = SourceSearchVisibleOnly
pred SourceSearchCaseInsensitive = SourceSearchTextOnly
pred _ = undefined
enumFromTo x y | fromEnum x == fromEnum y = [ y ]
| otherwise = x : enumFromTo (succ x) y
enumFrom x = enumFromTo x SourceSearchCaseInsensitive
enumFromThen _ _ = error "Enum SourceSearchFlags: enumFromThen not implemented"
enumFromThenTo _ _ _ = error "Enum SourceSearchFlags: enumFromThenTo not implemented"
instance Flags SourceSearchFlags
sourceIterForwardSearch :: TextIter -> String -> [SourceSearchFlags] ->
Maybe TextIter -> IO (Maybe (TextIter, TextIter))
sourceIterForwardSearch ti str flags limit = do
start <- makeEmptyTextIter
end <- makeEmptyTextIter
found <- liftM toBool $ withUTFString str $ \cStr ->
(\(TextIter arg1) arg2 arg3 (TextIter arg4) (TextIter arg5) (TextIter arg6) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg4 $ \argPtr4 ->withForeignPtr arg5 $ \argPtr5 ->withForeignPtr arg6 $ \argPtr6 ->gtk_source_iter_forward_search argPtr1 arg2 arg3 argPtr4 argPtr5 argPtr6) ti cStr
((fromIntegral.fromFlags) flags) start end
(fromMaybe (TextIter nullForeignPtr) limit)
return $ if found then Just (start,end) else Nothing
sourceIterBackwardSearch :: TextIter -> String -> [SourceSearchFlags] ->
Maybe TextIter -> IO (Maybe (TextIter, TextIter))
sourceIterBackwardSearch ti str flags limit = do
start <- makeEmptyTextIter
end <- makeEmptyTextIter
found <- liftM toBool $ withUTFString str $ \cStr ->
(\(TextIter arg1) arg2 arg3 (TextIter arg4) (TextIter arg5) (TextIter arg6) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg4 $ \argPtr4 ->withForeignPtr arg5 $ \argPtr5 ->withForeignPtr arg6 $ \argPtr6 ->gtk_source_iter_backward_search argPtr1 arg2 arg3 argPtr4 argPtr5 argPtr6) ti cStr
((fromIntegral.fromFlags) flags) start end
(fromMaybe (TextIter nullForeignPtr) limit)
return $ if found then Just (start,end) else Nothing
foreign import ccall unsafe "gtk_source_iter_forward_search"
gtk_source_iter_forward_search :: ((Ptr TextIter) -> ((Ptr CChar) -> (CInt -> ((Ptr TextIter) -> ((Ptr TextIter) -> ((Ptr TextIter) -> (IO CInt)))))))
foreign import ccall unsafe "gtk_source_iter_backward_search"
gtk_source_iter_backward_search :: ((Ptr TextIter) -> ((Ptr CChar) -> (CInt -> ((Ptr TextIter) -> ((Ptr TextIter) -> ((Ptr TextIter) -> (IO CInt)))))))