ingo@1309: package de.intevation.flys.client.client.ui; ingo@1309: ingo@1309: import com.google.gwt.core.client.GWT; ingo@1309: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@1309: ingo@1309: import com.smartgwt.client.widgets.Window; ingo@1309: import com.smartgwt.client.widgets.layout.VLayout; ingo@1309: import com.smartgwt.client.widgets.layout.HLayout; ingo@1309: import com.smartgwt.client.widgets.Button; ingo@1309: import com.smartgwt.client.widgets.form.DynamicForm; ingo@1309: import com.smartgwt.client.widgets.form.fields.FormItem; ingo@1309: import com.smartgwt.client.widgets.form.fields.CheckboxItem; ingo@1309: import com.smartgwt.client.widgets.form.fields.SpinnerItem; ingo@1309: import com.smartgwt.client.widgets.form.fields.ColorPickerItem; ingo@1309: import com.smartgwt.client.widgets.form.fields.ComboBoxItem; ingo@1309: import com.smartgwt.client.widgets.form.fields.TextItem; ingo@1309: ingo@1309: import com.smartgwt.client.widgets.events.ClickEvent; ingo@1309: import com.smartgwt.client.widgets.events.ClickHandler; ingo@1309: import com.smartgwt.client.widgets.form.events.ItemChangedEvent; ingo@1309: import com.smartgwt.client.widgets.form.events.ItemChangedHandler; ingo@1309: import com.smartgwt.client.types.Alignment; ingo@1309: ingo@1309: import de.intevation.flys.client.shared.model.Collection; ingo@1309: import de.intevation.flys.client.shared.model.CollectionItemAttribute; ingo@1309: import de.intevation.flys.client.shared.model.Style; ingo@1309: import de.intevation.flys.client.shared.model.StyleSetting; ingo@1309: import de.intevation.flys.client.shared.model.FacetRecord; ingo@1309: ingo@1309: import de.intevation.flys.client.client.services.CollectionItemAttributeServiceAsync; ingo@1309: import de.intevation.flys.client.client.services.CollectionItemAttributeService; ingo@1309: import de.intevation.flys.client.client.ui.CollectionView; ingo@1309: ingo@1309: import de.intevation.flys.client.client.FLYSConstants; ingo@1309: import de.intevation.flys.client.client.Config; ingo@1309: ingo@1309: /** ingo@1309: * @author Raimund Renkert ingo@1309: */ ingo@1309: public class StyleEditorWindow ingo@1309: extends Window ingo@1309: implements ClickHandler ingo@1309: { ingo@1309: /** The interface that provides i18n messages. */ ingo@1309: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@1309: ingo@1309: /** The collection */ ingo@1309: protected Collection collection; ingo@1309: ingo@1309: /** The parent collection view */ ingo@1309: protected CollectionView view; ingo@1309: ingo@1309: /** The attributes */ ingo@1309: protected CollectionItemAttribute attributes; ingo@1309: ingo@1309: /** The selected facet. */ ingo@1309: protected FacetRecord facet; ingo@1309: ingo@1309: /** Main layout */ ingo@1309: protected VLayout layout; ingo@1309: ingo@1309: /** The service used to set collection item attributes. */ ingo@1309: protected CollectionItemAttributeServiceAsync itemAttributeService = ingo@1309: GWT.create(CollectionItemAttributeService.class); ingo@1309: ingo@1309: public StyleEditorWindow ( ingo@1309: Collection collection, ingo@1309: CollectionItemAttribute attributes, ingo@1309: FacetRecord facet) ingo@1309: { ingo@1309: this.collection = collection; ingo@1309: this.attributes = attributes; ingo@1309: this.facet = facet; ingo@1309: this.layout = new VLayout(); ingo@1309: ingo@1309: init(); ingo@1309: initPanels(); ingo@1309: } ingo@1309: ingo@1309: ingo@1309: protected void init() { ingo@1309: setTitle(MSG.properties()); ingo@1309: setWidth(270); ingo@1309: setHeight(200); ingo@1309: setCanDragReposition(true); ingo@1309: setCanDragResize(true); ingo@1309: setKeepInParentRect(true); ingo@1309: ingo@1309: layout.setWidth100(); ingo@1309: layout.setHeight100(); ingo@1309: ingo@1309: } ingo@1309: ingo@1309: ingo@1309: protected void initPanels() { ingo@1309: HLayout buttons = new HLayout(); ingo@1309: Button accept = new Button(MSG.label_ok()); ingo@1309: Button cancel = new Button(MSG.label_cancel()); ingo@1309: cancel.addClickHandler(this); ingo@1309: accept.addClickHandler(new ClickHandler() { ingo@1309: public void onClick(ClickEvent e) { ingo@1309: saveStyle(); ingo@1309: } ingo@1309: }); ingo@1309: ingo@1309: buttons.addMember(accept); ingo@1309: buttons.addMember(cancel); ingo@1309: buttons.setAlign(Alignment.RIGHT); ingo@1309: ingo@1309: layout.addMember(createPropertyGrid());; ingo@1309: layout.addMember(buttons); ingo@1309: addItem(layout); ingo@1309: } ingo@1309: ingo@1309: ingo@1309: public void setCollectionView (CollectionView view) { ingo@1309: this.view = view; ingo@1309: setParentElement(this.view.getParentElement()); ingo@1309: } ingo@1309: ingo@1309: ingo@1309: public void onClick(ClickEvent event) { ingo@1309: this.hide(); ingo@1309: } ingo@1309: ingo@1309: ingo@1309: protected VLayout createPropertyGrid() { ingo@1309: VLayout properties = new VLayout(); ingo@1309: ingo@1309: Style s = attributes.getStyle(facet.getTheme().getFacet()); ingo@1309: ingo@1309: TextItem name = new TextItem("name", "Name"); ingo@1309: name.setValue(facet.getName()); ingo@1309: name.setTitleStyle("color:#000; width:120px"); ingo@1309: name.setTitleAlign(Alignment.LEFT); ingo@1309: name.setDisabled(true); ingo@1309: name.setShowDisabled(false); ingo@1309: DynamicForm f = new DynamicForm(); ingo@1309: f.setFields(name); ingo@1309: properties.addMember(f); ingo@1309: ingo@1309: for (int i = 0; i < s.getNumSettings(); i ++) { ingo@1309: final StyleSetting set = s.getSetting(i); ingo@1309: DynamicForm property = createPropertyUI( ingo@1309: set.getDisplayName(), ingo@1309: set.getName(), ingo@1309: set.getType(), ingo@1309: set.getDefaultValue()); ingo@1309: properties.addMember(property); ingo@1309: } ingo@1309: return properties; ingo@1309: } ingo@1309: ingo@1309: protected DynamicForm createPropertyUI( ingo@1309: String dname, ingo@1309: String name, ingo@1309: String type, ingo@1309: String value) ingo@1309: { ingo@1309: DynamicForm df = new DynamicForm(); ingo@1309: ingo@1309: FormItem f; ingo@1309: if(type.equals("int")) { ingo@1309: SpinnerItem s = new SpinnerItem(name, dname); ingo@1309: s.setMin(1); ingo@1309: s.setMax(10); ingo@1309: s.setValue(value); ingo@1309: f = s; ingo@1309: } ingo@1309: else if (type.equals("boolean")) { ingo@1309: CheckboxItem c = new CheckboxItem(name, dname); ingo@1309: if(value.equals("true")) { ingo@1309: c.setValue(true); ingo@1309: } ingo@1309: else { ingo@1309: c.setValue(false); ingo@1309: } ingo@1309: c.setLabelAsTitle(true); ingo@1309: f = c; ingo@1309: } ingo@1309: else if (type.equals("Color")) { ingo@1309: ColorPickerItem c = new ColorPickerItem(name, dname); ingo@1309: c.setValue(rgbToHtml(value)); ingo@1309: f = c; ingo@1309: } ingo@1309: else if (type.equals("Dash")) { ingo@1309: f = new ComboBoxItem(name, dname); ingo@1309: f.setValue(value); ingo@1309: } ingo@1309: else { ingo@1309: f = new FormItem(); ingo@1309: } ingo@1309: f.setTitleStyle("color:#000; width:120px"); ingo@1309: f.setTitleAlign(Alignment.LEFT); ingo@1309: df.setFields(f); ingo@1309: df.addItemChangedHandler(new ItemChangedHandler() { ingo@1309: public void onItemChanged(ItemChangedEvent e) { ingo@1309: String name = e.getItem().getName(); ingo@1309: String newValue = e.getNewValue().toString(); ingo@1309: GWT.log("changed: " + name); ingo@1309: setNewValue(name, newValue); ingo@1309: } ingo@1309: }); ingo@1309: ingo@1309: return df; ingo@1309: } ingo@1309: ingo@1309: protected String rgbToHtml(String rgb) { ingo@1309: String[] parts = rgb.split(","); ingo@1309: int values[] = new int[parts.length]; ingo@1309: for (int i = 0; i < parts.length; i++) { ingo@1309: parts[i] = parts[i].trim(); ingo@1309: try { ingo@1309: values[i] = Integer.parseInt(parts[i]); ingo@1309: } ingo@1309: catch(NumberFormatException nfe) { ingo@1309: return "#000000"; ingo@1309: } ingo@1309: } ingo@1309: String hex = "#"; ingo@1309: for (int i = 0; i < values.length; i++) { ingo@1309: if (values[i] < 16) { ingo@1309: hex += "0"; ingo@1309: } ingo@1309: hex += Integer.toHexString(values[i]); ingo@1309: } ingo@1309: return hex; ingo@1309: } ingo@1309: ingo@1309: protected String htmlToRgb(String html) { ingo@1309: if (!html.startsWith("#")) { ingo@1309: return "0, 0, 0"; ingo@1309: } ingo@1309: ingo@1309: int r = Integer.valueOf(html.substring(1, 3), 16); ingo@1309: int g = Integer.valueOf(html.substring(3, 5), 16); ingo@1309: int b = Integer.valueOf(html.substring(5, 7), 16); ingo@1309: ingo@1309: return r + ", " + g + ", " + b; ingo@1309: } ingo@1309: ingo@1309: protected void saveStyle () { ingo@1309: GWT.log("StyleEditorWindow.saveStyle()"); ingo@1309: Config config = Config.getInstance(); ingo@1309: String url = config.getServerUrl(); ingo@1309: String locale = config.getLocale(); ingo@1309: ingo@1309: itemAttributeService.setCollectionItemAttribute( ingo@1309: this.collection, ingo@1309: attributes.getArtifact(), ingo@1309: url, ingo@1309: locale, ingo@1309: attributes, ingo@1309: new AsyncCallback() { ingo@1309: public void onFailure (Throwable caught) { ingo@1309: GWT.log("Could not set Collection item attributes."); ingo@1309: } ingo@1309: public void onSuccess(Void v) { ingo@1309: GWT.log("Successfully saved collection item attributes."); ingo@1309: } ingo@1309: }); ingo@1309: ingo@1309: ingo@1309: this.hide(); ingo@1309: } ingo@1309: ingo@1309: protected final void setNewValue(String name, String value) { ingo@1309: Style s = attributes.getStyle(facet.getTheme().getFacet()); ingo@1309: StyleSetting set = s.getSetting(name); ingo@1309: if(name.equals("linecolor")) { ingo@1309: value = htmlToRgb(value); ingo@1309: } ingo@1309: set.setDefaultValue(value); ingo@1309: } ingo@1309: } ingo@1309: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :