package com.redspr.redquerybuilder.core.client.expression; import java.util.ArrayList; import java.util.List; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.HorizontalPanel; import com.redspr.redquerybuilder.core.client.engine.Session; import com.redspr.redquerybuilder.core.client.engine.TableEvent; import com.redspr.redquerybuilder.core.client.engine.TableEventHandler; import com.redspr.redquerybuilder.core.client.table.JoinHelper; import com.redspr.redquerybuilder.core.client.table.TableFilter; import com.redspr.redquerybuilder.core.client.util.CommandListBox; import com.redspr.redquerybuilder.core.client.util.CommandWithLabel; import com.redspr.redquerybuilder.core.client.util.StringUtils; import com.redspr.redquerybuilder.core.shared.meta.Column; import com.redspr.redquerybuilder.core.shared.meta.Constraint; import com.redspr.redquerybuilder.core.shared.meta.ConstraintReferential; import com.redspr.redquerybuilder.core.shared.meta.Database; /** * A expression that represents a column of a table or view. */ public class ExpressionColumn extends Expression implements TableEventHandler { private Database database; private final String schemaName; private String tableAlias; private String columnName; private final HorizontalPanel hp = new HorizontalPanel(); public ExpressionColumn(Session session2, String schemaName2, String tableAlias2, String columnName2) { super(session2); this.schemaName = schemaName2; this.tableAlias = tableAlias2; this.columnName = columnName2; initWidget(hp); reg2 = getSession().getMsgBus().addHandler(TableEvent.TYPE, this); } public void selectConstraintRef(ConstraintReferential ref) { TableFilter targetTf = JoinHelper.getOrCreateFor(getSession(), ref); this.tableAlias = targetTf.getAlias(); this.columnName = targetTf.getTable().getColumns().iterator().next() .getName(); } public void updateColumn(String alias, Column col2) { this.tableAlias = alias; this.columnName = col2.getName(); } private final HandlerRegistration reg2; @Override public void onUnload() { super.onUnload(); if (reg2 != null) { reg2.removeHandler(); } } public Column getColumn() { return getSession().resolveColumn(tableAlias, getColumnName()); } public String getColumnName() { return columnName; } public String getQualifiedColumnName() { if (tableAlias == null) { return getColumnName(); } return tableAlias + "." + getColumnName(); } @Override public void onDirty() { hp.clear(); TableFilter tf = null; for (TableFilter tf2 : getSession().getFilters()) { if (StringUtils.equals(tableAlias, tf2.getAlias())) { tf = tf2; break; } else if (tf == null) { tf = tf2; } } Object hotValue = getColumn(); Command hotCommand = null; while (tf != null) { final CommandListBox ght = new CommandListBox(this); hp.insert(ght, 0); List<Command> items = new ArrayList(); // hotCommand = new ClearCommand(); // items.add(hotCommand); for (Constraint c : tf.getTable().getConstraints()) { if (c instanceof ConstraintReferential) { ConstraintReferential cr = (ConstraintReferential) c; if (!cr.isHidden()) { Command command = new ConstraintCommand(cr); if (cr == hotValue) { hotCommand = command; } items.add(command); } } } for (Column c : tf.getTable().getColumns()) { if (!c.isHidden()) { Command command = new ColumnCommand(tf.getAlias(), c); if (c == hotValue) { hotCommand = command; } items.add(command); } } ght.setValue(hotCommand); ght.setAcceptableValues(items); JoinHelper thing = JoinHelper.getParent(tf); if (thing != null) { tf = thing.getParent(); hotValue = thing.getConstraint(); } else { tf = null; } } } @Override public String getSQL(List args) { String sql; // if (column != null) { // sql = column.getSQL(); // } else { sql = Session.quoteIdentifier("" + getColumnName()); // } if (tableAlias != null) { sql = Session.quoteIdentifier(tableAlias) + "." + sql; } // if (schemaName != null) { // sql = Parser.quoteIdentifier(schemaName) + "." + sql; // } return sql; } @Override public void onTable(TableEvent e) { // Window.alert("Changed table"); } public TableFilter getTableFilter() { // return resolver == null ? null : resolver.getTableFilter(); for (TableFilter tf2 : getSession().getFilters()) { if (StringUtils.equals(tableAlias, tf2.getAlias())) { return tf2; } } return null; // XXX or blowup? } // private class ClearCommand extends Command2 { // ClearCommand() { // super("Please select..."); // } // // @Override // public void execute() { // // TOxDO 00 a Select "PLease select" for column and goes bang. in getSql? // // really want this at all? Ever selected? Defaults to first column... // // A) Default to first column and get rid of this // // B) Don't default and make this work ok // updateColumn(null, null); // } // } private class ColumnCommand extends CommandWithLabel { private final String alias; private final Column column; ColumnCommand(String a, Column c) { super(c); assert (c != null); this.alias = a; this.column = c; } @Override public void execute() { updateColumn(alias, column); } } private class ConstraintCommand extends CommandWithLabel { private final ConstraintReferential constraintReferential; ConstraintCommand(ConstraintReferential constraintReferential2) { super(constraintReferential2); this.constraintReferential = constraintReferential2; } @Override public void execute() { selectConstraintRef(constraintReferential); } } }