/*******************************************************************************
*
* Copyright 2011-2014 Spiffy UI Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.spiffyui.spsample.client;
import org.spiffyui.client.MessageUtil;
import org.spiffyui.client.widgets.DatePickerTextBox;
import org.spiffyui.client.widgets.ExpandingTextArea;
import org.spiffyui.client.widgets.LongMessage;
import org.spiffyui.client.widgets.ProgressBar;
import org.spiffyui.client.widgets.SlideDownPrefsPanel;
import org.spiffyui.client.widgets.SlidingGridPanel;
import org.spiffyui.client.widgets.SmallLoadingIndicator;
import org.spiffyui.client.widgets.StatusIndicator;
import org.spiffyui.client.widgets.TimePickerTextBox;
import org.spiffyui.client.widgets.Tooltip;
import org.spiffyui.client.widgets.button.FancySaveButton;
import org.spiffyui.client.widgets.button.RefreshAnchor;
import org.spiffyui.client.widgets.button.SimpleButton;
import org.spiffyui.client.widgets.dialog.ConfirmDialog;
import org.spiffyui.client.widgets.dialog.Dialog;
import org.spiffyui.client.widgets.multivaluesuggest.MultivalueSuggestRESTHelper;
import org.spiffyui.client.widgets.slider.RangeSlider;
import org.spiffyui.spsample.client.widgets.FancyAutocompleter;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* This is the widgets sample panel
*
*/
public class WidgetsPanel extends HTMLPanel implements CloseHandler<PopupPanel>
{
private static final SPSampleStrings STRINGS = (SPSampleStrings) GWT.create(SPSampleStrings.class);
private ConfirmDialog m_dlg;
private RefreshAnchor m_refresh;
private SlidingGridPanel m_slideGridPanel;
private static final int TALL = 1;
private static final int WIDE = 2;
private static final int BIG = 3;
/**
* Creates a new panel
*/
public WidgetsPanel()
{
super("div",
"<div id=\"WidgetsPrefsPanel\"></div>" +
STRINGS.WidgetsPanel_html() +
"<div id=\"WidgetsLongMessage\"></div><br /><br />" +
"<div id=\"WidgetsSlidingGrid\"></div>" +
"</div>");
getElement().setId("WidgetsPanel");
//Create the sliding grid and set it up for the rest of the controls
m_slideGridPanel = new SlidingGridPanel();
m_slideGridPanel.setCellHeight(264);
m_slideGridPanel.setCellWidth(302);
m_slideGridPanel.setPadding(36);
setVisible(false);
RootPanel.get("mainContent").add(this);
addLongMessage();
addNavPanelInfo();
/*
* Add widgets to the sliding grid in alphabetical order
*/
addDatePicker();
addExpandingTextArea();
addFancyButton();
addMessageButton();
addLoginPanel();
addMultiValueAutoComplete();
addOptionsPanel();
addProgressBar();
addConfirmDialog();
addRefreshAnchor();
addSimpleButton();
addSlider();
addSlidingGrid();
addSmallLoadingIndicator();
addStatusIndicators();
addTimePicker();
addTooltip();
/*
* Add the sliding grid here. This call must go last so that the onAttach of the SlidingGridPanel can do its thing.
*/
add(m_slideGridPanel, "WidgetsSlidingGrid");
Index.addToc(this, "h3");
}
/**
* Create a slider and add it to the sliding grid
*/
private void addSlider()
{
/*
* Add a range slider
*/
addToSlidingGrid(new RangeSlider("rangeslider", 0, 500, 200, 300), "WidgetsRangeSlider", Index.getStrings().slider(),
STRINGS.Slider_html(), WIDE);
}
/**
* Create the time picker control and add it to the sliding grid
*/
private void addTimePicker()
{
/*
* Add the time picker
*/
addToSlidingGrid(new TimePickerTextBox("timepicker"), "WidgetsTimePicker", Index.getStrings().timePicker(),
STRINGS.TimePicker_html());
}
/**
* Create the tooltip and add it to the sliding grid
*/
private void addTooltip()
{
/*
* Create a tooltip with a simple body.
* Add an anchor that will show the tooltip.
*/
final Tooltip tooltip = new Tooltip();
tooltip.setBody(new HTML(Index.getStrings().tooltipBody()));
final Anchor anchor = new Anchor(Index.getStrings().showTooltip());
final Timer showTooltip = new Timer() {
@Override
public void run()
{
tooltip.showRelativeTo(anchor);
}
};
anchor.addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event)
{
/*
* Show the tooltip after a delay
*/
showTooltip.schedule(tooltip.getAutoCloseTime());
}
});
anchor.addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event)
{
if (tooltip.isShowing()) {
/*
* Autoclose the tooltip after a delay
*/
tooltip.startAutoCloseTimer();
} else {
/*
* Cancel the delay to show the tooltip
*/
showTooltip.cancel();
}
}
});
addToSlidingGrid(anchor, "WidgetsTooltip", Index.getStrings().tooltip(),
STRINGS.Tooltip_html());
}
/**
* Create the status indicators and add them to the sliding grid
*/
private void addStatusIndicators()
{
/*
* Add 3 status indicators
*/
StatusIndicator status1 = new StatusIndicator(StatusIndicator.IN_PROGRESS);
StatusIndicator status2 = new StatusIndicator(StatusIndicator.SUCCEEDED);
StatusIndicator status3 = new StatusIndicator(StatusIndicator.FAILED);
HTMLPanel statusPanel = addToSlidingGrid(status1, "WidgetsStatus", Index.getStrings().statusIndicator(),
STRINGS.Status_html());
statusPanel.add(status2, "WidgetsStatus");
statusPanel.add(status3, "WidgetsStatus");
}
/**
* Create the small loading indicator and add it to the sliding grid
*/
private void addSmallLoadingIndicator()
{
/*
* Add a small loading indicator to our page
*/
SmallLoadingIndicator loading = new SmallLoadingIndicator();
addToSlidingGrid(loading, "WidgetsSmallLoading", Index.getStrings().smallLoadingIndicator(),
STRINGS.SmallLoading_html());
}
/**
* Create the refresh anchor and add it to the sliding grid
*/
private void addRefreshAnchor()
{
/*
* Add a refresh anchor to our page
*/
m_refresh = new RefreshAnchor("Widgets_refreshAnchor");
HTMLPanel p = addToSlidingGrid(m_refresh, "WidgetsRefreshAnchor", Index.getStrings().refreshAnchor(), STRINGS.RefreshAnchor_html(), TALL);
Element h3 = p.getElementById("WID_WidgetsRefreshAnchor");
//Set the title so that the TOC's list item for this isn't too long
h3.setTitle(Index.getStrings().refreshAnchorConfirmDialog_toc());
m_refresh.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
m_refresh.setLoading(true);
m_dlg.center();
m_dlg.show();
event.preventDefault();
}
});
}
/**
* Create the confirm dialog and add it to the sliding grid
*/
private void addConfirmDialog()
{
/*
* Add the ConfirmDialog which will show up when refresh is clicked
*/
m_dlg = new ConfirmDialog("WidgetsConfirmDlg", Index.getStrings().sampleConfirm());
m_dlg.hide();
m_dlg.addCloseHandler(this);
m_dlg.setText(Index.getStrings().refreshSure());
m_dlg.addButton("btn1", Index.getStrings().proceed(), "OK");
m_dlg.addButton("btn2", Index.getStrings().cancel(), "CANCEL");
}
/**
* Create the progress bar and add it to the sliding grid
*/
private void addProgressBar()
{
/*
* Add a progress bar to our page
*/
ProgressBar bar = new ProgressBar("WidgetsPanelProgressBar");
bar.setValue(65);
addToSlidingGrid(bar, "WidgetsProgressSpan", Index.getStrings().progressBar(), STRINGS.ProgressBar_html());
}
/**
* Create the options panel and add it to the sliding grid
*/
private void addOptionsPanel()
{
/*
* Add the options slide down panel
*/
SlideDownPrefsPanel prefsPanel = new SlideDownPrefsPanel("WidgetsPrefs", Index.getStrings().slideDown());
add(prefsPanel, "WidgetsPrefsPanel");
FlowPanel prefContents = new FlowPanel();
prefContents.add(new Label(Index.getStrings().addDisplay()));
prefsPanel.setPanel(prefContents);
addToSlidingGrid(null, "WidgetsDisplayOptions", Index.getStrings().osdp(), STRINGS.SlideDown_html());
}
/**
* Create the mutli-value auto-complete field and add it to the sliding grid
*/
private void addMultiValueAutoComplete()
{
/*
* Add the multivalue suggest box
*/
final FancyAutocompleter msb = new FancyAutocompleter(new MultivalueSuggestRESTHelper("TotalSize", "Options", "DisplayName", "Value") {
@Override
public String buildUrl(String q, int indexFrom, int indexTo)
{
return "multivaluesuggestboxexample/colors?q=" + URL.encodeQueryString(q) + "&indexFrom=" + indexFrom + "&indexTo=" + indexTo;
}
}, true);
msb.getFeedback().addStyleName("msg-feedback");
msb.setPageSize(8); //since each value takes up more space, let's cut the size.
String spanId = "WidgetsSuggestBox";
HTMLPanel panel = addToSlidingGrid(msb, spanId, Index.getStrings().mvsp(), STRINGS.MultiVal_html(), BIG);
/*
* so that spellcheck is not done on a selected crayon color of "Screamin' Green"
*/
Element span = panel.getElementById(spanId);
span.setAttribute("spellcheck", "false");
// /*
// * temp to show how to get values and how to
// * have a default value of Electric Lime
// */
// Map<String, String> valueMap = new HashMap<String, String>();
// valueMap.put("Electric Lime", "#CEFF1D");
// msb.setValueMap(valueMap);
//
// final Button b = new Button("get values");
// panel.add(b);
// b.addClickHandler(new ClickHandler() {
//
// @Override
// public void onClick(ClickEvent event)
// {
// Map<String, String> values = msb.getValueMap();
// ConfirmDialog c = new ConfirmDialog("mvsb-results-dialog", "Results");
// StringBuffer sb = new StringBuffer();
// for (String key : values.keySet()) {
// sb.append("<div style=\"background-color:" + values.get(key) + "\">" + key + "</div>");
// }
// c.replaceDialogBodyContents(new HTML(sb.toString()));
// c.addButton("mvsb-dialog-ok", "Close", "OK");
// c.showRelativeTo(b);
// }
// });
// /*
// * end temp
// */
}
/**
* Create the date picker control and add it to the sliding grid
*/
private void addDatePicker()
{
/*
* Add the date picker
*/
addToSlidingGrid(new DatePickerTextBox("datepicker"), "WidgetsDatePicker", Index.getStrings().datePicker(),
STRINGS.DatePicker_html(), TALL);
}
private void addNavPanelInfo()
{
Anchor css = new Anchor(Index.getStrings().cssPage(), "CSSPanel");
css.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
event.preventDefault();
Index.selectItem(Index.CSS_NAV_ITEM_ID);
}
});
HTMLPanel panel = addToSlidingGrid(null, "NavPanelGridCell", Index.getStrings().navBar(), STRINGS.NavBar_html(), TALL);
panel.add(css, "cssPageWidgetsLink");
}
/**
* Create the sliding grid
*/
private void addSlidingGrid()
{
/*
* Create the sliding grid and add its big cell
*/
addToSlidingGrid(null, "WidgetsSlidingGridCell", Index.getStrings().sgp(), STRINGS.SlideGrid_html());
}
/**
* Create the long message control to the top of the page
*/
private void addLongMessage()
{
/*
* Add a long message to our page
*/
LongMessage message = new LongMessage("WidgetsLongMessageWidget");
add(message, "WidgetsLongMessage");
message.setHTML(STRINGS.LongMessage_html());
}
/**
* Create the simple button control and add it to the sliding grid
*/
private void addSimpleButton()
{
/*
* Add the simple button
*/
final SimpleButton simple = new SimpleButton(Index.getStrings().simpleButton());
simple.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
simple.setInProgress(true);
//a little timer to simulate time it takes to set loading back to false
Timer t = new Timer() {
@Override
public void run()
{
simple.setInProgress(false);
}
};
t.schedule(2000);
}
});
addToSlidingGrid(simple, "WidgetsButton", Index.getStrings().simpleButton(), STRINGS.SimpleButton_html());
}
/**
* Create the fancy button control and add it to the sliding grid
*/
private void addFancyButton()
{
/*
* Add the fancy button
*/
final FancySaveButton fancy = new FancySaveButton(Index.getStrings().save());
fancy.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
fancy.setInProgress(true);
//a little timer to simulate time it takes to set loading back to false
Timer t = new Timer() {
@Override
public void run()
{
fancy.setInProgress(false);
}
};
t.schedule(2000);
}
});
addToSlidingGrid(fancy, "WidgetsFancyButton", Index.getStrings().fsb(), STRINGS.FancyButton_html());
}
/**
* Create login panel and add it to the sliding grid
*/
private void addLoginPanel()
{
String buttonText = "";
if (Index.userLoggedIn()) {
buttonText = Index.getStrings().secData();
} else {
buttonText = Index.getStrings().getSecData();
}
final SimpleButton doLoginButton = new SimpleButton(buttonText);
if (Index.isAppEngine()) {
doLoginButton.setText(Index.getStrings().installMessage());
doLoginButton.setEnabled(false);
}
doLoginButton.getElement().setId("doLoginBtn");
doLoginButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
doLoginButton.setInProgress(true);
//a little timer to simulate time it takes to set in progress back to false
Timer t = new Timer() {
@Override
public void run()
{
doLoginButton.setInProgress(false);
AuthPanel.getData(true);
}
};
t.schedule(1000);
}
});
HTMLPanel loginButtonPanel = addToSlidingGrid(doLoginButton, "WidgetsLoginPanel", Index.getStrings().loginPanel(),
STRINGS.LoginWidget_html(), TALL);
loginButtonPanel.add((new HTML("<p><div id=\"loginResult\"></div>")), "WidgetsLoginPanel");
Anchor auth = new Anchor(Index.getStrings().authPage(), "AuthPanel");
auth.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
event.preventDefault();
Index.selectItem(Index.AUTH_NAV_ITEM_ID);
}
});
loginButtonPanel.add(auth, "authPanelSpan");
}
/**
* A helper method that adds a widget and some HTML description to the sliding
* grid panel
*
* @param widget the widget to add
* @param id the ID of the new cell
* @param title the title of the new cell
* @param htmlText the HTML description of the widget
*
* @return the HTMLPanel used to add the contents to the new cell
*/
private HTMLPanel addToSlidingGrid(Widget widget, String id, String title, String htmlText)
{
return addToSlidingGrid(widget, id, title, htmlText, 0);
}
/**
* A helper method that adds a widget and some HTML description to the sliding
* grid panel
*
* @param widget the widget to add
* @param id the ID of the new cell
* @param title the title of the new cell
* @param htmlText the HTML description of the widget
* @param type the type of cell to add: TALL, BIG, or WIDE
*
* @return the HTMLPanel used to add the contents to the new cell
*/
private HTMLPanel addToSlidingGrid(Widget widget, String id, String title, String htmlText, int type)
{
HTMLPanel p = new HTMLPanel("div",
"<h3 id=\"WID_" + id + "\">" + title + "</h3>" +
htmlText +
"<span id=\"" + id + "\"></span>");
if (widget != null) {
p.add(widget, id);
}
switch (type) {
case WIDE:
m_slideGridPanel.addWide(p);
break;
case TALL:
m_slideGridPanel.addTall(p);
break;
case BIG:
m_slideGridPanel.addBig(p);
break;
default:
m_slideGridPanel.add(p);
break;
}
return p;
}
/**
* Add the message buttons to the sliding grid
*/
private void addMessageButton()
{
/*
* Add the message buttons
*/
Button b = new Button(Index.getStrings().showInfoMessage());
HTMLPanel p = addToSlidingGrid(b, "WidgetsMessages", Index.getStrings().humanMsg(), STRINGS.HumanMsg_html(), TALL);
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
MessageUtil.showMessage(Index.getStrings().infoMsg());
}
});
b = new Button(Index.getStrings().showWrnMsg());
p.add(b, "WidgetsMessages");
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
MessageUtil.showWarning(Index.getStrings().wrnMsg(), false);
}
});
b = new Button(Index.getStrings().showErrMsg());
p.add(b, "WidgetsMessages");
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
MessageUtil.showError(Index.getStrings().errMsg());
}
});
b = new Button(Index.getStrings().showFatalErrMsg());
p.add(b, "WidgetsMessages");
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
MessageUtil.showFatalError(Index.getStrings().fatalErrMsg());
}
});
b = new Button(Index.getStrings().showPageWarningMsg());
p.add(b, "WidgetsMessages");
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event)
{
MessageUtil.showPageLevelWarning(Index.getStrings().pageWarningMsg());
}
});
}
@Override
public void onClose(CloseEvent<PopupPanel> event)
{
Dialog dlg = (Dialog) event.getSource();
String btn = dlg.getButtonClicked();
if (dlg == m_dlg && "OK".equals(btn)) {
MessageUtil.showMessage(Index.getStrings().refreshing());
//a little timer to simulate time it takes to set loading back to false
Timer t = new Timer() {
@Override
public void run()
{
m_refresh.setLoading(false);
}
};
t.schedule(2000);
} else {
m_refresh.setLoading(false);
}
}
/**
* @return Returns the slideGridPanel.
*/
public SlidingGridPanel getSlideGridPanel()
{
return m_slideGridPanel;
}
private void addExpandingTextArea()
{
ExpandingTextArea eta = new ExpandingTextArea("expandingTextArea");
eta.setText(Index.getStrings().expandingTextAreaDefault());
addToSlidingGrid(eta, "WidgetsExpandingTextArea", Index.getStrings().expandingTextArea(),
STRINGS.ExpandingTextArea_html(), TALL);
}
}