swingx-master/swingx-demos/swingx-demos-swingxset/src/main/java/org/jdesktop/swingxset/LoadedXDemoPanel.java
/*
 * $Id$
 *
 * Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
package org.jdesktop.swingxset;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Rectangle;
import java.io.IOException;
import java.net.URL;

import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.UIManager;

import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.JXTitledPanel;
import org.jdesktop.swingx.painter.MattePainter;
import org.jdesktop.swingx.painter.Painter;
import org.jdesktop.swingx.util.PaintUtils;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.sun.swingset3.Demo;
import com.sun.swingset3.utilities.HTMLPanel;
import com.sun.swingset3.utilities.RoundedBorder;
import com.sun.swingset3.utilities.Utilities;

public class LoadedXDemoPanel extends JXTitledPanel {
    private JComponent descriptionArea;

    private JComponent demoPanel;

    public LoadedXDemoPanel(Demo demo) throws Exception {
        super(demo.getName());
        initComponents(demo);
        layoutComponents();
        setBorder(new RoundedBorder(5));//DemoXPanel.roundedBorder);
        if (descriptionArea != null)
            demoPanel.setBorder(DemoXPanel.roundedBorder);
        applyDefaults();
    }

    private void layoutComponents() {
        if (descriptionArea == null) {
            setContentContainer(demoPanel);
        } else {
            layoutWithDescription();
        }
    }

    /**
     * 
     */
    private void layoutWithDescription() {
        JComponent top = (JComponent) getUI().getTitleBar();
        removeAll();
        FormLayout formLayout = new FormLayout("f:[100dlu, m]:g, f:d:g", // columns
                "f:d:n, f:d:g "); // rows
        PanelBuilder builder = new PanelBuilder(formLayout, this);
        CellConstraints cc = new CellConstraints();
        JScrollPane scrollPane = new JScrollPane(descriptionArea,
                JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        builder.add(scrollPane, cc.xywh(1, 2, 1, 1));
        builder.add(demoPanel, cc.xywh(2, 2, 1, 1));
        builder.add(top, cc.xywh(1, 1, 2, 1));
    }

    /**
     * @throws Exception
     * 
     */
    private void initComponents(Demo demo) throws Exception {
        URL description = demo.getHTMLDescription();
        if (description != null) {
            descriptionArea = createDescriptionArea(description);
        }
        demoPanel = new JXPanel(new BorderLayout());
        demoPanel.add(demo.createDemoComponent());
    }

    private JComponent createDescriptionArea(URL descriptionURL) {
        final JEditorPane editor =  new HTMLPanel();

        editor.setEditable(false);

        editor.setMargin(DemoXPanel.margin);
        editor.setOpaque(true);
        try {
            editor.setPage(descriptionURL);
        } catch (IOException e) {
            System.err.println("couldn't load description from URL:"
                    + descriptionURL);
        }
        return editor;
    }

    @Override
    public void doLayout() {
        super.doLayout();
        if (descriptionArea != null) {
            // manual tweaking of demo panel: displace slightly to overlap the
            // title
            // PENDING JW: displace so that it is below the title baseline
            Rectangle bounds = demoPanel.getBounds();
            int delta = getUI().getTitleBar().getHeight() / 2;
            bounds.y -= delta;
            bounds.height += delta / 2;
            demoPanel.setBounds(bounds);
        }
    }

    @Override
    public void updateUI() {
        super.updateUI();
        if (descriptionArea != null) {
            layoutWithDescription();
        }
        applyDefaults();
    }

    @SuppressWarnings("unchecked")
    private void applyDefaults() {
        Color color = UIManager.getColor(SwingXSet.TITLE_GRADIENT_COLOR2_KEY);
        GradientPaint gradient = new GradientPaint(0f, 0f, UIManager
                .getColor(SwingXSet.TITLE_GRADIENT_COLOR1_KEY), 500f, 0f,
                PaintUtils.setAlpha(color, 0));
        Painter<?> matte = new MattePainter(gradient, true);
        setTitlePainter(matte); 

        setTitleFont(UIManager.getFont(SwingXSet.TITLE_FONT_KEY));
        Color bg = Utilities.deriveColorHSB(UIManager
                .getColor("Panel.background"), 0, 0, -.06f);
        setBackground(bg);
        setForeground(UIManager.getColor(SwingXSet.TITLE_FOREGROUND_KEY));
        if (demoPanel != null) {
            demoPanel.setBackground(Utilities.deriveColorHSB(bg, 0, 0, .04f));
        }
        if (descriptionArea != null) {
            descriptionArea.setBackground(bg);
        }
    }
}