com.quinsoft.zeidon.objectbrowser.WindowBoundsRestorer.java Source code

Java tutorial

Introduction

Here is the source code for com.quinsoft.zeidon.objectbrowser.WindowBoundsRestorer.java

Source

/**
This file is part of the Zeidon Java Object Engine (Zeidon JOE).
    
Zeidon JOE 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 3 of the License, or
(at your option) any later version.
    
Zeidon JOE 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 Zeidon JOE.  If not, see <http://www.gnu.org/licenses/>.
    
Copyright 2009-2015 QuinSoft
 */
package com.quinsoft.zeidon.objectbrowser;

import java.awt.Component;
import java.awt.Container;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * This class can be used to save/restore Swing windows and components.
 *
 * @author dgc
 *
 */
public class WindowBoundsRestorer {
    private final String filename;
    private Properties properties;

    public WindowBoundsRestorer(String filename) {
        this.filename = filename;
    }

    private void setBounds(String key, Component c) {
        key = key + c.getName();

        String position = properties.getProperty(key);
        if (c.getName() != null && !StringUtils.isBlank(position)) {
            String[] nums = position.split(",");
            c.setBounds(Integer.parseInt(nums[0]), Integer.parseInt(nums[1]), Integer.parseInt(nums[2]),
                    Integer.parseInt(nums[3]));
        }

        if (c instanceof Container) {
            key = key + "/";
            Container container = (Container) c;
            for (Component child : container.getComponents())
                setBounds(key, child);
        }
    }

    /**
     * Loads the properties from the .xml file and sets all named windows with a matching
     * name.
     *
     * @param component Any component in the Swing app.  The top-most container will be
     * determined from this component.
     */
    public void restore(Component component) {
        properties = new Properties();
        InputStream is = null;

        File file = new File(filename);
        if (!file.exists())
            return;

        try {
            is = new FileInputStream(filename);
            properties.loadFromXML(is);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } finally {
            IOUtils.closeQuietly(is);
        }

        Component top = component;
        while (top.getParent() != null)
            top = top.getParent();

        setBounds("", top);
    }

    private void getBounds(String key, Component c) {
        key = key + c.getName();
        String position = String.format("%d,%d,%d,%d", c.getX(), c.getY(), c.getWidth(), c.getHeight());
        properties.setProperty(key, position);
        if (c instanceof Container) {
            key = key + "/";
            Container container = (Container) c;
            for (Component child : container.getComponents())
                getBounds(key, child);
        }
    }

    public void save(Component component) {
        Component top = component;
        while (top.getParent() != null)
            top = top.getParent();

        properties = new Properties();
        getBounds("", top);

        OutputStream os = null;
        try {
            os = new FileOutputStream(filename);
            properties.storeToXML(os, "Browser");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(os);
        }
    }
}