Package com.cburch.logisim.tools

Source Code of com.cburch.logisim.tools.FactoryDescription

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.tools;

import java.util.Arrays;
import java.util.List;

import javax.swing.Icon;

import com.cburch.logisim.comp.ComponentFactory;
import com.cburch.logisim.util.Icons;

/** This class allows an object to be created holding all the information
* essential to showing a ComponentFactory in the explorer window, but without
* actually loading the ComponentFactory unless a program genuinely gets around
* to needing to use it. Note that for this to work, the relevant
* ComponentFactory class must be in the same package as its Library class,
* the ComponentFactory class must be public, and it must include a public
* no-arguments constructor.
*/
public class FactoryDescription {
    public static List<Tool> getTools(Class<? extends Library> base,
            FactoryDescription[] descriptions) {
        Tool[] tools = new Tool[descriptions.length];
        for (int i = 0; i < tools.length; i++) {
            tools[i] = new AddTool(base, descriptions[i]);
        }
        return Arrays.asList(tools);
    }

    private String name;
    private String displayName;
    private String iconName;
    private boolean iconLoadAttempted;
    private Icon icon;
    private String factoryClassName;
    private boolean factoryLoadAttempted;
    private ComponentFactory factory;
    private String toolTip;

    public FactoryDescription(String name, String displayName,
            String iconName, String factoryClassName) {
        this(name, displayName, factoryClassName);
        this.iconName = iconName;
        this.iconLoadAttempted = false;
        this.icon = null;
    }

    public FactoryDescription(String name, String displayName,
            Icon icon, String factoryClassName) {
        this(name, displayName, factoryClassName);
        this.iconName = "???";
        this.iconLoadAttempted = true;
        this.icon = icon;
    }

    public FactoryDescription(String name, String displayName,
            String factoryClassName) {
        this.name = name;
        this.displayName = displayName;
        this.iconName = "???";
        this.iconLoadAttempted = true;
        this.icon = null;
        this.factoryClassName = factoryClassName;
        this.factoryLoadAttempted = false;
        this.factory = null;
        this.toolTip = null;
    }

    public String getName() {
        return name;
    }

    public String getDisplayName() {
        return displayName.toString();
    }

    public boolean isFactoryLoaded() {
        return factoryLoadAttempted;
    }

    public Icon getIcon() {
        Icon ret = icon;
        if (ret != null || iconLoadAttempted) {
            return ret;
        } else {
            ret = Icons.getIcon(iconName);
            icon = ret;
            iconLoadAttempted = true;
            return ret;
        }
    }

    public ComponentFactory getFactory(Class<? extends Library> libraryClass) {
        ComponentFactory ret = factory;
        if (factory != null || factoryLoadAttempted) {
            return ret;
        } else {
            String msg = "";
            try {
                msg = "getting class loader";
                ClassLoader loader = libraryClass.getClassLoader();
                msg = "getting package name";
                String name;
                Package pack = libraryClass.getPackage();
                if (pack == null) {
                    name = factoryClassName;
                } else {
                    name = pack.getName() + "." + factoryClassName;
                }
                msg = "loading class";
                Class<?> factoryClass = loader.loadClass(name);
                msg = "creating instance";
                Object factoryValue = factoryClass.newInstance();
                msg = "converting to factory";
                if (factoryValue instanceof ComponentFactory) {
                    ret = (ComponentFactory) factoryValue;
                    factory = ret;
                    factoryLoadAttempted = true;
                    return ret;
                }
            } catch (Exception t) {
                String name = t.getClass().getName();
                String m = t.getMessage();
                if (m != null) {
                    msg = msg + ": " + name + ": " + m;
                }

                else {
                    msg = msg + ": " + name;
                }

            }
            //OK
            System.err.println("error while " + msg);
            factory = null;
            factoryLoadAttempted = true;
            return null;
        }
    }

    public FactoryDescription setToolTip(String getter) {
        toolTip = getter;
        return this;
    }

    public String getToolTip() {
        String getter = toolTip;
        return getter == null ? null : getter.toString();
    }
}
TOP

Related Classes of com.cburch.logisim.tools.FactoryDescription

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.