cz.cuni.mff.peckam.java.origamist.gui.viewer.ModelInfoPanel.java Source code

Java tutorial

Introduction

Here is the source code for cz.cuni.mff.peckam.java.origamist.gui.viewer.ModelInfoPanel.java

Source

/**
 * 
 */
package cz.cuni.mff.peckam.java.origamist.gui.viewer;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Desktop;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.Permission;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkEvent.EventType;
import javax.swing.event.HyperlinkListener;
import javax.swing.origamist.JHideablePanel;
import javax.swing.origamist.JLocalizedLabel;
import javax.swing.origamist.JMultilineLabel;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

import cz.cuni.mff.peckam.java.origamist.common.License;
import cz.cuni.mff.peckam.java.origamist.gui.common.JLabelWithTooltip;
import cz.cuni.mff.peckam.java.origamist.gui.common.JLocalizedLabelWithTooltip;
import cz.cuni.mff.peckam.java.origamist.gui.common.JMultilineLabelWithTooltip;
import cz.cuni.mff.peckam.java.origamist.model.Origami;
import cz.cuni.mff.peckam.java.origamist.services.ServiceLocator;
import cz.cuni.mff.peckam.java.origamist.services.TooltipFactory;
import cz.cuni.mff.peckam.java.origamist.services.interfaces.ConfigurationManager;

/**
 * Panel with info about a model.
 * 
 * @author Martin Pecka
 */
public class ModelInfoPanel extends JHideablePanel {
    /** */
    private static final long serialVersionUID = 9041458561866387156L;

    /** The origami this panel displays info of. */
    protected Origami origami;

    /** The listener for locale changes. */
    protected PropertyChangeListener localeListener;

    protected JLocalizedLabel nameDesc = new JLocalizedLabelWithTooltip("viewer", "nameLabel", "%1s:");
    protected JLabel name = new JLabelWithTooltip();
    protected JLocalizedLabel authorDesc = new JLocalizedLabelWithTooltip("viewer", "authorLabel", "%1s:");
    protected JMultilineLabel author = new JMultilineLabelWithTooltip("");
    protected JLocalizedLabel licenseDesc = new JLocalizedLabelWithTooltip("viewer", "licenseLabel", "%1s:");
    protected JLabel license = new JLabel();
    protected JLocalizedLabel creationDateDesc = new JLocalizedLabelWithTooltip("viewer", "creationDateLabel",
            "%1s:");
    protected JLabel creationDate = new JLabelWithTooltip();
    protected JLocalizedLabel originalDesc = new JLocalizedLabelWithTooltip("viewer", "originalLabel", "%1s:");
    protected JLabel original = new JLabelWithTooltip();
    protected JLocalizedLabel paperDesc = new JLocalizedLabelWithTooltip("viewer", "paperLabel");
    protected JLocalizedLabel paperDimensionDesc = new JLocalizedLabelWithTooltip("viewer", "paperDimensionLabel",
            "   %1s:");
    protected JLabel paperDimension = new JLabelWithTooltip();
    protected JLocalizedLabel paperNoteDesc = new JLocalizedLabelWithTooltip("viewer", "paperNoteLabel", "   %1s:");
    protected JLabel paperNote = new JLabelWithTooltip();
    protected JLocalizedLabel paperForegroundDesc = new JLocalizedLabelWithTooltip("viewer", "paperForegroundLabel",
            "   %1s:");
    protected JTextField paperForeground = new JTextField();
    protected JLocalizedLabel paperBackgroundDesc = new JLocalizedLabelWithTooltip("viewer", "paperBackgroundLabel",
            "   %1s:");
    protected JTextField paperBackground = new JTextField();
    protected JLocalizedLabel paperWeightDesc = new JLocalizedLabelWithTooltip("viewer", "paperWeightLabel",
            "   %1s:");
    protected JLabel paperWeight = new JLabelWithTooltip();
    protected JLocalizedLabel descDesc = new JLocalizedLabelWithTooltip("viewer", "longDescLabel", "%1s:");
    protected JMultilineLabel desc = new JMultilineLabelWithTooltip("");

    public ModelInfoPanel(Origami origami) {
        this(origami, BorderLayout.NORTH);
    }

    public ModelInfoPanel(Origami origami, String orientation) {
        super(orientation);

        setOpaque(true);
        getContent().setOpaque(true);

        hideButton.setBackground(new Color(231, 231, 189));
        getContent().setBackground(new Color(250, 250, 242));

        hideButton.setBorder(BorderFactory.createEmptyBorder());

        paperBackground.setOpaque(true);
        paperForeground.setOpaque(true);
        paperBackground.setFont(name.getFont());
        paperForeground.setFont(name.getFont());
        paperBackground.setEditable(false);
        paperForeground.setEditable(false);
        paperBackground.setBorder(BorderFactory.createEmptyBorder());
        paperForeground.setBorder(BorderFactory.createEmptyBorder());

        author.setDisableLastLineHack(true);
        author.addHyperlinkListener(new HyperlinkListener() {
            @Override
            public void hyperlinkUpdate(HyperlinkEvent e) {
                if (e.getEventType().equals(EventType.ACTIVATED) && Desktop.isDesktopSupported()) {
                    try {
                        Desktop.getDesktop().browse(e.getURL().toURI());
                    } catch (IOException e1) {
                    } catch (URISyntaxException e1) {
                    }
                }
            }
        });

        localeListener = new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                Locale locale = ServiceLocator.get(ConfigurationManager.class).get().getLocale();

                name.setText(ModelInfoPanel.this.origami.getName(locale));
                String homePage = ResourceBundle.getBundle("viewer", locale).getString("author.homepage");
                author.setText("<html>" + ModelInfoPanel.this.origami.getAuthor().getName()
                        + (ModelInfoPanel.this.origami.getAuthor().getHomepage() == null ? ""
                                : " (<a href=\"" + ModelInfoPanel.this.origami.getAuthor().getHomepage() + "\">"
                                        + homePage + "</a>)")
                        + "</html>");

                license.setToolTipText(createLicenseTooltip(ModelInfoPanel.this.origami.getLicense()));

                if (ModelInfoPanel.this.origami.getCreationDate() != null) {
                    creationDate.setText(DateFormat.getDateInstance(DateFormat.MEDIUM, locale)
                            .format(ModelInfoPanel.this.origami.getCreationDate()));
                } else {
                    creationDate.setText("");
                }

                paperDimension
                        .setText((ModelInfoPanel.this.origami.getModel().getPaper()).getSize().toString(true));

                paperNote.setText((ModelInfoPanel.this.origami.getModel().getPaper()).getNote(locale));
                paperNote.setVisible(!(paperNote.getText() == null || paperNote.getText().equals("")));
                paperNoteDesc.setVisible(paperNote.isVisible());
                paperWeight.setText(MessageFormat.format(
                        ResourceBundle.getBundle("application", locale).getString("units.gramm_per_meter2"),
                        ModelInfoPanel.this.origami.getModel().getPaper().getWeight()));

                desc.setText(ModelInfoPanel.this.origami.getDescription(locale));
                desc.setVisible(!(desc.getText() == null || desc.getText().equals("")));
                descDesc.setVisible(desc.isVisible());

            }
        };
        ServiceLocator.get(ConfigurationManager.class).get().addPropertyChangeListener("locale", localeListener);
        ServiceLocator.get(ConfigurationManager.class).get().addPropertyChangeListener("preferredUnit",
                localeListener);

        setOrigami(origami);

        buildLayout();
    }

    /**
     * Add components to the layout.
     */
    protected void buildLayout() {
        DefaultFormBuilder b = new DefaultFormBuilder(
                new FormLayout("min(default;60dlu),$lcgap,min(default;100dlu)"), content);
        b.append(nameDesc);
        b.append(name);
        b.nextLine();
        b.append(authorDesc);
        b.append(author);
        b.nextLine();
        b.append(licenseDesc);
        b.append(license);
        b.nextLine();
        b.append(creationDateDesc);
        b.append(creationDate);
        b.nextLine();
        b.append(originalDesc);
        b.append(original);
        b.nextLine();
        b.append(paperDesc);
        b.nextLine();
        b.append(paperDimensionDesc);
        b.append(paperDimension);
        b.nextLine();
        b.append(paperNoteDesc);
        b.append(paperNote);
        b.nextLine();
        b.append(paperForegroundDesc);
        b.append(paperForeground);
        b.nextLine();
        b.append(paperBackgroundDesc);
        b.append(paperBackground);
        b.nextLine();
        b.append(paperWeightDesc);
        b.append(paperWeight);
        b.nextLine();
        b.append(descDesc);
        b.append(desc);
        b.nextLine();
    }

    /**
     * @return the origami
     */
    public Origami getOrigami() {
        return origami;
    }

    /**
     * @param origami the origami to set
     */
    public void setOrigami(Origami origami) {
        this.origami = origami;

        if (origami == null)
            return;

        license.setText(origami.getLicense().getName());

        original.setText(origami.getOriginal() == null ? "" : origami.getOriginal().toString());
        original.setVisible(!(original.getText() == null || original.getText().equals("")));
        originalDesc.setVisible(original.isVisible());

        Color c = origami.getModel().getPaper().getColors().getForeground();
        paperForeground.setText("R: " + c.getRed() + ", G: " + c.getGreen() + ", B: " + c.getBlue());
        paperForeground.setBackground(c);

        c = origami.getModel().getPaper().getColors().getBackground();
        paperBackground.setText("R: " + c.getRed() + ", G: " + c.getGreen() + ", B: " + c.getBlue());
        paperBackground.setBackground(c);

        localeListener.propertyChange(new PropertyChangeEvent(this, "locale", null,
                ServiceLocator.get(ConfigurationManager.class).get().getLocale()));

        showPanel();

        revalidate();
    }

    /**
     * Return the tooltip displaying information about the given license.
     * 
     * @param license The license the tooltip will be generated from.
     * @return The tooltip displaying information about the given license.
     */
    protected String createLicenseTooltip(License license) {
        StringBuilder tooltip = new StringBuilder();

        Locale l = ServiceLocator.get(ConfigurationManager.class).get().getLocale();
        ResourceBundle viewerMessages = ResourceBundle.getBundle("viewer", l);
        ResourceBundle messages = ResourceBundle.getBundle("application", l);

        tooltip.append("<html>").append(
                "<head><style>body {width: 500px;} ul {padding: 0px; margin: 0px; margin-left: 20px;}</style></head>");
        tooltip.append("<body>");
        tooltip.append("<h1>" + license.getName() + "</h1>")
                .append(viewerMessages.getString("license.tooltip.youArePermittedTo"));
        if (license.getPermission().size() == 0) {
            tooltip.append(messages.getString("permission.doNothing"));
        } else {
            tooltip.append("<ul>");
            for (Permission p : license.getPermission()) {
                String name = p.getName();
                try {
                    name = messages.getString("permission." + name);
                } catch (MissingResourceException e) {
                }
                tooltip.append("<li>" + name + "</li>");
            }
            tooltip.append("</ul>");
        }

        if (license.getHomepage() != null) {
            tooltip.append("<b>" + viewerMessages.getString("license.tooltip.homepage") + "</b>: "
                    + license.getHomepage());
        }

        if (license.getContent() != null) {
            tooltip.append("<h2>" + viewerMessages.getString("license.tooltip.licenseText") + "</h2>");
            tooltip.append("<p>" + license.getContent() + "</p>");
        }
        tooltip.append("</body>");
        tooltip.append("</html>");

        return ServiceLocator.get(TooltipFactory.class).getPlain(tooltip.toString());
    }
}