All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pushingpixels.radiance.common.internal.font.DefaultKDEFontPolicy Maven / Gradle / Ivy

Go to download

Demonstrating the abilities of the Swing UI Toolkit swingset2 and swingx aka swingset3

The newest version!
/*
 * Copyright (c) 2005-2021 Radiance 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 the copyright holder 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.radiance.common.internal.font;

import org.pushingpixels.radiance.common.api.font.FontPolicy;
import org.pushingpixels.radiance.common.api.font.FontSet;

import java.awt.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Pattern;

/**
 * The default font policy for KDE OS.
 * 
 * @author Paranoid
 */
public class DefaultKDEFontPolicy implements FontPolicy {

	/**
	 * method to check if current user session is KDE
	 * 
	 * @return true if KDE session is currently running.
	 */
	public static boolean isKDERunning() {
		// KDE_FULL_SESSION=true
		return "true".equals(System.getenv("KDE_FULL_SESSION"));
	}

	/**
	 * Checks for KDE4 flags in current env. There are few possible flags:
* {@code KDE_SESSION_VERSION=4
DESKTOP_SESSION=kde4
} If distro * for some readon don't set this flags - KDE3 is possibli * running.

* * There is one more way to determine current KDE version. We can run * {@code "konsole --version"} command and parse output, but KDE3 don't have * own env flags, so this command will run every time we using KDE3. * * @return {@code true} if KDE4 env flags found, {@code false} otherwise. */ private static boolean isKDE4Running() { if (!isKDERunning()) { throw new IllegalStateException("KDE is not running"); } return "4".equals(System.getenv("KDE_SESSION_VERSION")) || "kde4".equals(System.getenv("DESKTOP_SESSION")); } private static final String SANS_SERIF = "SansSerif"; private static FontSet fontSet = null; @Override public synchronized FontSet getFontSet() { if (fontSet == null) { fontSet = getInternalFontSet(); } return fontSet; } private FontSet getInternalFontSet() { // size is the most important, then family and then style int commonSize = 10; int menuSize = 10; int titleSize = 10; int commonStyle = Font.PLAIN; int menuStyle = Font.PLAIN; int titleStyle = Font.BOLD; String commonFamily = SANS_SERIF; String menuFamily = SANS_SERIF; String titleFamily = SANS_SERIF; // size is the most important, then family and then style /* * KDE4 can set common, menu, small and window title, while KDE3 can set * only common, menu and window title. But in KDE4 config files small * font is named "smallestReadableFont" */ // try { String kdeglobals = getFileContent("kdeglobals"); Pattern pattern = Pattern.compile(","); try { String fontParam = getIniParam(kdeglobals, "[General]", "font"); String[] fontParams = pattern.split(fontParam); commonFamily = fontParams[0]; commonSize = Integer.parseInt(fontParams[1]); boolean bold = "75".equals(fontParams[4]); boolean italic = "1".equals(fontParams[5]); if (bold && italic) { commonStyle = Font.BOLD + Font.ITALIC; } else if (italic) { commonStyle = Font.ITALIC; } else if (bold) { commonStyle = Font.BOLD; } else { commonStyle = Font.PLAIN; } } catch (Exception commonReadException) { commonFamily = SANS_SERIF; commonSize = 10; commonStyle = Font.PLAIN; } try { String menuFontParam = getIniParam(kdeglobals, "[General]", "menuFont"); String[] menuFontParams = pattern.split(menuFontParam); menuFamily = menuFontParams[0]; menuSize = Integer.parseInt(menuFontParams[1]); boolean bold = "75".equals(menuFontParams[4]); boolean italic = "1".equals(menuFontParams[5]); if (bold && italic) { menuStyle = Font.BOLD + Font.ITALIC; } else if (italic) { menuStyle = Font.ITALIC; } else if (bold) { menuStyle = Font.BOLD; } else { menuStyle = Font.PLAIN; } } catch (Exception menuReadException) { menuFamily = SANS_SERIF; menuSize = 10; menuStyle = Font.PLAIN; } try { String activeFontParam = getIniParam(kdeglobals, "[WM]", "activeFont"); String[] activeFontParams = pattern.split(activeFontParam); titleFamily = activeFontParams[0]; titleSize = Integer.parseInt(activeFontParams[1]); boolean bold = "75".equals(activeFontParams[4]); boolean italic = "1".equals(activeFontParams[5]); if (bold && italic) { titleStyle = Font.BOLD + Font.ITALIC; } else if (italic) { titleStyle = Font.ITALIC; } else if (bold) { titleStyle = Font.BOLD; } else { titleStyle = Font.PLAIN; } } catch (Exception titleReadException) { titleFamily = SANS_SERIF; titleSize = 10; titleStyle = Font.BOLD; } } catch (Exception kdeglobalsReadException) { commonFamily = SANS_SERIF; commonSize = 10; commonStyle = Font.PLAIN; menuFamily = SANS_SERIF; menuSize = 10; menuStyle = Font.PLAIN; titleFamily = SANS_SERIF; titleSize = 10; titleStyle = Font.BOLD; } // // double dcommonSize = commonSize; double dmenuSize = menuSize; double dtitleSize = titleSize; int dpi; try { String dpiParam = getIniParam(getFileContent("kcmfonts"), "[General]", "forceFontDPI"); dpi = Integer.parseInt(dpiParam); } catch (Exception dpiReadException) { dpi = 96; } // kcmfonts common for both KDE3 and KDE4 if (dpi <= 0) { dpi = 96; } if (dpi < 50) { dpi = 50; } dcommonSize = ((commonSize * dpi) / 72.0); dmenuSize = ((menuSize * dpi) / 72.0); dtitleSize = ((titleSize * dpi) / 72.0); commonSize = (int) (dcommonSize + 0.5); if (commonSize < 1) { commonSize = 1; } menuSize = (int) (dmenuSize + 0.5); if (menuSize < 1) { menuSize = 1; } titleSize = (int) (dtitleSize + 0.5); if (titleSize < 1) { titleSize = 1; } // Font commonFont = new FontSets.DefaultUIResourceFont(commonFamily, commonStyle, commonSize); Font menuFont = new FontSets.DefaultUIResourceFont(menuFamily, menuStyle, menuSize); Font titleFont = new FontSets.DefaultUIResourceFont(titleFamily, titleStyle, titleSize); return FontSets.createDefaultFontSet(commonFont, menuFont, commonFont, commonFont, commonFont, titleFont); } private String getIniParam(String content, String category, String param) throws Exception { // checking if our param in our category - we don't need same params // from other categories int categoryIndex = content.indexOf(category); // fix for defect 483 - https://substance.dev.java.net/issues/show_bug.cgi?id=483 // lineSeparator + String lineSeparator = System.getProperty("line.separator");// JDK7: System.lineSeparator() int nextCategoryIndex = content.indexOf(lineSeparator + '[', categoryIndex + 1); if (nextCategoryIndex < 0) { nextCategoryIndex = content.length(); } int paramIndex = content.indexOf(param, categoryIndex); if (paramIndex >= 0 && paramIndex < nextCategoryIndex) { // now paramString contains full string of our parameter int lineEnd = content.indexOf(lineSeparator, paramIndex); if (lineEnd <= 0) { lineEnd = content.length(); } String paramString = content.substring(paramIndex, lineEnd); // getting just our value, we don't need other symbols int equalityIndex = paramString.indexOf('='); /* * paramString.indexOf('#'); paramString.indexOf(';'); * * don't know do we need to remove trailing comments after this * symbols? have nothing similar in my system... */ String result = paramString.substring(equalityIndex + 1).trim(); if (result.length() > 0) { return result; } } throw new Exception("No such param in current category"); } private String getFileContent(String fileName) throws IOException { /* * preparing KDE home folder. KDE4 may be stored in .kde4 folder, and * may be in .kde. * * we check for .kde4 folder, if it exists - we will use it. Otherwise * we will left kdeHome empty, and it will be set to .kde in both cases * of KDE3 and KDE4 with .kde folder. */ String userHome = System.getProperty("user.home"); String kdeHome = null; if (isKDE4Running()) { File kdeHomeFolder = new File(userHome, ".kde4"); if (kdeHomeFolder.exists()) { kdeHome = ".kde4"; } } if (kdeHome == null) { kdeHome = ".kde"; } char fs = File.separatorChar; fileName = userHome + fs + kdeHome + "/share/config/" + fileName; if (fs != '/') { fileName = fileName.replace('/', fs); } // creating file from user home, using system's file separator: BufferedReader in = new BufferedReader(new FileReader(fileName)); StringBuilder sb = new StringBuilder(); // size same as inside BufferedReader code char[] buffer = new char[8192]; int read = 0; while ((read = in.read(buffer)) >= 0) { sb.append(buffer, 0, read); } in.close(); return sb.toString(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy