/* * Copyright 2009 Andrew Pietsch * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing permissions * and limitations under the License. */ package com.dragome.forms.bindings.client.form.metadata; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import com.dragome.forms.bindings.client.form.Field; import com.dragome.forms.bindings.client.form.FieldModel; import com.dragome.forms.bindings.client.form.FormModel; import com.dragome.forms.bindings.client.form.FormattedFieldModel; import com.dragome.forms.bindings.client.form.metadata.binding.MetadataBindingBuilder; /** * */ public class MetadataPlugin { public static final String DEFAULT_WATERMARK_STYLE= "pectin-Watermark"; public static <T> MetadataBindingBuilder<T> enable(Field field, Field... others) { return enable(toCollection(field, others)); } public static <T> MetadataBindingBuilder<T> enable(Collection<Field<?>> fields) { return new MetadataBindingBuilder<T>(fields, new MetadataBindingBuilder.Action() { public void apply(Metadata metadata, boolean value) { metadata.setEnabled(value); } }); } public static <T> MetadataBindingBuilder<T> disable(Field field, Field... others) { return disable(toCollection(field, others)); } public static <T> MetadataBindingBuilder<T> disable(Collection<Field<?>> fields) { return new MetadataBindingBuilder<T>(fields, new MetadataBindingBuilder.Action() { public void apply(Metadata metadata, boolean value) { metadata.setEnabled(!value); } }); } public static <T> MetadataBindingBuilder<T> show(Field field, Field... others) { return show(toCollection(field, others)); } public static <T> MetadataBindingBuilder<T> show(Collection<Field<?>> fields) { return new MetadataBindingBuilder<T>(fields, new MetadataBindingBuilder.Action() { public void apply(Metadata metadata, boolean value) { metadata.setVisible(value); } }); } public static <T> MetadataBindingBuilder<T> hide(Field field, Field... others) { return hide(toCollection(field, others)); } public static <T> MetadataBindingBuilder<T> hide(Collection<Field<?>> fields) { return new MetadataBindingBuilder<T>(fields, new MetadataBindingBuilder.Action() { public void apply(Metadata metadata, boolean value) { metadata.setVisible(!value); } }); } public static WatermarkBuilder watermark(FieldModel<String> field) { return new WatermarkBuilder(getMetadata(field)); } public static WatermarkBuilder watermark(FieldModel<String> field, FieldModel<String>... others) { return new WatermarkBuilder(getAllMetadata(toCollection(field, others))); } public static WatermarkBuilder watermark(FormattedFieldModel<?> field) { return new WatermarkBuilder(getMetadata(field)); } public static WatermarkBuilder watermark(FormattedFieldModel<?> field, FormattedFieldModel<?>... others) { return new WatermarkBuilder(getAllMetadata(toCollection(field, others))); } /** * Gets a builder for creating {@link com.pietschy.gwt.pectin.client.value.ValueModel} for the various * metadata states. E.g. * <pre> * binder.disable(someWidget).when(metadataOf(someField).isDisabled()); * </pre> * @param field the field of interest. * @return and new builder. */ public static MetadataConditionBuilder metadataOf(Field field) { return new MetadataConditionBuilder(getMetadata(field)); } private static Collection<Field<?>> toCollection(Field<?> field, Field<?>... others) { ArrayList<Field<?>> fields= new ArrayList<Field<?>>(); fields.add(field); fields.addAll(Arrays.asList(others)); return fields; } private static Collection<Metadata> getAllMetadata(Collection<Field<?>> fields) { ArrayList<Metadata> result= new ArrayList<Metadata>(); for (Field other : fields) { result.add(getMetadata(other)); } return result; } public static Metadata getMetadata(Field field) { return getMetadataManager(field.getFormModel()).getMetadata(field); } public static MetadataManager getMetadataManager(FormModel form) { MetadataManager manager= (MetadataManager) form.getProperty(MetadataManager.class); if (manager == null) { manager= new MetadataManager(); form.putProperty(MetadataManager.class, manager); form.addBindingCallback(manager); } return manager; } /** * This method ensures that the metadata binding callbacks are installed. The callbacks ensure that the Metadata * plugin is activated every time {@link com.pietschy.gwt.pectin.client.binding.FormBinder} is used. * <p> * This method is only needed if * you haven't called any of the {@link #enable(com.pietschy.gwt.pectin.client.form.Field , com.pietschy.gwt.pectin.client.form.Field[])} style methods * or the {@link #getMetadata(com.pietschy.gwt.pectin.client.form.Field)} or the * {@link #getMetadataManager(com.pietschy.gwt.pectin.client.form.FormModel)} method. * <p> * Typically you'd use this if you want the metadata plugin automatically configure widgets based only on * the state of {@link com.pietschy.gwt.pectin.client.form.Field#isMutableSource()}. * * @param form the form. */ public static void ensureMetadataBindingsInstalled(FormModel form) { getMetadataManager(form); } }