{-# LINE 2 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
-- -*-haskell-*-
-- GIMP Toolkit (GTK) Widget SourceCompletionProvider
--
-- Author : Andy Stewart
--
-- Created: 08 Aug 2010
--
-- Copyright (C) 2010 Andy Stewart
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public
-- License as published by the Free Software Foundation; either
-- version 2.1 of the License, or (at your option) any later version.
--
-- This library 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
-- Lesser General Public License for more details.
--
-- |
-- Maintainer : gtk2hs-users@lists.sourceforge.net
-- Stability : provisional
-- Portability : portable (depends on GHC)
--
module Graphics.UI.Gtk.SourceView.SourceCompletionProvider (
-- * Description
-- | You must implement this interface to provide proposals to 'SourceCompletion'

-- * Types
   SourceCompletionProvider,
   SourceCompletionProviderClass,

-- * Methods
   sourceCompletionProviderGetName,
   sourceCompletionProviderGetIcon,
   sourceCompletionProviderGetInteractiveDelay,
   sourceCompletionProviderGetPriority,
   sourceCompletionProviderGetInfoWidget,
   sourceCompletionProviderGetActivation,
   sourceCompletionProviderGetStartIter,
   sourceCompletionProviderMatch,
   sourceCompletionProviderUpdateInfo,
   sourceCompletionProviderPopulate,
   sourceCompletionProviderActivateProposal,
) where

import Control.Monad (liftM)

import Graphics.UI.Gtk.Abstract.Object (makeNewObject)
import Graphics.UI.Gtk.SourceView.Enums
import System.Glib.Attributes
import System.Glib.FFI
import System.Glib.GObject (wrapNewGObject)
import System.Glib.Properties
import System.Glib.UTFString

import Graphics.UI.Gtk.SourceView.Signals
{-# LINE 59 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
import Graphics.UI.Gtk.SourceView.Types
{-# LINE 60 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}


{-# LINE 62 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}

-- | Get the name of the provider. This should be a translatable name for display to the user. For
-- example: _("Document word completion provider").
sourceCompletionProviderGetName :: (SourceCompletionProviderClass scp, GlibString string) => scp
                                -> IO string -- ^ returns A new string containing the name of the provider.
sourceCompletionProviderGetName scp =
  (\(SourceCompletionProvider arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_source_completion_provider_get_name argPtr1)
{-# LINE 69 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
    (toSourceCompletionProvider scp)
  >>= peekUTFString

-- | Get the icon of the provider.
sourceCompletionProviderGetIcon :: SourceCompletionProviderClass scp => scp
                                -> IO (Maybe Pixbuf)
sourceCompletionProviderGetIcon scp =
  maybeNull (wrapNewGObject mkPixbuf) $
  (\(SourceCompletionProvider arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_source_completion_provider_get_icon argPtr1)
{-# LINE 78 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
    (toSourceCompletionProvider scp)

-- | Get the delay in milliseconds before starting interactive completion for this provider. A value of
-- -1 indicates to use the default value as set by 'autoCompleteDelay'.
sourceCompletionProviderGetInteractiveDelay :: SourceCompletionProviderClass scp => scp
                                            -> IO Int -- ^ returns the interactive delay in milliseconds.
sourceCompletionProviderGetInteractiveDelay scp =
  liftM fromIntegral $
  (\(SourceCompletionProvider arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_source_completion_provider_get_interactive_delay argPtr1)
{-# LINE 87 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
     (toSourceCompletionProvider scp)

-- | Get the provider priority. The priority determines the order in which proposals appear in the
-- completion popup. Higher priorities are sorted before lower priorities. The default priority is 0.
sourceCompletionProviderGetPriority :: SourceCompletionProviderClass scp => scp
                                    -> IO Int -- ^ returns the provider priority.
sourceCompletionProviderGetPriority scp =
  liftM fromIntegral $
  (\(SourceCompletionProvider arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_source_completion_provider_get_priority argPtr1)
{-# LINE 96 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
    (toSourceCompletionProvider scp)

-- | Get a customized info widget to show extra information of a proposal. This allows for customized
-- widgets on a proposal basis, although in general providers will have the same custom widget for all
-- their proposals and proposal can be ignored. The implementation of this function is optional. If
-- implemented, 'sourceCompletionProviderUpdateInfo' MUST also be implemented. If not
-- implemented, the default 'sourceCompletionProposalGetInfo' will be used to display extra
-- information about a 'SourceCompletionProposal'.
sourceCompletionProviderGetInfoWidget :: SourceCompletionProviderClass scp => scp
                                      -> SourceCompletionProposal -- ^ @proposal@ The currently selected 'SourceCompletionProposal'
                                     -> IO Widget -- ^ returns a custom 'Widget' to show extra information about proposal.
sourceCompletionProviderGetInfoWidget scp proposal =
  makeNewObject mkWidget $
  (\(SourceCompletionProvider arg1) (SourceCompletionProposal arg2) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->gtk_source_completion_provider_get_info_widget argPtr1 argPtr2)
{-# LINE 110 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
    (toSourceCompletionProvider scp)
    proposal

-- | Get with what kind of activation the provider should be activated.
sourceCompletionProviderGetActivation :: SourceCompletionProviderClass scp => scp
                                      -> IO SourceCompletionActivation
sourceCompletionProviderGetActivation scp =
    liftM (toEnum . fromIntegral) $
    (\(SourceCompletionProvider arg1) -> withForeignPtr arg1 $ \argPtr1 ->gtk_source_completion_provider_get_activation argPtr1)
{-# LINE 119 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
      (toSourceCompletionProvider scp)

-- | Get the 'TextIter' at which the completion for proposal starts. When implemented, the completion
-- can use this information to position the completion window accordingly when a proposal is selected
-- in the completion window.
sourceCompletionProviderGetStartIter :: SourceCompletionProviderClass scp => scp
                                     -> SourceCompletionContext
                                     -> SourceCompletionProposal
                                     -> IO (Maybe TextIter)
sourceCompletionProviderGetStartIter scp context proposal = do
  iter <- makeEmptyTextIter
  success <- liftM toBool $ (\(SourceCompletionProvider arg1) (SourceCompletionContext arg2) (SourceCompletionProposal arg3) (TextIter arg4) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->withForeignPtr arg3 $ \argPtr3 ->withForeignPtr arg4 $ \argPtr4 ->gtk_source_completion_provider_get_start_iter argPtr1 argPtr2 argPtr3 argPtr4)
{-# LINE 131 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
                (toSourceCompletionProvider scp)
                context
                proposal
                iter
  if success
     then return (Just iter)
     else return Nothing

-- | Get whether the provider match the context of completion detailed in context.
sourceCompletionProviderMatch :: SourceCompletionProviderClass scp => scp
                              -> SourceCompletionContext
                              -> IO Bool -- ^ returns 'True' if provider matches the completion context, 'False' otherwise
sourceCompletionProviderMatch scp context =
  liftM toBool $
  (\(SourceCompletionProvider arg1) (SourceCompletionContext arg2) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->gtk_source_completion_provider_match argPtr1 argPtr2)
{-# LINE 146 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
   (toSourceCompletionProvider scp)
   context

-- | Update extra information shown in info for proposal. This should be implemented if your provider
-- sets a custom info widget for proposal. This function MUST be implemented when
-- 'sourceCompletionProviderGetInfoWidget' is implemented.
sourceCompletionProviderUpdateInfo :: SourceCompletionProviderClass scp => scp
                                   -> SourceCompletionProposal
                                   -> SourceCompletionInfo
                                   -> IO ()
sourceCompletionProviderUpdateInfo scp proposal info =
  (\(SourceCompletionProvider arg1) (SourceCompletionProposal arg2) (SourceCompletionInfo arg3) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->withForeignPtr arg3 $ \argPtr3 ->gtk_source_completion_provider_update_info argPtr1 argPtr2 argPtr3)
{-# LINE 158 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
    (toSourceCompletionProvider scp)
    proposal
    info

-- | Populate context with proposals from provider
sourceCompletionProviderPopulate :: SourceCompletionProviderClass scp => scp
                                 -> SourceCompletionContext
                                 -> IO ()
sourceCompletionProviderPopulate scp context =
  (\(SourceCompletionProvider arg1) (SourceCompletionContext arg2) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->gtk_source_completion_provider_populate argPtr1 argPtr2)
{-# LINE 168 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
     (toSourceCompletionProvider scp)
     context

-- | Activate proposal at iter. When this functions returns 'False', the default activation of proposal
-- will take place which replaces the word at iter with the label of proposal.
sourceCompletionProviderActivateProposal :: SourceCompletionProviderClass scp => scp
                                         -> SourceCompletionProposal
                                         -> TextIter
                                         -> IO Bool -- ^ returns 'True' to indicate that the proposal activation has been handled, 'False' otherwise.
sourceCompletionProviderActivateProposal scp proposal iter =
  liftM toBool $
  (\(SourceCompletionProvider arg1) (SourceCompletionProposal arg2) (TextIter arg3) -> withForeignPtr arg1 $ \argPtr1 ->withForeignPtr arg2 $ \argPtr2 ->withForeignPtr arg3 $ \argPtr3 ->gtk_source_completion_provider_activate_proposal argPtr1 argPtr2 argPtr3)
{-# LINE 180 "./Graphics/UI/Gtk/SourceView/SourceCompletionProvider.chs" #-}
    (toSourceCompletionProvider scp)
    proposal
    iter

foreign import ccall safe "gtk_source_completion_provider_get_name"
  gtk_source_completion_provider_get_name :: ((Ptr SourceCompletionProvider) -> (IO (Ptr CChar)))

foreign import ccall safe "gtk_source_completion_provider_get_icon"
  gtk_source_completion_provider_get_icon :: ((Ptr SourceCompletionProvider) -> (IO (Ptr Pixbuf)))

foreign import ccall safe "gtk_source_completion_provider_get_interactive_delay"
  gtk_source_completion_provider_get_interactive_delay :: ((Ptr SourceCompletionProvider) -> (IO CInt))

foreign import ccall safe "gtk_source_completion_provider_get_priority"
  gtk_source_completion_provider_get_priority :: ((Ptr SourceCompletionProvider) -> (IO CInt))

foreign import ccall safe "gtk_source_completion_provider_get_info_widget"
  gtk_source_completion_provider_get_info_widget :: ((Ptr SourceCompletionProvider) -> ((Ptr SourceCompletionProposal) -> (IO (Ptr Widget))))

foreign import ccall safe "gtk_source_completion_provider_get_activation"
  gtk_source_completion_provider_get_activation :: ((Ptr SourceCompletionProvider) -> (IO CInt))

foreign import ccall safe "gtk_source_completion_provider_get_start_iter"
  gtk_source_completion_provider_get_start_iter :: ((Ptr SourceCompletionProvider) -> ((Ptr SourceCompletionContext) -> ((Ptr SourceCompletionProposal) -> ((Ptr TextIter) -> (IO CInt)))))

foreign import ccall safe "gtk_source_completion_provider_match"
  gtk_source_completion_provider_match :: ((Ptr SourceCompletionProvider) -> ((Ptr SourceCompletionContext) -> (IO CInt)))

foreign import ccall safe "gtk_source_completion_provider_update_info"
  gtk_source_completion_provider_update_info :: ((Ptr SourceCompletionProvider) -> ((Ptr SourceCompletionProposal) -> ((Ptr SourceCompletionInfo) -> (IO ()))))

foreign import ccall safe "gtk_source_completion_provider_populate"
  gtk_source_completion_provider_populate :: ((Ptr SourceCompletionProvider) -> ((Ptr SourceCompletionContext) -> (IO ())))

foreign import ccall safe "gtk_source_completion_provider_activate_proposal"
  gtk_source_completion_provider_activate_proposal :: ((Ptr SourceCompletionProvider) -> ((Ptr SourceCompletionProposal) -> ((Ptr TextIter) -> (IO CInt))))