/******************************************************************************* * Copyright (c) 2011, 2016 Eurotech and/or its affiliates * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech *******************************************************************************/ package org.eclipse.kura.web.client.device; import java.util.ArrayList; import java.util.List; import org.eclipse.kura.web.client.messages.Messages; import org.eclipse.kura.web.client.resources.Resources; import org.eclipse.kura.web.client.util.FailureHandler; import org.eclipse.kura.web.shared.model.GwtGroupedNVPair; import org.eclipse.kura.web.shared.model.GwtSession; import org.eclipse.kura.web.shared.model.GwtXSRFToken; import org.eclipse.kura.web.shared.service.GwtDeviceService; import org.eclipse.kura.web.shared.service.GwtDeviceServiceAsync; import org.eclipse.kura.web.shared.service.GwtSecurityTokenService; import org.eclipse.kura.web.shared.service.GwtSecurityTokenServiceAsync; import com.extjs.gxt.ui.client.Style.Scroll; import com.extjs.gxt.ui.client.Style.SelectionMode; import com.extjs.gxt.ui.client.data.BaseListLoader; import com.extjs.gxt.ui.client.data.ListLoadResult; import com.extjs.gxt.ui.client.data.LoadEvent; import com.extjs.gxt.ui.client.data.RpcProxy; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.LoadListener; import com.extjs.gxt.ui.client.event.MessageBoxEvent; import com.extjs.gxt.ui.client.event.SelectionChangedEvent; import com.extjs.gxt.ui.client.event.SelectionChangedListener; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel; import com.extjs.gxt.ui.client.widget.grid.GridView; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; public class BundlesTab extends LayoutContainer { private static final Messages MSGS = GWT.create(Messages.class); private final GwtSecurityTokenServiceAsync gwtXSRFService = GWT.create(GwtSecurityTokenService.class); private final GwtDeviceServiceAsync gwtDeviceService = GWT.create(GwtDeviceService.class); @SuppressWarnings("unused") private GwtSession m_currentSession; private boolean m_initialized; private boolean m_dirty; private ToolBar m_toolBar; private Button m_refreshButton; private Button m_startButton; private Button m_stopButton; private Grid<GwtGroupedNVPair> m_grid; private ListStore<GwtGroupedNVPair> m_store; private BaseListLoader<ListLoadResult<GwtGroupedNVPair>> m_loader; public BundlesTab(GwtSession currentSession) { m_currentSession = currentSession; m_dirty = true; m_initialized = false; } protected void onRender(Element parent, int index) { super.onRender(parent, index); setLayout(new FitLayout()); setId("device-bundles"); initToolbar(); initBundles(); ContentPanel bundlePanel = new ContentPanel(); bundlePanel.setBorders(false); bundlePanel.setBodyBorder(false); bundlePanel.setHeaderVisible(false); bundlePanel.setLayout( new FitLayout()); bundlePanel.setScrollMode(Scroll.AUTO); bundlePanel.setTopComponent(m_toolBar); bundlePanel.add(m_grid); add(bundlePanel); m_initialized = true; } private void initToolbar() { m_toolBar = new ToolBar(); m_toolBar.setBorders(true); m_toolBar.setId("packages-toolbar"); m_refreshButton = new Button(MSGS.refreshButton(), AbstractImagePrototype.create(Resources.INSTANCE.refresh()), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { m_toolBar.disable(); m_dirty = true; refresh(); } } ); m_refreshButton.setEnabled(true); m_toolBar.add(m_refreshButton); m_toolBar.add(new SeparatorToolItem()); final AsyncCallback<Void> callback = new AsyncCallback<Void>() { public void onFailure(Throwable caught) { FailureHandler.handle(caught); m_dirty = true; } public void onSuccess(Void arg0) { m_dirty = true; refresh(); } }; m_startButton = new Button(MSGS.deviceTabBundleStart(), AbstractImagePrototype.create(Resources.INSTANCE.packageAdd()), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { m_toolBar.disable(); m_grid.mask(MSGS.waiting()); gwtXSRFService.generateSecurityToken(new AsyncCallback<GwtXSRFToken> () { @Override public void onFailure(Throwable ex) { FailureHandler.handle(ex); } @Override public void onSuccess(GwtXSRFToken token) { gwtDeviceService.startBundle(token, m_grid.getSelectionModel().getSelectedItem().getId(), callback); }}); } } ); m_startButton.setEnabled(true); m_toolBar.add(m_startButton); m_toolBar.add(new SeparatorToolItem()); m_stopButton = new Button(MSGS.deviceTabBundleStop(), AbstractImagePrototype.create(Resources.INSTANCE.packageDelete()), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { final GwtGroupedNVPair selectedBundle = m_grid.getSelectionModel().getSelectedItem(); MessageBox.confirm(MSGS.confirm(), MSGS.deviceStopBundle(selectedBundle.getName()), new Listener<MessageBoxEvent>() { @Override public void handleEvent(MessageBoxEvent be) { Dialog dialog = be.getDialog(); if (dialog.yesText.equals(be.getButtonClicked().getText())) { m_toolBar.disable(); m_grid.mask(MSGS.waiting()); gwtXSRFService.generateSecurityToken(new AsyncCallback<GwtXSRFToken> () { @Override public void onFailure(Throwable ex) { FailureHandler.handle(ex); } @Override public void onSuccess(GwtXSRFToken token) { gwtDeviceService.stopBundle(token, m_grid.getSelectionModel().getSelectedItem().getId(), callback); }}); } } }); } }); m_stopButton.setEnabled(true); m_toolBar.add(m_stopButton); m_toolBar.add(new SeparatorToolItem()); m_toolBar.disable(); } private void initBundles() { RpcProxy<ListLoadResult<GwtGroupedNVPair>> proxy = new RpcProxy<ListLoadResult<GwtGroupedNVPair>>() { @Override protected void load(Object loadConfig, final AsyncCallback<ListLoadResult<GwtGroupedNVPair>> callback) { gwtXSRFService.generateSecurityToken(new AsyncCallback<GwtXSRFToken> () { @Override public void onFailure(Throwable ex) { FailureHandler.handle(ex); } @Override public void onSuccess(GwtXSRFToken token) { gwtDeviceService.findBundles(token, new AsyncCallback<ListLoadResult<GwtGroupedNVPair>>() { public void onSuccess(ListLoadResult<GwtGroupedNVPair> pairs) { callback.onSuccess(pairs); } public void onFailure(Throwable caught) { FailureHandler.handle(caught); } }); }}); } }; m_loader = new BaseListLoader<ListLoadResult<GwtGroupedNVPair>>(proxy); m_loader.addLoadListener( new DataLoadListener()); m_store = new ListStore<GwtGroupedNVPair>(m_loader); ColumnConfig id = new ColumnConfig("id", MSGS.deviceBndId(), 10); ColumnConfig name = new ColumnConfig("name", MSGS.deviceBndName(), 50); ColumnConfig status = new ColumnConfig("statusLoc", MSGS.deviceBndState(), 20); ColumnConfig version = new ColumnConfig("version", MSGS.deviceBndVersion(), 20); List<ColumnConfig> config = new ArrayList<ColumnConfig>(); config.add(id); config.add(name); config.add(status); config.add(version); ColumnModel cm = new ColumnModel(config); GridView view = new GridView(); view.setForceFit(true); m_grid = new Grid<GwtGroupedNVPair>(m_store, cm); m_grid.setView(view); m_grid.setBorders(false); m_grid.setLoadMask(true); m_grid.setStripeRows(true); GridSelectionModel<GwtGroupedNVPair> selectionModel = new GridSelectionModel<GwtGroupedNVPair>(); selectionModel.setSelectionMode(SelectionMode.SINGLE); m_grid.setSelectionModel(selectionModel); m_grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<GwtGroupedNVPair>() { @Override public void selectionChanged(SelectionChangedEvent<GwtGroupedNVPair> se) { GwtGroupedNVPair selectedEntry = se.getSelectedItem(); if (selectedEntry != null) { if ("bndActive".equals(selectedEntry.getStatus())) { m_startButton.disable(); m_stopButton.enable(); } else { m_stopButton.disable(); m_startButton.enable(); } } else { m_startButton.setEnabled(false); m_stopButton.setEnabled(false); } } }); } public void refresh() { if (m_dirty && m_initialized) { m_dirty = false; m_loader.load(); m_toolBar.enable(); m_startButton.disable(); m_stopButton.disable(); } } // -------------------------------------------------------------------------------------- // // Data Load Listener // // -------------------------------------------------------------------------------------- private class DataLoadListener extends LoadListener { public DataLoadListener() { } public void loaderBeforeLoad(LoadEvent le) { m_grid.mask(MSGS.loading()); } public void loaderLoad(LoadEvent le) { if (le.exception != null) { FailureHandler.handle(le.exception); } m_startButton.disable(); m_stopButton.disable(); m_grid.unmask(); } public void loaderLoadException(LoadEvent le) { if (le.exception != null) { FailureHandler.handle(le.exception); } m_startButton.disable(); m_stopButton.disable(); m_grid.unmask(); } } }