diff src/name/blackcap/imageprep/HelpDialog.kt @ 0:e0efe7848130

Initial commit. Untested!
author David Barts <davidb@stashtea.com>
date Thu, 16 Jul 2020 19:57:23 -0700
parents
children 0bded24f746e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/name/blackcap/imageprep/HelpDialog.kt	Thu Jul 16 19:57:23 2020 -0700
@@ -0,0 +1,104 @@
+/*
+ * The dialog that displays the Exif data in a single file (display only,
+ * no changing). We do this after washing.
+ */
+package name.blackcap.imageprep
+
+import java.awt.Dimension
+import java.awt.Font
+import java.awt.event.ActionEvent
+import java.awt.event.ActionListener
+import java.io.BufferedReader
+import java.io.File
+import java.io.IOException
+import java.io.InputStream
+import java.io.InputStreamReader
+import java.util.logging.Level
+import java.util.logging.Logger
+import javax.swing.*
+import javax.swing.text.html.HTMLEditorKit
+import javax.swing.text.html.StyleSheet
+import kotlin.text.buildString
+
+class HelpDialog : JDialog(Application.mainFrame) {
+    private val BW = 9
+    private val BW2 = BW * 2
+    private val WIDTH = 640
+    private val HEIGHT = 480
+
+    private val dismissButton = JButton("Dismiss").also {
+        it.addActionListener(ActionListener { setVisible(false) })
+    }
+
+    /*
+     * The stock HTMLEditorKit shares all style sheet data between all its
+     * instances. How unbelievably braindamaged. Correct that.
+     */
+    private class MyEditorKit: HTMLEditorKit() {
+        private var _styleSheet: StyleSheet = defaultStyleSheet
+        override fun getStyleSheet() = _styleSheet
+        override fun setStyleSheet(value: StyleSheet) {
+            _styleSheet = value
+        }
+
+        /**
+         * Return the default style sheet that all HTMLEditorKit's come with.
+         */
+        val defaultStyleSheet: StyleSheet
+        get() {
+            return super.getStyleSheet()
+        }
+    }
+
+    private val helpPane = JScrollPane(JTextPane().also {
+        it.editorKit = MyEditorKit().also { ek ->
+            UIManager.getFont("Panel.font")?.let { pFont ->
+                ek.styleSheet = StyleSheet().apply {
+                    addRule("body { font-family: \"${pFont.family}\"; font-size: ${pFont.size}; }")
+                    addStyleSheet(ek.defaultStyleSheet)
+                }
+            }
+        }
+        val rawText = this::class.java.getResourceAsStream("help.html").bufferedReader().use { it.readText() }
+        it.text = rawText.replace("%CONFIG_FILE_NAME%", buildString {
+            for (ch in PROP_FILE.canonicalPath) {
+                append(when(ch) {
+                    "<" -> "&lt;"
+                    ">" -> "&gt;"
+                    "&" -> "&amp;"
+                    else -> ch
+                })
+            }
+        })
+        it.setEditable(false)
+    }).apply {
+        alignmentX = JScrollPane.CENTER_ALIGNMENT
+        addBorder(BorderFactory.createEmptyBorder(BW2, BW2, BW, BW2))
+        verticalScrollBarPolicy = ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS
+        horizontalScrollBarPolicy = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
+        preferredSize = Dimension(WIDTH, HEIGHT)
+        background = Application.mainFrame.background
+    }
+
+    override fun setVisible(vis: Boolean) {
+        if (vis)
+            helpPane.verticalScrollBar.run { value = minimum }
+        super.setVisible(vis)
+    }
+
+    init {
+        setVisible(false)
+        title = "Help"
+        contentPane.apply {
+            layout = BoxLayout(this, BoxLayout.Y_AXIS)
+            add(helpPane)
+            add(Box(BoxLayout.X_AXIS).apply {
+                alignmentX = Box.CENTER_ALIGNMENT
+                border = BorderFactory.createEmptyBorder(BW, BW2, BW2, BW2)
+                add(Box.createHorizontalGlue())
+                add(dismissButton)
+            })
+        }
+        pack()
+    }
+}