package nl.topicus.konijn.web.components.panels.common; import nl.topicus.konijn.data.entity.Nabaztag; import nl.topicus.konijn.models.PersistenceModel; import nl.topicus.konijn.web.components.modal.ConfigureClockPanel; import nl.topicus.konijn.web.components.modal.ConfigureRandomSpeechPanel; import nl.topicus.konijn.web.components.modal.ConfigureSleepPanel; import nl.topicus.konijn.web.components.modal.ConfigureWeatherPanel; import nl.topicus.konijn.web.components.panels.events.RadioContainerPanel; import nl.topicus.konijn.xmpp.util.WicketDelegator; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.authroles.authorization.strategies.role.Roles; import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.time.Duration; import org.odlabs.wiquery.ui.accordion.Accordion; import org.odlabs.wiquery.ui.dialog.Dialog; @AuthorizeInstantiation(Roles.USER) public class NabaztagContainerPanel extends Panel { private static int WIDTH = 540; private static int HEIGHT = 320; private static int TIMER_NAB_ONLINE = 15; private static final long serialVersionUID = 1L; private PersistenceModel<Nabaztag> nabaztag; private Label status; private Accordion accordion; private Dialog sleepDialog; private Dialog randomDialog; private Dialog weatherDialog; private Dialog clockDialog; private WebMarkupContainer dialogContainer; public static boolean isOnline(String uid) { return WicketDelegator.isNabaztagOnline(uid); } public NabaztagContainerPanel(String id, final PersistenceModel<Nabaztag> nabaztag) { super(id); this.nabaztag = nabaztag; // Popup configuration. dialogContainer = new WebMarkupContainer("dialogContainer"); dialogContainer.setOutputMarkupId(true); add(dialogContainer); clockDialog = configurationPopup("clockDialog", "Configure clock settings", new ConfigureClockPanel("child", nabaztag)); sleepDialog = configurationPopup("sleepDialog", "Configure when your nabaztag sleeps", new ConfigureSleepPanel( "child", nabaztag)); weatherDialog = configurationPopup("weatherDialog", "Configure weather settings", new ConfigureWeatherPanel( "child", nabaztag)); randomDialog = configurationPopup("randomDialog", "Configure witty remarks", new ConfigureRandomSpeechPanel( "child", nabaztag)); // Service Accordion: accordionServices(); // Online/Offline status: nabaztagStatus(); // Register services: registerServices(); // Configure buttons: configureButtons(); } /** * Registers services in the accordion. */ private void registerServices() { accordion.add(new RadioContainerPanel("radioContainerPanel", nabaztag .getObject().getUid())); } /** * Enables feedback to the user about his/her nabaztag, is it online or * offline? */ private void nabaztagStatus() { add(new Label("mac", nabaztag.getObject().getUid())); IModel<String> statString = new LoadableDetachableModel<String>() { private static final long serialVersionUID = 1L; protected String load() { if (NabaztagContainerPanel.isOnline(nabaztag.getObject() .getUid())) { return "Online"; } else { return "Offline"; } } }; WebMarkupContainer statusContainer = new WebMarkupContainer( "statusContainer"); status = new Label("status", statString); status.setOutputMarkupId(true); statusContainer.add(status); statusContainer.setOutputMarkupId(true); statusContainer.add(new AjaxSelfUpdatingTimerBehavior(Duration .seconds(1)) { private static final long serialVersionUID = 1L; protected void onPostProcessTarget(final AjaxRequestTarget target) { setUpdateInterval(Duration.seconds(TIMER_NAB_ONLINE)); if (status.getDefaultModelObject().equals("Offline")) { status.add(new AttributeModifier("style", new Model<String>("color: #DD0000;"))); } else { status.add(new AttributeModifier("style", new Model<String>("color: #00DD00;"))); } } }); statusContainer.setOutputMarkupId(true); add(statusContainer); } /** * Accordion that holds event-services. */ private void accordionServices() { accordion = new Accordion("accordion"); add(accordion); } /** * Popup used by the services for configuration. * * @param panel */ private Dialog configurationPopup(String containerName, String title, Component panel) { Dialog configurationDialog = new Dialog(containerName); configurationDialog.setModal(true); configurationDialog.setWidth(WIDTH); configurationDialog.setHeight(HEIGHT); configurationDialog.add(panel); configurationDialog.setOutputMarkupId(true); configurationDialog.setMarkupId(containerName); configurationDialog.setTitle(title); dialogContainer.add(configurationDialog); return configurationDialog; } /** * Buttons used by the various services for configuration. */ private void configureButtons() { // Create clock configuration button: accordion.add(new AjaxLink<String>("configureClock") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { // clockDialog.setTitle("Configure clock settings"); // target.add(clockDialog); clockDialog.open(target); } }); // Create randomspeech configuration button: accordion.add(new AjaxLink<String>("configureRandomSpeech") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { // randomDialog.setTitle("Configure witty remarks"); // target.add(randomDialog); randomDialog.open(target); } }); // Create weather configuration button: accordion.add(new AjaxLink<String>("configureWeather") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { // weatherDialog.setTitle("Configure weather settings"); // target.add(weatherDialog); weatherDialog.open(target); } }); // Create sleep configuration button: accordion.add(new AjaxLink<String>("configureSleep") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { // sleepDialog.setTitle("Configure when your nabaztag sleeps"); // target.add(sleepDialog); sleepDialog.open(target); } }); } }