001 /** 002 * Copyright 2005-2014 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.krad.uif.widget; 017 018 import org.kuali.rice.krad.datadictionary.parse.BeanTag; 019 import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute; 020 import org.kuali.rice.krad.uif.component.ClientSideState; 021 import org.kuali.rice.krad.uif.component.Component; 022 import org.kuali.rice.krad.uif.view.View; 023 024 /** 025 * Decorates a group with collapse/expand functionality 026 * 027 * @author Kuali Rice Team (rice.collab@kuali.org) 028 */ 029 @BeanTag(name = "disclosure-bean", parent = "Uif-Disclosure") 030 public class Disclosure extends WidgetBase { 031 private static final long serialVersionUID = 1238789480161901850L; 032 033 private String collapseImageSrc; 034 private String expandImageSrc; 035 036 private int animationSpeed; 037 038 @ClientSideState(variableName = "open") 039 private boolean defaultOpen; 040 private boolean ajaxRetrievalWhenOpened; 041 042 private boolean renderImage; 043 044 public Disclosure() { 045 super(); 046 047 defaultOpen = true; 048 renderImage = true; 049 050 } 051 052 /** 053 * Sets forceSessionPersistence when using the ajax retrieval option 054 * 055 * @see Component#performApplyModel(org.kuali.rice.krad.uif.view.View, Object, org.kuali.rice.krad.uif.component.Component) 056 */ 057 @Override 058 public void performApplyModel(View view, Object model, Component parent) { 059 super.performFinalize(view, model, parent); 060 061 if(ajaxRetrievalWhenOpened){ 062 parent.setForceSessionPersistence(true); 063 } 064 } 065 066 /** 067 * Path to the images that should be displayed to collapse the group 068 * 069 * @return image path 070 */ 071 @BeanTagAttribute(name="CollapseImageSrc") 072 public String getCollapseImageSrc() { 073 return this.collapseImageSrc; 074 } 075 076 /** 077 * Setter for the collapse image path 078 * 079 * @param collapseImageSrc 080 */ 081 public void setCollapseImageSrc(String collapseImageSrc) { 082 this.collapseImageSrc = collapseImageSrc; 083 } 084 085 /** 086 * Path to the images that should be displayed to expand the group 087 * 088 * @return image path 089 */ 090 @BeanTagAttribute(name="expandImageSrc") 091 public String getExpandImageSrc() { 092 return this.expandImageSrc; 093 } 094 095 /** 096 * Setter for the expand image path 097 * 098 * @param expandImageSrc 099 */ 100 public void setExpandImageSrc(String expandImageSrc) { 101 this.expandImageSrc = expandImageSrc; 102 } 103 104 /** 105 * Gives the speed for the open/close animation, a smaller int will result 106 * in a faster animation 107 * 108 * @return animation speed 109 */ 110 @BeanTagAttribute(name="animationSpeed") 111 public int getAnimationSpeed() { 112 return this.animationSpeed; 113 } 114 115 /** 116 * Setter for the open/close animation speed 117 * 118 * @param animationSpeed 119 */ 120 public void setAnimationSpeed(int animationSpeed) { 121 this.animationSpeed = animationSpeed; 122 } 123 124 /** 125 * Indicates whether the group should be initially open 126 * 127 * @return true if group should be initially open, false if it 128 * should be closed 129 */ 130 @BeanTagAttribute(name="defaultOpen") 131 public boolean isDefaultOpen() { 132 return this.defaultOpen; 133 } 134 135 /** 136 * Setter for the default open indicator 137 * 138 * @param defaultOpen 139 */ 140 public void setDefaultOpen(boolean defaultOpen) { 141 this.defaultOpen = defaultOpen; 142 } 143 144 /** 145 * When true, the group content will be retrieved when the disclosure is opened 146 * 147 * <p>This only works if by default, the disclosure is closed.</p> 148 * 149 * @return true if use ajax retrieval when disclosure opens, false otherwise 150 */ 151 public boolean isAjaxRetrievalWhenOpened() { 152 return ajaxRetrievalWhenOpened; 153 } 154 155 /** 156 * Set ajaxRetrievalWhenOpened 157 * 158 * @param ajaxRetrievalWhenOpened 159 */ 160 public void setAjaxRetrievalWhenOpened(boolean ajaxRetrievalWhenOpened) { 161 this.ajaxRetrievalWhenOpened = ajaxRetrievalWhenOpened; 162 } 163 164 /** 165 * Indicates whether the expand/collapse image should be rendered for the closure, if set to false only 166 * the group title will be clickable 167 * 168 * @return true to render the expand/colapse image false to not 169 */ 170 @BeanTagAttribute(name="renderImage") 171 public boolean isRenderImage() { 172 return renderImage; 173 } 174 175 /** 176 * Setter for the render expand/collapse image indicator 177 * 178 * @param renderImage 179 */ 180 public void setRenderImage(boolean renderImage) { 181 this.renderImage = renderImage; 182 } 183 184 /** 185 * @see org.kuali.rice.krad.uif.component.ComponentBase#copy() 186 */ 187 @Override 188 protected <T> void copyProperties(T component) { 189 super.copyProperties(component); 190 Disclosure disclosureCopy = (Disclosure) component; 191 disclosureCopy.setAnimationSpeed(this.animationSpeed); 192 disclosureCopy.setCollapseImageSrc(this.collapseImageSrc); 193 disclosureCopy.setDefaultOpen(this.defaultOpen); 194 disclosureCopy.setAjaxRetrievalWhenOpened(this.ajaxRetrievalWhenOpened); 195 disclosureCopy.setExpandImageSrc(this.expandImageSrc); 196 disclosureCopy.setRenderImage(this.renderImage); 197 } 198 }