mirror of
https://gitee.com/zhangsken/AndroidIDE.git
synced 2026-10-16 07:49:44 +08:00
Enhanced floating text action presenter
This commit is contained in:
Generated
+3
@@ -21,6 +21,7 @@
|
||||
<map>
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable-hdpi/ic_expand_selection.xml" value="0.20833333333333334" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable-xhdpi/ic_font_ligatures.xml" value="0.147" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable-xxxhdpi/ic_text_actions.xml" value="0.147" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/bg_design_container_background.xml" value="0.1" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/bg_ui_view_pressed.xml" value="0.1" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_code.xml" value="0.19907407407407407" />
|
||||
@@ -32,6 +33,8 @@
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_relative_layout.xml" value="0.175" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_save.xml" value="0.26205128205128203" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_signature_help.xml" value="0.19907407407407407" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_text_actions.xml" value="0.147" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_text_actions_horizontal.xml" value="0.147" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/drawable/ic_text_lower.xml" value="0.19907407407407407" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/layout/activity_about.xml" value="0.264" />
|
||||
<entry key="..\:/Projects/AndroidStudioProjects/AndroidIDE/app/src/main/res/layout/activity_crash_handler.xml" value="0.25" />
|
||||
|
||||
Binary file not shown.
@@ -17,13 +17,16 @@
|
||||
|
||||
package com.itsaky.androidide.adapters;
|
||||
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.itsaky.androidide.app.StudioApp;
|
||||
import com.itsaky.androidide.databinding.LayoutTextActionItemBinding;
|
||||
import com.itsaky.androidide.managers.PreferenceManager;
|
||||
import com.itsaky.androidide.views.editor.IDEEditor;
|
||||
|
||||
import java.util.List;
|
||||
@@ -32,17 +35,20 @@ import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Adapter for text actions in editor.
|
||||
*
|
||||
* @author Akash Yadav
|
||||
*/
|
||||
public class TextActionItemAdapter extends RecyclerView.Adapter<TextActionItemAdapter.VH> {
|
||||
|
||||
private final List<IDEEditor.TextAction> actions;
|
||||
private final Consumer<IDEEditor.TextAction> onClick;
|
||||
private final boolean isHorizontal;
|
||||
|
||||
public TextActionItemAdapter (List<IDEEditor.TextAction> actions, Consumer<IDEEditor.TextAction> onClick) {
|
||||
Objects.requireNonNull (actions);
|
||||
this.actions = actions;
|
||||
this.onClick = onClick;
|
||||
this.isHorizontal = StudioApp.getInstance ().getPrefManager ().getBoolean (PreferenceManager.KEY_EDITOR_HORIZONTAL_POPUP, false);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -57,6 +63,16 @@ public class TextActionItemAdapter extends RecyclerView.Adapter<TextActionItemAd
|
||||
final var action = actions.get (position);
|
||||
final var button = binding.getRoot ();
|
||||
|
||||
if (isHorizontal) {
|
||||
// If not set to wrap_content, one item will take whole screen width.
|
||||
final var params = button.getLayoutParams ();
|
||||
params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||
button.setLayoutParams (params);
|
||||
|
||||
// looks better
|
||||
button.setGravity (Gravity.CENTER);
|
||||
}
|
||||
|
||||
button.setText (action.titleId);
|
||||
button.setCompoundDrawablesRelative (action.icon, null, null, null);
|
||||
|
||||
|
||||
+236
-202
@@ -1,20 +1,20 @@
|
||||
/************************************************************************************
|
||||
/*
|
||||
* 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.fragments.preferences;
|
||||
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_AUTO_SAVE;
|
||||
@@ -26,8 +26,10 @@ import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_FLAG_W
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_FLAG_WS_TRAILING;
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_FONT_LIGATURES;
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_FONT_SIZE;
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_HORIZONTAL_POPUP;
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_PRINTABLE_CHARS;
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_TAB_SIZE;
|
||||
import static com.itsaky.androidide.managers.PreferenceManager.KEY_EDITOR_USE_POPUP;
|
||||
import static com.itsaky.androidide.models.PrefBasedJavaServerSettings.KEY_JAVA_PREF_MATCH_LOWER;
|
||||
|
||||
import android.os.Bundle;
|
||||
@@ -49,128 +51,156 @@ import com.itsaky.androidide.utils.DialogUtils;
|
||||
public class EditorPreferences extends BasePreferenceFragment {
|
||||
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle p1, String p2) {
|
||||
super.onCreatePreferences(p1, p2);
|
||||
|
||||
if(getContext() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final var screen = getPreferenceScreen();
|
||||
final var commonCategory = new PreferenceCategory (getContext ());
|
||||
final var javaCategory = new PreferenceCategory (getContext ());
|
||||
|
||||
final var fontSize = new Preference(getContext());
|
||||
final var nonPrintable = new Preference(getContext());
|
||||
final var tabSize = new Preference(getContext());
|
||||
final var drawHex = new SwitchPreference(getContext());
|
||||
final var fontLigatures = new SwitchPreference (getContext ());
|
||||
final var autoSave = new SwitchPreference (getContext ());
|
||||
|
||||
final var javaMatchLower = new SwitchPreference (getContext ());
|
||||
|
||||
screen.addPreference (commonCategory);
|
||||
screen.addPreference (javaCategory);
|
||||
public void onCreatePreferences (Bundle p1, String p2) {
|
||||
super.onCreatePreferences (p1, p2);
|
||||
|
||||
fontSize.setIcon(R.drawable.ic_text_size);
|
||||
fontSize.setKey(KEY_EDITOR_FONT_SIZE);
|
||||
fontSize.setTitle(R.string.idepref_editor_fontsize_title);
|
||||
fontSize.setSummary(R.string.idepref_editor_fontsize_summary);
|
||||
|
||||
nonPrintable.setIcon(R.drawable.ic_drawing);
|
||||
nonPrintable.setKey(KEY_EDITOR_PRINTABLE_CHARS);
|
||||
nonPrintable.setTitle(R.string.idepref_editor_paintingflags_title);
|
||||
nonPrintable.setSummary(R.string.idepref_editor_paintingflags_summary);
|
||||
if (getContext () == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
tabSize.setIcon(R.drawable.ic_tab);
|
||||
tabSize.setKey(KEY_EDITOR_TAB_SIZE);
|
||||
tabSize.setTitle(R.string.title_tab_size);
|
||||
tabSize.setSummary(R.string.msg_tab_size);
|
||||
|
||||
drawHex.setIcon(R.drawable.ic_hexadecimal);
|
||||
drawHex.setKey(KEY_EDITOR_DRAW_HEX);
|
||||
drawHex.setTitle(R.string.idepref_editor_drawhexcolors_title);
|
||||
drawHex.setSummary(R.string.idepref_editor_drawhexcolors_summary);
|
||||
|
||||
fontLigatures.setIcon(R.drawable.ic_font_ligatures);
|
||||
fontLigatures.setKey(KEY_EDITOR_FONT_LIGATURES);
|
||||
fontLigatures.setTitle(getString(R.string.idepref_editor_ligatures_title));
|
||||
fontLigatures.setSummary(getString(R.string.idepref_editor_ligatures_summary));
|
||||
|
||||
autoSave.setIcon (R.drawable.ic_save);
|
||||
autoSave.setKey (KEY_EDITOR_AUTO_SAVE);
|
||||
autoSave.setTitle (getString(R.string.idepref_editor_autoSave_title));
|
||||
autoSave.setSummary (getString(R.string.idepref_editor_autoSave_summary));
|
||||
|
||||
javaMatchLower.setKey (KEY_JAVA_PREF_MATCH_LOWER);
|
||||
javaMatchLower.setIcon (R.drawable.ic_text_lower);
|
||||
javaMatchLower.setTitle (getString(R.string.idepref_java_matchLower_title));
|
||||
javaMatchLower.setSummary (getString(R.string.idepref_java_matchLower_summary));
|
||||
|
||||
commonCategory.setTitle (getString(R.string.idepref_editor_category_common));
|
||||
commonCategory.addPreference(fontSize);
|
||||
commonCategory.addPreference (fontLigatures);
|
||||
commonCategory.addPreference(nonPrintable);
|
||||
commonCategory.addPreference(tabSize);
|
||||
commonCategory.addPreference(drawHex);
|
||||
commonCategory.addPreference (autoSave);
|
||||
|
||||
javaCategory.setTitle (getString(R.string.idepref_editor_category_java));
|
||||
javaCategory.addPreference (javaMatchLower);
|
||||
|
||||
setPreferenceScreen(screen);
|
||||
|
||||
fontSize.setOnPreferenceClickListener(this::onPreferenceClick);
|
||||
fontLigatures.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
nonPrintable.setOnPreferenceClickListener(this::onPreferenceClick);
|
||||
tabSize.setOnPreferenceClickListener(this::onPreferenceClick);
|
||||
drawHex.setOnPreferenceChangeListener(this::onPreferenceChange);
|
||||
autoSave.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
javaMatchLower.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
|
||||
fontLigatures.setChecked (getPrefManager ().getBoolean (KEY_EDITOR_FONT_LIGATURES, true));
|
||||
drawHex.setChecked(getPrefManager().getBoolean(KEY_EDITOR_DRAW_HEX, true));
|
||||
autoSave.setChecked (getPrefManager ().getBoolean (KEY_EDITOR_AUTO_SAVE, false));
|
||||
javaMatchLower.setChecked (getPrefManager ().getBoolean (KEY_JAVA_PREF_MATCH_LOWER, false));
|
||||
}
|
||||
|
||||
public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
|
||||
final boolean value = (boolean) newValue;
|
||||
|
||||
switch (preference.getKey ()) {
|
||||
case KEY_EDITOR_DRAW_HEX:
|
||||
ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED = true;
|
||||
break;
|
||||
case KEY_EDITOR_FONT_LIGATURES:
|
||||
ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED = true;
|
||||
break;
|
||||
case KEY_JAVA_PREF_MATCH_LOWER:
|
||||
final var javaServer = StudioApp.getInstance ().getJavaLanguageServer ();
|
||||
javaServer.applySettings (PrefBasedJavaServerSettings.getInstance ());
|
||||
break;
|
||||
}
|
||||
|
||||
getPrefManager ().putBoolean (preference.getKey (), value);
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onPreferenceClick(@NonNull Preference preference) {
|
||||
final String key = preference.getKey();
|
||||
switch (key) {
|
||||
case KEY_EDITOR_FONT_SIZE:
|
||||
showTextSizeDialog ();
|
||||
break;
|
||||
case KEY_EDITOR_PRINTABLE_CHARS:
|
||||
showPrintableCharsDialog ();
|
||||
break;
|
||||
case KEY_EDITOR_TAB_SIZE:
|
||||
showTabSizeDialog ();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void showTabSizeDialog() {
|
||||
final var screen = getPreferenceScreen ();
|
||||
final var commonCategory = new PreferenceCategory (getContext ());
|
||||
final var javaCategory = new PreferenceCategory (getContext ());
|
||||
|
||||
final var fontSize = new Preference (getContext ());
|
||||
final var nonPrintable = new Preference (getContext ());
|
||||
final var tabSize = new Preference (getContext ());
|
||||
final var drawHex = new SwitchPreference (getContext ());
|
||||
final var fontLigatures = new SwitchPreference (getContext ());
|
||||
final var autoSave = new SwitchPreference (getContext ());
|
||||
final var usePopupActions = new SwitchPreference (getContext ());
|
||||
final var horizontalPopup = new SwitchPreference (getContext ());
|
||||
|
||||
final var javaMatchLower = new SwitchPreference (getContext ());
|
||||
|
||||
screen.addPreference (commonCategory);
|
||||
screen.addPreference (javaCategory);
|
||||
|
||||
fontSize.setIcon (R.drawable.ic_text_size);
|
||||
fontSize.setKey (KEY_EDITOR_FONT_SIZE);
|
||||
fontSize.setTitle (R.string.idepref_editor_fontsize_title);
|
||||
fontSize.setSummary (R.string.idepref_editor_fontsize_summary);
|
||||
|
||||
nonPrintable.setIcon (R.drawable.ic_drawing);
|
||||
nonPrintable.setKey (KEY_EDITOR_PRINTABLE_CHARS);
|
||||
nonPrintable.setTitle (R.string.idepref_editor_paintingflags_title);
|
||||
nonPrintable.setSummary (R.string.idepref_editor_paintingflags_summary);
|
||||
|
||||
tabSize.setIcon (R.drawable.ic_tab);
|
||||
tabSize.setKey (KEY_EDITOR_TAB_SIZE);
|
||||
tabSize.setTitle (R.string.title_tab_size);
|
||||
tabSize.setSummary (R.string.msg_tab_size);
|
||||
|
||||
drawHex.setIcon (R.drawable.ic_hexadecimal);
|
||||
drawHex.setKey (KEY_EDITOR_DRAW_HEX);
|
||||
drawHex.setTitle (R.string.idepref_editor_drawhexcolors_title);
|
||||
drawHex.setSummary (R.string.idepref_editor_drawhexcolors_summary);
|
||||
|
||||
fontLigatures.setIcon (R.drawable.ic_font_ligatures);
|
||||
fontLigatures.setKey (KEY_EDITOR_FONT_LIGATURES);
|
||||
fontLigatures.setTitle (getString (R.string.idepref_editor_ligatures_title));
|
||||
fontLigatures.setSummary (getString (R.string.idepref_editor_ligatures_summary));
|
||||
|
||||
usePopupActions.setIcon (R.drawable.ic_text_actions);
|
||||
usePopupActions.setKey (KEY_EDITOR_USE_POPUP);
|
||||
usePopupActions.setTitle (getString (R.string.title_use_popup_actions));
|
||||
usePopupActions.setSummary (getString (R.string.msg_use_popup_actions));
|
||||
|
||||
horizontalPopup.setIcon (R.drawable.ic_text_actions_horizontal);
|
||||
horizontalPopup.setKey (KEY_EDITOR_HORIZONTAL_POPUP);
|
||||
horizontalPopup.setTitle (getString (R.string.title_use_horizontal_popup));
|
||||
horizontalPopup.setSummary (getString (R.string.msg_use_horizontal_popup));
|
||||
|
||||
autoSave.setIcon (R.drawable.ic_save);
|
||||
autoSave.setKey (KEY_EDITOR_AUTO_SAVE);
|
||||
autoSave.setTitle (getString (R.string.idepref_editor_autoSave_title));
|
||||
autoSave.setSummary (getString (R.string.idepref_editor_autoSave_summary));
|
||||
|
||||
javaMatchLower.setKey (KEY_JAVA_PREF_MATCH_LOWER);
|
||||
javaMatchLower.setIcon (R.drawable.ic_text_lower);
|
||||
javaMatchLower.setTitle (getString (R.string.idepref_java_matchLower_title));
|
||||
javaMatchLower.setSummary (getString (R.string.idepref_java_matchLower_summary));
|
||||
|
||||
commonCategory.setTitle (getString (R.string.idepref_editor_category_common));
|
||||
commonCategory.addPreference (fontSize);
|
||||
commonCategory.addPreference (fontLigatures);
|
||||
commonCategory.addPreference (usePopupActions);
|
||||
commonCategory.addPreference (horizontalPopup);
|
||||
commonCategory.addPreference (nonPrintable);
|
||||
commonCategory.addPreference (tabSize);
|
||||
commonCategory.addPreference (drawHex);
|
||||
commonCategory.addPreference (autoSave);
|
||||
|
||||
javaCategory.setTitle (getString (R.string.idepref_editor_category_java));
|
||||
javaCategory.addPreference (javaMatchLower);
|
||||
|
||||
setPreferenceScreen (screen);
|
||||
|
||||
fontSize.setOnPreferenceClickListener (this::onPreferenceClick);
|
||||
fontLigatures.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
usePopupActions.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
horizontalPopup.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
nonPrintable.setOnPreferenceClickListener (this::onPreferenceClick);
|
||||
tabSize.setOnPreferenceClickListener (this::onPreferenceClick);
|
||||
drawHex.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
autoSave.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
javaMatchLower.setOnPreferenceChangeListener (this::onPreferenceChange);
|
||||
|
||||
fontLigatures.setChecked (getPrefManager ().getBoolean (KEY_EDITOR_FONT_LIGATURES, true));
|
||||
usePopupActions.setChecked (getPrefManager ().getBoolean (KEY_EDITOR_USE_POPUP, false));
|
||||
horizontalPopup.setChecked (getPrefManager ().getBoolean (KEY_EDITOR_HORIZONTAL_POPUP, false));
|
||||
drawHex.setChecked (getPrefManager ().getBoolean (KEY_EDITOR_DRAW_HEX, true));
|
||||
autoSave.setChecked (getPrefManager ().getBoolean (KEY_EDITOR_AUTO_SAVE, false));
|
||||
javaMatchLower.setChecked (getPrefManager ().getBoolean (KEY_JAVA_PREF_MATCH_LOWER, false));
|
||||
}
|
||||
|
||||
public boolean onPreferenceChange (@NonNull Preference preference, Object newValue) {
|
||||
final boolean value = (boolean) newValue;
|
||||
|
||||
switch (preference.getKey ()) {
|
||||
case KEY_EDITOR_DRAW_HEX:
|
||||
ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED = true;
|
||||
break;
|
||||
case KEY_EDITOR_FONT_LIGATURES:
|
||||
ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED = true;
|
||||
break;
|
||||
case KEY_EDITOR_USE_POPUP:
|
||||
case KEY_EDITOR_HORIZONTAL_POPUP:
|
||||
ConstantsBridge.EDITOR_TEXT_ACTIONS_CHANGED = true;
|
||||
break;
|
||||
case KEY_JAVA_PREF_MATCH_LOWER:
|
||||
final var javaServer = StudioApp.getInstance ().getJavaLanguageServer ();
|
||||
javaServer.applySettings (PrefBasedJavaServerSettings.getInstance ());
|
||||
break;
|
||||
}
|
||||
|
||||
getPrefManager ().putBoolean (preference.getKey (), value);
|
||||
|
||||
final var horizontalPopup = findPreference (KEY_EDITOR_HORIZONTAL_POPUP);
|
||||
if (horizontalPopup != null) {
|
||||
horizontalPopup.setEnabled (getPrefManager ().getBoolean (KEY_EDITOR_USE_POPUP));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean onPreferenceClick (@NonNull Preference preference) {
|
||||
final String key = preference.getKey ();
|
||||
switch (key) {
|
||||
case KEY_EDITOR_FONT_SIZE:
|
||||
showTextSizeDialog ();
|
||||
break;
|
||||
case KEY_EDITOR_PRINTABLE_CHARS:
|
||||
showPrintableCharsDialog ();
|
||||
break;
|
||||
case KEY_EDITOR_TAB_SIZE:
|
||||
showTabSizeDialog ();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void showTabSizeDialog () {
|
||||
final MaterialAlertDialogBuilder builder = DialogUtils.newMaterialDialogBuilder (getContext ());
|
||||
final String[] sizes = new String[]{"2", "4", "6", "8"};
|
||||
|
||||
@@ -180,85 +210,89 @@ public class EditorPreferences extends BasePreferenceFragment {
|
||||
// Like, 2, 4, 6, 8, 10, etc
|
||||
//
|
||||
// If current tab size if 4, 4/2 = 2 and 2 - 1 = 1, so option at index 1 will be selected which is current tab size (4)!
|
||||
int current = (getPrefManager().getEditorTabSize() / 2) - 1;
|
||||
if(current < 0 || current >= sizes.length) current = 1;
|
||||
builder.setTitle(R.string.title_tab_size);
|
||||
builder.setSingleChoiceItems(sizes, current, (d, i) -> {
|
||||
d.dismiss();
|
||||
int current = (getPrefManager ().getEditorTabSize () / 2) - 1;
|
||||
if (current < 0 || current >= sizes.length) {
|
||||
current = 1;
|
||||
}
|
||||
builder.setTitle (R.string.title_tab_size);
|
||||
builder.setSingleChoiceItems (sizes, current, (d, i) -> {
|
||||
d.dismiss ();
|
||||
|
||||
// Reversing the logic applied above...
|
||||
// Reversing the logic applied above...
|
||||
int tabSize = (i + 1) * 2;
|
||||
if(tabSize < 2 || tabSize > 8) tabSize = 4;
|
||||
getPrefManager().putInt(KEY_EDITOR_TAB_SIZE, tabSize);
|
||||
if (tabSize < 2 || tabSize > 8) {
|
||||
tabSize = 4;
|
||||
}
|
||||
getPrefManager ().putInt (KEY_EDITOR_TAB_SIZE, tabSize);
|
||||
});
|
||||
builder.setCancelable(true);
|
||||
builder.show();
|
||||
builder.setCancelable (true);
|
||||
builder.show ();
|
||||
}
|
||||
|
||||
private void showTextSizeDialog () {
|
||||
final LayoutTextSizeSliderBinding binding = LayoutTextSizeSliderBinding.inflate (LayoutInflater.from (getContext ()));
|
||||
final MaterialAlertDialogBuilder builder = DialogUtils.newMaterialDialogBuilder (getContext ());
|
||||
float size = getPrefManager ().getFloat (KEY_EDITOR_FONT_SIZE, 14);
|
||||
if (size < 6 || size > 32) {
|
||||
size = 14;
|
||||
}
|
||||
changeTextSize (binding, size);
|
||||
|
||||
binding.slider.setLabelFormatter (p1 -> String.valueOf ((int) p1));
|
||||
builder.setTitle (R.string.title_change_text_size);
|
||||
builder.setMessage (R.string.msg_editor_font_size);
|
||||
builder.setView (binding.getRoot ());
|
||||
builder.setPositiveButton (android.R.string.ok, (p1, p2) -> {
|
||||
p1.dismiss ();
|
||||
float s = binding.slider.getValue ();
|
||||
changeTextSize (binding, s);
|
||||
});
|
||||
builder.setNeutralButton (R.string.reset, (p1, p2) -> changeTextSize (binding, 14));
|
||||
builder.setCancelable (false);
|
||||
builder.show ();
|
||||
}
|
||||
|
||||
private void changeTextSize (LayoutTextSizeSliderBinding binding, float size) {
|
||||
getPrefManager ().putFloat (KEY_EDITOR_FONT_SIZE, size);
|
||||
binding.slider.setValue (size);
|
||||
ConstantsBridge.EDITOR_PREF_SIZE_CHANGED = true;
|
||||
}
|
||||
|
||||
private void showPrintableCharsDialog () {
|
||||
String[] labels = {
|
||||
"Leading whitespaces",
|
||||
"Trailing whitespaces",
|
||||
"Inner whitespaces",
|
||||
"Whitespaces in empty lines",
|
||||
"Line breaks"
|
||||
};
|
||||
final boolean[] checked = {
|
||||
getPrefManager ().getBoolean (KEY_EDITOR_FLAG_WS_LEADING, true),
|
||||
getPrefManager ().getBoolean (KEY_EDITOR_FLAG_WS_TRAILING, false),
|
||||
getPrefManager ().getBoolean (KEY_EDITOR_FLAG_WS_INNER, true),
|
||||
getPrefManager ().getBoolean (KEY_EDITOR_FLAG_WS_EMPTY_LINE, true),
|
||||
getPrefManager ().getBoolean (KEY_EDITOR_FLAG_LINE_BREAK, true)
|
||||
};
|
||||
final MaterialAlertDialogBuilder builder = DialogUtils.newMaterialDialogBuilder (getContext ());
|
||||
builder.setTitle (R.string.idepref_editor_paintingflags_title);
|
||||
builder.setMultiChoiceItems (labels, checked, (dialog, which, isChecked) -> {
|
||||
|
||||
if (which == 0) {
|
||||
getPrefManager ().putBoolean (KEY_EDITOR_FLAG_WS_LEADING, isChecked);
|
||||
} else if (which == 1) {
|
||||
getPrefManager ().putBoolean (KEY_EDITOR_FLAG_WS_TRAILING, isChecked);
|
||||
} else if (which == 2) {
|
||||
getPrefManager ().putBoolean (KEY_EDITOR_FLAG_WS_INNER, isChecked);
|
||||
} else if (which == 3) {
|
||||
getPrefManager ().putBoolean (KEY_EDITOR_FLAG_WS_EMPTY_LINE, isChecked);
|
||||
} else if (which == 4) {
|
||||
getPrefManager ().putBoolean (KEY_EDITOR_FLAG_LINE_BREAK, isChecked);
|
||||
}
|
||||
|
||||
ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED = true;
|
||||
});
|
||||
builder.setPositiveButton (android.R.string.ok, null);
|
||||
builder.setCancelable (false);
|
||||
builder.show ();
|
||||
}
|
||||
|
||||
private void showTextSizeDialog() {
|
||||
final LayoutTextSizeSliderBinding binding = LayoutTextSizeSliderBinding.inflate(LayoutInflater.from(getContext()));
|
||||
final MaterialAlertDialogBuilder builder = DialogUtils.newMaterialDialogBuilder (getContext ());
|
||||
float size = getPrefManager().getFloat(KEY_EDITOR_FONT_SIZE, 14);
|
||||
if(size < 6 || size > 32) {
|
||||
size = 14;
|
||||
}
|
||||
changeTextSize(binding, size);
|
||||
|
||||
binding.slider.setLabelFormatter(p1 -> String.valueOf((int) p1));
|
||||
builder.setTitle(R.string.title_change_text_size);
|
||||
builder.setMessage(R.string.msg_editor_font_size);
|
||||
builder.setView(binding.getRoot());
|
||||
builder.setPositiveButton(android.R.string.ok, (p1, p2) -> {
|
||||
p1.dismiss();
|
||||
float s = binding.slider.getValue();
|
||||
changeTextSize(binding, s);
|
||||
});
|
||||
builder.setNeutralButton(R.string.reset, (p1, p2) -> changeTextSize(binding, 14));
|
||||
builder.setCancelable(false);
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void changeTextSize(LayoutTextSizeSliderBinding binding, float size) {
|
||||
getPrefManager().putFloat(KEY_EDITOR_FONT_SIZE, size);
|
||||
binding.slider.setValue(size);
|
||||
ConstantsBridge.EDITOR_PREF_SIZE_CHANGED = true;
|
||||
}
|
||||
|
||||
private void showPrintableCharsDialog() {
|
||||
String[] labels = {
|
||||
"Leading whitespaces",
|
||||
"Trailing whitespaces",
|
||||
"Inner whitespaces",
|
||||
"Whitespaces in empty lines",
|
||||
"Line breaks"
|
||||
};
|
||||
final boolean[] checked = {
|
||||
getPrefManager().getBoolean(KEY_EDITOR_FLAG_WS_LEADING, true),
|
||||
getPrefManager().getBoolean(KEY_EDITOR_FLAG_WS_TRAILING, false),
|
||||
getPrefManager().getBoolean(KEY_EDITOR_FLAG_WS_INNER, true),
|
||||
getPrefManager().getBoolean(KEY_EDITOR_FLAG_WS_EMPTY_LINE, true),
|
||||
getPrefManager().getBoolean(KEY_EDITOR_FLAG_LINE_BREAK, true)
|
||||
};
|
||||
final MaterialAlertDialogBuilder builder = DialogUtils.newMaterialDialogBuilder (getContext ());
|
||||
builder.setTitle(R.string.idepref_editor_paintingflags_title);
|
||||
builder.setMultiChoiceItems(labels, checked, (dialog, which, isChecked) -> {
|
||||
|
||||
if(which == 0) {
|
||||
getPrefManager().putBoolean(KEY_EDITOR_FLAG_WS_LEADING, isChecked);
|
||||
} else if(which == 1) {
|
||||
getPrefManager().putBoolean(KEY_EDITOR_FLAG_WS_TRAILING, isChecked);
|
||||
} else if(which == 2) {
|
||||
getPrefManager().putBoolean(KEY_EDITOR_FLAG_WS_INNER, isChecked);
|
||||
} else if(which == 3) {
|
||||
getPrefManager().putBoolean(KEY_EDITOR_FLAG_WS_EMPTY_LINE, isChecked);
|
||||
} else if(which == 4) {
|
||||
getPrefManager().putBoolean(KEY_EDITOR_FLAG_LINE_BREAK, isChecked);
|
||||
}
|
||||
|
||||
ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED = true;
|
||||
});
|
||||
builder.setPositiveButton(android.R.string.ok, null);
|
||||
builder.setCancelable(false);
|
||||
builder.show();
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,6 @@ import java.util.Objects;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import io.github.rosemoe.sora.event.ContentChangeEvent;
|
||||
import io.github.rosemoe.sora.event.SelectionChangeEvent;
|
||||
import io.github.rosemoe.sora.lang.EmptyLanguage;
|
||||
import io.github.rosemoe.sora.text.Content;
|
||||
|
||||
@@ -290,6 +289,7 @@ public class CodeEditorView extends FrameLayout {
|
||||
private void configureEditorIfNeeded () {
|
||||
boolean sizeChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_SIZE_CHANGED;
|
||||
boolean ligaturesChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED;
|
||||
boolean popupChanged = isFirstCreate || ConstantsBridge.EDITOR_TEXT_ACTIONS_CHANGED;
|
||||
boolean flagsChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED;
|
||||
boolean drawHexChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED;
|
||||
final PreferenceManager prefs = StudioApp.getInstance ().getPrefManager ();
|
||||
@@ -307,6 +307,7 @@ public class CodeEditorView extends FrameLayout {
|
||||
if (ligaturesChanged) {
|
||||
var enabled = prefs.getBoolean (PreferenceManager.KEY_EDITOR_FONT_LIGATURES, true);
|
||||
binding.editor.setLigatureEnabled (enabled);
|
||||
ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED = false;
|
||||
}
|
||||
|
||||
if (flagsChanged) {
|
||||
@@ -335,6 +336,11 @@ public class CodeEditorView extends FrameLayout {
|
||||
ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED = false;
|
||||
}
|
||||
|
||||
if (popupChanged) {
|
||||
binding.editor.setTextActionPresenter (binding.editor.chooseTextActionPresenter ());
|
||||
ConstantsBridge.EDITOR_TEXT_ACTIONS_CHANGED = false;
|
||||
}
|
||||
|
||||
if (drawHexChanged) {
|
||||
// TODO Do something about this
|
||||
// Maybe use spans...
|
||||
|
||||
@@ -32,7 +32,6 @@ import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import io.github.rosemoe.sora.event.ClickEvent;
|
||||
import io.github.rosemoe.sora.event.LongPressEvent;
|
||||
import io.github.rosemoe.sora.event.SelectionChangeEvent;
|
||||
import io.github.rosemoe.sora.widget.component.EditorTextActionWindow;
|
||||
|
||||
@@ -45,6 +44,7 @@ public class EditorTextActionMode implements IDEEditor.ITextActionPresenter {
|
||||
|
||||
private IDEEditor editor;
|
||||
private ActionMode actionMode;
|
||||
private boolean unsubscribeEvents = false;
|
||||
|
||||
private final Set<IDEEditor.TextAction> registeredActions = new TreeSet<> ();
|
||||
|
||||
@@ -60,6 +60,12 @@ public class EditorTextActionMode implements IDEEditor.ITextActionPresenter {
|
||||
this.editor.getComponent (EditorTextActionWindow.class).setEnabled (false);
|
||||
|
||||
this.editor.subscribeEvent (SelectionChangeEvent.class, ((event, unsubscribe) -> {
|
||||
|
||||
if (unsubscribeEvents) {
|
||||
unsubscribe.unsubscribe ();
|
||||
return;
|
||||
}
|
||||
|
||||
final var left = event.getLeft ();
|
||||
final var right = event.getRight ();
|
||||
if (left.index != right.index) {
|
||||
@@ -68,13 +74,14 @@ public class EditorTextActionMode implements IDEEditor.ITextActionPresenter {
|
||||
}));
|
||||
|
||||
// When click event is received, finish the action mode if it is started
|
||||
this.editor.subscribeEvent (ClickEvent.class, (event, unsubscribe) -> exit ());
|
||||
|
||||
// Start action mode even if no text is selected
|
||||
this.editor.subscribeEvent (LongPressEvent.class, (event, unsubscribe) -> {
|
||||
if (actionMode == null) {
|
||||
showAction ();
|
||||
this.editor.subscribeEvent (ClickEvent.class, (event, unsubscribe) -> {
|
||||
|
||||
if (unsubscribeEvents) {
|
||||
unsubscribe.unsubscribe ();
|
||||
return;
|
||||
}
|
||||
|
||||
exit ();
|
||||
});
|
||||
|
||||
clearRegisteredActions ();
|
||||
@@ -87,6 +94,19 @@ public class EditorTextActionMode implements IDEEditor.ITextActionPresenter {
|
||||
this.registeredActions.add (action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy () {
|
||||
|
||||
if (actionMode != null) {
|
||||
exit ();
|
||||
}
|
||||
|
||||
this.registeredActions.clear ();
|
||||
this.editor = null;
|
||||
this.actionMode = null;
|
||||
this.unsubscribeEvents = true;
|
||||
}
|
||||
|
||||
public void clearRegisteredActions () {
|
||||
this.registeredActions.clear ();
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.itsaky.androidide.R;
|
||||
import com.itsaky.androidide.adapters.TextActionItemAdapter;
|
||||
import com.itsaky.androidide.app.StudioApp;
|
||||
import com.itsaky.androidide.managers.PreferenceManager;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
@@ -57,6 +59,7 @@ public class EditorTextActionWindow extends EditorPopupWindow implements IDEEdit
|
||||
private final static long DELAY = 200;
|
||||
private long mLastScroll;
|
||||
private int mLastPosition;
|
||||
private boolean unsubscribeEvents = false;
|
||||
|
||||
private final Set<IDEEditor.TextAction> registeredActions = new TreeSet<> ();
|
||||
|
||||
@@ -80,7 +83,6 @@ public class EditorTextActionWindow extends EditorPopupWindow implements IDEEdit
|
||||
this.touchHandler = editor.getEventHandler ();
|
||||
this.actionsList = new RecyclerView (editor.getContext ());
|
||||
this.actionsList.setLayoutParams (new ViewGroup.LayoutParams (ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
this.actionsList.setLayoutManager (new LinearLayoutManager (editor.getContext ()));
|
||||
this.actionsList.setBackground (createBackground ());
|
||||
this.actionsList.setVerticalFadingEdgeEnabled (true);
|
||||
this.actionsList.setFadingEdgeLength ((int) (10 * editor.getDpUnit ()));
|
||||
@@ -89,10 +91,41 @@ public class EditorTextActionWindow extends EditorPopupWindow implements IDEEdit
|
||||
|
||||
setContentView (this.actionsList);
|
||||
subscribeToEvents ();
|
||||
applyLayoutManager ();
|
||||
|
||||
this.registeredActions.clear ();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerAction (@NonNull IDEEditor.TextAction action) {
|
||||
Objects.requireNonNull (editor, "No editor attached!");
|
||||
|
||||
this.registeredActions.add (action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy () {
|
||||
|
||||
if (isShowing ()) {
|
||||
dismiss ();
|
||||
}
|
||||
|
||||
this.registeredActions.clear ();
|
||||
this.editor = null;
|
||||
this.actionsList = null;
|
||||
this.unsubscribeEvents = true;
|
||||
}
|
||||
|
||||
private void applyLayoutManager () {
|
||||
final var manager = StudioApp.getInstance ().getPrefManager ();
|
||||
final var horizontal = manager.getBoolean (PreferenceManager.KEY_EDITOR_HORIZONTAL_POPUP, false);
|
||||
if (horizontal) {
|
||||
this.actionsList.setLayoutManager (new LinearLayoutManager (this.actionsList.getContext (), LinearLayoutManager.HORIZONTAL, false));
|
||||
} else {
|
||||
this.actionsList.setLayoutManager (new LinearLayoutManager (this.actionsList.getContext ()));
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Drawable createBackground () {
|
||||
final var drawable = new GradientDrawable ();
|
||||
@@ -102,28 +135,22 @@ public class EditorTextActionWindow extends EditorPopupWindow implements IDEEdit
|
||||
return drawable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerAction (@NonNull IDEEditor.TextAction action) {
|
||||
Objects.requireNonNull (editor, "No editor attached!");
|
||||
|
||||
this.registeredActions.add (action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show () {
|
||||
Objects.requireNonNull (editor, "No editor attached!");
|
||||
|
||||
final var dp16 = editor.getDpUnit () * 16;
|
||||
final var actions = this.registeredActions.stream ()
|
||||
.filter (action -> this.editor.shouldShowTextAction (action.id))
|
||||
.collect (Collectors.toList ());
|
||||
this.actionsList.setAdapter (new TextActionItemAdapter (actions, this::performTextAction));
|
||||
this.actionsList.measure (
|
||||
View.MeasureSpec.makeMeasureSpec (
|
||||
editor.getWidth (),
|
||||
(int) (editor.getWidth () - dp16 * 2), // 16dp margins from start and end
|
||||
View.MeasureSpec.AT_MOST
|
||||
),
|
||||
View.MeasureSpec.makeMeasureSpec (
|
||||
(int) (260 * editor.getDpUnit ()), // 260dp at most
|
||||
(int) ((int) (260 * editor.getDpUnit ()) - dp16 * 2), // 260dp at most and 16dp margins from top and bottom
|
||||
View.MeasureSpec.AT_MOST
|
||||
)
|
||||
);
|
||||
@@ -134,6 +161,11 @@ public class EditorTextActionWindow extends EditorPopupWindow implements IDEEdit
|
||||
|
||||
private void subscribeToEvents () {
|
||||
this.editor.subscribeEvent (SelectionChangeEvent.class, (event, unsubscribe) -> {
|
||||
if (unsubscribeEvents) {
|
||||
unsubscribe.unsubscribe ();
|
||||
return;
|
||||
}
|
||||
|
||||
if (touchHandler.hasAnyHeldHandle ()) {
|
||||
return;
|
||||
}
|
||||
@@ -160,6 +192,11 @@ public class EditorTextActionWindow extends EditorPopupWindow implements IDEEdit
|
||||
}
|
||||
});
|
||||
this.editor.subscribeEvent (ScrollEvent.class, ((event, unsubscribe) -> {
|
||||
if (unsubscribeEvents) {
|
||||
unsubscribe.unsubscribe ();
|
||||
return;
|
||||
}
|
||||
|
||||
var last = mLastScroll;
|
||||
mLastScroll = System.currentTimeMillis ();
|
||||
if (mLastScroll - last < DELAY) {
|
||||
@@ -167,6 +204,12 @@ public class EditorTextActionWindow extends EditorPopupWindow implements IDEEdit
|
||||
}
|
||||
}));
|
||||
this.editor.subscribeEvent (HandleStateChangeEvent.class, ((event, unsubscribe) -> {
|
||||
|
||||
if (unsubscribeEvents) {
|
||||
unsubscribe.unsubscribe ();
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.isHeld ()) {
|
||||
postDisplay ();
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import com.itsaky.androidide.R;
|
||||
import com.itsaky.androidide.app.StudioApp;
|
||||
import com.itsaky.androidide.language.IDELanguage;
|
||||
import com.itsaky.androidide.lsp.IDELanguageClientImpl;
|
||||
import com.itsaky.androidide.managers.PreferenceManager;
|
||||
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE;
|
||||
import com.itsaky.androidide.utils.Logger;
|
||||
import com.itsaky.lsp.api.ILanguageServer;
|
||||
@@ -58,6 +59,8 @@ import com.itsaky.lsp.models.SignatureHelp;
|
||||
import com.itsaky.lsp.models.SignatureHelpParams;
|
||||
import com.itsaky.toaster.Toaster;
|
||||
|
||||
import org.jetbrains.annotations.Contract;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -98,7 +101,7 @@ public class IDEEditor extends CodeEditor {
|
||||
super (context, attrs, defStyleAttr, defStyleRes);
|
||||
|
||||
setColorScheme (new SchemeAndroidIDE ());
|
||||
setTextActionPresenter (new EditorTextActionWindow (this));
|
||||
setTextActionPresenter (chooseTextActionPresenter ());
|
||||
subscribeEvent (SelectionChangeEvent.class, (event, unsubscribe) -> handleSelectionChange (event));
|
||||
subscribeEvent (ContentChangeEvent.class, (event, unsubscribe) -> handleContentChange (event));
|
||||
|
||||
@@ -109,6 +112,18 @@ public class IDEEditor extends CodeEditor {
|
||||
| EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Contract(" -> new")
|
||||
public ITextActionPresenter chooseTextActionPresenter () {
|
||||
final var prefs = StudioApp.getInstance ().getPrefManager ();
|
||||
final var usePopup = prefs.getBoolean (PreferenceManager.KEY_EDITOR_USE_POPUP, false);
|
||||
if (usePopup) {
|
||||
return new EditorTextActionWindow (this);
|
||||
} else {
|
||||
return new EditorTextActionMode ();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set selection to the given range.
|
||||
*
|
||||
@@ -567,6 +582,7 @@ public class IDEEditor extends CodeEditor {
|
||||
*
|
||||
* @return The {@link Position} of the cursor.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public Position getCursorAsLSPPosition () {
|
||||
return new Position (getCursor ().getLeftLine (), getCursor ().getLeftColumn ());
|
||||
}
|
||||
@@ -590,6 +606,12 @@ public class IDEEditor extends CodeEditor {
|
||||
*/
|
||||
public void setTextActionPresenter (@NonNull ITextActionPresenter actionPresenter) {
|
||||
Objects.requireNonNull (actionPresenter, "Cannot set text action presenter to null");
|
||||
|
||||
if (mTextActionPresenter != null) {
|
||||
mTextActionPresenter.destroy ();
|
||||
mTextActionPresenter = null;
|
||||
}
|
||||
|
||||
this.mTextActionPresenter = actionPresenter;
|
||||
|
||||
actionPresenter.bindEditor (this);
|
||||
@@ -601,6 +623,7 @@ public class IDEEditor extends CodeEditor {
|
||||
*
|
||||
* @return The attached text action presenter.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public ITextActionPresenter getTextActionPresenter () {
|
||||
return mTextActionPresenter;
|
||||
}
|
||||
@@ -830,7 +853,7 @@ public class IDEEditor extends CodeEditor {
|
||||
* Notify the language server that the content of this file
|
||||
* has been changed.
|
||||
*
|
||||
* @param event
|
||||
* @param event The content change event.
|
||||
*/
|
||||
private void handleContentChange (ContentChangeEvent event) {
|
||||
|
||||
@@ -903,7 +926,7 @@ public class IDEEditor extends CodeEditor {
|
||||
/**
|
||||
* Bind the action presenter with the given editor instance.
|
||||
*
|
||||
* @param editor
|
||||
* @param editor The editor to bind with.
|
||||
*/
|
||||
void bindEditor (@NonNull IDEEditor editor);
|
||||
|
||||
@@ -913,6 +936,12 @@ public class IDEEditor extends CodeEditor {
|
||||
* @param action The action to register.
|
||||
*/
|
||||
void registerAction (@NonNull TextAction action);
|
||||
|
||||
/**
|
||||
* Destroy this action presenter. The presenter should unsubscribe
|
||||
* from any subscribed events and release any held resources.
|
||||
*/
|
||||
void destroy ();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<!-- drawable/cursor_text.xml -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="24dp"
|
||||
android:width="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path android:fillColor="#ffffff" android:pathData="M13,19A1,1 0 0,0 14,20H16V22H13.5C12.95,22 12,21.55 12,21C12,21.55 11.05,22 10.5,22H8V20H10A1,1 0 0,0 11,19V5A1,1 0 0,0 10,4H8V2H10.5C11.05,2 12,2.45 12,3C12,2.45 12.95,2 13.5,2H16V4H14A1,1 0 0,0 13,5V19Z" />
|
||||
</vector>
|
||||
@@ -0,0 +1,8 @@
|
||||
<!-- drawable/arrow_expand_horizontal.xml -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:height="24dp"
|
||||
android:width="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path android:fillColor="#ffffff" android:pathData="M9,11H15V8L19,12L15,16V13H9V16L5,12L9,8V11M2,20V4H4V20H2M20,20V4H22V20H20Z" />
|
||||
</vector>
|
||||
@@ -370,4 +370,8 @@
|
||||
|
||||
<string name="yes">Yes</string>
|
||||
<string name="no">No</string>
|
||||
<string name="title_use_popup_actions">Floating text actions</string>
|
||||
<string name="msg_use_popup_actions">Use PopupWindow for showing text actions</string>
|
||||
<string name="title_use_horizontal_popup">Horizontal text actions</string>
|
||||
<string name="msg_use_horizontal_popup">Make the floating text actions appear horizontally.</string>
|
||||
</resources>
|
||||
|
||||
@@ -44,6 +44,8 @@ public class PreferenceManager {
|
||||
public static final String KEY_EDITOR_TAB_SIZE = "idepref_editor_tabSize";
|
||||
public static final String KEY_EDITOR_AUTO_SAVE = "idepref_editor_autoSave";
|
||||
public static final String KEY_EDITOR_FONT_LIGATURES = "idepref_editor_fontLigatures";
|
||||
public static final String KEY_EDITOR_USE_POPUP = "idepref_editor_usePopup";
|
||||
public static final String KEY_EDITOR_HORIZONTAL_POPUP = "idepref_editor_horizontalPopup";
|
||||
|
||||
public static final String KEY_GRADLE_CMD_STACK_TRACE = "idepref_gradleCmd_stacktrace";
|
||||
public static final String KEY_GRADLE_CMD_DEBUG = "idepref_gradleCmd_debug";
|
||||
|
||||
@@ -21,6 +21,7 @@ public class ConstantsBridge {
|
||||
|
||||
public static boolean EDITOR_PREF_SIZE_CHANGED = false;
|
||||
public static boolean EDITOR_PREF_LIGATURES_CHANGED = false;
|
||||
public static boolean EDITOR_TEXT_ACTIONS_CHANGED = false;
|
||||
public static boolean EDITOR_PREF_FLAGS_CHANGED = false;
|
||||
public static boolean EDITOR_PREF_DRAW_HEX_CHANGED = false;
|
||||
public static boolean CLASS_LOAD_SUCCESS = true;
|
||||
|
||||
Reference in New Issue
Block a user