merged
authorwenzelm
Wed, 23 Apr 2025 17:34:13 +0200
changeset 82573 4b13f46ff8ff
parent 82543 d96623e4defe (current diff)
parent 82572 9390f8e3b1c1 (diff)
child 82575 c17936c7a509
merged
--- a/Admin/components/components.sha1	Wed Apr 23 17:32:06 2025 +0200
+++ b/Admin/components/components.sha1	Wed Apr 23 17:34:13 2025 +0200
@@ -129,6 +129,9 @@
 31d6abd58a4c2f7522f14283dfe04e2801a6e828 flatlaf-2.6.tar.gz
 95aff7a320715c473ea63294a288ba30a71dec88 flatlaf-3.5.4-1.tar.gz
 a93a98c80536a6984db118e129b1b3a778c700ce flatlaf-3.5.4.tar.gz
+7de5b13afd4d9ac09e4d591b63c1979b9276e4f6 flatlaf-3.6-1.tar.gz
+372ac19c1783af818591c379e1646a3fc1fbbfc2 flatlaf-3.6-2.tar.gz
+1363421c87dd24bbff318e37c4788ba0339db7ad flatlaf-3.6.tar.gz
 b1c40ce6c087da7e70e221ddd3fcadfa569acb2f foiltex-2.1.4b.tar.gz
 f339234ec18369679be0095264e0c0af7762f351 gnu-utils-20210414.tar.gz
 71259aa46134e6cf2c6473b4fc408051b3336490 gnu-utils-20211030.tar.gz
@@ -137,6 +140,7 @@
 964fb17e87f7a7e8a91895a696f7d059164ae742 hugo-0.142.0.tar.gz
 511fa8df8be88eb0500032bbd17742d33bdd4636 hugo-0.88.1.tar.gz
 989234b3799fe8750f3c24825d1f717c24fb0214 idea-icons-20210508.tar.gz
+d7f72e7ef6e24ddf3b0d433d35b68658cabd1d88 idea-icons-20250415.tar.gz
 20b53cfc3ffc5b15c1eabc91846915b49b4c0367 isabelle_fonts-20151021.tar.gz
 736844204b2ef83974cd9f0a215738b767958c41 isabelle_fonts-20151104.tar.gz
 9502c1aea938021f154adadff254c5c55da344bd isabelle_fonts-20151106.tar.gz
@@ -266,6 +270,10 @@
 12f22ccb48a0a7dc9ad8c1b27552e8fd26d4ae0c jedit-20250215.tar.gz
 1aa375149dc5e84cfdd64bf66e7e0f68319b7db7 jedit-20250402.tar.gz
 88c9cc14f5618ad21ca17664fdb57b8f5f6f6d2e jedit-20250404.tar.gz
+cab6dca89dc2e0d922e92cc47df07941a3c6b29c jedit-20250415.tar.gz
+23297ab36a853247a17f87b94a29654f3259b341 jedit-20250417.tar.gz
+a291746959e64916e8504b89dca804186d4eb8a1 jedit-20250422.tar.gz
+07360418d691f6bb0e250e8efeb6b935e23eb0cd jedit-20250423.tar.gz
 44775a22f42a9d665696bfb49e53c79371c394b0 jedit_build-20111217.tar.gz
 a242a688810f2bccf24587b0062ce8027bf77fa2 jedit_build-20120304.tar.gz
 4c948dee53f74361c097c08f49a1a5ff9b17bd1d jedit_build-20120307.tar.gz
@@ -322,6 +330,7 @@
 df8bb213d39a7eecae97e6af3b11752d6c704c90 jsoup-1.15.4.tar.gz
 b1c8e2a289e40cbc139a3c371348cef3b537b1c7 jsoup-1.17.2.tar.gz
 342f12a07889ec173b13df9327db684b45118252 jsoup-1.18.3.tar.gz
+a7419f9dab68e50d05533980b6729d1dd7aafb3b jsvg-1.7.1.tar.gz
 6c737137cc597fc920943783382e928ea79e3feb kodkodi-1.2.16.tar.gz
 afb04f4048a87bb888fe7b05b0139cb060c7925b kodkodi-1.5.2-1.tar.gz
 5f95c96bb99927f3a026050f85bd056f37a9189e kodkodi-1.5.2.tar.gz
--- a/Admin/components/main	Wed Apr 23 17:32:06 2025 +0200
+++ b/Admin/components/main	Wed Apr 23 17:34:13 2025 +0200
@@ -9,17 +9,17 @@
 easychair-3.5
 eptcs-1.7.0
 find_facts_web-20250223
-flatlaf-3.5.4-1
+flatlaf-3.6-2
 foiltex-2.1.4b
-idea-icons-20210508
 isabelle_fonts-20241227
 isabelle_setup-20240327
 javamail-20250122
 jdk-21.0.6
-jedit-20250404
+jedit-20250423
 jfreechart-1.5.3
 jortho-1.0-2
 jsoup-1.18.3
+jsvg-1.7.1
 kodkodi-1.5.7
 lipics-3.1.3
 llncs-2.25
--- a/NEWS	Wed Apr 23 17:32:06 2025 +0200
+++ b/NEWS	Wed Apr 23 17:34:13 2025 +0200
@@ -37,6 +37,27 @@
 longer included. The old-fashioned toolbar, with its old Navigator
 icons, is now disabled by default.
 
+* Update GUI look-and-feel to current FlatLaf 3.6, with native library
+support on all Isabelle platforms (now including arm64-linux).
+
+* Additional look-and-feels "FlatLaf macOS Light" and "FlatLaf macOS
+Dark" imitate original macOS more closely. This is the default for the
+bundled application on macOS.
+
+* GUI rendering of the gutter is now more accurate, using scaled icons
+to fit precisely into the available space.
+
+* GUI rendering for dark look-and-feels has been slightly improved, e.g.
+menu accelerator font/color.
+
+* Provide scalable icons for old-fashioned "tango" (from early Gnome or
+KDE), and "idea-icons" from current IntelliJ IDEA community edition. All
+icons are available for jEdit and Isabelle/jEdit add-ons. The special
+notation "myicon.svg?scale=0.5" allows to resize icons as specified in
+jEdit properties. The default properties of Isabelle/jEdit usually
+prefer scalable icons over fixed old bitmaps, but some notable icons are
+not available as SVG.
+
 
 *** HOL ***
 
@@ -191,6 +212,10 @@
 * SSH connections allow both bash and zsh as remote shell. This is
 particularly important for macOS, where zsh is the default user shell.
 
+* Isabelle/Scala supports SVG via the "jsvg" library
+(com.github.weisj.jsvg.SVGDocument), as well as the "flatlaf-extras"
+library (com.formdev.flatlaf.extras.FlatSVGIcon).
+
 
 
 New in Isabelle2025 (March 2025)
--- a/etc/build.props	Wed Apr 23 17:32:06 2025 +0200
+++ b/etc/build.props	Wed Apr 23 17:34:13 2025 +0200
@@ -36,6 +36,7 @@
   src/Pure/Admin/component_jdk.scala \
   src/Pure/Admin/component_jedit.scala \
   src/Pure/Admin/component_jsoup.scala \
+  src/Pure/Admin/component_jsvg.scala \
   src/Pure/Admin/component_lipics.scala \
   src/Pure/Admin/component_llncs.scala \
   src/Pure/Admin/component_minisat.scala \
--- a/src/Pure/Admin/build_release.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/Admin/build_release.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -691,7 +691,8 @@
 
           case Platform.Family.macos =>
             File.change(isabelle_target + jedit_props) {
-              _.replaceAll("delete-line.shortcut=.*", "delete-line.shortcut=C+d")
+              _.replaceAll("lookAndFeel=.*", "lookAndFeel=com.formdev.flatlaf.themes.FlatMacLightLaf")
+               .replaceAll("delete-line.shortcut=.*", "delete-line.shortcut=C+d")
                .replaceAll("delete.shortcut2=.*", "delete.shortcut2=A+d")
             }
 
--- a/src/Pure/Admin/component_flatlaf.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/Admin/component_flatlaf.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -8,22 +8,31 @@
 
 
 object Component_FlatLaf {
-  /* platform information */
+  /* jars and native libraries */
 
-  sealed case class Platform_Info(name: String, exe: Boolean = false)
+  sealed case class Lib(template: String, exe: Boolean = false) {
+    def path(version: String): Path =
+      Path.explode(template.replace("{V}", version))
+
+    def jar_name(version: String): Option[String] =
+      if (File.is_jar(template)) Some(path(version).file_name) else None
+  }
 
-  private val platforms =
+  private val libs =
     List(
-      Platform_Info("flatlaf-{V}-macos-arm64.dylib"),
-      Platform_Info("flatlaf-{V}-macos-x86_64.dylib"),
-      Platform_Info("flatlaf-{V}-linux-x86_64.so"),
-      Platform_Info("flatlaf-{V}-windows-x86_64.dll", exe = true))
+      Lib("flatlaf/{V}/flatlaf-{V}-no-natives.jar"),
+      Lib("flatlaf/{V}/flatlaf-{V}-macos-arm64.dylib"),
+      Lib("flatlaf/{V}/flatlaf-{V}-macos-x86_64.dylib"),
+      Lib("flatlaf/{V}/flatlaf-{V}-linux-arm64.so"),
+      Lib("flatlaf/{V}/flatlaf-{V}-linux-x86_64.so"),
+      Lib("flatlaf/{V}/flatlaf-{V}-windows-x86_64.dll", exe = true),
+      Lib("flatlaf-extras/{V}/flatlaf-extras-{V}.jar"))
 
 
   /* build flatlaf */
 
-  val default_download_url = "https://repo1.maven.org/maven2/com/formdev/flatlaf"
-  val default_version = "3.5.4"
+  val default_download_url = "https://repo1.maven.org/maven2/com/formdev"
+  val default_version = "3.6"
 
   def build_flatlaf(
     target_dir: Path = Path.current,
@@ -42,28 +51,32 @@
 
     Isabelle_System.make_directory(component_dir.lib)
 
-    def download(name: String, exe: Boolean = false): Unit = {
-      val download_name = name.replace("{V}", version)
-      val target = component_dir.lib + Path.basic(download_name)
+    for (lib <- libs) {
+      val lib_path = lib.path(version)
+      val target = component_dir.lib + Path.basic(lib_path.file_name)
       Isabelle_System.download_file(
-        download_url + "/" + version + "/" + download_name, target, progress = progress)
-      if (exe) File.set_executable(target)
+        download_url + "/" + lib_path.implode, target, progress = progress)
+      if (lib.exe) File.set_executable(target)
     }
 
-    download("flatlaf-{V}-no-natives.jar")
-
-    for (platform <- platforms) download(platform.name, exe = platform.exe)
+    val jar_names = libs.flatMap(_.jar_name(version))
 
 
     /* settings */
 
+    val classpath =
+      libs.flatMap(_.jar_name(version)).map(a => "$ISABELLE_FLATLAF_HOME/lib/" + a)
+        .mkString(":")
+
     component_dir.write_settings("""
 ISABELLE_FLATLAF_HOME="$COMPONENT"
 
-classpath "$ISABELLE_FLATLAF_HOME/lib/flatlaf-""" + version + """-no-natives.jar"
+classpath """ + quote(classpath) + """
 
 isabelle_scala_service "isabelle.FlatLightLaf"
 isabelle_scala_service "isabelle.FlatDarkLaf"
+isabelle_scala_service "isabelle.FlatMacLightLaf"
+isabelle_scala_service "isabelle.FlatMacDarkLaf"
 """)
 
 
@@ -71,11 +84,14 @@
 
     File.write(component_dir.README,
       """This is the FlatLaf Java/Swing look-and-feel from
-https://www.formdev.com/flatlaf and
-https://mvnrepository.com/artifact/com.formdev/flatlaf
+https://mvnrepository.com/artifact/com.formdev
 
 It is covered by the Apache License 2.0 license.
 
+See also https://www.formdev.com/flatlaf  and especially the demo
+application https://download.formdev.com/flatlaf/flatlaf-demo-latest.jar
+(which may be run via "java -jar ...").
+
 
         Makarius
         """ + Date.Format.date(Date.now()) + "\n")
--- a/src/Pure/Admin/component_jedit.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/Admin/component_jedit.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -144,6 +144,24 @@
       Isabelle_System.extract(source_path, jedit_dir)
 
 
+      /* tango icons (SVG) */
+
+      val tango_path = Isabelle_System.make_directory(tmp_dir + Path.explode("tango"))
+      Isabelle_System.download_file(
+        "https://github.com/stephenc/tango-icon-theme/archive/41b8f6abd7eb.zip",
+        tango_path.zip, progress = progress)
+      Isabelle_System.extract(tango_path.zip, tango_path, strip = true)
+
+
+      /* IntelliJ IDEA icons (SVG) */
+
+      val idea_path = Isabelle_System.make_directory(tmp_dir + Path.explode("idea"))
+      Isabelle_System.download_file(
+        "https://isabelle.sketis.net/components/idea-icons-20250415.tar.gz",
+        idea_path.tar.gz, progress = progress)
+      Isabelle_System.extract(idea_path.tar.gz, idea_path, strip = true)
+
+
       /* patched version */
 
       Isabelle_System.copy_dir(jedit_dir, jedit_patched_dir)
@@ -161,12 +179,30 @@
           cwd = source_dir, echo = true).check
       }
 
-      for { theme <- List("classic", "tango") } {
-        val path = Path.explode("org/gjt/sp/jedit/icons/themes/" + theme + "/32x32/apps/isabelle.gif")
+      progress.echo("Augmenting icons ...")
+
+      val jedit_icons_path = source_dir + Path.explode("org/gjt/sp/jedit/icons/themes")
+      val jedit_classic_path = jedit_icons_path + Path.basic("classic")
+      val jedit_tango_path = jedit_icons_path + Path.basic("tango")
+      val jedit_idea_path = jedit_tango_path + Path.basic("idea-icons")
+
+      for (theme <- List(jedit_classic_path, jedit_tango_path)) {
         Isabelle_System.copy_file(Path.explode("~~/lib/logo/isabelle_transparent-32.gif"),
-          source_dir + path)
+          theme + Path.explode("32x32/apps/isabelle.gif"))
       }
 
+      for {
+        svg_file <- File.find_files(tango_path.file, pred = file => File.is_svg(file.getName))
+        rel_path <- File.relative_path(tango_path, File.path(svg_file))
+      } {
+        val dir = Isabelle_System.make_directory(jedit_tango_path + rel_path.dir)
+        Isabelle_System.copy_file(File.path(svg_file), dir + rel_path.base)
+      }
+
+      Isabelle_System.extract(idea_path + Path.explode("jar/idea-icons.jar"), jedit_tango_path)
+      Isabelle_System.rm_tree(jedit_tango_path + Path.explode("META-INF"))
+      Isabelle_System.copy_file(idea_path + Path.explode("README"), jedit_idea_path)
+
       progress.echo("Building jEdit ...")
       Isabelle_System.copy_dir(source_dir, tmp_source_dir)
       progress.bash("ant", cwd = tmp_source_dir, echo = true).check
@@ -340,10 +376,8 @@
 metal.secondary.fontsize=12
 navigate-backwards.label=Navigate backwards
 navigate-backwards.shortcut=AS+LEFT
-navigate-backwards.icon=ArrowL.png
 navigate-forwards.label=Navigate forwards
 navigate-forwards.shortcut=AS+RIGHT
-navigate-forwards.icon=ArrowR.png
 navigate-toolbar=navigate-backwards navigate-forwards
 navigator.showOnToolbar=true
 new-file-in-mode.shortcut=
@@ -363,7 +397,6 @@
 recent-buffer.shortcut2=C+CIRCUMFLEX
 restore.remote=false
 restore=false
-search.find=Search:
 search.subdirs.toggle=true
 select-block.shortcut2=C+8
 sidekick-tree.dock-position=right
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Pure/Admin/component_jsvg.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -0,0 +1,92 @@
+/*  Title:      Pure/Admin/component_jsvg.scala
+    Author:     Makarius
+
+Build Isabelle jsvg component from official download.
+*/
+
+package isabelle
+
+
+object Component_JSVG {
+  /* build jsvg */
+
+  val default_download_url =
+    "https://repo1.maven.org/maven2/com/github/weisj/jsvg/1.7.1/jsvg-1.7.1.jar"
+
+  def build_jsvg(
+    download_url: String = default_download_url,
+    progress: Progress = new Progress,
+    target_dir: Path = Path.current
+  ): Unit = {
+    val Download_Name = """^.*/([^/]+)\.jar""".r
+    val download_name =
+      download_url match {
+        case Download_Name(download_name) => download_name
+        case _ => error("Malformed jar download URL: " + quote(download_url))
+      }
+
+
+    /* component */
+
+    val component_dir =
+      Components.Directory(target_dir + Path.basic(download_name)).create(progress = progress)
+
+    File.write(component_dir.LICENSE,
+      Url.read("https://raw.githubusercontent.com/weisJ/jsvg/refs/heads/master/LICENSE"))
+
+
+    /* README */
+
+    File.write(component_dir.README,
+      "This is a Java SVG implementation (JSVG) from\n" + download_url +
+        "\n\nSee also https://github.com/weisJ/jsvg" +
+        "\n\n        Makarius\n        " + Date.Format.date(Date.now()) + "\n")
+
+
+    /* settings */
+
+    component_dir.write_settings("""
+ISABELLE_JSVG_HOME="$COMPONENT"
+
+classpath "$ISABELLE_JSVG_HOME/lib/""" + download_name + """.jar"
+""")
+
+
+    /* jar */
+
+    val jar = component_dir.lib + Path.basic(download_name).jar
+    Isabelle_System.make_directory(jar.dir)
+    Isabelle_System.download_file(download_url, jar, progress = progress)
+  }
+
+
+  /* Isabelle tool wrapper */
+
+  val isabelle_tool =
+    Isabelle_Tool("component_jsvg", "build Isabelle jsvg component from official download",
+      Scala_Project.here,
+      { args =>
+        var target_dir = Path.current
+        var download_url = default_download_url
+
+        val getopts = Getopts("""
+Usage: isabelle component_jsvg [OPTIONS] DOWNLOAD
+
+  Options are:
+    -D DIR       target directory (default ".")
+    -U URL       download URL
+                 (default: """" + default_download_url + """")
+
+  Build jsvg component from the specified download URL (JAR).
+""",
+          "D:" -> (arg => target_dir = Path.explode(arg)),
+          "U:" -> (arg => download_url = arg))
+
+        val more_args = getopts(args)
+        if (more_args.nonEmpty) getopts.usage()
+
+        val progress = new Console_Progress()
+
+        build_jsvg(download_url = download_url, progress = progress, target_dir = target_dir)
+      })
+}
--- a/src/Pure/GUI/gui.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/GUI/gui.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -18,21 +18,20 @@
 import scala.swing.{CheckBox, ComboBox, ScrollPane, TextArea, ListView, Separator}
 import scala.swing.event.{ButtonClicked, SelectionChanged}
 
+import com.formdev.flatlaf
+import com.formdev.flatlaf.FlatLaf
+
 
 object GUI {
   /* Swing look-and-feel */
 
-  def init_laf(): Unit = {
-    val prop = com.formdev.flatlaf.FlatSystemProperties.USE_NATIVE_LIBRARY
-    System.setProperty(prop, System.getProperty(prop, "false"))
-    com.formdev.flatlaf.FlatLightLaf.setup()
-  }
-
   def current_laf(): String = UIManager.getLookAndFeel.getClass.getName()
 
-  def is_macos_laf: Boolean =
+  def is_macos_laf(): Boolean =
     Platform.is_macos && UIManager.getSystemLookAndFeelClassName() == current_laf()
 
+  def is_dark_laf(): Boolean = FlatLaf.isLafDark()
+
   class Look_And_Feel(laf: LookAndFeel) extends Isabelle_System.Service {
     def info: UIManager.LookAndFeelInfo =
       new UIManager.LookAndFeelInfo(laf.getName, laf.getClass.getName)
@@ -56,6 +55,11 @@
     UIManager.put("Component.arrowType", "triangle")
   }
 
+  def init_laf(): Unit = {
+    init_lafs()
+    flatlaf.FlatLightLaf.setup()
+  }
+
 
   /* additional look-and-feels */
 
@@ -541,5 +545,7 @@
   }
 }
 
-class FlatLightLaf extends GUI.Look_And_Feel(new com.formdev.flatlaf.FlatLightLaf)
-class FlatDarkLaf extends GUI.Look_And_Feel(new com.formdev.flatlaf.FlatDarkLaf)
+class FlatLightLaf extends GUI.Look_And_Feel(new flatlaf.FlatLightLaf)
+class FlatDarkLaf extends GUI.Look_And_Feel(new flatlaf.FlatDarkLaf)
+class FlatMacLightLaf extends GUI.Look_And_Feel(new flatlaf.themes.FlatMacLightLaf)
+class FlatMacDarkLaf extends GUI.Look_And_Feel(new flatlaf.themes.FlatMacDarkLaf)
--- a/src/Pure/GUI/tree_view.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/GUI/tree_view.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -80,7 +80,7 @@
   }
 
   // follow jEdit
-  if (!GUI.is_macos_laf) {
+  if (!GUI.is_macos_laf()) {
     putClientProperty("JTree.lineStyle", "Angled")
   }
 }
--- a/src/Pure/General/file.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/General/file.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -102,6 +102,7 @@
   def is_pdf(s: String): Boolean = s.endsWith(".pdf")
   def is_png(s: String): Boolean = s.endsWith(".png")
   def is_scala(s: String): Boolean = s.endsWith(".scala")
+  def is_svg(s: String): Boolean = s.endsWith(".svg")
   def is_tar_bz2(s: String): Boolean = s.endsWith(".tar.bz2")
   def is_tar_gz(s: String): Boolean = s.endsWith(".tar.gz")
   def is_tar_xz(s: String): Boolean = s.endsWith(".tar.xz")
--- a/src/Pure/General/path.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/General/path.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -266,6 +266,7 @@
   def thy: Path = ext("thy")
   def xml: Path = ext("xml")
   def xz: Path = ext("xz")
+  def zip: Path = ext("zip")
   def zst: Path = ext("zst")
 
   def backup: Path = {
--- a/src/Pure/System/isabelle_tool.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Pure/System/isabelle_tool.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -189,6 +189,7 @@
   Component_JDK.isabelle_tool,
   Component_JEdit.isabelle_tool,
   Component_Jsoup.isabelle_tool,
+  Component_JSVG.isabelle_tool,
   Component_LIPIcs.isabelle_tool,
   Component_LLNCS.isabelle_tool,
   Component_Minisat.isabelle_tool,
--- a/src/Tools/jEdit/etc/options	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Tools/jEdit/etc/options	Wed Apr 23 17:34:13 2025 +0200
@@ -159,11 +159,11 @@
 
 section "Icons"
 
-option tooltip_close_icon : string = "idea-icons/actions/closeHovered.png"
-option tooltip_detach_icon : string = "idea-icons/actions/nextfile.png"
-option gutter_information_icon : string = "idea-icons/general/balloonInformation.png"
-option gutter_warning_icon : string = "idea-icons/runConfigurations/testFailed.png"
-option gutter_legacy_icon : string = "idea-icons/general/balloonWarning.png"
-option gutter_error_icon : string = "idea-icons/runConfigurations/testError.png"
-option process_passive_icon : string = "idea-icons/process/step_passive.png"
-option process_active_icons : string = "idea-icons/process/step_1.png:idea-icons/process/step_2.png:idea-icons/process/step_3.png:idea-icons/process/step_4.png:idea-icons/process/step_5.png:idea-icons/process/step_6.png:idea-icons/process/step_7.png:idea-icons/process/step_8.png:idea-icons/process/step_9.png:idea-icons/process/step_10.png:idea-icons/process/step_11.png:idea-icons/process/step_12.png"
+option tooltip_close_icon : string = "idea-icons/actions/closeDarkGrey.svg"
+option tooltip_detach_icon : string = "idea-icons/actions/copy.svg"
+option gutter_information_icon : string = "idea-icons/general/information.svg"
+option gutter_warning_icon : string = "idea-icons/general/warning.svg"
+option gutter_legacy_icon : string = "idea-icons/runConfigurations/testFailed.svg"
+option gutter_error_icon : string = "idea-icons/general/error.svg"
+option process_passive_icon : string = "idea-icons/process/big/step_passive.svg?scale=0.5"
+option process_active_icons : string = "idea-icons/process/big/step_1.svg?scale=0.5:idea-icons/process/big/step_2.svg?scale=0.5:idea-icons/process/big/step_3.svg?scale=0.5:idea-icons/process/big/step_4.svg?scale=0.5:idea-icons/process/big/step_5.svg?scale=0.5:idea-icons/process/big/step_6.svg?scale=0.5:idea-icons/process/big/step_7.svg?scale=0.5:idea-icons/process/big/step_8.svg?scale=0.5"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/patches/gui_utilities	Wed Apr 23 17:34:13 2025 +0200
@@ -0,0 +1,137 @@
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/GUIUtilities.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/GUIUtilities.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/GUIUtilities.java	2024-08-03 19:53:15.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/GUIUtilities.java	2025-04-23 14:28:53.149349418 +0200
+@@ -42,6 +42,8 @@
+ import java.net.URL;
+ import java.util.*;
+ import java.util.List;
++import java.util.regex.Pattern;
++import java.util.regex.Matcher;
+ import java.lang.ref.SoftReference;
+ 
+ import javax.annotation.Nonnull;
+@@ -72,6 +74,8 @@
+ import java.util.concurrent.ScheduledExecutorService;
+ import java.util.concurrent.TimeUnit;
+ import java.util.concurrent.atomic.AtomicLong;
++
++import com.formdev.flatlaf.extras.FlatSVGIcon;
+ //}}}
+ 
+ /** Various GUI utility functions related to icons, menus, toolbars, keyboard shortcuts, etc.
+@@ -115,14 +119,14 @@
+ 	 * @return the icon
+ 	 * @since jEdit 2.6pre7
+ 	 */
+-	public static Icon loadIcon(String iconName)
++	public static Icon loadIcon(String iconSpec)
+ 	{
+-		if(iconName == null)
++		if(iconSpec == null)
+ 			return null;
+ 
+ 		// * Enable old icon naming scheme support
+-		if(deprecatedIcons.containsKey(iconName))
+-			iconName = deprecatedIcons.get(iconName);
++		if(deprecatedIcons.containsKey(iconSpec))
++			iconSpec = deprecatedIcons.get(iconSpec);
+ 
+ 		// check if there is a cached version first
+ 		Map<String, Icon> cache = null;
+@@ -135,12 +139,25 @@
+ 			cache = new HashMap<>();
+ 			iconCache = new SoftReference<>(cache);
+ 		}
+-		Icon icon = cache.get(iconName);
++		Icon icon = cache.get(iconSpec);
+ 		if(icon != null)
+ 			return icon;
+ 
+ 		URL url;
+ 
++		float iconScale = 1.0f;
++ 		String iconName = iconSpec;
++       {
++        	Matcher matcher = Pattern.compile("^([^?]+)\\?scale=(.+)$").matcher(iconSpec);
++        	if (matcher.matches()) {
++        		try {
++        			iconScale = Float.valueOf(matcher.group(2));
++        			iconName = matcher.group(1);
++        		}
++        		catch (NumberFormatException e) { }
++        	}
++        }
++
+ 		try
+ 		{
+ 			// get the icon
+@@ -164,9 +181,11 @@
+ 			}
+ 		}
+ 
+-		icon = new ImageIcon(url);
++		icon =
++			url.toString().endsWith(".svg") ?
++				new FlatSVGIcon(url).derive(iconScale) : new ImageIcon(url);
+ 
+-		cache.put(iconName,icon);
++		cache.put(iconSpec,icon);
+ 		return icon;
+ 	} //}}}
+ 
+@@ -1094,9 +1113,7 @@
+ 				return new Font("Monospaced", Font.PLAIN, 12);
+ 			}
+ 			else {
+-				Font font2 =
+-					new Font(OperatingSystem.isWindows() ? "Lucida Console" : "Monospaced",
+-						Font.PLAIN, font1.getSize());
++				Font font2 = new Font("Isabelle DejaVu Sans Mono", Font.PLAIN, font1.getSize());
+ 				FontRenderContext frc = new FontRenderContext(null, true, false);
+ 				float scale =
+ 					font1.getLineMetrics("", frc).getHeight() / font2.getLineMetrics("", frc).getHeight();
+@@ -1107,6 +1124,22 @@
+ 
+ 	//{{{ Colors and styles
+ 
++	public static Color menuAcceleratorForeground(boolean selection) {
++		Color color =
++			UIManager.getColor(selection ?
++				"MenuItem.acceleratorSelectionForeground" :
++				"MenuItem.acceleratorForeground");
++
++		if (color == null) color = Color.black;
++
++		return color;
++	}
++
++	public static boolean isDarkLaf()
++	{
++		return com.formdev.flatlaf.FlatLaf.isLafDark();
++	}
++
+ 	//{{{ getStyleString() method
+ 	/**
+ 	 * Converts a style into it's string representation.
+@@ -1619,6 +1652,21 @@
+ 	}
+ 	//}}}
+ 
++	//{{{ isPopupTrigger() method
++	/**
++	 * Returns if the specified event is the popup trigger event.
++	 * This implements precisely defined behavior, as opposed to
++	 * MouseEvent.isPopupTrigger().
++	 * @param evt The event
++	 * @since jEdit 3.2pre8
++	 * @deprecated use {@link GenericGUIUtilities#requestFocus(Window, Component)}
++	 */
++	@Deprecated
++	public static boolean isPopupTrigger(MouseEvent evt)
++	{
++		return GenericGUIUtilities.isPopupTrigger(evt);
++	} //}}}
++
+ 	//{{{ init() method
+ 	static void init()
+ 	{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/patches/gutter	Wed Apr 23 17:34:13 2025 +0200
@@ -0,0 +1,12 @@
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/textarea/Gutter.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/textarea/Gutter.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/textarea/Gutter.java	2024-08-03 19:53:18.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/textarea/Gutter.java	2025-04-22 22:08:05.106604316 +0200
+@@ -682,7 +682,7 @@
+ 	//{{{ Private members
+ 
+ 	//{{{ Instance variables
+-	private static final int FOLD_MARKER_SIZE = 12;
++	public static final int FOLD_MARKER_SIZE = 12;
+ 	private static final int SELECTION_GUTTER_WIDTH = 12;
+ 		// The selection gutter exists only if the gutter is not expanded
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/patches/icons	Wed Apr 23 17:34:13 2025 +0200
@@ -0,0 +1,580 @@
+diff -ru jedit5.7.0/jEdit/build.xml jedit5.7.0-patched/jEdit/build.xml
+--- jedit5.7.0/jEdit/build.xml	2024-08-03 19:53:28.000000000 +0200
++++ jedit5.7.0-patched/jEdit/build.xml	2025-04-16 17:20:57.401732024 +0200
+@@ -488,6 +488,7 @@
+ 				<include name="org/gjt/sp/jedit/icons/**/*.gif"/>
+ 				<include name="org/gjt/sp/jedit/icons/**/*.jpg"/>
+ 				<include name="org/gjt/sp/jedit/icons/**/*.png"/>
++				<include name="org/gjt/sp/jedit/icons/**/*.svg"/>
+ 				<include name="org/jedit/localization/*.props"/>
+ 			</fileset>
+ 		</jar>
+@@ -783,6 +784,7 @@
+ 				<include name="*.txt"/>
+ 				<include name="*.html"/>
+ 				<include name="*.png"/>
++				<include name="*.svg"/>
+ 				<include name="tips/**"/>
+ 			</fileset>
+ 		</copy>
+diff -ru jedit5.7.0/jEdit/ivy.xml jedit5.7.0-patched/jEdit/ivy.xml
+--- jedit5.7.0/jEdit/ivy.xml	2024-08-03 19:53:28.000000000 +0200
++++ jedit5.7.0-patched/jEdit/ivy.xml	2025-04-16 12:22:57.782535840 +0200
+@@ -94,5 +94,8 @@
+ 		<dependency org="com.google.code.findbugs" name="jsr305" rev="3.0.2"/>
+ 
+ 		<dependency org="com.evolvedbinary.appbundler" name="appbundler" rev="1.3.0" conf="appbundler"/>
++
++		<dependency org="com.formdev" name="flatlaf" rev="3.6"/>
++		<dependency org="com.formdev" name="flatlaf-extras" rev="3.6"/>
+ 	</dependencies>
+ </ivy-module>
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/MarkerViewer.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/MarkerViewer.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/MarkerViewer.java	2024-08-03 19:53:18.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/MarkerViewer.java	2025-04-16 21:35:23.519418287 +0200
+@@ -50,28 +50,28 @@
+ 		toolBar.add(Box.createGlue());
+ 
+ 		RolloverButton addMarker = new RolloverButton(
+-			GUIUtilities.loadIcon("Plus.png"));
++			GUIUtilities.loadIcon(jEdit.getProperty("add-marker.icon.small")));
+ 		addMarker.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
+ 			jEdit.getProperty("add-marker.label")));
+ 		addMarker.addActionListener(this);
+ 		addMarker.setActionCommand("add-marker");
+ 		toolBar.add(addMarker);
+ 
+-		previous = new RolloverButton(GUIUtilities.loadIcon("ArrowL.png"));
++		previous = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("prev-marker.icon.small")));
+ 		previous.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
+ 			jEdit.getProperty("prev-marker.label")));
+ 		previous.addActionListener(this);
+ 		previous.setActionCommand("prev-marker");
+ 		toolBar.add(previous);
+ 
+-		next = new RolloverButton(GUIUtilities.loadIcon("ArrowR.png"));
++		next = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("next-marker.icon.small")));
+ 		next.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
+ 			jEdit.getProperty("next-marker.label")));
+ 		next.addActionListener(this);
+ 		next.setActionCommand("next-marker");
+ 		toolBar.add(next);
+ 
+-		clear = new RolloverButton(GUIUtilities.loadIcon("Clear.png"));
++		clear = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("remove-all-markers.icon.small")));
+ 		clear.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
+ 			jEdit.getProperty("remove-all-markers.label")));
+ 		clear.addActionListener(this);
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/jedit_gui.props jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/jedit_gui.props
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/jedit_gui.props	2024-08-03 19:53:20.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/jedit_gui.props	2025-04-17 00:11:31.583536114 +0200
+@@ -8,13 +8,15 @@
+ ###
+ 
+ #{{{ Common icons
+-common.add.icon=22x22/actions/list-add.png
+-common.remove.icon=22x22/actions/list-remove.png
+-common.moveUp.icon=22x22/actions/go-up.png
+-common.moveDown.icon=22x22/actions/go-down.png
+-common.clearAll.icon=22x22/actions/edit-clear.png
++common.add.icon=32x32/actions/list-add.svg?scale=0.7
++common.remove.icon=32x32/actions/list-remove.svg?scale=0.7
++common.moveUp.icon=32x32/actions/go-up.svg?scale=0.7
++common.moveDown.icon=32x32/actions/go-down.svg?scale=0.7
++common.clearAll.icon=32x32/actions/edit-clear.svg?scale=0.7
+ logo.icon.small=16x16/apps/jedit.png
+ logo.icon.medium=32x32/apps/jedit.png
++navigate-backwards.icon=idea-icons/expui/general/chevronLeft.svg?scale=1.2
++navigate-forwards.icon=idea-icons/expui/general/chevronRight.svg?scale=1.2
+ 
+ #}}}
+ 
+@@ -28,7 +30,7 @@
+ defer=false
+ startup=true
+ 
+-broken-image.icon=22x22/status/image-missing.png
++broken-image.icon=32x32/status/image-missing.svg?scale=0.7
+ dropdown-arrow.icon=ToolbarMenu.gif
+ #}}}
+ 
+@@ -39,68 +41,69 @@
+ 	buffer-options combined-options - \
+ 	plugin-manager - help
+ 
+-new-file.icon=22x22/actions/document-new.png
+-open-file.icon=22x22/actions/document-open.png
+-save.icon=22x22/actions/document-save.png
+-close-buffer.icon=22x22/actions/document-close.png
+-global-close-buffer.icon=22x22/actions/document-close.png
+-print.icon=22x22/actions/document-print.png
++new-file.icon=32x32/actions/document-new.svg?scale=0.7
++open-file.icon=32x32/actions/document-open.svg?scale=0.7
++save.icon=32x32/actions/document-save.svg?scale=0.7
++close-buffer.icon=32x32/actions/process-stop.svg?scale=0.7
++global-close-buffer.icon=32x32/actions/process-stop.svg?scale=0.7
++print.icon=32x32/actions/document-print.svg?scale=0.7
+ page-setup.icon=22x22/actions/printer-setup.png
+-undo.icon=22x22/actions/edit-undo.png
+-redo.icon=22x22/actions/edit-redo.png
+-cut.icon=22x22/actions/edit-cut.png
+-copy.icon=22x22/actions/edit-copy.png
+-paste.icon=22x22/actions/edit-paste.png
+-find.icon=22x22/actions/edit-find.png
+-find-next.icon=22x22/actions/edit-find-next.png
+-new-view.icon=22x22/actions/window-new.png
++undo.icon=32x32/actions/edit-undo.svg?scale=0.7
++redo.icon=32x32/actions/edit-redo.svg?scale=0.7
++cut.icon=32x32/actions/edit-cut.svg?scale=0.7
++copy.icon=32x32/actions/edit-copy.svg?scale=0.7
++paste.icon=32x32/actions/edit-paste.svg?scale=0.7
++find.icon=32x32/actions/edit-find.svg?scale=0.7
++find-prev.icon=32x32/actions/go-previous.svg?scale=0.7
++find-next.icon=32x32/actions/go-next.svg?scale=0.7
++new-view.icon=32x32/actions/window-new.svg?scale=0.7
+ unsplit.icon=22x22/actions/window-unsplit.png
+ split-horizontal.icon=22x22/actions/window-split-horizontal.png
+ split-vertical.icon=22x22/actions/window-split-vertical.png
+-buffer-options.icon=22x22/actions/document-properties.png
+-global-options.icon=22x22/categories/preferences-system.png
+-combined-options.icon=22x22/categories/preferences-system.png
++buffer-options.icon=32x32/actions/document-properties.svg?scale=0.7
++global-options.icon=32x32/categories/preferences-system.svg?scale=0.7
++combined-options.icon=32x32/categories/preferences-system.svg?scale=0.7
+ plugin-manager.icon=22x22/places/plugins.png
+-help.icon=22x22/apps/help-browser.png
++help.icon=22x22/apps/help-browser.svg
+ 
+ #{{{ Icon list for tool bar editor
+ icons=22x22/actions/resize-horisontal.png \
+-	22x22/actions/go-down.png \
+-	22x22/actions/go-previous.png \
+-	22x22/actions/go-next.png \
+-	22x22/actions/go-home.png \
+-	22x22/actions/go-up.png \
+-	22x22/actions/go-first.png \
+-	22x22/actions/go-last.png \
+-	22x22/actions/go-parent.png \
+-	22x22/actions/document-close.png \
+-	22x22/actions/edit-undo.png \
+-	22x22/actions/edit-redo.png \
+-	22x22/actions/edit-cut.png \
+-	22x22/actions/edit-paste.png \
+-	22x22/actions/edit-delete.png \
+-	22x22/actions/edit-clear.png \
+-	22x22/actions/edit-find-next.png \
+-	22x22/actions/edit-find-in-folder.png \
+-	22x22/actions/edit-find.png \
+-	22x22/actions/edit-copy.png \
++	22x22/actions/go-down.svg \
++	22x22/actions/go-previous.svg \
++	22x22/actions/go-next.svg \
++	32x32/actions/go-home.svg?scale=0.7 \
++	22x22/actions/go-up.svg \
++	22x22/actions/go-first.svg \
++	22x22/actions/go-last.svg \
++	22x22/actions/go-up.svg \
++	32x32/actions/process-stop.svg?scale=0.7 \
++	32x32/actions/edit-undo.svg?scale=0.7 \
++	32x32/actions/edit-redo.svg?scale=0.7 \
++	32x32/actions/edit-cut.svg?scale=0.7 \
++	32x32/actions/edit-paste.svg?scale=0.7 \
++	scalable/actions/edit-delete.svg \
++	22x22/actions/edit-clear.svg \
++	22x22/actions/go-next.svg \
++	32x32/actions/system-search.svg?scale=0.7 \
++	32x32/actions/edit-find.svg?scale=0.7 \
++	32x32/actions/edit-copy.svg?scale=0.7 \
+ 	22x22/actions/copy-to-buffer.png \
+-	22x22/actions/list-remove.png \
+-	22x22/actions/list-add.png \
+-	22x22/actions/folder-new.png \
+-	22x22/actions/window-new.png \
+-	22x22/actions/document-new.png \
+-	22x22/actions/document-open.png \
++	32x32/actions/list-remove.svg?scale=0.7 \
++	32x32/actions/list-add.svg?scale=0.7 \
++	32x32/actions/folder-new.svg?scale=0.7 \
++	32x32/actions/document-new.svg?scale=0.7 \
++	32x32/actions/document-new.svg?scale=0.7 \
++	32x32/actions/document-open.svg?scale=0.7 \
+ 	22x22/actions/document-reload2.png \
+-	22x22/actions/document-properties.png \
+-	22x22/actions/document-save.png \
+-	22x22/actions/document-save-all.png \
+-	22x22/actions/document-save-as.png \
++	32x32/actions/document-properties.svg?scale=0.7 \
++	32x32/actions/document-save.svg?scale=0.7 \
++	32x32/actions/document-save-all.svg?scale=0.5 \
++	32x32/actions/document-save-as.svg?scale=0.7 \
+ 	22x22/actions/printer-setup.png \
+-	22x22/actions/process-stop.png \
+-	22x22/actions/media-playback-pause.png \
+-	22x22/actions/media-playback-start.png \
+-	22x22/actions/view-refresh.png \
++	22x22/actions/system-log-out.svg \
++	22x22/actions/media-playback-pause.svg \
++	22x22/actions/media-playback-start.svg \
++	22x22/actions/view-refresh.svg \
+ 	22x22/actions/application-run.png \
+ 	22x22/actions/edit-find-multiple.png \
+ 	22x22/actions/edit-find-single.png \
+@@ -109,18 +112,18 @@
+ 	22x22/actions/window-unsplit.png \
+ 	22x22/actions/zoom-in.png \
+ 	22x22/actions/zoom-out.png \
+-	22x22/apps/utilities-terminal.png \
+-	22x22/apps/system-file-manager.png \
+-	22x22/apps/internet-web-browser.png \
+-	22x22/apps/help-browser.png \
+-	22x22/apps/system-installer.png \
+-	22x22/status/image-missing.png \
+-	22x22/status/folder-visiting.png \
+-	22x22/devices/drive-harddisk.png \
+-	22x22/devices/media-floppy.png \
+-	22x22/devices/printer.png \
++	22x22/apps/utilities-terminal.svg \
++	32x32/apps/system-file-manager.svg?scale=0.7 \
++	32x32/apps/internet-web-browser.svg?scale=0.7 \
++	22x22/apps/help-browser.svg \
++	32x32/apps/system-installer.svg?scale=0.7 \
++	32x32/status/image-missing.svg?scale=0.7 \
++	32x32/status/folder-visiting.svg?scale=0.7 \
++	32x32/devices/drive-harddisk.svg?scale=0.7 \
++	22x22/devices/media-floppy.svg \
++	32x32/devices/printer.svg?scale=0.7 \
+ 	22x22/places/plugins.png \
+-	22x22/categories/preferences-system.png \
++	32x32/categories/preferences-system.svg?scale=0.7 \
+ 	Blank24.gif
+ #}}}
+ 
+@@ -163,31 +166,31 @@
+ 	 print \
+ 	 - \
+ 	 exit
+-new-file.icon.small=16x16/actions/document-new.png
+-new-file-in-mode.icon.small=16x16/actions/document-new.png
+-open-file.icon.small=16x16/actions/document-open.png
+-reload.icon.small=16x16/actions/view-refresh.png
+-reload-all.icon.small=16x16/actions/view-refresh.png
+-close-buffer.icon.small=16x16/actions/document-close.png
+-closeall-bufferset.icon.small=16x16/actions/document-close.png
+-closeall-except-active.icon.small=16x16/actions/document-close.png
+-global-close-buffer.icon.small=16x16/actions/document-close.png
+-close-all.icon.small=16x16/actions/document-close.png
+-save.icon.small=16x16/actions/document-save.png
+-save-as.icon.small=16x16/actions/document-save-as.png
+-save-a-copy-as.icon.small=16x16/actions/document-save-as.png
+-save-all.icon.small=16x16/actions/document-save-all.png
+-print.icon.small=16x16/actions/document-print.png
+-page-setup.icon.small=16x16/actions/document-properties.png
+-exit.icon.small=16x16/actions/process-stop.png
+-exit.icon.medium=22x22/actions/process-stop.png
++new-file.icon.small=32x32/actions/document-new.svg?scale=0.5
++new-file-in-mode.icon.small=32x32/actions/document-new.svg?scale=0.5
++open-file.icon.small=32x32/actions/document-open.svg?scale=0.5
++reload.icon.small=16x16/actions/view-refresh.svg
++reload-all.icon.small=16x16/actions/view-refresh.svg
++close-buffer.icon.small=32x32/actions/process-stop.svg?scale=0.5
++closeall-bufferset.icon.small=32x32/actions/process-stop.svg?scale=0.5
++closeall-except-active.icon.small=32x32/actions/process-stop.svg?scale=0.5
++global-close-buffer.icon.small=32x32/actions/process-stop.svg?scale=0.5
++close-all.icon.small=32x32/actions/process-stop.svg?scale=0.5
++save.icon.small=32x32/actions/document-save.svg?scale=0.5
++save-as.icon.small=32x32/actions/document-save-as.svg?scale=0.5
++save-a-copy-as.icon.small=32x32/actions/document-save-as.svg?scale=0.5
++save-all.icon.small=32x32/actions/document-save.svg?scale=0.5
++print.icon.small=32x32/actions/document-print.svg?scale=0.5
++page-setup.icon.small=32x32/actions/document-properties.svg?scale=0.5
++exit.icon.small=16x16/actions/system-log-out.svg
++exit.icon.medium=22x22/actions/system-log-out.svg
+ 
+ #{{{ Recent Files menu
+ recent-files.code=new RecentFilesProvider();
+ #}}}
+ 
+ reload-encoding.code=new ReloadWithEncodingProvider();
+-reload-encoding.icon.small=16x16/actions/view-refresh.png
++reload-encoding.icon.small=16x16/actions/view-refresh.svg
+ #}}}
+ 
+ #{{{ Edit menu
+@@ -211,12 +214,12 @@
+ 	 %text \
+ 	 %indent \
+ 	 %source
+-undo.icon.small=16x16/actions/edit-undo.png
+-redo.icon.small=16x16/actions/edit-redo.png
+-cut.icon.small=16x16/actions/edit-cut.png
+-copy.icon.small=16x16/actions/edit-copy.png
+-paste.icon.small=16x16/actions/edit-paste.png
+-select-all.icon.small=16x16/actions/edit-select-all.png
++undo.icon.small=32x32/actions/edit-undo.svg?scale=0.5
++redo.icon.small=32x32/actions/edit-redo.svg?scale=0.5
++cut.icon.small=32x32/actions/edit-cut.svg?scale=0.5
++copy.icon.small=32x32/actions/edit-copy.svg?scale=0.5
++paste.icon.small=32x32/actions/edit-paste.svg?scale=0.5
++select-all.icon.small=16x16/actions/edit-select-all.svg
+ 
+ #{{{ More Clipboard menu
+ clipboard=cut-append \
+@@ -308,16 +311,18 @@
+ 	   regexp \
+ 	   - \
+ 	   hypersearch-results
+-find.icon.small=22x22/actions/edit-find.png
+-find-next.icon.small=22x22/actions/edit-find-next.png
+-search-in-directory.icon.small=22x22/actions/edit-find-in-folder.png
+-replace-in-selection.icon.small=22x22/actions/edit-find-replace.png
+-replace-and-find-next.icon.small=22x22/actions/edit-find-replace.png
+-replace-all.icon.small=22x22/actions/edit-find-replace.png
+-quick-search.icon.small=22x22/actions/edit-find.png
+-hypersearch.icon.small=22x22/actions/edit-find-multiple.png
+-quick-search-word.icon.small=22x22/actions/edit-find.png
+-hypersearch-word.icon.small=22x22/actions/edit-find.png
++find.icon.small=32x32/actions/edit-find.svg?scale=0.7
++find-prev.icon.small=32x32/actions/go-previous.svg?scale=0.7
++find-next.icon.small=32x32/actions/go-next.svg?scale=0.7
++search-in-open-buffers.icon.small=32x32/actions/system-search.svg?scale=0.7
++search-in-directory.icon.small=32x32/actions/system-search.svg?scale=0.7
++replace-in-selection.icon.small=32x32/actions/edit-find-replace.svg?scale=0.7
++replace-and-find-next.icon.small=32x32/actions/edit-find-replace.svg?scale=0.7
++replace-all.icon.small=32x32/actions/edit-find-replace.svg?scale=0.7
++quick-search.icon.small=32x32/actions/edit-find.svg?scale=0.7
++hypersearch.icon.small=32x32/actions/edit-find.svg?scale=0.7
++quick-search-word.icon.small=32x32/actions/edit-find.svg?scale=0.7
++hypersearch-word.icon.small=32x32/actions/edit-find.svg?scale=0.7
+ #}}}
+ 
+ #{{{ Markers menu
+@@ -336,12 +341,12 @@
+ 	  view-markers \
+ 	  -
+ markers.code=new MarkersProvider();
+-add-marker.icon.small=22x22/actions/bookmark-new.png
+-add-marker-shortcut.icon.small=22x22/actions/bookmark-new.png
+-remove-all-markers.icon.small=22x22/actions/edit-clear.png
+-goto-marker.icon.small=22x22/actions/go-jump.png
+-prev-marker.icon.small=22x22/actions/go-previous.png
+-next-marker.icon.small=22x22/actions/go-next.png
++add-marker.icon.small=32x32/actions/bookmark-new.svg?scale=0.7
++add-marker-shortcut.icon.small=32x32/actions/bookmark-new.svg?scale=0.7
++remove-all-markers.icon.small=32x32/actions/edit-clear.svg?scale=0.7
++goto-marker.icon.small=32x32/actions/go-jump.svg?scale=0.7
++prev-marker.icon.small=32x32/actions/go-previous.svg?scale=0.7
++next-marker.icon.small=32x32/actions/go-next.svg?scale=0.7
+ #}}}
+ 
+ #{{{ Folding menu
+@@ -388,9 +393,12 @@
+ 	 - \
+ 	 set-view-title \
+ 	 toggle-full-screen
+-new-view.icon.small=16x16/actions/window-new.png
+-new-plain-view.icon.small=16x16/actions/window-new.png
+-close-view.icon.small=16x16/actions/document-close.png
++new-view.icon.small=32x32/actions/window-new.svg?scale=0.5
++new-plain-view.icon.small=32x32/actions/window-new.svg?scale=0.5
++close-view.icon.small=32x32/actions/process-stop.svg?scale=0.5
++prev-buffer.icon.small=32x32/actions/go-previous.svg?scale=0.5
++next-buffer.icon.small=32x32/actions/go-next.svg?scale=0.5
++recent-buffer.icon.small=32x32/actions/go-up.svg?scale=0.5
+ 
+ #{{{ Scrolling menu
+ scrolling=scroll-to-current-line \
+@@ -454,9 +462,9 @@
+ 	  - \
+ 	  %quick-options
+ 
+-buffer-options.icon.small=16x16/actions/document-properties.png
+-global-options.icon.small=16x16/categories/preferences-system.png
+-combined-options.icon.small=16x16/categories/preferences-system.png
++buffer-options.icon.small=32x32/actions/document-properties.svg?scale=0.5
++global-options.icon.small=32x32/categories/preferences-system.svg?scale=0.5
++combined-options.icon.small=32x32/categories/preferences-system.svg?scale=0.5
+ 
+ #{{{ Recent Directories menu
+ recent-directories.code=new RecentDirectoriesProvider();
+@@ -518,9 +526,9 @@
+ 	   rescan-macros \
+ 	   -
+ macros.code=new MacrosProvider();
+-new-macro.icon.small=16x16/actions/document-new.png
+-record-macro.icon.small=16x16/actions/media-record.png
+-stop-recording.icon.small=16x16/actions/media-playback-stop.png
++new-macro.icon.small=32x32/actions/document-new.svg?scale=0.5
++record-macro.icon.small=16x16/actions/media-record.svg
++stop-recording.icon.small=32x32/actions/media-playback-stop.svg?scale=0.5
+ #}}}
+ 
+ #{{{ Plugins menu
+@@ -771,7 +779,7 @@
+ 
+ #{{{ HyperSearch results dialog
+ hypersearch-results.clear.icon=22x22/actions/edit-clear.png
+-hypersearch-results.stop.icon=22x22/actions/process-stop.png
++hypersearch-results.stop.icon=22x22/actions/system-log-out.png
+ hypersearch-results.multi.multiple.icon=22x22/actions/edit-find-multiple.png
+ hypersearch-results.multi.single.icon=22x22/actions/edit-find-single.png
+ hypersearch-results.match.highlight.icon=22x22/actions/edit-find-highlight-match.png
+@@ -784,8 +792,8 @@
+ #}}}
+ 
+ #{{{ Help Viewer
+-helpviewer.back.icon=22x22/actions/go-previous.png
+-helpviewer.forward.icon=22x22/actions/go-next.png
++helpviewer.back.icon=32x32/actions/go-previous.svg?scale=0.7
++helpviewer.forward.icon=32x32/actions/go-next.svg?scale=0.7
+ #}}}
+ 
+ #}}}
+@@ -809,9 +817,9 @@
+ 
+ #{{{ Abbreviations pane
+ options.abbrevs.code=new AbbrevsOptionPane();
+-options.abbrevs.add.icon=22x22/actions/list-add.png
+-options.abbrevs.edit.icon=22x22/actions/document-properties.png
+-options.abbrevs.remove.icon=22x22/actions/list-remove.png
++options.abbrevs.add.icon=32x32/actions/list-add.svg?scale=0.7
++options.abbrevs.edit.icon=32x32/actions/document-properties.svg?scale=0.7
++options.abbrevs.remove.icon=32x32/actions/list-remove.svg?scale=0.7
+ #}}}
+ 
+ #{{{ Appearance pane
+@@ -840,11 +848,11 @@
+ 
+ #{{{ Context Menu pane
+ options.context.code=new ContextOptionPane();
+-options.context.add.icon=22x22/actions/list-add.png
+-options.context.remove.icon=22x22/actions/list-remove.png
+-options.context.moveUp.icon=22x22/actions/go-up.png
+-options.context.moveDown.icon=22x22/actions/go-down.png
+-options.context.reset.icon=22x22/actions/edit-clear.png
++options.context.add.icon=32x32/actions/list-add.svg?scale=0.7
++options.context.remove.icon=32x32/actions/list-remove.svg?scale=0.7
++options.context.moveUp.icon=32x32/actions/go-up.svg?scale=0.7
++options.context.moveDown.icon=32x32/actions/go-down.svg?scale=0.7
++options.context.reset.icon=32x32/actions/edit-clear.svg?scale=0.7
+ options.context.includeOptionsLink=true
+ #}}}
+ 
+@@ -906,12 +914,12 @@
+ 
+ #{{{ Tool Bar pane
+ options.toolbar.code=new ToolBarOptionPane();
+-options.toolbar.add.icon=22x22/actions/list-add.png
+-options.toolbar.remove.icon=22x22/actions/list-remove.png
+-options.toolbar.moveUp.icon=22x22/actions/go-up.png
+-options.toolbar.moveDown.icon=22x22/actions/go-down.png
+-options.toolbar.reset.icon=22x22/actions/edit-clear.png
+-options.toolbar.edit.icon=22x22/actions/document-properties.png
++options.toolbar.add.icon=32x32/actions/list-add.svg?scale=0.7
++options.toolbar.remove.icon=32x32/actions/list-remove.svg?scale=0.7
++options.toolbar.moveUp.icon=22x22/actions/go-up.svg
++options.toolbar.moveDown.icon=22x22/actions/go-down.svg
++options.toolbar.reset.icon=22x22/actions/edit-clear.svg
++options.toolbar.edit.icon=32x32/actions/document-properties.svg?scale=0.7
+ #}}}
+ 
+ #{{{ View pane
+@@ -949,7 +957,8 @@
+ vfs.browser.default-filter=*[^~#]
+ vfs.browser.filter-enabled=true
+ vfs.browser.file.icon=16x16/mimetypes/text-x-generic.png
+-vfs.browser.icon.small=16x16/apps/system-file-manager.png
++vfs.browser.icon=32x32/apps/system-file-manager.svg?scale=0.7
++vfs.browser.icon.small=32x32/apps/system-file-manager.svg?scale=0.5
+ vfs.browser.open-file.icon=16x16/actions/edit-select-all.png
+ vfs.browser.dir.icon=16x16/places/folder.png
+ vfs.browser.open-dir.icon=16x16/status/folder-open.png
+@@ -1007,13 +1016,13 @@
+ plugin-manager.mirror-url=http://plugins.jedit.org/export/mirror_list.php
+ 
+ #{{{ Plugin management
+-manage-plugins.restore.icon=22x22/actions/document-open.png
+-manage-plugins.save.icon=22x22/actions/document-save.png
++manage-plugins.restore.icon=32x32/actions/document-open.svg?scale=0.7
++manage-plugins.save.icon=32x32/actions/document-save.svg?scale=0.7
+ #}}}
+ 
+ #{{{ Plugin installation
+-install-plugins.choose-plugin-set.icon=22x22/actions/document-open.png
+-install-plugins.clear-plugin-set.icon=22x22/actions/edit-clear.png
++install-plugins.choose-plugin-set.icon=32x32/actions/document-open.svg?scale=0.7
++install-plugins.clear-plugin-set.icon=22x22/actions/edit-clear.svg
+ #}}}
+ 
+ #}}}
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java	2024-08-03 19:53:15.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/options/BrowserColorsOptionPane.java	2025-04-16 16:12:29.542089148 +0200
+@@ -78,12 +78,12 @@
+ 		buttons.setBorder(new EmptyBorder(3,0,0,0));
+ 		buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
+ 		ActionListener actionHandler = new ActionHandler();
+-		JButton add = new RolloverButton(GUIUtilities.loadIcon("Plus.png"));
++		JButton add = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("common.add.icon")));
+ 		add.setToolTipText(jEdit.getProperty("common.add"));
+ 		add.addActionListener(e -> colorsModel.add());
+ 		buttons.add(add);
+ 		buttons.add(Box.createHorizontalStrut(6));
+-		remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png"));
++		remove = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("common.remove.icon")));
+ 		remove.setToolTipText(jEdit.getProperty("common.remove"));
+ 		remove.addActionListener(e ->
+ 		{
+@@ -93,12 +93,12 @@
+ 		});
+ 		buttons.add(remove);
+ 		buttons.add(Box.createHorizontalStrut(6));
+-		moveUp = new RolloverButton(GUIUtilities.loadIcon("ArrowU.png"));
++		moveUp = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("common.moveUp.icon")));
+ 		moveUp.setToolTipText(jEdit.getProperty("common.moveUp"));
+ 		moveUp.addActionListener(actionHandler);
+ 		buttons.add(moveUp);
+ 		buttons.add(Box.createHorizontalStrut(6));
+-		moveDown = new RolloverButton(GUIUtilities.loadIcon("ArrowD.png"));
++		moveDown = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("common.moveDown.icon")));
+ 		moveDown.setToolTipText(jEdit.getProperty("common.moveDown"));
+ 		moveDown.addActionListener(actionHandler);
+ 		buttons.add(moveDown);
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/options/StatusBarOptionPane.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/options/StatusBarOptionPane.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/options/StatusBarOptionPane.java	2024-08-03 19:53:15.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/options/StatusBarOptionPane.java	2025-04-16 16:12:37.730958557 +0200
+@@ -160,12 +160,12 @@
+ 		buttons.setBorder(new EmptyBorder(3,0,0,0));
+ 		buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
+ 		buttons.add(Box.createHorizontalStrut(6));
+-		moveUp = new RolloverButton(GUIUtilities.loadIcon("ArrowU.png"));
++		moveUp = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("common.moveUp.icon")));
+ 		moveUp.setToolTipText(jEdit.getProperty("options.status.moveUp"));
+ 		moveUp.addActionListener(e -> moveUp());
+ 		buttons.add(moveUp);
+ 		buttons.add(Box.createHorizontalStrut(6));
+-		moveDown = new RolloverButton(GUIUtilities.loadIcon("ArrowD.png"));
++		moveDown = new RolloverButton(GUIUtilities.loadIcon(jEdit.getProperty("common.moveDown.icon")));
+ 		moveDown.setToolTipText(jEdit.getProperty("options.status.moveDown"));
+ 		moveDown.addActionListener(e -> moveDown());
+ 		buttons.add(moveDown);
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/RegisterViewer.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/RegisterViewer.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/RegisterViewer.java	2024-08-03 19:53:18.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/RegisterViewer.java	2025-04-16 21:45:44.861713409 +0200
+@@ -54,7 +54,7 @@
+ 		toolBar.add(Box.createGlue());
+ 
+ 		RolloverButton pasteRegister = new RolloverButton(
+-			GUIUtilities.loadIcon("Paste.png"));
++			GUIUtilities.loadIcon(jEdit.getProperty("paste.icon")));
+ 		pasteRegister.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
+ 			jEdit.getProperty("paste-string-register.label")));
+ 		pasteRegister.addActionListener(e -> insertRegister());
+@@ -62,7 +62,7 @@
+ 		toolBar.add(pasteRegister);
+ 
+ 		RolloverButton clearRegister = new RolloverButton(
+-			GUIUtilities.loadIcon("Clear.png"));
++			GUIUtilities.loadIcon(jEdit.getProperty("common.clearAll.icon")));
+ 		clearRegister.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
+ 			jEdit.getProperty("clear-string-register.label")));
+ 		clearRegister.addActionListener(e -> clearSelectedIndex());
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/patches/menu_accelerator	Wed Apr 23 17:34:13 2025 +0200
@@ -0,0 +1,144 @@
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java	2024-08-03 19:53:18.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/menu/EnhancedCheckBoxMenuItem.java	2025-04-23 14:40:22.714447724 +0200
+@@ -99,7 +99,7 @@
+ 
+ 		if(shortcut != null)
+ 		{
+-			FontMetrics fm = getFontMetrics(EnhancedMenuItem.acceleratorFont);
++			FontMetrics fm = getFontMetrics(GUIUtilities.menuAcceleratorFont());
+ 			d.width += (fm.stringWidth(shortcut) + fm.stringWidth("AAAA"));
+ 		}
+ 		return d;
+@@ -114,11 +114,9 @@
+ 		if(shortcut != null)
+ 		{
+ 			Graphics2D g2 = (Graphics2D)g;
+-			g.setFont(EnhancedMenuItem.acceleratorFont);
++			g.setFont(GUIUtilities.menuAcceleratorFont());
+ 			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+-			g.setColor(getModel().isArmed() ?
+-				EnhancedMenuItem.acceleratorSelectionForeground :
+-				EnhancedMenuItem.acceleratorForeground);
++			g.setColor(GUIUtilities.menuAcceleratorForeground(getModel().isArmed()));
+ 			FontMetrics fm = g.getFontMetrics();
+ 			Insets insets = getInsets();
+ 			g.drawString(shortcut,getWidth() - (fm.stringWidth(
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/menu/EnhancedMenuItem.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/menu/EnhancedMenuItem.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/menu/EnhancedMenuItem.java	2024-08-03 19:53:18.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/menu/EnhancedMenuItem.java	2025-04-23 14:26:16.757848751 +0200
+@@ -94,7 +94,7 @@
+ 
+ 		if(shortcut != null)
+ 		{
+-			FontMetrics fm = getFontMetrics(acceleratorFont);
++			FontMetrics fm = getFontMetrics(GUIUtilities.menuAcceleratorFont());
+ 			d.width += (fm.stringWidth(shortcut) + fm.stringWidth("AAAA"));
+ 		}
+ 		return d;
+@@ -109,11 +109,9 @@
+ 		if(shortcut != null)
+ 		{
+ 			Graphics2D g2 = (Graphics2D)g;
+-			g.setFont(acceleratorFont);
++			g.setFont(GUIUtilities.menuAcceleratorFont());
+ 			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+-			g.setColor(getModel().isArmed() ?
+-				acceleratorSelectionForeground :
+-				acceleratorForeground);
++			g.setColor(GUIUtilities.menuAcceleratorForeground(getModel().isArmed()));
+ 			FontMetrics fm = g.getFontMetrics();
+ 			Insets insets = getInsets();
+ 			g.drawString(shortcut,getWidth() - (fm.stringWidth(
+@@ -122,12 +120,6 @@
+ 		}
+ 	} //}}}
+ 
+-	//{{{ Package-private members
+-	static Font acceleratorFont;
+-	static Color acceleratorForeground;
+-	static Color acceleratorSelectionForeground;
+-	//}}}
+-
+ 	//{{{ Private members
+ 
+ 	//{{{ Instance variables
+@@ -135,25 +127,5 @@
+ 	private String shortcut;
+ 	//}}}
+ 
+-	//{{{ Class initializer
+-	static
+-	{
+-		acceleratorFont = GUIUtilities.menuAcceleratorFont();
+-
+-		acceleratorForeground = UIManager
+-			.getColor("MenuItem.acceleratorForeground");
+-		if(acceleratorForeground == null)
+-		{
+-			acceleratorForeground = Color.black;
+-		}
+-
+-		acceleratorSelectionForeground = UIManager
+-			.getColor("MenuItem.acceleratorSelectionForeground");
+-		if(acceleratorSelectionForeground == null)
+-		{
+-			acceleratorSelectionForeground = Color.black;
+-		}
+-	} //}}}
+-
+ 	//}}}
+ }
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/menu/MarkersProvider.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/menu/MarkersProvider.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/menu/MarkersProvider.java	2024-08-03 19:53:18.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/menu/MarkersProvider.java	2025-04-23 14:27:48.829375470 +0200
+@@ -107,7 +107,7 @@
+ 
+ 			if(shortcut != null)
+ 			{
+-				FontMetrics fm = getFontMetrics(acceleratorFont);
++				FontMetrics fm = getFontMetrics(GUIUtilities.menuAcceleratorFont());
+ 				d.width += (fm.stringWidth(shortcut) + fm.stringWidth("AAAA"));
+ 			}
+ 			return d;
+@@ -124,11 +124,9 @@
+ 			if(shortcut != null)
+ 			{
+ 				Graphics2D g2 = (Graphics2D)g;
+-				g.setFont(acceleratorFont);
++				g.setFont(GUIUtilities.menuAcceleratorFont());
+ 				g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+-				g.setColor(getModel().isArmed() ?
+-					acceleratorSelectionForeground :
+-					acceleratorForeground);
++				g.setColor(GUIUtilities.menuAcceleratorForeground(getModel().isArmed()));
+ 				FontMetrics fm = g.getFontMetrics();
+ 				Insets insets = getInsets();
+ 				g.drawString(shortcut,getWidth() - (fm.stringWidth(
+@@ -140,9 +138,6 @@
+ 		//{{{ Private members
+ 		private final String shortcutProp;
+ 		private final char shortcut;
+-		private static final Font acceleratorFont;
+-		private static final Color acceleratorForeground;
+-		private static final Color acceleratorSelectionForeground;
+ 
+ 		//{{{ getShortcut() method
+ 		private String getShortcut()
+@@ -162,16 +157,6 @@
+ 			}
+ 		} //}}}
+ 
+-		//{{{ Class initializer
+-		static
+-		{
+-			acceleratorFont = GUIUtilities.menuAcceleratorFont();
+-			acceleratorForeground = UIManager
+-				.getColor("MenuItem.acceleratorForeground");
+-			acceleratorSelectionForeground = UIManager
+-				.getColor("MenuItem.acceleratorSelectionForeground");
+-		} //}}}
+-
+ 		//}}}
+ 	} //}}}
+ }
--- a/src/Tools/jEdit/patches/menus_and_sidekick	Wed Apr 23 17:32:06 2025 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/GUIUtilities.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/GUIUtilities.java
---- jedit5.7.0/jEdit/org/gjt/sp/jedit/GUIUtilities.java	2024-08-03 19:53:15.000000000 +0200
-+++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/GUIUtilities.java	2024-10-29 11:50:54.062016616 +0100
-@@ -1094,9 +1094,7 @@
- 				return new Font("Monospaced", Font.PLAIN, 12);
- 			}
- 			else {
--				Font font2 =
--					new Font(OperatingSystem.isWindows() ? "Lucida Console" : "Monospaced",
--						Font.PLAIN, font1.getSize());
-+				Font font2 = new Font("Isabelle DejaVu Sans Mono", Font.PLAIN, font1.getSize());
- 				FontRenderContext frc = new FontRenderContext(null, true, false);
- 				float scale =
- 					font1.getLineMetrics("", frc).getHeight() / font2.getLineMetrics("", frc).getHeight();
-diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/StatusBar.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/StatusBar.java
---- jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/StatusBar.java	2024-08-03 19:53:16.000000000 +0200
-+++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/StatusBar.java	2024-11-15 20:22:26.451538237 +0100
-@@ -225,8 +225,11 @@
- 			else
- 				this.message.setText(" ");
- 		}
--		else
--			this.message.setText(message);
-+		else {
-+			Exception exn = new Exception();
-+			if (!exn.getStackTrace()[1].getClassName().startsWith("sidekick."))
-+				this.message.setText(message);
-+		}
- 	} //}}}
- 
- 	//{{{ setMessageComponent() method
-diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/GUIUtilities.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/GUIUtilities.java
---- jedit5.7.0/jEdit/org/gjt/sp/jedit/GUIUtilities.java	2024-11-15 18:42:41.560326356 +0100
-+++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/GUIUtilities.java	2024-11-15 20:33:52.458587638 +0100
-@@ -1617,6 +1617,21 @@
- 	}
- 	//}}}
- 
-+	//{{{ isPopupTrigger() method
-+	/**
-+	 * Returns if the specified event is the popup trigger event.
-+	 * This implements precisely defined behavior, as opposed to
-+	 * MouseEvent.isPopupTrigger().
-+	 * @param evt The event
-+	 * @since jEdit 3.2pre8
-+	 * @deprecated use {@link GenericGUIUtilities#requestFocus(Window, Component)}
-+	 */
-+	@Deprecated
-+	public static boolean isPopupTrigger(MouseEvent evt)
-+	{
-+		return GenericGUIUtilities.isPopupTrigger(evt);
-+	} //}}}
-+
- 	//{{{ init() method
- 	static void init()
- 	{
--- a/src/Tools/jEdit/patches/props	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Tools/jEdit/patches/props	Wed Apr 23 17:34:13 2025 +0200
@@ -1,6 +1,15 @@
 diff -ru jedit5.7.0/jEdit/org/jedit/localization/jedit_en.props jedit5.7.0-patched/jEdit/org/jedit/localization/jedit_en.props
 --- jedit5.7.0/jEdit/org/jedit/localization/jedit_en.props	2024-08-03 19:53:22.000000000 +0200
-+++ jedit5.7.0-patched/jEdit/org/jedit/localization/jedit_en.props	2024-10-29 11:50:54.066016546 +0100
++++ jedit5.7.0-patched/jEdit/org/jedit/localization/jedit_en.props	2025-04-22 22:08:19.298392180 +0200
+@@ -70,7 +70,7 @@
+ #}}}
+ 
+ #{{{ Tool bar
+-view.search.find=Search for:
++view.search.find=Search:
+ view.search.close-tooltip=Hide search bar (ESCAPE)
+ 
+ view.action.prompt=Action:
 @@ -1282,8 +1282,7 @@
  	The most likely reason is that the JAR file is corrupt; try\n\
  	reinstalling it. See Utilities->Troubleshooting->Activity Log\n\
@@ -11,3 +20,12 @@
  plugin-error.already-loaded=Two copies installed. Please remove one of the \
  	two copies.
  plugin-error.dep-jdk=Requires Java {0} or later, but you only have version {1}.
+@@ -1610,7 +1609,7 @@
+ options.gutter.optionalComponents=Optional gutter components
+ options.gutter.lineNumbers=Line numbers
+ options.gutter.minLineNumberDigits=Minimal number of digits to reserve for line numbers:
+-options.gutter.selectionAreaEnabled=Line selection area when line numbers are not shown
++options.gutter.selectionAreaEnabled=Line selection area (with icons) when line numbers are not shown
+ options.gutter.selectionAreaBgColor=Selection area background color:
+ options.gutter.selectionAreaWidth=Selection area width (in pixels):
+ options.gutter.font=Gutter font:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/patches/status_bar	Wed Apr 23 17:34:13 2025 +0200
@@ -0,0 +1,17 @@
+diff -ru jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/StatusBar.java jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/StatusBar.java
+--- jedit5.7.0/jEdit/org/gjt/sp/jedit/gui/StatusBar.java	2024-08-03 19:53:16.000000000 +0200
++++ jedit5.7.0-patched/jEdit/org/gjt/sp/jedit/gui/StatusBar.java	2024-11-15 20:22:26.451538237 +0100
+@@ -225,8 +225,11 @@
+ 			else
+ 				this.message.setText(" ");
+ 		}
+-		else
+-			this.message.setText(message);
++		else {
++			Exception exn = new Exception();
++			if (!exn.getStackTrace()[1].getClassName().startsWith("sidekick."))
++				this.message.setText(message);
++		}
+ 	} //}}}
+ 
+ 	//{{{ setMessageComponent() method
--- a/src/Tools/jEdit/src/completion_popup.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Tools/jEdit/src/completion_popup.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -403,7 +403,7 @@
     text_field =>
 
     // see https://forums.oracle.com/thread/1361677
-    if (GUI.is_macos_laf) text_field.setCaret(new DefaultCaret)
+    if (GUI.is_macos_laf()) text_field.setCaret(new DefaultCaret)
 
     // owned by GUI thread
     private var completion_popup: Option[Completion_Popup] = None
--- a/src/Tools/jEdit/src/document_view.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Tools/jEdit/src/document_view.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -12,11 +12,13 @@
 
 import java.awt.Graphics2D
 import java.awt.event.KeyEvent
+import java.awt.geom.AffineTransform
 import javax.swing.event.{CaretListener, CaretEvent}
 
 import org.gjt.sp.jedit.jEdit
 import org.gjt.sp.jedit.options.GutterOptionPane
-import org.gjt.sp.jedit.textarea.{JEditTextArea, TextArea, TextAreaExtension, TextAreaPainter}
+import org.gjt.sp.jedit.textarea.{JEditTextArea, TextArea, TextAreaExtension, TextAreaPainter,
+  Gutter}
 
 
 object Document_View {
@@ -140,9 +142,19 @@
         GUI_Thread.assert {}
 
         val gutter = text_area.getGutter
-        val sel_width = GutterOptionPane.getSelectionAreaWidth
-        val border_width = jEdit.getIntegerProperty("view.gutter.borderWidth", 3)
-        val FOLD_MARKER_SIZE = 12
+        val gutter_width = gutter.getWidth
+        val gutter_insets = gutter.getBorder.getBorderInsets(gutter)
+
+        val skip_left = gutter_insets.left + Gutter.FOLD_MARKER_SIZE
+        val skip_right = gutter_insets.right
+        val icon_width = gutter_width - skip_left - skip_right
+        val icon_height = line_height
+
+        def scale(a: Int, b: Int): Double = 0.95 * a.toDouble / b.toDouble
+
+        val gutter_icons =
+          !gutter.isExpanded &&
+            gutter.isSelectionAreaEnabled && icon_width >= 12 && icon_height >= 12
 
         val buffer = model.buffer
         JEdit_Lib.buffer_lock(buffer) {
@@ -155,19 +167,27 @@
               rendering.gutter_content(line_range) match {
                 case Some((icon, color)) =>
                   // icons within selection area
-                  if (!gutter.isExpanded &&
-                      gutter.isSelectionAreaEnabled && sel_width >= 12 && line_height >= 12) {
-                    val x0 =
-                      (FOLD_MARKER_SIZE + sel_width - border_width - icon.getIconWidth) max 10
-                    val y0 =
-                      y + i * line_height + (((line_height - icon.getIconHeight) / 2) max 0)
-                    icon.paintIcon(gutter, gfx, x0, y0)
+                  if (gutter_icons && icon.getIconWidth > 0 && icon.getIconHeight > 0) {
+                    val w0 = icon.getIconWidth
+                    val h0 = icon.getIconHeight
+                    val s = Math.min(scale(icon_width, w0), scale(icon_height, h0))
+
+                    val w = (s * w0).ceil
+                    val h = (s * h0).ceil
+                    val x0 = skip_left + (((icon_width - w) / 2) max 0)
+                    val y0 = y + i * line_height + (((icon_height - h) / 2) max 0)
+
+                    val tr0 = gfx.getTransform
+                    val tr = new AffineTransform(tr0); tr.translate(x0, y0); tr.scale(s, s)
+                    gfx.setTransform(tr)
+                    icon.paintIcon(gutter, gfx, 0, 0)
+                    gfx.setTransform(tr0)
                   }
-                  // background
+                  // background only
                   else {
                     val y0 = y + i * line_height
                     gfx.setColor(color)
-                    gfx.fillRect(0, y0, gutter.getWidth, line_height)
+                    gfx.fillRect(0, y0, gutter_width, line_height)
                   }
                 case None =>
               }
--- a/src/Tools/jEdit/src/jedit_lib.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Tools/jEdit/src/jedit_lib.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -13,7 +13,7 @@
 import java.awt.{Component, Container, Toolkit}
 import java.awt.event.{InputEvent, KeyEvent, KeyListener}
 import java.awt.font.FontRenderContext
-import javax.swing.{Icon, ImageIcon, JScrollBar, JWindow}
+import javax.swing.{ImageIcon, JScrollBar, JWindow}
 
 import scala.util.parsing.input.CharSequenceReader
 import scala.util.matching.Regex
@@ -26,6 +26,8 @@
 import org.gjt.sp.jedit.buffer.{BufferListener, BufferAdapter, JEditBuffer, LineManager}
 import org.gjt.sp.jedit.textarea.{JEditTextArea, TextArea, TextAreaPainter, Selection, AntiAlias}
 
+import com.formdev.flatlaf.extras.FlatSVGIcon
+
 
 object JEdit_Lib {
   /* jEdit directories */
@@ -384,23 +386,8 @@
 
   /* icons */
 
-  def load_icon(name: String): Icon = {
-    val name1 =
-      if (name.startsWith("idea-icons/")) {
-        val file = File.uri(Path.explode("$ISABELLE_IDEA_ICONS")).toASCIIString
-        "jar:" + file + "!/" + name
-      }
-      else name
-    val icon = GUIUtilities.loadIcon(name1)
-    if (icon.getIconWidth < 0 || icon.getIconHeight < 0) error("Bad icon: " + name)
-    else icon
-  }
-
-  def load_image_icon(name: String): ImageIcon =
-    load_icon(name) match {
-      case icon: ImageIcon => icon
-      case _ => error("Bad image icon: " + name)
-    }
+  def load_icon(spec: String): ImageIcon =
+    GUIUtilities.loadIcon(spec).asInstanceOf[ImageIcon]
 
 
   /* buffer event handling */
--- a/src/Tools/jEdit/src/pretty_text_area.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Tools/jEdit/src/pretty_text_area.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -266,7 +266,7 @@
 
   /* search */
 
-  private val search_label: Component = new Label(jEdit.getProperty("search.find")) {
+  private val search_label: Component = new Label(jEdit.getProperty("view.search.find")) {
     tooltip = "Search and highlight output via regular expression"
   }
 
--- a/src/Tools/jEdit/src/process_indicator.scala	Wed Apr 23 17:32:06 2025 +0200
+++ b/src/Tools/jEdit/src/process_indicator.scala	Wed Apr 23 17:34:13 2025 +0200
@@ -18,10 +18,10 @@
   private val label = new Label
 
   private val passive_icon =
-    JEdit_Lib.load_image_icon(PIDE.options.string("process_passive_icon")).getImage
+    JEdit_Lib.load_icon(PIDE.options.string("process_passive_icon")).getImage
   private val active_icons =
     space_explode(':', PIDE.options.string("process_active_icons")).map(name =>
-      JEdit_Lib.load_image_icon(name).getImage)
+      JEdit_Lib.load_icon(name).getImage)
 
   private class Animation extends ImageIcon(passive_icon) {
     private var current_frame = 0