/*
* Copyright 2009-2012 the original author or authors.
*
* 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 org.jdal.beans;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JToggleButton;
import javax.swing.text.JTextComponent;
import org.jdal.swing.ApplicationContextGuiFactory;
import org.jdal.swing.PaginatorView;
import org.jdal.swing.Selector;
import org.jdal.swing.bind.AnnotationControlInitializer;
import org.jdal.swing.bind.ComboAccessor;
import org.jdal.swing.bind.LabelAccessor;
import org.jdal.swing.bind.ListAccessor;
import org.jdal.swing.bind.SelectorAccessor;
import org.jdal.swing.bind.TablePanelAccessor;
import org.jdal.swing.bind.TextComponentAccessor;
import org.jdal.swing.bind.ToggleButtonAccessor;
import org.jdal.swing.table.AddAction;
import org.jdal.swing.table.ApplyFilterAction;
import org.jdal.swing.table.ClearFilterAction;
import org.jdal.swing.table.CollectionTableCellRenderer;
import org.jdal.swing.table.DeselectAllAction;
import org.jdal.swing.table.HideShowFilterAction;
import org.jdal.swing.table.RemoveAllAction;
import org.jdal.swing.table.SelectAllAction;
import org.jdal.swing.table.TablePanel;
import org.jdal.ui.View;
import org.jdal.ui.bind.ConfigurableBinderFactory;
import org.jdal.ui.bind.ConfigurableControlAccessorFactory;
import org.jdal.ui.bind.ControlAccessor;
import org.jdal.ui.bind.ViewAccessor;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.CustomEditorConfigurer;
import org.springframework.beans.factory.config.ListFactoryBean;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
import org.springframework.beans.factory.parsing.ComponentDefinition;
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
/**
* Register Swing defaults BeanDefinitions
*
* @author Jose Luis Martin - (jlm@joseluismartin.info)
*/
public class DefaultsBeanDefinitionParser implements BeanDefinitionParser {
public static final String PAGINATOR_VIEW_BEAN_NAME = "paginatorView";
public static final String ACCESSOR_FACTORY_BEAN_NAME = "controlAccessorFactory";
public static final String BINDER_FACTORY_BEAN_NAME = "binderFactory";
public static final String CUSTOM_EDITOR_CONFIGURER_BEAN_NAME = "customEditorConfigurer";
public static final String DEFAULT_TABLE_ACTIONS = "defaultTableActions";
public static final String INIT_METHOD_NAME = "init";
public static final String DEFAULT_GUI_FACTORY = "defaultGuiFactory";
public static final String CONTROL_INITIALIZER = "controlInitializer";
public static final String PERSISTENT_SERVICE = "persistentService";
public static final String COLLECTION_TABLE_CELL_RENDERER_BEAN_NAME = "collectionTableCellRenderer";
/**
* {@inheritDoc}
*/
public BeanDefinition parse(Element element, ParserContext parserContext) {
Object source = parserContext.extractSource(element);
CompositeComponentDefinition ccd = new CompositeComponentDefinition("jdal-swing", source);
ccd.addNestedComponent(registerPropertyEditors(element, parserContext));
ccd.addNestedComponent(registerAccessorFactory(element, parserContext));
ccd.addNestedComponent(registerBinderFactory(element, parserContext));
ccd.addNestedComponent(registerPaginatorView(element, parserContext));
ccd.addNestedComponent(registerDefaultTableActions(element, parserContext));
ccd.addNestedComponent(registerDefaultGuiFactory(element, parserContext));
ccd.addNestedComponent(registerCollectionTableCellRenderer(element, parserContext));
// ccd.addNestedComponent(registerControlInitializer(element, parserContext));
parserContext.getReaderContext().fireComponentRegistered(ccd);
return null;
}
/**
* Register CollectionTableCellRenderer
* @param element
* @param parserContext
* @return
*/
private ComponentDefinition registerCollectionTableCellRenderer(Element element, ParserContext parserContext) {
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(CollectionTableCellRenderer.class);
bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), COLLECTION_TABLE_CELL_RENDERER_BEAN_NAME);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
/**
* @param registry
* @param bcd
*/
private void registerBeanComponentDefinition(Element element, ParserContext parserContext, BeanComponentDefinition bcd) {
parserContext.getDelegate().parseBeanDefinitionAttributes(element, bcd.getBeanName(), null,
(AbstractBeanDefinition) bcd.getBeanDefinition());
BeanDefinitionRegistry registry = parserContext.getRegistry();
registry.registerBeanDefinition(bcd.getBeanName(), bcd.getBeanDefinition());
}
/**
* @return
*/
private ComponentDefinition registerPaginatorView(Element element, ParserContext parserContext) {
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(PaginatorView.class);
bdb.addPropertyValue("pageSizes", "10,20,30,40,50,100,All");
bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), PAGINATOR_VIEW_BEAN_NAME);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
/**
* @return
*/
private ComponentDefinition registerBinderFactory(Element element, ParserContext parserContext) {
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(
ConfigurableBinderFactory.class);
bdb.addPropertyReference(ACCESSOR_FACTORY_BEAN_NAME, ACCESSOR_FACTORY_BEAN_NAME);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), BINDER_FACTORY_BEAN_NAME);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
/**
* @return
*/
private ComponentDefinition registerAccessorFactory(Element element, ParserContext parserContext) {
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(
ConfigurableControlAccessorFactory.class);
Map<Class<?>, Class<?extends ControlAccessor>> accessors =
new ManagedMap<Class<?>,Class<?extends ControlAccessor>>();
accessors.put(JTextComponent.class, TextComponentAccessor.class);
accessors.put(JList.class, ListAccessor.class);
accessors.put(Selector.class, SelectorAccessor.class);
accessors.put(JToggleButton.class, ToggleButtonAccessor.class);
accessors.put(JComboBox.class, ComboAccessor.class);
accessors.put(View.class, ViewAccessor.class);
accessors.put(JLabel.class, LabelAccessor.class);
accessors.put(TablePanel.class, TablePanelAccessor.class);
bdb.addPropertyValue("accessors", accessors);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(), ACCESSOR_FACTORY_BEAN_NAME);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
/**
* @return
*/
private ComponentDefinition registerPropertyEditors(Element element, ParserContext parserContext) {
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(
CustomEditorConfigurer.class);
Map<String, String> map = new HashMap<String, String>();
map.put("java.awt.Image", "org.jdal.beans.ImagePropertyEditor");
map.put("javax.swing.Icon", "org.jdal.beans.IconPropertyEditor");
bdb.addPropertyValue("customEditors", map);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
CUSTOM_EDITOR_CONFIGURER_BEAN_NAME);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
/**
* Register default TablePanel Actions
* @param element current element
* @param parserContext parserContext
* @return a new ComponentDefinition with default table action list.
*/
private ComponentDefinition registerDefaultTableActions(Element element, ParserContext parserContext) {
ManagedList<Object> actions = new ManagedList<Object>(7);
actions.add(createBeanDefinition(AddAction.class, parserContext));
actions.add(createBeanDefinition(SelectAllAction.class, parserContext));
actions.add(createBeanDefinition(DeselectAllAction.class, parserContext));
actions.add(createBeanDefinition(RemoveAllAction.class, parserContext));
actions.add(createBeanDefinition(HideShowFilterAction.class, parserContext));
actions.add(createBeanDefinition(ApplyFilterAction.class, parserContext));
actions.add(createBeanDefinition(ClearFilterAction.class, parserContext));
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(ListFactoryBean.class);
bdb.getRawBeanDefinition().setSource(parserContext.extractSource(element));
bdb.addPropertyValue("sourceList", actions);
bdb.setScope(BeanDefinition.SCOPE_PROTOTYPE);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
DEFAULT_TABLE_ACTIONS);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
/**
* @param clazz
* @return
*/
@SuppressWarnings("rawtypes")
private BeanDefinitionHolder createBeanDefinition(Class clazz, ParserContext parserContext) {
GenericBeanDefinition gbd = new GenericBeanDefinition();
gbd.setBeanClass(clazz);
gbd.setInitMethodName(INIT_METHOD_NAME);
BeanDefinitionHolder holder = new BeanDefinitionHolder(gbd,
parserContext.getReaderContext().generateBeanName(gbd));
return holder;
}
/**
* @param element
* @param parserContext
* @return
*/
private ComponentDefinition registerDefaultGuiFactory(Element element, ParserContext parserContext) {
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(
ApplicationContextGuiFactory.class);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
DEFAULT_GUI_FACTORY);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
/**
* @param element
* @param parserContext
* @return
*/
@SuppressWarnings("unused")
private ComponentDefinition registerControlInitializer(Element element, ParserContext parserContext) {
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(
AnnotationControlInitializer.class);
bdb.addPropertyReference(PERSISTENT_SERVICE, PERSISTENT_SERVICE);
BeanComponentDefinition bcd = new BeanComponentDefinition(bdb.getBeanDefinition(),
CONTROL_INITIALIZER);
registerBeanComponentDefinition(element, parserContext, bcd);
return bcd;
}
}