/* * Copyright 2008 Niclas Hedhman. All rights Reserved. * * 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.qi4j.lib.swing.binding.example; import org.qi4j.api.property.Property; import org.qi4j.lib.swing.binding.StateModel; import javax.swing.*; import java.awt.*; public class Form<T extends BoundPersonComposite> extends JPanel { private final StateModel<T> aModel; public Form( StateModel<T> aModel ) { this.aModel = aModel; T state = aModel.state(); JPanel firstNameField = newPersonFirstNameField( aModel, state ); add( firstNameField ); JPanel userAddressLine1Field = newUserFirstLineAddressField( aModel, state ); add( userAddressLine1Field ); JPanel userAddressLine2Field = newUserSecondLineAddressField( aModel, state ); add( userAddressLine2Field ); JPanel userCityField = newUserCityField( aModel, state ); add( userCityField ); JPanel userCountryField = newUserCountryField( aModel, state ); add( userCountryField ); setLayout( new BoxLayout( this, BoxLayout.Y_AXIS ) ); } public StateModel<T> getAModel() { return aModel; } private JPanel newPersonFirstNameField( StateModel<T> aModel, T aModelState ) { Property<String> property = aModelState.firstName(); return newTextPanel( aModel, property, "First Name:" ); } private JPanel newUserFirstLineAddressField( StateModel<T> aModel, T aModelState ) { Property<String> property = aModelState.address().get().line1(); return newTextPanel( aModel, property, "Address:" ); } private JPanel newUserSecondLineAddressField( StateModel<T> aModel, T state ) { Property<String> property = state.address().get().line2(); return newTextPanel( aModel, property, "" ); } private JPanel newUserCityField( StateModel<T> aModel, T state ) { Property<String> property = state.address().get().city().get().name(); return newTextPanel( aModel, property, "City:" ); } private JPanel newUserCountryField( StateModel<T> aModel, T state ) { Property<String> property = state.address().get().city().get().country().get().name(); return newTextPanel( aModel, property, "Country:" ); } private JPanel newTextPanel( StateModel<T> aModel, Property<String> property, String fieldName ) { JPanel panel = new JPanel(); JLabel label = new JLabel( fieldName ); label.setPreferredSize( new Dimension( 100, 20 ) ); panel.add( label ); JTextField textField = new JTextField(); panel.add( textField ); textField.setPreferredSize( new Dimension( 100, 20 ) ); aModel.bind( property ).to( textField ); return panel; } }