Java tutorial
/** * Sencha GXT 3.1.1 - Sencha for GWT * Copyright(c) 2007-2014, Sencha, Inc. * licensing@sencha.com * * http://www.sencha.com/products/gxt/license/ */ package com.sencha.gxt.explorer.client.chart; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.editor.client.Editor; import com.google.gwt.editor.client.SimpleBeanEditorDriver; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.TakesValue; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import com.sencha.gxt.chart.client.chart.Chart; import com.sencha.gxt.chart.client.chart.axis.RadialAxis; import com.sencha.gxt.chart.client.chart.series.Primitives; import com.sencha.gxt.chart.client.chart.series.RadarSeries; import com.sencha.gxt.chart.client.chart.series.SeriesRenderer; import com.sencha.gxt.chart.client.draw.RGB; import com.sencha.gxt.chart.client.draw.sprite.Sprite; import com.sencha.gxt.core.client.util.Margins; import com.sencha.gxt.data.shared.ListStore; import com.sencha.gxt.examples.resources.client.model.Data; import com.sencha.gxt.examples.resources.client.model.RadarData; import com.sencha.gxt.examples.resources.client.model.RadarDataProperties; import com.sencha.gxt.widget.core.client.ContentPanel; import com.sencha.gxt.widget.core.client.container.VBoxLayoutContainer; import com.sencha.gxt.widget.core.client.container.VBoxLayoutContainer.VBoxLayoutAlign; import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; import com.sencha.gxt.widget.core.client.form.DoubleSpinnerField; import com.sencha.gxt.widget.core.client.form.Field; import com.sencha.gxt.widget.core.client.form.FieldLabel; import com.sencha.gxt.widget.core.client.form.TextField; public class CompanyDetailsEditor implements Editor<Data>, IsWidget, HasValueChangeHandlers<Data>, TakesValue<Data> { private final static String[] radarLabels = { "Price", "Revenue %", "Growth %", "Product %", "Market %" }; private final HandlerManager handlerManager = new HandlerManager(this); interface Driver extends SimpleBeanEditorDriver<Data, CompanyDetailsEditor> { } TextField name = new TextField(); @Path("data1") DoubleSpinnerField price = new DoubleSpinnerField(); @Path("data2") DoubleSpinnerField revenue = new DoubleSpinnerField(); @Path("data3") DoubleSpinnerField growth = new DoubleSpinnerField(); @Path("data4") DoubleSpinnerField product = new DoubleSpinnerField(); @Path("data5") DoubleSpinnerField market = new DoubleSpinnerField(); private Field[] fields = new Field[] { name, price, revenue, growth, product, market }; private final Driver driver = GWT.<Driver>create(Driver.class); private final RadarDataProperties radarProperties = GWT.<RadarDataProperties>create(RadarDataProperties.class); private final ListStore<RadarData> radarStore = new ListStore<RadarData>(radarProperties.nameKey()); private Chart<RadarData> radarChart; private ContentPanel panel; public CompanyDetailsEditor() { radarChart = createRadar(); name.setReadOnly(true); initializeSpinner(price); initializeSpinner(revenue); initializeSpinner(growth); initializeSpinner(product); initializeSpinner(market); VBoxLayoutContainer container = new VBoxLayoutContainer(); container.setVBoxLayoutAlign(VBoxLayoutAlign.CENTER); container.add(new FieldLabel(name, "Name")); container.add(new FieldLabel(price, "Price $")); container.add(new FieldLabel(revenue, "Revenue %")); container.add(new FieldLabel(growth, "Growth %")); container.add(new FieldLabel(product, "Product %")); container.add(new FieldLabel(market, "Market %")); container.add(radarChart); panel = new ContentPanel(); panel.setHeadingText("Company Details"); panel.addStyleName("white-bg"); panel.add(container, new VerticalLayoutData(1, 1, new Margins(20, 0, 0, 0))); driver.initialize(this); } @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Data> handler) { return handlerManager.addHandler(ValueChangeEvent.getType(), handler); } @Override public Widget asWidget() { return panel; } @Override public void fireEvent(GwtEvent<?> event) { handlerManager.fireEvent(event); } @Override public Data getValue() { return driver.flush(); } @Override public void setValue(final Data value) { persistFields(); // If one of the spinners has focus with changes, // it needs to persist before editing new bean Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { resetFields(); driver.edit(value); updateRadar(value); } }); } private Chart<RadarData> createRadar() { Chart<RadarData> chart = new Chart<RadarData>(320, 320); chart.setStore(radarStore); chart.setAnimated(true); chart.setDefaultInsets(50); RadialAxis<RadarData, String> axis = new RadialAxis<RadarData, String>(); axis.setCategoryField(radarProperties.name()); axis.setSteps(5); chart.addAxis(axis); RadarSeries<RadarData> radar = new RadarSeries<RadarData>(); radar.setYField(radarProperties.data()); radar.setFill(new RGB(194, 214, 240)); radar.setStrokeWidth(0.5); radar.setLineRenderer(new SeriesRenderer<RadarData>() { @Override public void spriteRenderer(Sprite sprite, int index, ListStore<RadarData> store) { sprite.setOpacity(0.5); } }); radar.setShowMarkers(true); Sprite marker = Primitives.circle(0, 0, 4); marker.setFill(new RGB(69, 109, 159)); radar.setMarkerConfig(marker); chart.addSeries(radar); return chart; } private void initializeSpinner(final DoubleSpinnerField spinner) { spinner.setIncrement(1d); spinner.setMinValue(0d); spinner.setMaxValue(100d); spinner.setAllowBlank(false); spinner.getPropertyEditor().setFormat(NumberFormat.getFormat("0.00")); spinner.addValueChangeHandler(new ValueChangeHandler<Double>() { @Override public void onValueChange(ValueChangeEvent<Double> event) { if (spinner.isValid()) { Data value = driver.flush(); updateRadar(value); ValueChangeEvent.fire(CompanyDetailsEditor.this, value); } } }); } private void resetFields() { for (Field field : fields) { field.clearInvalid(); } } private void persistFields() { for (Field field : fields) { if (field.isEditing()) { field.finishEditing(); } } } private void updateRadar(Data data) { radarStore.clear(); radarStore.add(new RadarData(radarLabels[0], data.getData1())); radarStore.add(new RadarData(radarLabels[1], data.getData2())); radarStore.add(new RadarData(radarLabels[2], data.getData3())); radarStore.add(new RadarData(radarLabels[3], data.getData4())); radarStore.add(new RadarData(radarLabels[4], data.getData5())); radarChart.redrawChart(); } }