deduplicate lore edit logic

This commit is contained in:
alexcrea 2026-06-02 14:36:09 +02:00
parent e6293be1c6
commit 106bc724a1
Signed by: alexcrea
GPG key ID: E346CD16413450E3
5 changed files with 230 additions and 198 deletions

View file

@ -28,9 +28,10 @@ import xyz.alexcrea.cuanvil.util.anvil.AnvilColorUtil
import xyz.alexcrea.cuanvil.util.anvil.AnvilLoreEditUtil import xyz.alexcrea.cuanvil.util.anvil.AnvilLoreEditUtil
import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil.AnvilCost import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil.AnvilCost
import xyz.alexcrea.cuanvil.util.config.LoreEditType
import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil
object AnvilMergeUtil { object AnvilMergeLogic {
open class AnvilResult { open class AnvilResult {
companion object { companion object {
@ -64,6 +65,19 @@ object AnvilMergeUtil {
} }
} }
class LoreEditResult: AnvilResult {
companion object {
val EMPTY = LoreEditResult(null, AnvilCost(), LoreEditType.APPEND_PAPER)
}
val type: LoreEditType
constructor(item: ItemStack?, cost: AnvilCost, type: LoreEditType) : super(item, cost) {
this.type = type
}
}
fun doRenaming(inventory: AnvilInventory, fun doRenaming(inventory: AnvilInventory,
player: Player, first: ItemStack player: Player, first: ItemStack
): AnvilResult { ): AnvilResult {
@ -258,23 +272,23 @@ object AnvilMergeUtil {
fun testLoreEdit( fun testLoreEdit(
player: Player, player: Player,
first: ItemStack, second: ItemStack first: ItemStack, second: ItemStack
): AnvilResult { ): LoreEditResult {
val type = second.type val type = second.type
var resultItem: ItemStack? = null
val cost = AnvilCost() val result = if (Material.WRITABLE_BOOK == type)
if (Material.WRITABLE_BOOK == type) { AnvilLoreEditUtil.tryLoreEditByBook(player, first, second)
resultItem = AnvilLoreEditUtil.tryLoreEditByBook(player, first, second, cost) else if (Material.PAPER == type)
} else if (Material.PAPER == type) { AnvilLoreEditUtil.tryLoreEditByPaper(player, first, second)
resultItem = AnvilLoreEditUtil.tryLoreEditByPaper(player, first, second, cost) else LoreEditResult.EMPTY
}
if (resultItem.isAir || first == resultItem) { if(result.isEmpty()) return result
if (result.item!!.isAir || first == result.item) {
CustomAnvil.log("lore edit, But input is same as output") CustomAnvil.log("lore edit, But input is same as output")
return AnvilResult.EMPTY return LoreEditResult.EMPTY
} }
return AnvilResult(resultItem, cost) return result
} }
} }

View file

@ -15,8 +15,9 @@ import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.InventoryView import org.bukkit.inventory.InventoryView
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.BookMeta import org.bukkit.inventory.meta.BookMeta
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.AnvilResult import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.AnvilResult
import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.LoreEditResult
import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentDisplayName import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentDisplayName
@ -112,14 +113,14 @@ class AnvilResultListener : Listener {
} }
// For lore edit // For lore edit
if (handleBookLoreEdit(event, inventory, player, leftItem, rightItem, output)) { val loreResult = AnvilMergeLogic.testLoreEdit(player, leftItem, rightItem)
return if(!loreResult.isEmpty()) {
} else if (handlePaperLoreEdit(event, inventory, player, leftItem, rightItem, output)) { if(loreResult.type.isBook)
handleBookLoreEdit(event, inventory, player, leftItem, rightItem, loreResult)
else
handlePaperLoreEdit(event, inventory, player, leftItem, rightItem, loreResult)
return return
} }
// Else there was no working situation somehow so we deny
event.result = Event.Result.DENY
} }
private fun onCustomCraft( private fun onCustomCraft(
@ -341,7 +342,7 @@ class AnvilResultListener : Listener {
player: Player, player: Player,
inventory: AnvilInventory inventory: AnvilInventory
) { ) {
val result = AnvilMergeUtil.testUnitRepair(inventory, player, val result = AnvilMergeLogic.testUnitRepair(inventory, player,
leftItem.clone(), rightItem, leftItem.clone(), rightItem,
unitRepairResult) unitRepairResult)
@ -356,99 +357,90 @@ class AnvilResultListener : Listener {
) )
} }
private fun getFromLoreEditXpCost(
cost: AnvilCost,
player: Player,
inventory: AnvilInventory,
): AnvilCost {
if (GameMode.CREATIVE == player.gameMode) return AnvilCost(0)
if (ConfigOptions.shouldUseMoney(player)) {
cost.isMonetary = true
if (!EconomyManager.economy!!.has(player, cost.asMonetaryCost()))
cost.valid = false
} else {
val repairCost = cost.asXpCost()
if ((inventory.maximumRepairCost <= repairCost)
|| (player.level < repairCost)
)
cost.valid = false
}
return cost
}
private fun handleBookLoreEdit( private fun handleBookLoreEdit(
event: InventoryClickEvent, event: InventoryClickEvent,
inventory: AnvilInventory, inventory: AnvilInventory,
player: Player, player: Player,
leftItem: ItemStack, leftItem: ItemStack,
rightItem: ItemStack, rightItem: ItemStack,
output: ItemStack, result: LoreEditResult
): Boolean { ) {
if (Material.WRITABLE_BOOK != rightItem.type) return false if (result.type.isAppend)
val bookMeta = rightItem.itemMeta as BookMeta? ?: return false handleBookLoreAppend(event, inventory, player, rightItem, result)
else
handleBookLoreRemove(event, inventory, player, leftItem, rightItem, result)
}
val editType = AnvilLoreEditUtil.bookLoreEditIsAppend(leftItem, rightItem) ?: return false private fun handleBookLoreAppend(
event: InventoryClickEvent,
inventory: AnvilInventory,
player: Player,
rightItem: ItemStack,
result: LoreEditResult
) {
val bookMeta = rightItem.itemMeta as BookMeta? ?: return
val cost = AnvilCost() // Remove pages to book
if (editType) { val clearedBook: ItemStack?
if (output != AnvilLoreEditUtil.handleLoreAppendByBook(player, leftItem, bookMeta, cost)) return false if (LoreEditType.APPEND_BOOK.doConsume) {
clearedBook = null
// Remove pages to book
val clearedBook: ItemStack?
if (LoreEditType.APPEND_BOOK.doConsume) {
clearedBook = null
} else {
clearedBook = rightItem.clone()
bookMeta.pages = Collections.emptyList()
clearedBook.itemMeta = bookMeta
}
return extractAnvilResult(
event, player, inventory,
null, 0,
clearedBook, 0,
output, getFromLoreEditXpCost(cost, player, inventory)
)
} else { } else {
if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, cost)) return false clearedBook = rightItem.clone()
bookMeta.pages = Collections.emptyList()
clearedBook.itemMeta = bookMeta
}
// fill book meta extractAnvilResult(
val lore = DependencyManager.stripLore(leftItem) event, player, inventory,
if (lore.isEmpty()) return false null, 0,
clearedBook, 0,
result
)
}
val rightCopy: ItemStack? private fun handleBookLoreRemove(
if (LoreEditType.REMOVE_BOOK.doConsume) { event: InventoryClickEvent,
rightCopy = null inventory: AnvilInventory,
} else { player: Player,
// Uncolor the page leftItem: ItemStack,
AnvilLoreEditUtil.uncolorLines(player, lore, LoreEditType.REMOVE_BOOK) rightItem: ItemStack,
result: LoreEditResult
){
val bookMeta = rightItem.itemMeta as BookMeta? ?: return
val bookPage = StringBuilder() // fill book meta
lore.forEach { val lore = DependencyManager.stripLore(leftItem)
if (bookPage.isNotEmpty()) bookPage.append('\n') if (lore.isEmpty()) return
if (it == null) return@forEach
bookPage.append(MiniMessageUtil.plain_text_mm.serialize(it)) val rightCopy: ItemStack?
} if (LoreEditType.REMOVE_BOOK.doConsume) {
rightCopy = null
} else {
// Uncolor the page
AnvilLoreEditUtil.uncolorLines(player, lore, LoreEditType.REMOVE_BOOK)
val resultPage = bookPage.toString() val bookPage = StringBuilder()
//TODO maybe check page size ? bc it may be too big ??? lore.forEach {
if (bookPage.isNotEmpty()) bookPage.append('\n')
if (it == null) return@forEach
rightCopy = rightItem.clone() bookPage.append(MiniMessageUtil.plain_text_mm.serialize(it))
bookMeta.setPages(resultPage)
rightCopy.itemMeta = bookMeta
} }
return extractAnvilResult( val resultPage = bookPage.toString()
event, player, inventory, //TODO maybe check page size ? bc it may be too big ???
null, 0,
rightCopy, 0, rightCopy = rightItem.clone()
output, getFromLoreEditXpCost(cost, player, inventory) bookMeta.setPages(resultPage)
) rightCopy.itemMeta = bookMeta
} }
extractAnvilResult(
event, player, inventory,
null, 0,
rightCopy, 0,
result
)
} }
private fun handlePaperLoreEdit( private fun handlePaperLoreEdit(
@ -457,89 +449,101 @@ class AnvilResultListener : Listener {
player: Player, player: Player,
leftItem: ItemStack, leftItem: ItemStack,
rightItem: ItemStack, rightItem: ItemStack,
output: ItemStack, result: LoreEditResult
): Boolean { ) {
if (Material.PAPER != rightItem.type) return false if (result.type.isAppend)
val paperMeta = rightItem.itemMeta ?: return false handlePaperLoreAppend(event, inventory, player, rightItem, result)
else
handlePaperLoreRemove(event, inventory, player, leftItem, rightItem, result)
}
val editTypeIsAppend = AnvilLoreEditUtil.paperLoreEditIsAppend(leftItem, rightItem) ?: return false private fun handlePaperLoreAppend(
event: InventoryClickEvent,
inventory: AnvilInventory,
player: Player,
rightItem: ItemStack,
result: LoreEditResult
) {
val paperMeta = rightItem.itemMeta ?: return
val cost = AnvilCost() val paperCopy: ItemStack?
if (editTypeIsAppend) { if (LoreEditType.APPEND_PAPER.doConsume) {
if (output != AnvilLoreEditUtil.handleLoreAppendByPaper(player, leftItem, rightItem, cost)) return false paperCopy = null
val paperCopy: ItemStack?
if (LoreEditType.APPEND_PAPER.doConsume) {
paperCopy = null
} else {
// Remove custom name to paper
paperCopy = rightItem.clone()
paperCopy.amount = 1
paperMeta.setComponentDisplayName(null)
paperCopy.itemMeta = paperMeta
}
return if (rightItem.amount > 1) {
extractAnvilResult(
event, player, inventory,
paperCopy, 0,
rightItem, 1,
output, getFromLoreEditXpCost(cost, player, inventory)
)
} else {
extractAnvilResult(
event, player, inventory,
null, 0,
paperCopy, 0,
output, getFromLoreEditXpCost(cost, player, inventory)
)
}
} else { } else {
if (output != AnvilLoreEditUtil.handleLoreRemoveByPaper(player, leftItem, cost)) return false // Remove custom name to paper
paperCopy = rightItem.clone()
val leftMeta = leftItem.itemMeta paperCopy.amount = 1
if (leftMeta == null || !leftMeta.hasLore()) return false paperMeta.setComponentDisplayName(null)
val lore = DependencyManager.stripLore(leftItem) paperCopy.itemMeta = paperMeta
if (lore.isEmpty()) return false
// Create result item
val rightClone: ItemStack?
if (LoreEditType.REMOVE_PAPER.doConsume) {
rightClone = null
} else {
val removeEnd = LoreEditConfigUtil.paperLoreOrderIsEnd
val line = if (removeEnd) lore[lore.size - 1]
else lore[0]
// uncolor the line
val ref = AtomicReference(line)
AnvilLoreEditUtil.uncolorLine(player, ref, LoreEditType.REMOVE_PAPER)
rightClone = rightItem.clone()
rightClone.amount = 1
val resultMeta = rightClone.itemMeta ?: return false
resultMeta.setComponentDisplayName(ref.get())
rightClone.itemMeta = resultMeta
}
return if (rightItem.amount > 1) {
extractAnvilResult(
event, player, inventory,
rightClone, 0,
rightItem, 1,
output, getFromLoreEditXpCost(cost, player, inventory)
)
} else {
extractAnvilResult(
event, player, inventory,
null, 0,
rightClone, 0,
output, getFromLoreEditXpCost(cost, player, inventory)
)
}
} }
if (rightItem.amount > 1) {
extractAnvilResult(
event, player, inventory,
paperCopy, 0,
rightItem, 1,
result
)
} else {
extractAnvilResult(
event, player, inventory,
null, 0,
paperCopy, 0,
result
)
}
}
private fun handlePaperLoreRemove(
event: InventoryClickEvent,
inventory: AnvilInventory,
player: Player,
leftItem: ItemStack,
rightItem: ItemStack,
result: LoreEditResult
) {
val leftMeta = leftItem.itemMeta
if (leftMeta == null || !leftMeta.hasLore()) return
val lore = DependencyManager.stripLore(leftItem)
if (lore.isEmpty()) return
// Create result item
val rightClone: ItemStack?
if (LoreEditType.REMOVE_PAPER.doConsume) {
rightClone = null
} else {
val removeEnd = LoreEditConfigUtil.paperLoreOrderIsEnd
val line = if (removeEnd) lore[lore.size - 1]
else lore[0]
// uncolor the line
val ref = AtomicReference(line)
AnvilLoreEditUtil.uncolorLine(player, ref, LoreEditType.REMOVE_PAPER)
rightClone = rightItem.clone()
rightClone.amount = 1
val resultMeta = rightClone.itemMeta ?: return
resultMeta.setComponentDisplayName(ref.get())
rightClone.itemMeta = resultMeta
}
if (rightItem.amount > 1) {
extractAnvilResult(
event, player, inventory,
rightClone, 0,
rightItem, 1,
result
)
} else {
extractAnvilResult(
event, player, inventory,
null, 0,
rightClone, 0,
result
)
}
} }
/** /**

View file

@ -13,12 +13,12 @@ import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.EnchantmentStorageMeta import org.bukkit.inventory.meta.EnchantmentStorageMeta
import org.bukkit.inventory.meta.ItemMeta import org.bukkit.inventory.meta.ItemMeta
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.AnvilResult import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.AnvilResult
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.doMerge import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.doMerge
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.doRenaming import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.doRenaming
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.testCustomRecipe import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testCustomRecipe
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.testLoreEdit import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testLoreEdit
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.testUnitRepair import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testUnitRepair
import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.util.JustForEasierHotswapUtil import xyz.alexcrea.cuanvil.util.JustForEasierHotswapUtil
import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir

View file

@ -5,10 +5,12 @@ import org.bukkit.entity.HumanEntity
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.BookMeta import org.bukkit.inventory.meta.BookMeta
import org.bukkit.permissions.Permissible import org.bukkit.permissions.Permissible
import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.LoreEditResult
import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.componentLore import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.componentLore
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentLore import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentLore
import xyz.alexcrea.cuanvil.util.MiniMessageUtil import xyz.alexcrea.cuanvil.util.MiniMessageUtil
import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil.AnvilCost
import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil
import xyz.alexcrea.cuanvil.util.config.LoreEditType import xyz.alexcrea.cuanvil.util.config.LoreEditType
import java.util.* import java.util.*
@ -31,7 +33,7 @@ object AnvilLoreEditUtil {
player: Permissible, player: Permissible,
first: ItemStack, first: ItemStack,
book: BookMeta, book: BookMeta,
cost: AnvilXpUtil.AnvilCost cost: AnvilCost
): ItemStack? { ): ItemStack? {
if (!hasLoreEditByBookPermission(player)) return null if (!hasLoreEditByBookPermission(player)) return null
@ -60,7 +62,7 @@ object AnvilLoreEditUtil {
return result return result
} }
fun handleLoreRemoveByBook(player: Permissible, first: ItemStack, cost: AnvilXpUtil.AnvilCost): ItemStack? { fun handleLoreRemoveByBook(player: Permissible, first: ItemStack, cost: AnvilCost): ItemStack? {
if (!hasLoreEditByBookPermission(player)) return null if (!hasLoreEditByBookPermission(player)) return null
// remove lore // remove lore
@ -116,12 +118,17 @@ object AnvilLoreEditUtil {
return null return null
} }
fun tryLoreEditByBook(player: HumanEntity, first: ItemStack, second: ItemStack, cost: AnvilXpUtil.AnvilCost): ItemStack? { fun tryLoreEditByBook(player: HumanEntity, first: ItemStack, second: ItemStack): LoreEditResult {
val isAppend = bookLoreEditIsAppend(first, second) ?: return null val isAppend = bookLoreEditIsAppend(first, second) ?: return LoreEditResult.EMPTY
val type = if(isAppend) LoreEditType.APPEND_BOOK else LoreEditType.REMOVE_BOOK
val meta = second.itemMeta as BookMeta val meta = second.itemMeta as BookMeta
return if (isAppend) handleLoreAppendByBook(player, first, meta, cost) val cost = AnvilCost()
val item = if (isAppend)
handleLoreAppendByBook(player, first, meta, cost)
else handleLoreRemoveByBook(player, first, cost) else handleLoreRemoveByBook(player, first, cost)
return LoreEditResult(item, cost, type)
} }
// Return true if appended, false if removed, null if neither // Return true if appended, false if removed, null if neither
@ -147,7 +154,7 @@ object AnvilLoreEditUtil {
player: Permissible, player: Permissible,
first: ItemStack, first: ItemStack,
second: ItemStack, second: ItemStack,
cost: AnvilXpUtil.AnvilCost cost: AnvilCost
): ItemStack? { ): ItemStack? {
if (!hasLoreEditByPaperPermission(player)) return null if (!hasLoreEditByPaperPermission(player)) return null
@ -181,7 +188,7 @@ object AnvilLoreEditUtil {
return result return result
} }
fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, cost: AnvilXpUtil.AnvilCost): ItemStack? { fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, cost: AnvilCost): ItemStack? {
if (!hasLoreEditByPaperPermission(player)) return null if (!hasLoreEditByPaperPermission(player)) return null
// remove lore line // remove lore line
@ -222,17 +229,21 @@ object AnvilLoreEditUtil {
fun tryLoreEditByPaper( fun tryLoreEditByPaper(
player: HumanEntity, player: HumanEntity,
first: ItemStack, first: ItemStack,
second: ItemStack, second: ItemStack
cost: AnvilXpUtil.AnvilCost ): LoreEditResult {
): ItemStack? { val isAppend = paperLoreEditIsAppend(first, second) ?: return LoreEditResult.EMPTY
val isAppend = paperLoreEditIsAppend(first, second) ?: return null val type = if(isAppend) LoreEditType.APPEND_BOOK else LoreEditType.REMOVE_BOOK
return if (isAppend) handleLoreAppendByPaper(player, first, second, cost) val cost = AnvilCost()
val item = if (isAppend)
handleLoreAppendByPaper(player, first, second, cost)
else handleLoreRemoveByPaper(player, first, cost) else handleLoreRemoveByPaper(player, first, cost)
return LoreEditResult(item, cost, type)
} }
private fun baseEditLoreXpCost( private fun baseEditLoreXpCost(
cost: AnvilXpUtil.AnvilCost, cost: AnvilCost,
first: ItemStack, first: ItemStack,
result: ItemStack, result: ItemStack,
editType: LoreEditType editType: LoreEditType

View file

@ -18,20 +18,23 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder.DEFAULT_CONFIG as CONFIG
enum class LoreEditType( enum class LoreEditType(
val rootPath: String, val rootPath: String,
val useType: AnvilUseType, val useType: AnvilUseType,
val isBook: Boolean,
val isAppend: Boolean, val isAppend: Boolean,
val isMultiLine: Boolean, val isMultiLine: Boolean,
) { ) {
APPEND_BOOK(AnvilUseType.LORE_EDIT_BOOK_APPEND, true, true), APPEND_BOOK(AnvilUseType.LORE_EDIT_BOOK_APPEND, true, true, true),
REMOVE_BOOK(AnvilUseType.LORE_EDIT_BOOK_REMOVE, false, true), REMOVE_BOOK(AnvilUseType.LORE_EDIT_BOOK_REMOVE, true, false, true),
APPEND_PAPER(AnvilUseType.LORE_EDIT_PAPER_APPEND, true, false), APPEND_PAPER(AnvilUseType.LORE_EDIT_PAPER_APPEND, false, true, false),
REMOVE_PAPER(AnvilUseType.LORE_EDIT_PAPER_REMOVE, false, false), REMOVE_PAPER(AnvilUseType.LORE_EDIT_PAPER_REMOVE, false, false, false),
; ;
constructor( constructor(
useType: AnvilUseType, useType: AnvilUseType,
isPaper: Boolean,
isAppend: Boolean, isAppend: Boolean,
isMultiLine: Boolean, isMultiLine: Boolean,
) : this(useType.path, useType, isAppend, isMultiLine) ) : this(useType.path, useType,
isPaper, isAppend, isMultiLine)
/** /**
* If this edit type is enabled * If this edit type is enabled