public QueryHelperWidget(bool blockMode, ISearchView view = null)
        {
            m_BlockMode = blockMode;
            drawBorder  = true;

            m_Areas = new QueryBuilder("")
            {
                drawBackground = false,
            };
            m_Areas.AddBlock(new QueryAreaBlock(m_Areas, k_All, ""));

            var builtinSearches = SearchTemplateAttribute.GetAllQueries();
            var allProviders    = view != null && view.context != null?view.context.GetProviders() : SearchService.GetActiveProviders();

            var generalProviders  = allProviders.Where(p => !p.isExplicitProvider);
            var explicitProviders = allProviders.Where(p => p.isExplicitProvider);
            var providers         = generalProviders.Concat(explicitProviders);

            if (blockMode)
            {
                m_ActiveSearchProviders = providers.Where(p => p.id != "expression" && (p.fetchPropositions != null || builtinSearches.Any(sq => sq.searchText.StartsWith(p.filterId) || sq.GetProviderIds().Any(pid => p.id == pid)))).ToArray();
            }
            else
            {
                m_ActiveSearchProviders = providers.ToArray();
            }

            foreach (var p in m_ActiveSearchProviders)
            {
                m_Areas.AddBlock(new QueryAreaBlock(m_Areas, p));
            }
            m_Areas.@readonly = true;
            foreach (var b in m_Areas.blocks)
            {
                b.tooltip = $"Double click to search in: {b.value}";
            }

            if (string.IsNullOrEmpty(m_CurrentAreaFilterId))
            {
                m_CurrentAreaFilterId = SearchSettings.helperWidgetCurrentArea;
            }
            m_Searches = new QueryHelperSearchGroup(m_BlockMode, L10n.Tr("Searches"));

            ChangeCurrentAreaFilter(m_CurrentAreaFilterId);

            PopulateSearches(builtinSearches);
            RefreshSearches();
            BindSearchView(view);
        }
        private void DrawSearches(Event e, QueryHelperSearchGroup group)
        {
            if (group.filteredQueries.Length == 0)
            {
                return;
            }

            GUILayout.Label(group.title);
            group.scrollPos = EditorGUILayout.BeginScrollView(group.scrollPos, GUIStyle.none, GUI.skin.verticalScrollbar);
            var maxDescriptionWidth = .4f * m_WidgetRect.width;

            for (var i = 0; i < group.filteredQueries.Length; ++i)
            {
                var queryData = group.filteredQueries[i];
                var y         = i == 0 ? 0 : GUILayoutUtility.GetLastRect().yMax;
                var rowRect   = new Rect(0, y, m_WidgetRect.width, m_BlockMode ? queryData.builder.rect.height : Constants.kBuilderHeight);

                if (m_BlockMode)
                {
                    if (queryData.descSize.x == 0)
                    {
                        queryData.descSize = Styles.description.CalcSize(queryData.description);
                    }

                    GUI.Label(rowRect, queryData.tooltip, Styles.builderRow);

                    var iconRect = new Rect(Constants.kLeftPadding, y + 6f, Constants.kBuilderIconSize, Constants.kBuilderIconSize);
                    GUI.Label(iconRect, queryData.icon, Styles.icon);

                    var descWidth = Mathf.Min(maxDescriptionWidth, queryData.descSize.x + Constants.kScrollbarOffset);
                    var descRect  = new Rect(m_WidgetRect.width - descWidth - Constants.kLeftPadding, y + 6f, descWidth, Constants.kBuilderHeight);
                    GUI.Label(descRect, queryData.description, Styles.description);

                    var builderWidth = m_WidgetRect.width - descRect.width - iconRect.width;
                    var builderRect  = new Rect(iconRect.xMin + Constants.kBuilderIconSize, y, builderWidth, Constants.kBuilderHeight);

                    DrawBuilder(e, queryData.builder, builderRect);
                }
                else
                {
                    var descSize = Styles.description.CalcSize(queryData.description);

                    var textHeight = Styles.textQuery.CalcHeight(Utils.GUIContentTemp(queryData.searchText), rowRect.xMax - descSize.x - 20f);
                    rowRect.height = textHeight + 6f;

                    GUI.Label(rowRect, queryData.searchText != queryData.tooltip.tooltip ? queryData.tooltip : GUIContent.none, Styles.builderRow);
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(queryData.icon, Styles.icon);

                    GUILayout.Label(queryData.searchText, Styles.textQuery);
                    GUILayout.FlexibleSpace();
                    GUILayout.Label(queryData.description, Styles.description);

                    GUILayout.EndHorizontal();
                }

                EditorGUIUtility.AddCursorRect(rowRect, MouseCursor.Link);

                if (e.type == EventType.MouseUp && e.button == 0 && rowRect.Contains(e.mousePosition))
                {
                    ExecuteQuery(queryData.query);
                    e.Use();
                }
            }
            EditorGUILayout.EndScrollView();
        }