X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FPageToadletRegistry.kt;fp=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FPageToadletRegistry.kt;h=97e6cfe9aab7a885da330aaea6fbf395107266e9;hp=0000000000000000000000000000000000000000;hb=03cec6a6772c2d836d94864adddaf544cbe9d72f;hpb=6f1f26e3998cfef155b0cf59152827accea70d30 diff --git a/src/main/kotlin/net/pterodactylus/sone/web/PageToadletRegistry.kt b/src/main/kotlin/net/pterodactylus/sone/web/PageToadletRegistry.kt new file mode 100644 index 0000000..97e6cfe --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/sone/web/PageToadletRegistry.kt @@ -0,0 +1,58 @@ +package net.pterodactylus.sone.web + +import freenet.clients.http.* +import net.pterodactylus.sone.main.* +import net.pterodactylus.sone.web.page.* +import net.pterodactylus.util.web.* +import java.util.concurrent.atomic.* +import javax.inject.* + +private const val soneMenu = "Navigation.Menu.Sone" +private const val soneMenuName = "$soneMenu.Name" + +class PageToadletRegistry @Inject constructor( + private val pageMaker: PageMaker, + private val toadletContainer: ToadletContainer, + private val sonePlugin: SonePlugin, + private val pageToadletFactory: PageToadletFactory +) { + + private val pages = mutableListOf>() + private val registeredToadlets = mutableListOf() + private val registered = AtomicBoolean(false) + + fun addPage(page: Page) { + if (registered.get()) throw IllegalStateException() + pages += page + } + + fun registerToadlets() { + registered.set(true) + pageMaker.addNavigationCategory("/Sone/index.html", soneMenuName, "$soneMenu.Tooltip", sonePlugin) + addPages() + } + + private fun addPages() = + pages + .map { pageToadletFactory.createPageToadlet(it) } + .onEach(registeredToadlets::plusAssign) + .forEach { pageToadlet -> + if (pageToadlet.menuName == null) { + registerToadletWithoutMenuname(pageToadlet) + } else { + registerToadletWithMenuname(pageToadlet) + } + } + + private fun registerToadletWithoutMenuname(pageToadlet: PageToadlet) = + toadletContainer.register(pageToadlet, null, pageToadlet.path(), true, false) + + private fun registerToadletWithMenuname(pageToadlet: PageToadlet) = + toadletContainer.register(pageToadlet, soneMenuName, pageToadlet.path(), true, "$soneMenu.Item.${pageToadlet.menuName}.Name", "$soneMenu.Item.${pageToadlet.menuName}.Tooltip", false, pageToadlet) + + fun unregisterToadlets() { + pageMaker.removeNavigationCategory(soneMenuName) + registeredToadlets.forEach(toadletContainer::unregister) + } + +}