diff --git a/CHANGELOG.md b/CHANGELOG.md
index eb972db14..03ad524e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file.
- `-configFile` and `-storeConfigFile` commandline parameters for loading/storing configuration file
- Option to .bat and .sh file to enable J2D_D3D_NO_HWCHECK
- [#2404] Quick find in text/script editors - show number of occurences
+- [#1418] Option to make main window Always on top
### Fixed
- [#2456] FLA export - NullPointer exception while exporting to CS4 or lower via commandline
@@ -3803,6 +3804,7 @@ Major version of SWF to XML export changed to 2.
[alpha 8]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha7...alpha8
[alpha 7]: https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/alpha7
[#2404]: https://www.free-decompiler.com/flash/issues/2404
+[#1418]: https://www.free-decompiler.com/flash/issues/1418
[#2456]: https://www.free-decompiler.com/flash/issues/2456
[#2427]: https://www.free-decompiler.com/flash/issues/2427
[#1826]: https://www.free-decompiler.com/flash/issues/1826
diff --git a/lib/substance-fix.jar b/lib/substance-fix.jar
index 9980821b9..63f6dda77 100644
Binary files a/lib/substance-fix.jar and b/lib/substance-fix.jar differ
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels.properties
new file mode 100644
index 000000000..46abb093f
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels.properties
@@ -0,0 +1,33 @@
+# Default labels by Kirill Grouchnikov
+
+SystemMenu.close=Close
+
+SystemMenu.iconify=Iconify
+
+SystemMenu.restore=Restore
+
+SystemMenu.maximize=Maximize
+
+SystemMenu.skins=Substance skins
+
+SystemMenu.showHeapStatus=Show heap status
+
+Tooltip.contentsNotSaved=contents not saved
+
+Tooltip.heapStatusPanel=Heap status. Click to run garbage collector
+
+Xoetrope.hue=Hue
+
+Xoetrope.brightness=Brightness
+
+Xoetrope.saturation=Saturation
+
+Xoetrope.warm=WARM
+
+Xoetrope.cold=COLD
+
+Xoetrope.decimalRGB=Decimal RGB
+
+Xoetrope.webSafeColors=Use web safe colors
+
+SystemMenu.alwaysOnTop=Toggle "Always on top"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ar.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ar.properties
new file mode 100644
index 000000000..16ecd40c0
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ar.properties
@@ -0,0 +1,33 @@
+# Arabic translation by QamarAlZaman Habeek
+
+SystemMenu.close=\u0625\u063a\ufefb\u0642
+
+SystemMenu.iconify=\u062a\u0635\u063a\u064a\u0631
+
+SystemMenu.restore=\u0627\u0633\u062a\u0631\u062c\u0627\u0639
+
+SystemMenu.maximize=\u062a\u0643\u0628\u064a\u0631
+
+SystemMenu.skins=\u0623\u064f\u0647\u064f\u0628 \u0627\u0644\u0633\u0628\u0633\u062a\u0646\u0633
+
+SystemMenu.showHeapStatus=\u0625\u0638\u0647\u0627\u0631 \u0648\u0636\u0639 \u0627\u0644\u0631\u0643\u0627\u0645
+
+Tooltip.contentsNotSaved=\u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u063a\u064a\u0631 \u0645\u062d\u0641\u0648\u0638
+
+Tooltip.heapStatusPanel=\u0648\u0636\u0639 \u0627\u0644\u0631\u0643\u0627\u0645. \u0627\u0646\u0642\u0631 \u0644\u062a\u0646\u0641\u064a\u0630 \u062c\u0627\u0645\u0639 \u0627\u0644\u0646\u0641\u0627\u064a\u0627\u062a
+
+Xoetrope.hue=\u0635\u0650\u0628\u0652\u063a
+
+Xoetrope.brightness=\u0627\u0644\u0623\u0644\u0645\u0639\u064a\u0629
+
+Xoetrope.saturation=\u062a\u0634\u0628\u0639
+
+Xoetrope.warm=\u062f\u0627\u0641\u0626
+
+Xoetrope.cold=\u0628\u0627\u0631\u062f
+
+Xoetrope.decimalRGB=\u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0639\u062f\u062f\u064a \u0644\u0644\u0623\u0644\u0648\u0627\u0646
+
+Xoetrope.webSafeColors=\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u0645\u0644\u0627\u0626\u0645\u0629 \u0644\u0644\u0634\u0628\u0643\u0629
+
+SystemMenu.alwaysOnTop=\u062a\u0628\u062f\u064a\u0644 "\u062f\u0627\u0626\u0645\u064b\u0627 \u0641\u064a \u0627\u0644\u0623\u0639\u0644\u0649"
\ No newline at end of file
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_bg.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_bg.properties
new file mode 100644
index 000000000..d5875a513
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_bg.properties
@@ -0,0 +1,33 @@
+# Bulgarian translation by Zar Petkov
+
+SystemMenu.close=\u0417\u0430\u0442\u0432\u0430\u0440\u044f\u043d\u0435
+
+SystemMenu.iconify=\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u0438
+
+SystemMenu.restore=\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435
+
+SystemMenu.maximize=\u041c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u0430\u043d\u0435
+
+SystemMenu.skins=\u0421\u0442\u0438\u043b\u043e\u0432\u0435 \u043d\u0430 Substance
+
+SystemMenu.showHeapStatus=\u0421\u0442\u0430\u0442\u0443\u0441 \u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u0430\u0442\u0430 \u043f\u0430\u043c\u0435\u0442
+
+Tooltip.contentsNotSaved=\u0421\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e \u043d\u0435 \u0435 \u0437\u0430\u043f\u0430\u0437\u0435\u043d\u043e \u0432\u044a\u0440\u0445\u0443 \u0434\u0438\u0441\u043a\u0430
+
+Tooltip.heapStatusPanel=\u0421\u0442\u0430\u0442\u0443\u0441 \u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u0430\u0442\u0430 \u043f\u0430\u043c\u0435\u0442. \u041a\u043b\u0438\u043a\u043d\u0438 \u0437\u0430 \u0434\u0430 \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0448 garbage collector
+
+Xoetrope.hue=\u0422\u043e\u043d
+
+Xoetrope.brightness=\u041e\u0441\u0432\u0435\u0442\u0435\u043d\u043e\u0441\u0442
+
+Xoetrope.saturation=\u041d\u0430\u0441\u0438\u0442\u0435\u043d\u043e\u0441\u0442
+
+Xoetrope.warm=\u0421\u0422\u0423\u0414\u0415\u041d\u041e
+
+Xoetrope.cold=\u0422\u041e\u041f\u041b\u041e
+
+Xoetrope.decimalRGB=\u0414\u0435\u0441\u0435\u0442\u0438\u0447\u043d\u043e RGB
+
+Xoetrope.webSafeColors=\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439 \u0446\u0432\u0435\u0442\u043e\u0432\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438 \u0437\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.
+
+SystemMenu.alwaysOnTop=\u041f\u0440\u0435\u0432\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u201e\u0412\u0438\u043d\u0430\u0433\u0438 \u043e\u0442\u0433\u043e\u0440\u0435\u201c
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_cs.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_cs.properties
new file mode 100644
index 000000000..0f92158b8
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_cs.properties
@@ -0,0 +1,33 @@
+# Czech translation by Milan Misak
+
+SystemMenu.close=Zav\u0159\u00edt
+
+SystemMenu.iconify=Minimalizovat
+
+SystemMenu.restore=Obnovit
+
+SystemMenu.maximize=Maximalizovat
+
+SystemMenu.skins=Substance skiny
+
+SystemMenu.showHeapStatus=Uka\u017e heap stav
+
+Tooltip.contentsNotSaved=obsah nen\u00ed ulo\u017een
+
+Tooltip.heapStatusPanel=Heap stav. Klikni pro spu\u0161t\u011bn\u00ed garbage collectoru
+
+Xoetrope.hue=Zabarven\u00fd
+
+Xoetrope.brightness=Sv\u011btlost
+
+Xoetrope.saturation=Nasycen\u00fd
+
+Xoetrope.warm=TEPL\u00c9
+
+Xoetrope.cold=CHLADN\u00c9
+
+Xoetrope.decimalRGB=Des\u00fdtkov\u00e9 RGB
+
+Xoetrope.webSafeColors=Pou\u017e\u00fd barvy bezpe\u010dn\u00e9 pro web
+
+SystemMenu.alwaysOnTop=P\u0159epnout "V\u017edy na vrchu"
\ No newline at end of file
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_da.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_da.properties
new file mode 100644
index 000000000..b99d7e2a8
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_da.properties
@@ -0,0 +1,33 @@
+# Danish translation by Carsten O. Madsen
+
+SystemMenu.close=Luk
+
+SystemMenu.iconify=Ikoniser
+
+SystemMenu.restore=Genskab
+
+SystemMenu.maximize=Maksimer
+
+SystemMenu.skins=Substance skins
+
+SystemMenu.showHeapStatus=Vis heap status
+
+Tooltip.contentsNotSaved=indhold er ikke gemt
+
+Tooltip.heapStatusPanel=Heap status. Klick for at k\u00f8re garbage collectoren
+
+Xoetrope.hue=Farvetone
+
+Xoetrope.brightness=Lysintensitet
+
+Xoetrope.saturation=Farvem\u00e6tning
+
+Xoetrope.warm=VARM
+
+Xoetrope.cold=KOLD
+
+Xoetrope.decimalRGB=Decimal RGB
+
+Xoetrope.webSafeColors=Brug www sikre farver
+
+SystemMenu.alwaysOnTop=Skift "Altid \u00f8verst"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_de.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_de.properties
new file mode 100644
index 000000000..aff7f0f69
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_de.properties
@@ -0,0 +1,147 @@
+# German translation by Andreas Golchert
+
+SystemMenu.close=Schlie\u00dfen
+
+SystemMenu.iconify=Ikonifizieren
+
+SystemMenu.restore=Wiederherstellen
+
+SystemMenu.maximize=Maximieren
+
+SystemMenu.skins=Substance skins
+
+SystemMenu.showHeapStatus=Heap Status anzeigen
+
+Tooltip.contentsNotSaved=Inhalte wurden nicht gespeichert
+
+Tooltip.heapStatusPanel=Heap Status. Hier klicken, um den Garbage Collector zu starten
+
+Xoetrope.hue=Farbton
+
+Xoetrope.brightness=Helligkeit
+
+Xoetrope.saturation=S\u00e4ttigung
+
+Xoetrope.warm=WARM
+
+Xoetrope.cold=KALT
+
+Xoetrope.decimalRGB=Dezimal RGB
+
+Xoetrope.webSafeColors=Nur Webfarben anzeigen
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=Alle Dateien
+
+FileChooser.cancelButtonMnemonic=65
+
+FileChooser.cancelButtonText=Abbrechen
+
+FileChooser.cancelButtonToolTipText=Dialogfeld f\u00fcr Dateiauswahl abbrechen
+
+FileChooser.directoryDescriptionText=Verzeichnis
+
+FileChooser.directoryOpenButtonMnemonic=69
+
+FileChooser.directoryOpenButtonText=\u00d6ffnen
+
+FileChooser.directoryOpenButtonToolTipText=Markiertes Verzeichnis \u00f6ffnen
+
+FileChooser.fileDescriptionText=Allgemeine Datei
+
+FileChooser.fileSizeGigaBytes={0} GB
+
+FileChooser.fileSizeKiloBytes={0} KB
+
+FileChooser.fileSizeMegaBytes={0} MB
+
+FileChooser.helpButtonMnemonic=72
+
+FileChooser.helpButtonText=Hilfe
+
+FileChooser.helpButtonToolTipText=Hilfe f\u00fcr Dateiauswahl
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=Fehler beim Erstellen eines neuen Ordners
+
+FileChooser.openButtonMnemonic=70
+
+FileChooser.openButtonText=\u00d6ffnen
+
+FileChooser.openButtonToolTipText=Ausgew\u00e4hlte Datei \u00f6ffnen
+
+FileChooser.openDialogTitleText=\u00d6ffnen
+
+FileChooser.other.newFolder=Neuer Ordner
+
+FileChooser.other.newFolder.subsequent=Neuer Ordner.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=Speichern
+
+FileChooser.saveButtonToolTipText=Ausgew\u00e4hlte Datei speichern
+
+FileChooser.saveDialogTitleText=Speichern
+
+FileChooser.updateButtonMnemonic=75
+
+FileChooser.updateButtonText=Aktualisieren
+
+FileChooser.updateButtonToolTipText=Verzeichnisliste aktualisieren
+
+FileChooser.win32.newFolder=Neuer Ordner
+
+FileChooser.win32.newFolder.subsequent=Neuer Ordner ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=Details
+
+FileChooser.detailsViewButtonAccessibleName=Details
+
+FileChooser.detailsViewButtonToolTipText=Details
+
+FileChooser.fileAttrHeaderText=Attribut
+
+FileChooser.fileDateHeaderText=Ge\u00e4ndert
+
+FileChooser.fileNameHeaderText=Dateiname
+
+FileChooser.fileNameLabelText=Dateiname:
+
+FileChooser.fileSizeHeaderText=Gr\u00f6\u00dfe
+
+FileChooser.fileTypeHeaderText=Typ
+
+FileChooser.filesOfTypeLabelText=Dateityp:
+
+FileChooser.homeFolderAccessibleName=Home
+
+FileChooser.homeFolderToolTipText=Home
+
+FileChooser.listViewActionLabelText=Liste
+
+FileChooser.listViewButtonAccessibleName=Liste
+
+FileChooser.listViewButtonToolTipText=Liste
+
+FileChooser.lookInLabelText=Suchen in:
+
+FileChooser.newFolderAccessibleName=Neuer Ordner
+
+FileChooser.newFolderActionLabelText=Neuer Ordner
+
+FileChooser.newFolderToolTipText=Neuen Ordner erstellen
+
+FileChooser.refreshActionLabelText=Aktualisieren
+
+FileChooser.saveInLabelText=Speichern in:
+
+FileChooser.upFolderAccessibleName=H\u00f6her
+
+FileChooser.upFolderToolTipText=Eine Ebene h\u00f6her
+
+FileChooser.viewMenuLabelText=Ansicht
+
+SystemMenu.alwaysOnTop=\u201eImmer im Vordergrund\u201c umschalten
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_el.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_el.properties
new file mode 100644
index 000000000..67e5b5e4b
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_el.properties
@@ -0,0 +1,21 @@
+SystemMenu.showHeapStatus=\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c3\u03c4\u03bf\u03af\u03b2\u03b1\u03c2
+
+Tooltip.contentsNotSaved=\u03c4\u03b1 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03b1 \u03b4\u03b5\u03bd \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b1\u03bd
+
+Tooltip.heapStatusPanel=\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf\u03af\u03b2\u03b1\u03c2. \u039a\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03b5\u03af \u03bf \u03c3\u03c5\u03bb\u03bb\u03ad\u03ba\u03c4\u03b7\u03c2 \u03b1\u03c0\u03bf\u03c1\u03c1\u03b9\u03bc\u03ac\u03c4\u03c9\u03bd
+
+Xoetrope.hue=\u0391\u03c0\u03cc\u03c7\u03c1\u03c9\u03c3\u03b7
+
+Xoetrope.brightness=\u03a6\u03c9\u03c4\u03b5\u03b9\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1
+
+Xoetrope.saturation=\u039a\u03bf\u03c1\u03b5\u03c3\u03bc\u03cc\u03c2
+
+Xoetrope.warm=\u0398\u0395\u03a1\u039c\u039f
+
+Xoetrope.cold=\u03a8\u03a5\u03a7\u03a1\u039f
+
+Xoetrope.decimalRGB=\u0394\u03b5\u03ba\u03b1\u03b4\u03b9\u03ba\u03cc RGB
+
+Xoetrope.webSafeColors=\u03a7\u03c1\u03ae\u03c3\u03b7 \u03b1\u03c3\u03c6\u03b1\u03bb\u03ce\u03bd \u03b3\u03b9\u03b1 \u03c4\u03bf \u03b4\u03af\u03ba\u03c4\u03c5\u03bf \u03c7\u03c1\u03c9\u03bc\u03ac\u03c4\u03c9\u03bd
+
+SystemMenu.alwaysOnTop=\u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae "\u03a0\u03ac\u03bd\u03c4\u03b1 \u03c3\u03c4\u03b7\u03bd \u03ba\u03bf\u03c1\u03c5\u03c6\u03ae"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_en_GB.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_en_GB.properties
new file mode 100644
index 000000000..4b2abcfaa
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_en_GB.properties
@@ -0,0 +1,29 @@
+# British labels by Robert Gibson
+
+SystemMenu.showHeapStatus=Show heap status
+
+Tooltip.contentsNotSaved=contents not saved
+
+Tooltip.heapStatusPanel=Heap status. Click to run garbage collector
+
+Tooltip.menuSearchButton=Select to view menu search panel
+
+Tooltip.menuSearchField=Enter search string and press 'Enter' button to search
+
+Tooltip.menuSearchTooltip=Click to locate menu
+
+Xoetrope.hue=Hue
+
+Xoetrope.brightness=Brightness
+
+Xoetrope.saturation=Saturation
+
+Xoetrope.warm=WARM
+
+Xoetrope.cold=COLD
+
+Xoetrope.decimalRGB=Decimal RGB
+
+Xoetrope.webSafeColors=Use web safe colours
+
+SystemMenu.alwaysOnTop=Toggle "Always on top"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es.properties
new file mode 100644
index 000000000..da5eeb27f
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es.properties
@@ -0,0 +1,147 @@
+# Danish translation by David \u00c1lvarez Le\u00f3n
+
+SystemMenu.close=Cerrar
+
+SystemMenu.iconify=Minimizar
+
+SystemMenu.restore=Restaurar
+
+SystemMenu.maximize=Maximizar
+
+SystemMenu.skins=Fondos Substance
+
+SystemMenu.showHeapStatus=Mostrar estado de pila
+
+Tooltip.contentsNotSaved=Contenidos sin guardar
+
+Tooltip.heapStatusPanel=Estado de pila. Pulse para pasar el recolector de basura.
+
+Xoetrope.hue=Tonalidad
+
+Xoetrope.brightness=Brillo
+
+Xoetrope.saturation=Saturaci\u00f3n
+
+Xoetrope.warm=c\u00c1LIDO
+
+Xoetrope.cold=F\u00cdRO
+
+Xoetrope.decimalRGB=RGB Decimal
+
+Xoetrope.webSafeColors=Use colores web seguros
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=Todos los archivos
+
+FileChooser.cancelButtonMnemonic=67
+
+FileChooser.cancelButtonText=Cancelar
+
+FileChooser.cancelButtonToolTipText=Cuadro de di\u00e1logo para cancelar elector de archivo
+
+FileChooser.directoryDescriptionText=Directorio
+
+FileChooser.directoryOpenButtonMnemonic=82
+
+FileChooser.directoryOpenButtonText=Abrir
+
+FileChooser.directoryOpenButtonToolTipText=Abrir directorio seleccionado
+
+FileChooser.fileDescriptionText=Archivo gen\u00e9rico
+
+FileChooser.fileSizeGigaBytes={0} GB
+
+FileChooser.fileSizeKiloBytes={0} KB
+
+FileChooser.fileSizeMegaBytes={0} MB
+
+FileChooser.helpButtonMnemonic=89
+
+FileChooser.helpButtonText=Ayuda
+
+FileChooser.helpButtonToolTipText=Ayuda elector de archivos
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=Error al crear una nueva carpeta
+
+FileChooser.openButtonMnemonic=65
+
+FileChooser.openButtonText=Abrir
+
+FileChooser.openButtonToolTipText=Abrir archivo seleccionado
+
+FileChooser.openDialogTitleText=Abrir
+
+FileChooser.other.newFolder=Carpeta nueva
+
+FileChooser.other.newFolder.subsequent=Carpeta nueva.{0}
+
+FileChooser.saveButtonMnemonic=71
+
+FileChooser.saveButtonText=Guardar
+
+FileChooser.saveButtonToolTipText=Guardar archivo seleccionado
+
+FileChooser.saveDialogTitleText=Guardar
+
+FileChooser.updateButtonMnemonic=84
+
+FileChooser.updateButtonText=Actualizar
+
+FileChooser.updateButtonToolTipText=Actualizar lista de directorios
+
+FileChooser.win32.newFolder=Carpeta nueva
+
+FileChooser.win32.newFolder.subsequent=Carpeta nueva ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=Detalles
+
+FileChooser.detailsViewButtonAccessibleName=Detalles
+
+FileChooser.detailsViewButtonToolTipText=Detalles
+
+FileChooser.fileAttrHeaderText=Atributos
+
+FileChooser.fileDateHeaderText=Modificado
+
+FileChooser.fileNameHeaderText=Nombre
+
+FileChooser.fileNameLabelText=Nombre de archivo:
+
+FileChooser.fileSizeHeaderText=Tama\u00f1o
+
+FileChooser.fileTypeHeaderText=Tipo
+
+FileChooser.filesOfTypeLabelText=Archivos de tipo:
+
+FileChooser.homeFolderAccessibleName=Principal
+
+FileChooser.homeFolderToolTipText=Principal
+
+FileChooser.listViewActionLabelText=Lista
+
+FileChooser.listViewButtonAccessibleName=Lista
+
+FileChooser.listViewButtonToolTipText=Lista
+
+FileChooser.lookInLabelText=Buscar en:
+
+FileChooser.newFolderAccessibleName=Carpeta nueva
+
+FileChooser.newFolderActionLabelText=Carpeta nueva
+
+FileChooser.newFolderToolTipText=Crear carpeta nueva
+
+FileChooser.refreshActionLabelText=Renovar
+
+FileChooser.saveInLabelText=Guardar en:
+
+FileChooser.upFolderAccessibleName=Arriba
+
+FileChooser.upFolderToolTipText=Subir un nivel
+
+FileChooser.viewMenuLabelText=Ver
+
+SystemMenu.alwaysOnTop= Alternar "Siempre encima"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_AR.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_AR.properties
new file mode 100644
index 000000000..97e4ee559
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_AR.properties
@@ -0,0 +1,106 @@
+# Spanish (Argentina) translation by Iv\u00e1n Ridao Freitas
+
+SystemMenu.close=Cerrar
+
+SystemMenu.iconify=Minimizar
+
+SystemMenu.restore=Restaurar
+
+SystemMenu.maximize=Maximizar
+
+SystemMenu.skins=Temas de Substance
+
+SystemMenu.showHeapStatus=Mostrar estado de pila
+
+TabbedPane.overviewButtonTooltip=Mostrar visi\u00f3n general de las pesta\u00f1as
+
+TabbedPane.overviewDialogTitle=Visi\u00f3n general de las pesta\u00f1as
+
+TabbedPane.overviewDialogTitleRefresh=Visi\u00f3n general de las pesta\u00f1as [actualizar cada {0} seg.]
+
+TabbedPane.overviewWidgetTooltip=Haga clic para cerrar la visi\u00f3n general y seleccionar la pesta\u00f1a
+
+Tooltip.contentsNotSaved=cambios sin guardar
+
+Tooltip.heapStatusPanel=Estado de pila. Haga clic para ejecutar el recolector de basura
+
+Tooltip.menuSearchButton=Seleccione para ver el panel de b\u00fasqueda del men\u00fa
+
+Tooltip.menuSearchField=Ingrese la cadena de b\u00fasqueda y presione la tecla 'Enter' para buscar
+
+Tooltip.menuSearchTooltip=Haga clic para ubicar el men\u00fa
+
+Xoetrope.hue=Tono
+
+Xoetrope.brightness=Brillo
+
+Xoetrope.saturation=Saturaci\u00f3n
+
+Xoetrope.warm=C\u00c1LIDO
+
+Xoetrope.cold=FR\u00cdO
+
+Xoetrope.decimalRGB=RGB decimal
+
+Xoetrope.webSafeColors=Usar colores web seguros
+
+EditMenu.copy=Copiar
+
+EditMenu.cut=Cortar
+
+EditMenu.paste=Pegar
+
+EditMenu.delete=Eliminar
+
+EditMenu.selectAll=Seleccionar todo
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=Detalles
+
+FileChooser.detailsViewButtonAccessibleName=Detalles
+
+FileChooser.detailsViewButtonToolTipText=Detalles
+
+FileChooser.fileAttrHeaderText=Atributos
+
+FileChooser.fileDateHeaderText=Modificado
+
+FileChooser.fileNameHeaderText=Nombre
+
+FileChooser.fileNameLabelText=Nombre de archivo:
+
+FileChooser.fileSizeHeaderText=Tama\u00f1o
+
+FileChooser.fileTypeHeaderText=Tipo
+
+FileChooser.filesOfTypeLabelText=Archivos de tipo:
+
+FileChooser.homeFolderAccessibleName=Principal
+
+FileChooser.homeFolderToolTipText=Principal
+
+FileChooser.listViewActionLabelText=Lista
+
+FileChooser.listViewButtonAccessibleName=Lista
+
+FileChooser.listViewButtonToolTipText=Lista
+
+FileChooser.lookInLabelText=Buscar en:
+
+FileChooser.newFolderAccessibleName=Carpeta nueva
+
+FileChooser.newFolderActionLabelText=Carpeta nueva
+
+FileChooser.newFolderToolTipText=Crear carpeta nueva
+
+FileChooser.refreshActionLabelText=Actualizar
+
+FileChooser.saveInLabelText=Guardar en:
+
+FileChooser.upFolderAccessibleName=Arriba
+
+FileChooser.upFolderToolTipText=Subir un nivel
+
+FileChooser.viewMenuLabelText=Ver
+
+SystemMenu.alwaysOnTop=Alternar "Siempre encima"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_MX.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_MX.properties
new file mode 100644
index 000000000..45d4bdd87
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_MX.properties
@@ -0,0 +1,21 @@
+SystemMenu.showHeapStatus=Mostrar estado de pila
+
+Tooltip.contentsNotSaved=contenidos no guardados
+
+Tooltip.heapStatusPanel=Estado de pila. Haga clic para ejecutar el basurero
+
+Xoetrope.hue=Tono
+
+Xoetrope.brightness=Brillo
+
+Xoetrope.saturation=Saturaci\u00f3n
+
+Xoetrope.warm=C\u00c1LIDO
+
+Xoetrope.cold=FR\u00cdO
+
+Xoetrope.decimalRGB=RGB decimal
+
+Xoetrope.webSafeColors=Use colores seguros para la Web
+
+SystemMenu.alwaysOnTop=Alternar "Siempre encima"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fi.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fi.properties
new file mode 100644
index 000000000..358d4a31d
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fi.properties
@@ -0,0 +1,21 @@
+SystemMenu.showHeapStatus=N\u00e4yt\u00e4 keon tila
+
+Tooltip.contentsNotSaved=sis\u00e4lt\u00f6\u00e4 ei tallennettu
+
+Tooltip.heapStatusPanel=Keon tila. Suorita muistin siivous napsauttamalla
+
+Xoetrope.hue=S\u00e4vy
+
+Xoetrope.brightness=Kirkkaus
+
+Xoetrope.saturation=Kyll\u00e4isyys
+
+Xoetrope.warm=L\u00c4MMIN
+
+Xoetrope.cold=KYLM\u00c4
+
+Xoetrope.decimalRGB=Desimaali-RGB
+
+Xoetrope.webSafeColors=K\u00e4yt\u00e4 selainturvallisia v\u00e4rej\u00e4
+
+SystemMenu.alwaysOnTop=Vaihda "Aina p\u00e4\u00e4llimm\u00e4isen\u00e4"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr.properties
new file mode 100644
index 000000000..f02af441d
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr.properties
@@ -0,0 +1,147 @@
+# French translation by Alois Cochard
+
+SystemMenu.close=Fermer
+
+SystemMenu.iconify=R\u00e9duire
+
+SystemMenu.restore=Restaurer
+
+SystemMenu.maximize=Agrandir
+
+SystemMenu.skins=Substance skins
+
+SystemMenu.showHeapStatus=Voir le statut de la pile
+
+Tooltip.contentsNotSaved=contenu non sauv\u00e9
+
+Tooltip.heapStatusPanel=Statut de la pile. Cliquez pour lancer 'garbage collector'
+
+Xoetrope.hue=Ton
+
+Xoetrope.brightness=Luminosit\u00e9
+
+Xoetrope.saturation=Saturation
+
+Xoetrope.warm=CHAUD
+
+Xoetrope.cold=FROID
+
+Xoetrope.decimalRGB=RGB D\u00e9cimal
+
+Xoetrope.webSafeColors=Couleurs compatible web
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=Tous les fichiers
+
+FileChooser.cancelButtonMnemonic=65
+
+FileChooser.cancelButtonText=Annuler
+
+FileChooser.cancelButtonToolTipText=Ferme la bo\u00eete de dialogue du s\u00e9lecteur de fichiers
+
+FileChooser.directoryDescriptionText=R\u00e9pertoire
+
+FileChooser.directoryOpenButtonMnemonic=79
+
+FileChooser.directoryOpenButtonText=Ouvrir
+
+FileChooser.directoryOpenButtonToolTipText=Ouvrir le r\u00e9pertoire s\u00e9lectionn\u00e9
+
+FileChooser.fileDescriptionText=Fichier g\u00e9n\u00e9rique
+
+FileChooser.fileSizeGigaBytes={0} Go
+
+FileChooser.fileSizeKiloBytes={0} Ko
+
+FileChooser.fileSizeMegaBytes={0} Mo
+
+FileChooser.helpButtonMnemonic=68
+
+FileChooser.helpButtonText=Aide
+
+FileChooser.helpButtonToolTipText=Aide sur le s\u00e9lecteur de fichiers
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=Erreur lors de la cr\u00e9ation du nouveau dossier
+
+FileChooser.openButtonMnemonic=79
+
+FileChooser.openButtonText=Ouvrir
+
+FileChooser.openButtonToolTipText=Ouvre le fichier s\u00e9lectionn\u00e9
+
+FileChooser.openDialogTitleText=Ouvrir
+
+FileChooser.other.newFolder=Nouveau dossier
+
+FileChooser.other.newFolder.subsequent=Nouveau dossier.{0}
+
+FileChooser.saveButtonMnemonic=69
+
+FileChooser.saveButtonText=Enregistrer
+
+FileChooser.saveButtonToolTipText=Enregistre le fichier s\u00e9lectionn\u00e9
+
+FileChooser.saveDialogTitleText=Enregistrer
+
+FileChooser.updateButtonMnemonic=77
+
+FileChooser.updateButtonText=Mise \u00e0 jour
+
+FileChooser.updateButtonToolTipText=Met \u00e0 jour la liste des r\u00e9pertoires
+
+FileChooser.win32.newFolder=Nouveau dossier
+
+FileChooser.win32.newFolder.subsequent=Nouveau dossier ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=D\u00e9tails
+
+FileChooser.detailsViewButtonAccessibleName=D\u00e9tails
+
+FileChooser.detailsViewButtonToolTipText=D\u00e9tails
+
+FileChooser.fileAttrHeaderText=Attributs
+
+FileChooser.fileDateHeaderText=Modifi\u00e9
+
+FileChooser.fileNameHeaderText=Nom
+
+FileChooser.fileNameLabelText=Nom de fichier :
+
+FileChooser.fileSizeHeaderText=Taille
+
+FileChooser.fileTypeHeaderText=Type
+
+FileChooser.filesOfTypeLabelText=Fichiers du type :
+
+FileChooser.homeFolderAccessibleName=Accueil
+
+FileChooser.homeFolderToolTipText=R\u00e9pertoire d'accueil
+
+FileChooser.listViewActionLabelText=Liste
+
+FileChooser.listViewButtonAccessibleName=Liste
+
+FileChooser.listViewButtonToolTipText=Liste
+
+FileChooser.lookInLabelText=Rechercher dans :
+
+FileChooser.newFolderAccessibleName=Nouveau dossier
+
+FileChooser.newFolderActionLabelText=Nouveau dossier
+
+FileChooser.newFolderToolTipText=Cr\u00e9e un nouveau dossier.
+
+FileChooser.refreshActionLabelText=Actualiser
+
+FileChooser.saveInLabelText=Enregistrer dans :
+
+FileChooser.upFolderAccessibleName=Vers le haut
+
+FileChooser.upFolderToolTipText=Remonte d'un niveau.
+
+FileChooser.viewMenuLabelText=Affichage
+
+SystemMenu.alwaysOnTop=Basculer "Toujours au-dessus"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr_CA.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr_CA.properties
new file mode 100644
index 000000000..10ed20d44
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr_CA.properties
@@ -0,0 +1,21 @@
+SystemMenu.showHeapStatus=Afficher l\'\u00e9tat d\'entassement
+
+Tooltip.contentsNotSaved=contenu non enregistr\u00e9
+
+Tooltip.heapStatusPanel=\u00c9tat d\'entassement. Cliquez pour ex\u00e9cuter le nettoyeur
+
+Xoetrope.hue=Teinte
+
+Xoetrope.brightness=Luminosit\u00e9
+
+Xoetrope.saturation=Saturation
+
+Xoetrope.warm=CHAUD
+
+Xoetrope.cold=FROID
+
+Xoetrope.decimalRGB=RVB d\u00e9cimal
+
+Xoetrope.webSafeColors=Utiliser des couleurs s\u00fbres pour le Web
+
+SystemMenu.alwaysOnTop=Basculer "Toujours au-dessus"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_hu.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_hu.properties
new file mode 100644
index 000000000..136cb8f67
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_hu.properties
@@ -0,0 +1,21 @@
+SystemMenu.showHeapStatus=Halom \u00e1llapot\u00e1nak megjelen\u00edt\u00e9se
+
+Tooltip.contentsNotSaved=A tartalom nincs mentve.
+
+Tooltip.heapStatusPanel=A halommem\u00f3ria \u00e1llapota. Kattintson ide a szem\u00e9tgy\u00fbjt\u00f5 futtat\u00e1s\u00e1hoz.
+
+Xoetrope.hue=\u00c1rnyalat
+
+Xoetrope.brightness=F\u00e9nyer\u00f5
+
+Xoetrope.saturation=Tel\u00edtetts\u00e9g
+
+Xoetrope.warm=MELEG
+
+Xoetrope.cold=HIDEG
+
+Xoetrope.decimalRGB=Decim\u00e1lis RGB
+
+Xoetrope.webSafeColors=Weben megjelen\u00edthet\u00f5 sz\u00ednek haszn\u00e1lata
+
+SystemMenu.alwaysOnTop=\u201eMindig fel\u00fcl\u201d kapcsol\u00e1sa
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_it.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_it.properties
new file mode 100644
index 000000000..8b3ba6a91
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_it.properties
@@ -0,0 +1,149 @@
+# Italian translation by Sandro Martini
+
+SystemMenu.close=Chiudi
+
+SystemMenu.iconify=Iconizza
+
+SystemMenu.restore=Ripristina
+
+SystemMenu.maximize=Massimizza
+
+SystemMenu.skins=Skin di Substance
+
+SystemMenu.showHeapStatus=Visualizza stato memoria
+
+SystemMenu.titlePainters=Disegna Titoli di Substance
+
+Tooltip.contentsNotSaved=contenuto non salvato
+
+Tooltip.heapStatusPanel=Stato memoria. Clicca per eseguire il Garbage Collector
+
+Xoetrope.hue=Tonalit\u00e0
+
+Xoetrope.brightness=Luminosit\u00e0
+
+Xoetrope.saturation=Saturazione
+
+Xoetrope.warm=CALDO
+
+Xoetrope.cold=FREDDO
+
+Xoetrope.decimalRGB=RGB Decimale
+
+Xoetrope.webSafeColors=Usa colori sicuri per il web
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=Tutti i file
+
+FileChooser.cancelButtonMnemonic=65
+
+FileChooser.cancelButtonText=Annulla
+
+FileChooser.cancelButtonToolTipText=Finestra di dialogo Interrompi selezione file
+
+FileChooser.directoryDescriptionText=Directory
+
+FileChooser.directoryOpenButtonMnemonic=82
+
+FileChooser.directoryOpenButtonText=Apri
+
+FileChooser.directoryOpenButtonToolTipText=Apri directory selezionata
+
+FileChooser.fileDescriptionText=File generico
+
+FileChooser.fileSizeGigaBytes={0} GB
+
+FileChooser.fileSizeKiloBytes={0} KB
+
+FileChooser.fileSizeMegaBytes={0} MB
+
+FileChooser.helpButtonMnemonic=63
+
+FileChooser.helpButtonText=?
+
+FileChooser.helpButtonToolTipText=Guida di Selezione file
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=Errore durante la creazione della nuova cartella
+
+FileChooser.openButtonMnemonic=80
+
+FileChooser.openButtonText=Apri
+
+FileChooser.openButtonToolTipText=Apri file selezionato
+
+FileChooser.openDialogTitleText=Apri
+
+FileChooser.other.newFolder=Nuova cartella
+
+FileChooser.other.newFolder.subsequent=Nuova cartella.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=Salva
+
+FileChooser.saveButtonToolTipText=Salva file selezionato
+
+FileChooser.saveDialogTitleText=Salva
+
+FileChooser.updateButtonMnemonic=71
+
+FileChooser.updateButtonText=Aggiorna
+
+FileChooser.updateButtonToolTipText=Aggiorna elenco directory
+
+FileChooser.win32.newFolder=Nuova cartella
+
+FileChooser.win32.newFolder.subsequent=Nuova cartella ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=Dettagli
+
+FileChooser.detailsViewButtonAccessibleName=Dettagli
+
+FileChooser.detailsViewButtonToolTipText=Dettagli
+
+FileChooser.fileAttrHeaderText=Attributi
+
+FileChooser.fileDateHeaderText=Modificato
+
+FileChooser.fileNameHeaderText=Nome
+
+FileChooser.fileNameLabelText=Nome file:
+
+FileChooser.fileSizeHeaderText=Dimensioni
+
+FileChooser.fileTypeHeaderText=Tipo
+
+FileChooser.filesOfTypeLabelText=Tipo file:
+
+FileChooser.homeFolderAccessibleName=Principale
+
+FileChooser.homeFolderToolTipText=Principale
+
+FileChooser.listViewActionLabelText=Elenco
+
+FileChooser.listViewButtonAccessibleName=Elenco
+
+FileChooser.listViewButtonToolTipText=Elenco
+
+FileChooser.lookInLabelText=Cerca in:
+
+FileChooser.newFolderAccessibleName=Nuova cartella
+
+FileChooser.newFolderActionLabelText=Nuova cartella
+
+FileChooser.newFolderToolTipText=Crea nuova cartella
+
+FileChooser.refreshActionLabelText=Aggiorna
+
+FileChooser.saveInLabelText=Salva in:
+
+FileChooser.upFolderAccessibleName=Superiore
+
+FileChooser.upFolderToolTipText=Cartella superiore
+
+FileChooser.viewMenuLabelText=Visualizza
+
+SystemMenu.alwaysOnTop=Attiva/disattiva "Sempre in primo piano"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_iw.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_iw.properties
new file mode 100644
index 000000000..7a2aae5d0
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_iw.properties
@@ -0,0 +1,33 @@
+# Hebrew translation by Kirill Grouchnikov
+
+SystemMenu.close=\u05e1\u05d2\u05d5\u05e8
+
+SystemMenu.iconify=\u05de\u05d6\u05e2\u05e8
+
+SystemMenu.restore=\u05e9\u05d7\u05d6\u05e8
+
+SystemMenu.maximize=\u05d4\u05d2\u05d3\u05dc
+
+SystemMenu.skins=\u05e7\u05e8\u05d5\u05de\u05d9\u05dd \u05d1:Substance
+
+SystemMenu.showHeapStatus=\u05d4\u05e8\u05d0\u05d4 \u05de\u05e6\u05d1 \u05d4\u05e2\u05e8\u05d9\u05de\u05d4
+
+Tooltip.contentsNotSaved=\u05ea\u05db\u05d5\u05dc\u05d4 \u05dc\u05d0 \u05e0\u05e9\u05de\u05e8\u05d4
+
+Tooltip.heapStatusPanel=\u05de\u05e6\u05d1 \u05d4\u05e2\u05e8\u05d9\u05de\u05d4. \u05dc\u05d7\u05e5 \u05dc\u05d4\u05e8\u05e6\u05ea \u05d0\u05d5\u05e1\u05e3 \u05d0\u05e9\u05e4\u05d4
+
+Xoetrope.hue=\u05d2\u05d5\u05d5\u05df
+
+Xoetrope.brightness=\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea
+
+Xoetrope.saturation=\u05d4\u05e8\u05d5\u05d5\u05d9\u05d4
+
+Xoetrope.warm=\u05d7\u05d5\u05dd
+
+Xoetrope.cold=\u05e7\u05d5\u05e8
+
+Xoetrope.decimalRGB=\u05e2\u05e9\u05e8\u05d5\u05e0\u05d9
+
+Xoetrope.webSafeColors=\u05e7\u05d7 \u05e6\u05d1\u05e2\u05d9 web
+
+SystemMenu.alwaysOnTop=\u05d4\u05d7\u05dc\u05e3 "\u05ea\u05de\u05d9\u05d3 \u05e2\u05dc\u05d9\u05d5\u05df"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ja.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ja.properties
new file mode 100644
index 000000000..be538bbbc
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ja.properties
@@ -0,0 +1,135 @@
+SystemMenu.showHeapStatus=\u30d2\u30fc\u30d7 \u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u8868\u793a
+
+Tooltip.contentsNotSaved=\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u4fdd\u5b58\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+
+Tooltip.heapStatusPanel=\u30d2\u30fc\u30d7 \u30b9\u30c6\u30fc\u30bf\u30b9\u3002\u30ac\u30fc\u30d9\u30b8 \u30b3\u30ec\u30af\u30bf\u3092\u5b9f\u884c\u3059\u308b\u306b\u306f\u3001\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059
+
+Xoetrope.hue=\u8272\u5408\u3044
+
+Xoetrope.brightness=\u8f1d\u5ea6
+
+Xoetrope.saturation=\u5f69\u5ea6
+
+Xoetrope.warm=\u6696
+
+Xoetrope.cold=\u51b7
+
+Xoetrope.decimalRGB=10 \u9032\u6570 RGB
+
+Xoetrope.webSafeColors=Web \u30bb\u30fc\u30d5 \u30ab\u30e9\u30fc\u3092\u4f7f\u7528
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb
+
+FileChooser.cancelButtonMnemonic=67
+
+FileChooser.cancelButtonText=\u53d6\u6d88\u3057
+
+FileChooser.cancelButtonToolTipText=\u30d5\u30a1\u30a4\u30eb\u30c1\u30e5\u30fc\u30b6\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u7d42\u4e86
+
+FileChooser.directoryDescriptionText=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea
+
+FileChooser.directoryOpenButtonMnemonic=79
+
+FileChooser.directoryOpenButtonText=\u958b\u304f
+
+FileChooser.directoryOpenButtonToolTipText=\u9078\u629e\u3057\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u958b\u304f
+
+FileChooser.fileDescriptionText=\u6c4e\u7528\u30d5\u30a1\u30a4\u30eb
+
+FileChooser.fileSizeGigaBytes={0} G \u30d0\u30a4\u30c8
+
+FileChooser.fileSizeKiloBytes={0} K \u30d0\u30a4\u30c8
+
+FileChooser.fileSizeMegaBytes={0} M \u30d0\u30a4\u30c8
+
+FileChooser.helpButtonMnemonic=72
+
+FileChooser.helpButtonText=\u30d8\u30eb\u30d7(H)
+
+FileChooser.helpButtonToolTipText=\u30d5\u30a1\u30a4\u30eb\u30c1\u30e5\u30fc\u30b6\u30d8\u30eb\u30d7
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=\u65b0\u898f\u30d5\u30a9\u30eb\u30c0\u306e\u4f5c\u6210\u306b\u5931\u6557
+
+FileChooser.openButtonMnemonic=79
+
+FileChooser.openButtonText=\u958b\u304f
+
+FileChooser.openButtonToolTipText=\u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f
+
+FileChooser.openDialogTitleText=\u958b\u304f
+
+FileChooser.other.newFolder=\u65b0\u898f\u30d5\u30a9\u30eb\u30c0
+
+FileChooser.other.newFolder.subsequent=\u65b0\u898f\u30d5\u30a9\u30eb\u30c0.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=\u4fdd\u5b58
+
+FileChooser.saveButtonToolTipText=\u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58
+
+FileChooser.saveDialogTitleText=\u4fdd\u5b58
+
+FileChooser.updateButtonMnemonic=85
+
+FileChooser.updateButtonText=\u66f4\u65b0(U)
+
+FileChooser.updateButtonToolTipText=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u4e00\u89a7\u3092\u66f4\u65b0
+
+FileChooser.win32.newFolder=\u65b0\u898f\u30d5\u30a9\u30eb\u30c0
+
+FileChooser.win32.newFolder.subsequent=\u65b0\u898f\u30d5\u30a9\u30eb\u30c0 ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=\u8a73\u7d30
+
+FileChooser.detailsViewButtonAccessibleName=\u8a73\u7d30
+
+FileChooser.detailsViewButtonToolTipText=\u8a73\u7d30
+
+FileChooser.fileAttrHeaderText=\u5c5e\u6027
+
+FileChooser.fileDateHeaderText=\u4fee\u6b63\u65e5
+
+FileChooser.fileNameHeaderText=\u540d\u524d
+
+FileChooser.fileNameLabelText=\u30d5\u30a1\u30a4\u30eb\u540d:
+
+FileChooser.fileSizeHeaderText=\u30b5\u30a4\u30ba
+
+FileChooser.fileTypeHeaderText=\u578b
+
+FileChooser.filesOfTypeLabelText=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7:
+
+FileChooser.homeFolderAccessibleName=\u30db\u30fc\u30e0
+
+FileChooser.homeFolderToolTipText=\u30db\u30fc\u30e0
+
+FileChooser.listViewActionLabelText=\u30ea\u30b9\u30c8
+
+FileChooser.listViewButtonAccessibleName=\u30ea\u30b9\u30c8
+
+FileChooser.listViewButtonToolTipText=\u30ea\u30b9\u30c8
+
+FileChooser.lookInLabelText=\u53c2\u7167:
+
+FileChooser.newFolderAccessibleName=\u65b0\u898f\u30d5\u30a9\u30eb\u30c0
+
+FileChooser.newFolderActionLabelText=\u65b0\u898f\u30d5\u30a9\u30eb\u30c0
+
+FileChooser.newFolderToolTipText=\u30d5\u30a9\u30eb\u30c0\u306e\u65b0\u898f\u4f5c\u6210
+
+FileChooser.refreshActionLabelText=\u66f4\u65b0
+
+FileChooser.saveInLabelText=\u4fdd\u5b58:
+
+FileChooser.upFolderAccessibleName=\u4e0a\u3078
+
+FileChooser.upFolderToolTipText=1 \u30ec\u30d9\u30eb\u4e0a\u3078
+
+FileChooser.viewMenuLabelText=\u8868\u793a
+
+SystemMenu.alwaysOnTop=\u300c\u5e38\u306b\u6700\u524d\u9762\u300d\u3092\u5207\u308a\u66ff\u3048
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ko.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ko.properties
new file mode 100644
index 000000000..01ca1bd36
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ko.properties
@@ -0,0 +1,115 @@
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=\ubaa8\ub4e0 \ud30c\uc77c
+
+FileChooser.cancelButtonMnemonic=67
+
+FileChooser.cancelButtonText=\ucde8\uc18c
+
+FileChooser.cancelButtonToolTipText=\ud30c\uc77c \uc120\ud0dd \ub300\ud654 \uc0c1\uc790 \uc911\uc9c0
+
+FileChooser.directoryDescriptionText=\ub514\ub809\ud1a0\ub9ac
+
+FileChooser.directoryOpenButtonMnemonic=79
+
+FileChooser.directoryOpenButtonText=\uc5f4\uae30
+
+FileChooser.directoryOpenButtonToolTipText=\uc120\ud0dd\ub41c \ub514\ub809\ud1a0\ub9ac \uc5f4\uae30
+
+FileChooser.fileDescriptionText=\uc77c\ubc18 \ud30c\uc77c
+
+FileChooser.fileSizeGigaBytes={0}GB
+
+FileChooser.fileSizeKiloBytes={0}KB
+
+FileChooser.fileSizeMegaBytes={0}MB
+
+FileChooser.helpButtonMnemonic=72
+
+FileChooser.helpButtonText=\ub3c4\uc6c0\ub9d0(H)
+
+FileChooser.helpButtonToolTipText=FileChooser \ub3c4\uc6c0\ub9d0
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=\uc0c8 \ud3f4\ub354 \uc791\uc131 \uc624\ub958
+
+FileChooser.openButtonMnemonic=79
+
+FileChooser.openButtonText=\uc5f4\uae30
+
+FileChooser.openButtonToolTipText=\uc120\ud0dd\ub41c \ud30c\uc77c \uc5f4\uae30
+
+FileChooser.openDialogTitleText=\uc5f4\uae30
+
+FileChooser.other.newFolder=\uc0c8 \ud3f4\ub354
+
+FileChooser.other.newFolder.subsequent=\uc0c8 \ud3f4\ub354.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=\uc800\uc7a5
+
+FileChooser.saveButtonToolTipText=\uc120\ud0dd\ub41c \ud30c\uc77c \uc800\uc7a5
+
+FileChooser.saveDialogTitleText=\uc800\uc7a5
+
+FileChooser.updateButtonMnemonic=85
+
+FileChooser.updateButtonText=\uc5c5\ub370\uc774\ud2b8(U)
+
+FileChooser.updateButtonToolTipText=\ub514\ub809\ud1a0\ub9ac \ubaa9\ub85d \uc5c5\ub370\uc774\ud2b8
+
+FileChooser.win32.newFolder=\uc0c8 \ud3f4\ub354
+
+FileChooser.win32.newFolder.subsequent=\uc0c8 \ud3f4\ub354 ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=\uc790\uc138\ud788
+
+FileChooser.detailsViewButtonAccessibleName=\uc790\uc138\ud788
+
+FileChooser.detailsViewButtonToolTipText=\uc790\uc138\ud788
+
+FileChooser.fileAttrHeaderText=\uc18d\uc131
+
+FileChooser.fileDateHeaderText=\uc218\uc815
+
+FileChooser.fileNameHeaderText=\uc774\ub984
+
+FileChooser.fileNameLabelText=\ud30c\uc77c \uc774\ub984:
+
+FileChooser.fileSizeHeaderText=\ud06c\uae30
+
+FileChooser.fileTypeHeaderText=\uc885\ub958
+
+FileChooser.filesOfTypeLabelText=\ud30c\uc77c \uc885\ub958:
+
+FileChooser.homeFolderAccessibleName=\ud648
+
+FileChooser.homeFolderToolTipText=\ud648
+
+FileChooser.listViewActionLabelText=\ubaa9\ub85d
+
+FileChooser.listViewButtonAccessibleName=\ubaa9\ub85d
+
+FileChooser.listViewButtonToolTipText=\ubaa9\ub85d
+
+FileChooser.lookInLabelText=\uac80\uc0c9 \uc704\uce58:
+
+FileChooser.newFolderAccessibleName=\uc0c8 \ud3f4\ub354
+
+FileChooser.newFolderActionLabelText=\uc0c8 \ud3f4\ub354
+
+FileChooser.newFolderToolTipText=\uc0c8 \ud3f4\ub354 \uc791\uc131
+
+FileChooser.refreshActionLabelText=\uac31\uc2e0
+
+FileChooser.saveInLabelText=\uc800\uc7a5 \uc704\uce58
+
+FileChooser.upFolderAccessibleName=\uc704
+
+FileChooser.upFolderToolTipText=\ud55c \ub2e8\uacc4 \uc704\ub85c
+
+FileChooser.viewMenuLabelText=\ubcf4\uae30
+
+SystemMenu.alwaysOnTop="\ud56d\uc0c1 \uc704\uc5d0 \uace0\uc815" \uc804\ud658
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_nl.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_nl.properties
new file mode 100644
index 000000000..326b25354
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_nl.properties
@@ -0,0 +1,33 @@
+# Dutch translation by Ilana Paktor and Joachim van den Berg
+
+SystemMenu.close=Sluit
+
+SystemMenu.iconify=Minimaliseer
+
+SystemMenu.restore=Herstel
+
+SystemMenu.maximize=Maximaliseer
+
+SystemMenu.skins=Substance skins
+
+SystemMenu.showHeapStatus=Toon heap status
+
+Tooltip.contentsNotSaved=contents zijn niet bewaard
+
+Tooltip.heapStatusPanel=Heap status. Klik om de Garbage Collector te activeren
+
+Xoetrope.hue=Kleurschakering
+
+Xoetrope.brightness=Helderheid
+
+Xoetrope.saturation=Verzadiging
+
+Xoetrope.warm=WARM
+
+Xoetrope.cold=KOUD
+
+Xoetrope.decimalRGB=Decimale RGB
+
+Xoetrope.webSafeColors=Gebruik Web-Veilige kleuren
+
+SystemMenu.alwaysOnTop="Altijd bovenop" wisselen
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_no.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_no.properties
new file mode 100644
index 000000000..9dc121626
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_no.properties
@@ -0,0 +1,33 @@
+# Norwegian translation by Nils-Morten Nilssen
+
+SystemMenu.close=Lukk
+
+SystemMenu.iconify=Ikoniser
+
+SystemMenu.restore=Gjenopprett
+
+SystemMenu.maximize=Maksimer
+
+SystemMenu.skins=Substance drakter
+
+SystemMenu.showHeapStatus=Vis heap status
+
+Tooltip.contentsNotSaved=innholdet er ikke lagret
+
+Tooltip.heapStatusPanel=Heap status. Klikk for \u00e5 kj\u00f8re garbage collector
+
+Xoetrope.hue=Fargetone
+
+Xoetrope.brightness=Lysstyrke
+
+Xoetrope.saturation=Metningsgrad
+
+Xoetrope.warm=VARM
+
+Xoetrope.cold=KALD
+
+Xoetrope.decimalRGB=Desimal RGB
+
+Xoetrope.webSafeColors=Bruk websikre farger
+
+SystemMenu.alwaysOnTop=Veksle "Alltid \u00f8verst"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pl.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pl.properties
new file mode 100644
index 000000000..be8ea0db1
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pl.properties
@@ -0,0 +1,33 @@
+# Polish translation by Maciej Zwirski
+
+SystemMenu.close=Zamknij
+
+SystemMenu.iconify=Minimalizuj
+
+SystemMenu.restore=Przywr\u00f3\u0107
+
+SystemMenu.maximize=Maksymalizuj
+
+SystemMenu.skins=Sk\u00f3rki Substance
+
+SystemMenu.showHeapStatus=Poka\u017c stan stosu
+
+Tooltip.contentsNotSaved=zawarto\u015b\u0107 nie zosta\u0142a zapisana
+
+Tooltip.heapStatusPanel=Stan stosu. Kliknij, aby uruchomi\u0107 od\u015bmiecanie pami\u0119ci
+
+Xoetrope.hue=Odcie\u0144
+
+Xoetrope.brightness=Jasno\u015b\u0107
+
+Xoetrope.saturation=Nasycenie
+
+Xoetrope.warm=CIEP\u0141E
+
+Xoetrope.cold=ZIMNE
+
+Xoetrope.decimalRGB=Dziesi\u0119tne RGB
+
+Xoetrope.webSafeColors=U\u017cyj kolor\u00f3w przyjaznych dla sieci
+
+SystemMenu.alwaysOnTop=Prze\u0142\u0105cz \u201eZawsze na wierzchu\u201d
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt.properties
new file mode 100644
index 000000000..54c1cce89
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt.properties
@@ -0,0 +1,21 @@
+SystemMenu.showHeapStatus=Mostrar status da pilha
+
+Tooltip.contentsNotSaved=conte\u00fado n\u00e3o gravado
+
+Tooltip.heapStatusPanel=Status da pilha. Clique para executar a coleta de lixo
+
+Xoetrope.hue=Matiz
+
+Xoetrope.brightness=Brilho
+
+Xoetrope.saturation=Satura\u00e7\u00e3o
+
+Xoetrope.warm=QUENTE
+
+Xoetrope.cold=FRIO
+
+Xoetrope.decimalRGB=RGB decimal
+
+Xoetrope.webSafeColors=Usar cores de seguran\u00e7a da Web
+
+SystemMenu.alwaysOnTop=Alternar "Sempre no topo"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt_BR.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt_BR.properties
new file mode 100644
index 000000000..bb12cef27
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt_BR.properties
@@ -0,0 +1,33 @@
+# Portuguese (Brazil) translation by Claudio de Oliveira Miranda
+
+SystemMenu.close=Fechar
+
+SystemMenu.iconify=Minimizar
+
+SystemMenu.restore=Restaurar
+
+SystemMenu.maximize=Maximizar
+
+SystemMenu.skins=Apar\u00eancia do Substance
+
+SystemMenu.showHeapStatus=Mostrar status do heap
+
+Tooltip.contentsNotSaved=Conte\u00fado n\u00e3o gravado
+
+Tooltip.heapStatusPanel=Status do heap. Clique para acionar o garbage collector
+
+Xoetrope.hue=Tonalidade
+
+Xoetrope.brightness=Brilho
+
+Xoetrope.saturation=Satura\u00e7\u00e3o
+
+Xoetrope.warm=QUENTE
+
+Xoetrope.cold=FRIO
+
+Xoetrope.decimalRGB=RGB Decimal
+
+Xoetrope.webSafeColors=Usar cores seguras da web
+
+SystemMenu.alwaysOnTop=Alternar "Sempre no topo"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ro.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ro.properties
new file mode 100644
index 000000000..5f9f484c9
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ro.properties
@@ -0,0 +1,23 @@
+# Romanian translation by Sergiu Nicolae Nacu and Ran Locar
+
+SystemMenu.showHeapStatus=Vizionare stare memorie heap
+
+Tooltip.contentsNotSaved=con\u0163inutul nu a fost salvat
+
+Tooltip.heapStatusPanel=Stare memorie heap. Apasa\u0163i pentru a porni garbage colector - ul
+
+Xoetrope.hue=Nuan\u0163\u0103
+
+Xoetrope.brightness=Luminozitate
+
+Xoetrope.saturation=Satura\u0163ie
+
+Xoetrope.warm=CALD
+
+Xoetrope.cold=RECE
+
+Xoetrope.decimalRGB=RGB decimal
+
+Xoetrope.webSafeColors=Folose\u015fte culori compatibile web
+
+SystemMenu.alwaysOnTop=Comutare \u201e\u00centotdeauna deasupra\u201d
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ru.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ru.properties
new file mode 100644
index 000000000..bdc4b3b28
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ru.properties
@@ -0,0 +1,33 @@
+# Russian translation by Kirill Grouchnikov
+
+SystemMenu.close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
+
+SystemMenu.iconify=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c
+
+SystemMenu.restore=\u0412\u0435\u0440\u043d\u0443\u0442\u044c
+
+SystemMenu.maximize=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c
+
+SystemMenu.skins=\u041e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 Substance
+
+SystemMenu.showHeapStatus=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0443\u0447\u0438
+
+Tooltip.contentsNotSaved=\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e
+
+Tooltip.heapStatusPanel=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0443\u0447\u0438. \u041a\u043b\u0438\u043a \u043c\u044b\u0448\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430.
+
+Xoetrope.hue=\u041e\u0442\u0442\u0435\u043d\u043e\u043a
+
+Xoetrope.brightness=\u042f\u0440\u043a\u043e\u0441\u0442\u044c
+
+Xoetrope.saturation=\u0421\u0430\u0442\u0443\u0440\u0430\u0446\u0438\u044f
+
+Xoetrope.warm=\u0422\u0415\u041f\u041b\u041e
+
+Xoetrope.cold=\u0425\u041e\u041b\u041e\u0414
+
+Xoetrope.decimalRGB=\u0414\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0435
+
+Xoetrope.webSafeColors=\u0411\u0440\u0430\u0442\u044c web-\u0446\u0432\u0435\u0442\u0430
+
+SystemMenu.alwaysOnTop=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u00ab\u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u00bb
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_sv.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_sv.properties
new file mode 100644
index 000000000..76887450d
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_sv.properties
@@ -0,0 +1,143 @@
+SystemMenu.close=St\u00e4ng
+
+SystemMenu.iconify=Minimera
+
+SystemMenu.restore=\u00c5terst\u00e4ll
+
+SystemMenu.maximize=Maximera
+
+SystemMenu.showHeapStatus=Visa heap-status
+
+Tooltip.contentsNotSaved=inneh\u00e5llet har inte sparats
+
+Tooltip.heapStatusPanel=Heap-status. Klicka h\u00e4r f\u00f6r att k\u00f6ra skr\u00e4pinsamlaren
+
+Xoetrope.hue=Nyans
+
+Xoetrope.brightness=Ljusstyrka
+
+Xoetrope.saturation=M\u00e4ttnad
+
+Xoetrope.warm=VARM
+
+Xoetrope.cold=KALL
+
+Xoetrope.decimalRGB=RGB-decimaler
+
+Xoetrope.webSafeColors=Anv\u00e4nd webbs\u00e4kra f\u00e4rger
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=Alla filer
+
+FileChooser.cancelButtonMnemonic=65
+
+FileChooser.cancelButtonText=Avbryt
+
+FileChooser.cancelButtonToolTipText=Avbryt filvalsdialogruta
+
+FileChooser.directoryDescriptionText=Katalog
+
+FileChooser.directoryOpenButtonMnemonic=80
+
+FileChooser.directoryOpenButtonText=\u00d6ppna
+
+FileChooser.directoryOpenButtonToolTipText=\u00d6ppnar den markerade katalogen
+
+FileChooser.fileDescriptionText=Generisk fil
+
+FileChooser.fileSizeGigaBytes={0} GB
+
+FileChooser.fileSizeKiloBytes={0} KB
+
+FileChooser.fileSizeMegaBytes={0} MB
+
+FileChooser.helpButtonMnemonic=72
+
+FileChooser.helpButtonText=Hj\u00e4lp
+
+FileChooser.helpButtonToolTipText=Hj\u00e4lp - Filv\u00e4ljare
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=Fel d\u00e5 ny mapp skapades
+
+FileChooser.openButtonMnemonic=78
+
+FileChooser.openButtonText=\u00d6ppna
+
+FileChooser.openButtonToolTipText=\u00d6ppna markerad fil
+
+FileChooser.openDialogTitleText=\u00d6ppna
+
+FileChooser.other.newFolder=Ny mapp
+
+FileChooser.other.newFolder.subsequent=Ny mapp.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=Spara
+
+FileChooser.saveButtonToolTipText=Spara markerad fil
+
+FileChooser.saveDialogTitleText=Spara
+
+FileChooser.updateButtonMnemonic=85
+
+FileChooser.updateButtonText=Uppdatera
+
+FileChooser.updateButtonToolTipText=Uppdatera kataloglistan
+
+FileChooser.win32.newFolder=Ny mapp
+
+FileChooser.win32.newFolder.subsequent=Ny mapp ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=Detaljerad lista
+
+FileChooser.detailsViewButtonAccessibleName=Detaljerad lista
+
+FileChooser.detailsViewButtonToolTipText=Detaljerad lista
+
+FileChooser.fileAttrHeaderText=Attribut
+
+FileChooser.fileDateHeaderText=\u00c4ndrad
+
+FileChooser.fileNameHeaderText=Namn
+
+FileChooser.fileNameLabelText=Filnamn:
+
+FileChooser.fileSizeHeaderText=Storlek
+
+FileChooser.fileTypeHeaderText=Typ
+
+FileChooser.filesOfTypeLabelText=Filformat:
+
+FileChooser.homeFolderAccessibleName=Hem
+
+FileChooser.homeFolderToolTipText=Hem
+
+FileChooser.listViewActionLabelText=Lista
+
+FileChooser.listViewButtonAccessibleName=Lista
+
+FileChooser.listViewButtonToolTipText=Lista
+
+FileChooser.lookInLabelText=S\u00f6k i:
+
+FileChooser.newFolderAccessibleName=Ny mapp
+
+FileChooser.newFolderActionLabelText=Ny mapp
+
+FileChooser.newFolderToolTipText=Skapa ny mapp
+
+FileChooser.refreshActionLabelText=Uppdatera
+
+FileChooser.saveInLabelText=Spara i:
+
+FileChooser.upFolderAccessibleName=Upp
+
+FileChooser.upFolderToolTipText=Upp en niv\u00e5
+
+FileChooser.viewMenuLabelText=Vy
+
+SystemMenu.alwaysOnTop=V\u00e4xla "Alltid \u00f6verst"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_th.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_th.properties
new file mode 100644
index 000000000..f44466752
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_th.properties
@@ -0,0 +1,21 @@
+SystemMenu.showHeapStatus=\u0e41\u0e2a\u0e14\u0e07\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e42\u0e14\u0e22\u0e23\u0e27\u0e21
+
+Tooltip.contentsNotSaved=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a
+
+Tooltip.heapStatusPanel=\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e42\u0e14\u0e22\u0e23\u0e27\u0e21 \u0e04\u0e25\u0e34\u0e01\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e15\u0e31\u0e27\u0e23\u0e27\u0e1a\u0e23\u0e27\u0e21\u0e02\u0e22\u0e30
+
+Xoetrope.hue=\u0e2a\u0e35\u0e2a\u0e31\u0e19
+
+Xoetrope.brightness=\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e27\u0e48\u0e32\u0e07
+
+Xoetrope.saturation=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e02\u0e49\u0e21
+
+Xoetrope.warm=\u0e2d\u0e1a\u0e2d\u0e38\u0e48\u0e19
+
+Xoetrope.cold=\u0e40\u0e22\u0e47\u0e19\u0e0a\u0e32
+
+Xoetrope.decimalRGB=RGB \u0e40\u0e1b\u0e47\u0e19\u0e17\u0e28\u0e19\u0e34\u0e22\u0e21
+
+Xoetrope.webSafeColors=\u0e43\u0e0a\u0e49\u0e2a\u0e35\u0e17\u0e35\u0e48\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22\u0e1a\u0e19\u0e40\u0e27\u0e47\u0e1a
+
+SystemMenu.alwaysOnTop=\u0e2a\u0e25\u0e31\u0e1a "\u0e2d\u0e22\u0e39\u0e48\u0e14\u0e49\u0e32\u0e19\u0e1a\u0e19\u0e40\u0e2a\u0e21\u0e2d"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_tr.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_tr.properties
new file mode 100644
index 000000000..769f89421
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_tr.properties
@@ -0,0 +1,31 @@
+# Turkish translation by Magnus de Pourbaix and Oncu Altuntas
+
+SystemMenu.close=Kapat
+
+SystemMenu.iconify=Simge Durumuna K\u00fc\u00e7\u00fclt
+
+SystemMenu.restore=\u00d6nceki boyut
+
+SystemMenu.maximize=Ekran\u0131 Kapla
+
+SystemMenu.showHeapStatus=K\u00fcme durumunu g\u00f6ster
+
+Tooltip.contentsNotSaved=i\u00e7erik kaydedilmedi
+
+Tooltip.heapStatusPanel=K\u00fcme durumu. \u00c7\u00f6p toplay\u0131c\u0131y\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in t\u0131klay\u0131n
+
+Xoetrope.hue=Renk tonu
+
+Xoetrope.brightness=Parlakl\u0131k
+
+Xoetrope.saturation=Doygunluk
+
+Xoetrope.warm=ILIK
+
+Xoetrope.cold=SO\u011eUK
+
+Xoetrope.decimalRGB=Ondal\u0131k RGB
+
+Xoetrope.webSafeColors=Web i\u00e7in g\u00fcvenli renkler kullan
+
+SystemMenu.alwaysOnTop="Her zaman \u00fcstte" ge\u00e7i\u015f yap
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_vi.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_vi.properties
new file mode 100644
index 000000000..cb8f4843f
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_vi.properties
@@ -0,0 +1,21 @@
+#Vietnamese translation by Thang Nguyen
+
+SystemMenu.close = \u0110\u00f3ng
+SystemMenu.iconify = T\u1ed1i thi\u1ec3u
+SystemMenu.maximize = T\u1ed1i \u0111a
+SystemMenu.restore = Ph\u1ee5c h\u1ed3i
+SystemMenu.showHeapStatus = Hi\u1ec3n th\u1ecb thanh tr\u1ea1ng th\u00e1i
+SystemMenu.skins = B\u1ed9 m\u00e0u
+
+Tooltip.contentsNotSaved = N\u1ed9i dung ch\u01b0a \u0111\u01b0\u1ee3c l\u01b0u
+Tooltip.heapStatusPanel = Thanh tr\u1ea1ng th\u00e1i. Nh\u1ea5p chu\u1ed9t \u0111\u1ec3 d\u1ecdn d\u1eb9p b\u1ed9 nh\u1edb
+
+Xoetrope.brightness = \u0110\u1ed9 s\u00e1ng
+Xoetrope.cold = L\u1ea0NH
+Xoetrope.decimalRGB = RGB th\u1eadp ph\u00e2n
+Xoetrope.hue = M\u00e0u s\u1eafc
+Xoetrope.saturation = \u0110\u1ed9 s\u1eabm
+Xoetrope.warm = N\u00d3NG
+Xoetrope.webSafeColors = S\u1eed d\u1ee5ng m\u00e0u web
+
+SystemMenu.alwaysOnTop=Chuy\u1ec3n \u0111\u1ed5i "Lu\u00f4n \u1edf tr\u00ean c\u00f9ng"
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_CN.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_CN.properties
new file mode 100644
index 000000000..ff602a0d9
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_CN.properties
@@ -0,0 +1,145 @@
+# Chinese translation by Pprun and Qil Wong
+
+SystemMenu.close=\u5173\u95ed
+
+SystemMenu.iconify=\u6700\u5c0f\u5316
+
+SystemMenu.restore=\u6062\u590d
+
+SystemMenu.maximize=\u6700\u5927\u5316
+
+SystemMenu.showHeapStatus=\u663e\u793a\u5783\u573e\uff08GC\uff09\u5806\u72b6\u6001
+
+Tooltip.contentsNotSaved=\u5185\u5bb9\u672a\u4fdd\u5b58
+
+Tooltip.heapStatusPanel=\u5355\u51fb\u8fd0\u884c\u5783\u573e\u6536\u96c6
+
+Xoetrope.hue=\u8272\u8c03
+
+Xoetrope.brightness=\u4eae\u5ea6
+
+Xoetrope.saturation=\u9971\u548c\u5ea6
+
+Xoetrope.warm=\u6696\u8272\u8c03
+
+Xoetrope.cold=\u51b7\u8272\u8c03
+
+Xoetrope.decimalRGB=\u5341\u8fdb\u5236RGB
+
+Xoetrope.webSafeColors=\u4ec5\u4f7f\u7528WEB\u8272
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=\u6240\u6709\u6587\u4ef6
+
+FileChooser.cancelButtonMnemonic=67
+
+FileChooser.cancelButtonText=\u53d6\u6d88
+
+FileChooser.cancelButtonToolTipText=\u4e2d\u6b62\u6587\u4ef6\u9009\u62e9\u5668\u5bf9\u8bdd\u6846
+
+FileChooser.directoryDescriptionText=\u76ee\u5f55
+
+FileChooser.directoryOpenButtonMnemonic=79
+
+FileChooser.directoryOpenButtonText=\u6253\u5f00
+
+FileChooser.directoryOpenButtonToolTipText=\u6253\u5f00\u9009\u62e9\u7684\u76ee\u5f55
+
+FileChooser.fileDescriptionText=\u666e\u901a\u7684\u6587\u4ef6
+
+FileChooser.fileSizeGigaBytes={0} GB
+
+FileChooser.fileSizeKiloBytes={0} KB
+
+FileChooser.fileSizeMegaBytes={0} MB
+
+FileChooser.helpButtonMnemonic=72
+
+FileChooser.helpButtonText=\u5e2e\u52a9(H)
+
+FileChooser.helpButtonToolTipText=\u6587\u4ef6\u9009\u62e9\u5668\u5e2e\u52a9
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=\u521b\u5efa\u65b0\u7684\u6587\u4ef6\u5939\u65f6\u53d1\u751f\u9519\u8bef
+
+FileChooser.openButtonMnemonic=79
+
+FileChooser.openButtonText=\u6253\u5f00
+
+FileChooser.openButtonToolTipText=\u6253\u5f00\u9009\u62e9\u7684\u6587\u4ef6
+
+FileChooser.openDialogTitleText=\u6253\u5f00
+
+FileChooser.other.newFolder=\u65b0\u5efa\u6587\u4ef6\u5939
+
+FileChooser.other.newFolder.subsequent=\u65b0\u5efa\u6587\u4ef6\u5939.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=\u4fdd\u5b58
+
+FileChooser.saveButtonToolTipText=\u4fdd\u5b58\u9009\u62e9\u7684\u6587\u4ef6
+
+FileChooser.saveDialogTitleText=\u4fdd\u5b58
+
+FileChooser.updateButtonMnemonic=85
+
+FileChooser.updateButtonText=\u66f4\u65b0(U)
+
+FileChooser.updateButtonToolTipText=\u66f4\u65b0\u76ee\u5f55\u5217\u8868
+
+FileChooser.win32.newFolder=\u65b0\u5efa\u6587\u4ef6\u5939
+
+FileChooser.win32.newFolder.subsequent=\u65b0\u5efa\u6587\u4ef6\u5939 ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=\u8be6\u7ec6\u4fe1\u606f
+
+FileChooser.detailsViewButtonAccessibleName=\u8be6\u7ec6\u4fe1\u606f
+
+FileChooser.detailsViewButtonToolTipText=\u8be6\u7ec6\u4fe1\u606f
+
+FileChooser.fileAttrHeaderText=\u5c5e\u6027
+
+FileChooser.fileDateHeaderText=\u4fee\u6b63\u7248
+
+FileChooser.fileNameHeaderText=\u540d\u79f0
+
+FileChooser.fileNameLabelText=\u6587\u4ef6\u540d\uff1a
+
+FileChooser.fileSizeHeaderText=\u5927\u5c0f
+
+FileChooser.fileTypeHeaderText=\u7c7b\u578b
+
+FileChooser.filesOfTypeLabelText=\u6587\u4ef6\u7c7b\u578b\uff1a
+
+FileChooser.homeFolderAccessibleName=\u8d77\u59cb\u76ee\u5f55
+
+FileChooser.homeFolderToolTipText=\u8d77\u59cb\u76ee\u5f55
+
+FileChooser.listViewActionLabelText=\u5217\u8868
+
+FileChooser.listViewButtonAccessibleName=\u5217\u8868
+
+FileChooser.listViewButtonToolTipText=\u5217\u8868
+
+FileChooser.lookInLabelText=\u67e5\u770b\uff1a
+
+FileChooser.newFolderAccessibleName=\u65b0\u5efa\u6587\u4ef6\u5939
+
+FileChooser.newFolderActionLabelText=\u65b0\u5efa\u6587\u4ef6\u5939
+
+FileChooser.newFolderToolTipText=\u521b\u5efa\u65b0\u7684\u6587\u4ef6\u5939
+
+FileChooser.refreshActionLabelText=\u5237\u65b0
+
+FileChooser.saveInLabelText=\u4fdd\u5b58\uff1a
+
+FileChooser.upFolderAccessibleName=\u5411\u4e0a
+
+FileChooser.upFolderToolTipText=\u5411\u4e0a\u4e00\u5c42
+
+FileChooser.viewMenuLabelText=\u89c6\u56fe
+
+SystemMenu.alwaysOnTop=\u5207\u6362\u201c\u59cb\u7ec8\u5728\u6700\u4e0a\u5c42\u201d
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_HK.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_HK.properties
new file mode 100644
index 000000000..598a17294
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_HK.properties
@@ -0,0 +1,135 @@
+SystemMenu.showHeapStatus=\u986f\u793a\u5806\u7a4d\u72c0\u614b
+
+Tooltip.contentsNotSaved=\u5167\u5bb9\u672a\u5132\u5b58
+
+Tooltip.heapStatusPanel=\u5806\u7a4d\u72c0\u614b\uff0c\u9ede\u64ca\u4f86\u57f7\u884c\u5783\u573e\u56de\u6536
+
+Xoetrope.hue=\u8272\u5f69
+
+Xoetrope.brightness=\u5149\u6697
+
+Xoetrope.saturation=\u98fd\u548c\u5ea6
+
+Xoetrope.warm=\u6696\u8272
+
+Xoetrope.cold=\u51b7\u8272
+
+Xoetrope.decimalRGB=\u5341\u9032\u4f4d\u5236RGB
+
+Xoetrope.webSafeColors=\u4f7f\u7528\u7db2\u9801\u5b89\u5168\u8272
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=\u6240\u6709\u6a94\u6848
+
+FileChooser.cancelButtonMnemonic=67
+
+FileChooser.cancelButtonText=\u53d6\u6d88
+
+FileChooser.cancelButtonToolTipText=\u4e2d\u65b7\u300c\u6a94\u6848\u9078\u64c7\u5668\u300d\u5c0d\u8a71\u65b9\u584a
+
+FileChooser.directoryDescriptionText=\u76ee\u9304
+
+FileChooser.directoryOpenButtonMnemonic=79
+
+FileChooser.directoryOpenButtonText=\u958b\u555f
+
+FileChooser.directoryOpenButtonToolTipText=\u958b\u555f\u9078\u53d6\u7684\u76ee\u9304
+
+FileChooser.fileDescriptionText=\u4e00\u822c\u6a94\u6848
+
+FileChooser.fileSizeGigaBytes={0} GB
+
+FileChooser.fileSizeKiloBytes={0} KB
+
+FileChooser.fileSizeMegaBytes={0} MB
+
+FileChooser.helpButtonMnemonic=72
+
+FileChooser.helpButtonText=\u8aaa\u660e(H)
+
+FileChooser.helpButtonToolTipText=\u300c\u6a94\u6848\u9078\u64c7\u5668\u300d\u8aaa\u660e
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=\u5efa\u7acb\u65b0\u6a94\u6848\u593e\u6642\u767c\u751f\u932f\u8aa4
+
+FileChooser.openButtonMnemonic=79
+
+FileChooser.openButtonText=\u958b\u555f
+
+FileChooser.openButtonToolTipText=\u958b\u555f\u9078\u53d6\u7684\u6a94\u6848
+
+FileChooser.openDialogTitleText=\u958b\u555f
+
+FileChooser.other.newFolder=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.other.newFolder.subsequent=\u65b0\u8cc7\u6599\u593e.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=\u5132\u5b58
+
+FileChooser.saveButtonToolTipText=\u5132\u5b58\u9078\u53d6\u7684\u6a94\u6848
+
+FileChooser.saveDialogTitleText=\u5132\u5b58
+
+FileChooser.updateButtonMnemonic=85
+
+FileChooser.updateButtonText=\u66f4\u65b0(U)
+
+FileChooser.updateButtonToolTipText=\u66f4\u65b0\u76ee\u9304\u6e05\u55ae
+
+FileChooser.win32.newFolder=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.win32.newFolder.subsequent=\u65b0\u8cc7\u6599\u593e ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=\u8a73\u7d30\u8cc7\u8a0a
+
+FileChooser.detailsViewButtonAccessibleName=\u8a73\u7d30\u8cc7\u8a0a
+
+FileChooser.detailsViewButtonToolTipText=\u8a73\u7d30\u8cc7\u8a0a
+
+FileChooser.fileAttrHeaderText=\u5c6c\u6027
+
+FileChooser.fileDateHeaderText=\u5df2\u4fee\u6539
+
+FileChooser.fileNameHeaderText=\u540d\u7a31
+
+FileChooser.fileNameLabelText=\u6a94\u6848\u540d\u7a31\ufe55
+
+FileChooser.fileSizeHeaderText=\u5927\u5c0f
+
+FileChooser.fileTypeHeaderText=\u985e\u578b
+
+FileChooser.filesOfTypeLabelText=\u6a94\u6848\u985e\u578b\ufe55
+
+FileChooser.homeFolderAccessibleName=\u4e3b\u76ee\u9304
+
+FileChooser.homeFolderToolTipText=\u4e3b\u76ee\u9304
+
+FileChooser.listViewActionLabelText=\u6e05\u55ae
+
+FileChooser.listViewButtonAccessibleName=\u6e05\u55ae
+
+FileChooser.listViewButtonToolTipText=\u6e05\u55ae
+
+FileChooser.lookInLabelText=\u67e5\u770b\ufe55
+
+FileChooser.newFolderAccessibleName=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.newFolderActionLabelText=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.newFolderToolTipText=\u5efa\u7acb\u65b0\u8cc7\u6599\u593e
+
+FileChooser.refreshActionLabelText=\u66f4\u65b0
+
+FileChooser.saveInLabelText=\u5132\u5b58\u65bc\uff1a
+
+FileChooser.upFolderAccessibleName=\u5f80\u4e0a
+
+FileChooser.upFolderToolTipText=\u5f80\u4e0a\u4e00\u5c64
+
+FileChooser.viewMenuLabelText=\u6aa2\u8996
+
+SystemMenu.alwaysOnTop=\u5207\u63db\u300c\u6c38\u9060\u7f6e\u9802\u300d
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_TW.properties b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_TW.properties
new file mode 100644
index 000000000..47d245c8b
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_TW.properties
@@ -0,0 +1,135 @@
+SystemMenu.showHeapStatus=\u986f\u793a\u5806\u7a4d\u72c0\u614b
+
+Tooltip.contentsNotSaved=\u5167\u5bb9\u672a\u5132\u5b58
+
+Tooltip.heapStatusPanel=\u5c0d\u6a5f\u72c0\u614b\u3002\u9ede\u9078\u672c\u7d10\u57f7\u884c\u5ee2\u6599\u6536\u96c6\u5668\u3002
+
+Xoetrope.hue=\u8272\u8abf
+
+Xoetrope.brightness=\u4eae\u5ea6
+
+Xoetrope.saturation=\u98fd\u548c\u5ea6
+
+Xoetrope.warm=\u6eab\u6696
+
+Xoetrope.cold=\u5bd2\u51b7
+
+Xoetrope.decimalRGB=RGB \u503c
+
+Xoetrope.webSafeColors=\u4f7f\u7528\u9069\u65bc\u7db2\u969b\u7db2\u8def\u7684\u984f\u8272
+
+# File chooser strings from com.sun.swing.internal.plaf.basic.resources.basic
+FileChooser.acceptAllFileFilterText=\u6240\u6709\u6a94\u6848
+
+FileChooser.cancelButtonMnemonic=67
+
+FileChooser.cancelButtonText=\u53d6\u6d88
+
+FileChooser.cancelButtonToolTipText=\u4e2d\u65b7\u300c\u6a94\u6848\u9078\u64c7\u5668\u300d\u5c0d\u8a71\u65b9\u584a
+
+FileChooser.directoryDescriptionText=\u76ee\u9304
+
+FileChooser.directoryOpenButtonMnemonic=79
+
+FileChooser.directoryOpenButtonText=\u958b\u555f
+
+FileChooser.directoryOpenButtonToolTipText=\u958b\u555f\u9078\u53d6\u7684\u76ee\u9304
+
+FileChooser.fileDescriptionText=\u4e00\u822c\u6a94\u6848
+
+FileChooser.fileSizeGigaBytes={0} GB
+
+FileChooser.fileSizeKiloBytes={0} KB
+
+FileChooser.fileSizeMegaBytes={0} MB
+
+FileChooser.helpButtonMnemonic=72
+
+FileChooser.helpButtonText=\u8aaa\u660e(H)
+
+FileChooser.helpButtonToolTipText=\u300c\u6a94\u6848\u9078\u64c7\u5668\u300d\u8aaa\u660e
+
+FileChooser.newFolderErrorSeparator=:
+
+FileChooser.newFolderErrorText=\u5efa\u7acb\u65b0\u6a94\u6848\u593e\u6642\u767c\u751f\u932f\u8aa4
+
+FileChooser.openButtonMnemonic=79
+
+FileChooser.openButtonText=\u958b\u555f
+
+FileChooser.openButtonToolTipText=\u958b\u555f\u9078\u53d6\u7684\u6a94\u6848
+
+FileChooser.openDialogTitleText=\u958b\u555f
+
+FileChooser.other.newFolder=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.other.newFolder.subsequent=\u65b0\u8cc7\u6599\u593e.{0}
+
+FileChooser.saveButtonMnemonic=83
+
+FileChooser.saveButtonText=\u5132\u5b58
+
+FileChooser.saveButtonToolTipText=\u5132\u5b58\u9078\u53d6\u7684\u6a94\u6848
+
+FileChooser.saveDialogTitleText=\u5132\u5b58
+
+FileChooser.updateButtonMnemonic=85
+
+FileChooser.updateButtonText=\u66f4\u65b0(U)
+
+FileChooser.updateButtonToolTipText=\u66f4\u65b0\u76ee\u9304\u6e05\u55ae
+
+FileChooser.win32.newFolder=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.win32.newFolder.subsequent=\u65b0\u8cc7\u6599\u593e ({0})
+
+# File chooser strings from com.sun.swing.internal.plaf.metal.resources.metal
+FileChooser.detailsViewActionLabelText=\u8a73\u7d30\u8cc7\u8a0a
+
+FileChooser.detailsViewButtonAccessibleName=\u8a73\u7d30\u8cc7\u8a0a
+
+FileChooser.detailsViewButtonToolTipText=\u8a73\u7d30\u8cc7\u8a0a
+
+FileChooser.fileAttrHeaderText=\u5c6c\u6027
+
+FileChooser.fileDateHeaderText=\u5df2\u4fee\u6539
+
+FileChooser.fileNameHeaderText=\u540d\u7a31
+
+FileChooser.fileNameLabelText=\u6a94\u6848\u540d\u7a31\ufe55
+
+FileChooser.fileSizeHeaderText=\u5927\u5c0f
+
+FileChooser.fileTypeHeaderText=\u985e\u578b
+
+FileChooser.filesOfTypeLabelText=\u6a94\u6848\u985e\u578b\ufe55
+
+FileChooser.homeFolderAccessibleName=\u4e3b\u76ee\u9304
+
+FileChooser.homeFolderToolTipText=\u4e3b\u76ee\u9304
+
+FileChooser.listViewActionLabelText=\u6e05\u55ae
+
+FileChooser.listViewButtonAccessibleName=\u6e05\u55ae
+
+FileChooser.listViewButtonToolTipText=\u6e05\u55ae
+
+FileChooser.lookInLabelText=\u67e5\u770b\ufe55
+
+FileChooser.newFolderAccessibleName=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.newFolderActionLabelText=\u65b0\u8cc7\u6599\u593e
+
+FileChooser.newFolderToolTipText=\u5efa\u7acb\u65b0\u8cc7\u6599\u593e
+
+FileChooser.refreshActionLabelText=\u66f4\u65b0
+
+FileChooser.saveInLabelText=\u5132\u5b58\u65bc\uff1a
+
+FileChooser.upFolderAccessibleName=\u5f80\u4e0a
+
+FileChooser.upFolderToolTipText=\u5f80\u4e0a\u4e00\u5c64
+
+FileChooser.viewMenuLabelText=\u6aa2\u8996
+
+SystemMenu.alwaysOnTop=\u5207\u63db\u300c\u6c38\u9060\u5728\u6700\u4e0a\u5c64\u300d
diff --git a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java
new file mode 100644
index 000000000..ee7812586
--- /dev/null
+++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java
@@ -0,0 +1,2034 @@
+/*
+ * Copyright (c) 2005-2010 Substance Kirill Grouchnikov. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Substance Kirill Grouchnikov nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.pushingpixels.substance.internal.utils;
+
+import java.awt.AlphaComposite;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Container;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.LayoutManager;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.awt.geom.Ellipse2D;
+import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Formatter;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+
+import javax.swing.AbstractAction;
+import javax.swing.AbstractButton;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JRootPane;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.UIResource;
+
+import org.pushingpixels.lafwidget.animation.effects.GhostPaintingUtils;
+import org.pushingpixels.lafwidget.utils.RenderingUtils;
+import org.pushingpixels.lafwidget.utils.TrackableThread;
+import org.pushingpixels.substance.api.DecorationAreaType;
+import org.pushingpixels.substance.api.SubstanceColorScheme;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
+import org.pushingpixels.substance.api.SubstanceSkin;
+import org.pushingpixels.substance.api.SubstanceConstants.SubstanceWidgetType;
+import org.pushingpixels.substance.api.skin.SkinInfo;
+import org.pushingpixels.substance.internal.painter.BackgroundPaintingUtils;
+import org.pushingpixels.substance.internal.ui.SubstanceButtonUI;
+import org.pushingpixels.substance.internal.ui.SubstanceRootPaneUI;
+import org.pushingpixels.substance.internal.utils.filters.NegatedFilter;
+import org.pushingpixels.substance.internal.utils.icon.SubstanceIconFactory;
+import org.pushingpixels.substance.internal.utils.icon.TransitionAwareIcon;
+
+/**
+ * Title pane for Substance look and feel.
+ *
+ * @author Kirill Grouchnikov
+ */
+public class SubstanceTitlePane extends JComponent {
+ /**
+ * PropertyChangeListener added to the JRootPane.
+ */
+ private PropertyChangeListener propertyChangeListener;
+
+ /**
+ * JMenuBar, typically renders the system menu items.
+ */
+ protected JMenuBar menuBar;
+
+ /**
+ * Action used to close the Window.
+ */
+ private Action closeAction;
+
+ /**
+ * Action used to iconify the Frame.
+ */
+ private Action iconifyAction;
+
+ /**
+ * Action to restore the Frame size.
+ */
+ private Action restoreAction;
+
+ /**
+ * Action to restore the Frame size.
+ */
+ private Action maximizeAction;
+
+ /**
+ * Action to set frame as Always on top.
+ */
+ private Action alwaysOnTopAction;
+
+ /**
+ * Button used to maximize or restore the frame.
+ */
+ protected JButton toggleButton;
+
+ /**
+ * Button used to set always on top
+ */
+ protected JButton alwaysOnTopButton;
+
+ /**
+ * Button used to minimize the frame
+ */
+ protected JButton minimizeButton;
+
+ /**
+ * Button used to close the frame.
+ */
+ protected JButton closeButton;
+
+ /**
+ * Listens for changes in the state of the Window listener to update the
+ * state of the widgets.
+ */
+ private WindowListener windowListener;
+
+ /**
+ * Window we're currently in.
+ */
+ protected Window window;
+
+ /**
+ * JRootPane rendering for.
+ */
+ protected JRootPane rootPane;
+
+ /**
+ * Buffered Frame.state property. As state isn't bound, this is kept to
+ * determine when to avoid updating widgets.
+ */
+ private int state;
+
+ /**
+ * SubstanceRootPaneUI that created us.
+ */
+ private SubstanceRootPaneUI rootPaneUI;
+
+ /**
+ * The logfile name for the heap status panel. Can be null - in
+ * this case the {@link HeapStatusThread} will not write heap information.
+ */
+ private static String heapStatusLogfileName;
+
+ /**
+ * The heap status panel of this title pane.
+ */
+ protected HeapStatusPanel heapStatusPanel;
+
+ /**
+ * The heap status toggle menu item of this title pane.
+ */
+ protected JCheckBoxMenuItem heapStatusMenuItem;
+
+ /**
+ * Listens on changes to componentOrientation and
+ * {@link SubstanceLookAndFeel#WINDOW_MODIFIED} properties.
+ */
+ protected PropertyChangeListener propertyListener;
+
+ /**
+ * Client property to mark every child to be either leading or trailing. The
+ * value must be one of {@link ExtraComponentKind}.
+ *
+ * @see #markExtraComponent(JComponent, ExtraComponentKind)
+ * @see #getTitleTextRectangle()
+ */
+ protected static final String EXTRA_COMPONENT_KIND = "substancelaf.internal.titlePane.extraComponentKind";
+
+ /**
+ * The application icon to be displayed.
+ */
+ protected Image appIcon;
+
+ /**
+ * Enumerates the types of children components.
+ *
+ * @author Kirill Grouchnikov
+ */
+ protected enum ExtraComponentKind {
+ /**
+ * Leading child components (left on LTR and right on RTL).
+ */
+ LEADING,
+
+ /**
+ * Trailing child components (right on LTR and left on RTL).
+ */
+ TRAILING
+ }
+
+ /**
+ * Panel that shows heap status and allows running the garbage collector.
+ *
+ * @author Kirill Grouchnikov
+ */
+ public static class HeapStatusPanel extends JPanel {
+ /**
+ * The current heap size in kilobytes.
+ */
+ private int currHeapSizeKB;
+
+ /**
+ * The current used portion of heap in kilobytes.
+ */
+ private int currTakenHeapSizeKB;
+
+ /**
+ * History of used heap portion (in percents). Each value is in 0.0-1.0
+ * range.
+ */
+ private LinkedList graphValues;
+
+ /**
+ * Creates new heap status panel.
+ */
+ public HeapStatusPanel() {
+ this.graphValues = new LinkedList();
+ HeapStatusThread.getInstance();
+ }
+
+ /**
+ * Updates the values for this heap status panel.
+ *
+ * @param currHeapSizeKB
+ * The current heap size in kilobytes.
+ * @param currTakenHeapSizeKB
+ * The current used portion of heap in kilobytes.
+ */
+ public synchronized void updateStatus(int currHeapSizeKB,
+ int currTakenHeapSizeKB) {
+ this.currHeapSizeKB = currHeapSizeKB;
+ this.currTakenHeapSizeKB = currTakenHeapSizeKB;
+ double newGraphValue = (double) currTakenHeapSizeKB
+ / (double) currHeapSizeKB;
+ this.graphValues.addLast(newGraphValue);
+ this.repaint();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.swing.JComponent#paint(java.awt.Graphics)
+ */
+ @Override
+ public synchronized void paint(Graphics g) {
+ Graphics2D graphics = (Graphics2D) g.create();
+
+ SubstanceColorScheme scheme = SubstanceCoreUtilities.getSkin(this)
+ .getActiveColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE);
+
+ graphics.setColor(scheme.getDarkColor());
+ int w = this.getWidth();
+ int h = this.getHeight();
+
+ graphics.drawRect(0, 0, w - 1, h - 1);
+
+ graphics.setColor(scheme.getExtraLightColor());
+ graphics.fillRect(1, 1, w - 2, h - 2);
+
+ while (this.graphValues.size() > (w - 2))
+ this.graphValues.removeFirst();
+
+ int xOff = w - this.graphValues.size() - 1;
+ graphics.setColor(scheme.getMidColor());
+ int count = 0;
+ for (double value : this.graphValues) {
+ int valueH = (int) (value * (h - 2));
+ graphics.drawLine(xOff + count, h - 1 - valueH, xOff + count,
+ h - 2);
+ count++;
+ }
+
+ graphics.setFont(UIManager.getFont("Panel.font"));
+ FontMetrics fm = graphics.getFontMetrics();
+
+ StringBuffer longFormat = new StringBuffer();
+ Formatter longFormatter = new Formatter(longFormat);
+ longFormatter.format("%.1fMB / %.1fMB",
+ this.currTakenHeapSizeKB / 1024.f,
+ this.currHeapSizeKB / 1024.f);
+ int strW = fm.stringWidth(longFormat.toString());
+ int strH = fm.getAscent() + fm.getDescent();
+
+ graphics.setColor(scheme.getForegroundColor());
+ RenderingUtils.installDesktopHints(graphics, this);
+ if (strW < (w - 5)) {
+ graphics.drawString(longFormat.toString(), (w - strW) / 2,
+ (h + strH) / 2 - 2);
+ } else {
+ String shortFormat = (this.currTakenHeapSizeKB / 1024)
+ + "MB / " + (this.currHeapSizeKB / 1024) + "MB";
+ strW = fm.stringWidth(shortFormat);
+ graphics.drawString(shortFormat, (w - strW) / 2,
+ (h + strH) / 2 - 2);
+ }
+
+ graphics.dispose();
+ }
+
+ /**
+ * Returns the preferred width of this panel.
+ *
+ * @return Preferred width of this panel.
+ */
+ public int getPreferredWidth() {
+ BufferedImage dummy = new BufferedImage(1, 1,
+ BufferedImage.TYPE_INT_ARGB);
+ Graphics2D g2d = dummy.createGraphics();
+ RenderingUtils.installDesktopHints(g2d, this);
+ g2d.setFont(UIManager.getFont("Panel.font"));
+ FontMetrics fm = g2d.getFontMetrics();
+ int result = fm.stringWidth("100.9MB / 200.9MB");
+ g2d.dispose();
+ return result;
+ }
+ }
+
+ /**
+ * Thread for heap status panel.
+ */
+ public static class HeapStatusThread extends TrackableThread {
+ /**
+ * Current heap size in kilobytes.
+ */
+ private int heapSizeKB;
+
+ /**
+ * Current used portion of heap in kilobytes.
+ */
+ private int takenHeapSizeKB;
+
+ /**
+ * All heap status panels.
+ */
+ private static Set> panels = new HashSet>();
+
+ /**
+ * Single instance of this thread.
+ */
+ private static HeapStatusThread instance;
+
+ /**
+ * Formatter object (for logfile).
+ */
+ private SimpleDateFormat format;
+
+ /**
+ * Signifies whether a stop request has been issued on this
+ * thread using the {@link #requestStop()} call.
+ */
+ private boolean isStopRequested;
+
+ /**
+ * Simple constructor. Defined private for singleton.
+ *
+ * @see #getInstance()
+ */
+ private HeapStatusThread() {
+ this.format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS");
+ this.isStopRequested = false;
+ this.setName("Substance heap status");
+ }
+
+ /**
+ * Gets singleton instance of this thread.
+ *
+ * @return Singleton instance of this thread.
+ */
+ public synchronized static HeapStatusThread getInstance() {
+ if (HeapStatusThread.instance == null) {
+ HeapStatusThread.instance = new HeapStatusThread();
+ HeapStatusThread.instance.start();
+ }
+ return HeapStatusThread.instance;
+ }
+
+ /**
+ * Registers new heap status panel with this thread.
+ *
+ * @param panel
+ * Heap statuc panel.
+ */
+ public static synchronized void registerPanel(HeapStatusPanel panel) {
+ panels.add(new WeakReference(panel));
+ }
+
+ /**
+ * Unregisters new heap status panel from this thread.
+ *
+ * @param panel
+ * Heap statuc panel.
+ */
+ public static synchronized void unregisterPanel(HeapStatusPanel panel) {
+ for (Iterator> it = panels
+ .iterator(); it.hasNext();) {
+ WeakReference ref = it.next();
+ HeapStatusPanel currPanel = ref.get();
+ if (panel == currPanel) {
+ it.remove();
+ return;
+ }
+ }
+ }
+
+ /**
+ * Updates the values of heap status.
+ */
+ private synchronized void updateHeapCounts() {
+ long heapSize = Runtime.getRuntime().totalMemory();
+ long heapFreeSize = Runtime.getRuntime().freeMemory();
+
+ this.heapSizeKB = (int) (heapSize / 1024);
+ this.takenHeapSizeKB = (int) ((heapSize - heapFreeSize) / 1024);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Thread#run()
+ */
+ @Override
+ public void run() {
+ while (!this.isStopRequested) {
+ try {
+ // update every 0.5 seconds
+ Thread.sleep(500);
+ } catch (InterruptedException ie) {
+ }
+ if (!SubstanceWidgetManager.getInstance().isAllowedAnywhere(
+ SubstanceWidgetType.TITLE_PANE_HEAP_STATUS))
+ continue;
+ this.updateHeapCounts();
+ for (Iterator> it = panels
+ .iterator(); it.hasNext();) {
+ WeakReference refPanel = it.next();
+ HeapStatusPanel panel = refPanel.get();
+ if (panel == null) {
+ // prune
+ it.remove();
+ continue;
+ }
+
+ panel.updateStatus(this.heapSizeKB, this.takenHeapSizeKB);
+ }
+ // see if need to put info in log file
+ if (SubstanceTitlePane.heapStatusLogfileName != null) {
+ PrintWriter pw = null;
+ try {
+ pw = new PrintWriter(new FileWriter(
+ SubstanceTitlePane.heapStatusLogfileName, true));
+ pw.println(this.format.format(new Date()) + " "
+ + this.takenHeapSizeKB + "KB / "
+ + this.heapSizeKB + "KB");
+ } catch (IOException ioe) {
+
+ } finally {
+ if (pw != null) {
+ pw.close();
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void requestStop() {
+ this.isStopRequested = true;
+ HeapStatusThread.instance = null;
+ }
+ }
+
+ /**
+ * Creates a new title pane.
+ *
+ * @param root
+ * Root pane.
+ * @param ui
+ * Root pane UI.
+ */
+ public SubstanceTitlePane(JRootPane root, SubstanceRootPaneUI ui) {
+ this.rootPane = root;
+ this.rootPaneUI = ui;
+
+ this.state = -1;
+
+ this.installSubcomponents();
+ this.installDefaults();
+
+ this.setLayout(this.createLayout());
+
+ this.setToolTipText(this.getTitle());
+
+ SubstanceLookAndFeel.setDecorationType(this,
+ DecorationAreaType.PRIMARY_TITLE_PANE);
+ this.setForeground(SubstanceColorUtilities
+ .getForegroundColor(SubstanceCoreUtilities.getSkin(this)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE)));
+ // SubstanceColorSchemeUtilities
+ // .getColorScheme(this, ComponentState.ACTIVE)));
+ }
+
+ /**
+ * Uninstalls the necessary state.
+ */
+ public void uninstall() {
+ this.uninstallListeners();
+ this.window = null;
+
+ HeapStatusThread.unregisterPanel(this.heapStatusPanel);
+
+ // Swing bug (?) - the updateComponentTree never gets to the
+ // system menu (and in our case we have radio menu items with
+ // rollover listeners). Fix for defect 109 - memory leak on skin
+ // switch
+ if ((this.menuBar != null) && (this.menuBar.getMenuCount() > 0)) {
+ this.menuBar.getUI().uninstallUI(this.menuBar);
+ SubstanceCoreUtilities.uninstallMenu(this.menuBar.getMenu(0));
+ }
+
+ if (this.heapStatusPanel != null) {
+ for (MouseListener listener : this.heapStatusPanel
+ .getMouseListeners())
+ this.heapStatusPanel.removeMouseListener(listener);
+ HeapStatusThread.unregisterPanel(this.heapStatusPanel);
+ this.remove(this.heapStatusPanel);
+ }
+
+ if (this.menuBar != null)
+ this.menuBar.removeAll();
+ this.removeAll();
+ }
+
+ /**
+ * Installs the necessary listeners.
+ */
+ private void installListeners() {
+ if (this.window != null) {
+ this.windowListener = new WindowHandler();
+ this.window.addWindowListener(this.windowListener);
+ this.propertyChangeListener = new PropertyChangeHandler();
+ this.window.addPropertyChangeListener(this.propertyChangeListener);
+ }
+
+ // Property change listener for pulsating close button
+ // when window has been marked as changed.
+ // Fix for defect 109 - memory leak on skin change.
+ this.propertyListener = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(final PropertyChangeEvent evt) {
+ if (SubstanceLookAndFeel.WINDOW_MODIFIED.equals(evt
+ .getPropertyName())) {
+ syncCloseButtonTooltip();
+ // if (Boolean.TRUE.equals(evt.getNewValue())) {
+ // SubstanceTitlePane.this.closeButton
+ // .setToolTipText(SubstanceLookAndFeel
+ // .getLabelBundle().getString(
+ // "SystemMenu.close")
+ // + " ["
+ // + SubstanceLookAndFeel
+ // .getLabelBundle()
+ // .getString(
+ // "Tooltip.contentsNotSaved")
+ // + "]");
+ // } else {
+ // SubstanceTitlePane.this.closeButton
+ // .setToolTipText(SubstanceLookAndFeel
+ // .getLabelBundle().getString(
+ // "SystemMenu.close"));
+ // }
+ // SubstanceTitlePane.this.closeButton.repaint();
+ }
+
+ if ("componentOrientation".equals(evt.getPropertyName())) {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ if (SubstanceTitlePane.this.menuBar != null) {
+ SubstanceTitlePane.this.menuBar
+ .applyComponentOrientation((ComponentOrientation) evt
+ .getNewValue());
+ }
+ }
+ });
+ }
+ }
+ };
+ // Wire it on the frame itself and its root pane.
+ this.rootPane.addPropertyChangeListener(this.propertyListener);
+ if (this.getFrame() != null)
+ this.getFrame().addPropertyChangeListener(this.propertyListener);
+ }
+
+ /**
+ * Uninstalls the necessary listeners.
+ */
+ private void uninstallListeners() {
+ if (this.window != null) {
+ this.window.removeWindowListener(this.windowListener);
+ this.windowListener = null;
+ this.window
+ .removePropertyChangeListener(this.propertyChangeListener);
+ this.propertyChangeListener = null;
+ }
+
+ // Fix for defect 109 - memory leak on skin change.
+ this.rootPane.removePropertyChangeListener(this.propertyListener);
+ if (this.getFrame() != null)
+ this.getFrame().removePropertyChangeListener(this.propertyListener);
+ this.propertyListener = null;
+
+ }
+
+ /**
+ * Returns the JRootPane this was created for.
+ */
+ @Override
+ public JRootPane getRootPane() {
+ return this.rootPane;
+ }
+
+ /**
+ * Returns the decoration style of the JRootPane.
+ *
+ * @return Decoration style of the JRootPane.
+ */
+ protected int getWindowDecorationStyle() {
+ return this.getRootPane().getWindowDecorationStyle();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.Component#addNotify()
+ */
+ @Override
+ public void addNotify() {
+ super.addNotify();
+
+ this.uninstallListeners();
+
+ this.window = SwingUtilities.getWindowAncestor(this);
+ if (this.window != null) {
+ this.setActive(this.window.isActive());
+ if (this.window instanceof Frame) {
+ this.setState(((Frame) this.window).getExtendedState());
+ } else {
+ this.setState(0);
+ }
+ if (this.getComponentCount() == 0) {
+ // fix for issue 385 - add the sub-components uninstalled
+ // in the removeNotify. This happens when a decorated
+ // dialog has been disposed and then reshown.
+ this.installSubcomponents();
+ }
+ this.installListeners();
+ }
+ this.setToolTipText(this.getTitle());
+ this.updateAppIcon();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.Component#removeNotify()
+ */
+ @Override
+ public void removeNotify() {
+ super.removeNotify();
+
+ this.uninstall();
+ this.window = null;
+ }
+
+ /**
+ * Adds any sub-Components contained in the SubstanceTitlePane.
+ */
+ private void installSubcomponents() {
+ int decorationStyle = this.getWindowDecorationStyle();
+ if (decorationStyle == JRootPane.FRAME) {
+ this.createActions();
+ this.menuBar = this.createMenuBar();
+ if (this.menuBar != null) {
+ this.add(this.menuBar);
+ }
+ this.createButtons();
+ this.add(this.alwaysOnTopButton);
+ this.add(this.minimizeButton);
+ this.add(this.toggleButton);
+ this.add(this.closeButton);
+
+ this.heapStatusPanel = new HeapStatusPanel();
+ this.markExtraComponent(this.heapStatusPanel,
+ ExtraComponentKind.TRAILING);
+ this.add(this.heapStatusPanel);
+ boolean isHeapStatusPanelShowing = SubstanceWidgetManager
+ .getInstance().isAllowed(rootPane,
+ SubstanceWidgetType.TITLE_PANE_HEAP_STATUS);
+ this.heapStatusPanel.setVisible(isHeapStatusPanelShowing);
+ this.heapStatusPanel.setPreferredSize(new Dimension(80, this
+ .getPreferredSize().height));
+ this.heapStatusPanel.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane).getString(
+ "Tooltip.heapStatusPanel"));
+ this.heapStatusPanel.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ System.gc();
+ }
+ });
+
+ HeapStatusThread.registerPanel(this.heapStatusPanel);
+ } else {
+ if ((decorationStyle == JRootPane.PLAIN_DIALOG)
+ || (decorationStyle == JRootPane.INFORMATION_DIALOG)
+ || (decorationStyle == JRootPane.ERROR_DIALOG)
+ || (decorationStyle == JRootPane.COLOR_CHOOSER_DIALOG)
+ || (decorationStyle == JRootPane.FILE_CHOOSER_DIALOG)
+ || (decorationStyle == JRootPane.QUESTION_DIALOG)
+ || (decorationStyle == JRootPane.WARNING_DIALOG)) {
+ this.createActions();
+ this.createButtons();
+ this.add(this.closeButton);
+ }
+ }
+ }
+
+ /**
+ * Installs the fonts and necessary properties.
+ */
+ private void installDefaults() {
+ this.setFont(UIManager.getFont("InternalFrame.titleFont", this
+ .getLocale()));
+ }
+
+ /**
+ * Returns the JMenuBar displaying the appropriate system menu
+ * items.
+ *
+ * @return JMenuBar displaying the appropriate system menu
+ * items.
+ */
+ protected JMenuBar createMenuBar() {
+ this.menuBar = new SubstanceMenuBar();
+ this.menuBar.setFocusable(false);
+ this.menuBar.setBorderPainted(true);
+ this.menuBar.add(this.createMenu());
+ this.menuBar.setOpaque(false);
+ // support for RTL
+ this.menuBar.applyComponentOrientation(this.rootPane
+ .getComponentOrientation());
+
+ this.markExtraComponent(this.menuBar, ExtraComponentKind.LEADING);
+
+ return this.menuBar;
+ }
+
+ /**
+ * Create the Actions that get associated with the buttons and
+ * menu items.
+ */
+ private void createActions() {
+ this.closeAction = new CloseAction();
+ if (this.getWindowDecorationStyle() == JRootPane.FRAME) {
+ this.alwaysOnTopAction = new AlwaysOnTopAction();
+ this.iconifyAction = new IconifyAction();
+ this.restoreAction = new RestoreAction();
+ this.maximizeAction = new MaximizeAction();
+ }
+ }
+
+ /**
+ * Returns the JMenu displaying the appropriate menu items for
+ * manipulating the Frame.
+ *
+ * @return JMenu displaying the appropriate menu items for
+ * manipulating the Frame.
+ */
+ private JMenu createMenu() {
+ JMenu menu = new JMenu("");
+ menu.setOpaque(false);
+ menu.setBackground(null);
+ if (this.getWindowDecorationStyle() == JRootPane.FRAME) {
+ this.addMenuItems(menu);
+ }
+ return menu;
+ }
+
+ /**
+ * Adds the necessary JMenuItems to the specified menu.
+ *
+ * @param menu
+ * Menu.
+ */
+ private void addMenuItems(JMenu menu) {
+ menu.add(this.alwaysOnTopAction);
+ menu.add(this.restoreAction);
+
+ menu.add(this.iconifyAction);
+
+ if (Toolkit.getDefaultToolkit().isFrameStateSupported(
+ Frame.MAXIMIZED_BOTH)) {
+ menu.add(this.maximizeAction);
+ }
+
+ if (SubstanceCoreUtilities.toShowExtraWidgets(rootPane)) {
+ menu.addSeparator();
+ JMenu skinMenu = new JMenu(SubstanceCoreUtilities
+ .getResourceBundle(rootPane).getString("SystemMenu.skins"));
+ Map allSkins = SubstanceLookAndFeel.getAllSkins();
+ for (Map.Entry skinEntry : allSkins.entrySet()) {
+ final String skinClassName = skinEntry.getValue()
+ .getClassName();
+ JMenuItem jmiSkin = new JMenuItem(skinEntry.getKey());
+ jmiSkin.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ SubstanceLookAndFeel.setSkin(skinClassName);
+ }
+ });
+ }
+ });
+
+ skinMenu.add(jmiSkin);
+ }
+ menu.add(skinMenu);
+ }
+
+ menu.addSeparator();
+
+ menu.add(this.closeAction);
+ }
+
+ /**
+ * Returns a JButton appropriate for placement on the
+ * TitlePane.
+ *
+ * @return Title button.
+ */
+ private JButton createTitleButton() {
+ JButton button = new SubstanceTitleButton();
+
+ button.setFocusPainted(false);
+ button.setFocusable(false);
+ button.setOpaque(true);
+
+ this.markExtraComponent(button, ExtraComponentKind.TRAILING);
+
+ return button;
+ }
+
+ /**
+ * Creates the Buttons that will be placed on the TitlePane.
+ */
+ private void createButtons() {
+ this.closeButton = this.createTitleButton();
+ this.closeButton.setAction(this.closeAction);
+ this.closeButton.setText(null);
+ this.closeButton.setBorder(null);
+ // this.closeButton.setToolTipText(SubstanceLookAndFeel
+ // .getLabelBundle().getString(
+ // "SystemMenu.close"));
+
+ Icon closeIcon = new TransitionAwareIcon(closeButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(SubstanceColorScheme scheme) {
+ return SubstanceIconFactory
+ .getTitlePaneIcon(
+ SubstanceIconFactory.IconKind.CLOSE,
+ scheme,
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE));
+ }
+ }, "substance.titlePane.closeIcon");
+ this.closeButton.setIcon(closeIcon);
+
+ this.closeButton.setFocusable(false);
+ this.closeButton.putClientProperty(SubstanceLookAndFeel.FLAT_PROPERTY,
+ Boolean.TRUE);
+
+ this.closeButton.putClientProperty(
+ SubstanceButtonUI.IS_TITLE_CLOSE_BUTTON, Boolean.TRUE);
+
+ if (this.getWindowDecorationStyle() == JRootPane.FRAME) {
+ this.alwaysOnTopButton = this.createTitleButton();
+ this.alwaysOnTopButton.setAction(this.alwaysOnTopAction);
+ this.alwaysOnTopButton.setText(null);
+ this.alwaysOnTopButton.setBorder(null);
+
+ Icon alwaysOnTopIcon = new TransitionAwareIcon(this.alwaysOnTopButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return getAlwaysOnTopIcon(scheme,
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ false);
+ }
+ }, "substance.titlePane.alwaysOnTopIcon");
+ this.alwaysOnTopButton.setIcon(alwaysOnTopIcon);
+
+ this.alwaysOnTopButton.setFocusable(false);
+ this.alwaysOnTopButton.putClientProperty(
+ SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE);
+ this.alwaysOnTopButton.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane)
+ .getString("SystemMenu.alwaysOnTop"));
+
+
+ this.minimizeButton = this.createTitleButton();
+ this.minimizeButton.setAction(this.iconifyAction);
+ this.minimizeButton.setText(null);
+ this.minimizeButton.setBorder(null);
+
+ Icon minIcon = new TransitionAwareIcon(this.minimizeButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return SubstanceIconFactory
+ .getTitlePaneIcon(
+ SubstanceIconFactory.IconKind.MINIMIZE,
+ scheme,
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE));
+ }
+ }, "substance.titlePane.minIcon");
+ this.minimizeButton.setIcon(minIcon);
+
+ this.minimizeButton.setFocusable(false);
+ this.minimizeButton.putClientProperty(
+ SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE);
+ this.minimizeButton.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane)
+ .getString("SystemMenu.iconify"));
+
+ this.toggleButton = this.createTitleButton();
+ this.toggleButton.setAction(this.restoreAction);
+ this.toggleButton.setBorder(null);
+ this.toggleButton.setText(null);
+
+ Icon maxIcon = new TransitionAwareIcon(this.toggleButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return SubstanceIconFactory
+ .getTitlePaneIcon(
+ SubstanceIconFactory.IconKind.MAXIMIZE,
+ scheme,
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE));
+ }
+ }, "substance.titlePane.maxIcon");
+ this.toggleButton.setIcon(maxIcon);
+
+ this.toggleButton.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane).getString(
+ "SystemMenu.maximize"));
+ this.toggleButton.setFocusable(false);
+ this.toggleButton.putClientProperty(
+ SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE);
+
+ }
+ syncCloseButtonTooltip();
+ }
+
+ /**
+ * Returns the LayoutManager that should be installed on the
+ * SubstanceTitlePane.
+ *
+ * @return Layout manager.
+ */
+ protected LayoutManager createLayout() {
+ return new TitlePaneLayout();
+ }
+
+ /**
+ * Updates state dependant upon the Window's active state.
+ *
+ * @param isActive
+ * if true, the window is in active state.
+ */
+ private void setActive(boolean isActive) {
+ this.getRootPane().repaint();
+ }
+
+ /**
+ * Sets the state of the Window.
+ *
+ * @param state
+ * Window state.
+ */
+ private void setState(int state) {
+ this.setState(state, false);
+ }
+
+ /**
+ * Sets the state of the window. If updateRegardless is true
+ * and the state has not changed, this will update anyway.
+ *
+ * @param state
+ * Window state.
+ * @param updateRegardless
+ * if true, the update is done in any case.
+ */
+ private void setState(int state, boolean updateRegardless) {
+ Window w = this.getWindow();
+
+ if ((w != null) && (this.getWindowDecorationStyle() == JRootPane.FRAME)) {
+ if ((this.state == state) && !updateRegardless) {
+ return;
+ }
+ Frame frame = this.getFrame();
+
+ if (frame != null) {
+ final JRootPane rootPane = this.getRootPane();
+
+
+ updateAlwaysOnTopButton();
+
+ if (((state & Frame.MAXIMIZED_BOTH) != 0)
+ && ((rootPane.getBorder() == null) || (rootPane
+ .getBorder() instanceof UIResource))
+ && frame.isShowing()) {
+ rootPane.setBorder(null);
+ } else {
+ if ((state & Frame.MAXIMIZED_BOTH) == 0) {
+ // This is a croak, if state becomes bound, this can
+ // be nuked.
+ this.rootPaneUI.installBorder(rootPane);
+ }
+ }
+ if (frame.isResizable()) {
+ if ((state & Frame.MAXIMIZED_BOTH) != 0) {
+ Icon restoreIcon = new TransitionAwareIcon(
+ this.toggleButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return SubstanceIconFactory
+ .getTitlePaneIcon(
+ SubstanceIconFactory.IconKind.RESTORE,
+ scheme,
+ SubstanceCoreUtilities
+ .getSkin(
+ rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE));
+ }
+ }, "substance.titlePane.restoreIcon");
+ this
+ .updateToggleButton(this.restoreAction,
+ restoreIcon);
+ this.toggleButton.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane).getString(
+ "SystemMenu.restore"));
+ this.maximizeAction.setEnabled(false);
+ this.restoreAction.setEnabled(true);
+ } else {
+ Icon maxIcon = new TransitionAwareIcon(
+ this.toggleButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return SubstanceIconFactory
+ .getTitlePaneIcon(
+ SubstanceIconFactory.IconKind.MAXIMIZE,
+ scheme,
+ SubstanceCoreUtilities
+ .getSkin(
+ rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE));
+ }
+ }, "substance.titlePane.maxIcon");
+ this.updateToggleButton(this.maximizeAction, maxIcon);
+ this.toggleButton.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane).getString(
+ "SystemMenu.maximize"));
+ this.maximizeAction.setEnabled(true);
+ this.restoreAction.setEnabled(false);
+ }
+ if ((this.toggleButton.getParent() == null)
+ || (this.minimizeButton.getParent() == null)
+ || (this.alwaysOnTopButton.getParent() == null)
+ ) {
+ this.add(this.alwaysOnTopButton);
+ this.add(this.toggleButton);
+ this.add(this.minimizeButton);
+ this.revalidate();
+ this.repaint();
+ }
+ this.toggleButton.setText(null);
+ this.alwaysOnTopAction.setEnabled(true);
+ } else {
+ this.maximizeAction.setEnabled(false);
+ this.restoreAction.setEnabled(false);
+ if (this.toggleButton.getParent() != null) {
+ this.remove(this.toggleButton);
+ this.revalidate();
+ this.repaint();
+ }
+ }
+ } else {
+ // Not contained in a Frame
+ this.alwaysOnTopAction.setEnabled(false);
+ this.maximizeAction.setEnabled(false);
+ this.restoreAction.setEnabled(false);
+ this.iconifyAction.setEnabled(false);
+ this.remove(this.alwaysOnTopButton);
+ this.remove(this.toggleButton);
+ this.remove(this.minimizeButton);
+ this.revalidate();
+ this.repaint();
+ }
+ this.alwaysOnTopAction.setEnabled(true);
+ this.closeAction.setEnabled(true);
+ this.state = state;
+ }
+ }
+
+ /**
+ * Updates the toggle button to contain the Icon icon, and
+ * Action action.
+ *
+ * @param action
+ * Action.
+ * @param icon
+ * Icon.
+ */
+ private void updateToggleButton(Action action, Icon icon) {
+ this.toggleButton.setAction(action);
+ this.toggleButton.setIcon(icon);
+ this.toggleButton.setText(null);
+ }
+
+ private void updateAlwaysOnTopButton() {
+ Frame frame = this.getFrame();
+ if (frame.isAlwaysOnTop()) {
+ Icon alwaysOnTopIconEnabled = new TransitionAwareIcon(this.alwaysOnTopButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return getAlwaysOnTopIcon(scheme,
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ true);
+ }
+ }, "substance.titlePane.alwaysOnTopIconEnabled");
+ this.alwaysOnTopButton.setIcon(alwaysOnTopIconEnabled);
+ } else {
+ Icon alwaysOnTopIcon = new TransitionAwareIcon(this.alwaysOnTopButton,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return getAlwaysOnTopIcon(scheme,
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ false);
+ }
+ }, "substance.titlePane.alwaysOnTopIcon");
+ this.alwaysOnTopButton.setIcon(alwaysOnTopIcon);
+ }
+ }
+
+ /**
+ * Returns the Frame rendering in. This will return null if the
+ * JRootPane is not contained in a Frame.
+ *
+ * @return Frame.
+ */
+ private Frame getFrame() {
+ Window window = this.getWindow();
+
+ if (window instanceof Frame) {
+ return (Frame) window;
+ }
+ return null;
+ }
+
+ /**
+ * Returns the Window the JRootPane is contained
+ * in. This will return null if there is no parent ancestor of the
+ * JRootPane.
+ *
+ * @return Window.
+ */
+ private Window getWindow() {
+ return this.window;
+ }
+
+ /**
+ * Returns the String to display as the title.
+ *
+ * @return Display title.
+ */
+ private String getTitle() {
+ Window w = this.getWindow();
+
+ if (w instanceof Frame) {
+ return ((Frame) w).getTitle();
+ }
+ if (w instanceof Dialog) {
+ return ((Dialog) w).getTitle();
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
+ */
+ @Override
+ public void paintComponent(Graphics g) {
+ // long start = System.nanoTime();
+ // As state isn't bound, we need a convenience place to check
+ // if it has changed. Changing the state typically changes the
+ if (this.getFrame() != null) {
+ this.setState(this.getFrame().getExtendedState());
+ }
+ final JRootPane rootPane = this.getRootPane();
+ Window window = this.getWindow();
+ boolean leftToRight = (window == null) ? rootPane
+ .getComponentOrientation().isLeftToRight() : window
+ .getComponentOrientation().isLeftToRight();
+ int width = this.getWidth();
+ int height = this.getHeight();
+
+ SubstanceSkin skin = SubstanceCoreUtilities.getSkin(rootPane);
+ if (skin == null) {
+ SubstanceCoreUtilities
+ .traceSubstanceApiUsage(this,
+ "Substance delegate used when Substance is not the current LAF");
+ }
+ SubstanceColorScheme scheme = skin
+ .getEnabledColorScheme(DecorationAreaType.PRIMARY_TITLE_PANE);
+
+ int xOffset = 0;
+ String theTitle = this.getTitle();
+
+ if (theTitle != null) {
+ Rectangle titleTextRect = this.getTitleTextRectangle();
+ FontMetrics fm = rootPane.getFontMetrics(g.getFont());
+ int titleWidth = titleTextRect.width - 20;
+ String clippedTitle = SubstanceCoreUtilities.clipString(fm,
+ titleWidth, theTitle);
+ // show tooltip with full title only if necessary
+ if (theTitle.equals(clippedTitle)) {
+ this.setToolTipText(null);
+ } else {
+ this.setToolTipText(theTitle);
+ }
+ theTitle = clippedTitle;
+ if (leftToRight)
+ xOffset = titleTextRect.x;
+ else
+ xOffset = titleTextRect.x + titleTextRect.width
+ - fm.stringWidth(theTitle);
+ }
+
+ Graphics2D graphics = (Graphics2D) g.create();
+ Font font = SubstanceLookAndFeel.getFontPolicy().getFontSet(
+ "Substance", null).getWindowTitleFont();
+ graphics.setFont(font);
+
+ BackgroundPaintingUtils
+ .update(graphics, SubstanceTitlePane.this, false);
+ // DecorationPainterUtils.paintDecorationBackground(graphics,
+ // SubstanceTitlePane.this, false);
+
+ // draw the title (if needed)
+ if (theTitle != null) {
+ FontMetrics fm = rootPane.getFontMetrics(graphics.getFont());
+ int yOffset = ((height - fm.getHeight()) / 2) + fm.getAscent();
+
+ SubstanceTextUtilities.paintTextWithDropShadow(this, graphics,
+ SubstanceColorUtilities.getForegroundColor(scheme),
+ theTitle, width, height, xOffset, yOffset);
+ }
+
+ GhostPaintingUtils.paintGhostImages(this, graphics);
+
+ // long end = System.nanoTime();
+ // System.out.println(end - start);
+ graphics.dispose();
+ }
+
+ /**
+ * Computes the rectangle of the title text. This method looks at all the
+ * children components of the title pane, grouping them by leading and
+ * trailing (based on {@link #EXTRA_COMPONENT_KIND} client property). The
+ * title text rectangle is the space between the leading group and the
+ * trailing group.
+ *
+ * @return Rectangle of the title text.
+ * @throws IllegalStateException
+ * If at least one child component of this title pane is not
+ * marked with the {@link #EXTRA_COMPONENT_KIND} client
+ * property.
+ * @see #markExtraComponent(JComponent, ExtraComponentKind)
+ * @see #EXTRA_COMPONENT_KIND
+ */
+ protected Rectangle getTitleTextRectangle() {
+ JRootPane rootPane = this.getRootPane();
+ Window window = this.getWindow();
+ boolean leftToRight = (window == null) ? rootPane
+ .getComponentOrientation().isLeftToRight() : window
+ .getComponentOrientation().isLeftToRight();
+
+ if (leftToRight) {
+ int maxLeadingX = 0;
+ int minTrailingX = this.getWidth();
+
+ for (int i = 0; i < this.getComponentCount(); i++) {
+ Component child = this.getComponent(i);
+ if (!child.isVisible())
+ continue;
+ if (child instanceof JComponent) {
+ ExtraComponentKind kind = (ExtraComponentKind) ((JComponent) child)
+ .getClientProperty(EXTRA_COMPONENT_KIND);
+ if (kind == null) {
+ throw new IllegalStateException("Title pane child "
+ + child.getClass().getName()
+ + " is not marked as leading or trailing");
+ }
+ if (kind == ExtraComponentKind.LEADING) {
+ int cx = child.getX() + child.getWidth();
+ if (cx > maxLeadingX)
+ maxLeadingX = cx;
+ } else {
+ int cx = child.getX();
+ if (cx < minTrailingX)
+ minTrailingX = cx;
+ }
+ }
+ }
+
+ int start = maxLeadingX + 10;
+ int end = minTrailingX - 5;
+ return new Rectangle(start, 0, end - start, this.getHeight());
+ } else {
+ int minLeadingX = this.getWidth();
+ int maxTrailingX = 0;
+
+ for (int i = 0; i < this.getComponentCount(); i++) {
+ Component child = this.getComponent(i);
+ if (!child.isVisible())
+ continue;
+ if (child instanceof JComponent) {
+ ExtraComponentKind kind = (ExtraComponentKind) ((JComponent) child)
+ .getClientProperty(EXTRA_COMPONENT_KIND);
+ if (kind == null) {
+ throw new IllegalStateException("Title pane child "
+ + child.getClass().getName()
+ + " is not marked as leading or trailing");
+ }
+ if (kind == ExtraComponentKind.LEADING) {
+ int cx = child.getX();
+ if (cx < minLeadingX)
+ minLeadingX = cx;
+ } else {
+ int cx = child.getX() + child.getWidth();
+ if (cx > maxTrailingX)
+ maxTrailingX = cx;
+ }
+ }
+ }
+
+ int start = maxTrailingX + 5;
+ int end = minLeadingX - 10;
+ return new Rectangle(start, 0, end - start, this.getHeight());
+ }
+ }
+
+ /**
+ * Actions used to close the Window.
+ */
+ private class CloseAction extends AbstractAction {
+ /**
+ * Creates a new close action.
+ */
+ public CloseAction() {
+ super(SubstanceCoreUtilities.getResourceBundle(rootPane).getString(
+ "SystemMenu.close"), SubstanceImageCreator.getCloseIcon(
+ SubstanceCoreUtilities.getSkin(rootPane)
+ .getActiveColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ SubstanceCoreUtilities.getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE)));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Window window = SubstanceTitlePane.this.getWindow();
+
+ if (window != null) {
+ window.dispatchEvent(new WindowEvent(window,
+ WindowEvent.WINDOW_CLOSING));
+ }
+ }
+ }
+
+ /**
+ * Actions used to iconfiy the Frame.
+ */
+ private class IconifyAction extends AbstractAction {
+ /**
+ * Creates a new iconify action.
+ */
+ public IconifyAction() {
+ super(
+ SubstanceCoreUtilities.getResourceBundle(rootPane)
+ .getString("SystemMenu.iconify"),
+ SubstanceImageCreator
+ .getMinimizeIcon(
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getActiveColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE)));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Frame frame = SubstanceTitlePane.this.getFrame();
+ if (frame != null) {
+ frame.setExtendedState(SubstanceTitlePane.this.state
+ | Frame.ICONIFIED);
+ }
+ }
+ }
+
+ private class AlwaysOnTopAction extends AbstractAction {
+ /**
+ * Creates a new restore action.
+ */
+ public AlwaysOnTopAction() {
+ super(
+ /*SubstanceCoreUtilities.getResourceBundle(rootPane)
+ .getString("SystemMenu.restore"),*/
+ //"Always on top",
+ SubstanceCoreUtilities.getResourceBundle(rootPane)
+ .getString("SystemMenu.alwaysOnTop"),
+ SubstanceImageCreator
+ .getRestoreIcon(
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getActiveColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE)));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Frame frame = SubstanceTitlePane.this.getFrame();
+
+ if (frame == null) {
+ return;
+ }
+
+ frame.setAlwaysOnTop(!frame.isAlwaysOnTop());
+ updateAlwaysOnTopButton();
+ }
+ }
+
+ /**
+ * Actions used to restore the Frame.
+ */
+ private class RestoreAction extends AbstractAction {
+ /**
+ * Creates a new restore action.
+ */
+ public RestoreAction() {
+ super(
+ SubstanceCoreUtilities.getResourceBundle(rootPane)
+ .getString("SystemMenu.restore"),
+ SubstanceImageCreator
+ .getRestoreIcon(
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getActiveColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE)));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Frame frame = SubstanceTitlePane.this.getFrame();
+
+ if (frame == null) {
+ return;
+ }
+
+ if ((SubstanceTitlePane.this.state & Frame.ICONIFIED) != 0) {
+ frame.setExtendedState(SubstanceTitlePane.this.state
+ & ~Frame.ICONIFIED);
+ } else {
+ frame.setExtendedState(SubstanceTitlePane.this.state
+ & ~Frame.MAXIMIZED_BOTH);
+ }
+ }
+ }
+
+ /**
+ * Actions used to restore the Frame.
+ */
+ private class MaximizeAction extends AbstractAction {
+ /**
+ * Creates a new maximize action.
+ */
+ public MaximizeAction() {
+ super(
+ SubstanceCoreUtilities.getResourceBundle(rootPane)
+ .getString("SystemMenu.maximize"),
+ SubstanceImageCreator
+ .getMaximizeIcon(
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getActiveColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE),
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getEnabledColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE)));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Frame frame = SubstanceTitlePane.this.getFrame();
+ if (frame != null) {
+ if (frame instanceof JFrame) {
+ SubstanceRootPaneUI rpUI = (SubstanceRootPaneUI) ((JFrame) frame)
+ .getRootPane().getUI();
+ rpUI.setMaximized();
+ }
+ frame.setExtendedState(SubstanceTitlePane.this.state
+ | Frame.MAXIMIZED_BOTH);
+ }
+ }
+ }
+
+ /**
+ * Class responsible for drawing the system menu. Looks up the image to draw
+ * from the Frame associated with the JRootPane.
+ */
+ public class SubstanceMenuBar extends JMenuBar {
+ @Override
+ public void paint(Graphics g) {
+ if (appIcon != null) {
+ g.drawImage(appIcon, 0, 0, null);
+ } else {
+ Icon icon = UIManager.getIcon("InternalFrame.icon");
+ if (icon != null) {
+ icon.paintIcon(this, g, 0, 0);
+ }
+ }
+ }
+
+ @Override
+ public Dimension getMinimumSize() {
+ return this.getPreferredSize();
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ Dimension size = super.getPreferredSize();
+
+ int iSize = SubstanceSizeUtils.getTitlePaneIconSize();
+ return new Dimension(Math.max(iSize, size.width), Math.max(
+ size.height, iSize));
+ }
+ }
+
+ /**
+ * Layout manager for the title pane.
+ *
+ * @author Kirill Graphics
+ */
+ protected class TitlePaneLayout implements LayoutManager {
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.LayoutManager#addLayoutComponent(java.lang.String,
+ * java.awt.Component)
+ */
+ @Override
+ public void addLayoutComponent(String name, Component c) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.LayoutManager#removeLayoutComponent(java.awt.Component)
+ */
+ @Override
+ public void removeLayoutComponent(Component c) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.LayoutManager#preferredLayoutSize(java.awt.Container)
+ */
+ @Override
+ public Dimension preferredLayoutSize(Container c) {
+ int height = this.computeHeight();
+ return new Dimension(height, height);
+ }
+
+ /**
+ * Computes title pane height.
+ *
+ * @return Title pane height.
+ */
+ private int computeHeight() {
+ FontMetrics fm = SubstanceTitlePane.this.rootPane
+ .getFontMetrics(SubstanceTitlePane.this.getFont());
+ int fontHeight = fm.getHeight();
+ fontHeight += 7;
+ int iconHeight = 0;
+ if (SubstanceTitlePane.this.getWindowDecorationStyle() == JRootPane.FRAME) {
+ iconHeight = SubstanceSizeUtils.getTitlePaneIconSize();
+ }
+
+ int finalHeight = Math.max(fontHeight, iconHeight);
+ return finalHeight;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.LayoutManager#minimumLayoutSize(java.awt.Container)
+ */
+ @Override
+ public Dimension minimumLayoutSize(Container c) {
+ return this.preferredLayoutSize(c);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.awt.LayoutManager#layoutContainer(java.awt.Container)
+ */
+ @Override
+ public void layoutContainer(Container c) {
+ boolean leftToRight = (SubstanceTitlePane.this.window == null) ? SubstanceTitlePane.this
+ .getRootPane().getComponentOrientation().isLeftToRight()
+ : SubstanceTitlePane.this.window.getComponentOrientation()
+ .isLeftToRight();
+
+ int w = SubstanceTitlePane.this.getWidth();
+ int x;
+ int y = 3;
+ int spacing;
+ int buttonHeight;
+ int buttonWidth;
+
+ if ((SubstanceTitlePane.this.closeButton != null)
+ && (SubstanceTitlePane.this.closeButton.getIcon() != null)) {
+ buttonHeight = SubstanceTitlePane.this.closeButton.getIcon()
+ .getIconHeight();
+ buttonWidth = SubstanceTitlePane.this.closeButton.getIcon()
+ .getIconWidth();
+ } else {
+ buttonHeight = SubstanceSizeUtils.getTitlePaneIconSize();
+ buttonWidth = SubstanceSizeUtils.getTitlePaneIconSize();
+ }
+
+ y = (getHeight() - buttonHeight) / 2;
+
+ // assumes all buttons have the same dimensions
+ // these dimensions include the borders
+
+ x = leftToRight ? w : 0;
+
+ spacing = 5;
+ x = leftToRight ? spacing : w - buttonWidth - spacing;
+ if (SubstanceTitlePane.this.menuBar != null) {
+ SubstanceTitlePane.this.menuBar.setBounds(x, y, buttonWidth,
+ buttonHeight);
+ // System.out.println(menuBar.getBounds());
+ }
+
+ x = leftToRight ? w : 0;
+ spacing = 3;
+ x += leftToRight ? -spacing - buttonWidth : spacing;
+ if (SubstanceTitlePane.this.closeButton != null) {
+ SubstanceTitlePane.this.closeButton.setBounds(x, y,
+ buttonWidth, buttonHeight);
+ }
+
+ if (!leftToRight)
+ x += buttonWidth;
+
+ if (SubstanceTitlePane.this.getWindowDecorationStyle() == JRootPane.FRAME) {
+ if (Toolkit.getDefaultToolkit().isFrameStateSupported(
+ Frame.MAXIMIZED_BOTH)) {
+ if (SubstanceTitlePane.this.toggleButton.getParent() != null) {
+ spacing = 10;
+ x += leftToRight ? -spacing - buttonWidth : spacing;
+ SubstanceTitlePane.this.toggleButton.setBounds(x, y,
+ buttonWidth, buttonHeight);
+ if (!leftToRight) {
+ x += buttonWidth;
+ }
+ }
+ }
+
+ if ((SubstanceTitlePane.this.minimizeButton != null)
+ && (SubstanceTitlePane.this.minimizeButton.getParent() != null)) {
+ spacing = 2;
+ x += leftToRight ? -spacing - buttonWidth : spacing;
+ SubstanceTitlePane.this.minimizeButton.setBounds(x, y,
+ buttonWidth, buttonHeight);
+ if (!leftToRight) {
+ x += buttonWidth;
+ }
+ }
+
+ if ((SubstanceTitlePane.this.alwaysOnTopButton != null)
+ && (SubstanceTitlePane.this.alwaysOnTopButton.getParent() != null)) {
+ spacing = 2;
+ x += leftToRight ? -spacing - buttonWidth : spacing;
+ SubstanceTitlePane.this.alwaysOnTopButton.setBounds(x, y,
+ buttonWidth, buttonHeight);
+ if (!leftToRight) {
+ x += buttonWidth;
+ }
+ }
+
+ if ((SubstanceTitlePane.this.heapStatusPanel != null)
+ && SubstanceTitlePane.this.heapStatusPanel.isVisible()) {
+ spacing = 5;
+ x += leftToRight ? (-spacing - SubstanceTitlePane.this.heapStatusPanel
+ .getPreferredWidth())
+ : spacing;
+ SubstanceTitlePane.this.heapStatusPanel.setBounds(x, 1,
+ SubstanceTitlePane.this.heapStatusPanel
+ .getPreferredWidth(),
+ SubstanceTitlePane.this.getHeight() - 3);
+ }
+ }
+ // buttonsWidth = leftToRight ? w - x : x;
+ }
+
+ }
+
+ /**
+ * PropertyChangeListener installed on the Window. Updates the necessary
+ * state as the state of the Window changes.
+ */
+ private class PropertyChangeHandler implements PropertyChangeListener {
+ @Override
+ public void propertyChange(PropertyChangeEvent pce) {
+ String name = pce.getPropertyName();
+
+ // Frame.state isn't currently bound.
+ if ("resizable".equals(name) || "state".equals(name)) {
+ Frame frame = SubstanceTitlePane.this.getFrame();
+
+ if (frame != null) {
+ SubstanceTitlePane.this.setState(frame.getExtendedState(),
+ true);
+ }
+ if ("resizable".equals(name)) {
+ SubstanceTitlePane.this.getRootPane().repaint();
+ }
+ } else {
+ if ("title".equals(name)) {
+ SubstanceTitlePane.this.repaint();
+ SubstanceTitlePane.this.setToolTipText((String) pce
+ .getNewValue());
+ } else if ("componentOrientation" == name) {
+ revalidate();
+ repaint();
+ } else if ("iconImage" == name) {
+ updateAppIcon();
+ revalidate();
+ repaint();
+ }
+ }
+ }
+ }
+
+ /**
+ * WindowListener installed on the Window, updates the state as necessary.
+ */
+ private class WindowHandler extends WindowAdapter {
+ @Override
+ public void windowActivated(WindowEvent ev) {
+ SubstanceTitlePane.this.setActive(true);
+ }
+
+ @Override
+ public void windowDeactivated(WindowEvent ev) {
+ SubstanceTitlePane.this.setActive(false);
+ }
+ }
+
+ /**
+ * Sets location for heap status logfile. Relevant if
+ * {@link #setCanHaveHeapStatusPanel(boolean)} was called with
+ * true.
+ *
+ * @param heapStatusLogfileName
+ * Logfile for the heap status panel.
+ */
+ public static void setHeapStatusLogfileName(String heapStatusLogfileName) {
+ SubstanceTitlePane.heapStatusLogfileName = heapStatusLogfileName;
+ }
+
+ /**
+ * Synchronizes the tooltip of the close button.
+ */
+ protected void syncCloseButtonTooltip() {
+ if (SubstanceCoreUtilities.isRootPaneModified(this.getRootPane())) {
+ this.closeButton.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane).getString("SystemMenu.close")
+ + " ["
+ + SubstanceCoreUtilities.getResourceBundle(rootPane)
+ .getString("Tooltip.contentsNotSaved") + "]");
+ } else {
+ this.closeButton.setToolTipText(SubstanceCoreUtilities
+ .getResourceBundle(rootPane).getString("SystemMenu.close"));
+ }
+ this.closeButton.repaint();
+ }
+
+ /**
+ * Marks the specified child component with the specified extra component
+ * kind.
+ *
+ * @param comp
+ * Child component.
+ * @param kind
+ * Extra kind.
+ * @see #getTitleTextRectangle()
+ * @see #EXTRA_COMPONENT_KIND
+ */
+ protected void markExtraComponent(JComponent comp, ExtraComponentKind kind) {
+ comp.putClientProperty(EXTRA_COMPONENT_KIND, kind);
+ }
+
+ /**
+ * Updates the application icon.
+ */
+ private void updateAppIcon() {
+ Window window = getWindow();
+ if (window == null) {
+ this.appIcon = null;
+ return;
+ }
+ java.util.List icons = window.getIconImages();
+
+ if (icons.size() == 0) {
+ this.appIcon = null;
+ } else {
+ int prefSize = SubstanceSizeUtils.getTitlePaneIconSize();
+ this.appIcon = SubstanceCoreUtilities.getScaledIconImage(icons,
+ prefSize, prefSize);
+ }
+ }
+
+ public AbstractButton getCloseButton() {
+ return this.closeButton;
+ }
+
+
+ public static Icon getAlwaysOnTopIcon(SubstanceColorScheme scheme,
+ SubstanceColorScheme backgroundScheme, boolean enabled) {
+ int iSize = SubstanceSizeUtils.getTitlePaneIconSize();
+ BufferedImage image = SubstanceCoreUtilities
+ .getBlankImage(iSize, iSize);
+ Graphics2D graphics = (Graphics2D) image.getGraphics();
+ Color color = SubstanceColorUtilities.getMarkColor(scheme, true);
+ graphics.setColor(color);
+ //graphics.fillRect(start + 2, end - 2, size, 3);
+ Ellipse2D ellipse = new Ellipse2D.Double(iSize / 3, iSize / 3, iSize / 3, iSize / 3);
+ if (enabled) {
+ graphics.fill(ellipse);
+ }
+ graphics.draw(ellipse);
+
+ graphics.drawLine(iSize / 2, iSize * 2 / 3, iSize / 2, iSize - 4);
+
+ int fgStrength = SubstanceColorUtilities.getColorBrightness(color
+ .getRGB());
+ int fgNegativeStrength = SubstanceColorUtilities
+ .getColorBrightness(SubstanceColorUtilities
+ .getNegativeColor(color.getRGB()));
+ int bgStrength = SubstanceColorUtilities
+ .getColorBrightness(backgroundScheme.getLightColor().getRGB());
+ boolean noEcho = (fgStrength > fgNegativeStrength)
+ && (fgStrength < bgStrength);
+
+ return new ImageIcon(overlayEcho(image,
+ noEcho ? 0 : SubstanceColorUtilities.getColorStrength(color),
+ 1, 1));
+ }
+
+ private static BufferedImage getNegated(BufferedImage bi) {
+ return new NegatedFilter().filter(bi, null);
+ }
+
+ private static BufferedImage overlayEcho(BufferedImage image,
+ float echoAlpha, int offsetX, int offsetY) {
+ int width = image.getWidth();
+ int height = image.getHeight();
+
+ // blur the original image
+ // ConvolveOp convolve = new ConvolveOp(new Kernel(3, 3, new float[] {
+ // .4f, .4f, .4f, .4f, .0f, .4f, .4f, .4f, .4f }),
+ // ConvolveOp.EDGE_NO_OP, null);
+ offsetX = offsetY = 0;
+ BufferedImage negated = getNegated(image);
+ BufferedImage result = SubstanceCoreUtilities.getBlankImage(width,
+ height);
+ Graphics2D graphics = (Graphics2D) result.getGraphics().create();
+ graphics.setComposite(AlphaComposite.getInstance(
+ AlphaComposite.SRC_OVER, 0.2f * echoAlpha * echoAlpha
+ * echoAlpha));
+ graphics.drawImage(negated, offsetX - 1, offsetY - 1, null);
+ graphics.drawImage(negated, offsetX + 1, offsetY - 1, null);
+ graphics.drawImage(negated, offsetX - 1, offsetY + 1, null);
+ graphics.drawImage(negated, offsetX + 1, offsetY + 1, null);
+ graphics.setComposite(AlphaComposite.getInstance(
+ AlphaComposite.SRC_OVER, 0.7f * echoAlpha * echoAlpha
+ * echoAlpha));
+ graphics.drawImage(negated, offsetX, offsetY - 1, null);
+ graphics.drawImage(negated, offsetX, offsetY + 1, null);
+ graphics.drawImage(negated, offsetX - 1, offsetY, null);
+ graphics.drawImage(negated, offsetX + 1, offsetY, null);
+
+ graphics.setComposite(AlphaComposite.getInstance(
+ AlphaComposite.SRC_OVER, 1.0f));
+ graphics.drawImage(image, 0, 0, null);
+
+ graphics.dispose();
+ return result;
+ }
+}
diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java
index 8cd016043..b03f5347b 100644
--- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java
+++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java
@@ -25,7 +25,6 @@ import com.jpexs.decompiler.flash.abc.ABC;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.configuration.ConfigurationItemChangeListener;
import com.jpexs.decompiler.flash.console.ContextMenuTools;
-import com.jpexs.decompiler.flash.easygui.EasyPanel;
import com.jpexs.decompiler.flash.exporters.swf.SwfFlashDevelopExporter;
import com.jpexs.decompiler.flash.exporters.swf.SwfIntelliJIdeaExporter;
import com.jpexs.decompiler.flash.exporters.swf.SwfVsCodeExporter;
@@ -1292,6 +1291,9 @@ public abstract class MainFrameMenu implements MenuBuilder {
finishMenu("/file/start");
addMenuItem("/file/view", translate("menu.view"), null, null, 0, null, false, null, false);
+ if (!supportsAppMenu()) {
+ addToggleMenuItem("/file/view/alwaysOnTop", translate("menu.file.view.alwaysOnTop"), null, null, this::alwaysOnTopActionPerformed, 0, null);
+ }
addToggleMenuItem("/file/view/viewResources", translate("menu.file.view.resources"), "view", "viewresources16", this::viewResourcesActionPerformed, PRIORITY_MEDIUM, null);
addToggleMenuItem("/file/view/viewTagList", translate("menu.file.view.tagList"), "view", "taglist16", this::viewTagListActionPerformed, PRIORITY_MEDIUM, null);
addToggleMenuItem("/file/view/viewHex", translate("menu.file.view.hex"), "view", "viewhex16", this::viewHexActionPerformed, PRIORITY_MEDIUM, null);
@@ -1555,6 +1557,11 @@ public abstract class MainFrameMenu implements MenuBuilder {
break;
}
}
+
+ private void alwaysOnTopActionPerformed(ActionEvent evt) {
+ mainFrame.getWindow().setAlwaysOnTop(!mainFrame.getWindow().isAlwaysOnTop());
+ setMenuChecked("/file/view/alwaysOnTop", mainFrame.getWindow().isAlwaysOnTop());
+ }
private void viewResourcesActionPerformed(ActionEvent evt) {
if (mainFrame.getPanel().checkEdited()) {
diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java
index 81e2e87f3..c91ba8d17 100644
--- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java
+++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java
@@ -38,9 +38,22 @@ import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.io.File;
import java.util.List;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JComponent;
import javax.swing.JFrame;
+import javax.swing.JTree;
+import javax.swing.plaf.RootPaneUI;
import org.pushingpixels.flamingo.api.ribbon.JRibbon;
import org.pushingpixels.flamingo.internal.ui.ribbon.appmenu.JRibbonApplicationMenuButton;
+import org.pushingpixels.substance.api.DecorationAreaType;
+import org.pushingpixels.substance.api.SubstanceColorScheme;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
+import org.pushingpixels.substance.flamingo.ribbon.ui.SubstanceRibbonRootPaneUI;
+import org.pushingpixels.substance.internal.utils.SubstanceCoreUtilities;
+import org.pushingpixels.substance.internal.utils.SubstanceTitleButton;
+import org.pushingpixels.substance.internal.utils.icon.SubstanceIconFactory;
+import org.pushingpixels.substance.internal.utils.icon.TransitionAwareIcon;
/**
* @author JPEXS
@@ -168,10 +181,70 @@ public final class MainFrameRibbon extends AppRibbonFrame {
}
});
- View.centerScreenMain(this);
-
- }
+ View.centerScreenMain(this);
+ /*addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowOpened(WindowEvent e) {
+ RootPaneUI ui = getRootPane().getUI();
+ if (ui instanceof SubstanceRibbonRootPaneUI) {
+ SubstanceRibbonRootPaneUI sui = (SubstanceRibbonRootPaneUI) ui;
+ JComponent titlePane = sui.getTitlePane();
+ final String EXTRA_COMPONENT_KIND = "substancelaf.internal.titlePane.extraComponentKind";
+ Object trailing = null;
+ int i = 0;
+ int cnt = titlePane.getComponentCount();
+ for (; i < cnt; i++) {
+ Component c = titlePane.getComponent(i);
+
+ if (c instanceof JComponent) {
+ JComponent jc = (JComponent) c;
+ Object o = jc.getClientProperty(EXTRA_COMPONENT_KIND);
+ if ("TRAILING".equals("" + o)) {
+ trailing = o;
+ break;
+ }
+ }
+ }
+ if (trailing != null) {
+ JButton button = new SubstanceTitleButton();
+ button.setFocusPainted(false);
+ button.setFocusable(false);
+ button.setOpaque(true);
+ button.putClientProperty(EXTRA_COMPONENT_KIND, trailing);
+ button.setText(null);
+ button.setBorder(null);
+
+ Icon minIcon = new TransitionAwareIcon(button,
+ new TransitionAwareIcon.Delegate() {
+ @Override
+ public Icon getColorSchemeIcon(
+ SubstanceColorScheme scheme) {
+ return SubstanceIconFactory
+ .getTitlePaneIcon(
+ SubstanceIconFactory.IconKind.MINIMIZE,
+ scheme,
+ SubstanceCoreUtilities
+ .getSkin(rootPane)
+ .getBackgroundColorScheme(
+ DecorationAreaType.PRIMARY_TITLE_PANE));
+ }
+ }, "substance.titlePane.minIcon");
+
+ button.setIcon(minIcon);
+ button.setToolTipText("Zkouska");
+ button.putClientProperty(SubstanceLookAndFeel.FLAT_PROPERTY,
+ Boolean.TRUE);
+
+ titlePane.remove(i);
+ titlePane.add(button, i);
+ titlePane.revalidate();
+ }
+ }
+ }
+ });*/
+ }
+
@Override
public void setExtendedState(int state) {
if ((state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties
index be4a5b61d..104b953da 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties
@@ -1053,4 +1053,6 @@ zoom.enter = Enter zoom percentage value:
contextmenu.showInEasy = Show in Simple editor
#after 23.0.1
-work.debugging.start = Starting Flash content debugger
\ No newline at end of file
+work.debugging.start = Starting Flash content debugger
+
+menu.file.view.alwaysOnTop = Always on top
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties
index 2b23ba068..2c7b376a0 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties
@@ -611,4 +611,7 @@ message.confirm.remove.nodep = Segur que vols eliminar %item%?
message.confirm.removemultiple.nodep = Segur que vols eliminar %count% elements?
#...
-filter.swf_spl = Fitxers SWF (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = Fitxers SWF (*.swf, *.spl)
+
+#...
+menu.file.view.alwaysOnTop = Sempre al damunt
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties
index f4060bf59..3ee44fd1b 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties
@@ -442,8 +442,8 @@ text.align.right = Zarovnat vpravo
text.align.center = Zarovnat na st\u0159ed
text.align.justify = Zarovnat do bloku
text.undo = Vr\u00e1tit zm\u011bny
-menu.file.import.xml = Import SWF XML
-menu.file.export.xml = Export SWF XML
+menu.file.import.xml = Importovat SWF XML
+menu.file.export.xml = Exportovat SWF XML
#after version 4.1.1
text.align.translatex.decrease = Sn\u00ed\u017eit TranslateX
text.align.translatex.increase = Zv\u00fd\u0161it TranslateX
@@ -1053,4 +1053,5 @@ zoom.enter = Zadejte hodnotu p\u0159ibl\u00ed\u017een\u00ed v procentech:
contextmenu.showInEasy = Zobrazit v Jednoduch\u00e9m editoru
#after 23.0.1
-work.debugging.start = Spou\u0161t\u00ed se Flash content debugger
\ No newline at end of file
+work.debugging.start = Spou\u0161t\u00ed se Flash content debugger
+menu.file.view.alwaysOnTop = V\u017edy navrchu
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_de.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_de.properties
index 0e1309af0..fc45dbf83 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_de.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_de.properties
@@ -495,4 +495,7 @@ message.confirm.removemultiple.nodep = Wollen sie wirklich %count% Elemente entf
contextmenu.exportFla = Exportiere als *.FLA
#...
-filter.swf_spl = SWF Dateien (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = SWF Dateien (*.swf, *.spl)
+
+#...
+menu.file.view.alwaysOnTop = Immer im Vordergrund
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties
index 612d956b7..cd02dbfc3 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties
@@ -566,4 +566,6 @@ message.confirm.remove.nodep = Est\u00e1 seguro que desea remover %item%?
message.confirm.removemultiple.nodep = Est\u00e1 seguro que desea eliminar %count% art\u00edculos?
contextmenu.exportFla = Exportar a FLA
#...
-filter.swf_spl = Archivos SWF (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = Archivos SWF (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Siempre encima
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties
index 0c84b8ebf..0a7b35861 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties
@@ -582,4 +582,6 @@ message.confirm.remove.nodep = \u00cates-vous s\u00fbr de vouloir retirer les ob
message.confirm.removemultiple.nodep = \u00cates-vous s\u00fbr de vouloir retirer %count% objets ?
contextmenu.exportFla = Exporter en FLA
#...
-filter.swf_spl = Fichiers SWF (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = Fichiers SWF (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Toujours au-dessus
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties
index bf6b9274e..07397682d 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties
@@ -563,4 +563,6 @@ message.confirm.remove.nodep = Biztos benne, hogy t\u00f6r\u00f6lni k\u00edv\u00
message.confirm.removemultiple.nodep = Biztos benne, hogy t\u00f6r\u00f6lni k\u00edv\u00e1nja a %count% elemet ?
contextmenu.exportFla = Export\u00e1l\u00e1s FLA-ba
#...
-filter.swf_spl = SWF f\u00e1ljok (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = SWF f\u00e1ljok (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Mindig fel\u00fcl
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_it.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_it.properties
index 958bf62aa..90cbe0b91 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_it.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_it.properties
@@ -566,4 +566,6 @@ message.confirm.remove.nodep = Sicuro di voler remuovere %item%?
message.confirm.removemultiple.nodep = Confermare la rimozione di %count% elementi?
contextmenu.exportFla = Esporta come FLA
#...
-filter.swf_spl = File SWF (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = File SWF (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Sempre in primo piano
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ja.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ja.properties
index ae5929e42..8d50bb5ed 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ja.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ja.properties
@@ -646,4 +646,6 @@ button.showin.flashprojector = flash projector \u3067\u8868\u793a
contextmenu.exportFla = FLA \u3067\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
#...
-filter.swf_spl = SWF \u30d5\u30a1\u30a4\u30eb (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = SWF \u30d5\u30a1\u30a4\u30eb (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = \u5e38\u306b\u6700\u524d\u9762
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_nl.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_nl.properties
index 7ba5fcfe5..11db5d835 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_nl.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_nl.properties
@@ -958,4 +958,6 @@ node.scenes = sc\u00e8nes
contextmenu.showInFramesFolder = Weergeven in framesmap
contextmenu.exportFla = Naar FLA exporteren
#...
-filter.swf_spl = SWF-bestanden (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = SWF-bestanden (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Altijd bovenop
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties
index 2a99287c6..140f58229 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties
@@ -410,4 +410,6 @@ message.confirm.remove.nodep = Czy na pewno chcesz usun\u0105\u0107 %item%?
message.confirm.removemultiple.nodep = Czy na pewno chcesz usun\u0105\u0107 %count% obiekt\u00f3w(y)?
contextmenu.exportFla = Eskportuj do pliku FLA
#...
-filter.swf_spl = Pliki SWF (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = Pliki SWF (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Zawsze na wierzchu
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt.properties
index 1814c42c1..83c4a643d 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt.properties
@@ -283,4 +283,6 @@ ColorChooser.sampleText = Amostra de Texto Amostra de Texto
message.confirm.remove.nodep = Tem a certeza que pretende remover %item%?
contextmenu.exportFla = Exportar para FLA
#...
-filter.swf_spl = Ficheiros SWF (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = Ficheiros SWF (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Sempre no topo
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt_BR.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt_BR.properties
index 10300af53..829425c54 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt_BR.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pt_BR.properties
@@ -925,4 +925,6 @@ shaperecords.edge.style.fillstyle1=FillStyle1 = %value%
shaperecords.edge.end = Fim da forma
contextmenu.exportFla = Exportar para FLA
#...
-filter.swf_spl = Arquivos SWF (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = Arquivos SWF (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Sempre no topo
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties
index c9519ae73..536b2d92a 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties
@@ -454,4 +454,6 @@ message.confirm.remove.nodep = \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d
message.confirm.removemultiple.nodep = \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435: %count%?
contextmenu.exportFla = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 FLA
#...
-filter.swf_spl = SWF \u0444\u0430\u0439\u043b\u044b (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = SWF \u0444\u0430\u0439\u043b\u044b (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = \u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0432\u0435\u0440\u0445
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties
index a0839884c..9fe60e33e 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties
@@ -644,4 +644,6 @@ notavailable.activex.disable = Du kan aktivera med intern visning genom att avma
button.showin.flashprojector = Visa i flash projector
contextmenu.exportFla = Exporterar FLA
#...
-filter.swf_spl = SWF filer (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = SWF filer (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = Alltid \u00f6verst
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties
index 17d51c5be..10161fd4e 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties
@@ -1037,3 +1037,5 @@ zoom.enter = Yak\u0131nla\u015ft\u0131rma y\u00fczdesi de\u011ferini girin:
contextmenu.showInEasy = Basit d\u00fczenleyicide g\u00f6ster
#after 23.0.1
work.debugging.start = Flash i\u00e7erik hata ay\u0131klay\u0131c\u0131s\u0131n\u0131 ba\u015flatma
+#...
+menu.file.view.alwaysOnTop = Her zaman \u00fcstte
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_uk.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_uk.properties
index 670f56be7..b10d71091 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_uk.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_uk.properties
@@ -337,4 +337,6 @@ message.confirm.remove.nodep = \u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435
message.confirm.removemultiple.nodep = \u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u0443 \u043a\u0456\u043b\u044c\u043a\u043e\u0441\u0442\u0456: %count%?
contextmenu.exportFla = \u0415\u043a\u0441\u043f\u043e\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0434\u043e FLA
#...
-filter.swf_spl = SWF \u0444\u0430\u0439\u043b\u0438 (*.swf, *.spl)
\ No newline at end of file
+filter.swf_spl = SWF \u0444\u0430\u0439\u043b\u0438 (*.swf, *.spl)
+#...
+menu.file.view.alwaysOnTop = \u0417\u0430\u0432\u0436\u0434\u0438 \u0437\u0432\u0435\u0440\u0445\u0443
\ No newline at end of file
diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties
index a1ec28d94..9bbf2b268 100644
--- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties
+++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties
@@ -1007,3 +1007,5 @@ menu.tools.solEditor = \u5b58\u6863\u7f16\u8f91\u5668
node.cookies = \u5b58\u6863
menu.help.wiki = \u8bbf\u95eeFFDec\u7ef4\u57fa\u767e\u79d1
message.wiki = \u8bbf\u95eeFFDec\u7ef4\u57fa\u767e\u79d1: \r\n%url%
+#...
+menu.file.view.alwaysOnTop = \u59cb\u7ec8\u5728\u6700\u4e0a\u5c42
\ No newline at end of file