mirror of
https://gitee.com/zhangsken/AndroidIDE.git
synced 2026-10-16 07:49:44 +08:00
Use SearchView as an ActionItem in 'Find in file' action
This commit is contained in:
@@ -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.
Reference in New Issue
Block a user