001 /* 002 * steelme theme manager for Java 003 * Copyright (C) 2000 - 2004 T.J. Willis 004 * 005 * This program is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU General Public License 007 * as published by the Free Software Foundation; either version 2 008 * of the License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU General Public License for more details. 014 * 015 * You should have received a copy of the GNU General Public License 016 * along with this program; if not, write to the Free Software 017 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. 018 * 019 * $Header: /cvsroot/steelme/steelme/src/net/sourceforge/steelme/ThemeMenu.java,v 1.3 2004/05/27 23:11:09 tj_willis Exp $ 020 */ 021 package net.sourceforge.steelme; 022 023 import java.awt.*; 024 import java.awt.event.*; 025 import javax.swing.*; 026 import javax.swing.plaf.*; 027 import javax.swing.plaf.metal.*; 028 import java.io.*; 029 import java.util.*; 030 import org.apache.log4j.*; 031 032 /** 033 * Describe class <code>ThemeMenu</code> here. 034 * 035 *@author <a href="mailto:tj_willis@users.sourceforge.net">T.J. Willis</a> 036 *@created May 31, 2004 037 *@version 1.0 038 *@has 1..n Has - net.sourceforge.steelme.ThemeResistantJMenuItem 039 *@has 1..n Has - net.sourceforge.steelme.SteelmeTheme 040 *@has 1 Has - net.sourceforge.steelme.ThemeFileFilter 041 */ 042 public class ThemeMenu 043 extends JMenu 044 implements ActionListener { 045 private JComponent targ; 046 private JMenuItem editor; 047 private JMenuItem reload; 048 private static Category cat 049 = Category.getInstance(SteelmeTheme.class.getName()); 050 private File themeDir; 051 052 053 /** 054 * Creates a new <code>ThemeMenu</code> instance. 055 * 056 *@throws IllegalArgumentException if themeDir isn't a directory or has 057 * no files. 058 *@param target a <code>JFrame</code> value 059 *@param themeDir a <code>File</code> value 060 */ 061 public ThemeMenu(JComponent target, File themeDir) { 062 super("Themes"); 063 targ = target; 064 this.themeDir = themeDir; 065 init(); 066 } 067 068 069 /** 070 * Adds (or re-adds) all installed themes, editor item, and reload item. 071 * 072 * @throws IllegalArgumentException if themeDir isn't a directory or has 073 * no files. 074 */ 075 private void init() { 076 //assert themeDir.isDirectory(): "Not a directory"; 077 if (!themeDir.isDirectory()) { 078 throw new IllegalArgumentException("Given directory " + themeDir + " is not a directory"); 079 } 080 File fileArr[] = themeDir.listFiles(); 081 if (fileArr == null) { 082 throw new IllegalArgumentException("Given directory " + themeDir + " has no files"); 083 } 084 int mySize = java.lang.reflect.Array.getLength(fileArr); 085 if (mySize == 0) { 086 //FIXME: might be redundant, check dir with 0 files 087 throw new IllegalArgumentException("Given directory " + themeDir + " has no files"); 088 } 089 this.removeAll(); 090 JMenu sub = new JMenu("Installed Themes"); 091 add(sub); 092 ThemeFileFilter filter = new ThemeFileFilter(); 093 094 //for(File f: fileArr) { 095 for (int i = 0; i < mySize; i++) { 096 File f = fileArr[i]; 097 if (f == null || f.isDirectory()) { 098 continue; 099 } 100 if ((filter != null) && (!filter.accept(f))) { 101 continue; 102 } 103 104 try { 105 SteelmeTheme t = new SteelmeTheme(f); 106 if (t == null) { 107 continue; 108 } 109 ThemeResistantJMenuItem it 110 = new ThemeResistantJMenuItem(t.getName()); 111 it.setMyBackground(t.getS3()); 112 it.setMyForeground(t.getT1()); 113 it.setMyFont(t.getControlTextFont()); 114 it.setActionCommand(f.getCanonicalPath()); 115 it.addActionListener(this); 116 sub.add(it); 117 } catch (Exception ex) { 118 cat.warn("Theme loading exception: " + f, ex); 119 } 120 } 121 reload = new JMenuItem("Reload Themes"); 122 add(reload); 123 reload.addActionListener(this); 124 editor = new JMenuItem("Theme Editor"); 125 add(editor); 126 editor.addActionListener(this); 127 } 128 129 130 /** 131 * Adds a feature to the Frame attribute of the ThemeMenu object 132 * 133 *@param f The feature to be added to the Frame attribute 134 */ 135 private void addFrame(JFrame frame) { 136 frame.setVisible(true); 137 frame.pack(); 138 } 139 140 141 /** 142 * Describe <code>actionPerformed</code> method here. 143 * 144 *@param c an <code>ActionEvent</code> value 145 */ 146 public void actionPerformed(ActionEvent evt) { 147 Object source = evt.getSource(); 148 149 if (source.equals(editor)) { 150 ThemeEditor editor = new ThemeEditor(targ.getRootPane()); 151 addFrame(editor); 152 javax.swing.SwingUtilities.updateComponentTreeUI(targ.getRootPane()); 153 } else if (source.equals(reload)) { 154 init(); 155 } else { 156 File themeFile = new File(evt.getActionCommand()); 157 SteelmeTheme theme = new SteelmeTheme(themeFile); 158 SteelmeThemeManager.setCurrentTheme(theme); 159 if (targ != null) { 160 theme.applyTheme(targ); 161 } 162 init(); 163 } 164 } 165 } 166 167