controlp5/src/controlP5/ControllerLayout.java
2016-04-14 18:39:16 +08:00

180 lines
6.1 KiB
Java
Executable File

package controlP5;
/**
* controlP5 is a processing gui library.
*
* 2006-2015 by Andreas Schlegel
*
* 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., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA
*
* @author Andreas Schlegel (http://www.sojamo.de)
* @modified ##date##
* @version ##version##
*
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.logging.Logger;
class ControllerLayout {
private ControlP5 cp5;
public static final Logger logger = Logger.getLogger( ControllerLayout.class.getName( ) );
static {
Map< Class< ? > , Class< ? >> datatypes = new HashMap< Class< ? > , Class< ? >>( );
datatypes.put( Integer.class , int.class );
datatypes.put( Float.class , float.class );
datatypes.put( Boolean.class , boolean.class );
datatypes.put( Character.class , char.class );
datatypes.put( Long.class , long.class );
datatypes.put( Double.class , double.class );
datatypes.put( Byte.class , byte.class );
datatypes.put( CColor.class , CColor.class );
}
ControllerLayout( ControlP5 theControlP5 ) {
cp5 = theControlP5;
}
public void save( String theLayoutPath ) {
theLayoutPath = cp5.checkPropertiesPath( theLayoutPath );
Class< ? >[] classes = new Class< ? >[] { RadioButton.class , ListBox.class , ColorPicker.class , DropdownList.class };
HashSet< ControllerLayoutElement > layoutelements = new HashSet< ControllerLayoutElement >( );
for ( ControllerInterface< ? > c : cp5.getList( ) ) {
if ( !Arrays.asList( classes ).contains( c.getParent( ).getClass( ) ) ) {
layoutelements.add( new ControllerLayoutElement( c ) );
System.out.print( c.getAddress( ) );
System.out.print( " (" + c.getName( ) + ") " );
System.out.print( "\tpos:" + Controller.x( c.getPosition( ) ) + "," + Controller.y( c.getPosition( ) ) );
System.out.print( "\tdim:" + c.getWidth( ) + "," + c.getHeight( ) );
System.out.print( "\tparent:" + c.getParent( ) );
System.out.println( "\tclass:" + c.getClass( ).getSimpleName( ) );
}
}
try {
FileOutputStream fos = new FileOutputStream( theLayoutPath );
ObjectOutputStream oos = new ObjectOutputStream( fos );
logger.info( "Saving layout-items to " + theLayoutPath );
oos.writeInt( layoutelements.size( ) );
for ( ControllerLayoutElement ce : layoutelements ) {
oos.writeObject( ce );
}
oos.flush( );
oos.close( );
fos.close( );
} catch ( Exception e ) {
logger.warning( "Exception during serialization: " + e );
}
}
protected boolean isClassAssignableFromSuperclass( Class< ? > theClass , Class< ? > theSuper ) {
Class< ? > _mySuper = theClass.getSuperclass( );
while ( _mySuper.getSuperclass( ) != null ) {
if ( _mySuper.isAssignableFrom( theSuper ) ) {
return true;
}
_mySuper = _mySuper.getSuperclass( );
}
return false;
}
public void load( String theLayoutPath ) {
theLayoutPath = cp5.checkPropertiesPath( theLayoutPath );
ArrayList< ControllerLayoutElement > list = new ArrayList< ControllerLayoutElement >( );
try {
FileInputStream fis = new FileInputStream( theLayoutPath );
ObjectInputStream ois = new ObjectInputStream( fis );
int size = ois.readInt( );
logger.info( "loading " + size + " layout-items." + fis.getFD( ) );
for ( int i = 0 ; i < size ; i++ ) {
try {
ControllerLayoutElement ce = ( ControllerLayoutElement ) ois.readObject( );
list.add( ce );
} catch ( Exception e ) {
logger.warning( "skipping a property, " + e );
}
}
ois.close( );
} catch ( Exception e ) {
logger.warning( "Exception during deserialization: " + e );
}
for ( ControllerLayoutElement ce : list ) {
/* ControllerInterface ci = cp5.getController(ce.getName());
* if (ci == null) {
* try {
* if (isClassAssignableFromSuperclass(ce.getType(), ControllerGroup.class)) {
* ControllerGroup c = (ControllerGroup) cp5.addGroup(null, "", ce.getName(), ce.getType(), ce.getX(), ce.getY(), ce.getWidth(),
* ce.getHeight());
* c.setWidth(ce.getWidth());
* c.setHeight(ce.getHeight());
* if (c instanceof ListBox) {
* System.out.println("found listbox or dropdownlist!");
* ((ListBox) c).setHeight(200);
* ((ListBox) c).setBarHeight(ce.getHeight());
* }
* } else {
* Controller c = (Controller) cp5.addController(ce.getName(), ce.getType(), ce.getX(), ce.getY());
* c.setWidth(ce.getWidth());
* c.setHeight(ce.getHeight());
* }
* } catch (Exception e) {
*
* }
* }
* ci = cp5.get(ce.getName());
* if (ci != null) {
* ci.setAddress(ce.getAddress());
* System.out.println("name:" + ce.getName() + "\tparent:" + ce.getParent() + "\telement:" + ci + "\ttype:" + ce.getType() + "\t" +
* ce.getHeight());
* } else {
* System.out.println("could not create " + ce.getName() + "," + ce.getType());
* }
* // if(cp5.get(ce.getName()) instanceof DropdownList) {
* // DropdownList dl = (DropdownList)(cp5.get(ce.getName()));
* // dl.setHeight(200);
* // } */
}
for ( ControllerLayoutElement ce : list ) {
/* ControllerInterface ci = cp5.get(ce.getName());
* if (ci != null) {
* ControllerGroup g = cp5.getGroup(ce.getParent());
* if (g == null) {
* g = cp5.getTab(ce.getParent());
* }
* if (g != null) {
* ci.moveTo(g);
* }
* } */
}
}
}