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

bibliothek.paint.Core 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) 2007 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.paint;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.WindowConstants;

import bibliothek.demonstration.Monitor;
import bibliothek.gui.dock.common.CControl;
import bibliothek.gui.dock.common.menu.CLayoutChoiceMenuPiece;
import bibliothek.gui.dock.common.menu.CLookAndFeelMenuPiece;
import bibliothek.gui.dock.common.menu.CPreferenceMenuPiece;
import bibliothek.gui.dock.common.menu.CThemeMenuPiece;
import bibliothek.gui.dock.common.menu.SingleCDockableListMenuPiece;
import bibliothek.gui.dock.facile.menu.RootMenuPiece;
import bibliothek.gui.dock.facile.menu.SubmenuPiece;
import bibliothek.gui.dock.support.menu.SeparatingMenuPiece;
import bibliothek.paint.model.PictureRepository;
import bibliothek.paint.util.Resources;
import bibliothek.paint.view.ViewManager;
import bibliothek.util.xml.XElement;
import bibliothek.util.xml.XIO;

/**
 * Class used to startup an application.
 * @author Benjamin Sigg
 *
 */
public class Core {
    /** whether the application runs in a secure environment or not */
    private boolean secure;
    
    /** the manager managing all the elements of the view */
    private ViewManager view;
    
    /** whether to use a xml or a binary file to store persistent data */
    private boolean formatXML = true;
    
    /**
     * Creates a new core.
     * @param secure whether the application runs in a secure environment or not
     */
    public Core( boolean secure ){
        this.secure = secure;
    }
    
    /**
     * Starts a new main-frame.
     * @param monitor the callback informing the caller about the state
     * of this application
     */
    public void startup( final Monitor monitor ){
        if( monitor != null )
            monitor.startup();
        final JFrame frame = new JFrame( "Paint" );
        frame.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
        frame.setIconImage( Resources.toImage( Resources.getIcon( "application" ) ) );
        
        final CControl control = new CControl( frame, secure );

        RootMenuPiece settings = new RootMenuPiece( "View", false );
        settings.add( new SingleCDockableListMenuPiece( control ));
        settings.add( new SeparatingMenuPiece( new CLayoutChoiceMenuPiece( control, false ), true, false, false ));
        
        RootMenuPiece layout = new RootMenuPiece( "Layout", false );
        layout.add( new SubmenuPiece( "LookAndFeel", true, new CLookAndFeelMenuPiece( control )));
        layout.add( new SubmenuPiece( "Layout", true, new CThemeMenuPiece( control )));
        layout.add( CPreferenceMenuPiece.setup( control ));
        
        JMenuBar bar = new JMenuBar();
        bar.add( settings.getMenu() );
        bar.add( layout.getMenu() );

        frame.setJMenuBar( bar );
        
        frame.getContentPane().add( control.getContentArea() );
        
        PictureRepository pictures = new PictureRepository();
        view = new ViewManager( control, pictures );
        
        frame.setBounds( 20, 20, 600, 500 );
        
        // read and write settings
        if( secure ){
            // InputStream in = Core.class.getResourceAsStream( "/data/bibliothek/paint/config.xml" );
            InputStream in = Core.class.getResourceAsStream( "/data/bibliothek/paint/config.xml" );
            if( in != null ){
                try{
                	if( formatXML ){
	                    readXML( XIO.readUTF( in ) );
	                    in.close();
                	}
                	else{
	                    DataInputStream dataIn = new DataInputStream( in );
	                    read( dataIn );
	                    dataIn.close();
                	}
                }
                catch( IOException ex ){
                    ex.printStackTrace();
                }
            }
        }
        else{
            try{
            	if( formatXML ){
	                InputStream in = new BufferedInputStream( new FileInputStream( "config.xml" ));
	                readXML( XIO.readUTF( in ) );
	                in.close();
            	}
            	else{
            		DataInputStream in = new DataInputStream( new FileInputStream( "paint.config" ));
            		read( in );
            		in.close();
            	}
            }
            catch( IOException ex ){
                ex.printStackTrace();
            }
        }
        
        view.getWorkingArea().setVisible( true );
        
        frame.addWindowListener( new WindowAdapter(){
            @Override
            public void windowClosing( WindowEvent e ) {
                try{
                    frame.dispose();
                    
                    if( !secure ){
                        try{
                        	if( formatXML ){
	                            XElement element = new XElement( "config" );
	                            writeXML( element );
	                            OutputStream out = new BufferedOutputStream( new FileOutputStream( "config.xml" ));
	                            XIO.writeUTF( element, out );
                        	}
                        	else{
	                            DataOutputStream out = new DataOutputStream( new FileOutputStream( "paint.config" ));
	                            write( out );
	                            out.close();
                        	}
                        }
                        catch( IOException ex ){
                            ex.printStackTrace();
                        }
                    }
                    
                    view.getControl().destroy();
                }
                finally{
                    if( monitor != null ){
                        monitor.shutdown();
                    }
                    else{
                        System.exit( 0 );
                    }
                }
            }
        });
        
        // startup finished
        frame.setVisible( true );
        if( monitor != null )
            monitor.running();
    }
    
    /**
     * Writes all the settings of this application.
     * @param out the stream to write into
     * @throws IOException if an I/O error occurs
     */
    public void write( DataOutputStream out ) throws IOException{
        view.getPictures().write( out );
        view.getControl().getResources().writeStream( out );
    }
    
    /**
     * Writes all the settings of this application.
     * @param element the xml element to write into
     */
    public void writeXML( XElement element ){
        view.getPictures().writeXML( element.addElement( "pictures" ) );
        view.getControl().getResources().writeXML( element.addElement( "resources" ) );
    }
    
    /**
     * Reads all the settings of this application.
     * @param in the stream to read from
     * @throws IOException if an I/O error occurs
     */
    public void read( DataInputStream in ) throws IOException{
        view.getPictures().read( in );
        view.getControl().getResources().readStream( in );
    }
    
    /**
     * Reads all the settings of this application.
     * @param element the element to read from
     */
    public void readXML( XElement element ){
        view.getPictures().readXML( element.getElement( "pictures" ) );
        view.getControl().getResources().readXML( element.getElement( "resources" ) );
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy