raimund@2479: package de.intevation.flys.client.client.ui.chart; raimund@2479: christian@4568: import com.google.gwt.core.client.GWT; christian@4568: import com.google.gwt.i18n.client.DateTimeFormat; christian@4568: import com.google.gwt.i18n.client.NumberFormat; raimund@2479: import com.google.gwt.json.client.JSONArray; raimund@2479: import com.google.gwt.json.client.JSONBoolean; raimund@2479: import com.google.gwt.json.client.JSONNumber; raimund@2479: import com.google.gwt.json.client.JSONParser; raimund@2479: import com.google.gwt.json.client.JSONString; raimund@2479: christian@4568: import com.smartgwt.client.types.Alignment; christian@4568: import com.smartgwt.client.types.ListGridFieldType; raimund@2479: import com.smartgwt.client.util.SC; christian@4568: import com.smartgwt.client.widgets.Button; raimund@2479: import com.smartgwt.client.widgets.IButton; christian@4568: import com.smartgwt.client.widgets.events.ClickEvent; christian@4568: import com.smartgwt.client.widgets.events.ClickHandler; christian@4568: import com.smartgwt.client.widgets.grid.CellEditValueFormatter; christian@4568: import com.smartgwt.client.widgets.grid.CellEditValueParser; christian@4568: import com.smartgwt.client.widgets.grid.CellFormatter; raimund@2479: import com.smartgwt.client.widgets.grid.ListGrid; raimund@2479: import com.smartgwt.client.widgets.grid.ListGridField; raimund@2479: import com.smartgwt.client.widgets.grid.ListGridRecord; raimund@2479: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; raimund@2479: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; christian@4568: import com.smartgwt.client.widgets.layout.HLayout; christian@4568: import com.smartgwt.client.widgets.layout.VLayout; raimund@2479: christian@4568: import de.intevation.flys.client.client.event.RedrawRequestHandler; raimund@2479: import de.intevation.flys.client.shared.model.Collection; raimund@2479: import de.intevation.flys.client.shared.model.CollectionItem; raimund@2479: import de.intevation.flys.client.shared.model.Property; raimund@2479: import de.intevation.flys.client.shared.model.PropertyGroup; christian@4568: import de.intevation.flys.client.shared.model.Settings; raimund@2479: import de.intevation.flys.client.shared.model.StringProperty; raimund@2479: christian@4568: import java.util.Date; christian@4568: import java.util.List; raimund@2479: raimund@2479: /** raimund@2479: * UI to enter point data and save it to an PointArtifact. raimund@2479: */ raimund@2479: public class ManualDatePointsEditor raimund@2479: extends ManualPointsEditor raimund@2479: { raimund@2479: raimund@2479: public ManualDatePointsEditor(Collection collection, raimund@2479: RedrawRequestHandler handler, String outputModeName raimund@2479: ) { raimund@2479: super (collection, handler, outputModeName); raimund@2479: } raimund@2479: raimund@2479: raimund@2479: /** Create and setup/add the ui. */ christian@4568: @Override raimund@2479: public void createUI() { raimund@2479: Button accept = new Button(MSG.label_ok()); raimund@2479: Button cancel = new Button(MSG.label_cancel()); raimund@2479: cancel.addClickHandler(this); raimund@2479: raimund@2479: accept.addClickHandler(new ClickHandler() { christian@4568: @Override raimund@2479: public void onClick(ClickEvent e) { raimund@2479: okClicked(); raimund@2479: } raimund@2479: }); raimund@2479: raimund@2479: HLayout buttons = new HLayout(); raimund@2479: buttons.addMember(accept); raimund@2479: buttons.addMember(cancel); raimund@2479: buttons.setAlign(Alignment.CENTER); raimund@2479: buttons.setHeight(30); raimund@2479: raimund@2479: VLayout layout = new VLayout(); raimund@2479: listGrid = new ListGrid(); raimund@2479: listGrid.setWidth100(); raimund@2479: listGrid.setHeight("*"); raimund@2479: listGrid.setCanSort(false); raimund@2479: listGrid.setCanEdit(true); raimund@2479: listGrid.setShowHeaderContextMenu(false); raimund@2479: raimund@2479: CellFormatter doubleFormat = new CellFormatter() { christian@4568: @Override raimund@2479: public String format(Object value, ListGridRecord record, int rowNum, int colNum) { raimund@2479: if(value != null) { raimund@2479: NumberFormat nf = NumberFormat.getDecimalFormat(); raimund@2479: try { raimund@2479: double d = Double.valueOf(value.toString()).doubleValue(); raimund@2479: return nf.format(d); raimund@2479: } catch (Exception e) { raimund@2479: return value.toString(); raimund@2479: } raimund@2479: } else { raimund@2479: return null; raimund@2479: } raimund@2479: }}; raimund@2479: raimund@2479: CellFormatter dateFormat = new CellFormatter() { christian@4568: @Override raimund@2479: public String format(Object value, ListGridRecord record, int rowNum, int colNum) { raimund@2479: if(value != null && !value.toString().equals("")) { raimund@2479: try { raimund@2479: DateTimeFormat df = raimund@2479: DateTimeFormat.getFormat("dd.MM.yyyy"); raimund@2479: Date d = df.parse(value.toString()); raimund@2479: DateTimeFormat df2 = raimund@2479: DateTimeFormat.getFormat( raimund@2479: DateTimeFormat.PredefinedFormat.DATE_MEDIUM); raimund@2479: return df2.format(d); raimund@2479: raimund@2479: } raimund@2479: catch(IllegalArgumentException iae) { raimund@2479: SC.warn(MSG.error_invalid_date()); raimund@2479: record.setAttribute(DatePointRecord.ATTRIBUTE_X, ""); raimund@2479: return ""; raimund@2479: } raimund@2479: } raimund@2479: else { raimund@2479: return null; raimund@2479: } raimund@2479: }}; raimund@2479: raimund@2479: raimund@2479: CellEditValueParser cevp = new CellEditValueParser() { christian@4568: @Override raimund@2479: public Object parse(Object value, ListGridRecord record, int rowNum, int colNum) { raimund@2479: if (value == null) raimund@2479: return null; raimund@2479: try { raimund@2479: NumberFormat nf = NumberFormat.getDecimalFormat(); raimund@2479: double d = nf.parse(value.toString()); raimund@2479: return (new Double(d)).toString(); raimund@2479: } raimund@2479: catch(NumberFormatException nfe) { raimund@2479: return value; raimund@2479: } raimund@2479: } raimund@2479: }; raimund@2479: raimund@2479: CellEditValueFormatter cevf = new CellEditValueFormatter() { christian@4568: @Override raimund@2479: public Object format(Object value, ListGridRecord record, int rowNum, int colNum) { raimund@2479: if (value != null) { raimund@2479: NumberFormat nf = NumberFormat.getDecimalFormat(); raimund@2479: try { raimund@2479: double d = Double.valueOf(value.toString()).doubleValue(); raimund@2479: return nf.format(d); raimund@2479: } catch (Exception e) { raimund@2479: return value.toString(); raimund@2479: } raimund@2479: } raimund@2479: return null; raimund@2479: } raimund@2479: }; raimund@2479: raimund@2479: // Use X and Y as default fallback. raimund@2479: String xAxis = "X"; raimund@2479: String yAxis = "Y"; raimund@2479: raimund@2479: // Get header text from collection settings. raimund@2479: Settings settings = this.collection.getSettings(outputModeName); raimund@2479: List axes = settings.getSettings("axes"); raimund@2479: if(axes != null) { raimund@2479: for (Property p: axes) { raimund@2479: PropertyGroup pg = (PropertyGroup)p; raimund@2479: StringProperty id = raimund@2479: (StringProperty)pg.getPropertyByName("id"); raimund@2479: if(id.getValue().equals("X")) { raimund@2479: StringProperty name = raimund@2479: (StringProperty)pg.getPropertyByName("label"); raimund@2479: xAxis = name.getValue(); raimund@2479: } raimund@2479: else if (yAxis.equals("Y")) { raimund@2479: StringProperty name = raimund@2479: (StringProperty)pg.getPropertyByName("label"); raimund@2479: yAxis = name.getValue(); raimund@2479: } raimund@2479: } raimund@2479: } raimund@2479: ListGridField xField = raimund@2479: new ListGridField(PointRecord.ATTRIBUTE_X, xAxis); raimund@2479: xField.setType(ListGridFieldType.TEXT); raimund@2479: xField.setCellFormatter(dateFormat); raimund@2479: raimund@2479: ListGridField yField = raimund@2479: new ListGridField(PointRecord.ATTRIBUTE_Y, yAxis); raimund@2479: yField.setType(ListGridFieldType.FLOAT); raimund@2479: yField.setCellFormatter(doubleFormat); raimund@2479: yField.setEditValueParser(cevp); raimund@2479: yField.setEditValueFormatter(cevf); raimund@2479: raimund@2479: ListGridField nameField = new ListGridField(PointRecord.ATTRIBUTE_NAME, raimund@2479: MSG.pointname()); raimund@2479: final ListGridField removeField = raimund@2479: new ListGridField("_removeRecord", MSG.removepoint()){{ raimund@2479: setType(ListGridFieldType.ICON); raimund@2479: setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); raimund@2479: setCanEdit(false); raimund@2479: setCanFilter(false); raimund@2479: setCanSort(false); raimund@2479: setCanGroupBy(false); raimund@2479: setCanFreeze(false); raimund@2479: setWidth(25); raimund@2479: }}; raimund@2479: raimund@2479: ListGridField activeField = new ListGridField( raimund@2479: PointRecord.ATTRIBUTE_ACTIVE, MSG.selection()); raimund@2479: activeField.setType(ListGridFieldType.BOOLEAN); raimund@2479: activeField.setDefaultValue(true); raimund@2479: raimund@2479: listGrid.setFields(new ListGridField[] {activeField, xField, yField, raimund@2479: nameField, removeField}); raimund@2479: raimund@2479: listGrid.addRecordClickHandler(new RecordClickHandler() { christian@4568: @Override raimund@2479: public void onRecordClick(final RecordClickEvent event) { raimund@2479: // Just handle remove-clicks raimund@2479: if(!event.getField().getName().equals(removeField.getName())) { raimund@2479: return; sascha@2905: } raimund@2479: event.getViewer().removeData(event.getRecord()); raimund@2479: } raimund@2479: }); raimund@2479: raimund@2479: // Find the artifacts uuid. raimund@2479: findManualPointsUUID(); raimund@2479: CollectionItem item = collection.getItem(uuid); raimund@2479: raimund@2479: // Add points to grid. raimund@2479: if (item != null) { raimund@2479: String jsonData = item.getData().get(outputModeName + "." + POINT_DATA); raimund@2479: JSONArray jsonArray = (JSONArray) JSONParser.parse(jsonData); raimund@2479: for (int i = 0; i < jsonArray.size(); i++) { raimund@2479: JSONArray point = (JSONArray) jsonArray.get(i); raimund@2479: listGrid.addData(datePointRecordFromJSON(point)); raimund@2479: } raimund@2479: } raimund@2479: else { christian@4568: GWT.log("No item found for " + uuid); raimund@2479: } raimund@2479: raimund@2479: IButton button = new IButton(MSG.newpoint()); raimund@2479: button.setTop(250); raimund@2479: button.addClickHandler(new ClickHandler() { christian@4568: @Override raimund@2479: public void onClick(ClickEvent event) { raimund@2479: listGrid.startEditingNew(); raimund@2479: } raimund@2479: }); raimund@2479: raimund@2479: layout.addMember(listGrid); raimund@2479: layout.addMember(button); raimund@2479: raimund@2479: addItem(layout); raimund@2479: raimund@2479: addItem(buttons); raimund@2479: setWidth(380); raimund@2479: setHeight(470); raimund@2479: centerInPage(); raimund@2479: } raimund@2479: raimund@2479: raimund@2479: /** Create JSON representation of the points present in the list grid. */ christian@4568: @Override raimund@2479: protected JSONArray jsonArrayFromListGrid() { raimund@2479: JSONArray list = new JSONArray(); raimund@2479: int idx = 0; raimund@2479: raimund@2479: for(ListGridRecord record : listGrid.getRecords()) { raimund@2479: if (record instanceof DatePointRecord) { raimund@2479: JSONArray data = new JSONArray(); raimund@2479: raimund@2479: DatePointRecord point = (DatePointRecord) record; raimund@2479: String dateString = point.getX(); raimund@2479: DateTimeFormat df = DateTimeFormat.getFormat( raimund@2479: DateTimeFormat.PredefinedFormat.DATE_MEDIUM); raimund@2479: raimund@2479: Date d = df.parse(dateString); christian@4568: double dv = d.getTime(); raimund@2479: raimund@2479: data.set(0, new JSONNumber(dv)); raimund@2479: data.set(1, new JSONNumber(point.getY())); raimund@2479: data.set(2, new JSONString(point.getName())); raimund@2479: data.set(3, JSONBoolean.getInstance(point.isActive())); raimund@2479: raimund@2479: list.set(idx, data); raimund@2479: idx++; raimund@2479: } raimund@2479: else { raimund@2479: JSONArray data = new JSONArray(); raimund@2479: raimund@2479: String nameString = record.getAttributeAsString(PointRecord.ATTRIBUTE_NAME); raimund@2479: // Apply default name if none set. raimund@2479: if (nameString == null || nameString.equals("")) { raimund@2479: String xString = record.getAttributeAsString( raimund@2479: PointRecord.ATTRIBUTE_X); raimund@2479: String yString = record.getAttributeAsString( raimund@2479: PointRecord.ATTRIBUTE_Y); raimund@2479: nameString = xString + "/" + yString; raimund@2479: } raimund@2479: raimund@2479: String dateString = record.getAttributeAsString(PointRecord.ATTRIBUTE_X); raimund@2479: DateTimeFormat df = DateTimeFormat.getFormat( raimund@2479: DateTimeFormat.PredefinedFormat.DATE_MEDIUM); raimund@2479: raimund@2479: Date d = df.parse(dateString); christian@4568: double dv = d.getTime(); raimund@2479: data.set(0, new JSONNumber(dv)); raimund@2479: data.set(1, new JSONNumber(record. raimund@2479: getAttributeAsDouble(PointRecord.ATTRIBUTE_Y))); raimund@2479: data.set(2, new JSONString(nameString)); raimund@2479: data.set(3, JSONBoolean.getInstance(record.getAttributeAsBoolean( raimund@2479: PointRecord.ATTRIBUTE_ACTIVE))); raimund@2479: raimund@2479: list.set(idx, data); raimund@2479: idx++; raimund@2479: } raimund@2479: } raimund@2479: return list; raimund@2479: } raimund@2479: raimund@2479: /** From a JSON-encoded point, create a PointRecord. */ raimund@2479: public DatePointRecord datePointRecordFromJSON(JSONArray jsonArray) { raimund@2479: JSONNumber x = (JSONNumber) jsonArray.get(0); raimund@2479: JSONNumber y = (JSONNumber) jsonArray.get(1); raimund@2479: JSONString s = (JSONString) jsonArray.get(2); raimund@2479: JSONBoolean b = (JSONBoolean) jsonArray.get(3); raimund@2479: raimund@2479: Date d = new Date (Long.valueOf(x.toString()).longValue()); raimund@2479: DateTimeFormat df = DateTimeFormat.getFormat( raimund@2479: DateTimeFormat.PredefinedFormat.DATE_MEDIUM); raimund@2479: raimund@2479: return new DatePointRecord(b.booleanValue(), df.format(d), raimund@2479: y.doubleValue(), s.stringValue()); raimund@2479: } raimund@2479: raimund@2479: raimund@2479: /** Return false if x or y attribute is missing. */ raimund@2479: @Override raimund@2479: protected boolean isDialogValid() { raimund@2479: boolean valid = true; raimund@2479: for (ListGridRecord record : listGrid.getRecords()) { raimund@2479: if (record.getAttributeAsString(PointRecord.ATTRIBUTE_X) == null || raimund@2479: record.getAttributeAsString( raimund@2479: DatePointRecord.ATTRIBUTE_X).equals("") || raimund@2479: record.getAttributeAsDouble(PointRecord.ATTRIBUTE_Y) == null) { raimund@2479: return false; raimund@2479: } raimund@2479: } raimund@2479: if (listGrid.hasErrors()) { raimund@2479: valid = false; raimund@2479: } raimund@2479: return valid; raimund@2479: } raimund@2479: raimund@2479: raimund@2479: /** Simple record to store points. */ raimund@2479: public class DatePointRecord extends ListGridRecord { raimund@2479: protected static final String ATTRIBUTE_X = "X"; raimund@2479: protected static final String ATTRIBUTE_Y = "Y"; raimund@2479: protected static final String ATTRIBUTE_NAME = "name"; raimund@2479: protected static final String ATTRIBUTE_ACTIVE = "active"; raimund@2479: raimund@2479: private DatePointRecord() {;} raimund@2479: raimund@2479: public DatePointRecord(boolean b, String x, double y, String name) { raimund@2479: setActive(b); raimund@2479: setName(name); raimund@2479: setX(x); raimund@2479: setY(y); raimund@2479: } raimund@2479: raimund@2479: public void setActive(boolean b) { raimund@2479: setAttribute(ATTRIBUTE_ACTIVE, b); raimund@2479: } raimund@2479: raimund@2479: public boolean isActive() { raimund@2479: return getAttributeAsBoolean(ATTRIBUTE_ACTIVE); raimund@2479: } raimund@2479: raimund@2479: public void setName(String name) { raimund@2479: setAttribute(ATTRIBUTE_NAME, name); raimund@2479: } raimund@2479: raimund@2479: public String getName() { raimund@2479: return getAttributeAsString(ATTRIBUTE_NAME); raimund@2479: } raimund@2479: raimund@2479: public void setX(String x) { raimund@2479: setAttribute(ATTRIBUTE_X, x); raimund@2479: } raimund@2479: raimund@2479: public void setY(double y) { raimund@2479: setAttribute(ATTRIBUTE_Y, y); raimund@2479: } raimund@2479: raimund@2479: public String getX() { raimund@2479: return getAttributeAsString(ATTRIBUTE_X); raimund@2479: } raimund@2479: raimund@2479: public double getY() { raimund@2479: return getAttributeAsDouble(ATTRIBUTE_Y); raimund@2479: } raimund@2479: } raimund@2479: } felix@4980: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : felix@4980: