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

bibliothek.gui.dock.facile.mode.status.DefaultExtendedModeEnablement Maven / Gradle / Ivy

Go to download

DockingFrames is an open source Java Swing docking framework, licenced under LGPL 2.1. This is the same distribution as the original distribution (http://www.docking-frames.org/), only reinstalled in maven

There is a newer version: 1.1.2p20b.fix-1
Show 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) 2009 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.facile.mode.status;

import java.util.List;

import bibliothek.gui.DockStation;
import bibliothek.gui.Dockable;
import bibliothek.gui.dock.common.event.CDockableAdapter;
import bibliothek.gui.dock.common.event.CDockablePropertyListener;
import bibliothek.gui.dock.common.intern.CDockable;
import bibliothek.gui.dock.common.intern.CommonDockable;
import bibliothek.gui.dock.common.mode.ExtendedMode;
import bibliothek.gui.dock.facile.mode.LocationModeManager;
import bibliothek.gui.dock.util.extension.ExtensionManager;
import bibliothek.gui.dock.util.extension.ExtensionName;
import bibliothek.util.Path;

/**
 * This default implementation observes {@link CDockable#isNormalizeable()}, {@link CDockable#isExternalizable()},
 * {@link CDockable#isMinimizable()} and {@link CDockable#isMaximizable()}.
 * @author Benjamin Sigg
 *
 */
public class DefaultExtendedModeEnablement extends AbstractExtendedModeEnablement{
	/**
	 * Name of an {@link ExtensionName} to add additional rules to this enablement. The extensions
	 * are of type {@link ExtendedModeEnablementFactory}.
	 */
	public static final Path EXTENSION = new Path( "dock.DefaultExtendedModeEnablement" );
	
	/**
	 * This factory creates new {@link DefaultExtendedModeEnablement}s.
	 */
	public static final ExtendedModeEnablementFactory FACTORY = new ExtendedModeEnablementFactory() {
		public ExtendedModeEnablement create( LocationModeManager manager ){
			return new DefaultExtendedModeEnablement( manager );
		}
	};
	
	/** added to any {@link CDockable} */
	private CDockablePropertyListener listener = new CDockableAdapter(){
		public void minimizableChanged( CDockable dockable ){ 
			fire( dockable.intern(), ExtendedMode.MINIMIZED, isAvailable( dockable.intern(), ExtendedMode.MINIMIZED ).isAvailable() );
		}
		
		public void maximizableChanged( CDockable dockable ){
			fire( dockable.intern(), ExtendedMode.MAXIMIZED, isAvailable( dockable.intern(), ExtendedMode.MAXIMIZED ).isAvailable() );
		}
		
		public void externalizableChanged( CDockable dockable ){
			fire( dockable.intern(), ExtendedMode.EXTERNALIZED, isAvailable( dockable.intern(), ExtendedMode.EXTERNALIZED ).isAvailable() );
		}
		
		public void normalizeableChanged( CDockable dockable ){
			fire( dockable.intern(), ExtendedMode.NORMALIZED, isAvailable( dockable.intern(), ExtendedMode.NORMALIZED ).isAvailable() );
		}
	};
	
	/** a listener added to all {@link #extensions} */
	private ExtendedModeEnablementListener extensionListener = new ExtendedModeEnablementListener(){
		public void availabilityChanged( Dockable dockable, ExtendedMode mode, boolean available ){
			fire( dockable, mode, isAvailable( dockable, mode ).isAvailable() );
		}
	};
	
	/** Additional rules loaded from the {@link ExtensionManager} */
	private ExtendedModeEnablement[] extensions;
	
	/**
	 * Creates a new enablement.
	 * @param manager the manager to observe
	 */
	public DefaultExtendedModeEnablement( LocationModeManager manager ){
		super( manager );
		init();
		List factories = manager.getController().getExtensions().load( new ExtensionName( EXTENSION, ExtendedModeEnablementFactory.class ));
		extensions = new ExtendedModeEnablement[ factories.size() ];
		int index = 0;
		for( ExtendedModeEnablementFactory factory : factories ){
			extensions[index] = factory.create( manager );
			extensions[index].addListener( extensionListener );
		}
	}
	
	@Override
	public void destroy(){
		for( ExtendedModeEnablement extension : extensions ){
			extension.removeListener( extensionListener );
			extension.destroy();
		}
		super.destroy();
	}
	
	@Override
	protected void connect( Dockable dockable ){
		if( dockable instanceof CommonDockable ){
			((CommonDockable)dockable).getDockable().addCDockablePropertyListener( listener );
		}
	}

	@Override
	protected void disconnect( Dockable dockable ){
		if( dockable instanceof CommonDockable ){
			((CommonDockable)dockable).getDockable().removeCDockablePropertyListener( listener );
		}
	}

	public Availability isAvailable( Dockable dockable, ExtendedMode mode ){
		Availability available = isModeAvailable( dockable, mode );
		for( ExtendedModeEnablement extension : extensions ){
			available = available.strongest( extension.isAvailable( dockable, mode ) );
		}
		return available;
	}
	
	public Hidden isHidden( Dockable dockable, ExtendedMode mode ){
		Hidden hidden = Hidden.WEAK_VISIBLE;
		for( ExtendedModeEnablement extension : extensions ){
			hidden = hidden.strongest( extension.isHidden( dockable, mode ) );
		}
		return hidden;
	}
	
	/**
	 * The actual implementation of {@link ExtendedModeEnablement#isAvailable(Dockable, ExtendedMode)}
	 * @param dockable the item whose mode should be checked
	 * @param mode the mode to check
	 * @return whether mode is available or not
	 */
	protected Availability isModeAvailable( Dockable dockable, ExtendedMode mode ){
		if( dockable instanceof CommonDockable ){
			CDockable cdockable = ((CommonDockable)dockable).getDockable();
			
			boolean result = false;
			boolean set = false;
			
			if( mode == ExtendedMode.EXTERNALIZED ){
				result = cdockable.isExternalizable();
				set = true;
			}
			else if( mode == ExtendedMode.MAXIMIZED ){
				result = cdockable.isMaximizable();
				set = true;
			}
			else if( mode == ExtendedMode.MINIMIZED ){
				result = cdockable.isMinimizable();
				set = true;
			}
			else if( mode == ExtendedMode.NORMALIZED ){
				result = cdockable.isNormalizeable();
				set = true;
			}
			
			if( set ){
				if( result ){
					return Availability.WEAK_AVAILABLE;
				}
				else{
					return Availability.WEAK_FORBIDDEN;
				}
			}
		}
		
		DockStation station = dockable.asDockStation();
		if( station != null ){
			for( int i = 0, n = station.getDockableCount(); i




© 2015 - 2024 Weber Informatics LLC | Privacy Policy