Beispiel #1
0
 public List<Result> Query(Query query)
 {
     return new List<Result> {  new Result
     {
         Action = (ActionContext a) => { new DriveClient(); return false; },
         Title = "Drive"
     }};
 }
Beispiel #2
0
        public void GenericPluginQueryTest()
        {
            Query q = new Query("file.txt file2 file3");
            q.Search = q.RawQuery;

            Assert.AreEqual(q.FirstSearch, "file.txt");
            Assert.AreEqual(q.SecondSearch, "file2");
            Assert.AreEqual(q.ThirdSearch, "file3");
            Assert.AreEqual(q.SecondToEndSearch, "file2 file3");
        }
Beispiel #3
0
        public void ExclusivePluginQueryTest()
        {
            Query q = new Query("f file.txt file2 file3");
            q.Search = "file.txt file2 file3";

            Assert.AreEqual(q.FirstSearch, "file.txt");
            Assert.AreEqual(q.SecondSearch, "file2");
            Assert.AreEqual(q.ThirdSearch, "file3");
            Assert.AreEqual(q.SecondToEndSearch, "file2 file3");
        }
Beispiel #4
0
 public static void Dispatch(Query query)
 {
     if (PluginManager.IsExclusivePluginQuery(query))
     {
         exclusivePluginDispatcher.Dispatch(query);
     }
     else
     {
         genericQueryDispatcher.Dispatch(query);
     }
 }
        protected override List<PluginPair> GetPlugins(Query query)
        {
            List<PluginPair> pluginPairs = new List<PluginPair>();
            var exclusivePluginPair = PluginManager.GetExclusivePlugin(query) ??
                                      PluginManager.GetActionKeywordPlugin(query);
            if (exclusivePluginPair != null)
            {
                pluginPairs.Add(exclusivePluginPair);
            }

            return pluginPairs;
        }
Beispiel #6
0
 public void Dispatch(Query query)
 {
     foreach (PluginPair pair in GetPlugins(query))
     {
         PluginPair localPair = pair;
         if (query.IsIntantQuery && PluginManager.IsInstantSearchPlugin(pair.Metadata))
         {
             DebugHelper.WriteLine(string.Format("Plugin {0} is executing instant search.", pair.Metadata.Name));
             using (new Timeit("  => instant search took: "))
             {
                 PluginManager.ExecutePluginQuery(localPair, query);
             }
         }
         else
         {
             ThreadPool.QueueUserWorkItem(state =>
             {
                 PluginManager.ExecutePluginQuery(localPair, query);
             });
         }
     }
 }
Beispiel #7
0
 public void PushResults(Query query, PluginMetadata plugin, List<Result> results)
 {
     results.ForEach(o =>
     {
         o.PluginDirectory = plugin.PluginDirectory;
         o.PluginID = plugin.ID;
         o.OriginQuery = query;
     });
     UpdateResultView(results);
 }
 protected override List<PluginPair> GetPlugins(Query query)
 {
     return PluginManager.AllPlugins.Where(o => PluginManager.IsGenericPlugin(o.Metadata)).ToList();
 }
Beispiel #9
0
 internal static bool IsExclusivePluginQuery(Query query)
 {
     return GetExclusivePlugin(query) != null || GetActionKeywordPlugin(query) != null;
 }
Beispiel #10
0
 internal static PluginPair GetExclusivePlugin(Query query)
 {
     KeyValuePair<PluginPair, IExclusiveQuery> plugin = LoadExclusiveSearchPlugins().FirstOrDefault(o => o.Value.IsExclusiveQuery((query)));
     return plugin.Key;
 }
Beispiel #11
0
        internal static PluginPair GetActionKeywordPlugin(Query query)
        {
            //if a query doesn't contain at least one space, it should not be a action keword plugin query
            if (!query.RawQuery.Contains(" ")) return null;

            PluginPair actionKeywordPluginPair = AllPlugins.FirstOrDefault(o => o.Metadata.ActionKeyword == query.GetActionKeyword());
            if (actionKeywordPluginPair != null)
            {
                var customizedPluginConfig = UserSettingStorage.Instance.
                    CustomizedPluginConfigs.FirstOrDefault(o => o.ID == actionKeywordPluginPair.Metadata.ID);
                if (customizedPluginConfig != null && customizedPluginConfig.Disabled)
                {
                    return null;
                }

                return actionKeywordPluginPair;
            }

            return null;
        }
Beispiel #12
0
 internal static void ExecutePluginQuery(PluginPair pair, Query query)
 {
     try
     {
         Stopwatch sw = new Stopwatch();
         sw.Start();
         List<Result> results = pair.Plugin.Query(query) ?? new List<Result>();
         results.ForEach(o =>
         {
             o.PluginID = pair.Metadata.ID;
         });
         sw.Stop();
         DebugHelper.WriteLine(string.Format("Plugin query: {0} - {1}", pair.Metadata.Name, sw.ElapsedMilliseconds));
         pair.QueryCount += 1;
         if (pair.QueryCount == 1)
         {
             pair.AvgQueryTime = sw.ElapsedMilliseconds;
         }
         else
         {
             pair.AvgQueryTime = (pair.AvgQueryTime + sw.ElapsedMilliseconds) / 2;
         }
         API.PushResults(query, pair.Metadata, results);
     }
     catch (System.Exception e)
     {
         throw new BloopPluginException(pair.Metadata.Name, e);
     }
 }
Beispiel #13
0
 public static void Query(Query query)
 {
     if (!string.IsNullOrEmpty(query.RawQuery.Trim()))
     {
         query.Search = IsActionKeywordQuery(query) ? query.RawQuery.Substring(query.RawQuery.IndexOf(' ') + 1) : query.RawQuery;
         QueryDispatcher.QueryDispatcher.Dispatch(query);
     }
 }
Beispiel #14
0
        /// <summary>
        /// Check if a query contains valid action keyword
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public static bool IsActionKeywordQuery(Query query)
        {
            if (string.IsNullOrEmpty(query.RawQuery)) return false;
            var strings = query.RawQuery.Split(' ');
            if (strings.Length == 1) return false;

            var actionKeyword = strings[0].Trim();
            if (string.IsNullOrEmpty(actionKeyword)) return false;

            PluginPair pair = plugins.FirstOrDefault(o => o.Metadata.ActionKeyword == actionKeyword);
            if (pair != null)
            {
                var customizedPluginConfig = UserSettingStorage.Instance.CustomizedPluginConfigs.FirstOrDefault(o => o.ID == pair.Metadata.ID);
                if (customizedPluginConfig != null && customizedPluginConfig.Disabled)
                {
                    return false;
                }

                return true;
            }

            return false;
        }
Beispiel #15
0
 private void Query(Query q)
 {
     PluginManager.Query(q);
     StopProgress();
 }
Beispiel #16
0
 protected abstract List<PluginPair> GetPlugins(Query query);
Beispiel #17
0
        private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
        {
            if (ignoreTextChange) { ignoreTextChange = false; return; }

            toolTip.IsOpen = false;
            pnlResult.Dirty = true;

            if (IsInContextMenuMode)
            {
                QueryContextMenu();
                return;
            }

            lastQuery = tbQuery.Text;
            int searchDelay = GetSearchDelay(lastQuery);

            Dispatcher.DelayInvoke("UpdateSearch",
                o =>
                {
                    Dispatcher.DelayInvoke("ClearResults", i =>
                    {
                        // first try to use clear method inside pnlResult, which is more closer to the add new results
                        // and this will not bring splash issues.After waiting 100ms, if there still no results added, we
                        // must clear the result. otherwise, it will be confused why the query changed, but the results
                        // didn't.
                        if (pnlResult.Dirty) pnlResult.Clear();
                    }, TimeSpan.FromMilliseconds(100), null);
                    queryHasReturn = false;
                    Query query = new Query(lastQuery);
                    query.IsIntantQuery = searchDelay == 0;
                    Query(query);
                    Dispatcher.DelayInvoke("ShowProgressbar", originQuery =>
                    {
                        if (!queryHasReturn && originQuery == tbQuery.Text && !string.IsNullOrEmpty(lastQuery))
                        {
                            StartProgress();
                        }
                    }, TimeSpan.FromMilliseconds(150), tbQuery.Text);
                    //reset query history index after user start new query
                    ResetQueryHistoryIndex();
                }, TimeSpan.FromMilliseconds(searchDelay));
        }