/* * 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 * benjamin_sigg@gmx.ch * CH - Switzerland */ package bibliothek.gui.dock.facile.mode; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import bibliothek.gui.Dockable; import bibliothek.gui.dock.support.mode.ModeSetting; import bibliothek.gui.dock.support.mode.ModeSettingFactory; import bibliothek.gui.dock.support.mode.ModeSettingsConverter; import bibliothek.util.Path; import bibliothek.util.Version; import bibliothek.util.xml.XElement; /** * Settings associated with a {@link MaximizedMode}. * @author Benjamin Sigg * */ public class MaximizedModeSetting implements ModeSetting<Location>{ /** factory creating new {@link MaximizedModeSetting}s */ public static ModeSettingFactory<Location> FACTORY = new ModeSettingFactory<Location>(){ public ModeSetting<Location> create(){ return new MaximizedModeSetting(); } public Path getModeId(){ return MaximizedMode.IDENTIFIER; } }; /** the mode in which some dockable with id=key was before maximizing */ private HashMap<String, Path> lastMaximizedMode = new HashMap<String, Path>(); /** the location some dockable had before maximizing */ private HashMap<String, Location> lastMaximizedLocation = new HashMap<String, Location>(); public Path getModeId(){ return MaximizedMode.IDENTIFIER; } /** * Sets the location of {@link Dockable}s that are maximized. This method makes a copy * of the map. * @param lastMaximizedLocation the map that is going to be copied */ public void setLastMaximizedLocation( Map<String, Location> lastMaximizedLocation ){ this.lastMaximizedLocation = new HashMap<String, Location>( lastMaximizedLocation ); } /** * Sets the mode of {@link Dockable}s that are maximized. This method makes a copy * of the map. * @param lastMaximizedMode the map that is going to be copied */ public void setLastMaximizedMode( Map<String, Path> lastMaximizedMode ){ this.lastMaximizedMode = new HashMap<String, Path>( lastMaximizedMode ); } /** * Gets the location of {@link Dockable}s that are currently maximized. * @return an unmodifiable map */ public Map<String, Location> getLastMaximizedLocation(){ return Collections.unmodifiableMap( lastMaximizedLocation ); } /** * Gets the modes of {@link Dockable}s that are currently maximized. * @return an unmodifiable map */ public Map<String, Path> getLastMaximizedMode(){ return Collections.unmodifiableMap( lastMaximizedMode ); } public <B> void write( DataOutputStream out, ModeSettingsConverter<Location, B> converter ) throws IOException{ Version.write( out, Version.VERSION_1_0_8 ); if( lastMaximizedMode == null ){ out.writeInt( 0 ); } else{ int count = 0; for( Path check : lastMaximizedMode.values() ){ if( check != null ){ count++; } } out.writeInt( count ); for( Map.Entry<String, Path> entry : lastMaximizedMode.entrySet() ){ if( entry.getValue() != null ){ out.writeUTF( entry.getKey() ); out.writeUTF( entry.getValue().toString() ); } } } if( lastMaximizedLocation == null ){ out.writeInt( 0 ); } else{ int count = 0; for( Location location : lastMaximizedLocation.values() ){ if( location != null ){ count++; } } out.writeInt( count ); for( Map.Entry<String, Location> entry : lastMaximizedLocation.entrySet() ){ if( entry.getValue() != null ){ out.writeUTF( entry.getKey() ); converter.writeProperty( converter.convertToSetting( entry.getValue() ), out ); } } } } public <B> void read( DataInputStream in, ModeSettingsConverter<Location, B> converter ) throws IOException { Version version = Version.read( in ); version.checkCurrent(); lastMaximizedLocation = new HashMap<String, Location>(); lastMaximizedMode = new HashMap<String, Path>(); int count = in.readInt(); for( int i = 0; i < count; i++ ){ String key = in.readUTF(); String value = in.readUTF(); lastMaximizedMode.put( key, new Path( value )); } count = in.readInt(); for( int i = 0; i < count; i++ ){ String key = in.readUTF(); Location location = converter.convertToWorld( converter.readProperty( in ) ); lastMaximizedLocation.put( key, location ); } } public <B> void write( XElement element, ModeSettingsConverter<Location, B> converter ) { Set<String> keys = new HashSet<String>(); if( lastMaximizedLocation != null ){ keys.addAll( lastMaximizedLocation.keySet() ); } if( lastMaximizedMode != null ){ keys.addAll( lastMaximizedMode.keySet() ); } if( !keys.isEmpty() ){ XElement xmaximized = element.addElement( "maximized" ); for( String key : keys ){ Path mode = lastMaximizedMode.get( key ); Location location = lastMaximizedLocation.get( key ); if( mode != null || location != null ){ XElement xitem = xmaximized.addElement( "item" ); xitem.addString( "id", key ); if( mode != null ){ xitem.addElement( "mode" ).setString( mode.toString() ); } if( location != null ){ converter.writePropertyXML( converter.convertToSetting( location ), xitem.addElement( "location" ) ); } } } } } public <B> void read( XElement element, ModeSettingsConverter<Location, B> converter ) { lastMaximizedLocation = new HashMap<String, Location>(); lastMaximizedMode = new HashMap<String, Path>(); XElement xmaximized = element.getElement( "maximized" ); if( xmaximized != null ){ for( XElement xitem : xmaximized.getElements( "item" )){ String key = xitem.getString( "id" ); XElement xmode = xitem.getElement( "mode" ); if( xmode != null ){ lastMaximizedMode.put( key, new Path( xmode.getString() )); } XElement xlocation = xitem.getElement( "location" ); if( xlocation != null ){ lastMaximizedLocation.put( key, converter.convertToWorld( converter.readPropertyXML( xlocation ) ) ); } } } } }