From: <bob...@us...> - 2009-02-04 22:22:12
|
Revision: 8901 http://wonder.svn.sourceforge.net/wonder/?rev=8901&view=rev Author: bob_schwarzmann Date: 2009-02-04 22:22:09 +0000 (Wed, 04 Feb 2009) Log Message: ----------- Merged revisions 8828-8829,8849,8853-8854,8857,8859,8862-8863,8866,8876,8878,8886,8899-8900 via svnmerge from https://wonder.svn.sourceforge.net/svnroot/wonder/branches/Wonder_2_0_0_Branch/Wonder ........ r8828 | tcripps | 2009-01-21 19:20:44 -0800 (Wed, 21 Jan 2009) | 1 line Making the class presence verification during entity registration opt-in. ........ r8829 | tcripps | 2009-01-22 17:56:12 -0800 (Thu, 22 Jan 2009) | 1 line Changed opt-in to opt-out. ........ r8849 | tcripps | 2009-01-26 14:01:23 -0800 (Mon, 26 Jan 2009) | 1 line Target of the hyperlink is now configurable. ........ r8853 | tcripps | 2009-01-27 14:19:35 -0800 (Tue, 27 Jan 2009) | 1 line Inching closer to the trunk. ........ r8854 | tcripps | 2009-01-27 14:21:39 -0800 (Tue, 27 Jan 2009) | 1 line Adding a reset-like hook for stateful, non-synching components ........ r8857 | tcripps | 2009-01-27 15:33:26 -0800 (Tue, 27 Jan 2009) | 1 line Adding some utility methods for common operations and a method for getting the destination entity's sort orderings. ........ r8859 | tcripps | 2009-01-27 15:58:51 -0800 (Tue, 27 Jan 2009) | 1 line Small fix to the count statement generation from trunk ........ r8862 | tcripps | 2009-01-28 15:15:22 -0800 (Wed, 28 Jan 2009) | 1 line Bringing down ERXStringUtilities.isValueInRange method ........ r8863 | tcripps | 2009-01-28 15:33:32 -0800 (Wed, 28 Jan 2009) | 1 line Brought back the latest ajax updates from trunk. ........ r8866 | tcripps | 2009-01-28 20:08:49 -0800 (Wed, 28 Jan 2009) | 1 line Removed rule that was providing an incorrect default value for branchChoices. ........ r8876 | tcripps | 2009-01-30 17:04:31 -0800 (Fri, 30 Jan 2009) | 1 line Workaround for a bug causing property values to be "lost" when configuration changes were reloaded. ........ r8878 | dscheck | 2009-01-31 07:46:55 -0800 (Sat, 31 Jan 2009) | 1 line Fixed d2wContext used for export so it can pickup an alternate displayPropertyKeys if in supplied context ........ r8886 | tcripps | 2009-02-02 15:11:24 -0800 (Mon, 02 Feb 2009) | 1 line Updated AjaxAutoComplete from trunk. ........ r8899 | mschrag | 2009-02-04 08:02:38 -0800 (Wed, 04 Feb 2009) | 1 line "Exposing 2 primitive accessors in NSDictionary in order to allow class-cluster-style subclasses." ........ r8900 | tcripps | 2009-02-04 11:43:36 -0800 (Wed, 04 Feb 2009) | 1 line Pulled down enhancements to modal dialog, AjaxComponent and AjaxDynamicElement classes from trunk ........ Modified Paths: -------------- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.api branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.wod branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxFunctionLink.api branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.api branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.wo/AjaxModalDialog.html branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Resources/Properties branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxComponent.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxDynamicElement.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxFunctionLink.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalContainer.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalDialog.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxResponse.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxUtils.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/WebServerResources/modalbox.js branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Components/Nonlocalized.lproj/ERD2WDisplayURL.wo/ERD2WDisplayURL.html branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Components/Nonlocalized.lproj/ERD2WDisplayURL.wo/ERD2WDisplayURL.wod branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Resources/d2w.d2wmodel branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERD2WDisplayURL.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERD2WFactory.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERDCustomComponent.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERDirectToWeb/Sources/er/directtoweb/ERDCustomEditComponent.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERExcelLook/Sources/er/directtoweb/excel/ERExcelExportButton.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXDirectAction.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXEntityClassDescription.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXNonSynchronizingComponent.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXProperties.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXSQLHelper.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXStringUtilities.java Added Paths: ----------- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/.settings/org.eclipse.core.resources.prefs branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxSocialNetwork.java branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/compress.sh branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/scriptaculous_patched.js branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/yuicompressor-2.4.1.jar branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/WebServerResources/wondaculous-min.js branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/WebServerResources/wondaculous.js Removed Paths: ------------- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/compress.sh branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/scriptaculous_patched.js branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/yuicompressor-2.4.1.jar Property Changed: ---------------- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/ Property changes on: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder ___________________________________________________________________ Modified: svnmerge-integrated - /branches/Wonder_2_0_0_Branch/Wonder:1-8825 + /branches/Wonder_2_0_0_Branch/Wonder:1-8900 Modified: svn:mergeinfo - /branches/Wonder_2_0_0_Branch/Wonder:8813 + /branches/Wonder_2_0_0_Branch/Wonder:8813,8828-8900 Copied: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/.settings/org.eclipse.core.resources.prefs (from rev 8900, branches/Wonder_2_0_0_Branch/Wonder/Ajax/Ajax/.settings/org.eclipse.core.resources.prefs) =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/.settings/org.eclipse.core.resources.prefs (rev 0) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/.settings/org.eclipse.core.resources.prefs 2009-02-04 22:22:09 UTC (rev 8901) @@ -0,0 +1,9 @@ +#Mon Nov 24 15:19:47 PST 2008 +eclipse.preferences.version=1 +encoding//Components/AjaxModalDialogOpener.api=UTF-8 +encoding//Components/AjaxModalDialogOpener.wo=UTF-8 +encoding//Components/AjaxModalDialogOpener.wo/AjaxModalDialogOpener.html=UTF-8 +encoding//Components/AjaxModalDialogOpener.wo/AjaxModalDialogOpener.wod=UTF-8 +encoding//Components/AjaxModalDialogOpener.wo/AjaxModalDialogOpener.woo=UTF-8 +encoding//Sources/er/ajax/AjaxModalDialogOpener.java=UTF-8 +encoding/Components=UTF-8 Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.api =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.api 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.api 2009-02-04 22:22:09 UTC (rev 8901) @@ -27,5 +27,7 @@ </validation> <binding name="accesskey"/> <binding name="tabindex"/> + <binding name="default"/> + <binding name="id"/> </wo> </wodefinitions> Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.wod =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.wod 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.wod 2009-02-04 22:22:09 UTC (rev 8901) @@ -36,4 +36,5 @@ onchange = ^onchange; accesskey = ^accesskey; tabindex = ^tabindex; + default = ^default; } Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxFunctionLink.api =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxFunctionLink.api 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxFunctionLink.api 2009-02-04 22:22:09 UTC (rev 8901) @@ -5,6 +5,7 @@ <binding name="otherTagString" passthrough="NO"/> <binding name="disabled" passthrough="NO" defaults="YES/NO"/> <binding name="onclick" passthrough="YES"/> + <binding name="onClick" passthrough="YES"/> <binding name="updateContainerID"/> <binding name="action"/> Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.api =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.api 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.api 2009-02-04 22:22:09 UTC (rev 8901) @@ -16,6 +16,7 @@ <binding name="class"/> <binding name="style"/> <binding defaults="Boolean" name="overlayClose"/> + <binding defaults="Boolean" name="locked"/> <binding name="method"/> <binding name="params"/> <binding name="loadingString"/> Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.wo/AjaxModalDialog.html =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.wo/AjaxModalDialog.html 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Components/AjaxModalDialog.wo/AjaxModalDialog.html 2009-02-04 22:22:09 UTC (rev 8901) @@ -1 +1 @@ -<webobject name = "DialogUpdater"><webobject name = "Content"/></webobject> \ No newline at end of file +<webobject name = "Content"/> \ No newline at end of file Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Resources/Properties =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Resources/Properties 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Resources/Properties 2009-02-04 22:22:09 UTC (rev 8901) @@ -0,0 +1,13 @@ +# Set ALL of the following properties to use a compressed version of the various scripts +#er.extensions.ERXResponseRewriter.resource.Ajax.prototype.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.scriptaculous.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.builder.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.effects.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.dragdrop.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.controls.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.slider.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.sound.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.modalbox.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.wonder.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.wonder_inplace.js=Ajax.wondaculous-min.js +#er.extensions.ERXResponseRewriter.resource.Ajax.switchtabs.js=Ajax.wondaculous-min.js Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -73,6 +73,7 @@ * @binding ignoreCase Look at the scriptaculous documentation (Local only) * @binding accesskey hot key that should activate the text field (optional) * @binding tabindex tab index of the text field (optional) + * @binding default hint for the text field, when used together with {@link AjaxTextHinter}. * * @author ak */ Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxComponent.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxComponent.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxComponent.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -11,6 +11,7 @@ import com.webobjects.foundation.NSKeyValueCoding; import er.extensions.ERXWOContext; +import er.extensions.ERXAjaxApplication; import er.extensions.ERXValueUtilities; /** @@ -86,13 +87,13 @@ } /** - * Execute the request, if it's comming from our action, then invoke the + * Execute the request, if it's coming from our action, then invoke the * ajax handler and put the key <code>AJAX_REQUEST_KEY</code> in the * request userInfo dictionary (<code>request.userInfo()</code>). */ public WOActionResults invokeAction(WORequest request, WOContext context) { Object result; - if (AjaxUtils.shouldHandleRequest(request, context, _containerID(context))) { + if (shouldHandleRequest(request, context)) { result = handleRequest(request, context); AjaxUtils.updateMutableUserInfoWithAjaxInfo(context()); if (result == null) { @@ -104,10 +105,21 @@ return (WOActionResults) result; } + /** + * Returns the ID that represents this container for the purposes of Ajax updates. In common cases, + * this corresponds to your updateContainerID. + * + * @param context the current context + * @return your container ID + */ protected String _containerID(WOContext context) { return null; } + protected boolean shouldHandleRequest(WORequest request, WOContext context) { + return AjaxUtils.shouldHandleRequest(request, context, _containerID(context)); + } + public String safeElementID() { String id = (String)valueForBinding("id"); if(id == null) { Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxDynamicElement.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxDynamicElement.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxDynamicElement.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -79,7 +79,7 @@ */ public WOActionResults invokeAction(WORequest request, WOContext context) { Object result = null; - if (AjaxUtils.shouldHandleRequest(request, context, _containerID(context))) { + if (shouldHandleRequest(request, context)) { WOComponent component = context.component(); String elementID = context.elementID(); AjaxResponse response = AjaxUtils.createResponse(request, context); @@ -104,6 +104,10 @@ return null; } + protected boolean shouldHandleRequest(WORequest request, WOContext context) { + return AjaxUtils.shouldHandleRequest(request, context, _containerID(context)); + } + /** * Overridden to call {@link #addRequiredWebResources(WOResponse)}. */ Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxFunctionLink.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxFunctionLink.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxFunctionLink.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -26,6 +26,7 @@ * * @binding disabled if true, disables the link * @binding onclick the javascript to execute when the link is clicked. + * @binding onClick synonym of onclick * @binding action the type of event to fire ("update", "save", "edit", "cancel") * @binding updateContainerID the id of the container to fire the event to (optional if inside of the container) * @@ -40,7 +41,11 @@ super("a", AjaxFunctionLink.processAssociations(associations), template); _action = (WOAssociation) _associations.removeObjectForKey("action"); _updateContainerID = (WOAssociation) _associations.removeObjectForKey("updateContainerID"); - if (_associations.objectForKey("onclick") != null && _action != null) { + WOAssociation onclick = (WOAssociation) _associations.objectForKey("onclick"); + if (onclick == null) { + onclick = (WOAssociation) _associations.objectForKey("onClick"); + } + if (onclick != null && _action != null) { throw new WODynamicElementCreationException("You cannot bind both 'action' and 'onclick' at the same time."); } if (_updateContainerID != null && _action == null) { Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalContainer.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalContainer.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalContainer.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -21,7 +21,7 @@ import er.extensions.ERXMutableURL; import er.extensions.ERXStringUtilities; /** - * Shows a link and wraps an area that is later presented as a modal window. + * Shows a link and wraps an area that is later presented as a modal window. Alternately, when you bind <b>action</b> then the content is used as the link. * @binding label label for the link * @binding class class for the link * @binding style style for the link @@ -112,7 +112,6 @@ // don't use ajax request handler here href = context.componentActionURL(); } - else if(href == null) { href = "#" + containerID; } @@ -123,10 +122,10 @@ Object width = valueForBinding("width", component); Object closeLabel = valueForBinding("closeLabel", component); if (height != null) { - relAttributeValue += "&height=" + height; + relAttributeValue += "&height=" + ERXStringUtilities.urlEncode(height.toString()); } if (width != null) { - relAttributeValue += "&width=" + width; + relAttributeValue += "&width=" + ERXStringUtilities.urlEncode(width.toString()); } if (closeLabel != null) { relAttributeValue += "&closeLabel=" + ERXStringUtilities.urlEncode(closeLabel.toString()); @@ -141,7 +140,12 @@ appendTagAttributeToResponse(response, "style", valueForBinding("style", component)); appendTagAttributeToResponse(response, "id", linkID); response.appendContentString(">"); - response.appendContentString(valueForBinding("label", "", component).toString()); + if(!href.startsWith("#") && childrenElements().count() > 0) { + appendChildrenToResponse(response, context); + } else { + Object label = valueForBinding("label", "", component); + response.appendContentString(label.toString()); + } response.appendContentString("</a>"); if (AjaxUtils.isAjaxRequest(context.request())) { NSMutableDictionary userInfo = AjaxUtils.mutableUserInfo(response); Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalDialog.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalDialog.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxModalDialog.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -9,8 +9,10 @@ import com.webobjects.appserver.WOResponse; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation.NSMutableDictionary; +import com.webobjects.foundation.NSPathUtilities; import er.extensions.ERXWOContext; +import er.extensions.ERXAjaxApplication; import er.extensions.ERXWOForm; /** @@ -45,7 +47,6 @@ * <code> * AjaxModalDialog.update(context()); * </code> - * <br /><b>NOTE: this does not work if you use the action binding. You must manage your own updating if you use this binding.</b> * </p> * * <p>The modal dialog is opened by calling a JavaScript function. While this is normally done from an onclick @@ -79,6 +80,8 @@ * @binding style CSS style for the link activating the modal dialog * * @binding overlayClose true | false Close modal box by clicking on overlay. Default is true. + * @binding locked if true, suppresses the close window link, prevents Esc key and overlay from closing dialog. Default is false, + * true implies overlayClose false * @binding method get | post. Method of passing variables to a server. Default is 'get'. * @binding params {} Collection of parameters to pass on AJAX request. Should be URL-encoded. See PassingFormValues for details. * @@ -93,7 +96,8 @@ * @binding resizeDuration Modalbox resize duration in seconds. * @binding inactiveFade true | false, Toggles Modalbox window fade on inactive state. * @binding transitions true | false, Toggles transition effects. Transitions are enabled by default. - * @binding autoFocusing true | false, Toggles auto-focusing for form elements. Disable it for long text pages. + * @binding autoFocusing true | false, Toggles auto-focusing for form elements. Disable it for long text pages. Add the class MB_notFocusable to + * any inputs you want excluded from focusing. * * @binding beforeLoad client side method, fires right before loading contents into the ModalBox. If the callback function returns false, content loading will skipped. This can be used for redirecting user to another MB-page for authorization purposes for example. * @binding afterLoad client side method, fires after loading content into the ModalBox (i.e. after showing or updating existing window). @@ -118,8 +122,18 @@ /** JavaScript to execute on the client to close the modal dialog */ public static final String Close = "AMD.close();"; + /** Element ID suffix indicating an Open Dialog action. */ + public static final String Open_ElementID_Suffix = ".open"; + + /** Element ID suffix indicating an C Dialog action. */ + public static final String Close_ElementID_Suffix = ".close"; + + private boolean _open; private WOComponent _actionResults; + private AjaxModalDialog outerDialog; + private boolean hasWarnedOnNesting = false; + private WOComponent previousComponent; public static final Logger logger = Logger.getLogger(AjaxModalDialog.class); @@ -237,14 +251,33 @@ */ public void takeValuesFromRequest(WORequest request, WOContext context) { if (isOpen()) { + try { + pushDialog(); + String previousUpdateContainerID = AjaxUpdateContainer.currentUpdateContainerID(); + try { + AjaxUpdateContainer.setCurrentUpdateContainerID(updateContainerID()); if (_actionResults != null) { - context._setCurrentComponent(_actionResults); + pushActionResultsIntoContext(context); + try { _actionResults.takeValuesFromRequest(request, context); } + finally { + popActionResultsFromContext(context); + } + } else { super.takeValuesFromRequest(request, context); } } + finally { + AjaxUpdateContainer.setCurrentUpdateContainerID(previousUpdateContainerID); + } + } + finally { + popDialog(); + } + + } } /** @@ -256,42 +289,65 @@ * @see com.webobjects.appserver.WOComponent#takeValuesFromRequest(com.webobjects.appserver.WORequest, com.webobjects.appserver.WOContext) */ public WOActionResults invokeAction(WORequest request, WOContext context) { - // If there is one AMD in another (a rather dubious thing to do but it may have its uses), - // we need to remember the outer one while processing this inner one - AjaxModalDialog outerDialog = (AjaxModalDialog) ERXWOContext.contextDictionary().objectForKey(AjaxModalDialog.class.getName()); - if (outerDialog != null) { - logger.warn("AjaxModalDialog " + id() + " is nested inside of " + outerDialog.id() + ". Are you sure you want to do this?"); - } - + pushDialog(); try { - // Stash this component in the context so we can access it from the static methods. - ERXWOContext.contextDictionary().setObjectForKey(this, AjaxModalDialog.class.getName()); - WOActionResults result = null; - if (AjaxUtils.shouldHandleRequest(request, context, _containerID(context))) { + if (shouldHandleRequest(request, context)) { result = super.invokeAction(request, context); } else if (isOpen()) { + String previousUpdateContainerID = AjaxUpdateContainer.currentUpdateContainerID(); + try { + AjaxUpdateContainer.setCurrentUpdateContainerID(updateContainerID()); if (_actionResults != null) { - context._setCurrentComponent(_actionResults); + pushActionResultsIntoContext(context); + try { result = _actionResults.invokeAction(request, context); } + finally { + popActionResultsFromContext(context); + } + } else { result = super.invokeAction(request, context); } } + finally { + AjaxUpdateContainer.setCurrentUpdateContainerID(previousUpdateContainerID); + } + } return result; } finally { - // Remove this component from the context or restore the outer one - if (outerDialog != null) { - ERXWOContext.contextDictionary().setObjectForKey(outerDialog, AjaxModalDialog.class.getName()); + popDialog(); + } + } + + /** + * Removes Open_ElementID_Suffix or Close_ElementID_Suffix before evaluating senderID. + * + * @see er.ajax.AjaxComponent#shouldHandleRequest(com.webobjects.appserver.WORequest, com.webobjects.appserver.WOContext) + * + * @return <code>true</code> if this request is for this component + */ + protected boolean shouldHandleRequest(WORequest request, WOContext context) { + String elementID = context.elementID(); + String senderID = context.senderID(); + if (senderID.endsWith(Open_ElementID_Suffix) || senderID.endsWith(Close_ElementID_Suffix)) { + senderID = NSPathUtilities.stringByDeletingPathExtension(senderID); + } + String containerID = _containerID(context); + String updateContainerID = null; + if (containerID != null) { + if (AjaxResponse.isAjaxUpdatePass(request)) { + updateContainerID = AjaxUpdateContainer.updateContainerID(request); } - else { - ERXWOContext.contextDictionary().removeObjectForKey(AjaxModalDialog.class.getName()); - } } + boolean shouldHandleRequest = elementID != null && (elementID.equals(senderID) || + (containerID != null && containerID.equals(updateContainerID)) || + elementID.equals(ERXAjaxApplication.ajaxSubmitButtonName(request))); + return shouldHandleRequest; } /** @@ -303,7 +359,7 @@ */ public WOActionResults handleRequest(WORequest request, WOContext context) { WOActionResults response = null; - String modalBoxAction = request.stringFormValueForKey("modalBoxAction"); + String modalBoxAction = NSPathUtilities.pathExtension(context.senderID()); if ("close".equals(modalBoxAction) && isOpen()) { closeDialog(); @@ -330,16 +386,30 @@ // it comes time to cache the context, it knows that this area is an Ajax updating area AjaxUtils.setPageReplacementCacheKey(context, _containerID(context)); + appendOpenAjaxUpdateDiv((WOResponse) response, context); + String previousUpdateContainerID = AjaxUpdateContainer.currentUpdateContainerID(); + try { + AjaxUpdateContainer.setCurrentUpdateContainerID(updateContainerID()); if (_actionResults != null) { - context._setCurrentComponent(_actionResults); + pushActionResultsIntoContext(context); + try { _actionResults.appendToResponse((WOResponse) response, context); } + finally { + popActionResultsFromContext(context); + } + } else { // This loads the content from the default ERWOTemplate (our component contents that are not // in the "link" template. super.appendToResponse((WOResponse) response, context); } } + finally { + AjaxUpdateContainer.setCurrentUpdateContainerID(previousUpdateContainerID); + } + appendCloseAjaxUpdateDiv((WOResponse) response, context); + } return response; } @@ -368,12 +438,21 @@ closeDialog(); } - if (isOpen()) { + // If we are open, but the request is not for us, don't render the content. + // This shouldHandleRequest prevents showing an open dialog in the page when + // an AUC refreshes + if (isOpen() && shouldHandleRequest(context.request(), context)) { if (_actionResults != null) { throw new RuntimeException("Unexpected call to appendToResponse"); } + try { + pushDialog(); super.appendToResponse(response, context); } + finally { + popDialog(); + } + } else { boolean showOpener = booleanValueForBinding("showOpener", true); @@ -435,11 +514,38 @@ response.appendContentString(";\n"); response.appendContentString(" if (titleBarText) options.title = titleBarText;\n"); response.appendContentString(" Modalbox.show('"); + response.appendContentString(openDialogURL(context)); + response.appendContentString("', options);\n"); + } + + /** + * Appends opening div that will function as an AjaxUpdateContainer. + * + * @param response WOResponse to append to + * @param context WOContext of response + */ + protected void appendOpenAjaxUpdateDiv(WOResponse response, WOContext context) { + response.appendContentString("<div id=\""); + response.appendContentString(updateContainerID()); + response.appendContentString("\" updateUrl=\""); response.appendContentString(AjaxUtils.ajaxComponentActionUrl(context)); - response.appendContentString("?modalBoxAction=open', options);\n"); + response.appendContentString("\">"); } /** + * Appends closing div that will function as an AjaxUpdateContainer and the JavaScript to register it. + * + * @param response WOResponse to append to + * @param context WOContext of response + */ + protected void appendCloseAjaxUpdateDiv(WOResponse response, WOContext context) { + response.appendContentString("</div>"); + response.appendContentString("<script>AUC.register('"); + response.appendContentString(updateContainerID()); + response.appendContentString("', {onComplete:function() { Modalbox.resizeToContent(); }});</script>"); + } + + /** * End of R-R loop. Puts the components from action to sleep if action is bound. * * @see com.webobjects.appserver.WOComponent#sleep() @@ -482,7 +588,7 @@ * @return id() */ protected String _containerID(WOContext context) { - return id(); + return updateContainerID(); } /** @@ -525,6 +631,7 @@ ajaxOptionsArray.addObject(new AjaxOption("loadingString", AjaxOption.STRING)); ajaxOptionsArray.addObject(new AjaxOption("closeString", AjaxOption.STRING)); ajaxOptionsArray.addObject(new AjaxOption("closeValue", AjaxOption.STRING)); + ajaxOptionsArray.addObject(new AjaxOption("locked", AjaxOption.BOOLEAN)); ajaxOptionsArray.addObject(new AjaxOption("overlayOpacity", AjaxOption.NUMBER)); ajaxOptionsArray.addObject(new AjaxOption("overlayDuration", AjaxOption.NUMBER)); ajaxOptionsArray.addObject(new AjaxOption("slideDownDuration", AjaxOption.NUMBER)); @@ -547,10 +654,10 @@ String closeUpdateContainerID = AjaxUpdateContainer.updateContainerID((String) valueForBinding("closeUpdateContainerID")); String serverUpdate; if (closeUpdateContainerID == null) { - serverUpdate = " AUL.request('" + AjaxUtils.ajaxComponentActionUrl(context()) + "', null, null, 'modalBoxAction=close');"; + serverUpdate = " AUL.request('" + closeDialogURL(context()) + "', null, null, null);"; } else { - serverUpdate = " AUL._update('" + closeUpdateContainerID + "', '" + AjaxUtils.ajaxComponentActionUrl(context()) + "', null, null, 'modalBoxAction=close');"; + serverUpdate = " AUL._update('" + closeUpdateContainerID + "', '" + closeDialogURL(context()) + "', null, null, null);"; } if (hasBinding("afterHide")) { @@ -583,4 +690,71 @@ addStylesheetResourceInHead(response, "modalbox.css"); } + /** + * Stash this dialog instance in the context so we can access it from the static methods. If there is one AMD + * next in another (a rather dubious thing to do that we warn about but it may have its uses), we need to remember + * the outer one while processing this inner one + * @see AjaxModalDialog#popDialog() + */ + protected void pushDialog() { + // + // + outerDialog = (AjaxModalDialog) ERXWOContext.contextDictionary().objectForKey(AjaxModalDialog.class.getName()); + ERXWOContext.contextDictionary().setObjectForKey(this, AjaxModalDialog.class.getName()); + if ( ! hasWarnedOnNesting && outerDialog != null) { + hasWarnedOnNesting = true; + logger.warn("AjaxModalDialog " + id() + " is nested inside of " + outerDialog.id() + ". Are you sure you want to do this?"); + } + + } + + /** + * Remove this dialog instance from the context, replacing the previous one if any. + * @see #pushDialog() + */ + protected void popDialog() { + if (outerDialog != null) { + ERXWOContext.contextDictionary().setObjectForKey(outerDialog, AjaxModalDialog.class.getName()); + } + else { + ERXWOContext.contextDictionary().removeObjectForKey(AjaxModalDialog.class.getName()); + } + } + + /** + * Make _actionResults (result of the action binding) the current component in context for WO processing. + * Remembers the current component so that it can be restored. + * @param context WOContext to push _cationResults into + * @see #popActionResultsFromContext(WOContext) + */ + protected void pushActionResultsIntoContext(WOContext context) { + previousComponent = context.component(); + context._setCurrentComponent(_actionResults); + } + + /** + * Sets the current component in context to the one there before pushActionResultsIntoContext + * was called. + * @param context WOContext to restore previous component in + * @see #pushActionResultsIntoContext(WOContext) + */ + protected void popActionResultsFromContext(WOContext context) { + context._setCurrentComponent(previousComponent); + } + + /** + * @param context WOContext to create URL in + * @return URL to invoke when the dialog is opened + */ + protected String openDialogURL(WOContext context) { + return new StringBuffer(AjaxUtils.ajaxComponentActionUrl(context)).append(Open_ElementID_Suffix).toString(); + } + + /** + * @param context WOContext to create URL in + * @return URL to invoke when the dialog is closed + */ + protected String closeDialogURL(WOContext context) { + return new StringBuffer(AjaxUtils.ajaxComponentActionUrl(context)).append(Close_ElementID_Suffix).toString(); + } } Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxResponse.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxResponse.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxResponse.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -145,4 +145,35 @@ return finalActionResults; } } + + /** + * Convenience method that calls <code>AjaxUtils.appendScriptHeaderIfNecessary</code> with this request. + * @see AjaxUtils#appendScriptHeaderIfNecessary + */ + public void appendScriptHeaderIfNecessary() { + AjaxUtils.appendScriptHeaderIfNecessary(_request, this); + } + + /** + * Convenience method that calls <code>AjaxUtils.appendScriptFooterIfNecessary</code> with this request. + * @see AjaxUtils#appendScriptFooterIfNecessary + */ + public void appendScriptFooterIfNecessary() { + AjaxUtils.appendScriptFooterIfNecessary(_request, this); + } + + /** + * Convenience method that calls <code>AjaxUtils.updateDomElement</code> with this request. + * @see AjaxUtils#updateDomElement + */ + public void updateDomElement(String id, Object value, String numberFormat, String dateFormat, String valueWhenEmpty) { + AjaxUtils.updateDomElement(this, id, value, numberFormat, dateFormat, valueWhenEmpty); + } + + /** + * Convenience method that calls <code>updateDomElement</code> with no formatters and no valueWhenEmpty string. + */ + public void updateDomElement(String id, Object value) { + updateDomElement(id, value, null, null, null); + } } Copied: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxSocialNetwork.java (from rev 8900, branches/Wonder_2_0_0_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxSocialNetwork.java) =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxSocialNetwork.java (rev 0) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxSocialNetwork.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -0,0 +1,266 @@ +package er.ajax; + +import java.util.NoSuchElementException; + +import com.webobjects.foundation.NSDictionary; +import com.webobjects.foundation.NSMutableDictionary; + +import er.extensions.ERXMutableURL; +import er.extensions.ERXStringUtilities; + +/** + * Provides an interface to retrieving information and URLs + * about various social network sites. + * + * @author mschrag + */ +public abstract class AjaxSocialNetwork { + private static NSMutableDictionary _socialNetworks; + static { + _socialNetworks = new NSMutableDictionary(); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Delicious(), "delicious"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Digg(), "digg"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Facebook(), "facebook"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Furl(), "furl"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Newsvine(), "newsvine"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Netscape(), "netscape"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Reddit(), "reddit"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.StumbleUpon(), "stumble"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Technorati(), "technorati"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Squidoo(), "squidoo"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.WindowsLive(), "live"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.YahooMyWeb(), "yahoo"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Ask(), "ask"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Google(), "google"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Magnolia(), "magnolia"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Ning(), "ning"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Rawsugar(), "rawsugar"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Spurl(), "spurl"); + _socialNetworks.setObjectForKey(new AjaxSocialNetwork.Tagtooga(), "tagtooga"); + } + + /** + * Returns the social network with the given name. Supported names include: + * delicious, digg, facebook, furl, newsvine, netscape, reddit, stumble, technorati, + * squidoo, live, yahoo, ask, google, magnolia, ning, rawsugar, spurl, and tagtooga. + * + * @param name the name of the social network site + * @return the matching Social Network + * @throws NoSuchElementException if there is no social network registered with that name + */ + public static AjaxSocialNetwork socialNetworkNamed(String name) { + AjaxSocialNetwork socialNetwork = (AjaxSocialNetwork)AjaxSocialNetwork._socialNetworks.objectForKey(name); + if (socialNetwork == null) { + throw new NoSuchElementException("There is no AjaxSocialNetwork named '" + name + "'."); + } + return socialNetwork; + } + + /** + * Registers a new social network with the given name. + * + * @param socialNetwork the social network + * @param name the lookup name + */ + public static void registerSocialNetworkNamed(AjaxSocialNetwork socialNetwork, String name) { + AjaxSocialNetwork._socialNetworks.setObjectForKey(socialNetwork, name); + } + + protected String _submissionUrl(String baseUrl, String urlKey, String targetUrl, String titleKey, String title, NSDictionary additionalParams) { + try { + ERXMutableURL url = new ERXMutableURL(baseUrl); + url.setQueryParameter(urlKey, targetUrl); + if (titleKey != null && title != null) { + url.setQueryParameter(titleKey, title); + } + if (additionalParams != null) { + url.addQueryParameters(additionalParams); + } + return url.toString(); + } + catch (Throwable t) { + throw new RuntimeException("Failed to create a URL for '" + baseUrl + "' with the targetUrl '" + targetUrl + "'"); + } + } + + /** + * Returns the display name of the social network. + * + * @return the display name of the social network + */ + public String name() { + return ERXStringUtilities.displayNameForKey(getClass().getSimpleName()); + } + + /** + * Returns the icon framework for the social network. + * @return the icon framework for the social network + */ + public String iconFramework() { + return "Ajax"; + } + + /** + * Returns the icon path for the social network. + * + * @return the icon path for the social network + */ + public String iconName() { + return "SocialNetwork/" + getClass().getSimpleName() + ".png"; + } + + /** + * Returns the URL for submitting the given url and title to the social network. + * + * @param url the URL of the page to submit + * @param title the title of the pageto submit + * @return the submission URL + */ + public abstract String submissionUrl(String url, String title); + + public static class Delicious extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://del.icio.us/post", "url", url, "title", title, null); + } + } + + public static class Digg extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://digg.com/submit", "url", url, "title", title, new NSDictionary("2", "phase")); + } + } + + public static class Furl extends AjaxSocialNetwork { + public String iconName() { + return "SocialNetwork/Furl.gif"; + } + + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.furl.net/store", "u", url, "ti", title, new NSDictionary(new String[] { "f", "0" }, new String[] { "s", "to" })); + } + } + + public static class Newsvine extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.newsvine.com/_tools/seed&save", "u", url, "T", title, null); + } + + } + + public static class Netscape extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.netscape.com/submit/", "U", url, "T", title, null); + } + + } + + public static class Facebook extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.facebook.com/sharer.php", "u", url, "t", title, null); + } + + public String iconName() { + return "SocialNetwork/Facebook.gif"; + } + } + + public static class Reddit extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://reddit.com/submit", "url", url, "title", title, null); + } + + public String iconName() { + return "SocialNetwork/Reddit.gif"; + } + } + + public static class StumbleUpon extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.stumbleupon.com/submit", "url", url, "title", title, null); + } + + public String iconName() { + return "SocialNetwork/StumbleUpon.gif"; + } + } + + public static class Technorati extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("ttp://technorati.com/faves", "add", url, null, null, null); + } + + } + + public static class Squidoo extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.squidoo.com/lensmaster/bookmark", null, url, "title", title, null); + } + + } + + public static class WindowsLive extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("https://favorites.live.com/quickadd.aspx", "url", url, "title", title, new NSDictionary(new String[] { "1", "en-us", "1" }, new String[] { "marklet", "mkt", "top" })); + } + + } + + public static class YahooMyWeb extends AjaxSocialNetwork { + public String name() { + return "Yahoo MyWeb"; + } + + public String submissionUrl(String url, String title) { + return _submissionUrl("http://myweb.yahoo.com/myresults/bookmarklet", "u", url, "t", title, new NSDictionary("UTF", "ei")); + } + + } + + public static class Ask extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://myjeeves.ask.com/mysearch/BookmarkIt", "url", url, "title", title, new NSDictionary(new String[] { "1.2", "webpages" }, new String[] { "v", "t" })); + } + + } + + public static class Google extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.google.com/bookmarks/mark", "bkmk", url, "title", title, new NSDictionary(new String[] { "edit", "popup" }, new String[] { "op", "output" })); + } + + } + + public static class Magnolia extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://ma.gnolia.com/bookmarklet/snap/add", "url", url, "title", title, null); + } + + } + + public static class Ning extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://bookmarks.ning.com/addItem.php", "url", url, "T", title, null); + } + + } + + public static class Rawsugar extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.rawsugar.com/pages/tagger.faces", "url", url, "tttl", title, null); + } + + } + + public static class Spurl extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.spurl.net/spurl.php", "url", url, "title", title, null); + } + + } + + public static class Tagtooga extends AjaxSocialNetwork { + public String submissionUrl(String url, String title) { + return _submissionUrl("http://www.tagtooga.com/tapp/db.exe", "url", url, "title", title, new NSDictionary(new String[] { "jsEntryForm", "fx" }, new String[] { "c", "b" })); + } + } +} \ No newline at end of file Modified: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxUtils.java =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxUtils.java 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Sources/er/ajax/AjaxUtils.java 2009-02-04 22:22:09 UTC (rev 8901) @@ -2,6 +2,7 @@ import java.util.Collection; +import org.apache.log4j.Logger; import org.jabsorb.JSONSerializer; import com.webobjects.appserver.WOApplication; @@ -21,10 +22,13 @@ import er.extensions.ERXWOContext; import er.extensions.ERXAjaxApplication; import er.extensions.ERXAjaxSession; +import er.extensions.ERXNumberFormatter; +import er.extensions.ERXTimestampFormatter; import er.extensions.ERXProperties; import er.extensions.ERXStringUtilities; public class AjaxUtils { + private final static Logger log = Logger.getLogger(AjaxUtils.class); private static final String SECURE_RESOURCES_KEY = "er.ajax.secureResources"; /** @@ -451,4 +455,69 @@ redirect.appendToResponse(AjaxUtils.createResponse(context.request(), context), context); } + /** + * <code>updateDomElement</code> appends JavaScript code to the given + * AjaxResponse that updates the content of the DOM Element with the given + * ID to the specified value. Useful if you want to update multiple small + * regions on a page with a single request, e.g. when an AjaxObserveField + * triggers an action. + * + * This method is also available on instances. The example + * below uses the method on AjaxResponse. + * + * <pre> + * public WOActionResults cartItemChanged() { + * ShoppingCart cart; // assume this exists + * ShoppingCartItem item; // assume this exists + * AjaxResponse response = AjaxUtils.createResponse(context().request(), context()); + * response.appendScriptHeaderIfNecessary(); + * response.updateDomElement("orderAmount_" + item.primaryKey(), item.orderAmount(), "#,##0.", null, null); + * response.updateDomElement("price_" + item.primaryKey(), item.priceForOrderAmount(), "#,##0.00", null, null); + * response.updateDomElement("shoppingCartPrice", cart.totalPrice(), "#,##0.00", null, null); + * response.appendScriptFooterIfNecessary(); + * return response; + * } + * </pre> + * + * @see AjaxResponse#updateDomElement(String, Object, String, String, String) + * @see AjaxResponse#updateDomElement(String, Object) + * + * @param response + * The response to append the JavaScript to + * @param id + * ID of the DOM element to update + * @param value + * The new value + * @param numberFormat + * optional number format to format the value with + * @param dateFormat + * optional date format to format the value with + * @param valueWhenEmpty + * string to use when value is null + */ + public static void updateDomElement(WOResponse response, String id, Object value, String numberFormat, String dateFormat, String valueWhenEmpty) { + if (numberFormat != null && dateFormat != null) + throw new IllegalArgumentException("You can only specify a numberFormat or a dateFormat, not both."); + + if (value == null && valueWhenEmpty != null) { + value = valueWhenEmpty; + } + else { + try { + if (numberFormat != null) { + value = ERXNumberFormatter.numberFormatterForPattern(numberFormat).format(value); + } + if (dateFormat != null) { + value = ERXTimestampFormatter.dateFormatterForPattern(dateFormat).format(value); + } + } + catch (Exception e) { + log.error(e); + value = null; + } + } + + response.appendContentString("Element.update('" + id + "'," + AjaxValue.javaScriptEscaped(value) + ");"); + } + } Deleted: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/compress.sh =================================================================== --- branches/Wonder_2_0_0_Branch/Wonder/Ajax/Ajax/Support/compress.sh 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/compress.sh 2009-02-04 22:22:09 UTC (rev 8901) @@ -1,43 +0,0 @@ -#!/bin/sh - -# http://www.boogdesign.com/b2evo/index.php/a/2008/05/27/compressed_prototype_scriptaculous - -UNCOMPRESSED=../WebServerResources/wondaculous.js -COMPRESSED=../WebServerResources/wondaculous-min.js - -echo "Creating compressed JS file `pwd`/$COMPRESSED" - -echo "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY." > $UNCOMPRESSED -echo "// Change the source files in WebServerResources instead and then run compress.sh in the Support directory." >> $UNCOMPRESSED -echo >> $UNCOMPRESSED - -# prototype - -cat ../WebServerResources/prototype.js >> $UNCOMPRESSED - -# scriptaculous - -# scriptaculous loads it's dependent scripts dynamically by inserting <script> elements into the document head, -# since we're not going to have the separate scripts in the combined file we need to stop it doing that -cat ./scriptaculous_patched.js >> $UNCOMPRESSED - -cat ../WebServerResources/builder.js >> $UNCOMPRESSED -cat ../WebServerResources/effects.js >> $UNCOMPRESSED -cat ../WebServerResources/dragdrop.js >> $UNCOMPRESSED -cat ../WebServerResources/controls.js >> $UNCOMPRESSED -cat ../WebServerResources/slider.js >> $UNCOMPRESSED -cat ../WebServerResources/sound.js >> $UNCOMPRESSED - -# modal box - -cat ../WebServerResources/modalbox.js >> $UNCOMPRESSED - -# wonder - -cat ../WebServerResources/wonder.js >> $UNCOMPRESSED -cat ../WebServerResources/wonder_inplace.js >> $UNCOMPRESSED -cat ../WebServerResources/switchtabs.js >> $UNCOMPRESSED - -# run YUI compressor - -java -jar yuicompressor-2.4.1.jar -o $COMPRESSED $UNCOMPRESSED Copied: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/compress.sh (from rev 8900, branches/Wonder_2_0_0_Branch/Wonder/Ajax/Ajax/Support/compress.sh) =================================================================== --- branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/compress.sh (rev 0) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/compress.sh 2009-02-04 22:22:09 UTC (rev 8901) @@ -0,0 +1,43 @@ +#!/bin/sh + +# http://www.boogdesign.com/b2evo/index.php/a/2008/05/27/compressed_prototype_scriptaculous + +UNCOMPRESSED=../WebServerResources/wondaculous.js +COMPRESSED=../WebServerResources/wondaculous-min.js + +echo "Creating compressed JS file `pwd`/$COMPRESSED" + +echo "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY." > $UNCOMPRESSED +echo "// Change the source files in WebServerResources instead and then run compress.sh in the Support directory." >> $UNCOMPRESSED +echo >> $UNCOMPRESSED + +# prototype + +cat ../WebServerResources/prototype.js >> $UNCOMPRESSED + +# scriptaculous + +# scriptaculous loads it's dependent scripts dynamically by inserting <script> elements into the document head, +# since we're not going to have the separate scripts in the combined file we need to stop it doing that +cat ./scriptaculous_patched.js >> $UNCOMPRESSED + +cat ../WebServerResources/builder.js >> $UNCOMPRESSED +cat ../WebServerResources/effects.js >> $UNCOMPRESSED +cat ../WebServerResources/dragdrop.js >> $UNCOMPRESSED +cat ../WebServerResources/controls.js >> $UNCOMPRESSED +cat ../WebServerResources/slider.js >> $UNCOMPRESSED +cat ../WebServerResources/sound.js >> $UNCOMPRESSED + +# modal box + +cat ../WebServerResources/modalbox.js >> $UNCOMPRESSED + +# wonder + +cat ../WebServerResources/wonder.js >> $UNCOMPRESSED +cat ../WebServerResources/wonder_inplace.js >> $UNCOMPRESSED +cat ../WebServerResources/switchtabs.js >> $UNCOMPRESSED + +# run YUI compressor + +java -jar yuicompressor-2.4.1.jar -o $COMPRESSED $UNCOMPRESSED Deleted: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/scriptaculous_patched.js =================================================================== --- branches/Wonder_2_0_0_Branch/Wonder/Ajax/Ajax/Support/scriptaculous_patched.js 2009-02-04 19:43:36 UTC (rev 8900) +++ branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/scriptaculous_patched.js 2009-02-04 22:22:09 UTC (rev 8901) @@ -1,50 +0,0 @@ -// TH 20090110 -// Removed dynamic loading of scripts according to: -// http://www.boogdesign.com/b2evo/index.php/a/2008/05/27/compressed_prototype_scriptaculous - -// script.aculo.us scriptaculous.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 - -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -var Scriptaculous = { - Version: '1.8.2', - REQUIRED_PROTOTYPE: '1.6.0.3', - load: function() { - function convertVersionString(versionString) { - var v = versionString.replace(/_.*|\./g, ''); - v = parseInt(v + '0'.times(4-v.length)); - return versionString.indexOf('_') > -1 ? v-1 : v; - } - - if((typeof Prototype=='undefined') || - (typeof Element == 'undefined') || - (typeof Element.Methods=='undefined') || - (convertVersionString(Prototype.Version) < - convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE))) - throw("script.aculo.us requires the Prototype JavaScript framework >= " + - Scriptaculous.REQUIRED_PROTOTYPE); - } -}; - -Scriptaculous.load(); \ No newline at end of file Copied: branches/Wonder_2_0_0_WebObjects_5_4_Branch/Wonder/Ajax/Ajax/Support/scriptaculous_patched.js (from rev 8900, branches/Wonder_2_0_0_Branch/Wonder/Ajax/Ajax/Support/scriptaculous_patched.... [truncated message content] |