Skip to content

Commit d7d55b7

Browse files
authored
Merge pull request #376 from wordpress-mobile/issue/368-add-list-menu
Issue/368 add list menu
2 parents 90504fc + 2503a9d commit d7d55b7

File tree

11 files changed

+229
-144
lines changed

11 files changed

+229
-144
lines changed

aztec/src/main/kotlin/org/wordpress/aztec/TextFormat.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ enum class TextFormat {
1010
FORMAT_HEADING_4,
1111
FORMAT_HEADING_5,
1212
FORMAT_HEADING_6,
13+
FORMAT_UNORDERED_LIST,
14+
FORMAT_ORDERED_LIST,
1315
FORMAT_BOLD,
1416
FORMAT_ITALIC,
1517
FORMAT_UNDERLINE,
1618
FORMAT_STRIKETHROUGH,
17-
FORMAT_UNORDERED_LIST,
18-
FORMAT_ORDERED_LIST,
1919
FORMAT_QUOTE,
2020
FORMAT_LINK,
2121
FORMAT_MORE,

aztec/src/main/kotlin/org/wordpress/aztec/spans/AztecMediaSpan.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import android.graphics.drawable.Drawable
88
import android.view.Gravity
99
import org.wordpress.aztec.AztecAttributes
1010
import org.wordpress.aztec.AztecText
11-
import org.wordpress.aztec.AztecText.OnImageTappedListener
1211
import java.util.*
1312

1413
abstract class AztecMediaSpan(context: Context, drawable: Drawable?, override var attributes: AztecAttributes = AztecAttributes(),

aztec/src/main/kotlin/org/wordpress/aztec/toolbar/AztecToolbar.kt

Lines changed: 124 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
2424
private var aztecToolbarListener: AztecToolbarClickListener? = null
2525
private var editor: AztecText? = null
2626
private var headingMenu: PopupMenu? = null
27+
private var listMenu: PopupMenu? = null
2728
private var sourceEditor: SourceViewEditText? = null
2829
private var dialogShortcuts: AlertDialog? = null
2930
private var isMediaModeEnabled: Boolean = false
@@ -132,7 +133,7 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
132133
}
133134
KeyEvent.KEYCODE_O -> {
134135
if (event.isAltPressed && event.isCtrlPressed) { // Ordered List = Alt + Ctrl + O
135-
findViewById(ToolbarAction.ORDERED_LIST.buttonId).performClick()
136+
editor?.toggleFormatting(TextFormat.FORMAT_ORDERED_LIST)
136137
return true
137138
}
138139
}
@@ -156,7 +157,7 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
156157
}
157158
KeyEvent.KEYCODE_U -> {
158159
if (event.isAltPressed && event.isCtrlPressed) { // Unordered List = Alt + Ctrl + U
159-
findViewById(ToolbarAction.UNORDERED_LIST.buttonId).performClick()
160+
editor?.toggleFormatting(TextFormat.FORMAT_UNORDERED_LIST)
160161
return true
161162
} else if (event.isCtrlPressed) { // Underline = Ctrl + U
162163
findViewById(ToolbarAction.UNDERLINE.buttonId).performClick()
@@ -188,9 +189,11 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
188189
}
189190

190191
override fun onMenuItemClick(item: MenuItem?): Boolean {
191-
item?.isChecked = (item?.isChecked == false)
192+
val checked = (item?.isChecked == false)
193+
item?.isChecked = checked
192194

193195
when (item?.itemId) {
196+
// Heading Menu
194197
R.id.paragraph -> {
195198
editor?.toggleFormatting(TextFormat.FORMAT_PARAGRAPH)
196199
setHeadingMenuSelector(TextFormat.FORMAT_PARAGRAPH)
@@ -231,6 +234,17 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
231234
// editor?.toggleFormatting(TextFormat.FORMAT_PREFORMAT)
232235
// return true
233236
// }
237+
// List Menu
238+
R.id.list_ordered -> {
239+
editor?.toggleFormatting(TextFormat.FORMAT_ORDERED_LIST)
240+
toggleListMenuSelection(item.itemId, checked)
241+
return true
242+
}
243+
R.id.list_unordered -> {
244+
editor?.toggleFormatting(TextFormat.FORMAT_UNORDERED_LIST)
245+
toggleListMenuSelection(item.itemId, checked)
246+
return true
247+
}
234248
else -> return false
235249
}
236250
}
@@ -279,6 +293,10 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
279293
if (toolbarAction == ToolbarAction.HEADING) {
280294
setHeadingMenu(findViewById(toolbarAction.buttonId))
281295
}
296+
297+
if (toolbarAction == ToolbarAction.LIST) {
298+
setListMenu(findViewById(toolbarAction.buttonId))
299+
}
282300
}
283301
}
284302

@@ -321,6 +339,7 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
321339
val appliedStyles = editor!!.getAppliedStyles(selStart, selEnd)
322340
highlightActionButtons(ToolbarAction.getToolbarActionsForStyles(appliedStyles))
323341
selectHeadingMenuItem(appliedStyles)
342+
selectListMenuItem(appliedStyles)
324343
}
325344

326345
private fun onToolbarAction(action: ToolbarAction) {
@@ -332,21 +351,28 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
332351
val textFormats = ArrayList<TextFormat>()
333352

334353
actions.forEach { if (it.isStylingAction() && it.textFormat != null) textFormats.add(it.textFormat) }
354+
335355
if (getSelectedHeadingMenuItem() != null) {
336356
textFormats.add(getSelectedHeadingMenuItem()!!)
337357
}
358+
359+
if (getSelectedListMenuItem() != null) {
360+
textFormats.add(getSelectedListMenuItem()!!)
361+
}
362+
338363
return editor!!.setSelectedStyles(textFormats)
339364
}
340365

341366
//if text is selected and action is styling - toggle the style
342-
if (action.isStylingAction() && action != ToolbarAction.HEADING) {
367+
if (action.isStylingAction() && action != ToolbarAction.HEADING && action != ToolbarAction.LIST) {
343368
return editor!!.toggleFormatting(action.textFormat!!)
344369
}
345370

346371
//other toolbar action
347372
when (action) {
348373
ToolbarAction.ADD_MEDIA -> aztecToolbarListener?.onToolbarAddMediaClicked()
349374
ToolbarAction.HEADING -> headingMenu?.show()
375+
ToolbarAction.LIST -> listMenu?.show()
350376
ToolbarAction.LINK -> editor!!.showLinkDialog()
351377
ToolbarAction.HTML -> aztecToolbarListener?.onToolbarHtmlModeClicked()
352378
else -> {
@@ -371,26 +397,53 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
371397
}
372398
}
373399

400+
fun getHeadingMenu(): PopupMenu? {
401+
return headingMenu
402+
}
403+
404+
fun getListMenu(): PopupMenu? {
405+
return listMenu
406+
}
407+
408+
fun getSelectedHeadingMenuItem(): TextFormat? {
409+
if (headingMenu?.menu?.findItem(R.id.paragraph)?.isChecked!!) return TextFormat.FORMAT_PARAGRAPH
410+
else if (headingMenu?.menu?.findItem(R.id.heading_1)?.isChecked!!) return TextFormat.FORMAT_HEADING_1
411+
else if (headingMenu?.menu?.findItem(R.id.heading_2)?.isChecked!!) return TextFormat.FORMAT_HEADING_2
412+
else if (headingMenu?.menu?.findItem(R.id.heading_3)?.isChecked!!) return TextFormat.FORMAT_HEADING_3
413+
else if (headingMenu?.menu?.findItem(R.id.heading_4)?.isChecked!!) return TextFormat.FORMAT_HEADING_4
414+
else if (headingMenu?.menu?.findItem(R.id.heading_5)?.isChecked!!) return TextFormat.FORMAT_HEADING_5
415+
else if (headingMenu?.menu?.findItem(R.id.heading_6)?.isChecked!!) return TextFormat.FORMAT_HEADING_6
416+
// TODO: Uncomment when Preformat is to be added back as a feature
417+
// else if (headingMenu?.menu?.findItem(R.id.preformat)?.isChecked!!) return TextFormat.FORMAT_PREFORMAT
418+
return null
419+
}
420+
421+
fun getSelectedListMenuItem(): TextFormat? {
422+
if (listMenu?.menu?.findItem(R.id.list_unordered)?.isChecked!!) return TextFormat.FORMAT_UNORDERED_LIST
423+
else if (listMenu?.menu?.findItem(R.id.list_ordered)?.isChecked!!) return TextFormat.FORMAT_ORDERED_LIST
424+
return null
425+
}
426+
374427
private fun selectHeadingMenuItem(textFormats: ArrayList<TextFormat>) {
375428
if (textFormats.size == 0) {
376-
// Select TextFormat.FORMAT_PARAGRAPH by default.
377-
headingMenu?.menu?.getItem(0)?.isChecked = true
429+
// Select paragraph by default.
430+
headingMenu?.menu?.findItem(R.id.paragraph)?.isChecked = true
378431
// Use unnumbered heading selector by default.
379432
setHeadingMenuSelector(TextFormat.FORMAT_PARAGRAPH)
380433
} else {
381434
textFormats.forEach {
382435
when (it) {
383-
TextFormat.FORMAT_HEADING_1 -> headingMenu?.menu?.getItem(1)?.isChecked = true
384-
TextFormat.FORMAT_HEADING_2 -> headingMenu?.menu?.getItem(2)?.isChecked = true
385-
TextFormat.FORMAT_HEADING_3 -> headingMenu?.menu?.getItem(3)?.isChecked = true
386-
TextFormat.FORMAT_HEADING_4 -> headingMenu?.menu?.getItem(4)?.isChecked = true
387-
TextFormat.FORMAT_HEADING_5 -> headingMenu?.menu?.getItem(5)?.isChecked = true
388-
TextFormat.FORMAT_HEADING_6 -> headingMenu?.menu?.getItem(6)?.isChecked = true
436+
TextFormat.FORMAT_HEADING_1 -> headingMenu?.menu?.findItem(R.id.heading_1)?.isChecked = true
437+
TextFormat.FORMAT_HEADING_2 -> headingMenu?.menu?.findItem(R.id.heading_2)?.isChecked = true
438+
TextFormat.FORMAT_HEADING_3 -> headingMenu?.menu?.findItem(R.id.heading_3)?.isChecked = true
439+
TextFormat.FORMAT_HEADING_4 -> headingMenu?.menu?.findItem(R.id.heading_4)?.isChecked = true
440+
TextFormat.FORMAT_HEADING_5 -> headingMenu?.menu?.findItem(R.id.heading_5)?.isChecked = true
441+
TextFormat.FORMAT_HEADING_6 -> headingMenu?.menu?.findItem(R.id.heading_6)?.isChecked = true
389442
// TODO: Uncomment when Preformat is to be added back as a feature
390-
// TextFormat.FORMAT_PREFORMAT -> headingMenu?.menu?.getItem(7)?.isChecked = true
443+
// TextFormat.FORMAT_PREFORMAT -> headingMenu?.menu?.findItem(R.id.preformat)?.isChecked = true
391444
else -> {
392-
// Select TextFormat.FORMAT_PARAGRAPH by default.
393-
headingMenu?.menu?.getItem(0)?.isChecked = true
445+
// Select paragraph by default.
446+
headingMenu?.menu?.findItem(R.id.paragraph)?.isChecked = true
394447
}
395448
}
396449

@@ -401,8 +454,28 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
401454
}
402455
}
403456

404-
fun getHeadingMenu(): PopupMenu? {
405-
return headingMenu
457+
private fun selectListMenuItem(textFormats: ArrayList<TextFormat>) {
458+
if (textFormats.size == 0) {
459+
// Select no list by default.
460+
listMenu?.menu?.findItem(R.id.list_none)?.isChecked = true
461+
// Use unordered list selector by default.
462+
setListMenuSelector(TextFormat.FORMAT_UNORDERED_LIST)
463+
} else {
464+
textFormats.forEach {
465+
when (it) {
466+
TextFormat.FORMAT_UNORDERED_LIST -> listMenu?.menu?.findItem(R.id.list_unordered)?.isChecked = true
467+
TextFormat.FORMAT_ORDERED_LIST -> listMenu?.menu?.findItem(R.id.list_ordered)?.isChecked = true
468+
else -> {
469+
// Select no list by default.
470+
listMenu?.menu?.findItem(R.id.list_none)?.isChecked = true
471+
}
472+
}
473+
474+
setListMenuSelector(it)
475+
476+
return
477+
}
478+
}
406479
}
407480

408481
private fun setHeadingMenu(view: View) {
@@ -411,6 +484,23 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
411484
headingMenu?.inflate(R.menu.heading)
412485
}
413486

487+
private fun setListMenu(view: View) {
488+
listMenu = PopupMenu(context, view)
489+
listMenu?.setOnMenuItemClickListener(this)
490+
listMenu?.inflate(R.menu.list)
491+
}
492+
493+
private fun setListMenuSelector(textFormat: TextFormat) {
494+
when (textFormat) {
495+
TextFormat.FORMAT_UNORDERED_LIST -> findViewById(R.id.format_bar_button_list).setBackgroundResource(R.drawable.format_bar_button_ul_selector)
496+
TextFormat.FORMAT_ORDERED_LIST -> findViewById(R.id.format_bar_button_list).setBackgroundResource(R.drawable.format_bar_button_ol_selector)
497+
else -> {
498+
// Use unordered list selector by default.
499+
findViewById(R.id.format_bar_button_list).setBackgroundResource(R.drawable.format_bar_button_ul_selector)
500+
}
501+
}
502+
}
503+
414504
private fun setHeadingMenuSelector(textFormat: TextFormat) {
415505
when (textFormat) {
416506
TextFormat.FORMAT_HEADING_1 -> findViewById(R.id.format_bar_button_heading).setBackgroundResource(R.drawable.format_bar_button_heading_1)
@@ -427,19 +517,6 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
427517
}
428518
}
429519

430-
fun getSelectedHeadingMenuItem(): TextFormat? {
431-
if (headingMenu?.menu?.getItem(0)?.isChecked!!) return TextFormat.FORMAT_PARAGRAPH
432-
else if (headingMenu?.menu?.getItem(1)?.isChecked!!) return TextFormat.FORMAT_HEADING_1
433-
else if (headingMenu?.menu?.getItem(2)?.isChecked!!) return TextFormat.FORMAT_HEADING_2
434-
else if (headingMenu?.menu?.getItem(3)?.isChecked!!) return TextFormat.FORMAT_HEADING_3
435-
else if (headingMenu?.menu?.getItem(4)?.isChecked!!) return TextFormat.FORMAT_HEADING_4
436-
else if (headingMenu?.menu?.getItem(5)?.isChecked!!) return TextFormat.FORMAT_HEADING_5
437-
else if (headingMenu?.menu?.getItem(6)?.isChecked!!) return TextFormat.FORMAT_HEADING_6
438-
// TODO: Uncomment when Preformat is to be added back as a feature
439-
// else if (headingMenu?.menu?.getItem(7)?.isChecked!!) return TextFormat.FORMAT_PREFORMAT
440-
return null
441-
}
442-
443520
private fun toggleHtmlMode(isHtmlMode: Boolean) {
444521
ToolbarAction.values().forEach { action ->
445522
if (action == ToolbarAction.HTML) {
@@ -450,6 +527,23 @@ class AztecToolbar : FrameLayout, OnMenuItemClickListener {
450527
}
451528
}
452529

530+
private fun toggleListMenuSelection(listMenuItemId: Int, isChecked: Boolean) {
531+
if (isChecked) {
532+
listMenu?.menu?.findItem(listMenuItemId)?.isChecked = true
533+
534+
when (listMenuItemId) {
535+
R.id.list_ordered -> setListMenuSelector(TextFormat.FORMAT_ORDERED_LIST)
536+
R.id.list_unordered -> setListMenuSelector(TextFormat.FORMAT_UNORDERED_LIST)
537+
else -> setListMenuSelector(TextFormat.FORMAT_UNORDERED_LIST) // Use unordered list selector by default.
538+
}
539+
} else {
540+
listMenu?.menu?.findItem(R.id.list_none)?.isChecked = true
541+
542+
// Use unordered list selector by default.
543+
setListMenuSelector(TextFormat.FORMAT_UNORDERED_LIST)
544+
}
545+
}
546+
453547
fun enableFormatButtons(isEnabled: Boolean) {
454548
ToolbarAction.values().forEach { action ->
455549
if (action != ToolbarAction.HTML) {

aztec/src/main/kotlin/org/wordpress/aztec/toolbar/ToolbarAction.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ import java.util.*
1010
enum class ToolbarAction constructor(val buttonId: Int, val actionType: ToolbarActionType, val textFormat: TextFormat?) {
1111
ADD_MEDIA(R.id.format_bar_button_media, ToolbarActionType.OTHER, null),
1212
HEADING(R.id.format_bar_button_heading, ToolbarActionType.LINE_BLOCK, null),
13+
LIST(R.id.format_bar_button_list, ToolbarActionType.BLOCK_STYLE, null),
1314
BOLD(R.id.format_bar_button_bold, ToolbarActionType.INLINE_STYLE, TextFormat.FORMAT_BOLD),
1415
ITALIC(R.id.format_bar_button_italic, ToolbarActionType.INLINE_STYLE, TextFormat.FORMAT_ITALIC),
1516
STRIKETHROUGH(R.id.format_bar_button_strikethrough, ToolbarActionType.INLINE_STYLE, TextFormat.FORMAT_STRIKETHROUGH),
1617
UNDERLINE(R.id.format_bar_button_underline, ToolbarActionType.INLINE_STYLE, TextFormat.FORMAT_UNDERLINE),
17-
UNORDERED_LIST(R.id.format_bar_button_ul, ToolbarActionType.BLOCK_STYLE, TextFormat.FORMAT_UNORDERED_LIST),
18-
ORDERED_LIST(R.id.format_bar_button_ol, ToolbarActionType.BLOCK_STYLE, TextFormat.FORMAT_ORDERED_LIST),
1918
QUOTE(R.id.format_bar_button_quote, ToolbarActionType.BLOCK_STYLE, TextFormat.FORMAT_QUOTE),
2019
LINK(R.id.format_bar_button_link, ToolbarActionType.OTHER, TextFormat.FORMAT_LINK),
2120
MORE(R.id.format_bar_button_more, ToolbarActionType.LINE_BLOCK, TextFormat.FORMAT_MORE),

aztec/src/main/res/drawable/format_bar_button_ol_selector.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
xmlns:android="http://schemas.android.com/apk/res/android" >
55

66
<item android:drawable="@drawable/format_bar_button_ol_disabled" android:state_enabled="false" />
7-
<item android:drawable="@drawable/format_bar_button_ol_highlighted" android:state_checked="true" />
87
<item android:drawable="@drawable/format_bar_button_ol_highlighted" android:state_focused="true" />
98
<item android:drawable="@drawable/format_bar_button_ol" />
109

aztec/src/main/res/drawable/format_bar_button_ul_selector.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
xmlns:android="http://schemas.android.com/apk/res/android" >
55

66
<item android:drawable="@drawable/format_bar_button_ul_disabled" android:state_enabled="false" />
7-
<item android:drawable="@drawable/format_bar_button_ul_highlighted" android:state_checked="true" />
87
<item android:drawable="@drawable/format_bar_button_ul_highlighted" android:state_focused="true" />
98
<item android:drawable="@drawable/format_bar_button_ul" />
109

aztec/src/main/res/layout/aztec_format_bar.xml

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,9 @@
6565
</org.wordpress.aztec.toolbar.RippleToggleButton>
6666

6767
<org.wordpress.aztec.toolbar.RippleToggleButton
68-
android:id="@+id/format_bar_button_ul"
68+
android:id="@+id/format_bar_button_list"
6969
android:background="@drawable/format_bar_button_ul_selector"
70-
android:contentDescription="@string/format_bar_description_ul"
71-
android:layout_height="fill_parent"
72-
android:layout_width="wrap_content"
73-
style="@style/FormatBarButton" >
74-
</org.wordpress.aztec.toolbar.RippleToggleButton>
75-
76-
<org.wordpress.aztec.toolbar.RippleToggleButton
77-
android:id="@+id/format_bar_button_ol"
78-
android:background="@drawable/format_bar_button_ol_selector"
79-
android:contentDescription="@string/format_bar_description_ol"
70+
android:contentDescription="@string/format_bar_description_list"
8071
android:layout_height="fill_parent"
8172
android:layout_width="wrap_content"
8273
style="@style/FormatBarButton" >

aztec/src/main/res/menu/list.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<menu
2+
xmlns:android="http://schemas.android.com/apk/res/android" >
3+
4+
<group
5+
android:checkableBehavior="single" >
6+
7+
<item
8+
android:id="@+id/list_unordered"
9+
android:title="@string/item_format_list_unordered" >
10+
</item>
11+
12+
<item
13+
android:id="@+id/list_ordered"
14+
android:title="@string/item_format_list_ordered" >
15+
</item>
16+
17+
<item
18+
android:id="@+id/list_none"
19+
android:title="@string/item_format_list_no"
20+
android:visible="false" >
21+
</item>
22+
23+
</group>
24+
25+
</menu>

aztec/src/main/res/values/strings.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@
2222
<string name="format_bar_description_more">More</string>
2323
<string name="format_bar_description_page">Page Break</string>
2424
<string name="format_bar_description_media">Media</string>
25-
<string name="format_bar_description_ul">Unordered list</string>
26-
<string name="format_bar_description_ol">Ordered list</string>
25+
<string name="format_bar_description_list">List</string>
2726
<string name="format_bar_description_html">HTML</string>
2827
<string name="visual_editor">Visual toolbarActionListener</string>
2928
<string name="image_thumbnail">Image thumbnail</string>
@@ -77,6 +76,7 @@
7776
<string name="item_format_heading_5">Heading 5</string>
7877
<string name="item_format_heading_6">Heading 6</string>
7978
<string name="item_format_italic">Italic</string>
79+
<string name="item_format_list_no">No List</string>
8080
<string name="item_format_list_ordered">Ordered List</string>
8181
<string name="item_format_list_unordered">Unordered List</string>
8282
<string name="item_format_paragraph">Paragraph</string>

0 commit comments

Comments
 (0)