package er.directtoweb.components; import org.apache.log4j.Logger; import com.webobjects.appserver.WOComponent; import com.webobjects.appserver.WOContext; import com.webobjects.directtoweb.D2WPage; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSDictionary; import er.directtoweb.delegates.ERDBranchDelegate; import er.directtoweb.delegates.ERDBranchDelegateInterface; import er.directtoweb.delegates.ERDBranchInterface; import er.extensions.security.ERXAccessPermission; /** * Displays a set of buttons and calls the enclosing page's branch delegate with it. * Its usable as an item in a repetition. * * @binding d2wContext the context for this component * * @author ak on Sun Jan 26 2003 */ public class ERDActionBar extends ERDCustomEditComponent implements ERDBranchInterface { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; /** logging support */ private static final Logger log = Logger.getLogger(ERDActionBar.class); /** * Public constructor * @param context the context */ public ERDActionBar(WOContext context) { super(context); } /** component does not synchronize it's variables */ @Override public boolean synchronizesVariablesWithBindings() { return false; } @Override public boolean isStateless() { return true; } /** find the next non-null NextPageDelegate in the component tree, break if there is a D2WPage found beforehand */ public ERDBranchDelegateInterface branchDelegate() { if(branchDelegate == null) { WOComponent current = parent(); while(current != null) { if((current instanceof D2WPage) && ((D2WPage)current).nextPageDelegate() instanceof ERDBranchDelegateInterface) { branchDelegate = (ERDBranchDelegateInterface)((D2WPage)current).nextPageDelegate(); } current = current.parent(); } } return branchDelegate; } public WOComponent nextPageFromParent() { if(branchDelegate() == null) return null; return branchDelegate().nextPage(this); } /** override this */ public WOComponent performAction() { return nextPageFromParent(); } @Override public void reset() { super.reset(); branch = null; branchChoices = null; branchDelegate = null; } //---------------- Branch Delegate Support --------------------// /** holds the chosen branch */ protected NSDictionary branch; protected NSArray branchChoices; protected ERDBranchDelegateInterface branchDelegate; /** * Cover method for getting the choosen branch. * @return user choosen branch. */ public NSDictionary branch() { return branch; } /** * Sets the user choosen branch. * @param value branch choosen by user. */ public void setBranch(NSDictionary value) { branch = value; } /** * Implementation of the {@link ERDBranchDelegate ERDBranchDelegate}. * Gets the user selected branch name. * @return user selected branch name. */ public String branchName() { return (String)branch().valueForKey("branchName"); } /** * Implementation of the {@link ERDBranchDelegate ERDBranchDelegate}. * Gets the user selected branch name. * @return user selected branch name. */ public String branchButtonLabel() { return (String)branch().valueForKey("branchButtonLabel"); } /** * Calculates the branch choices for the current * poage. This method is just a cover for calling * the method <code>branchChoicesForContext</code> * on the current {@link ERDBranchDelegate ERDBranchDelegate}. * @return array of branch choices */ public NSArray branchChoices() { if (branchDelegate() != null) { branchChoices = branchDelegate().branchChoicesForContext(d2wContext()); } else { branchChoices = NSArray.EmptyArray; } return branchChoices; } /** * Determines if this message page should display branch choices. * * @return if the current delegate supports branch choices. */ public boolean hasBranchChoices() { return branchDelegate() != null && branchChoices().count() > 0; } @Override public void validationFailedWithException(Throwable theException,Object theValue, String theKeyPath) { parent().validationFailedWithException(theException, theValue, theKeyPath); if(log.isInfoEnabled()) log.info("" + theException + theValue + theKeyPath); } /** * <span class="en"> * Before Display the Button it will check the Permission. If no Permission are set it * will return true, and Display the Button. (Default) * * Sample: * <code>public WOComponent copyOnlineToWork(WOComponent sender)</code> * * Access Permission Key : <code>Delegate.copyOnlineToWork</code> * </span> * * <span class="ja"> * ボタンを表示する前にアクセス権限をチェックします。アクセス権限がなければ、そのままで true として実行します。 * * 例: * <code>public WOComponent copyOnlineToWork(WOComponent sender)</code> * * アクセス権限キー: <code>Delegate.copyOnlineToWork</code> * </span> * * @author ishimoto */ public boolean isDelegateAllowed() { return ERXAccessPermission.instance().canWithDefault("Delegate." + branchName(), true); } }