Mercurial > dive4elements > river
diff flys-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartPropertiesEditor.java @ 5834:f507086aa94b
Repaired internal references.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:31:32 +0200 |
parents | flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartPropertiesEditor.java@b296d435fc69 |
children | 821a02bbfb4e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartPropertiesEditor.java Thu Apr 25 12:31:32 2013 +0200 @@ -0,0 +1,601 @@ +package de.intevation.flys.client.client.ui.chart; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.CheckboxItem; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.SelectItem; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; +import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.tab.Tab; +import com.smartgwt.client.widgets.tab.TabSet; + +import de.intevation.flys.client.client.Config; +import de.intevation.flys.client.client.FLYSConstants; +import de.intevation.flys.client.client.services.CollectionAttributeService; +import de.intevation.flys.client.client.services.CollectionAttributeServiceAsync; +import de.intevation.flys.client.client.utils.DoubleValidator; +import de.intevation.flys.client.client.utils.IntegerValidator; +import de.intevation.flys.client.shared.model.BooleanProperty; +import de.intevation.flys.client.shared.model.Collection; +import de.intevation.flys.client.shared.model.DoubleProperty; +import de.intevation.flys.client.shared.model.IntegerProperty; +import de.intevation.flys.client.shared.model.OutputSettings; +import de.intevation.flys.client.shared.model.Property; +import de.intevation.flys.client.shared.model.PropertyGroup; +import de.intevation.flys.client.shared.model.PropertySetting; +import de.intevation.flys.client.shared.model.Settings; +import de.intevation.flys.client.shared.model.StringProperty; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Dialog for the Chart-Properties, constructed from respective xml document. + * + * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a> + */ +public class ChartPropertiesEditor +extends Window +implements ClickHandler +{ + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** CollectionAttribute Update Service. */ + protected CollectionAttributeServiceAsync updater = + GWT.create(CollectionAttributeService.class); + + /** The tab called the editor window. */ + protected ChartOutputTab tab; + + /** The tabset for chart properties. */ + protected TabSet tabs; + + /** The collection. */ + protected Collection collection; + + /** The cloned output settings. */ + protected OutputSettings settings; + + /** The original output settings. */ + protected OutputSettings origSettings; + + + + /** + * Setup editor dialog. + * @param callerTab The tab called the editor window. + */ + public ChartPropertiesEditor(ChartOutputTab callerTab) { + this.tab = callerTab; + this.tabs = new TabSet(); + + init(); + } + + + /** + * Initialize the editor window and its components. + */ + protected void init() { + setTitle(MSG.properties()); + setCanDragReposition(true); + setCanDragResize(true); + + collection = tab.getCollectionView().getCollection(); + String outputName = tab.getOutputName(); + origSettings = (OutputSettings)collection.getSettings(outputName); + + settings = (OutputSettings)origSettings.clone(); + if (settings == null) { + return; + } + List<String> list = settings.getCategories(); + + for (int i = 0; i < list.size(); i++) { + Tab t = new Tab(MSG.getString(list.get(i))); + List<Property> props = settings.getSettings(list.get(i)); + List<Property> origProps = origSettings.getSettings(list.get(i)); + VLayout layout = new VLayout(); + for (int j = 0; j < props.size(); j++) { + if (props.get(j) instanceof PropertyGroup) { + layout.addMember(generatePropertyGroup(props.get(j), + origProps.get(j))); + } + else if (props.get(j) instanceof PropertySetting) { + PropertySetting p = (PropertySetting)props.get(j); + if (p.getAttribute("display").equals("false")) { + continue; + } + layout.addMember(generatePropertySetting(props.get(j), + origProps.get(j))); + } + } + t.setPane(layout); + tabs.addTab(t); + } + + Button accept = new Button(MSG.label_ok()); + Button cancel = new Button(MSG.label_cancel()); + cancel.addClickHandler(this); + accept.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent e) { + if(isDialogValid()) { + updateCollection(); + } + else { + GWT.log("Dialog not valid"); + SC.warn(MSG.error_dialog_not_valid()); + } + } + }); + + HLayout buttons = new HLayout(); + buttons.addMember(accept); + buttons.addMember(cancel); + buttons.setAlign(Alignment.CENTER); + buttons.setHeight(30); + + addItem(tabs); + addItem(buttons); + setWidth(380); + setHeight(470); + centerInPage(); + } + + + /** + * This method is called when the user aborts theming. + * @param event The event. + */ + @Override + public void onClick(ClickEvent event) { + this.destroy(); + } + + + /** + * Create a section from group (usually axis properties). + */ + protected Canvas generatePropertyGroup(Property group, Property orig) { + PropertyGroup pg = (PropertyGroup)group; + PropertyGroup origPg = (PropertyGroup)orig; + + if (pg.getName().equals("axis")) { + Label scale = new Label(MSG.scale() + " :"); + scale.setHeight(25); + scale.setMargin(2); + + DynamicForm form1 = new DynamicForm(); + DynamicForm form2 = new DynamicForm(); + form2.setNumCols(6); + + StringProperty label = + (StringProperty)pg.getPropertyByName("label"); + FormItem title = createStringProperty(label); + title.setValue( + ((StringProperty)origPg.getPropertyByName("label")).getValue()); + + IntegerProperty fontsize = + (IntegerProperty)pg.getPropertyByName("font-size"); + FormItem fs = createIntegerProperty(fontsize); + fs.setValue( + ((IntegerProperty) + origPg.getPropertyByName("font-size")).getValue()); + + DoubleProperty upper = + (DoubleProperty)pg.getPropertyByName("upper"); + final FormItem range1 = createDoubleProperty(upper); + range1.setName("rangeupper"); + range1.setWidth(70); + range1.setValue( + ((DoubleProperty) + origPg.getPropertyByName("upper")).toUIString()); + + DoubleProperty lower = + (DoubleProperty)pg.getPropertyByName("lower"); + final FormItem range2 = createDoubleProperty(lower); + range2.setName("rangelower"); + range2.setWidth(70); + range2.setValue( + ((DoubleProperty) + origPg.getPropertyByName("lower")).toUIString()); + + BooleanProperty fixation = + (BooleanProperty)pg.getPropertyByName("fixation"); + FormItem fix = createBooleanProperty(fixation); + fix.setValue(((BooleanProperty) + origPg.getPropertyByName("fixation")).getValue().booleanValue()); + + fix.addChangedHandler(new ChangedHandler() { + @Override + public void onChanged(ChangedEvent e) { + if ((Boolean)e.getValue()) { + range1.enable(); + range2.enable(); + } + else { + range1.disable(); + range2.disable(); + } + } + }); + if (fix.getValue().toString().equals("true")) { + range1.enable(); + range2.enable(); + } + else { + range1.disable(); + range2.disable(); + } + + form1.setFields(title, fs); + form2.setFields(fix, range2, range1); + + HLayout scaleLayout = new HLayout(); + scaleLayout.setHeight(30); + scaleLayout.addMember(scale); + scaleLayout.addMember(form2); + scaleLayout.setStyleName("property-dialog-axis"); + + VLayout root = new VLayout(); + root.addMember(form1); + root.addMember(scaleLayout); + root.setHeight(90); + + return root; + } + return null; + } + + + /** + * Generate a form with items for the properties/settings, preset with + * values. + */ + protected DynamicForm generatePropertySetting( + Property setting, + Property orig) + { + DynamicForm form = new DynamicForm(); + FormItem item = new FormItem(); + if (setting instanceof BooleanProperty) { + item = createBooleanProperty((BooleanProperty)setting); + item.setValue(((BooleanProperty)orig).getValue().booleanValue()); + } + else if (setting instanceof DoubleProperty) { + item = createDoubleProperty((DoubleProperty)setting); + item.setValue(((DoubleProperty)orig).toUIString()); + } + else if (setting instanceof IntegerProperty) { + item = createIntegerProperty((IntegerProperty)setting); + item.setValue(((IntegerProperty)orig).getValue()); + } + else if (setting instanceof StringProperty) { + StringProperty property = (StringProperty) setting; + item = createStringProperty(property); + item.setValue(((StringProperty)orig).getValue()); + } + else { + GWT.log("generatePropertySetting: unknown setting type."); + } + form.setFields(item); + return form; + } + + + protected FormItem createStringProperty(final StringProperty sp) { + String name = sp.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + String choiceAttribute = sp.getAttribute("choice"); + + if (choiceAttribute != null && choiceAttribute.equals("logo")) { + SelectItem logoChooser = new SelectItem(); + logoChooser.setImageURLPrefix(GWT.getHostPageBaseURL() + "images/logo-"); + logoChooser.setValueIconHeight(50); + logoChooser.setValueIconWidth(100); + + LinkedHashMap valueMap = new LinkedHashMap<String, String>(); + LinkedHashMap<String, String> valueIcons = new LinkedHashMap<String, String>(); + valueMap.put("none", MSG.getString("none")); + /* + If you want to add images, remember to change code in these places: + flys-artifacts: + XYChartGenerator.java + Timeseries*Generator.java and + in the flys-client projects Chart*Propert*Editor.java. + Also, these images have to be put in + flys-artifacts/src/main/resources/images/ + flys-client/src/main/webapp/images/ + */ + valueMap.put("BfG", ""); + valueMap.put("Intevation", ""); + valueIcons.put("BfG", "bfg.gif"); + valueIcons.put("Intevation", "intevation.png"); + logoChooser.setValueIcons(valueIcons); + logoChooser.setValueMap(valueMap); + logoChooser.setTitleStyle("color:#000;"); + logoChooser.setTitleAlign(Alignment.LEFT); + logoChooser.setTitle(MSG.getString(name)); + logoChooser.setTitleAlign(Alignment.LEFT); + logoChooser.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return logoChooser; + } + else if (choiceAttribute != null && choiceAttribute.equals("placeh")) { + SelectItem placeChooser = new SelectItem(); + LinkedHashMap valueMap = new LinkedHashMap<String, String>(); + valueMap.put("right", MSG.getString("right")); + valueMap.put("left", MSG.getString("left")); + valueMap.put("center", MSG.getString("center")); + placeChooser.setValueMap(valueMap); + placeChooser.setTitleStyle("color:#000;"); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.setTitle(MSG.getString(name)); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return placeChooser; + } + else if (choiceAttribute != null && choiceAttribute.equals("placev")) { + SelectItem placeChooser = new SelectItem(); + LinkedHashMap valueMap = new LinkedHashMap<String, String>(); + valueMap.put("top", MSG.getString("top")); + valueMap.put("bottom", MSG.getString("bottom")); + valueMap.put("center", MSG.getString("center")); + placeChooser.setValueMap(valueMap); + placeChooser.setTitleStyle("color:#000;"); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.setTitle(MSG.getString(name)); + placeChooser.setTitleAlign(Alignment.LEFT); + placeChooser.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return placeChooser; + } + + TextItem item = new TextItem(); + item.setTitle(MSG.getString(name)); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + sp.setValue(val); + } + }); + return item; + } + + + /** + * + */ + protected FormItem createBooleanProperty(final BooleanProperty bp) { + String name = bp.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + CheckboxItem item = new CheckboxItem("item", MSG.getString(name)); + item.setLabelAsTitle(true); + item.setTitleStyle("color:#000;"); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + String val; + if (e.getItem().getValue() == null) { + val = ""; + } + else { + val = e.getItem().getValue().toString(); + } + bp.setValue(val); + } + }); + return item; + } + + + /** + * + */ + protected FormItem createDoubleProperty(final DoubleProperty dp) { + String name = dp.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + TextItem item = new TextItem(); + item.setTitle(MSG.getString(name)); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + DoubleValidator validator = new DoubleValidator(); + Map errors = e.getForm().getErrors(); + if(validator.validate(e.getItem(), errors)) { + dp.setValueFromUI(e.getItem().getValue().toString()); + } + e.getForm().setErrors(errors, true); + } + }); + return item; + } + + + /** + * + */ + protected FormItem createIntegerProperty(final IntegerProperty ip) { + String name = ip.getName(); + if (name.contains("-")) { + name = name.replace("-", "_"); + } + + TextItem item = new TextItem(); + item.setTitle(MSG.getString(name)); + item.setTitleAlign(Alignment.LEFT); + item.addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent e) { + IntegerValidator validator = new IntegerValidator(); + Map errors = e.getForm().getErrors(); + if(validator.validate(e.getItem(), errors)) { + ip.setValue(e.getItem().getValue().toString()); + } + e.getForm().setErrors(errors, true); + } + }); + return item; + } + + + protected void updateCollection() { + final Config config = Config.getInstance(); + final String loc = config.getLocale(); + + GWT.log("PropertiesEditor.updateCollection via RPC now"); + + Settings s = settings; + collection.addSettings(this.tab.getOutputName(), s); + updater.update(collection, loc, new AsyncCallback<Collection>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not update collection attributes."); + SC.warn(MSG.getString(caught.getMessage())); + } + @Override + public void onSuccess(Collection collection) { + updateChartTab(); + } + }); + } + + protected void updateChartTab() { + this.tab.updateChartInfo(); + this.tab.updateChartPanel(); + this.destroy(); + } + + + protected boolean isDialogValid() { + boolean valid = true; + for (int i = 0; i < tabs.getNumTabs(); i++) { + Tab t = tabs.getTab(i); + Canvas container = t.getPane(); + Canvas[] children = container.getChildren(); + for (Canvas c: children) { + valid = validateCanvas(c); + if(!valid) { + return valid; + } + } + } + return valid; + } + + + protected boolean validateCanvas(Canvas c) { + boolean valid = true; + if(c instanceof DynamicForm) { + DynamicForm f = (DynamicForm) c; + FormItem up = f.getItem("rangeupper"); + FormItem lo = f.getItem("rangelower"); + + if(up != null && lo != null && + !up.isDisabled() && !lo.isDisabled()) + { + validateRange(f); + } + return !f.hasErrors(); + } + else if(c.getChildren().length > 0) { + for (Canvas child: c.getChildren()) { + valid = validateCanvas(child); + if(!valid) { + return valid; + } + } + } + return valid; + } + + protected boolean validateRange(DynamicForm form) { + Map errors = form.getErrors(); + FormItem up = form.getItem("rangeupper"); + FormItem lo = form.getItem("rangelower"); + + String v1 = up.getValue().toString(); + String v2 = lo.getValue().toString(); + + if(v1.equals(v2)) { + errors.put(up.getFieldName(), MSG.wrongFormat()); + errors.put(lo.getFieldName(), MSG.wrongFormat()); + form.setErrors(errors, true); + return false; + } + return true; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :