bibliothek.gui.dock.util.icon.DefaultIconScheme Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of docking-frames-core Show documentation
Show all versions of docking-frames-core Show documentation
A window docking framework for Swing
The newest version!
/*
* Bibliothek - DockingFrames
* Library built on Java/Swing, allows the user to "drag and drop"
* panels containing any Swing-Component the developer likes to add.
*
* Copyright (C) 2010 Benjamin Sigg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Benjamin Sigg
* [email protected]
* CH - Switzerland
*/
package bibliothek.gui.dock.util.icon;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.Icon;
import bibliothek.gui.DockController;
import bibliothek.gui.DockUI;
import bibliothek.gui.dock.station.stack.tab.TabMenuDockIcon;
import bibliothek.gui.dock.themes.icon.TabMenuOverflowIconBridge;
import bibliothek.gui.dock.util.DockUtilities;
import bibliothek.gui.dock.util.UIProperties;
import bibliothek.gui.dock.util.UIScheme;
import bibliothek.gui.dock.util.UISchemeEvent;
import bibliothek.util.Path;
/**
* This default implementation of an {@link UIScheme} for {@link Icon}s reads an ini-file
* which consists of "key=icon-path" pairs, and loads all the icons described in that
* ini file when needed.
* @author Benjamin Sigg
*/
public class DefaultIconScheme extends AbstractIconScheme {
private Map icons;
private Map bridges;
/**
* A helper class describing a source for icons
* @author Benjamin Sigg
*/
public static class IconResource{
private String fileName;
private String path;
private ClassLoader loader;
/**
* Creates a new source for icons
* @param fileName the name of the file that contains "key=path" values
* @param path the prefix of the paths that are found in the file
* @param loader the {@link ClassLoader} to load the icons
*/
public IconResource( String fileName, String path, ClassLoader loader ){
if( fileName == null ){
throw new IllegalArgumentException( "fileName must not be null" );
}
this.fileName = fileName;
this.path = path;
if( loader == null ){
loader = DefaultIconScheme.class.getClassLoader();
}
this.loader = loader;
}
/**
* Gets the name of the file with the "key=path" values.
* @return the file name
*/
public String getFileName(){
return fileName;
}
/**
* Gets the prefix of the paths that are found in the icons file.
* @return the prefix, can be null
*/
public String getPath(){
return path;
}
/**
* Gets the {@link ClassLoader} which should be used to load files
* @return the class loader
*/
public ClassLoader getLoader(){
return loader;
}
}
/**
* Creates a new scheme loading first the contents of the ini file file
and
* then the icons that are found by analyzing the content of file
.
* If no file is found, then this scheme just remains empty.
* @param file the file to read
* @param controller the {@link DockController} in whose realm this scheme will be used
*/
public DefaultIconScheme( String file, DockController controller ){
this( file, DefaultIconScheme.class.getClassLoader(), controller );
}
/**
* Creates a new scheme loading first the contents of the ini file file
and
* then the icons that are found by analyzing the content of file
.
* If no file is found, then this scheme just remains empty.
* @param file the file to read
* @param loader the {@link ClassLoader} whose {@link ClassLoader#getResource(String)} method
* will be used to load any files
* @param controller the {@link DockController} in whose realm this scheme will be used
*/
public DefaultIconScheme( String file, ClassLoader loader, DockController controller ){
this( controller, new IconResource( file, null, loader ));
}
/**
* Creates a new scheme loading icons from all the specified resources.
* @param controller the {@link DockController} in whose realm this scheme will be used
* @param resources a list of files with "key=path" lines telling key and path of the icons to load. If a key
* appears more than once, then the last occurance of the key wins
*/
public DefaultIconScheme( DockController controller, IconResource... resources ){
super( controller );
icons = new HashMap();
bridges = new HashMap();
initHardcoded();
for( int i = resources.length-1; i >= 0; i-- ){
icons.putAll( DockUtilities.loadIcons( resources[i].getFileName(), resources[i].getPath(), icons.keySet(), resources[i].getLoader() ) );
}
}
/**
* Called by the constructor of this class, initializes some hard coded icons.
*/
protected void initHardcoded(){
setBridge( TabMenuDockIcon.KIND_TAB_MENU, new TabMenuOverflowIconBridge() );
setIcon( DockUI.OVERFLOW_MENU_ICON, new Icon(){
public int getIconHeight(){
return 7;
}
public int getIconWidth(){
return 9;
}
public void paintIcon( Component c, Graphics g, int x, int y ){
g = g.create();
((Graphics2D)g).setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
g.setColor( c.getForeground() );
g.fillPolygon(
new int[]{ x + 1, x + 8, x + 4 },
new int[]{ y + 1, y + 1, y + 6 }, 3 );
g.dispose();
}
});
}
public DockIconBridge getBridge( Path name, UIProperties properties ){
return bridges.get( name );
}
public Icon getResource( String name, UIProperties properties ){
return icons.get( name );
}
/**
* Changes the icon with name name
to icon
. Please note that if
* name
was {@link #link(bibliothek.gui.dock.util.PropertyKey, String) linked}, the newly
* set value may be overriden again.
* @param name the unique key of the icon
* @param icon the new icon, can be null
*/
public void setIcon( String name, Icon icon ){
changed( name, icon );
}
/**
* Sets the {@link DockIconBridge} with type type
.
* @param type the unique identifier of the type that should be handled by the new bridge
* @param bridge the new bridge or null
*/
public void setBridge( final Path type, DockIconBridge bridge ){
if( bridge == null ){
bridges.remove( type );
}
else{
bridges.put( type, bridge );
}
fire( new UISchemeEvent(){
public Collection changedBridges( Set names ){
List result = new ArrayList();
if( names == null || names.contains( type )){
result.add( type );
}
return result;
}
public Collection changedResources( Set names ){
return Collections.emptySet();
}
public UIScheme getScheme(){
return DefaultIconScheme.this;
}
});
}
@Override
protected void changed( final String id, Icon icon ){
if( icon == null ){
icons.remove( id );
}
else{
icons.put( id, icon );
}
fire( new UISchemeEvent(){
public UIScheme getScheme(){
return DefaultIconScheme.this;
}
public Collection changedResources( Set names ){
List list = new ArrayList( 1 );
if( names == null || names.contains( id )){
list.add( id );
}
return list;
}
public Collection changedBridges( Set names ){
return Collections.emptySet();
}
});
}
}