org.key2gym.client.panels.forms.ClientFormPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.key2gym.client.panels.forms.ClientFormPanel.java

Source

/*
 * Copyright 2012-2013 Danylo Vashchilenko
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.key2gym.client.panels.forms;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.layout.Sizes;
import org.jdesktop.beansbinding.*;
import org.key2gym.business.api.SecurityRoles;
import org.key2gym.business.api.dtos.ClientDTO;
import org.key2gym.business.api.services.AdministratorsService;
import org.key2gym.client.ContextManager;
import org.key2gym.client.highlighters.AttendancesBalanceHighlighter;
import org.key2gym.client.highlighters.ExpirationDateHighlighter;
import org.key2gym.client.highlighters.MoneyBalanceHighlighter;
import org.key2gym.client.util.DateMidnightToStringConverter;
import org.key2gym.client.util.FormBindingListener;
import org.key2gym.client.util.IntegerToStringConverter;
import org.key2gym.client.util.MoneyBigDecimalToStringConverter;

import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.List;
import java.util.ResourceBundle;

/**
 * @author Danylo Vashchilenko
 */
public class ClientFormPanel extends JPanel {

    public ClientFormPanel(List<Column> columnsList) {
        isPriviliged = ContextManager.lookup(AdministratorsService.class).getCurrent().getRoles()
                .contains(SecurityRoles.MANAGER);
        this.columnsList = columnsList;

        buildForm();

        getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
                KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, KeyEvent.CTRL_DOWN_MASK),
                CardFocusAction.class.getName());
        getActionMap().put(CardFocusAction.class.getName(), new CardFocusAction());
    }

    /**
     * Builds this from by placing the fields specified in columnsList.
     */
    private void buildForm() {
        FormLayout layout = new FormLayout("right:default, 3dlu, default:grow", "");
        ResourceBundle strings = ResourceBundle.getBundle("org/key2gym/client/resources/Strings");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout, strings, this);
        builder.defaultRowSpec(new RowSpec(RowSpec.FILL, Sizes.DEFAULT, RowSpec.NO_GROW));

        bindingGroup = new BindingGroup();

        formBindingListener = new FormBindingListener();
        bindingGroup.addBindingListener(formBindingListener);

        for (Column column : columnsList) {
            Binding binding;

            if (column.equals(Column.ID)) {
                /*
                 * ID
                 */
                idTextField = new JTextField();
                idTextField.setEditable(false);
                idTextField.setEnabled(false);
                builder.appendI15d("Label.ID", idTextField);
                builder.nextLine();

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("id"), idTextField, BeanProperty.create("text"), "id");
                bindingGroup.addBinding(binding);

            } else if (column.equals(Column.FULL_NAME)) {
                /*
                 * Full name
                 */
                fullNameTextField = new JTextField();
                builder.appendI15d("Label.FullName", fullNameTextField);
                builder.nextLine();

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("fullName"), fullNameTextField, BeanProperty.create("text"),
                        "fullName");
                bindingGroup.addBinding(binding);
            } else if (column.equals(Column.CARD)) {
                /*
                 * Card
                 */
                cardTextField = new JTextField();
                builder.appendI15d("Label.Card", cardTextField);
                builder.nextLine();

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("card"), cardTextField, BeanProperty.create("text"), "card");
                binding.setConverter(new IntegerToStringConverter("Card", true));
                bindingGroup.addBinding(binding);

            } else if (column.equals(Column.EXPIRATION_DATE)) {
                /*
                 * Expiration date
                 */
                expirationDateTextField = new JTextField();
                expirationDateTextField.setEditable(isPriviliged);
                new ExpirationDateHighlighter(expirationDateTextField);
                builder.appendI15d("Label.ExpirationDate", expirationDateTextField);
                builder.nextLine();

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("expirationDate"), expirationDateTextField, BeanProperty.create("text"),
                        "expirationDate");
                binding.setConverter(
                        new DateMidnightToStringConverter(strings.getString("Text.ExpirationDate"), "dd-MM-yyyy"));
                bindingGroup.addBinding(binding);
            } else if (column.equals(Column.ATTENDANCES_BALANCE)) {
                /*
                 * Attendances balance
                 */
                attendancesBalanceTextField = new JTextField();
                //attendancesBalanceTextField.setEditable(isPriviliged);
                new AttendancesBalanceHighlighter(attendancesBalanceTextField);
                builder.appendI15d("Label.AttendancesBalance", attendancesBalanceTextField);
                builder.nextLine();

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("attendancesBalance"), attendancesBalanceTextField,
                        BeanProperty.create("text"), "attendancesBalance");
                binding.setConverter(
                        new IntegerToStringConverter(strings.getString("Text.AttendancesBalance"), false));
                bindingGroup.addBinding(binding);

            } else if (column.equals(Column.MONEY_BALANCE)) {
                /*
                 * Money balance
                 */
                moneyBalanceTextField = new JTextField();
                moneyBalanceTextField.setEditable(isPriviliged);
                new MoneyBalanceHighlighter(moneyBalanceTextField);
                builder.appendI15d("Label.MoneyBalance", moneyBalanceTextField);
                builder.nextLine();

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("moneyBalance"), moneyBalanceTextField, BeanProperty.create("text"),
                        "moneyBalance");
                binding.setConverter(new MoneyBigDecimalToStringConverter(strings.getString("Text.MoneyBalance")));
                bindingGroup.addBinding(binding);
            } else if (column.equals(Column.REGISTRATION_DATE)) {
                /*
                 * Registration date
                 */
                registrationDateTextField = new JTextField();
                registrationDateTextField.setEditable(isPriviliged);
                builder.appendI15d("Label.RegistrationDate", registrationDateTextField);
                builder.nextLine();

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("registrationDate"), registrationDateTextField,
                        BeanProperty.create("text"), "registrationDate");
                binding.setConverter(new DateMidnightToStringConverter("Registration Date", "dd-MM-yyyy"));
                bindingGroup.addBinding(binding);
            } else if (column.equals(Column.NOTE)) {
                /*
                 * Note
                 */
                noteScrollPane = new JScrollPane();
                noteTextArea = new JTextArea();
                noteTextArea.setColumns(20);
                noteTextArea.setRows(5);
                noteScrollPane.setViewportView(noteTextArea);
                JLabel label = new JLabel(strings.getString("Label.Note"));
                label.setVerticalAlignment(SwingConstants.TOP);
                builder.append(label, noteScrollPane);

                binding = Bindings.createAutoBinding(AutoBinding.UpdateStrategy.READ_ONCE, client,
                        BeanProperty.create("note"), noteTextArea, BeanProperty.create("text"), "note");
                bindingGroup.addBinding(binding);

            }
        }
        bindingGroup.bind();
    }

    /**
     * Sets the form's client.
     *
     * @param newClient the new client
     */
    public void setClient(ClientDTO newClient) {
        if (newClient == null) {
            newClient = new ClientDTO();
        }

        this.client = newClient;

        formBindingListener.getInvalidTargets().clear();

        /*
         * We take each binding and set the source object.
         */
        for (Binding binding : bindingGroup.getBindings()) {
            binding.unbind();
            binding.setSourceObject(client);
            binding.bind();
        }
    }

    /**
     * Sets whether the form can be edited by the user.
     *
     * @param canEdit if true, this form will do its best to show user that the
     *                form is not editable.
     */
    public void setEditable(boolean canEdit) {
        /*
         * Takes each binding and applies the editable property, if it's a
         * component.
         */
        for (Binding binding : bindingGroup.getBindings()) {
            Object target = binding.getTargetObject();
            if (JTextComponent.class.isInstance(target)) {
                ((JTextComponent) binding.getTargetObject()).setEditable(canEdit);
            }
        }
    }

    /**
     * Sets whether the form can be edited by the user.
     *
     * @param enabled if true, this form will do its best to show user that the
     *                form is not editable.
     */
    @Override
    public void setEnabled(boolean enabled) {
        /*
         * Takes each binding and applies the editable property, if it's a
         * component.
         */
        for (Binding binding : bindingGroup.getBindings()) {
            Object target = binding.getTargetObject();
            if (JTextComponent.class.isInstance(target)) {
                ((JTextComponent) binding.getTargetObject()).setEnabled(enabled);
            }
        }

        super.setEnabled(enabled);
    }

    /**
     * Tries to save the form to the current client.
     *
     * @return true, if the form is valid and has been saved
     */
    public boolean trySave() {
        for (Binding binding : bindingGroup.getBindings()) {
            binding.saveAndNotify();
        }
        return formBindingListener.getInvalidTargets().isEmpty();
    }

    private class CardFocusAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent e) {
            cardTextField.requestFocusInWindow();
        }
    }

    public enum Column {

        ID, FULL_NAME, CARD, REGISTRATION_DATE, EXPIRATION_DATE, ATTENDANCES_BALANCE, MONEY_BALANCE, NOTE
    }

    ;

    /*
     * Business
     */
    private Boolean isPriviliged;
    private ClientDTO client;
    /*
     * Form
     */
    private List<Column> columnsList;
    private boolean openButton;
    /*
     * Presentation
     */
    private BindingGroup bindingGroup;
    private FormBindingListener formBindingListener;
    private JTextField attendancesBalanceTextField;
    private JTextField cardTextField;
    private JTextField expirationDateTextField;
    private JTextField fullNameTextField;
    private JTextField idTextField;
    private JTextField moneyBalanceTextField;
    private JScrollPane noteScrollPane;
    private JTextArea noteTextArea;
    private JTextField registrationDateTextField;
}