Mercurial > dive4elements > river
diff flys-client/src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java @ 1309:a95e82d6bcc1
Refactored the code to create a context menu and a style editor so that it is also available for maps.
flys-client/trunk@2943 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 12 Oct 2011 08:53:17 +0000 |
parents | |
children | 974c6b3700de |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java Wed Oct 12 08:53:17 2011 +0000 @@ -0,0 +1,276 @@ +package de.intevation.flys.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.widgets.Window; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.layout.HLayout; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.CheckboxItem; +import com.smartgwt.client.widgets.form.fields.SpinnerItem; +import com.smartgwt.client.widgets.form.fields.ColorPickerItem; +import com.smartgwt.client.widgets.form.fields.ComboBoxItem; +import com.smartgwt.client.widgets.form.fields.TextItem; + +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.events.ItemChangedEvent; +import com.smartgwt.client.widgets.form.events.ItemChangedHandler; +import com.smartgwt.client.types.Alignment; + +import de.intevation.flys.client.shared.model.Collection; +import de.intevation.flys.client.shared.model.CollectionItemAttribute; +import de.intevation.flys.client.shared.model.Style; +import de.intevation.flys.client.shared.model.StyleSetting; +import de.intevation.flys.client.shared.model.FacetRecord; + +import de.intevation.flys.client.client.services.CollectionItemAttributeServiceAsync; +import de.intevation.flys.client.client.services.CollectionItemAttributeService; +import de.intevation.flys.client.client.ui.CollectionView; + +import de.intevation.flys.client.client.FLYSConstants; +import de.intevation.flys.client.client.Config; + +/** + * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a> + */ +public class StyleEditorWindow +extends Window +implements ClickHandler +{ + /** The interface that provides i18n messages. */ + protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + + /** The collection */ + protected Collection collection; + + /** The parent collection view */ + protected CollectionView view; + + /** The attributes */ + protected CollectionItemAttribute attributes; + + /** The selected facet. */ + protected FacetRecord facet; + + /** Main layout */ + protected VLayout layout; + + /** The service used to set collection item attributes. */ + protected CollectionItemAttributeServiceAsync itemAttributeService = + GWT.create(CollectionItemAttributeService.class); + + public StyleEditorWindow ( + Collection collection, + CollectionItemAttribute attributes, + FacetRecord facet) + { + this.collection = collection; + this.attributes = attributes; + this.facet = facet; + this.layout = new VLayout(); + + init(); + initPanels(); + } + + + protected void init() { + setTitle(MSG.properties()); + setWidth(270); + setHeight(200); + setCanDragReposition(true); + setCanDragResize(true); + setKeepInParentRect(true); + + layout.setWidth100(); + layout.setHeight100(); + + } + + + protected void initPanels() { + HLayout buttons = new HLayout(); + Button accept = new Button(MSG.label_ok()); + Button cancel = new Button(MSG.label_cancel()); + cancel.addClickHandler(this); + accept.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent e) { + saveStyle(); + } + }); + + buttons.addMember(accept); + buttons.addMember(cancel); + buttons.setAlign(Alignment.RIGHT); + + layout.addMember(createPropertyGrid());; + layout.addMember(buttons); + addItem(layout); + } + + + public void setCollectionView (CollectionView view) { + this.view = view; + setParentElement(this.view.getParentElement()); + } + + + public void onClick(ClickEvent event) { + this.hide(); + } + + + protected VLayout createPropertyGrid() { + VLayout properties = new VLayout(); + + Style s = attributes.getStyle(facet.getTheme().getFacet()); + + TextItem name = new TextItem("name", "Name"); + name.setValue(facet.getName()); + name.setTitleStyle("color:#000; width:120px"); + name.setTitleAlign(Alignment.LEFT); + name.setDisabled(true); + name.setShowDisabled(false); + DynamicForm f = new DynamicForm(); + f.setFields(name); + properties.addMember(f); + + for (int i = 0; i < s.getNumSettings(); i ++) { + final StyleSetting set = s.getSetting(i); + DynamicForm property = createPropertyUI( + set.getDisplayName(), + set.getName(), + set.getType(), + set.getDefaultValue()); + properties.addMember(property); + } + return properties; + } + + protected DynamicForm createPropertyUI( + String dname, + String name, + String type, + String value) + { + DynamicForm df = new DynamicForm(); + + FormItem f; + if(type.equals("int")) { + SpinnerItem s = new SpinnerItem(name, dname); + s.setMin(1); + s.setMax(10); + s.setValue(value); + f = s; + } + else if (type.equals("boolean")) { + CheckboxItem c = new CheckboxItem(name, dname); + if(value.equals("true")) { + c.setValue(true); + } + else { + c.setValue(false); + } + c.setLabelAsTitle(true); + f = c; + } + else if (type.equals("Color")) { + ColorPickerItem c = new ColorPickerItem(name, dname); + c.setValue(rgbToHtml(value)); + f = c; + } + else if (type.equals("Dash")) { + f = new ComboBoxItem(name, dname); + f.setValue(value); + } + else { + f = new FormItem(); + } + f.setTitleStyle("color:#000; width:120px"); + f.setTitleAlign(Alignment.LEFT); + df.setFields(f); + df.addItemChangedHandler(new ItemChangedHandler() { + public void onItemChanged(ItemChangedEvent e) { + String name = e.getItem().getName(); + String newValue = e.getNewValue().toString(); + GWT.log("changed: " + name); + setNewValue(name, newValue); + } + }); + + return df; + } + + protected String rgbToHtml(String rgb) { + String[] parts = rgb.split(","); + int values[] = new int[parts.length]; + for (int i = 0; i < parts.length; i++) { + parts[i] = parts[i].trim(); + try { + values[i] = Integer.parseInt(parts[i]); + } + catch(NumberFormatException nfe) { + return "#000000"; + } + } + String hex = "#"; + for (int i = 0; i < values.length; i++) { + if (values[i] < 16) { + hex += "0"; + } + hex += Integer.toHexString(values[i]); + } + return hex; + } + + protected String htmlToRgb(String html) { + if (!html.startsWith("#")) { + return "0, 0, 0"; + } + + int r = Integer.valueOf(html.substring(1, 3), 16); + int g = Integer.valueOf(html.substring(3, 5), 16); + int b = Integer.valueOf(html.substring(5, 7), 16); + + return r + ", " + g + ", " + b; + } + + protected void saveStyle () { + GWT.log("StyleEditorWindow.saveStyle()"); + Config config = Config.getInstance(); + String url = config.getServerUrl(); + String locale = config.getLocale(); + + itemAttributeService.setCollectionItemAttribute( + this.collection, + attributes.getArtifact(), + url, + locale, + attributes, + new AsyncCallback<Void>() { + public void onFailure (Throwable caught) { + GWT.log("Could not set Collection item attributes."); + } + public void onSuccess(Void v) { + GWT.log("Successfully saved collection item attributes."); + } + }); + + + this.hide(); + } + + protected final void setNewValue(String name, String value) { + Style s = attributes.getStyle(facet.getTheme().getFacet()); + StyleSetting set = s.getSetting(name); + if(name.equals("linecolor")) { + value = htmlToRgb(value); + } + set.setDefaultValue(value); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :