001    // Copyright 2006-2007 Daniel Gredler
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package net.sf.beanform;
016    
017    import java.util.Map;
018    
019    import net.sf.beanform.binding.DualBinding;
020    import net.sf.beanform.util.TapestryCompat;
021    
022    import org.apache.tapestry.IActionListener;
023    import org.apache.tapestry.IBinding;
024    import org.apache.tapestry.IComponent;
025    import org.apache.tapestry.IMarkupWriter;
026    import org.apache.tapestry.IRequestCycle;
027    import org.apache.tapestry.components.Block;
028    
029    /**
030     * A low level BeanForm component that renders the save, cancel, refresh and delete buttons.
031     * This component must be wrapped by a {@link BeanForm} component.
032     *
033     * @author Daniel Gredler
034     */
035    public abstract class BeanFormButtons extends BeanFormComponent {
036    
037        final static String CUSTOM_BUTTON_BLOCK_SUFFIX = "_Buttons";
038        final static String STANDARD_BUTTON_BLOCK_ID = "standardButtonBlock";
039    
040        final static String SAVE_BUTTON_ID = "save";
041        final static String CANCEL_BUTTON_ID = "cancel";
042        final static String REFRESH_BUTTON_ID = "refresh";
043        final static String DELETE_BUTTON_ID = "delete";
044    
045        Map<String, IBinding> saveBindings;
046        Map<String, IBinding> cancelBindings;
047        Map<String, IBinding> refreshBindings;
048        Map<String, IBinding> deleteBindings;
049    
050        @Override
051        protected void renderComponent( IMarkupWriter writer, IRequestCycle cycle ) {
052            this.initButtonBindings();
053            DualBinding.addCustomBindings( this.getComponent( SAVE_BUTTON_ID ), this.saveBindings, true );
054            DualBinding.addCustomBindings( this.getComponent( CANCEL_BUTTON_ID ), this.cancelBindings, true );
055            DualBinding.addCustomBindings( this.getComponent( REFRESH_BUTTON_ID ), this.refreshBindings, true );
056            DualBinding.addCustomBindings( this.getComponent( DELETE_BUTTON_ID ), this.deleteBindings, true );
057            super.renderComponent( writer, cycle );
058        }
059    
060        private synchronized void initButtonBindings() {
061            if( this.saveBindings != null ) return;
062            BeanForm bf = this.getBeanForm();
063            this.saveBindings = bf.extractBindingOverrides( SAVE_BUTTON_ID + BINDING_OVERRIDE_SEPARATOR );
064            this.cancelBindings = bf.extractBindingOverrides( CANCEL_BUTTON_ID + BINDING_OVERRIDE_SEPARATOR );
065            this.refreshBindings = bf.extractBindingOverrides( REFRESH_BUTTON_ID + BINDING_OVERRIDE_SEPARATOR );
066            this.deleteBindings = bf.extractBindingOverrides( DELETE_BUTTON_ID + BINDING_OVERRIDE_SEPARATOR );
067        }
068    
069        public IComponent getButtonBlock() {
070            String customButtonsId = this.getBeanForm().getId() + CUSTOM_BUTTON_BLOCK_SUFFIX;
071            Block customButtons = this.getSiblingComponent( customButtonsId, Block.class );
072            if( customButtons != null ) return customButtons;
073            else return this.getComponent( STANDARD_BUTTON_BLOCK_ID );
074        }
075    
076        public String getCancelJavaScript() {
077            return TapestryCompat.getCancelJavaScript();
078        }
079    
080        public String getRefreshJavaScript() {
081            return TapestryCompat.getRefreshJavaScript();
082        }
083    
084        public boolean getHasSave() {
085            return this.getBeanForm().getSave() != null;
086        }
087    
088        public boolean getHasCancel() {
089            return this.getBeanForm().getCancel() != null;
090        }
091    
092        public boolean getHasRefresh() {
093            return this.getBeanForm().getRefresh() != null;
094        }
095    
096        public boolean getHasDelete() {
097            return this.getBeanForm().getDelete() != null;
098        }
099    
100        public IActionListener getSaveListener() {
101            return this.getBeanForm().getSave();
102        }
103    
104        public IActionListener getDeleteListener() {
105            return this.getBeanForm().getDelete();
106        }
107    
108    }