Package bibliothek.gui.dock.facile.mode.status

Source Code of bibliothek.gui.dock.facile.mode.status.DefaultExtendedModeEnablement

/*
* 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
* benjamin_sigg@gmx.ch
* 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<ExtendedModeEnablementFactory> factories = manager.getController().getExtensions().load( new ExtensionName<ExtendedModeEnablementFactory>( 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 <code>mode</code> 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<n; i++ ){
        Availability result = isModeAvailable( station.getDockable( i ), mode );
        if( result != Availability.UNCERTAIN ){
          return result;
        }
      }
    }
   
    return Availability.UNCERTAIN;
  }
}
TOP

Related Classes of bibliothek.gui.dock.facile.mode.status.DefaultExtendedModeEnablement

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.