Skip to content

Commit 8f7587b

Browse files
authored
Merge branch 'master' into l10n_master
2 parents e220a76 + 0e94057 commit 8f7587b

File tree

8 files changed

+97
-55
lines changed

8 files changed

+97
-55
lines changed

app/src/main/java/net/gsantner/markor/format/ActionButtonBase.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,6 @@ private List<String> loadActionPreference(final String suffix) {
251251
public List<String> getActionOrder() {
252252
final Set<String> order = new LinkedHashSet<>(loadActionPreference(ORDER_SUFFIX));
253253

254-
// Handle the case where order was stored without suffix. i.e. before this release.
255-
if (order.isEmpty()) {
256-
order.addAll(loadActionPreference(""));
257-
}
258-
259254
final Set<String> defined = new LinkedHashSet<>(getActiveActionKeys());
260255
final Set<String> disabled = new LinkedHashSet<>(getDisabledActions());
261256

@@ -302,7 +297,7 @@ public void recreateActionButtons(final ViewGroup barLayout, final ActionItem.Di
302297
@SuppressLint("ClickableViewAccessibility")
303298
private void setupRepeat(final View btn) {
304299
// Velocity and acceleration parameters
305-
final int INITIAL_DELAY = 400, DELTA_DELAY = 50, MIN_DELAY = 100;
300+
final int INITIAL_DELAY = 300, DELTA_DELAY = 100, MIN_DELAY = 100;
306301
final Handler handler = new Handler();
307302

308303
final Runnable repeater = new Runnable() {

app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ private AlertDialog makeDialog(final File basedir, final boolean allowCreateDir,
162162
templateAdapter.addAll(GsCollectionUtils.map(templates, p -> p.first));
163163
templateSpinner.setAdapter(templateAdapter);
164164

165+
templateSpinner.setOnItemSelectedListener(new GsAndroidSpinnerOnItemSelectedAdapter(pos -> {
166+
final String template = templateAdapter.getItem(pos);
167+
final String fmt = appSettings.getTemplateTitleFormat(template);
168+
formatEdit.setText(fmt);
169+
}));
170+
165171
// Setup type / format spinner and action
166172
// -----------------------------------------------------------------------------------------
167173
final ArrayAdapter<String> typeAdapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_dropdown_item);

app/src/main/java/net/gsantner/markor/frontend/textview/HighlightingEditor.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818
import android.text.Layout;
1919
import android.text.TextWatcher;
2020
import android.util.AttributeSet;
21+
import android.view.ActionMode;
2122
import android.util.Log;
2223
import android.view.KeyEvent;
24+
import android.view.Menu;
25+
import android.view.MenuItem;
2326
import android.view.View;
2427
import android.view.ViewTreeObserver;
2528
import android.view.accessibility.AccessibilityEvent;
@@ -30,6 +33,7 @@
3033
import androidx.appcompat.widget.AppCompatEditText;
3134

3235
import net.gsantner.markor.ApplicationObject;
36+
import net.gsantner.markor.R;
3337
import net.gsantner.markor.activity.MainActivity;
3438
import net.gsantner.markor.model.AppSettings;
3539
import net.gsantner.opoc.format.GsTextUtils;
@@ -114,6 +118,9 @@ public void afterTextChanged(final Editable s) {
114118

115119
// Fix for Android 12 perf issues - https://github.com/gsantner/markor/discussions/1794
116120
setEmojiCompatEnabled(false);
121+
122+
// Custom options
123+
setupCustomOptions();
117124
}
118125

119126
@Override
@@ -522,6 +529,11 @@ public void withAutoFormatDisabled(final GsCallback.a0 callback) {
522529
// Utility functions for interaction
523530
// ---------------------------------------------------------------------------------------------
524531

532+
public void selectLines() {
533+
final int[] sel = TextViewUtils.getLineSelection(this);
534+
setSelection(sel[0], sel[1]);
535+
}
536+
525537
public void simulateKeyPress(int keyEvent_KEYCODE_SOMETHING) {
526538
dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyEvent_KEYCODE_SOMETHING, 0));
527539
dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyEvent_KEYCODE_SOMETHING, 0));
@@ -742,4 +754,37 @@ public void reset() {
742754
_maxNumberDigits = 0;
743755
}
744756
}
757+
758+
private void setupCustomOptions() {
759+
setCustomSelectionActionModeCallback(new ActionMode.Callback() {
760+
@Override
761+
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
762+
// Add custom items programmatically
763+
menu.add(0, R.string.option_select_lines, 0, "☰");
764+
return true;
765+
}
766+
767+
@Override
768+
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
769+
// Modify menu items here if necessary
770+
return true;
771+
}
772+
773+
@Override
774+
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
775+
switch (item.getItemId()) {
776+
case R.string.option_select_lines:
777+
HighlightingEditor.this.selectLines();
778+
return true;
779+
default:
780+
return false;
781+
}
782+
}
783+
784+
@Override
785+
public void onDestroyActionMode(ActionMode mode) {
786+
// Cleanup if needed
787+
}
788+
});
789+
}
745790
}

app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ public void onViewCreated(final View root, final @Nullable Bundle savedInstanceS
173173

174174
_filesystemViewerAdapter = new GsFileBrowserListAdapter(_dopt, activity);
175175
_recyclerList.setAdapter(_filesystemViewerAdapter);
176-
_filesystemViewerAdapter.getFilter().filter("");
177176
onFsViewerDoUiUpdate(_filesystemViewerAdapter);
178177

179178
// Setup callbacks

app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceStat
124124

125125
_filesystemViewerAdapter = new GsFileBrowserListAdapter(_dopt, context);
126126
_recyclerList.setAdapter(_filesystemViewerAdapter);
127-
_filesystemViewerAdapter.getFilter().filter("");
128127
onFsViewerDoUiUpdate(_filesystemViewerAdapter);
129128

130129
_swipe.setOnRefreshListener(() -> {

app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserListAdapter.java

Lines changed: 43 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public class GsFileBrowserListAdapter extends RecyclerView.Adapter<GsFileBrowser
8989
private File _fileToShowAfterNextLoad;
9090
private File _currentFolder;
9191
private final Context _context;
92-
private StringFilter _filter;
92+
private final StringFilter _filter;
9393
private RecyclerView _recyclerView;
9494
private LinearLayoutManager _layoutManager;
9595
private final Map<File, File> _virtualMapping;
@@ -139,6 +139,7 @@ public GsFileBrowserListAdapter(GsFileBrowserOptions.Options options, Context co
139139
_virtualMapping = Collections.unmodifiableMap(getVirtualFolders());
140140
_reverseVirtualMapping = Collections.unmodifiableMap(GsCollectionUtils.reverse(_virtualMapping));
141141
loadFolder(_dopt.startFolder != null ? _dopt.startFolder : _dopt.rootFolder, null);
142+
_filter = new StringFilter(this);
142143
}
143144

144145
public Map<File, File> getVirtualFolders() {
@@ -367,9 +368,6 @@ public int getItemCount() {
367368

368369
@Override
369370
public Filter getFilter() {
370-
if (_filter == null) {
371-
_filter = new StringFilter(this, _adapterData);
372-
}
373371
return _filter;
374372
}
375373

@@ -600,7 +598,7 @@ public void showFile(final File file) {
600598
return;
601599
}
602600

603-
if (getFilePosition(file) < 0) {
601+
if (!_adapterDataFiltered.contains(file)) {
604602
final File dir = file.getParentFile();
605603
if (dir != null) {
606604
loadFolder(dir, file);
@@ -620,13 +618,19 @@ public void onLayoutChange(View v, int l, int t, int r, int b, int ol, int ot, i
620618
});
621619
}
622620

621+
private void postScrollToAndFlash(final File file) {
622+
if (_recyclerView != null && file != null) {
623+
_recyclerView.post(() -> scrollToAndFlash(file));
624+
}
625+
}
626+
623627
/**
624628
* Scroll to a file in current folder and flash
625629
*
626630
* @param file File to blink
627631
*/
628632
public boolean scrollToAndFlash(final File file) {
629-
final int pos = getFilePosition(file);
633+
final int pos = _adapterDataFiltered.indexOf(file);
630634
if (pos >= 0 && _layoutManager != null) {
631635
_layoutManager.scrollToPosition(pos);
632636
_recyclerView.post(() ->
@@ -641,19 +645,6 @@ public boolean scrollToAndFlash(final File file) {
641645
return false;
642646
}
643647

644-
// Get the position of a file in the current view
645-
// -1 if file is not a child of the current directory
646-
public int getFilePosition(final File file) {
647-
if (file != null) {
648-
for (int i = 0; i < _adapterDataFiltered.size(); i++) {
649-
if (_adapterDataFiltered.get(i).equals(file)) {
650-
return i;
651-
}
652-
}
653-
}
654-
return -1;
655-
}
656-
657648
private static final ExecutorService executorService = new ThreadPoolExecutor(0, 3, 60, TimeUnit.SECONDS, new SynchronousQueue<>());
658649

659650
private void loadFolder(final File folder, final File show) {
@@ -696,6 +687,11 @@ private void loadFolder(final File folder, final File show) {
696687

697688
// This function is not called on the main thread, so post to the UI thread
698689
private synchronized void _loadFolder(final @NonNull File folder, final @Nullable File toShow) {
690+
691+
if (_recyclerView == null) {
692+
return;
693+
}
694+
699695
final boolean folderChanged = !folder.equals(_currentFolder);
700696
final List<File> newData = new ArrayList<>();
701697

@@ -717,7 +713,6 @@ private synchronized void _loadFolder(final @NonNull File folder, final @Nullabl
717713
newData.add(new File(folder, "0"));
718714
}
719715

720-
721716
if (folder.equals(VIRTUAL_STORAGE_RECENTS)) {
722717
newData.addAll(_dopt.recentFiles);
723718
} else if (folder.equals(VIRTUAL_STORAGE_POPULAR)) {
@@ -756,16 +751,17 @@ private synchronized void _loadFolder(final @NonNull File folder, final @Nullabl
756751
}
757752
}
758753

759-
if (_recyclerView == null) {
760-
//noinspection UnnecessaryReturnStatement
761-
return;
762-
} else if (folderChanged || modSumChanged || !newData.equals(_adapterData)) {
754+
if (folderChanged || modSumChanged || !newData.equals(_adapterData)) {
755+
final ArrayList<File> filteredData = new ArrayList<>();
756+
_filter._filter(newData, filteredData);
757+
763758
_recyclerView.post(() -> {
764759
// Modify all these values in the UI thread
765760
_adapterData.clear();
766761
_adapterData.addAll(newData);
762+
_adapterDataFiltered.clear();
763+
_adapterDataFiltered.addAll(filteredData);
767764
_currentSelection.retainAll(_adapterData);
768-
_filter.filter(_filter._lastFilter);
769765
_currentFolder = folder;
770766
_prevModSum = modSum;
771767

@@ -782,18 +778,18 @@ private synchronized void _loadFolder(final @NonNull File folder, final @Nullabl
782778
_layoutManager.onRestoreInstanceState(_folderScrollMap.remove(_currentFolder));
783779
}
784780

785-
_recyclerView.post(() -> scrollToAndFlash(toShow));
781+
postScrollToAndFlash(toShow);
786782
});
787-
} else if (toShow != null && _adapterDataFiltered.contains(toShow)) {
788-
_recyclerView.post(() -> scrollToAndFlash(toShow));
783+
} else {
784+
postScrollToAndFlash(toShow);
789785
}
790786

791787
if (_dopt.listener != null) {
792788
_dopt.listener.onFsViewerDoUiUpdate(GsFileBrowserListAdapter.this);
793789
}
794790
});
795-
} else if (toShow != null && _adapterDataFiltered.contains(toShow)) {
796-
_recyclerView.post(() -> scrollToAndFlash(toShow));
791+
} else {
792+
postScrollToAndFlash(toShow);
797793
}
798794
}
799795

@@ -835,39 +831,40 @@ public boolean isCurrentFolderHome() {
835831
//########################
836832
private static class StringFilter extends Filter {
837833
private final GsFileBrowserListAdapter _adapter;
838-
private final List<File> _originalList;
839834
private final List<File> _filteredList;
840-
public CharSequence _lastFilter = "";
835+
public String _lastFilter = "";
841836

842-
private StringFilter(GsFileBrowserListAdapter adapter, List<File> adapterData) {
837+
private StringFilter(final GsFileBrowserListAdapter adapter) {
843838
super();
844839
_adapter = adapter;
845-
_originalList = adapterData;
846840
_filteredList = new ArrayList<>();
847841
}
848842

849843
@Override
850844
protected FilterResults performFiltering(CharSequence constraint) {
851845
final FilterResults results = new FilterResults();
852-
constraint = constraint.toString().toLowerCase(Locale.getDefault()).trim();
853-
_filteredList.clear();
854846

855-
if (constraint.length() == 0) {
856-
_filteredList.addAll(_originalList);
857-
} else {
858-
for (File file : _originalList) {
859-
if (file.getName().toLowerCase(Locale.getDefault()).contains(constraint)) {
860-
_filteredList.add(file);
861-
}
862-
}
863-
}
847+
_lastFilter = constraint.toString().toLowerCase().trim();
848+
_filter(_adapter._adapterData, _filteredList);
864849

865-
_lastFilter = constraint;
866850
results.values = _filteredList;
867851
results.count = _filteredList.size();
868852
return results;
869853
}
870854

855+
public void _filter(final List<File> all, final List<File> filtered) {
856+
filtered.clear();
857+
if (_lastFilter.isEmpty()) {
858+
filtered.addAll(all);
859+
} else {
860+
for (final File file : all) {
861+
if (file.getName().toLowerCase().contains(_lastFilter)) {
862+
filtered.add(file);
863+
}
864+
}
865+
}
866+
}
867+
871868
@Override
872869
@SuppressWarnings("unchecked")
873870
protected void publishResults(CharSequence constraint, FilterResults results) {

app/src/main/res/layout/new_file_dialog.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@
150150
android:text="@string/template"
151151
android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
152152

153-
<Spinner
153+
<view class="net.gsantner.markor.frontend.NewFileDialog$ReselectSpinner"
154154
android:id="@+id/new_file_dialog__template"
155155
android:layout_width="match_parent"
156156
android:layout_height="wrap_content"

app/src/main/res/values/string-not_translatable.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,4 +433,5 @@ work. If not, see <https://creativecommons.org/publicdomain/zero/1.0/>.
433433
<string name="squarebrackets" translatable="false">Square Brackets</string>
434434
<string name="csv" translatable="false">CSV</string>
435435
<string name="orgmode" translatable="false">OrgMode</string>
436+
<string name="option_select_lines" translatable="false">option_select_lines</string>
436437
</resources>

0 commit comments

Comments
 (0)