diff --git a/.classpath b/.classpath index f58574df..816525da 100644 --- a/.classpath +++ b/.classpath @@ -25,6 +25,6 @@ - + diff --git a/examples/widgetgallery/.classpath b/examples/widgetgallery/.classpath index d2ea02b1..0431efb3 100644 --- a/examples/widgetgallery/.classpath +++ b/examples/widgetgallery/.classpath @@ -8,7 +8,7 @@ - + diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/ChartState.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/ChartState.java new file mode 100644 index 00000000..86c740f1 --- /dev/null +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/ChartState.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2009 Emweb bvba, Leuven, Belgium. + * + * See the LICENSE file for terms of use. + */ +package eu.webtoolkit.jwt.examples.widgetgallery; + +import java.util.*; +import java.util.regex.*; +import java.io.*; +import java.lang.ref.*; +import java.util.concurrent.locks.ReentrantLock; +import javax.servlet.http.*; +import javax.servlet.*; +import eu.webtoolkit.jwt.*; +import eu.webtoolkit.jwt.chart.*; +import eu.webtoolkit.jwt.utils.*; +import eu.webtoolkit.jwt.servlet.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class ChartState extends WObject { + private static Logger logger = LoggerFactory.getLogger(ChartState.class); + + public ChartState(WObject parent) { + super(parent); + } + + public ChartState() { + this((WObject) null); + } + + public SinModel model; +} diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/FormWidgets.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/FormWidgets.java index e3c68161..a6d8e8ef 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/FormWidgets.java +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/FormWidgets.java @@ -65,7 +65,7 @@ public WWidget create() { return FormWidgets.this.autoComplete(); } })); - menu.addItem("Date entry", + menu.addItem("Date & Time entry", DeferredWidget.deferCreate(new WidgetCreator() { public WWidget create() { return FormWidgets.this.dateEntry(); @@ -185,6 +185,7 @@ private WWidget dateEntry() { result.bindWidget("CalendarSimple", CalendarSimple()); result.bindWidget("CalendarExtended", CalendarExtended()); result.bindWidget("DateEdit", DateEdit()); + result.bindWidget("TimeEdit", TimeEdit()); result.bindWidget("DatePicker", DatePicker()); return result; } @@ -592,8 +593,8 @@ WWidget ComboBoxModel() { public void trigger() { WString countryName = cb.getCurrentText(); int row = cb.getCurrentIndex(); - String countryCode = (String) model.getData( - model.getIndex(row, 0), ItemDataRole.UserRole); + String countryCode = ((String) model.getData( + model.getIndex(row, 0), ItemDataRole.UserRole)); out.setText(new WString("You selected {1} with key {2}.").arg( countryName).arg(countryCode)); } @@ -782,6 +783,56 @@ public void trigger() { return form; } + WWidget TimeEdit() { + WTemplate form = new WTemplate(WString.tr("timeEdit-template")); + form.addFunction("id", WTemplate.Functions.id); + final WTimeEdit de1 = new WTimeEdit(); + form.bindWidget("from", de1); + form.bindString("from-format", de1.getFormat()); + de1.setTime(WTime.getCurrentTime()); + final WTimeEdit de2 = new WTimeEdit(); + form.bindWidget("to", de2); + de2.setFormat("h:mm:ss.SSS a"); + de2.setTime(WTime.getCurrentTime().addSecs(60 * 15)); + form.bindString("to-format", de2.getFormat()); + WPushButton button = new WPushButton("Save"); + form.bindWidget("save", button); + final WText out = new WText(); + form.bindWidget("out", out); + de1.changed().addListener(this, new Signal.Listener() { + public void trigger() { + if (de1.validate() == WValidator.State.Valid) { + out.setText("Time picker 1 is changed."); + } + } + }); + de2.changed().addListener(this, new Signal.Listener() { + public void trigger() { + if (de1.validate() == WValidator.State.Valid) { + out.setText("Time picker 2 is changed."); + } + } + }); + button.clicked().addListener(this, new Signal.Listener() { + public void trigger() { + if (de1.getText().length() == 0 || de2.getText().length() == 0) { + out.setText("You should enter two times!"); + } else { + long secs = de1.getTime().secsTo(de2.getTime()) + 1; + if (secs <= 60 * 10) { + out.setText("This is a really small range of time"); + } else { + out.setText(new WString( + "So, you want your package to be delivered between {1} and {2} ?...") + .arg(de1.getTime().toString()).arg( + de2.getTime().toString())); + } + } + } + }); + return form; + } + WWidget DatePicker() { WTemplate form = new WTemplate(WString.tr("dateEdit-template")); form.addFunction("id", WTemplate.Functions.id); diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GitModel.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GitModel.java index 90bc898f..99d1d4c2 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GitModel.java +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GitModel.java @@ -196,7 +196,7 @@ public ChildIndex(int aParent, int anIndex) { } public boolean equals(Object o) { - GitModel.ChildIndex other = (ChildIndex) o; + GitModel.ChildIndex other = ((ChildIndex) o); return this.parentId == other.parentId && this.index == other.index; } diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GoogleMapExample.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GoogleMapExample.java index 4d74c5cf..852271d0 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GoogleMapExample.java +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GoogleMapExample.java @@ -205,7 +205,7 @@ private void addMapTypeControl(final CharSequence description, private void setMapTypeControl(int row) { Object mtc = this.mapTypeModel_.getData(row, 0, ItemDataRole.UserRole); - this.map_.setMapTypeControl((WGoogleMap.MapTypeControl) mtc); + this.map_.setMapTypeControl(((WGoogleMap.MapTypeControl) mtc)); } private List getRoadDescription() { diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GraphicsWidgets.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GraphicsWidgets.java index 35928190..caa91cb9 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GraphicsWidgets.java +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/GraphicsWidgets.java @@ -49,6 +49,12 @@ public WWidget create() { return GraphicsWidgets.this.scatterPlot(); } })); + menu.addItem("Axis slider widget", + DeferredWidget.deferCreate(new WidgetCreator() { + public WWidget create() { + return GraphicsWidgets.this.axisSliderWidget(); + } + })); menu.addItem("Pie chart", DeferredWidget.deferCreate(new WidgetCreator() { public WWidget create() { @@ -112,6 +118,14 @@ private WWidget scatterPlot() { return result; } + private WWidget axisSliderWidget() { + WTemplate result = new TopicTemplate("graphics-AxisSliderWidget"); + result.bindWidget("AxisSliderWidget", AxisSliderWidget()); + result.bindWidget("AxisSliderWidgetDifferentDataSeries", + AxisSliderWidgetDifferentDataSeries()); + return result; + } + private WWidget pieChart() { WTemplate result = new TopicTemplate("graphics-PieChart"); result.bindWidget("PieChart", PieChart()); @@ -443,7 +457,49 @@ WWidget ScatterPlotInteractive() { chart.setXSeriesColumn(0); chart.setType(ChartType.ScatterPlot); chart.getAxis(Axis.XAxis).setScale(AxisScale.DateScale); - chart.getAxis(Axis.XAxis).setMaxZoom(16.0); + double min = StringUtils.asNumber(model.getData(0, 0)); + double max = StringUtils.asNumber(model.getData( + model.getRowCount() - 1, 0)); + chart.getAxis(Axis.XAxis).setMinimumZoomRange((max - min) / 16.0); + { + WDataSeries s = new WDataSeries(2, SeriesType.LineSeries); + s.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3)); + chart.addSeries(s); + } + { + WDataSeries s = new WDataSeries(3, SeriesType.LineSeries); + s.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3)); + chart.addSeries(s); + } + chart.resize(new WLength(800), new WLength(400)); + chart.setPanEnabled(true); + chart.setZoomEnabled(true); + chart.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right)); + return container; + } + + WWidget AxisSliderWidget() { + WContainerWidget container = new WContainerWidget(); + WStandardItemModel model = CsvUtil.csvToModel("" + "timeseries.csv", + container); + if (!(model != null)) { + return container; + } + for (int row = 0; row < model.getRowCount(); ++row) { + WString s = StringUtils.asString(model.getData(row, 0)); + WDate date = WDate.fromString(s.toString(), "dd/MM/yy"); + model.setData(row, 0, date); + } + WCartesianChart chart = new WCartesianChart(container); + chart.setBackground(new WBrush(new WColor(220, 220, 220))); + chart.setModel(model); + chart.setXSeriesColumn(0); + chart.setType(ChartType.ScatterPlot); + chart.getAxis(Axis.XAxis).setScale(AxisScale.DateScale); + double min = StringUtils.asNumber(model.getData(0, 0)); + double max = StringUtils.asNumber(model.getData( + model.getRowCount() - 1, 0)); + chart.getAxis(Axis.XAxis).setMinimumZoomRange((max - min) / 16.0); WDataSeries s = new WDataSeries(2, SeriesType.LineSeries); s.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3)); chart.addSeries(s); @@ -451,7 +507,70 @@ WWidget ScatterPlotInteractive() { chart.setPanEnabled(true); chart.setZoomEnabled(true); chart.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right)); - WAxisSliderWidget sliderWidget = new WAxisSliderWidget(chart, 2, + WAxisSliderWidget sliderWidget = new WAxisSliderWidget(s, container); + sliderWidget.resize(new WLength(800), new WLength(80)); + sliderWidget.setSelectionAreaPadding(40, + EnumSet.of(Side.Left, Side.Right)); + sliderWidget.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right)); + return container; + } + + WWidget AxisSliderWidgetDifferentDataSeries() { + WContainerWidget container = new WContainerWidget(); + final ChartState state = new ChartState(container); + state.model = new SinModel(-3.14159265358979323846, + 3.14159265358979323846); + final WCartesianChart chart = new WCartesianChart(container); + chart.setBackground(new WBrush(new WColor(220, 220, 220))); + chart.setType(ChartType.ScatterPlot); + WAbstractChartModel roughModel = new SinModel(-3.14159265358979323846, + 3.14159265358979323846, container); + WDataSeries roughSeries = new WDataSeries(1, SeriesType.LineSeries); + roughSeries.setModel(roughModel); + roughSeries.setXSeriesColumn(0); + roughSeries.setHidden(true); + chart.addSeries(roughSeries); + final WDataSeries series = new WDataSeries(1, SeriesType.LineSeries); + series.setModel(state.model); + series.setXSeriesColumn(0); + series.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3)); + chart.addSeries(series); + chart.getAxis(Axis.XAxis).zoomRangeChanged() + .addListener(this, new Signal.Listener() { + public void trigger() { + double minX = chart.getAxis(Axis.XAxis) + .getZoomMinimum(); + double maxX = chart.getAxis(Axis.XAxis) + .getZoomMaximum(); + double dX = maxX - minX; + minX = minX - dX / 2.0; + if (minX < -3.14159265358979323846) { + minX = -3.14159265358979323846; + } + maxX = maxX + dX / 2.0; + if (maxX > 3.14159265358979323846) { + maxX = 3.14159265358979323846; + } + if (state.model.getMinimum() != minX + || state.model.getMaximum() != maxX) { + ; + state.model = new SinModel(minX, maxX); + series.setModel(state.model); + } + } + }); + chart.getAxis(Axis.XAxis).setMinimumZoomRange( + 3.14159265358979323846 / 8.0); + chart.getAxis(Axis.XAxis).setMinimum(-3.5); + chart.getAxis(Axis.XAxis).setMaximum(3.5); + chart.getAxis(Axis.YAxis).setMinimumZoomRange(0.1); + chart.getAxis(Axis.YAxis).setMinimum(-1.5); + chart.getAxis(Axis.YAxis).setMaximum(1.5); + chart.resize(new WLength(800), new WLength(400)); + chart.setPanEnabled(true); + chart.setZoomEnabled(true); + chart.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right)); + WAxisSliderWidget sliderWidget = new WAxisSliderWidget(roughSeries, container); sliderWidget.resize(new WLength(800), new WLength(80)); sliderWidget.setSelectionAreaPadding(40, diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/SinModel.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/SinModel.java new file mode 100644 index 00000000..5fb21b7f --- /dev/null +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/SinModel.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2009 Emweb bvba, Leuven, Belgium. + * + * See the LICENSE file for terms of use. + */ +package eu.webtoolkit.jwt.examples.widgetgallery; + +import java.util.*; +import java.util.regex.*; +import java.io.*; +import java.lang.ref.*; +import java.util.concurrent.locks.ReentrantLock; +import javax.servlet.http.*; +import javax.servlet.*; +import eu.webtoolkit.jwt.*; +import eu.webtoolkit.jwt.chart.*; +import eu.webtoolkit.jwt.utils.*; +import eu.webtoolkit.jwt.servlet.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class SinModel extends WAbstractChartModel { + private static Logger logger = LoggerFactory.getLogger(SinModel.class); + + public SinModel(double minimum, double maximum, WObject parent) { + super(parent); + this.minimum_ = minimum; + this.maximum_ = maximum; + } + + public SinModel(double minimum, double maximum) { + this(minimum, maximum, (WObject) null); + } + + public double getData(int row, int column) { + double x = this.minimum_ + row * (this.maximum_ - this.minimum_) + / (this.getRowCount() - 1); + if (column == 0) { + return x; + } else { + return Math.sin(x) + Math.sin(x * 100.0) / 40.0; + } + } + + public int getColumnCount() { + return 2; + } + + public int getRowCount() { + return 100; + } + + public double getMinimum() { + return this.minimum_; + } + + public double getMaximum() { + return this.maximum_; + } + + private double minimum_; + private double maximum_; +} diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormModel.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormModel.java index 5c4db55c..2e6f532c 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormModel.java +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormModel.java @@ -105,8 +105,8 @@ public WString getUserData() { } public String countryCode(int row) { - return (String) this.countryModel_.getData(row, 0, - ItemDataRole.UserRole); + return ((String) this.countryModel_.getData(row, 0, + ItemDataRole.UserRole)); } private static final Map> cities = getCityMap(); diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormView.java b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormView.java index d478a505..14bd453e 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormView.java +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/UserFormView.java @@ -42,8 +42,8 @@ public void trigger() { this.setFormWidget(UserFormModel.CountryField, countryCB, new WTemplateFormView.FieldView() { public void updateViewValue() { - String code = (String) UserFormView.this.model - .getValue(UserFormModel.CountryField); + String code = ((String) UserFormView.this.model + .getValue(UserFormModel.CountryField)); int row = UserFormView.this.model.countryModelRow(code); countryCB.setCurrentIndex(row); } @@ -62,8 +62,8 @@ public void updateModelValue() { this.setFormWidget(UserFormModel.BirthField, dateEdit, new WTemplateFormView.FieldView() { public void updateViewValue() { - WDate date = (WDate) UserFormView.this.model - .getValue(UserFormModel.BirthField); + WDate date = ((WDate) UserFormView.this.model + .getValue(UserFormModel.BirthField)); dateEdit.setDate(date); } diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/src.xml b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/src.xml index 0a063f4d..635d3eb4 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/src.xml +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/src.xml @@ -72,6 +72,167 @@ sp.addSuggestion("John Rambo <rambo@mycompany.com>"); sp.addSuggestion("Johanna Tree <johanna@mycompany.com>"); } + + ]]> +
void AxisSliderWidget() {
+    WContainerWidget container = new WContainerWidget();
+    WStandardItemModel model = CsvUtil.csvToModel("" + "timeseries.csv",
+            container);
+    if (!(model != null)) {
+        return container;
+    }
+    for (int row = 0; row < model.getRowCount(); ++row) {
+        WString s = StringUtils.asString(model.getData(row, 0));
+        WDate date = WDate.fromString(s.toString(), "dd/MM/yy");
+        model.setData(row, 0, date);
+    }
+    WCartesianChart chart = new WCartesianChart(container);
+    chart.setBackground(new WBrush(new WColor(220, 220, 220)));
+    chart.setModel(model);
+    chart.setXSeriesColumn(0);
+    chart.setType(ChartType.ScatterPlot);
+    chart.getAxis(Axis.XAxis).setScale(AxisScale.DateScale);
+    double min = StringUtils.asNumber(model.getData(0, 0));
+    double max = StringUtils.asNumber(model.getData(
+            model.getRowCount() - 1, 0));
+    chart.getAxis(Axis.XAxis).setMinimumZoomRange((max - min) / 16.0);
+    WDataSeries s = new WDataSeries(2, SeriesType.LineSeries);
+    s.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3));
+    chart.addSeries(s);
+    chart.resize(new WLength(800), new WLength(400));
+    chart.setPanEnabled(true);
+    chart.setZoomEnabled(true);
+    chart.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right));
+    WAxisSliderWidget sliderWidget = new WAxisSliderWidget(s, container);
+    sliderWidget.resize(new WLength(800), new WLength(80));
+    sliderWidget.setSelectionAreaPadding(40,
+            EnumSet.of(Side.Left, Side.Right));
+    sliderWidget.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right));
+}
+
+ ]]>
+
class SinModel extends WAbstractChartModel {
+    private static Logger logger = LoggerFactory.getLogger(SinModel.class);
+
+    SinModel(double minimum, double maximum, WObject parent) {
+        super(parent);
+        this.minimum_ = minimum;
+        this.maximum_ = maximum;
+    }
+
+    public SinModel(double minimum, double maximum) {
+        this(minimum, maximum, (WObject) null);
+    }
+
+    double getData(int row, int column) {
+        double x = this.minimum_ + row * (this.maximum_ - this.minimum_)
+                / (this.getRowCount() - 1);
+        if (column == 0) {
+            return x;
+        } else {
+            return Math.sin(x) + Math.sin(x * 100.0) / 40.0;
+        }
+    }
+
+    int getColumnCount() {
+        return 2;
+    }
+
+    int getRowCount() {
+        return 100;
+    }
+
+    double getMinimum() {
+        return this.minimum_;
+    }
+
+    double getMaximum() {
+        return this.maximum_;
+    }
+
+    private double minimum_;
+    private double maximum_;
+}
+
+class ChartState extends WObject {
+    private static Logger logger = LoggerFactory
+            .getLogger(ChartState.class);
+
+    ChartState(WObject parent) {
+        super(parent);
+    }
+
+    public ChartState() {
+        this((WObject) null);
+    }
+
+    public SinModel model;
+}
+
+void AxisSliderWidgetDifferentDataSeries() {
+    WContainerWidget container = new WContainerWidget();
+    final ChartState state = new ChartState(container);
+    state.model = new SinModel(-3.14159265358979323846,
+            3.14159265358979323846);
+    final WCartesianChart chart = new WCartesianChart(container);
+    chart.setBackground(new WBrush(new WColor(220, 220, 220)));
+    chart.setType(ChartType.ScatterPlot);
+    WAbstractChartModel roughModel = new SinModel(-3.14159265358979323846,
+            3.14159265358979323846, container);
+    WDataSeries roughSeries = new WDataSeries(1, SeriesType.LineSeries);
+    roughSeries.setModel(roughModel);
+    roughSeries.setXSeriesColumn(0);
+    roughSeries.setHidden(true);
+    chart.addSeries(roughSeries);
+    final WDataSeries series = new WDataSeries(1, SeriesType.LineSeries);
+    series.setModel(state.model);
+    series.setXSeriesColumn(0);
+    series.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3));
+    chart.addSeries(series);
+    chart.getAxis(Axis.XAxis).zoomRangeChanged()
+            .addListener(this, new Signal.Listener() {
+                public void trigger() {
+                    double minX = chart.getAxis(Axis.XAxis)
+                            .getZoomMinimum();
+                    double maxX = chart.getAxis(Axis.XAxis)
+                            .getZoomMaximum();
+                    double dX = maxX - minX;
+                    minX = minX - dX / 2.0;
+                    if (minX < -3.14159265358979323846) {
+                        minX = -3.14159265358979323846;
+                    }
+                    maxX = maxX + dX / 2.0;
+                    if (maxX > 3.14159265358979323846) {
+                        maxX = 3.14159265358979323846;
+                    }
+                    if (state.model.getMinimum() != minX
+                            || state.model.getMaximum() != maxX) {
+                        ;
+                        state.model = new SinModel(minX, maxX);
+                        series.setModel(state.model);
+                    }
+                }
+            });
+    chart.getAxis(Axis.XAxis).setMinimumZoomRange(
+            3.14159265358979323846 / 8.0);
+    chart.getAxis(Axis.XAxis).setMinimum(-3.5);
+    chart.getAxis(Axis.XAxis).setMaximum(3.5);
+    chart.getAxis(Axis.YAxis).setMinimumZoomRange(0.1);
+    chart.getAxis(Axis.YAxis).setMinimum(-1.5);
+    chart.getAxis(Axis.YAxis).setMaximum(1.5);
+    chart.resize(new WLength(800), new WLength(400));
+    chart.setPanEnabled(true);
+    chart.setZoomEnabled(true);
+    chart.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right));
+    WAxisSliderWidget sliderWidget = new WAxisSliderWidget(roughSeries,
+            container);
+    sliderWidget.resize(new WLength(800), new WLength(80));
+    sliderWidget.setSelectionAreaPadding(40,
+            EnumSet.of(Side.Left, Side.Right));
+    sliderWidget.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right));
+}
 
]]>
public void trigger() { WString countryName = cb.getCurrentText(); int row = cb.getCurrentIndex(); - String countryCode = (String) model.getData( - model.getIndex(row, 0), ItemDataRole.UserRole); + String countryCode = ((String) model.getData( + model.getIndex(row, 0), ItemDataRole.UserRole)); out.setText(new WString("You selected {1} with key {2}.").arg( countryName).arg(countryCode)); } @@ -907,8 +1068,8 @@ } String countryCode(int row) { - return (String) this.countryModel_.getData(row, 0, - ItemDataRole.UserRole); + return ((String) this.countryModel_.getData(row, 0, + ItemDataRole.UserRole)); } private static final Map<String, List<String>> cities = getCityMap(); @@ -1037,8 +1198,8 @@ this.setFormWidget(UserFormModel.CountryField, countryCB, new WTemplateFormView.FieldView() { public void updateViewValue() { - String code = (String) UserFormView.this.model - .getValue(UserFormModel.CountryField); + String code = ((String) UserFormView.this.model + .getValue(UserFormModel.CountryField)); int row = UserFormView.this.model .countryModelRow(code); countryCB.setCurrentIndex(row); @@ -1058,8 +1219,8 @@ this.setFormWidget(UserFormModel.BirthField, dateEdit, new WTemplateFormView.FieldView() { public void updateViewValue() { - WDate date = (WDate) UserFormView.this.model - .getValue(UserFormModel.BirthField); + WDate date = ((WDate) UserFormView.this.model + .getValue(UserFormModel.BirthField)); dateEdit.setDate(date); } @@ -1290,7 +1451,7 @@ } boolean equals(Object o) { - GitModel.ChildIndex other = (ChildIndex) o; + GitModel.ChildIndex other = ((ChildIndex) o); return this.parentId == other.parentId && this.index == other.index; } @@ -1572,7 +1733,7 @@ void setMapTypeControl(int row) { Object mtc = this.mapTypeModel_.getData(row, 0, ItemDataRole.UserRole); - this.map_.setMapTypeControl((WGoogleMap.MapTypeControl) mtc); + this.map_.setMapTypeControl(((WGoogleMap.MapTypeControl) mtc)); } List<WGoogleMap.Coordinate> getRoadDescription() { @@ -3702,20 +3863,24 @@ chart.setXSeriesColumn(0); chart.setType(ChartType.ScatterPlot); chart.getAxis(Axis.XAxis).setScale(AxisScale.DateScale); - chart.getAxis(Axis.XAxis).setMaxZoom(16.0); - WDataSeries s = new WDataSeries(2, SeriesType.LineSeries); - s.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3)); - chart.addSeries(s); + double min = StringUtils.asNumber(model.getData(0, 0)); + double max = StringUtils.asNumber(model.getData( + model.getRowCount() - 1, 0)); + chart.getAxis(Axis.XAxis).setMinimumZoomRange((max - min) / 16.0); + { + WDataSeries s = new WDataSeries(2, SeriesType.LineSeries); + s.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3)); + chart.addSeries(s); + } + { + WDataSeries s = new WDataSeries(3, SeriesType.LineSeries); + s.setShadow(new WShadow(3, 3, new WColor(0, 0, 0, 127), 3)); + chart.addSeries(s); + } chart.resize(new WLength(800), new WLength(400)); chart.setPanEnabled(true); chart.setZoomEnabled(true); chart.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right)); - WAxisSliderWidget sliderWidget = new WAxisSliderWidget(chart, 2, - container); - sliderWidget.resize(new WLength(800), new WLength(80)); - sliderWidget.setSelectionAreaPadding(40, - EnumSet.of(Side.Left, Side.Right)); - sliderWidget.setMargin(WLength.Auto, EnumSet.of(Side.Left, Side.Right)); } ]]> @@ -4796,10 +4961,13 @@ form.addFunction("id", WTemplate.Functions.id); final WTimeEdit de1 = new WTimeEdit(); form.bindWidget("from", de1); - de1.setTime(WTime.getCurrentServerTime()); + form.bindString("from-format", de1.getFormat()); + de1.setTime(WTime.getCurrentTime()); final WTimeEdit de2 = new WTimeEdit(); form.bindWidget("to", de2); - de2.setFormat("HH:mm:ss"); + de2.setFormat("h:mm:ss.SSS a"); + de2.setTime(WTime.getCurrentTime().addSecs(60 * 15)); + form.bindString("to-format", de2.getFormat()); WPushButton button = new WPushButton("Save"); form.bindWidget("save", button); final WText out = new WText(); @@ -4821,20 +4989,16 @@ button.clicked().addListener(this, new Signal.Listener() { public void trigger() { if (de1.getText().length() == 0 || de2.getText().length() == 0) { - out.setText("You should enter two time!"); + out.setText("You should enter two times!"); } else { - int secs = de1.getTime().secsTo(de2.getTime()) + 1; - if (secs <= 3600) { + long secs = de1.getTime().secsTo(de2.getTime()) + 1; + if (secs <= 60 * 10) { out.setText("This is a really small range of time"); } else { - if (secs > 3600) { - out.setText(new WString( - "So, you want to be delivered between {1} and {2} ?...") - .arg(de1.getTime().toString()).arg( - de2.getTime().toString())); - } else { - out.setText("Invalid period!"); - } + out.setText(new WString( + "So, you want your package to be delivered between {1} and {2} ?...") + .arg(de1.getTime().toString()).arg( + de2.getTime().toString())); } } } diff --git a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/text.xml b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/text.xml index 1d73a319..3eac9b20 100644 --- a/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/text.xml +++ b/examples/widgetgallery/src/eu/webtoolkit/jwt/examples/widgetgallery/text.xml @@ -1466,17 +1466,17 @@ -

When do you want to be delivered?

+

When do you want your package to be delivered?

- +
${from}
${to}
@@ -1939,11 +1939,6 @@ The ${doc-link WTimeEdit} widget is a line edit with support for time entry.

-

- By default the selected time is shown in the format "HH:mm" as in - the first example. In the second example the format is set to - "HH:mm.ss". -

Example @@ -4315,14 +4310,11 @@

Top

-

Interactive features and axis slider widget

+

Interactive features

WCartesianChart supports some forms of interaction that do not require a server roundtrip. You can zoom in on the chart below using ctrl+scroll, or with a pinch movement, and pan it - with the scrollwheel, click and drag, or touch and drag. If you have a long range of X values, - and want to easily focus on a particular range, you can use a WAxisSliderWidget. You can change - the size of the focused region by dragging the blue handles, and change the position by dragging - the selected area. When using touch, the size of this area can also be changed using a pinch movement. + with the scrollwheel, click and drag, or touch and drag.

@@ -4335,6 +4327,40 @@ + +

Axis slider widget

+

+ If you have a chart with a long range of X values, + and want to easily focus on a particular range, you can use a ${doc-link 'Chart.WAxisSliderWidget'}. You can change + the size of the focused region by dragging the blue handles, and change the position by dragging + the selected area. When using touch, the size of this area can also be changed using a pinch movement. +

+
+ Example + ${AxisSliderWidget} + ${src AxisSliderWidget} +
+

Using an alternative WDataSeries

+

+ If a series is assigned to a ${doc-link 'Chart.WAxisSliderWidget'}, but is hidden on the chart, + then it will still be drawn on the WAxisSliderWidget. Combined with the + zoomRangeChanged method of ${doc-link 'Chart.WAxis'}, this can be used to have a + rough version of the data to present in the WAxisSliderWidget, and as the + user zooms in, present a more detailed version of the data. +

+

+ The example below shows a rough version of the data in the slider, and as + you zoom in, a more fine version will be loaded on demand of the zoomed in + area. +

+ +
+ Example + ${AxisSliderWidgetDifferentDataSeries} + ${src AxisSliderWidgetDifferentDataSeries} +
+
+

Pie Chart

The Charting library

diff --git a/src/eu/webtoolkit/jwt/Configuration.java b/src/eu/webtoolkit/jwt/Configuration.java index f1426bc9..37efa074 100644 --- a/src/eu/webtoolkit/jwt/Configuration.java +++ b/src/eu/webtoolkit/jwt/Configuration.java @@ -78,6 +78,7 @@ public enum ErrorReporting { private List metaHeaders = new ArrayList(); private int internalDeploymentSize = 0; private long maxRequestSize = 1024*1024; // 1 Megabyte + private boolean behindReverseProxy = false; /** * Creates a default configuration. @@ -721,8 +722,24 @@ boolean reloadIsNewSession() { return true; } - boolean isBehindReverseProxy() { - return false; + /** + * Configures whether the application is hosted behind a reverse proxy. + * + * @see #isBehindReverseProxy() + */ + public void setBehindReverseProxy(boolean enabled) { + this.behindReverseProxy = enabled; + } + + /** + * Returns whether we are deployment behind a reverse proxy. + * When configured behind a reverse proxy, typical headers set + * by the reverse proxy are interpreted correctly: + * - X-Forwarded-Host + * - X-Forwarded-Proto + */ + public boolean isBehindReverseProxy() { + return this.behindReverseProxy; } public boolean isCookieChecks() { diff --git a/src/eu/webtoolkit/jwt/DomElement.java b/src/eu/webtoolkit/jwt/DomElement.java index ae876424..ab784b82 100644 --- a/src/eu/webtoolkit/jwt/DomElement.java +++ b/src/eu/webtoolkit/jwt/DomElement.java @@ -1623,6 +1623,15 @@ private void setJavaScriptProperties(final EscapeOStream out, out.append(this.var_).append(".rowSpan=").append(i.getValue()) .append(";"); break; + case PropertyLabel: + out.append(this.var_).append(".label="); + if (!pushed) { + escaped.pushEscape(EscapeOStream.RuleSet.JsStringLiteralSQuote); + pushed = true; + } + fastJsStringLiteral(out, escaped, i.getValue()); + out.append(';'); + break; case PropertyClass: out.append(this.var_).append(".className="); if (!pushed) { diff --git a/src/eu/webtoolkit/jwt/StdGridLayoutImpl2.java b/src/eu/webtoolkit/jwt/StdGridLayoutImpl2.java index 7940fea7..526777d4 100644 --- a/src/eu/webtoolkit/jwt/StdGridLayoutImpl2.java +++ b/src/eu/webtoolkit/jwt/StdGridLayoutImpl2.java @@ -170,7 +170,7 @@ public DomElement createDomElement(boolean fitWidth, boolean fitHeight, List overSpanned = new ArrayList(); { int insertPos = 0; - for (int ii = 0; ii < colCount * rowCount; ++ii) + for (int ii = 0; ii < (colCount * rowCount); ++ii) overSpanned.add(insertPos + ii, false); } ; @@ -714,7 +714,7 @@ static WJavaScriptPreamble wtjs1() { JavaScriptScope.WtClassScope, JavaScriptObjectType.JavaScriptConstructor, "StdLayout2", - "function(F,D,K,U,V,W,Z,q,E,z,A){function w(a){var b,c;b=0;for(c=C.items.length;be.clientWidth||k+j==e.clientWidth&&f.isGecko&&e.parentNode.parentNode.style.visibility===\"hidden\"){u=a.style[l.left];x(a,l.left,\"-1000000px\");k=b?a.scrollHeight: a.scrollWidth}}e=b?a.clientHeight:a.clientWidth;if(f.isGecko&&!a.style[l.size]&&b==0&&i(f.css(a,\"overflow\"))){d=a.style[l.size];x(a,l.size,\"\")}j=b?a.offsetHeight:a.offsetWidth;u&&x(a,l.left,u);d&&x(a,l.size,d);if(e>=1E6)e-=1E6;if(k>=1E6)k-=1E6;if(j>=1E6)j-=1E6;if(k===0){k=f.pxself(a,l.size);if(k!==0&&!f.isOpera&&!f.isGecko)k-=f.px(a,\"border\"+l.Left+\"Width\")+f.px(a,\"border\"+l.Right+\"Width\")}if(f.isIE&&(f.hasTag(a,\"BUTTON\")||f.hasTag(a,\"TEXTAREA\")||f.hasTag(a,\"INPUT\")||f.hasTag(a,\"SELECT\")))k=e;if(k> j)if(f.pxself(a,l.size)==0)k=e;else{var m=false;$(a).find(\".Wt-popup\").each(function(){if(this.style.display!==\"none\")m=true});if(m)k=e}d=f.px(a,\"border\"+l.Left+\"Width\")+f.px(a,\"border\"+l.Right+\"Width\");u=j-(e+d)!=0;if(c)return[k,scrollBar];if(f.isGecko&&b==0&&a.getBoundingClientRect().width!=Math.ceil(a.getBoundingClientRect().width))k+=1;if(!f.boxSizing(a)&&!f.isOpera)k+=d;k+=f.px(a,\"margin\"+l.Left)+f.px(a,\"margin\"+l.Right);if(!f.boxSizing(a)&&!f.isIE)k+=f.px(a,\"padding\"+l.Left)+f.px(a,\"padding\"+ l.Right);k+=j-(e+d);if(k0)k=Math.min(a,k);return[Math.round(k),u]}function y(a,b){b=s[b];if(a.style.display===\"none\")return 0;else if(a[\"layoutMin\"+b.Size])return a[\"layoutMin\"+b.Size];else{var c=f.px(a,\"min\"+b.Size);f.boxSizing(a)||(c+=f.px(a,\"padding\"+b.Left)+f.px(a,\"padding\"+b.Right));return c}}function O(a,b){b=s[b];var c=f.px(a,\"margin\"+b.Left)+f.px(a,\"margin\"+b.Right);if(!f.boxSizing(a)&&!(f.isIE&&!f.isIElt9&&f.hasTag(a,\"BUTTON\")))c+=f.px(a,\"border\"+b.Left+ \"Width\")+f.px(a,\"border\"+b.Right+\"Width\")+f.px(a,\"padding\"+b.Left)+f.px(a,\"padding\"+b.Right);return c}function M(a,b){b=s[b];return f.px(a,\"padding\"+b.Left)+f.px(a,\"padding\"+b.Right)}function ga(a,b){if(f.boxSizing(a)){b=s[b];return f.px(a,\"border\"+b.Left+\"Width\")+f.px(a,\"border\"+b.Right+\"Width\")+f.px(a,\"padding\"+b.Left)+f.px(a,\"padding\"+b.Right)}else return 0}function aa(a,b){b=s[b];return Math.round(f.px(a,\"border\"+b.Left+\"Width\")+f.px(a,\"border\"+b.Right+\"Width\")+f.px(a,\"margin\"+b.Left)+f.px(a, \"margin\"+b.Right)+f.px(a,\"padding\"+b.Left)+f.px(a,\"padding\"+b.Right))}function X(a,b,c){a.dirty=Math.max(a.dirty,b);P=true;c&&F.layouts2.scheduleAdjust()}function x(a,b,c){if(a.style[b]!==c){a.style[b]=c;return true}else return false}function ma(a){return a.style.display===\"none\"&&!a.ed||$(a).hasClass(\"Wt-hidden\")}function ua(a,b,c){var e=s[a],i=e.config.length,l=s[a^1].config.length,k=e.measures.slice();if(k.length==5){k[0]=k[0].slice();k[1]=k[1].slice()}if(P){if(c&&typeof e.minSize==\"undefined\"){e.minSize= f.px(c,\"min\"+e.Size);if(e.minSize>0)e.minSize-=ga(c,a)}var u=[],d=[],j=0,m=0,h,G,r=false;for(h=0;h1){var n=$(\"#\"+g.id),v=n.get(0);if(!v){e.setItem(h,G,null);continue}if(v!=g.w){g.w=v;n.find(\"img\").add(n.filter(\"img\")).bind(\"load\",{item:g},function(S){X(S.data.item,1,true)})}}if(!W&&g.w.style.position!=\"absolute\"){g.w.style.position=\"absolute\";g.w.style.visibility=\"hidden\"}if(!g.ps)g.ps=[];if(!g.sc)g.sc= [];if(!g.ms)g.ms=[];if(!g.size)g.size=[];if(!g.psize)g.psize=[];if(!g.fs)g.fs=[];if(!g.margin)g.margin=[];n=!g.set;if(!g.set)g.set=[false,false];if(ma(g.w))g.ps[a]=g.ms[a]=0;else if(g.w){if(f.isIE)g.w.style.visibility=\"\";if(g.dirty){if(g.dirty>1){v=y(g.w,a);g.ms[a]=v}else v=g.ms[a];if(v>t)t=v;if(g.dirty>1)g.margin[a]=O(g.w,a);if(!g.set[a])if(a==0||!n){n=f.pxself(g.w,e.size);g.fs[a]=n?n+g.margin[a]:0}else{n=Math.round(f.px(g.w,e.size));g.fs[a]=n>Math.max(ga(g.w,a),v)?n+g.margin[a]:0}n=g.fs[a];if(g.layout){if(n== 0)n=g.ps[a];g.ps[a]=n}else{if(g.wasLayout){g.wasLayout=false;g.set=[false,false];g.ps=[];g.w.wtResize&&g.w.wtResize(g.w,-1,-1,true);x(g.w,s[1].size,\"\")}v=B(g.w,a,false,b);var H=v[0],ba=g.set[a];if(ba)if(g.psize[a]>8)ba=H>=g.psize[a]-4&&H<=g.psize[a]+4;var ca=typeof g.ps[a]!==\"undefined\"&&e.config[h][0]>0&&g.set[a];n=ba||ca?Math.max(n,g.ps[a]):Math.max(n,H);g.ps[a]=n;g.sc[a]=v[1]}if(!g.span||g.span[a]==1){if(n>p)p=n}else r=true}else if(!g.span||g.span[a]==1){if(g.ps[a]>p)p=g.ps[a];if(g.ms[a]>t)t=g.ms[a]}else r= true;if(!ma(g.w)&&(!g.span||g.span[a]==1))o=false}}}if(o)t=p=-1;else if(t>p)p=t;u[h]=p;d[h]=t;if(t>-1){j+=p;m+=t}}if(r){function ha(S,ia){for(h=0;h1){var da=S(Y),ja=0,ka=0,I;for(I=0;I0)ka+=e.config[h+I][0]}}if(da>=0)if(ja>0){if(ka>0)ja=ka;for(I=0;I0?e.config[h+I][0]:1;if(Q>0){var qa=Math.round(da/Q);da-=qa;ja-=Q;ia[h+I]+= qa}}}}else ia[h]=da}}}ha(function(S){return S.ps[a]},u);ha(function(S){return S.ms[a]},d)}b=0;n=true;r=false;for(h=0;h-1){if(n){b+=e.margins[1];n=false}else{b+=e.margins[0];if(r)b+=4}r=e.config[h][1]!==0}n||(b+=e.margins[2]);j+=b;m+=b;e.measures=[u,d,j,m,b]}if(ea||k[2]!=e.measures[2])ra.updateSizeInParent(a);c&&e.minSize==0&&k[3]!=e.measures[3]&&c.parentNode.className!=\"Wt-domRoot\"&&x(c,\"min\"+e.Size,e.measures[3]+\"px\");c&&a==0&&c&&f.hasTag(c,\"TD\")&&x(c,e.size,e.measures[2]+\"px\")}function va(a, b,c){a=s[a];if(fa)c=-c;if(a.config[b][0]>0&&a.config[b+1][0]==0){++b;c=-c}a.fixedSize[b]=a.sizes[b]+c;F.layouts2.scheduleAdjust()}function wa(a,b,c){var e=b.di,i=s[a],l=s[a^1],k,u=f.getElement(D),d;for(d=e-1;d>=0;--d)if(i.sizes[d]>=0){k=-(i.sizes[d]-i.measures[1][d]);break}e=i.sizes[e]-i.measures[1][e];if(fa){var j=k;k=-e;e=-j}new f.SizeHandle(f,i.resizeDir,f.pxself(b,i.size),f.pxself(b,l.size),k,e,i.resizerClass,function(m){va(a,d,m)},b,u,c,0,0)}function sa(a,b){var c=a.config.length,e;if(a.config[b][1]!== 0)for(e=b+1;e-1)return true;for(e=b-1;e>=0;--e)if(a.measures[1][e]>-1)return a.config[e][1]!==0;return false}function xa(a,b){var c=s[a],e=s[a^1],i=c.measures,l=0,k=false,u=false,d=false,j=la?b.parentNode:null;if(c.maxSize===0)if(j){var m=f.css(j,\"position\");d=a==1&&typeof j.nativeHeight!==\"undefined\";if(m===\"absolute\")l=d?f.parsePx(j.nativeHeight):f.pxself(j,c.size);if(l===0){if(!c.initialized){if(a===0&&(m===\"absolute\"||m===\"fixed\")){j.style.display=\"none\";l=j.clientWidth; j.style.display=\"\"}d||(l=a?j.clientHeight:j.clientWidth);k=true;if(a==0&&l==0&&f.isIElt9){l=j.offsetWidth;k=false}var h;if((f.hasTag(j,\"TD\")||f.hasTag(j,\"TH\")||$(j.parentNode).hasClass(\"Wt-domRoot\"))&&!(f.isIE&&!f.isIElt9)){d=0;h=1}else{d=c.minSize?c.minSize:i[3];h=0}function G(ca,ha){return ca-ha<=1}if(f.isIElt9&&G(l,h)||G(l,d+M(j,a)))c.maxSize=999999}if(l===0&&c.maxSize===0){l=a?j.clientHeight:j.clientWidth;k=true}}}else{l=f.pxself(b,c.size);u=true}else if(c.sizeSet){l=f.pxself(j,c.size);u=true}var r= 0;if(j&&j.wtGetPS&&a==1)r=j.wtGetPS(j,b,a,0);d=i[2];if(d=i[3]-r){r=l-i[4];h=[];var p=[0,0],t=[0,0],o=0;for(d=0;d-1){m=-1;sa(c,d)||(c.fixedSize[d]=undefined);if(typeof c.fixedSize[d]!==\"undefined\"&&(d+1==k||i[1][d+1]>-1))m=c.fixedSize[d];else if(sa(c,d)&&c.config[d][1]!==0&&c.config[d][1][0]>=0){m=c.config[d][1][0];if(c.config[d][1][1])m=(l-i[4])*m/100}if(m>=0){h[d]=-1;j[d]=m;r-=j[d]}else{if(c.config[d][0]>0){m=1;h[d]=c.config[d][0];o+=h[d]}else{m=0;h[d]=0}p[m]+=i[1][d];t[m]+=i[0][d];j[d]=i[0][d]}}else{h[d]= -2;j[d]=-1}if(c.fixedSize.length>k)c.fixedSize.length=k;if(o==0){for(d=0;dt[0]+p[1]){r-=t[0];if(r>t[1]){if(c.fitSize){r-=t[1];r=r/o;for(d=0;d0){j[d]+=Math.round(h[d]*r);c.stretched[d]=true}}}else{m=1;if(r0?(r-p[m])/(t[m]-p[m]):0;for(d=0;d0){p=i[0][d]-i[1][d];j[d]=i[1][d]+Math.round(p*r)}}}else{for(d=0;d0)j[d]=i[1][d];r-=p[1];m=0;if(r0? (r-p[m])/(t[m]-p[m]):0;for(d=0;d-1){var g=p;if(p){p=D+\"-rs\"+a+\"-\"+d;h=f.getElement(p);if(!h){c.resizeHandles[d]=p;h=document.createElement(\"div\");h.setAttribute(\"id\",p);h.di=d;h.style.position=\"absolute\";h.style[e.left]=e.margins[1]+\"px\";h.style[c.size]=c.margins[0]+\"px\";if(e.cSize)h.style[e.size]=e.cSize-e.margins[2]-e.margins[1]+\"px\";h.className=c.handleClass; b.insertBefore(h,b.firstChild);h.onmousedown=h.ontouchstart=function(ca){wa(a,this,ca||window.event)}}i+=2;x(h,c.left,i+\"px\");i+=2}else if(c.resizeHandles[d]){h=f.getElement(c.resizeHandles[d]);h.parentNode.removeChild(h);c.resizeHandles[d]=undefined}p=c.config[d][1]!==0;if(r)r=false;else i+=c.margins[0]}else if(c.resizeHandles[d]){h=f.getElement(c.resizeHandles[d]);h.parentNode.removeChild(h);c.resizeHandles[d]=undefined}for(t=0;t=j.length)break;if(v)m+=4;v=c.config[d+n][1]!==0;if(j[d+n-1]>-1&&j[d+n]>-1)m+=c.margins[0];m+=j[d+n]}}var H;x(h,\"visibility\",\"\");v=o.align>>c.alignBits&15;n=o.ps[a];if(m=n&&o.set[a]){x(h,c.size,n+\"px\")&&X(o,1);o.set[a]=false}o.size[a]=n;o.psize[a]=n}else{H=o.margin[a];v=Math.max(0,m-H);var ba=a==0&& o.sc[a];if(!ma(h)&&(ba||m!=n||o.layout)){if(x(h,c.size,v+\"px\")){X(o,1);o.set[a]=true}}else if(o.fs[a])a==0&&x(h,c.size,o.fs[a]-H+\"px\");else{x(h,c.size,\"\")&&X(o,1);if(o.set)o.set[a]=false}H=i;o.size[a]=v;o.psize[a]=m}if(W)if(g){x(h,c.left,\"4px\");m=f.css(h,\"position\");if(m!==\"absolute\")h.style.position=\"relative\"}else x(h,c.left,\"0px\");else x(h,c.left,H+\"px\");if(a==1){if(h.wtResize)h.wtResize(h,o.set[0]?Math.round(o.size[0]):-1,o.set[1]?Math.round(o.size[1]):-1,true);o.dirty=0}}if(j[d]>-1)i+=j[d]}if(c.resizeHandles.length> k){for(g=k;g0)b=Math.min(c.maxSize,b);if(pa){c=f.getElement(D);if(!c)return;for(var e=c,i=e.parentNode;;){if(i.wtGetPS)b= i.wtGetPS(i,e,a,b);b+=aa(i,a);if(i==J)break;if(a==1&&i==c.parentNode&&!i.lh&&i.offsetHeight>b)b=i.offsetHeight;e=i;i=e.parentNode}}else b+=T[a];N.setChildSize(J,a,b)}};this.setConfig=function(a){var b=C;C=a;s[0].config=C.cols;s[1].config=C.rows;s[0].stretched=[];s[1].stretched=[];var c;a=0;for(c=b.items.length;a>i.alignBits&15||!i.stretched[e]){if(!a.ps)a.ps=[];a.ps[b]=c}a.layout=true;X(a,1)}};this.measure=function(a){var b=f.getElement(D);if(b)if(!f.isHidden(b)){ta||na();if(P||ea)ua(a,b,la?b.parentNode:null);if(a==1)P=ea=false}};this.setMaxSize=function(a,b){s[0].maxSize=a;s[1].maxSize=b};this.apply=function(a){var b=f.getElement(D); if(!b)return false;if(f.isHidden(b))return true;xa(a,b);return true};this.contains=function(a){var b=f.getElement(D);a=f.getElement(a.getId());return b&&a?f.contains(b,a):false};this.WT=f}"); + "function(G,C,J,V,W,X,ca,p,D,x,y){function u(a){var b,c;b=0;for(c=B.items.length;be.clientWidth||m+f==e.clientWidth&&h.isGecko&&e.parentNode.parentNode.style.visibility===\"hidden\"){s=a.style[n.left];v(a,n.left,\"-1000000px\");m=b?a.scrollHeight: a.scrollWidth}}e=b?a.clientHeight:a.clientWidth;if(h.isGecko&&!a.style[n.size]&&b==0&&i(h.css(a,\"overflow\"))){d=a.style[n.size];v(a,n.size,\"\")}f=b?a.offsetHeight:a.offsetWidth;s&&v(a,n.left,s);d&&v(a,n.size,d);if(e>=1E6)e-=1E6;if(m>=1E6)m-=1E6;if(f>=1E6)f-=1E6;if(m===0){m=h.pxself(a,n.size);if(m!==0&&!h.isOpera&&!h.isGecko)m-=h.px(a,\"border\"+n.Left+\"Width\")+h.px(a,\"border\"+n.Right+\"Width\")}if(h.isIE&&(h.hasTag(a,\"BUTTON\")||h.hasTag(a,\"TEXTAREA\")||h.hasTag(a,\"INPUT\")||h.hasTag(a,\"SELECT\")))m=e;if(m> f)if(h.pxself(a,n.size)==0)m=e;else{var l=false;$(a).find(\".Wt-popup\").each(function(){if(this.style.display!==\"none\")l=true});if(l)m=e}d=h.px(a,\"border\"+n.Left+\"Width\")+h.px(a,\"border\"+n.Right+\"Width\");s=f-(e+d)!=0;if(c)return[m,scrollBar];if(h.isGecko&&b==0&&a.getBoundingClientRect().width!=Math.ceil(a.getBoundingClientRect().width))m+=1;if(!h.boxSizing(a)&&!h.isOpera)m+=d;m+=h.px(a,\"margin\"+n.Left)+h.px(a,\"margin\"+n.Right);if(!h.boxSizing(a)&&!h.isIE)m+=h.px(a,\"padding\"+n.Left)+h.px(a,\"padding\"+ n.Right);m+=f-(e+d);if(m0)m=Math.min(a,m);return[Math.round(m),s]}function w(a,b){b=q[b];if(a.style.display===\"none\")return 0;else if(a[\"layoutMin\"+b.Size])return a[\"layoutMin\"+b.Size];else{var c=h.px(a,\"min\"+b.Size);h.boxSizing(a)||(c+=h.px(a,\"padding\"+b.Left)+h.px(a,\"padding\"+b.Right));return c}}function O(a,b){b=q[b];var c=h.px(a,\"margin\"+b.Left)+h.px(a,\"margin\"+b.Right);if(!h.boxSizing(a)&&!(h.isIE&&!h.isIElt9&&h.hasTag(a,\"BUTTON\")))c+=h.px(a,\"border\"+b.Left+ \"Width\")+h.px(a,\"border\"+b.Right+\"Width\")+h.px(a,\"padding\"+b.Left)+h.px(a,\"padding\"+b.Right);return c}function K(a,b){b=q[b];return h.px(a,\"padding\"+b.Left)+h.px(a,\"padding\"+b.Right)}function ha(a,b){if(h.boxSizing(a)){b=q[b];return h.px(a,\"border\"+b.Left+\"Width\")+h.px(a,\"border\"+b.Right+\"Width\")+h.px(a,\"padding\"+b.Left)+h.px(a,\"padding\"+b.Right)}else return 0}function da(a,b){b=q[b];return Math.round(h.px(a,\"border\"+b.Left+\"Width\")+h.px(a,\"border\"+b.Right+\"Width\")+h.px(a,\"margin\"+b.Left)+h.px(a, \"margin\"+b.Right)+h.px(a,\"padding\"+b.Left)+h.px(a,\"padding\"+b.Right))}function Y(a,b,c){a.dirty=Math.max(a.dirty,b);P=true;c&&G.layouts2.scheduleAdjust()}function v(a,b,c){if(a.style[b]!==c){a.style[b]=c;return true}else return false}function ma(a){return a.style.display===\"none\"&&!a.ed||$(a).hasClass(\"Wt-hidden\")}function ua(a,b,c){var e=q[a],i=e.config.length,n=q[a^1].config.length,m=e.measures.slice();if(m.length==5){m[0]=m[0].slice();m[1]=m[1].slice()}if(P){if(c&&typeof e.minSize==\"undefined\"){e.minSize= h.px(c,\"min\"+e.Size);if(e.minSize>0)e.minSize-=ha(c,a)}var s=[],d=[],f,l,j=false;for(f=0;f1){var k=$(\"#\"+g.id),z=k.get(0);if(!z){e.setItem(f,l,null);continue}if(z!=g.w){g.w=z;k.find(\"img\").add(k.filter(\"img\")).bind(\"load\",{item:g},function(T){Y(T.data.item,1,true)})}}if(!X&&g.w.style.position!=\"absolute\"){g.w.style.position=\"absolute\";g.w.style.visibility=\"hidden\"}if(!g.ps)g.ps=[];if(!g.sc)g.sc= [];if(!g.ms)g.ms=[];if(!g.size)g.size=[];if(!g.psize)g.psize=[];if(!g.fs)g.fs=[];if(!g.margin)g.margin=[];k=!g.set;if(!g.set)g.set=[false,false];if(ma(g.w))g.ps[a]=g.ms[a]=0;else if(g.w){if(h.isIE)g.w.style.visibility=\"\";if(g.dirty){if(g.dirty>1){z=w(g.w,a);g.ms[a]=z}else z=g.ms[a];if(g.dirty>1)g.margin[a]=O(g.w,a);if(!g.set[a])if(a==0||!k){k=h.pxself(g.w,e.size);g.fs[a]=k?k+g.margin[a]:0}else{k=Math.round(h.px(g.w,e.size));g.fs[a]=k>Math.max(ha(g.w,a),z)?k+g.margin[a]:0}k=g.fs[a];if(g.layout){if(k== 0)k=g.ps[a];g.ps[a]=k}else{if(g.wasLayout){g.wasLayout=false;g.set=[false,false];g.ps=[];g.w.wtResize&&g.w.wtResize(g.w,-1,-1,true);v(g.w,q[1].size,\"\")}z=A(g.w,a,false,b);var t=z[0],E=g.set[a];if(E)if(g.psize[a]>8)E=t>=g.psize[a]-4&&t<=g.psize[a]+4;var M=typeof g.ps[a]!==\"undefined\"&&e.config[f][0]>0&&g.set[a];k=E||M?Math.max(k,g.ps[a]):Math.max(k,t);g.ps[a]=k;g.sc[a]=z[1]}if(!g.span||g.span[a]==1){if(k>H)H=k}else j=true}else if(!g.span||g.span[a]==1){if(g.ps[a]>H)H=g.ps[a];if(g.ms[a]>o)o=g.ms[a]}else j= true;if(!ma(g.w)&&(!g.span||g.span[a]==1))r=false}}}if(r)o=H=-1;else if(o>H)H=o;s[f]=H;d[f]=o;if(o>-1){Q+=H;Z+=o}}if(j){function ia(T,ja){for(f=0;f1){var ba=T(aa),ea=0,ka=0,F;for(F=0;F0)ka+=e.config[f+F][0];if(F!=0)ba-=e.margins[0]}}if(ba>=0)if(ea>0){if(ka>0)ea=ka;for(F=0;F0?e.config[f+F][0]:1;if(S>0){var qa=Math.round(ba* (S/ea));ba-=qa;ea-=S;ja[f+F]+=qa}}}}else ja[f]=ba}}}ia(function(T){return T.ps[a]},s);ia(function(T){return T.ms[a]},d)}var Q=0,Z=0;for(f=0;fs[f])s[f]=d[f];if(d[f]>-1){Q+=s[f];Z+=d[f]}}b=0;k=true;j=false;for(f=0;f-1){if(k){b+=e.margins[1];k=false}else{b+=e.margins[0];if(j)b+=4}j=e.config[f][1]!==0}k||(b+=e.margins[2]);Q+=b;Z+=b;e.measures=[s,d,Q,Z,b]}if(fa||m[2]!=e.measures[2])ra.updateSizeInParent(a);c&&e.minSize==0&&m[3]!=e.measures[3]&&c.parentNode.className!=\"Wt-domRoot\"&& v(c,\"min\"+e.Size,e.measures[3]+\"px\");c&&a==0&&c&&h.hasTag(c,\"TD\")&&v(c,e.size,e.measures[2]+\"px\")}function va(a,b,c){a=q[a];if(ga)c=-c;if(a.config[b][0]>0&&a.config[b+1][0]==0){++b;c=-c}a.fixedSize[b]=a.sizes[b]+c;G.layouts2.scheduleAdjust()}function wa(a,b,c){var e=b.di,i=q[a],n=q[a^1],m,s=h.getElement(C),d;for(d=e-1;d>=0;--d)if(i.sizes[d]>=0){m=-(i.sizes[d]-i.measures[1][d]);break}e=i.sizes[e]-i.measures[1][e];if(ga){var f=m;m=-e;e=-f}new h.SizeHandle(h,i.resizeDir,h.pxself(b,i.size),h.pxself(b, n.size),m,e,i.resizerClass,function(l){va(a,d,l)},b,s,c,0,0)}function sa(a,b){var c=a.config.length,e;if(a.config[b][1]!==0)for(e=b+1;e-1)return true;for(e=b-1;e>=0;--e)if(a.measures[1][e]>-1)return a.config[e][1]!==0;return false}function xa(a,b){var c=q[a],e=q[a^1],i=c.measures,n=0,m=false,s=false,d=false,f=la?b.parentNode:null;if(c.maxSize===0)if(f){var l=h.css(f,\"position\");d=a==1&&typeof f.nativeHeight!==\"undefined\";if(l===\"absolute\")n=d?h.parsePx(f.nativeHeight):h.pxself(f, c.size);if(n===0){if(!c.initialized){if(a===0&&(l===\"absolute\"||l===\"fixed\")){f.style.display=\"none\";n=f.clientWidth;f.style.display=\"\"}d||(n=a?f.clientHeight:f.clientWidth);m=true;if(a==0&&n==0&&h.isIElt9){n=f.offsetWidth;m=false}var j;if((h.hasTag(f,\"TD\")||h.hasTag(f,\"TH\")||$(f.parentNode).hasClass(\"Wt-domRoot\"))&&!(h.isIE&&!h.isIElt9)){d=0;j=1}else{d=c.minSize?c.minSize:i[3];j=0}function H(Q,Z){return Q-Z<=1}if(h.isIElt9&&H(n,j)||H(n,d+K(f,a)))c.maxSize=999999}if(n===0&&c.maxSize===0){n=a?f.clientHeight: f.clientWidth;m=true}}}else{n=h.pxself(b,c.size);s=true}else if(c.sizeSet){n=h.pxself(f,c.size);s=true}var o=0;if(f&&f.wtGetPS&&a==1)o=f.wtGetPS(f,b,a,0);d=i[2];if(d=i[3]-o){o=n-i[4];j=[];var r=[0,0],g=[0,0],k=0;for(d=0;d-1){l=-1;sa(c,d)||(c.fixedSize[d]=undefined);if(typeof c.fixedSize[d]!==\"undefined\"&&(d+1==m||i[1][d+1]>-1))l=c.fixedSize[d];else if(sa(c,d)&&c.config[d][1]!==0&&c.config[d][1][0]>=0){l=c.config[d][1][0];if(c.config[d][1][1])l=(n-i[4])*l/100}if(l>=0){j[d]=-1;f[d]=l;o-=f[d]}else{if(c.config[d][0]> 0){l=1;j[d]=c.config[d][0];k+=j[d]}else{l=0;j[d]=0}r[l]+=i[1][d];g[l]+=i[0][d];f[d]=i[0][d]}}else{j[d]=-2;f[d]=-1}if(c.fixedSize.length>m)c.fixedSize.length=m;if(k==0){for(d=0;dg[0]+r[1]){o-=g[0];if(o>g[1]){if(c.fitSize){o-=g[1];o=o/k;for(d=0;d0){f[d]+=Math.round(j[d]*o);c.stretched[d]=true}}}else{l=1;if(o0?(o-r[l])/(g[l]-r[l]):0;for(d=0;d0){r=i[0][d]-i[1][d];f[d]=i[1][d]+Math.round(r* o)}}}else{for(d=0;d0)f[d]=i[1][d];o-=r[1];l=0;if(o0?(o-r[l])/(g[l]-r[l]):0;for(d=0;d-1){var z=r;if(r){r=C+\"-rs\"+a+\"-\"+d;j=h.getElement(r);if(!j){c.resizeHandles[d]=r;j=document.createElement(\"div\");j.setAttribute(\"id\",r);j.di=d;j.style.position=\"absolute\";j.style[e.left]=e.margins[1]+\"px\";j.style[c.size]=c.margins[0]+ \"px\";if(e.cSize)j.style[e.size]=e.cSize-e.margins[2]-e.margins[1]+\"px\";j.className=c.handleClass;b.insertBefore(j,b.firstChild);j.onmousedown=j.ontouchstart=function(Q){wa(a,this,Q||window.event)}}i+=2;v(j,c.left,i+\"px\");i+=2}else if(c.resizeHandles[d]){j=h.getElement(c.resizeHandles[d]);j.parentNode.removeChild(j);c.resizeHandles[d]=undefined}r=c.config[d][1]!==0;if(o)o=false;else i+=c.margins[0]}else if(c.resizeHandles[d]){j=h.getElement(c.resizeHandles[d]);j.parentNode.removeChild(j);c.resizeHandles[d]= undefined}for(g=0;g=f.length)break;if(E)l+=4;E=c.config[d+t][1]!==0;if(f[d+t-1]>-1&&f[d+t]>-1)l+=c.margins[0];l+=f[d+t]}}var M;v(j,\"visibility\",\"\");E=k.align>>c.alignBits&15;t=k.ps[a];if(l=t&&k.set[a]){v(j,c.size,t+\"px\")&& Y(k,1);k.set[a]=false}k.size[a]=t;k.psize[a]=t}else{M=k.margin[a];E=Math.max(0,l-M);var ia=a==0&&k.sc[a];if(!ma(j)&&(ia||l!=t||k.layout)){if(v(j,c.size,E+\"px\")){Y(k,1);k.set[a]=true}}else if(k.fs[a])a==0&&v(j,c.size,k.fs[a]-M+\"px\");else{v(j,c.size,\"\")&&Y(k,1);if(k.set)k.set[a]=false}M=i;k.size[a]=E;k.psize[a]=l}if(X)if(z){v(j,c.left,\"4px\");l=h.css(j,\"position\");if(l!==\"absolute\")j.style.position=\"relative\"}else v(j,c.left,\"0px\");else v(j,c.left,M+\"px\");if(a==1){if(j.wtResize)j.wtResize(j,k.set[0]? Math.round(k.size[0]):-1,k.set[1]?Math.round(k.size[1]):-1,true);k.dirty=0}}if(f[d]>-1)i+=f[d]}if(c.resizeHandles.length>m){for(z=m;z0)b=Math.min(c.maxSize,b);if(pa){c=h.getElement(C);if(!c)return;for(var e=c,i=e.parentNode;;){if(i.wtGetPS)b=i.wtGetPS(i,e,a,b);b+=da(i,a);if(i==I)break;if(a==1&&i==c.parentNode&&!i.lh&&i.offsetHeight>b)b=i.offsetHeight;e=i;i=e.parentNode}}else b+=U[a];N.setChildSize(I,a,b)}};this.setConfig=function(a){var b=B;B=a;q[0].config=B.cols;q[1].config=B.rows;q[0].stretched=[];q[1].stretched=[];var c;a=0;for(c=b.items.length;a>i.alignBits&15||!i.stretched[e]){if(!a.ps)a.ps=[];a.ps[b]=c}a.layout=true;Y(a,1)}};this.measure=function(a){var b=h.getElement(C);if(b)if(!h.isHidden(b)){ta||na();if(P||fa)ua(a, b,la?b.parentNode:null);if(a==1)P=fa=false}};this.setMaxSize=function(a,b){q[0].maxSize=a;q[1].maxSize=b};this.apply=function(a){var b=h.getElement(C);if(!b)return false;if(h.isHidden(b))return true;xa(a,b);return true};this.contains=function(a){var b=h.getElement(C);a=h.getElement(a.getId());return b&&a?h.contains(b,a):false};this.WT=h}"); } static WJavaScriptPreamble appjs1() { @@ -722,7 +722,7 @@ static WJavaScriptPreamble appjs1() { JavaScriptScope.ApplicationScope, JavaScriptObjectType.JavaScriptObject, "layouts2", - "new (function(){var F=[],D=false,K=this,U=false;this.find=function(q){return(q=document.getElementById(q))?jQuery.data(q,\"layout\"):null};this.setDirty=function(q){if(q=this.find(q)){q.setDirty();K.scheduleAdjust()}};this.setElementDirty=function(q){var E=q;for(q=q.parentNode;q&&q!=document.body;){var z=jQuery.data(q,\"layout\");z&&z.setElDirty(E);E=q;q=q.parentNode}};this.setChildLayoutsDirty=function(q,E){var z,A;z=0;for(A=q.descendants.length;z< A;++z){var w=q.descendants[z];if(E){var B=q.WT.getElement(w.getId());if(B&&!q.WT.contains(E,B))continue}w.setDirty()}};this.add=function(q){function E(z,A){var w,B;w=0;for(B=z.length;w=6)){V=true;setTimeout(function(){K.adjust()},0)}}};this.adjust=function(q,E){function z(w,B){var y,O;y=0;for(O=w.length;y=6)){W=true;setTimeout(function(){J.adjust()},0)}}};this.adjust=function(p,D){function x(u,A){var w,O;w=0;for(O=u.length;w(this.impl_, "columnResized") { }; @@ -2258,6 +2260,11 @@ public void trigger(WMouseEvent event) { * or editing behaviour. */ void handleClick(final WModelIndex index, final WMouseEvent event) { + if (this.dragEnabled_ && (this.delayedClearAndSelectIndex_ != null) + && event.getDragDelta().x < 4 && event.getDragDelta().y < 4) { + this.select(this.delayedClearAndSelectIndex_, + SelectionFlag.ClearAndSelect); + } boolean doEdit = (index != null) && !EnumUtils.mask(this.getEditTriggers(), WAbstractItemView.EditTrigger.SingleClicked).isEmpty(); @@ -2298,6 +2305,7 @@ void handleMouseDown(final WModelIndex index, final WMouseEvent event) { && !EnumUtils.mask(this.getEditTriggers(), WAbstractItemView.EditTrigger.SelectedClicked) .isEmpty() && this.isSelected(index); + this.delayedClearAndSelectIndex_ = null; if ((index != null)) { this.selectionHandleClick(index, event.getModifiers()); } @@ -2552,6 +2560,7 @@ public Editor() { private int rowHeaderCount_; private WString computedDragMimeType_; private boolean sortEnabled_; + private WModelIndex delayedClearAndSelectIndex_; private JSignal2 columnWidthChanged_; private Signal2 columnResized_; private WCssTemplateRule headerHeightRule_; @@ -2648,8 +2657,14 @@ private void selectionHandleClick(final WModelIndex index, modifiers, EnumSet.of(KeyboardModifier.ControlModifier, KeyboardModifier.MetaModifier)).isEmpty()) { - if (!this.isSelected(index)) { + if (!this.dragEnabled_) { this.select(index, SelectionFlag.ClearAndSelect); + } else { + if (!this.isSelected(index)) { + this.select(index, SelectionFlag.ClearAndSelect); + } else { + this.delayedClearAndSelectIndex_ = index; + } } } else { this.select(index, SelectionFlag.ToggleSelect); diff --git a/src/eu/webtoolkit/jwt/WAbstractToggleButton.java b/src/eu/webtoolkit/jwt/WAbstractToggleButton.java index b9b38650..946c2951 100644 --- a/src/eu/webtoolkit/jwt/WAbstractToggleButton.java +++ b/src/eu/webtoolkit/jwt/WAbstractToggleButton.java @@ -104,7 +104,13 @@ public void setText(final CharSequence text) { if (canOptimizeUpdates() && text.equals(this.text_.text)) { return; } + if (this.isRendered() && this.flags_.get(BIT_NAKED)) { + logger.error(new StringWriter() + .append("setText() has no effect when already rendered as a naked checkbox (without label)") + .toString()); + } this.text_.setText(text); + this.flags_.clear(BIT_NAKED); this.flags_.set(BIT_TEXT_CHANGED); this.repaint(EnumSet.of(RepaintFlag.RepaintSizeAffected)); } diff --git a/src/eu/webtoolkit/jwt/WBorderLayout.java b/src/eu/webtoolkit/jwt/WBorderLayout.java index efdb9efb..f2ea5e29 100644 --- a/src/eu/webtoolkit/jwt/WBorderLayout.java +++ b/src/eu/webtoolkit/jwt/WBorderLayout.java @@ -87,21 +87,21 @@ public WBorderLayout(WWidget parent) { this.grid_ = new Grid(); { int insertPos = 0; - for (int ii = 0; ii < 3; ++ii) + for (int ii = 0; ii < (3); ++ii) this.grid_.columns_.add(insertPos + ii, new Grid.Section(0)); } ; this.grid_.columns_.get(1).stretch_ = 1; { int insertPos = 0; - for (int ii = 0; ii < 3; ++ii) + for (int ii = 0; ii < (3); ++ii) this.grid_.rows_.add(insertPos + ii, new Grid.Section(0)); } ; this.grid_.rows_.get(1).stretch_ = 1; { int insertPos = 0; - for (int ii = 0; ii < 3; ++ii) + for (int ii = 0; ii < (3); ++ii) this.grid_.items_.add(insertPos + ii, new ArrayList()); } @@ -110,7 +110,7 @@ public WBorderLayout(WWidget parent) { final List items = this.grid_.items_.get(i); { int insertPos = 0; - for (int ii = 0; ii < 3; ++ii) + for (int ii = 0; ii < (3); ++ii) items.add(insertPos + ii, new Grid.Item()); } ; diff --git a/src/eu/webtoolkit/jwt/WCanvasPaintDevice.java b/src/eu/webtoolkit/jwt/WCanvasPaintDevice.java index fab0bcab..10a45cb4 100644 --- a/src/eu/webtoolkit/jwt/WCanvasPaintDevice.java +++ b/src/eu/webtoolkit/jwt/WCanvasPaintDevice.java @@ -861,7 +861,11 @@ && fequal(f.getM22(), this.currentNoBrush_ = this.getPainter().getBrush().getStyle() == BrushStyle.NoBrush; if (penChanged) { if (penColorChanged) { + PenCapStyle capStyle = this.currentPen_.getCapStyle(); + PenJoinStyle joinStyle = this.currentPen_.getJoinStyle(); WPen tmpPen = new WPen(); + tmpPen.setCapStyle(capStyle); + tmpPen.setJoinStyle(joinStyle); tmpPen.setColor(this.getPainter().getPen().getColor()); tmpPen.setGradient(this.getPainter().getPen().getGradient()); this.currentPen_ = tmpPen; diff --git a/src/eu/webtoolkit/jwt/WColor.java b/src/eu/webtoolkit/jwt/WColor.java index 903fdc43..8f195f4b 100644 --- a/src/eu/webtoolkit/jwt/WColor.java +++ b/src/eu/webtoolkit/jwt/WColor.java @@ -316,6 +316,66 @@ public final String getCssText() { return getCssText(false); } + public final void toHSL(double[] hsl) { + assert hsl.length == 3; + double h = 0.0, s = 0.0, l = 0.0; + double r = getRed() / 255.0; + double g = getGreen() / 255.0; + double b = getBlue() / 255.0; + double cmax = Math.max(r, Math.max(g, b)); + double cmin = Math.min(r, Math.min(g, b)); + double delta = cmax - cmin; + l = (cmax + cmin) / 2.0; + s = delta == 0 ? 0 : delta / (1.0 - Math.abs(2.0 * l - 1.0)); + if (delta == 0) { + h = 0; + } else if (cmax == r) { + if (g >= b) { + h = 60.0 * (g - b) / delta; + } else { + h = 60.0 * ((g - b) / delta + 6.0); + } + } else if (cmax == g) { + h = 60.0 * ((b - r) / delta + 2.0); + } else if (cmax == b) { + h = 60.0 * ((r - g) / delta + 4.0); + } + hsl[0] = h; hsl[1] = s; hsl[2] = l; + } + + public static WColor fromHSL(double h, double s, double l, int alpha) { + double c = (1.0 - Math.abs(2.0 * l - 1.0)) * s; + double x = c * (1.0 - Math.abs((h / 60.0) % 2.0 - 1.0)); + double m = l - c/2.0; + double r, g, b; + if (0.0 <= h && h < 60.0) { + r = c; + g = x; + b = 0; + } else if (60.0 <= h && h < 120.0) { + r = x; + g = c; + b = 0; + } else if (120.0 <= h && h < 180.0) { + r = 0; + g = c; + b = x; + } else if (180.0 <= h && h < 240.0) { + r = 0; + g = x; + b = c; + } else if (240.0 <= h && h < 300.0) { + r = x; + g = 0; + b = c; + } else /* 300 <= h < 360 */ { + r = c; + g = 0; + b = x; + } + return new WColor((int)((r + m) * 255), (int)((g + m) * 255), (int)((b + m) * 255), alpha); + } + private boolean default_; private int red_; private int green_; diff --git a/src/eu/webtoolkit/jwt/WDate.java b/src/eu/webtoolkit/jwt/WDate.java index 84a7835e..59789216 100644 --- a/src/eu/webtoolkit/jwt/WDate.java +++ b/src/eu/webtoolkit/jwt/WDate.java @@ -9,7 +9,6 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import java.util.GregorianCalendar; import java.util.TimeZone; /** @@ -31,7 +30,8 @@ */ public class WDate implements Comparable { static private TimeZone timeZone = null; - + private Date d; + static class RegExpInfo { public String regexp; public String yearGetJS; @@ -57,8 +57,6 @@ static Day fromInt(int day) { } } - private Date d; - /** * Sets default timezone * @@ -215,9 +213,22 @@ public void setTime(int hour, int minute) { this.setTime(hour, minute, 0, 0); } + /** + * Sets this date's time by WTime + * + * When the new date is invalid, an IllegalArgumentException is thrown. + */ public void setTime(WTime time){ this.setTime(time.getHour(), time.getMinute(), time.getSecond(), time.getMsec()); } + + /** + * Gets this date's time + * @return WTime object + */ + public WTime getTime(){ + return new WTime(this.getHour(), this.getMinute(), this.getSecond(), this.getMillisecond()); + } /** * Adds seconds. @@ -524,11 +535,6 @@ public static WDate getCurrentServerDate() { return new WDate(createCalendar().getTime()); } - static boolean isLeapYear(int year) { - GregorianCalendar c = new GregorianCalendar(); - return c.isLeapYear(year); - } - /** * Returns the short day name. * diff --git a/src/eu/webtoolkit/jwt/WFileUpload.java b/src/eu/webtoolkit/jwt/WFileUpload.java index db41cf82..5f1c4787 100644 --- a/src/eu/webtoolkit/jwt/WFileUpload.java +++ b/src/eu/webtoolkit/jwt/WFileUpload.java @@ -499,14 +499,14 @@ void updateDom(final DomElement element, boolean all) { element.setAttribute("action", this.fileUploadTarget_.generateUrl()); String maxFileSize = String.valueOf(WApplication.getInstance() .getMaximumRequestSize()); - String command = "{var x = Wt3_3_5.$('in" + String command = "{var submit = false; var x = Wt3_3_5.$('in" + this.getId() + "'); if (x.files != null) { for (var i = 0; i < x.files.length; i++) { var f = x.files[i]; if(f.size < " - + maxFileSize + ") { " + this.getJsRef() - + ".submit(); } else { " + + maxFileSize + + ") { submit = true; } else { submit = false; " + this.fileTooLarge().createCall("f.size") - + " } } } else " + this.getJsRef() - + ".submit(); };"; + + "; break; } } } else submit = true; if (submit) " + + this.getJsRef() + ".submit(); };"; element.callJavaScript(command); this.flags_.clear(BIT_DO_UPLOAD); if (containsProgress) { @@ -586,18 +586,19 @@ protected DomElement createDomElement(WApplication app) { this.updateSignalConnection(input, change, "change", true); } form.addChild(input); - StringWriter s = new StringWriter(); this.doJavaScript("var a" + this.getId() + "=" + this.getJsRef() + ".action;var f = function(event) {if (a" + this.getId() - + ".indexOf(event.origin) === 0) {var data = JSON.parse(event.data);if (data.fu == '" + + ".indexOf(event.origin) === 0) {var data = JSON.parse(event.data);if (data.type === 'upload') {if (data.fu == '" + this.getId() + "')" + app.getJavaScriptClass() - + "._p_.update(null, data.signal, null, true);}};if (window.addEventListener) window.addEventListener('message', f, false);else window.attachEvent('onmessage', f);"); + + "._p_.update(null, data.signal, null, true);} else if (data.type === 'file_too_large')" + + this.fileTooLarge().createCall("data.fileTooLargeSize") + + "}};if (window.addEventListener) window.addEventListener('message', f, false);else window.attachEvent('onmessage', f);"); } else { result.setAttribute("type", "file"); if (this.flags_.get(BIT_MULTIPLE)) { diff --git a/src/eu/webtoolkit/jwt/WFileUploadResource.java b/src/eu/webtoolkit/jwt/WFileUploadResource.java index 4ba29d3b..437e3213 100644 --- a/src/eu/webtoolkit/jwt/WFileUploadResource.java +++ b/src/eu/webtoolkit/jwt/WFileUploadResource.java @@ -45,12 +45,12 @@ protected void handleRequest(final WebRequest request, Writer o = response.out(); o.append("\n