/*******************************************************************************
* Copyright (c) 2010-2013 Redspr Ltd.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sam Hough - initial API and implementation
*******************************************************************************/
package com.redspr.redquerybuilder.core.client.expression;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.DateBox;
import com.redspr.redquerybuilder.core.client.engine.Session;
import com.redspr.redquerybuilder.core.client.util.NumberBox;
import com.redspr.redquerybuilder.core.shared.meta.Cardinality;
import com.redspr.redquerybuilder.core.shared.meta.Column;
import com.redspr.redquerybuilder.core.shared.meta.Editor;
import com.redspr.redquerybuilder.core.shared.meta.Editor.DateEditor;
import com.redspr.redquerybuilder.core.shared.meta.Editor.SelectEditor;
import com.redspr.redquerybuilder.core.shared.meta.Operator;
import com.redspr.redquerybuilder.core.shared.meta.SuggestEditor;
// register cardinality and editor...
public class EditorWidgetFactory {
private static final Map<Object, Factory> KEY_TO_FACTORY =
new HashMap<Object, Factory>();
interface Factory {
Widget create(Session session, Column column);
}
private static void add(Class editorClass, Cardinality card, Factory factory) {
Object key = editorClass.getName() + "_" + card.name();
KEY_TO_FACTORY.put(key, factory);
}
static {
add(Editor.TextEditor.class, Cardinality.ONE, new Factory() {
@Override
public Widget create(Session session, Column column) {
return new TextBox();
}
});
add(SuggestEditor.class, Cardinality.ONE, new Factory() {
@Override
public Widget create(Session session, Column column) {
return new SuggestEditorWidget(session, column);
}
});
add(Editor.DateEditor.class, Cardinality.ONE, new Factory() {
@Override
public Widget create(Session session, Column column) {
DateBox dateBox = new DateBox();
String pattern = (String) column.getEditor().getAttribute(DateEditor.FORMAT);
if (pattern != null) {
dateBox.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat(pattern)));
}
return dateBox;
}
});
add(Editor.NumberEditor.class, Cardinality.ONE, new Factory() {
@Override
public Widget create(Session session, Column column) {
return new NumberBox(session, column);
}
});
add(SelectEditor.class, Cardinality.ONE, new Factory() {
@Override
public Widget create(Session session, Column column) {
return new SelectEditorWidget(session, column, false);
}
});
add(SelectEditor.class, Cardinality.MULTI, new Factory() {
@Override
public Widget create(Session session, Column column) {
return new SelectEditorWidget(session, column, true);
}
});
}
/**
*
* @param col
* @param operator
* @return an, opaque, key. Only equals and hashCode should be used.
*/
static Object createKey(Column col, Operator operator) {
return col.getEditor().getClass().getName() + "_" + operator.getCardinality().name();
}
static Widget create(Object key, Session session, Column col) {
Factory factory = KEY_TO_FACTORY.get(key);
if (factory == null) {
throw new RuntimeException("Unknown editor " + col.getEditor());
}
return factory.create(session, col);
}
}