# Extending Project Search

Builder provides a global search box in the top right of the workbench. It can be extended to provide new types of search results.

For example, the `file-search` extension provides search results based on files found in the project tree.

Additionally, the `code-index` extension provides search results based on an index built from your project code.

To add new search results, implement the `Ide.SearchProvider` interface in your plugin.

    # my_plugin.py

    import gi

    from gi.repository import GObject
    from gi.repository import Gio
    from gi.repository import Ide

    class MySearchResult(Ide.SearchResult):
        def __index__(self, context, i)
            self.context = context
            self.title = 'Item ' + str(i)
            self.score = i / 100.0

        def do_get_source_location(self):
            """
            Currently, search results must point to a source location.

            This may change in a future release to allow for more
            flexability. Get in touch with us if you need this.
            """
            return Ide.SourceLocation.new(self.context, line, line_offset, 0)

    class MySearchProvider(Ide.Object, Ide.SearchProvider):

        def do_search_async(self, query, max_results, cancellable, callback, data):
            """
            Asynchronously searches for results.

            The search engine will take the results from do_search_finish()
            and add it to the search results list, sorted by score.
            """
            task = Gio.Task.new(self, cancellable, callback)
            task.results = []

            for i in range(0, 10):
                result = MySearchResult(self.get_context(), i)
                task.results.append(result)

            task.return_boolean(True)

        def do_search_finish(self, task):
            return task.results