Skip to content

Commit a675243

Browse files
authored
Merge pull request #956 from wordpress-mobile/feature/add-custom-ordering-to-toolbar-buttons
Add reordering and filtering of toolbar buttons
2 parents 6234e64 + 4278f2a commit a675243

22 files changed

+486
-267
lines changed

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

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ import org.wordpress.aztec.toolbar.IAztecToolbar
1111
import org.wordpress.aztec.toolbar.IAztecToolbarClickListener
1212
import java.util.ArrayList
1313

14-
open class Aztec private constructor(val visualEditor: AztecText, val toolbar: IAztecToolbar,
15-
private val toolbarClickListener: IAztecToolbarClickListener) {
14+
open class Aztec private constructor(
15+
val visualEditor: AztecText,
16+
val sourceEditor: SourceViewEditText? = null,
17+
val toolbar: IAztecToolbar,
18+
toolbarClickListener: IAztecToolbarClickListener) {
1619
private var imageGetter: Html.ImageGetter? = null
1720
private var videoThumbnailGetter: Html.VideoThumbnailGetter? = null
1821
private var imeBackListener: AztecText.OnImeBackListener? = null
@@ -27,10 +30,12 @@ open class Aztec private constructor(val visualEditor: AztecText, val toolbar: I
2730
private var onLinkTappedListener: AztecText.OnLinkTappedListener? = null
2831
private var isLinkTapEnabled: Boolean = false
2932
private var plugins: ArrayList<IAztecPlugin> = visualEditor.plugins
30-
var sourceEditor: SourceViewEditText? = null
3133

3234
init {
33-
initToolbar()
35+
initToolbar(toolbarClickListener)
36+
sourceEditor?.let {
37+
initSourceEditorHistory()
38+
}
3439
}
3540

3641
private constructor(activity: Activity, @IdRes aztecTextId: Int,
@@ -39,18 +44,10 @@ open class Aztec private constructor(val visualEditor: AztecText, val toolbar: I
3944
activity.findViewById<SourceViewEditText>(sourceTextId), activity.findViewById<AztecToolbar>(toolbarId), toolbarClickListener)
4045

4146
private constructor(activity: Activity, @IdRes aztecTextId: Int,
42-
@IdRes toolbarId: Int,
43-
toolbarClickListener: IAztecToolbarClickListener) : this(activity.findViewById<AztecText>(aztecTextId),
47+
@IdRes toolbarId: Int,
48+
toolbarClickListener: IAztecToolbarClickListener) : this(activity.findViewById<AztecText>(aztecTextId), null,
4449
activity.findViewById<AztecToolbar>(toolbarId), toolbarClickListener)
4550

46-
private constructor(visualEditor: AztecText, sourceEditor: SourceViewEditText,
47-
toolbar: AztecToolbar, toolbarClickListener: IAztecToolbarClickListener) : this(visualEditor, toolbar, toolbarClickListener) {
48-
this.sourceEditor = sourceEditor
49-
50-
initToolbar()
51-
initSourceEditorHistory()
52-
}
53-
5451
companion object Factory {
5552
@JvmStatic
5653
fun with(activity: Activity, @IdRes aztecTextId: Int, @IdRes sourceTextId: Int,
@@ -60,13 +57,13 @@ open class Aztec private constructor(val visualEditor: AztecText, val toolbar: I
6057

6158
@JvmStatic
6259
fun with(visualEditor: AztecText, sourceEditor: SourceViewEditText,
63-
toolbar: AztecToolbar, toolbarClickListener: IAztecToolbarClickListener): Aztec {
60+
toolbar: IAztecToolbar, toolbarClickListener: IAztecToolbarClickListener): Aztec {
6461
return Aztec(visualEditor, sourceEditor, toolbar, toolbarClickListener)
6562
}
6663

6764
@JvmStatic
6865
fun with(visualEditor: AztecText, toolbar: AztecToolbar, toolbarClickListener: IAztecToolbarClickListener): Aztec {
69-
return Aztec(visualEditor, toolbar, toolbarClickListener)
66+
return Aztec(visualEditor, null, toolbar, toolbarClickListener)
7067
}
7168
}
7269

@@ -162,7 +159,7 @@ open class Aztec private constructor(val visualEditor: AztecText, val toolbar: I
162159
sourceEditor?.history = visualEditor.history
163160
}
164161

165-
private fun initToolbar() {
162+
private fun initToolbar(toolbarClickListener: IAztecToolbarClickListener) {
166163
toolbar.setEditor(visualEditor, sourceEditor)
167164
toolbar.setToolbarListener(toolbarClickListener)
168165
visualEditor.setToolbar(toolbar)

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

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
7070
private lateinit var layoutExpandedTranslateInEnd: Animation
7171
private lateinit var layoutExpandedTranslateOutStart: Animation
7272

73-
private lateinit var htmlButton: RippleToggleButton
73+
private val htmlButton: RippleToggleButton? by lazy {
74+
findViewById(R.id.format_bar_button_html)
75+
}
7476
private lateinit var buttonMediaCollapsed: RippleToggleButton
7577
private lateinit var buttonMediaExpanded: RippleToggleButton
7678

@@ -90,6 +92,8 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
9092

9193
private var toolbarButtonPlugins: ArrayList<IToolbarButton> = ArrayList()
9294

95+
private var toolbarItems: ToolbarItems? = null
96+
9397
constructor(context: Context) : super(context) {
9498
initView(null)
9599
}
@@ -389,11 +393,12 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
389393
highlightAppliedStyles(selStart, selEnd)
390394
}
391395
})
396+
setupToolbarItems()
392397

393398
if (sourceEditor == null) {
394-
htmlButton.visibility = View.GONE
399+
htmlButton?.visibility = View.GONE
395400
} else {
396-
htmlButton.visibility = View.VISIBLE
401+
htmlButton?.visibility = View.VISIBLE
397402
}
398403
}
399404

@@ -422,27 +427,12 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
422427
View.inflate(context, layout, this)
423428

424429
toolbarScrolView = findViewById(R.id.format_bar_button_scroll)
425-
htmlButton = findViewById(R.id.format_bar_button_html)
426430
setBackgroundColor(toolbarBackgroundColor)
427431
findViewById<View>(R.id.format_bar_horizontal_divider)?.setBackgroundColor(toolbarBorderColor)
428432

429433
setAdvancedState()
430434
setupMediaToolbar()
431435
setupToolbarButtonsForAccessibility()
432-
433-
for (toolbarAction in ToolbarAction.values()) {
434-
findViewById<ToggleButton>(toolbarAction.buttonId)?.let {
435-
it.setOnClickListener { onToolbarAction(toolbarAction) }
436-
437-
when (toolbarAction) {
438-
ToolbarAction.HEADING -> setHeadingMenu(it)
439-
ToolbarAction.LIST -> setListMenu(it)
440-
}
441-
if (!hasCustomLayout) {
442-
it.setBackgroundDrawableRes(toolbarAction.buttonDrawableRes)
443-
}
444-
}
445-
}
446436
}
447437

448438
override fun addButton(buttonPlugin: IToolbarButton) {
@@ -714,6 +704,46 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
714704
isExpanded = true
715705
}
716706

707+
/**
708+
* Call this method before Aztec is initialized to change the items visible in the Aztec toolbar
709+
*/
710+
fun setToolbarItems(toolbarItems: ToolbarItems) {
711+
this.toolbarItems = toolbarItems
712+
}
713+
714+
private fun setupToolbarItems() {
715+
layoutExpanded = findViewById(R.id.format_bar_button_layout_expanded)
716+
val inflater = LayoutInflater.from(context)
717+
val order = toolbarItems ?: if (isAdvanced) {
718+
ToolbarItems.defaultAdvancedLayout
719+
} else {
720+
ToolbarItems.defaultBasicLayout
721+
}
722+
when (order) {
723+
is ToolbarItems.BasicLayout -> {
724+
order.addInto(layoutExpanded, inflater)
725+
}
726+
is ToolbarItems.AdvancedLayout -> {
727+
val layoutCollapsed = findViewById<LinearLayout>(R.id.format_bar_button_layout_collapsed)
728+
order.addInto(layoutExpanded, layoutCollapsed, inflater)
729+
}
730+
}
731+
732+
for (toolbarAction in ToolbarAction.values()) {
733+
findViewById<ToggleButton>(toolbarAction.buttonId)?.let {
734+
it.setOnClickListener { onToolbarAction(toolbarAction) }
735+
736+
when (toolbarAction) {
737+
ToolbarAction.HEADING -> setHeadingMenu(it)
738+
ToolbarAction.LIST -> setListMenu(it)
739+
}
740+
if (!hasCustomLayout) {
741+
it.setBackgroundDrawableRes(toolbarAction.buttonDrawableRes)
742+
}
743+
}
744+
}
745+
}
746+
717747
private fun setAdvancedState() {
718748
if (isAdvanced) {
719749
setButtonViews()
@@ -955,7 +985,8 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
955985
)
956986
}
957987

958-
private fun setHeadingMenu(view: View) {
988+
private fun setHeadingMenu(view: View?) {
989+
view ?: return
959990
headingMenu = PopupMenu(context, view)
960991
headingMenu?.setOnMenuItemClickListener(this)
961992
headingMenu?.inflate(R.menu.heading)
@@ -968,7 +999,8 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
968999
})
9691000
}
9701001

971-
private fun setListMenu(view: View) {
1002+
private fun setListMenu(view: View?) {
1003+
view ?: return
9721004
listMenu = PopupMenu(context, view)
9731005
listMenu?.setOnMenuItemClickListener(this)
9741006
listMenu?.inflate(R.menu.list)
@@ -981,7 +1013,8 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
9811013
})
9821014
}
9831015

984-
private fun updateListMenuItem(textFormat: ITextFormat, listButton: ToggleButton) {
1016+
private fun updateListMenuItem(textFormat: ITextFormat, listButton: ToggleButton?) {
1017+
listButton ?: return
9851018
var backgroundRes = R.drawable.format_bar_button_ul_selector
9861019
var contentDescriptionRes = R.string.format_bar_description_list
9871020
var check = true
@@ -1008,7 +1041,8 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
10081041
listButton.isChecked = check
10091042
}
10101043

1011-
private fun updateHeadingMenuItem(textFormat: ITextFormat, headingButton: ToggleButton) {
1044+
private fun updateHeadingMenuItem(textFormat: ITextFormat, headingButton: ToggleButton?) {
1045+
headingButton ?: return
10121046
var backgroundRes = R.drawable.format_bar_button_heading_selector
10131047
var contentDescriptionRes = R.string.format_bar_description_heading
10141048
var check = true

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

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ enum class ToolbarAction constructor(
1212
override val buttonId: Int,
1313
override val buttonDrawableRes: Int,
1414
override val actionType: ToolbarActionType,
15-
override val textFormats: Set<ITextFormat> = setOf())
16-
: IToolbarAction {
15+
override val textFormats: Set<ITextFormat> = setOf(),
16+
override val layout: Int? = null)
17+
: IToolbarAction, ToolbarItems.IToolbarItem {
1718

1819
ADD_MEDIA_COLLAPSE(
1920
R.id.format_bar_button_media_collapsed,
@@ -28,66 +29,79 @@ enum class ToolbarAction constructor(
2829
HEADING(R.id.format_bar_button_heading,
2930
R.drawable.format_bar_button_heading_selector,
3031
ToolbarActionType.LINE_BLOCK,
31-
setOf(AztecTextFormat.FORMAT_NONE)),
32+
setOf(AztecTextFormat.FORMAT_NONE),
33+
R.layout.format_bar_button_heading),
3234
LIST(
3335
R.id.format_bar_button_list,
3436
R.drawable.format_bar_button_ul_selector,
3537
ToolbarActionType.BLOCK_STYLE,
36-
setOf(AztecTextFormat.FORMAT_NONE)),
38+
setOf(AztecTextFormat.FORMAT_NONE),
39+
R.layout.format_bar_button_list),
3740
BOLD(
3841
R.id.format_bar_button_bold,
3942
R.drawable.format_bar_button_bold_selector,
4043
ToolbarActionType.INLINE_STYLE,
41-
setOf(AztecTextFormat.FORMAT_STRONG, AztecTextFormat.FORMAT_BOLD)),
44+
setOf(AztecTextFormat.FORMAT_STRONG, AztecTextFormat.FORMAT_BOLD),
45+
R.layout.format_bar_button_bold),
4246
ITALIC(
4347
R.id.format_bar_button_italic,
4448
R.drawable.format_bar_button_italic_selector,
4549
ToolbarActionType.INLINE_STYLE,
46-
setOf(AztecTextFormat.FORMAT_EMPHASIS, AztecTextFormat.FORMAT_ITALIC)),
50+
setOf(AztecTextFormat.FORMAT_EMPHASIS, AztecTextFormat.FORMAT_ITALIC),
51+
R.layout.format_bar_button_italic),
4752
STRIKETHROUGH(
4853
R.id.format_bar_button_strikethrough,
4954
R.drawable.format_bar_button_strikethrough_selector,
5055
ToolbarActionType.INLINE_STYLE,
51-
setOf(AztecTextFormat.FORMAT_STRIKETHROUGH)),
56+
setOf(AztecTextFormat.FORMAT_STRIKETHROUGH),
57+
R.layout.format_bar_button_strikethrough),
5258
ALIGN_LEFT(R.id.format_bar_button_align_left,
5359
R.drawable.format_bar_button_align_left_selector,
5460
ToolbarActionType.BLOCK_STYLE,
55-
setOf(AztecTextFormat.FORMAT_ALIGN_LEFT)),
61+
setOf(AztecTextFormat.FORMAT_ALIGN_LEFT),
62+
R.layout.format_bar_button_align_left),
5663
ALIGN_CENTER(
5764
R.id.format_bar_button_align_center,
5865
R.drawable.format_bar_button_align_center_selector,
5966
ToolbarActionType.BLOCK_STYLE,
60-
setOf(AztecTextFormat.FORMAT_ALIGN_CENTER)),
67+
setOf(AztecTextFormat.FORMAT_ALIGN_CENTER),
68+
R.layout.format_bar_button_align_center),
6169
ALIGN_RIGHT(
6270
R.id.format_bar_button_align_right,
6371
R.drawable.format_bar_button_align_right_selector,
6472
ToolbarActionType.BLOCK_STYLE,
65-
setOf(AztecTextFormat.FORMAT_ALIGN_RIGHT)),
73+
setOf(AztecTextFormat.FORMAT_ALIGN_RIGHT),
74+
R.layout.format_bar_button_align_right),
6675
UNDERLINE(
6776
R.id.format_bar_button_underline,
6877
R.drawable.format_bar_button_underline_selector,
6978
ToolbarActionType.INLINE_STYLE,
70-
setOf(AztecTextFormat.FORMAT_UNDERLINE)),
79+
setOf(AztecTextFormat.FORMAT_UNDERLINE),
80+
R.layout.format_bar_button_underline),
7181
QUOTE(
7282
R.id.format_bar_button_quote,
7383
R.drawable.format_bar_button_quote_selector,
7484
ToolbarActionType.BLOCK_STYLE,
75-
setOf(AztecTextFormat.FORMAT_QUOTE)),
85+
setOf(AztecTextFormat.FORMAT_QUOTE),
86+
R.layout.format_bar_button_quote),
7687
LINK(
7788
R.id.format_bar_button_link,
7889
R.drawable.format_bar_button_link_selector,
7990
ToolbarActionType.OTHER,
80-
setOf(AztecTextFormat.FORMAT_LINK)),
91+
setOf(AztecTextFormat.FORMAT_LINK),
92+
R.layout.format_bar_button_link),
8193
HORIZONTAL_RULE(
8294
R.id.format_bar_button_horizontal_rule,
8395
R.drawable.format_bar_button_horizontal_rule_selector,
8496
ToolbarActionType.LINE_BLOCK,
85-
setOf(AztecTextFormat.FORMAT_HORIZONTAL_RULE)),
97+
setOf(AztecTextFormat.FORMAT_HORIZONTAL_RULE),
98+
R.layout.format_bar_button_horizontal_line),
8699
HTML(
87100
R.id.format_bar_button_html,
88101
R.drawable.format_bar_button_html_selector,
89102
ToolbarActionType.OTHER,
90-
setOf(AztecTextFormat.FORMAT_NONE)),
103+
setOf(AztecTextFormat.FORMAT_NONE),
104+
R.layout.format_bar_button_html),
91105
ELLIPSIS_COLLAPSE(
92106
R.id.format_bar_button_ellipsis_collapsed,
93107
R.drawable.format_bar_button_ellipsis_vertical_selector,

0 commit comments

Comments
 (0)