ca.sqlpower.swingui.LabelEditorPanel.java Source code

Java tutorial

Introduction

Here is the source code for ca.sqlpower.swingui.LabelEditorPanel.java

Source

/*
 * Copyright (c) 2010, SQL Power Group Inc.
 *
 * This file is part of SQL Power Library.
 *
 * SQL Power Library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * SQL Power 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
 */

package ca.sqlpower.swingui;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import javax.swing.Action;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.KeyStroke;
import javax.swing.text.BadLocationException;

import org.apache.log4j.Logger;

import ca.sqlpower.object.HorizontalAlignment;
import ca.sqlpower.object.SPLabel;
import ca.sqlpower.object.SPVariableHelper;
import ca.sqlpower.object.VerticalAlignment;
import ca.sqlpower.swingui.object.InsertVariableAction;
import ca.sqlpower.swingui.object.VariableInserter;
import ca.sqlpower.swingui.object.VariableLabel;

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

public abstract class LabelEditorPanel implements DataEntryPanel {

    private static final Logger logger = Logger.getLogger(LabelEditorPanel.class);

    private JPanel panel;

    private final SPLabel label;

    private FontSelector fontSelector;

    private JTextPane textArea;

    private JToggleButton leftAlign;
    private JToggleButton centreAlign;
    private JToggleButton rightAlign;

    private JToggleButton topAlign;
    private JToggleButton middleAlign;
    private JToggleButton bottomAlign;

    private JComboBox bgColor;
    private JComboBox fgColor;
    private JComboBox bdColor;

    private JCheckBox bgIsNull;
    private JCheckBox borderIsNull;

    public abstract FontSelector getFontSelector();

    public abstract SPVariableHelper getVariablesHelper();

    public abstract List<Color> getBackgroundColours();

    /**
     * A constructor with the option to override the panel's initial selections
     * (taken from the label's values) with presets. This is useful for newly
     * created labels.
     */
    public LabelEditorPanel(SPLabel label, boolean variables, boolean override) {
        this(label, variables);
        if (override) {
            bgIsNull.setSelected(false);
            borderIsNull.setSelected(false);
            bdColor.setSelectedIndex(0);
            bgColor.setSelectedIndex(0);
            fgColor.setSelectedIndex(0);
        }
    }

    public LabelEditorPanel(SPLabel label, boolean variables) {
        this.label = label;
        panel = new JPanel();
        final DefaultFormBuilder fb = new DefaultFormBuilder(
                new FormLayout("pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, 100dlu:grow"), panel);
        fb.getLayout().setColumnGroups(new int[][] { { 1, 5 }, { 3, 7 } });

        textArea = new JTextPane();
        textArea.setText(label.getText());

        JButton variableButton = null;
        if (variables) {
            VariableLabel.insertLabels(getVariablesHelper(), textArea.getDocument(), textArea);

            Action insertVariableAction = new InsertVariableAction("Variables", getVariablesHelper(), null,
                    new VariableInserter() {
                        public void insert(String variable) {
                            try {
                                VariableLabel.insertLabel(
                                        variable.replaceFirst("\\$", "").replaceFirst("\\{", "").replaceFirst("\\}",
                                                ""),
                                        getVariablesHelper(), textArea.getDocument(), textArea.getCaretPosition(),
                                        textArea);
                            } catch (BadLocationException e) {
                                throw new IllegalStateException(e);
                            }
                        }
                    }, textArea);

            variableButton = new JButton("Variables");
            variableButton.setAction(insertVariableAction);

            // Maps CTRL+SPACE to insert variable
            textArea.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.CTRL_MASK),
                    "insertVariable");
            textArea.getActionMap().put("insertVariable", insertVariableAction);

        }

        ButtonGroup hAlignmentGroup = new ButtonGroup();
        leftAlign = new JToggleButton(AlignmentIcons.LEFT_ALIGN_ICON,
                label.getHorizontalAlignment() == HorizontalAlignment.LEFT);
        hAlignmentGroup.add(leftAlign);
        centreAlign = new JToggleButton(AlignmentIcons.CENTRE_ALIGN_ICON,
                label.getHorizontalAlignment() == HorizontalAlignment.CENTER);
        hAlignmentGroup.add(centreAlign);
        rightAlign = new JToggleButton(AlignmentIcons.RIGHT_ALIGN_ICON,
                label.getHorizontalAlignment() == HorizontalAlignment.RIGHT);
        hAlignmentGroup.add(rightAlign);

        ButtonGroup vAlignmentGroup = new ButtonGroup();
        topAlign = new JToggleButton(AlignmentIcons.TOP_ALIGN_ICON,
                label.getVerticalAlignment() == VerticalAlignment.TOP);
        vAlignmentGroup.add(topAlign);
        middleAlign = new JToggleButton(AlignmentIcons.MIDDLE_ALIGN_ICON,
                label.getVerticalAlignment() == VerticalAlignment.MIDDLE);
        vAlignmentGroup.add(middleAlign);
        bottomAlign = new JToggleButton(AlignmentIcons.BOTTOM_ALIGN_ICON,
                label.getVerticalAlignment() == VerticalAlignment.BOTTOM);
        vAlignmentGroup.add(bottomAlign);

        Box alignmentBox = Box.createHorizontalBox();
        alignmentBox.add(leftAlign);
        alignmentBox.add(centreAlign);
        alignmentBox.add(rightAlign);
        alignmentBox.add(Box.createHorizontalStrut(5));
        alignmentBox.add(topAlign);
        alignmentBox.add(middleAlign);
        alignmentBox.add(bottomAlign);
        if (variables) {
            alignmentBox.add(Box.createHorizontalGlue());
            alignmentBox.add(variableButton);
        }

        fb.append("Alignment", alignmentBox, 7);
        fb.appendRelatedComponentsGapRow();
        fb.appendRow("pref");
        fb.nextLine(2);

        bgColor = new JComboBox(ColourScheme.BACKGROUND_COLOURS);
        fb.append("Label Colour", bgColor);
        ColorCellRenderer renderer = new ColorCellRenderer(40, 20);
        bgColor.setRenderer(renderer);
        bgColor.setSelectedItem(label.getBackgroundColour());
        if (label.getBackgroundColour() == null) {
            bgColor.setSelectedIndex(0);
        }
        bgColor.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bgIsNull.setSelected(false);
            }
        });

        bgIsNull = new JCheckBox("Transparent", label.getBackgroundColour() == null);
        fb.append(bgIsNull);
        fb.appendRelatedComponentsGapRow();
        fb.appendRow("pref");
        fb.nextLine(2);

        fgColor = new JComboBox(ColourScheme.FOREGROUND_COLOURS);
        fb.append("Text Colour", fgColor);
        fgColor.setRenderer(renderer);
        fgColor.setSelectedItem(label.getForegroundColour());

        fb.appendRelatedComponentsGapRow();
        fb.appendRow("pref");
        fb.nextLine(2);

        bdColor = new JComboBox(ColourScheme.FOREGROUND_COLOURS);
        fb.append("Border Colour", bdColor);
        bdColor.setRenderer(renderer);
        bdColor.setSelectedItem(label.getBorderColour());
        if (label.getBorderColour() == null) {
            bdColor.setSelectedIndex(0);
        }
        bdColor.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                borderIsNull.setSelected(false);
            }
        });

        borderIsNull = new JCheckBox("No Border", label.getBorderColour() == null);
        fb.append(borderIsNull);

        fb.appendRelatedComponentsGapRow();
        fb.appendRow("fill:90dlu:grow");
        fb.nextLine(2);

        textArea.setFont(label.getFont());
        JLabel textLabel = fb.append("Text", new JScrollPane(textArea), 7);
        textLabel.setVerticalTextPosition(JLabel.TOP);
        fb.appendRow("pref");
        fb.nextLine();

        fontSelector = getFontSelector();
        if (fontSelector != null) {
            logger.debug("FontSelector got passed Font " + label.getFont());
            fontSelector.setShowingPreview(false);
            fontSelector.addPropertyChangeListener(new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent evt) {
                    logger.debug("Changing font to: " + fontSelector.getSelectedFont());
                    textArea.setFont(fontSelector.getSelectedFont());
                }
            });
            fb.append("Font", fontSelector.getPanel(), 5);
        }

    }

    @Override
    public boolean applyChanges() {

        if (fontSelector != null) {
            fontSelector.applyChanges();
            label.setFont(fontSelector.getSelectedFont());
        }

        VariableLabel.removeLabels(textArea.getDocument());
        label.setText(textArea.getText());

        if (leftAlign.isSelected()) {
            label.setHorizontalAlignment(HorizontalAlignment.LEFT);
        } else if (centreAlign.isSelected()) {
            label.setHorizontalAlignment(HorizontalAlignment.CENTER);
        } else if (rightAlign.isSelected()) {
            label.setHorizontalAlignment(HorizontalAlignment.RIGHT);
        }

        if (topAlign.isSelected()) {
            label.setVerticalAlignment(VerticalAlignment.TOP);
        } else if (middleAlign.isSelected()) {
            label.setVerticalAlignment(VerticalAlignment.MIDDLE);
        } else if (bottomAlign.isSelected()) {
            label.setVerticalAlignment(VerticalAlignment.BOTTOM);
        }

        label.setBackgroundColour((Color) (bgIsNull.isSelected() ? null : bgColor.getSelectedItem()));
        label.setForegroundColour((Color) fgColor.getSelectedItem());
        label.setBorderColour((Color) (borderIsNull.isSelected() ? null : bdColor.getSelectedItem()));

        return true;
    }

    @Override
    public void discardChanges() {
        // no-op
    }

    @Override
    public JComponent getPanel() {
        return panel;
    }

    @Override
    public boolean hasUnsavedChanges() {
        return true;
    }

    public SPLabel getLabel() {
        return label;
    }

}