ComponentFeedbackExample.java :  » Swing-Library » jgoodies-validation » com » jgoodies » validation » tutorial » basics » Java Open Source

Java Open Source » Swing Library » jgoodies validation 
jgoodies validation » com » jgoodies » validation » tutorial » basics » ComponentFeedbackExample.java
/*
 * Copyright (c) 2003-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  o Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 *  o Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.jgoodies.validation.tutorial.basics;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.validation.ValidationResult;
import com.jgoodies.validation.ValidationResultModel;
import com.jgoodies.validation.tutorial.shared.Order;
import com.jgoodies.validation.tutorial.shared.OrderModel;
import com.jgoodies.validation.tutorial.util.ExampleComponentFactory;
import com.jgoodies.validation.tutorial.util.IconFeedbackPanel;
import com.jgoodies.validation.tutorial.util.TutorialUtils;
import com.jgoodies.validation.view.ValidationComponentUtils;

/**
 * Demonstrates different styles how to indicate that a component
 * contains invalid data:
 * background changes if empty,
 * background reflects the severity,
 * overlaid icons reflect the severity.
 *
 * @author Karsten Lentzsch
 * @version $Revision: 1.15 $
 */
public final class ComponentFeedbackExample {

    private final OrderModel orderModel;

    private JTextField mandatoryOrderNoField;
    private JTextField mandatoryOrderDateField;
    private JTextField mandatoryDeliveryDateField;
    private JTextArea  mandatoryDeliveryNotesArea;
    private JComponent mandatoryPanel;

    private JTextField severityOrderNoField;
    private JTextField severityOrderDateField;
    private JTextField severityDeliveryDateField;
    private JTextArea  severityDeliveryNotesArea;
    private JComponent severityPanel;

    private JTextField iconOrderNoField;
    private JTextField iconOrderDateField;
    private JTextField iconDeliveryDateField;
    private JTextArea  iconDeliveryNotesArea;
    private JComponent iconOverlayPanel;


    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.looks.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely Plastic is not in the classpath; ignore it.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Basics :: Component Feedback");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new ComponentFeedbackExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        TutorialUtils.locateOnOpticalScreenCenter(frame);
        frame.setVisible(true);
    }


    // Instance Creation ******************************************************

    public ComponentFeedbackExample() {
        orderModel  = new OrderModel(new Order());
    }


    // Component Creation and Initialization **********************************

    private void initComponents() {
        mandatoryOrderNoField = ExampleComponentFactory.createTextField(
                orderModel.getModel(Order.PROPERTYNAME_ORDER_NO), false);
        mandatoryOrderDateField = ExampleComponentFactory.createDateField(
                orderModel.getModel(Order.PROPERTYNAME_ORDER_DATE),
                true);
        mandatoryDeliveryDateField = ExampleComponentFactory.createDateField(
                orderModel.getModel(Order.PROPERTYNAME_DELIVERY_DATE),
                true);
        mandatoryDeliveryNotesArea = ExampleComponentFactory.createTextArea(
                orderModel.getModel(Order.PROPERTYNAME_DELIVERY_NOTES), false);

        severityOrderNoField = ExampleComponentFactory.createTextField(
                orderModel.getModel(Order.PROPERTYNAME_ORDER_NO), false);
        severityOrderDateField = ExampleComponentFactory.createDateField(
                orderModel.getModel(Order.PROPERTYNAME_ORDER_DATE));
        severityDeliveryDateField = ExampleComponentFactory.createDateField(
                orderModel.getModel(Order.PROPERTYNAME_DELIVERY_DATE),
                true);
        severityDeliveryNotesArea = ExampleComponentFactory.createTextArea(
                orderModel.getModel(Order.PROPERTYNAME_DELIVERY_NOTES), false);

        iconOrderNoField = ExampleComponentFactory.createTextField(
                orderModel.getModel(Order.PROPERTYNAME_ORDER_NO), false);
        iconOrderDateField = ExampleComponentFactory.createDateField(
                orderModel.getModel(Order.PROPERTYNAME_ORDER_DATE));
        iconDeliveryDateField = ExampleComponentFactory.createDateField(
                orderModel.getModel(Order.PROPERTYNAME_DELIVERY_DATE),
                true);
        iconDeliveryNotesArea = ExampleComponentFactory.createTextArea(
                orderModel.getModel(Order.PROPERTYNAME_DELIVERY_NOTES), false);
    }


    private void initComponentAnnotations() {
        ValidationComponentUtils.setMandatory(mandatoryOrderNoField, true);
        ValidationComponentUtils.setMessageKey(mandatoryOrderNoField, "Order.Order No");
        ValidationComponentUtils.setMandatory(mandatoryOrderDateField, true);
        ValidationComponentUtils.setMessageKey(mandatoryOrderDateField, "Order.Order Date");
        ValidationComponentUtils.setMessageKey(mandatoryDeliveryDateField, "Order.Delivery Date");
        ValidationComponentUtils.setMessageKey(mandatoryDeliveryNotesArea, "Order.Notes");

        ValidationComponentUtils.setMandatory(severityOrderNoField, true);
        ValidationComponentUtils.setMessageKey(severityOrderNoField, "Order.Order No");
        ValidationComponentUtils.setMandatory(severityOrderDateField, true);
        ValidationComponentUtils.setMessageKey(severityOrderDateField, "Order.Order Date");
        ValidationComponentUtils.setMessageKey(severityDeliveryDateField, "Order.Delivery Date");
        ValidationComponentUtils.setMessageKey(severityDeliveryNotesArea, "Order.Notes");

        ValidationComponentUtils.setMandatory(iconOrderNoField, true);
        ValidationComponentUtils.setMessageKey(iconOrderNoField, "Order.Order No");
        ValidationComponentUtils.setMandatory(iconOrderDateField, true);
        ValidationComponentUtils.setMessageKey(iconOrderDateField, "Order.Order Date");
        ValidationComponentUtils.setMessageKey(iconDeliveryDateField, "Order.Delivery Date");
        ValidationComponentUtils.setMessageKey(iconDeliveryNotesArea, "Order.Notes");
    }


    private void initEventHandling() {
        orderModel.getValidationResultModel().addPropertyChangeListener(
                ValidationResultModel.PROPERTYNAME_RESULT,
                new ValidationChangeHandler());
    }


    // Building ***************************************************************

    /**
     * Builds and returns the whole editor with 3 sections
     * for the different validation times.
     */
    public JComponent buildPanel() {
        initComponents();
        initComponentAnnotations();
        initEventHandling();

        mandatoryPanel   = buildMandatoryPanel();
        severityPanel    = buildSeverityPanel();
        iconOverlayPanel = buildIconOverlayPanel();

        FormLayout layout = new FormLayout(
                "fill:pref:grow",
                "p, 3dlu, p, 17dlu, p, 3dlu, p, 17dlu, p, 3dlu, p");

        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();

        builder.addSeparator("Background Indicates Blank Mandatory Fields", cc.xy(1,  1));
        builder.add(mandatoryPanel,                                         cc.xy(1,  3));
        builder.addSeparator("Background Indicates Invalid Input",          cc.xy(1,  5));
        builder.add(severityPanel,                                          cc.xy(1,  7));
        builder.addSeparator("Icons Indicate Invalid Input",                cc.xy(1,  9));
        builder.add(iconOverlayPanel,                                       cc.xy(1, 11));

        // Synchronize the presentation with the current validation state.
        // If you want to show no validation info before the user has typed
        // anything in the form, use the commented EMPTY result
        // instead of the model's validation result.
        updateComponentTreeMandatoryAndSeverity(
                orderModel.getValidationResultModel().getResult()
                // ValidationResult.EMPTY
        );

        return builder.getPanel();
    }


    private JComponent buildMandatoryPanel() {
        FormLayout layout = new FormLayout(
                "right:max(65dlu;pref), 4dlu, 44dlu, 2dlu, 44dlu, 90dlu:grow",
                "p, 3dlu, p, 3dlu, p, 3dlu, p");

        layout.setRowGroups(new int[][]{{1, 3, 5, 7}});
        PanelBuilder builder = new PanelBuilder(layout);
        CellConstraints cc = new CellConstraints();

        builder.addLabel("Order No",             cc.xy  (1, 1));
        builder.add(mandatoryOrderNoField,       cc.xyw (3, 1, 3));
        builder.addLabel("Order-/Delivery Date", cc.xy  (1, 3));
        builder.add(mandatoryOrderDateField,     cc.xy  (3, 3));
        builder.add(mandatoryDeliveryDateField,  cc.xy  (5, 3));
        builder.add(new JScrollPane(mandatoryDeliveryNotesArea),
                                                 cc.xywh(3, 5, 4, 3));

        return builder.getPanel();
    }


    private JComponent buildSeverityPanel() {
        FormLayout layout = new FormLayout(
                "right:max(65dlu;pref), 4dlu, 44dlu, 2dlu, 44dlu, 90dlu:grow",
                "p, 3dlu, p, 3dlu, p, 3dlu, p");

        layout.setRowGroups(new int[][]{{1, 3, 5, 7}});
        PanelBuilder builder = new PanelBuilder(layout);
        CellConstraints cc = new CellConstraints();

        builder.addLabel("Order No",             cc.xy  (1, 1));
        builder.add(severityOrderNoField,        cc.xyw (3, 1, 3));
        builder.addLabel("Order-/Delivery Date", cc.xy  (1, 3));
        builder.add(severityOrderDateField,      cc.xy  (3, 3));
        builder.add(severityDeliveryDateField,   cc.xy  (5, 3));
        builder.add(new JScrollPane(severityDeliveryNotesArea),
                                                 cc.xywh(3, 5, 4, 3));

        return builder.getPanel();
    }


    private JComponent buildIconOverlayPanel() {
        FormLayout layout = new FormLayout(
                "right:max(65dlu;pref), 4dlu, 44dlu, 2dlu, 44dlu, 90dlu:grow",
                "p, 3dlu, p, 3dlu, p, 3dlu, p, 4px"); // extra bottom space for icons

        layout.setRowGroups(new int[][]{{1, 3, 5, 7}});
        PanelBuilder builder = new PanelBuilder(layout);
        CellConstraints cc = new CellConstraints();

        builder.addLabel("Order No",             cc.xy  (1, 1));
        builder.add(iconOrderNoField,            cc.xyw (3, 1, 3));
        builder.addLabel("Order-/Delivery Date", cc.xy  (1, 3));
        builder.add(iconOrderDateField,          cc.xy  (3, 3));
        builder.add(iconDeliveryDateField,       cc.xy  (5, 3));
        builder.addLabel("Notes",                cc.xy  (1, 5));
        builder.add(new JScrollPane(iconDeliveryNotesArea),
                                                 cc.xywh(3, 5, 4, 3));

        return new IconFeedbackPanel(
                orderModel.getValidationResultModel(),
                builder.getPanel()
                );
    }


    // Event Handling *********************************************************

    private void updateComponentTreeMandatoryAndSeverity(ValidationResult result) {
        ValidationComponentUtils.updateComponentTreeMandatoryAndBlankBackground(
                mandatoryPanel);
        ValidationComponentUtils.updateComponentTreeSeverityBackground(
                severityPanel,
                result);
    }

    /**
     * Updates the component background in the mandatory panel and the
     * validation background in the severity panel. Invoked whenever
     * the observed validation result changes.
     */
    private final class ValidationChangeHandler implements PropertyChangeListener {

        public void propertyChange(PropertyChangeEvent evt) {
            updateComponentTreeMandatoryAndSeverity(
                    (ValidationResult) evt.getNewValue());
        }
    }


}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.