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

bibliothek.gui.dock.themes.DefaultThemeMeta Maven / Gradle / Ivy

/*
 * 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) 2011 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.themes;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import bibliothek.gui.DockController;
import bibliothek.gui.dock.util.TextManager;

/**
 * This default implementation of {@link ThemeMeta} uses the {@link TextManager} to read
 * label and description.
 * @author Benjamin Sigg
 */
public class DefaultThemeMeta implements ThemeMeta {
	/** the source of this meta */
	private ThemeFactory factory;
	/** the controller in whose realm this meta is used */
	private DockController controller;
	
	/** the user friendly name of the factory */
	private ThemeFactoryText name;
	/** a detailed description of the theme */
	private ThemeFactoryText description;

	/** the people creating the theme */
	private String[] authors;
	/** some webpages to show */
	private URI[] webpages;
	
	/** all the listeners currently registered */
	private List listeners = new ArrayList();
	
	/**
	 * Creates new meta information.
	 * @param factory the source of this information
	 * @param controller the controller to be used
	 * @param nameId the unique identifier of the name, will be used for the {@link TextManager}
	 * @param descriptionId the unique identifier of the description, will be used for the {@link TextManager}
	 * @param authors all the people creating the theme
	 * @param webpages additional webpages users may visit
	 */
	public DefaultThemeMeta( ThemeFactory factory, DockController controller, String nameId, String descriptionId, String[] authors, URI[] webpages ){
		this.factory = factory;
		this.controller = controller;
		this.authors = authors;
		this.webpages = webpages;
		
		name = new ThemeFactoryText( nameId, factory ){
			protected void changed( String oldValue, String newValue ){
				fireNameChanged();
			}
		};
		description = new ThemeFactoryText( descriptionId, factory ){
			protected void changed( String oldValue, String newValue ){
				fireDescriptionChanged();
			}
		};
	}
	
	/**
	 * Tells whether at least one {@link ThemeMetaListener} is registered at this {@link ThemeMeta}.
	 * @return true if there is at least one listener
	 */
	protected boolean hasListeners(){
		return listeners.size() > 0;
	}
	
	/**
	 * Invokes {@link ThemeMetaListener#nameChanged(ThemeMeta)} on all registered listeners.
	 */
	protected void fireNameChanged(){
		for( ThemeMetaListener listener : listeners.toArray( new ThemeMetaListener[ listeners.size() ] )){
			listener.nameChanged( this );
		}
	}
	
	/**
	 * Invokes {@link ThemeMetaListener#descriptionChanged(ThemeMeta)} on all registered listeners.
	 */
	protected void fireDescriptionChanged(){
		for( ThemeMetaListener listener : listeners.toArray( new ThemeMetaListener[ listeners.size() ] )){
			listener.descriptionChanged( this );
		}
	}
	
	
	/**
	 * Invokes {@link ThemeMetaListener#authorsChanged(ThemeMeta)} on all registered listeners.
	 */
	protected void fireAuthorChanged(){
		for( ThemeMetaListener listener : listeners.toArray( new ThemeMetaListener[ listeners.size() ] )){
			listener.authorsChanged( this );
		}
	}
	
	
	/**
	 * Invokes {@link ThemeMetaListener#webpagesChanged(ThemeMeta)} on all registered listeners.
	 */
	protected void fireWebpagesChanged(){
		for( ThemeMetaListener listener : listeners.toArray( new ThemeMetaListener[ listeners.size() ] )){
			listener.webpagesChanged( this );
		}
	}
	
	public ThemeFactory getFactory(){
		return factory;
	}
	
	public void setFactory( ThemeFactory factory ){
		this.factory = factory;	
	}
	
	public void addListener( ThemeMetaListener listener ){
		if( listener == null ){
			throw new IllegalArgumentException( "listener must not be null" );
		}
		if( listeners.size() == 0 ){
			name.setController( controller );
			description.setController( controller );
		}
		listeners.add( listener );
	}

	public void removeListener( ThemeMetaListener listener ){
		listeners.remove( listener );
		if( listeners.size() == 0 ){
			name.setController( null );
			description.setController( null );
		}
	}
	
	public void setAuthors( String[] authors ){
		this.authors = authors;
		fireAuthorChanged();
	}
	
	public String[] getAuthors(){
		return authors;
	}

	public String getDescription(){
		if( listeners.size() == 0 ){
			description.update( controller.getTexts() );
		}
		return description.value();
	}

	public String getName(){
		if( listeners.size() == 0 ){
			name.update( controller.getTexts() );
		}
		return name.value();
	}

	public void setWebpages( URI[] webpages ){
		this.webpages = webpages;
		fireWebpagesChanged();
	}
	
	public URI[] getWebpages(){
		return webpages;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy