/*
* Smart GWT (GWT for SmartClient)
* Copyright 2008 and beyond, Isomorphic Software, Inc.
*
* Smart GWT is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License version 3
* as published by the Free Software Foundation. Smart GWT is also
* available under typical commercial license terms - see
* http://smartclient.com/license
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package com.smartgwt.client.widgets;
import com.smartgwt.client.event.*;
import com.smartgwt.client.core.*;
import com.smartgwt.client.types.*;
import com.smartgwt.client.data.*;
import com.smartgwt.client.data.events.*;
import com.smartgwt.client.rpc.*;
import com.smartgwt.client.widgets.*;
import com.smartgwt.client.widgets.events.*;
import com.smartgwt.client.widgets.form.*;
import com.smartgwt.client.widgets.form.validator.*;
import com.smartgwt.client.widgets.form.fields.*;
import com.smartgwt.client.widgets.tile.*;
import com.smartgwt.client.widgets.tile.events.*;
import com.smartgwt.client.widgets.grid.*;
import com.smartgwt.client.widgets.grid.events.*;
import com.smartgwt.client.widgets.chart.*;
import com.smartgwt.client.widgets.layout.*;
import com.smartgwt.client.widgets.layout.events.*;
import com.smartgwt.client.widgets.menu.*;
import com.smartgwt.client.widgets.tab.*;
import com.smartgwt.client.widgets.toolbar.*;
import com.smartgwt.client.widgets.tree.*;
import com.smartgwt.client.widgets.tree.events.*;
import com.smartgwt.client.widgets.viewer.*;
import com.smartgwt.client.widgets.calendar.*;
import com.smartgwt.client.widgets.calendar.events.*;
import com.smartgwt.client.widgets.cube.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.Element;
import com.smartgwt.client.util.*;
import com.google.gwt.event.shared.*;
import com.google.gwt.event.shared.HasHandlers;
/**
* Dialogs are a specialized version of {@link com.smartgwt.client.widgets.Window} used for small windows that contain just
* a text message or a text mesage with some standard buttons. <P> Many typical modal dialogs such as alerts and
* confirmations are built into the system with convenience APIs - see say, warn and askForValue. <P> Dialogs can be
* modal or non-modal according to {@link com.smartgwt.client.widgets.Window#getIsModal isModal}. <P> NOTE: If you are
* building a dialog that will involve more than just buttons and a message, consider starting from the {@link
* com.smartgwt.client.widgets.Window} class instead, where arbitrary components can be added to the body area via {@link
* com.smartgwt.client.widgets.Window#addItem Window.addItem}.
*/
public class Dialog extends Window implements com.smartgwt.client.widgets.events.HasButtonClickHandlers {
public static Dialog getOrCreateRef(JavaScriptObject jsObj) {
if(jsObj == null) return null;
BaseWidget obj = BaseWidget.getRef(jsObj);
if(obj != null) {
return (Dialog) obj;
} else {
return new Dialog(jsObj);
}
}
public Dialog(){
scClassName = "Dialog";
}
public Dialog(JavaScriptObject jsObj){
super(jsObj);
}
protected native JavaScriptObject create()/*-{
var config = this.@com.smartgwt.client.widgets.BaseWidget::getConfig()();
var scClassName = this.@com.smartgwt.client.widgets.BaseWidget::scClassName;
var widget = $wnd.isc[scClassName].create(config);
this.@com.smartgwt.client.widgets.BaseWidget::doInit()();
return widget;
}-*/;
// ********************* Properties / Attributes ***********************
/**
* If a toolbar is showing, automatically place keyboard focus in the first button.
*
* @param autoFocus autoFocus Default value is true
* @throws IllegalStateException this property cannot be changed after the component has been created
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public void setAutoFocus(Boolean autoFocus) throws IllegalStateException {
setAttribute("autoFocus", autoFocus, false);
}
/**
* If a toolbar is showing, automatically place keyboard focus in the first button.
*
*
* @return Boolean
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public Boolean getAutoFocus() {
return getAttributeAsBoolean("autoFocus");
}
/**
*
*
* @param defaultWidth defaultWidth Default value is 360
* @throws IllegalStateException this property cannot be changed after the component has been created
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public void setDefaultWidth(int defaultWidth) throws IllegalStateException {
setAttribute("defaultWidth", defaultWidth, false);
}
/**
*
*
*
* @return int
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public int getDefaultWidth() {
return getAttributeAsInt("defaultWidth");
}
/**
* Icon to show in this dialog - see {@link com.smartgwt.client.widgets.Dialog#getMessage message}.
*
* @param icon icon Default value is null
* @throws IllegalStateException this property cannot be changed after the component has been created
*/
public void setIcon(String icon) throws IllegalStateException {
setAttribute("icon", icon, false);
}
/**
* Icon to show in this dialog - see {@link com.smartgwt.client.widgets.Dialog#getMessage message}.
*
*
* @return String
*/
public String getIcon() {
return getAttributeAsString("icon");
}
/**
* Size of the icon to show in this dialog.
*
* @param iconSize iconSize Default value is 32
* @throws IllegalStateException this property cannot be changed after the component has been created
*/
public void setIconSize(int iconSize) throws IllegalStateException {
setAttribute("iconSize", iconSize, false);
}
/**
* Size of the icon to show in this dialog.
*
*
* @return int
*/
public int getIconSize() {
return getAttributeAsInt("iconSize");
}
/**
* Message to show in this dialog. <P> If a message is set the primary purpose of the dialog will be assumed to be to show
* a message with buttons - auto-sizing to the message text will be enabled, and, if {@link
* com.smartgwt.client.widgets.Dialog#getIcon icon} has also been set, the {@link
* com.smartgwt.client.widgets.Dialog#getMessageLabel messageLabel} and {@link
* com.smartgwt.client.widgets.Dialog#getMessageIcon messageIcon} AutoChildren will be created and placed together in the
* {@link com.smartgwt.client.widgets.Dialog#getMessageStack messageStack} AutoChild, with the toolbar underneath as usual.
* If any of these behaviors are inconvenient or you want more precise control over a message and some custom widgets,
* start from the superclass {@link com.smartgwt.client.widgets.Window} instead, and add controls via {@link
* com.smartgwt.client.widgets.Window#addItem Window.addItem}. <P> The message string may contain "${loadingImage}", if so,
* the standard loading spinner will appear at that location in the text (see {@link
* com.smartgwt.client.widgets.Canvas#loadingImageSrc loadingImageSrc}). <P> The message will be styled with the {@link
* com.smartgwt.client.widgets.Dialog#getMessageStyle messageStyle}.
*
* @param message message Default value is null
* @throws IllegalStateException this property cannot be changed after the component has been created
*/
public void setMessage(String message) throws IllegalStateException {
setAttribute("message", message, false);
}
/**
* Message to show in this dialog. <P> If a message is set the primary purpose of the dialog will be assumed to be to show
* a message with buttons - auto-sizing to the message text will be enabled, and, if {@link
* com.smartgwt.client.widgets.Dialog#getIcon icon} has also been set, the {@link
* com.smartgwt.client.widgets.Dialog#getMessageLabel messageLabel} and {@link
* com.smartgwt.client.widgets.Dialog#getMessageIcon messageIcon} AutoChildren will be created and placed together in the
* {@link com.smartgwt.client.widgets.Dialog#getMessageStack messageStack} AutoChild, with the toolbar underneath as usual.
* If any of these behaviors are inconvenient or you want more precise control over a message and some custom widgets,
* start from the superclass {@link com.smartgwt.client.widgets.Window} instead, and add controls via {@link
* com.smartgwt.client.widgets.Window#addItem Window.addItem}. <P> The message string may contain "${loadingImage}", if so,
* the standard loading spinner will appear at that location in the text (see {@link
* com.smartgwt.client.widgets.Canvas#loadingImageSrc loadingImageSrc}). <P> The message will be styled with the {@link
* com.smartgwt.client.widgets.Dialog#getMessageStyle messageStyle}.
*
*
* @return String
*/
public String getMessage() {
return getAttributeAsString("message");
}
/**
* Whether to show a toolbar of buttons at the bottom of the Dialog.
*
* @param showToolbar showToolbar Default value is false
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public void setShowToolbar(Boolean showToolbar) {
setAttribute("showToolbar", showToolbar, true);
}
/**
* Whether to show a toolbar of buttons at the bottom of the Dialog.
*
*
* @return Boolean
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public Boolean getShowToolbar() {
return getAttributeAsBoolean("showToolbar");
}
/**
* Style of the Dialog background
*
* @param styleName styleName Default value is "dialogBackground"
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public void setStyleName(String styleName) {
setAttribute("styleName", styleName, true);
}
/**
* Style of the Dialog background
*
*
* @return String
* @see com.smartgwt.client.docs.Appearance Appearance overview and related methods
*/
public String getStyleName() {
return getAttributeAsString("styleName");
}
// ********************* Methods ***********************
/**
* Handle a click on the 'apply' button of this Dialog. Default implementation is to call <code>saveData()</code>, but
* NOT close the Dialog.
*/
public native void applyClick() /*-{
var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
self.applyClick();
}-*/;
/**
* Add a buttonClick handler.
* <p>
* Fires when any button in this Dialog's toolbar is clicked. Default implementation does nothing.
*
* @param handler the buttonClick handler
* @return {@link HandlerRegistration} used to remove this handler
*/
public HandlerRegistration addButtonClickHandler(com.smartgwt.client.widgets.events.ButtonClickHandler handler) {
if(getHandlerCount(com.smartgwt.client.widgets.events.ButtonClickEvent.getType()) == 0) setupButtonClickEvent();
return doAddHandler(handler, com.smartgwt.client.widgets.events.ButtonClickEvent.getType());
}
private native void setupButtonClickEvent() /*-{
var obj = null;
var selfJ = this;
if(this.@com.smartgwt.client.widgets.BaseWidget::isCreated()()) {
obj = this.@com.smartgwt.client.widgets.BaseWidget::getJsObj()();
obj.addProperties({buttonClick:$entry(function(){
var param = {"button" : arguments[0], "index" : arguments[1]};
var event = @com.smartgwt.client.widgets.events.ButtonClickEvent::new(Lcom/google/gwt/core/client/JavaScriptObject;)(param);
selfJ.@com.smartgwt.client.widgets.BaseWidget::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event);
})
});
} else {
obj = this.@com.smartgwt.client.widgets.BaseWidget::getConfig()();
obj.buttonClick = $entry(function(){
var param = {"button" : arguments[0], "index" : arguments[1]};
var event = @com.smartgwt.client.widgets.events.ButtonClickEvent::new(Lcom/google/gwt/core/client/JavaScriptObject;)(param);
selfJ.@com.smartgwt.client.widgets.BaseWidget::fireEvent(Lcom/google/gwt/event/shared/GwtEvent;)(event);
});
}
}-*/;
/**
* Handle a click on the 'cancel' button of this Dialog. Default implementation is to return null and hide the Dialog.
* Override to do something else.
*/
public native void cancelClick() /*-{
var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
self.cancelClick();
}-*/;
/**
* Handles a click on the close button of this window. The default implementation hides the window and returns false to
* cancel bubbling. Override this method if you want other actions to be taken.
*/
public native void closeClick() /*-{
var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
self.closeClick();
}-*/;
/**
* Handle a click on the 'no' button of this Dialog. Default implementation is to return <code>false</code>. Override to do
* something else.
*/
public native void noClick() /*-{
var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
self.noClick();
}-*/;
/**
* Handle a click on the 'ok' button of this Dialog. Default implementation is to call <code>saveData()</code>, hide the
* Dialog, then return <code>true</code>. Override to do something else.
*/
public native void okClick() /*-{
var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
self.okClick();
}-*/;
/**
* Method to save this Dialog's data. Called from <code>okClick()</code>, <code>applyClick()</code>. No default
* implementation - override to perform some action if required.
*/
public native void saveData() /*-{
var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
self.saveData();
}-*/;
/**
* Handle a click on the 'yes' button of this Dialog. Default implementation is to return <code>true</code>. Override to do
* something else
*/
public native void yesClick() /*-{
var self = this.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
self.yesClick();
}-*/;
// ********************* Static Methods ***********************
/**
* Class level method to set the default properties of this class. If set, then all subsequent instances of this
* class will automatically have the default properties that were set when this method was called. This is a powerful
* feature that eliminates the need for users to create a separate hierarchy of subclasses that only alter the default
* properties of this class. Can also be used for skinning / styling purposes.
* <P>
* <b>Note:</b> This method is intended for setting default attributes only and will effect all instances of the
* underlying class (including those automatically generated in JavaScript).
* This method should not be used to apply standard EventHandlers or override methods for
* a class - use a custom subclass instead.
*
* @param dialogProperties properties that should be used as new defaults when instances of this class are created
*/
public static native void setDefaultProperties(Dialog dialogProperties) /*-{
var properties = $wnd.isc.addProperties({},dialogProperties.@com.smartgwt.client.widgets.BaseWidget::getConfig()());
delete properties.ID;
$wnd.isc.Dialog.addProperties(properties);
}-*/;
// ***********************************************************
/**
* OK Button object to fire dialog's "okClick()" method on click.
*/
public static Button OK = new Button("OK");
/**
* APPLY Button object to fire dialog's "applyClick()" method on click.
*/
public static Button APPLY = new Button("Apply");
/**
* YES Button object to fire dialog's "yesClick()" method on click
*/
public static Button YES = new Button("Yes");
/**
* NO Button object to fire dialog's "noClick()" method on click.
*/
public static Button NO = new Button("No");
/**
* CANCEL Button object to fire dialog's "cancelClick()" method on click.
*/
public static Button CANCEL = new Button("Cancel");
/**
* DONE Button object to fire dialog's "doneClick()" method on click.
*/
public static Button DONE = new Button("Done");
/**
* Array of Buttons to show in the {@link com.smartgwt.client.widgets.Dialog#getShowToolbar showToolbar}, if shown.
* <P> The set of buttons to use is typically set by calling one of the shortcuts.
*
* @param toolbarButtons the toolbar buttons
* @throws IllegalStateException this property cannot be changed after the component has been rendered
*/
public void setToolbarButtons(Canvas... toolbarButtons) {
setAttribute("toolbarButtons", replaceButtonsWithDefault(toolbarButtons), false);
}
/**
* Array of Buttons to show in the {@link com.smartgwt.client.widgets.Dialog#getShowToolbar toolbar}, if shown.
* <P>
The set of buttons to use is typically set by calling one of the shortcuts such as
{@link
* com.smartgwt.client.util.isc#say isc.say} or {@link com.smartgwt.client.util.isc#confirm isc.confirm}. A custom set of
* buttons can be passed to
these shortcuts methods via the "properties" argument, or to a directly created
* Dialog.
<P>
In both cases, a mixture of {@link com.smartgwt.client.types.DialogButtons built-in buttons},
* custom buttons,
and other components (such as a {@link com.smartgwt.client.widgets.layout.LayoutSpacer}) can be
* passed. Built-in buttons
can be referred to as <code>isc.Dialog.OK</code>, for example:
<pre>
* isc.Dialog.create({
buttons:[
isc.Dialog.OK,
isc.Dialog.CANCEL,
* isc.LayoutSpacer.create({width:50}),
{ title:"Not now", click:"doSomething()" }
]
})
* </pre>
Built-in buttons will call standard methods on the Dialog itself, such as
{@link
* com.smartgwt.client.widgets.Dialog#cancelClick Dialog.cancelClick}, as explained in the
{@link
* com.smartgwt.client.types.DialogButtons list of built-in buttons}.
*
* @param buttons buttons Default value is null
* @throws IllegalStateException this property cannot be changed after the component has been created
*/
public void setButtons(Button... buttons) throws IllegalStateException {
setAttribute("buttons", replaceButtonsWithDefault(buttons), false);
}
/**
* Style to apply to the message text shown in the center of the dialog
* <p><b>Note : </b> This is an advanced setting</p>
*
* @param messageStyle messageStyle Default value is "normal"
* @throws IllegalStateException this property cannot be changed after the component has been created
*/
public void setMessageStyle(String messageStyle) throws IllegalStateException {
setAttribute("messageStyle", messageStyle, false);
}
private JavaScriptObject[] replaceButtonsWithDefault(Canvas... buttons) {
JavaScriptObject[] result = new JavaScriptObject[buttons.length];
for (int i = 0; i < buttons.length; i++) {
if (buttons[i] == Dialog.OK) {
result[i] = getButton("OK");
} else if (buttons[i] == Dialog.APPLY) {
result[i] = getButton("APPLY");
} else if (buttons[i] == Dialog.CANCEL) {
result[i] = getButton("CANCEL");
} else if (buttons[i] == Dialog.DONE) {
result[i] = getButton("DONE");
} else if (buttons[i] == Dialog.NO) {
result[i] = getButton("NO");
} else if (buttons[i] == Dialog.YES) {
result[i] = getButton("YES");
} else {
result[i] = buttons[i].getOrCreateJsObj();
}
}
return result;
}
private native JavaScriptObject getButton(String name) /*-{
return $wnd.isc.Dialog[name];
}-*/;
}