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 :