Use SearchView as an ActionItem in 'Find in file' action

This commit is contained in:
Akash Yadav
2022-10-07 23:17:47 +05:30
parent 162c65d6e9
commit 96229f4dcd
7 changed files with 107 additions and 28 deletions
@@ -18,6 +18,7 @@
package com.itsaky.androidide.actions
import android.graphics.drawable.Drawable
import android.view.View
/**
* An action that can be registered using the [ActionsRegistry]
@@ -84,6 +85,13 @@ interface ActionItem {
enabled = false
}
/**
* Create custom action view for this action item.
*
* @return The custom action view or `null`.
*/
fun createActionView(data: ActionData): View? = null
/** Location where an action item will be shown. */
enum class Location(val id: String) {
@@ -134,6 +134,10 @@ class DefaultActionsRegistry : ActionsRegistry() {
if (action.getShowAsActionFlags(data) != -1) {
item.setShowAsAction(action.getShowAsActionFlags(data))
}
action.createActionView(data)?.let {
item.actionView = it
}
if (action !is ActionMenu) {
item.setOnMenuItemClickListener {
@@ -17,6 +17,8 @@
package com.itsaky.androidide.actions.editor.find
import android.view.MenuItem
import com.itsaky.androidide.actions.ActionData
import com.itsaky.androidide.actions.ActionItem.Location
import com.itsaky.androidide.actions.ActionItem.Location.EDITOR_SEARCH_ACTION_MODE
import com.itsaky.androidide.actions.EditorRelatedAction
@@ -24,4 +26,8 @@ import com.itsaky.androidide.actions.EditorRelatedAction
/** @author Akash Yadav */
abstract class SearchActionModeAction : EditorRelatedAction() {
override var location: Location = EDITOR_SEARCH_ACTION_MODE
override fun getShowAsActionFlags(data: ActionData): Int {
return MenuItem.SHOW_AS_ACTION_IF_ROOM
}
}
@@ -0,0 +1,82 @@
/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*/
package com.itsaky.androidide.actions.editor.find
import android.app.SearchManager
import android.content.Context
import android.text.TextUtils
import android.view.MenuItem
import android.view.View
import androidx.appcompat.widget.SearchView
import androidx.core.content.ContextCompat
import com.itsaky.androidide.R
import com.itsaky.androidide.actions.ActionData
import com.itsaky.androidide.app.IDEActivity
import com.itsaky.androidide.views.editor.IDEEditor
import io.github.rosemoe.sora.widget.EditorSearcher.SearchOptions
/**
* The [SearchView] action in the search action mode.
*
* @author Akash Yadav
*/
class SearchViewActionItem() : SearchActionModeAction() {
override val id: String = "editor.search.view"
constructor(context: Context) : this() {
label = context.getString(R.string.text_to_search)
icon = ContextCompat.getDrawable(context, R.drawable.ic_search)
}
override fun execAction(data: ActionData): Any {
return Unit
}
override fun createActionView(data: ActionData): View? {
val editor = getEditor(data) ?: return null
val searchManager = editor.context.getSystemService(Context.SEARCH_SERVICE) as SearchManager
val search = SearchView(editor.context)
search.isIconified = false
search.queryHint = editor.context.getString(R.string.text_to_search)
search.setSearchableInfo(
searchManager.getSearchableInfo((editor.context as IDEActivity).componentName)
)
search.setOnQueryTextListener(OnQueryListener(editor))
search.performClick()
search.setIconifiedByDefault(false)
return search
}
private class OnQueryListener(val editor: IDEEditor) : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
editor.searcher.gotoNext()
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
if (TextUtils.isEmpty(newText)) {
editor.searcher.stopSearch()
return false
}
editor.searcher.search(newText!!, SearchOptions(false, false))
return false
}
}
}
@@ -31,6 +31,7 @@ import com.itsaky.androidide.actions.editor.SelectAllAction
import com.itsaky.androidide.actions.editor.find.GoToNextAction
import com.itsaky.androidide.actions.editor.find.GoToPreviousAction
import com.itsaky.androidide.actions.editor.find.ReplaceAction
import com.itsaky.androidide.actions.editor.find.SearchViewActionItem
import com.itsaky.androidide.actions.etc.DaemonStatusAction
import com.itsaky.androidide.actions.etc.FileTreeAction
import com.itsaky.androidide.actions.etc.FindActionMenu
@@ -73,6 +74,7 @@ class EditorActivityActions {
registry.registerAction(FormatCodeAction(context))
// editor search actions
registry.registerAction(SearchViewActionItem(context))
registry.registerAction(GoToNextAction(context))
registry.registerAction(GoToPreviousAction(context))
registry.registerAction(ReplaceAction(context))
@@ -18,16 +18,20 @@
package com.itsaky.androidide.views.editor
import android.annotation.SuppressLint
import android.app.SearchManager
import android.content.Context
import android.text.TextUtils
import android.view.ActionMode
import android.view.Menu
import android.view.MenuItem
import android.view.ViewGroup.LayoutParams
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.widget.SearchView
import com.itsaky.androidide.actions.ActionData
import com.itsaky.androidide.actions.ActionItem
import com.itsaky.androidide.actions.ActionsRegistry
import com.itsaky.androidide.app.IDEActivity
import io.github.rosemoe.sora.R
import io.github.rosemoe.sora.widget.CodeEditor
import io.github.rosemoe.sora.widget.EditorSearcher.SearchOptions
@@ -37,25 +41,15 @@ import io.github.rosemoe.sora.widget.EditorSearcher.SearchOptions
* @author Akash Yadav
*/
class SearchActionMode(val editor: IDEEditor) : ActionMode.Callback {
@SuppressLint("RestrictedApi")
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
if (mode == null) {
return false
}
if (menu is MenuBuilder) {
menu.setOptionalIconsVisible(true)
}
val search = SearchView(editor.context)
search.setOnQueryTextListener(OnQueryListener(editor))
search.isIconified = false
search.queryHint = editor.context.getString(R.string.text_to_search)
search.performClick()
search.setIconifiedByDefault(false)
mode.customView = search
return true
}
@@ -87,21 +81,4 @@ class SearchActionMode(val editor: IDEEditor) : ActionMode.Callback {
put(ActionMode::class.java, mode)
}
}
private class OnQueryListener(val editor: IDEEditor) : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
editor.searcher.gotoNext()
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
if (TextUtils.isEmpty(newText)) {
editor.searcher.stopSearch()
return false
}
editor.searcher.search(newText!!, SearchOptions(false, false))
return false
}
}
}
Binary file not shown.