From f22b4cb4bccd9875482988cfc99fe1063c324642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 23 May 2025 19:26:31 +0200 Subject: [PATCH 1/4] Substance title pane to modify --- .../internal/utils/SubstanceTitlePane.java | 1821 +++++++++++++++++ 1 file changed, 1821 insertions(+) create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java 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..bc483a5f3 --- /dev/null +++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java @@ -0,0 +1,1821 @@ +/* + * 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.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.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.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.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; + + /** + * Button used to maximize or restore the frame. + */ + protected JButton toggleButton; + + /** + * 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.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.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.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.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(); + + 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.add(this.toggleButton); + this.add(this.minimizeButton); + this.revalidate(); + this.repaint(); + } + this.toggleButton.setText(null); + } 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.maximizeAction.setEnabled(false); + this.restoreAction.setEnabled(false); + this.iconifyAction.setEnabled(false); + this.remove(this.toggleButton); + this.remove(this.minimizeButton); + this.revalidate(); + this.repaint(); + } + 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); + } + + /** + * 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); + } + } + } + + /** + * 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.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; + } +} From 6aac0342bcd41402b7026aadb00283e638ea8dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 23 May 2025 20:45:31 +0200 Subject: [PATCH 2/4] Substance - always on top title pane button. --- .../internal/resources/Labels.properties | 33 +++ .../internal/resources/Labels_ar.properties | 33 +++ .../internal/resources/Labels_bg.properties | 33 +++ .../internal/resources/Labels_cs.properties | 33 +++ .../internal/resources/Labels_da.properties | 33 +++ .../internal/resources/Labels_de.properties | 147 +++++++++++++ .../internal/resources/Labels_el.properties | 21 ++ .../resources/Labels_en_GB.properties | 29 +++ .../internal/resources/Labels_es.properties | 147 +++++++++++++ .../resources/Labels_es_AR.properties | 106 +++++++++ .../resources/Labels_es_MX.properties | 21 ++ .../internal/resources/Labels_fi.properties | 21 ++ .../internal/resources/Labels_fr.properties | 147 +++++++++++++ .../resources/Labels_fr_CA.properties | 21 ++ .../internal/resources/Labels_hu.properties | 21 ++ .../internal/resources/Labels_it.properties | 149 +++++++++++++ .../internal/resources/Labels_iw.properties | 33 +++ .../internal/resources/Labels_ja.properties | 135 ++++++++++++ .../internal/resources/Labels_ko.properties | 115 ++++++++++ .../internal/resources/Labels_nl.properties | 33 +++ .../internal/resources/Labels_no.properties | 33 +++ .../internal/resources/Labels_pl.properties | 33 +++ .../internal/resources/Labels_pt.properties | 21 ++ .../resources/Labels_pt_BR.properties | 33 +++ .../internal/resources/Labels_ro.properties | 23 ++ .../internal/resources/Labels_ru.properties | 33 +++ .../internal/resources/Labels_sv.properties | 143 ++++++++++++ .../internal/resources/Labels_th.properties | 21 ++ .../internal/resources/Labels_tr.properties | 31 +++ .../internal/resources/Labels_vi.properties | 21 ++ .../resources/Labels_zh_CN.properties | 145 ++++++++++++ .../resources/Labels_zh_HK.properties | 135 ++++++++++++ .../resources/Labels_zh_TW.properties | 135 ++++++++++++ .../internal/utils/SubstanceTitlePane.java | 207 ++++++++++++++++++ 34 files changed, 2325 insertions(+) create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ar.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_bg.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_cs.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_da.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_de.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_el.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_en_GB.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_AR.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_es_MX.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fi.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_fr_CA.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_hu.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_it.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_iw.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ja.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ko.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_nl.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_no.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pl.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_pt_BR.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ro.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_ru.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_sv.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_th.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_tr.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_vi.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_CN.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_HK.properties create mode 100644 libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels_zh_TW.properties 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..6c28433f7 --- /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..48676c9c7 --- /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 index bc483a5f3..7400d782e 100644 --- a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java +++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java @@ -29,6 +29,9 @@ */ 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; @@ -52,6 +55,7 @@ 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; @@ -72,6 +76,7 @@ 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; @@ -97,6 +102,7 @@ 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; @@ -136,11 +142,21 @@ public class SubstanceTitlePane extends JComponent { */ 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 */ @@ -728,6 +744,7 @@ public class SubstanceTitlePane extends JComponent { this.add(this.menuBar); } this.createButtons(); + this.add(this.alwaysOnTopButton); this.add(this.minimizeButton); this.add(this.toggleButton); this.add(this.closeButton); @@ -805,6 +822,7 @@ public class SubstanceTitlePane extends JComponent { 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(); @@ -835,6 +853,7 @@ public class SubstanceTitlePane extends JComponent { * Menu. */ private void addMenuItems(JMenu menu) { + menu.add(this.alwaysOnTopAction); menu.add(this.restoreAction); menu.add(this.iconifyAction); @@ -929,6 +948,34 @@ public class SubstanceTitlePane extends JComponent { 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); @@ -1042,6 +1089,9 @@ public class SubstanceTitlePane extends JComponent { if (frame != null) { final JRootPane rootPane = this.getRootPane(); + + updateAlwaysOnTopButton(); + if (((state & Frame.MAXIMIZED_BOTH) != 0) && ((rootPane.getBorder() == null) || (rootPane .getBorder() instanceof UIResource)) @@ -1133,6 +1183,7 @@ public class SubstanceTitlePane extends JComponent { this.revalidate(); this.repaint(); } + this.alwaysOnTopAction.setEnabled(true); this.closeAction.setEnabled(true); this.state = state; } @@ -1152,6 +1203,41 @@ public class SubstanceTitlePane extends JComponent { 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 @@ -1424,6 +1510,42 @@ public class SubstanceTitlePane extends JComponent { } } } + + 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. @@ -1681,6 +1803,17 @@ public class SubstanceTitlePane extends JComponent { 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()) { @@ -1818,4 +1951,78 @@ public class SubstanceTitlePane extends JComponent { 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; + } } From f34176108e02e2f3122d8023dfc2d68fd12da7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 23 May 2025 20:51:37 +0200 Subject: [PATCH 3/4] Always on top not in dialogs. --- .../substance/internal/resources/Labels.properties | 2 +- .../substance/internal/resources/Labels_cs.properties | 2 +- .../substance/internal/utils/SubstanceTitlePane.java | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) 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 index 6c28433f7..46abb093f 100644 --- a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels.properties +++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/resources/Labels.properties @@ -30,4 +30,4 @@ Xoetrope.decimalRGB=Decimal RGB Xoetrope.webSafeColors=Use web safe colors -SystemMenu.alwaysOnTop=Toggle Always on top +SystemMenu.alwaysOnTop=Toggle "Always on top" 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 index 48676c9c7..0f92158b8 100644 --- 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 @@ -30,4 +30,4 @@ 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 +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/utils/SubstanceTitlePane.java b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java index 7400d782e..ee7812586 100644 --- a/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java +++ b/libsrc/substance-fix/src/org/pushingpixels/substance/internal/utils/SubstanceTitlePane.java @@ -1157,13 +1157,17 @@ public class SubstanceTitlePane extends JComponent { this.restoreAction.setEnabled(false); } if ((this.toggleButton.getParent() == null) - || (this.minimizeButton.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); @@ -1175,9 +1179,11 @@ public class SubstanceTitlePane extends JComponent { } } 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(); From 347fadee0f435e79e1acc1a9f90b08876d9d63e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 23 May 2025 21:25:49 +0200 Subject: [PATCH 4/4] Added: #1418 Option to make main window Always on top --- CHANGELOG.md | 2 + lib/substance-fix.jar | Bin 16588 -> 175459 bytes .../decompiler/flash/gui/MainFrameMenu.java | 9 +- .../decompiler/flash/gui/MainFrameRibbon.java | 79 +++++++++++++++++- .../flash/gui/locales/MainFrame.properties | 4 +- .../flash/gui/locales/MainFrame_ca.properties | 5 +- .../flash/gui/locales/MainFrame_cs.properties | 7 +- .../flash/gui/locales/MainFrame_de.properties | 5 +- .../flash/gui/locales/MainFrame_es.properties | 4 +- .../flash/gui/locales/MainFrame_fr.properties | 4 +- .../flash/gui/locales/MainFrame_hu.properties | 4 +- .../flash/gui/locales/MainFrame_it.properties | 4 +- .../flash/gui/locales/MainFrame_ja.properties | 4 +- .../flash/gui/locales/MainFrame_nl.properties | 4 +- .../flash/gui/locales/MainFrame_pl.properties | 4 +- .../flash/gui/locales/MainFrame_pt.properties | 4 +- .../gui/locales/MainFrame_pt_BR.properties | 4 +- .../flash/gui/locales/MainFrame_ru.properties | 4 +- .../flash/gui/locales/MainFrame_sv.properties | 4 +- .../flash/gui/locales/MainFrame_tr.properties | 2 + .../flash/gui/locales/MainFrame_uk.properties | 4 +- .../flash/gui/locales/MainFrame_zh.properties | 2 + 22 files changed, 141 insertions(+), 22 deletions(-) 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 9980821b9a8e2ed724781e88b40b71abefb0f281..63f6dda774f1262de6dd87f6f53244345104c4f3 100644 GIT binary patch literal 175459 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 nq?zt9PTt6