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

com.pagosoft.plaf.ThemeFactory Maven / Gradle / Ivy

/*
 * Copyright 2005 Patrick Gotthardt
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.pagosoft.plaf;

import com.pagosoft.OS;
import com.pagosoft.plaf.themes.ElegantGrayTheme;
import com.pagosoft.plaf.themes.SilverTheme;
import com.pagosoft.plaf.themes.VistaTheme;
import com.pagosoft.plaf.themes.NativeColorTheme;
import com.pagosoft.swing.ColorUtils;

import java.awt.Color;
import java.awt.Insets;
import java.io.*;
import java.util.*;
import java.util.regex.*;

public class ThemeFactory {
	public static final PgsTheme GRAY = createTheme("Gray", new Color(0x7997D1), new Color(0xABABAB), Color.black);
	public static final PgsTheme YELLOW = createTheme("Yellow", new Color(0xCCAA53), new Color(0xABABAB), Color.black);
	public static final PgsTheme RUBY = createTheme("Ruby", new Color(244, 10, 66), new Color(0xABABAB), Color.black);
	public static final PgsTheme GOLD = createTheme("Gold", new Color(0xFFDB29));
	public static final PgsTheme WIN = new PgsTheme(
			"Win",
			new Color(0x6080AC),  // p1
			new Color(0xFFCF31),  // p2
			new Color(0xF9E089),  // p3

			new Color(0x666554),
			new Color(0xDCDBCB),
			new Color(0xF1F0E3),
			Color.black,
			Color.white,
			getWinCustomEntries()
	);
	public static final PgsTheme GREEN = createTheme("Green", new Color(0x986847), new Color(0xEFEBE7), Color.BLACK);

	private static Object[] getWinCustomEntries() {
		Color s2 = new Color(0xDCDBCB);
		Color s3 = new Color(0xF1F0E3);
		Color p2 = new Color(0xF9E089);
		Color p3 = new Color(0xFFCF31);
		return new Object[]{
				"Button.rolloverGradientStart", Color.white,
				"Button.rolloverGradientEnd", s2,
				"Button.selectedGradientStart", p3,
				"Button.selectedGradientEnd", p2,

				"ToggleButton.rolloverGradientStart", Color.white,
				"ToggleButton.rolloverGradientEnd", s2,
				"ToggleButton.selectedGradientStart", p3,
				"ToggleButton.selectedGradientEnd", p2,

				"ToolBar.gradientStart", s3,
				"ToolBar.gradientEnd", s2,

				"ToolBarButton.rolloverGradientStart", p3,
				"ToolBarButton.rolloverGradientEnd", p2,
				"ToolBarButton.selectedGradientStart", p2,
				"ToolBarButton.selectedGradientEnd", p3,

				"ScrollBar.thumb", p3,
				"ScrollBar.thumbHighlight", p3.brighter(),

				"ProgressBar.gradientStart", p3,
				"ProgressBar.gradientEnd", p3.brighter()
		};
	}

	public static PgsTheme createTheme(Color primary) {
		return ThemeFactory.createTheme("PgsTheme", primary);
	}

	public static PgsTheme createTheme(String name, Color primary) {
		Color[] cs = ColorUtils.mixColors(primary);
		return new PgsTheme(
				name,
				cs[2], cs[1], cs[0], // pri
				cs[5], cs[4], cs[3], // sec
				cs[8], cs[7]); // black 'n white
	}

	public static PgsTheme createTheme(Color primary, Color secondary, Color text) {
		return ThemeFactory.createTheme("Custom PgsTheme", primary, secondary, text);
	}

	public static PgsTheme getDefaultTheme() {
		// I've been focusing development towards this theme so it should be in the best
		// state of all existing themes.
		return new SilverTheme();
	}

	public static PgsTheme createTheme(String name, Color primary, Color secondary, Color text) {
		return new PgsTheme(
				name,
				primary.darker(),	  // p1
				primary,			  // p2
				primary.brighter(),   // p3

				secondary.darker(),   // s1
				secondary,			  // s2
				secondary.brighter(), // s3
				text,
				ColorUtils.oposite(text)
		);
	}

	/**
	 * 

Supported formats are:
* {@code colors: [primary], [secondary], [text]}
* {@code theme: [gray|ruby|win|yellow|gold]}
* {@code res: [theme_source_file]}

*/ public static PgsTheme getTheme(String theme) { if (theme == null) { throw new IllegalArgumentException("theme must not be null!"); } if (theme.startsWith("theme:")) { String name = theme.substring(5).trim(); return ThemeFactory.getThemeByName(name); } else if (theme.startsWith("colors:")) { String colors = theme.substring(6).trim(); return ThemeFactory.getThemeByColors(colors); } else if (theme.startsWith("res:")) { String res = theme.substring(4).trim(); File f = new File(res); if (f.exists()) { Properties props = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream(f); props.load(fis); fis.close(); return ThemeFactory.createTheme(props); } catch (Exception ex) { ex.printStackTrace(); return getDefaultTheme(); } finally { if(fis != null) { try { fis.close(); } catch(IOException e) { e.printStackTrace(); } } } } else { return getDefaultTheme(); } } else if(theme.length() > 0) { return ThemeFactory.getThemeByName(theme); } return ThemeFactory.getDefaultTheme(); } public static PgsTheme getThemeByName(String theme) { theme = theme.toLowerCase(); if ("ruby".equals(theme)) { return ThemeFactory.RUBY; } else if ("win".equals(theme)) { return ThemeFactory.WIN; } else if ("yellow".equals(theme)) { return ThemeFactory.YELLOW; } else if ("gold".equals(theme)) { return ThemeFactory.GOLD; } else if("gray".equals(theme)) { return ThemeFactory.GRAY; } else if("green".equals(theme)) { return ThemeFactory.GREEN; } else if("elegantgray".equals(theme)) { return ElegantGrayTheme.getInstance(); } else if("silver".equals(theme)) { return new SilverTheme(); } else if("vista".equals(theme)) { return new VistaTheme(); } else { try { Class cls = Class.forName(theme); if(PgsTheme.class.isAssignableFrom(cls)) { return (PgsTheme) cls.newInstance(); } } catch(ClassNotFoundException e) { // ignore } catch(IllegalAccessException e) { // ignore } catch(InstantiationException e) { // ignore } } return ThemeFactory.getDefaultTheme(); } public static PgsTheme getThemeByColors(String colors) { String[] color = colors.split(",?\\s*"); if (color.length != 2) { throw new IllegalArgumentException( "Theme has the wrong format: '" + colors + "', but should be '[primary], [secondary], [text]'"); } return ThemeFactory.createTheme( Color.decode(color[0]), Color.decode(color[1]), Color.decode(color[2]) ); } // This Pattern splits on any whitespace and "," private static final Pattern SPLIT = Pattern.compile("\\s*,?\\s*"); public static PgsTheme createTheme(Map map) { ArrayList data = new ArrayList(); Iterator i = map.keySet().iterator(); String value; String key; String name = "Custom PgsTheme"; Color p1 = null, p2 = null, p3 = null, s1 = null, s2 = null, s3 = null, bl = Color.black, wh = Color.white; while (i.hasNext()) { key = i.next().toString(); value = map.get(key).toString(); if (key.equals("name")) { name = value; } else if (key.equals("primary1")) { p1 = Color.decode(value); } else if (key.equals("primary2")) { p2 = Color.decode(value); } else if (key.equals("primary3")) { p3 = Color.decode(value); } else if (key.equals("secondary1")) { s1 = Color.decode(value); } else if (key.equals("secondary2")) { s2 = Color.decode(value); } else if (key.equals("secondary3")) { s3 = Color.decode(value); } else if (key.equals("black")) { bl = Color.decode(value); } else if (key.equals("white")) { wh = Color.decode(value); } else if(!key.startsWith("pgs.") && !key.startsWith("swing.")) { data.add(key); if (value.startsWith("#")) { data.add(Color.decode(value)); } else if (value.equals("true")) { data.add(Boolean.TRUE); } else if (value.equals("false")) { data.add(Boolean.FALSE); } else { String val[] = SPLIT.split(value); switch (val.length) { case 1: int in = Integer.parseInt(val[0]); data.add(new Insets(in, in, in, in)); break; case 2: int in1 = Integer.parseInt(val[0]); int in2 = Integer.parseInt(val[1]); data.add(new Insets(in1, in2, in1, in2)); break; case 4: data.add( new Insets( Integer.parseInt(val[0]), Integer.parseInt(val[1]), Integer.parseInt(val[2]), Integer.parseInt(val[3]))); break; } } } } if(p1 != null && p2 != null && p3 != null && s1 != null && s2 != null && s3 != null) { return new PgsTheme(name, p1, p2, p3, s1, s2, s3, bl, wh, data.toArray()); } return ThemeFactory.getDefaultTheme(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy