package org.reldb.dbrowser.ui.content.rev.operators;
import java.util.Iterator;
import java.util.Vector;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.reldb.dbrowser.ui.content.rev.OperatorWithControlPanel;
import org.reldb.dbrowser.ui.content.rev.Rev;
import org.reldb.rel.client.Tuple;
import org.reldb.rel.client.Tuples;
import org.reldb.rel.utilities.StringUtils;
public class Extend extends OperatorWithControlPanel {
private static class Extending {
private String expression;
private String as;
Extending(String expression, String as) {
this.expression = expression;
this.as = as;
}
Extending() {
this.expression = "";
this.as = "";
}
String getExpression() {return expression;}
void setExpression(String expression) {this.expression = expression;}
String getAs() {return as;}
void setAs(String as) {this.as = as;}
public String toString() {
return as + " := " + expression;
}
}
private Vector<Extending> extendings;
public Extend(Rev rev, String name, int xpos, int ypos) {
super(rev, name, "EXTEND", xpos, ypos);
addParameter("Operand");
load();
pack();
}
private String getSpecificationAsString() {
String specification = "";
for (Extending extending: extendings) {
if (extending.getAs().trim().length() == 0)
continue;
if (specification.length() > 0)
specification += ", ";
specification += extending.toString();
}
return specification;
}
private String getSpecificationAsRelation() {
int id = 0;
String specification = "RELATION {ID INTEGER, attribute CHAR, expression CHAR} {\n";
for (Extending extending: extendings) {
if (extending.getAs().trim().length() == 0)
continue;
if (id > 0)
specification += ",\n";
specification += " TUPLE {";
specification += "ID " + (id++) + ", ";
specification += "attribute '" + extending.getAs() + "', ";
specification += "expression '" + StringUtils.quote(extending.getExpression()) + "'}";
}
specification += "}";
return specification;
}
protected void load() {
extendings = new Vector<Extending>();
Tuples tuples = getDatabase().getPreservedStateExtend(getID());
if (tuples == null)
return;
Iterator<Tuple> i = tuples.iterator();
while (i.hasNext()) {
Tuple t = i.next();
extendings.add(new Extending(StringUtils.unquote(t.getAttributeValue("expression").toString()), t.getAttributeValue("attribute").toString()));
}
extendings.add(new Extending());
operatorLabel.setText(getSpecificationAsString());
}
private void save() {
getDatabase().updatePreservedStateExtend(getID(), getSpecificationAsRelation());
}
private void addRow(Composite parent, Extending r) {
Text as = new Text(parent, SWT.NONE);
as.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
as.setText(r.getAs());
as.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
r.setAs(as.getText());
}
});
new Label(parent, SWT.NONE);
Text expression = new Text(parent, SWT.NONE);
expression.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
expression.setText(r.getExpression());
expression.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
r.setExpression(expression.getText());
}
});
}
@Override
protected void buildControlPanel(Composite container) {
container.setLayout(new GridLayout(3, false));
(new Label(container, SWT.None)).setText("Attribute");
(new Label(container, SWT.None)).setText(":=");
(new Label(container, SWT.None)).setText("Expression");
for (Extending extending: extendings)
addRow(container, extending);
addRowAddButton(container);
}
private void addRowAddButton(Composite container) {
Button addRow = new Button(container, SWT.None);
addRow.setText("+");
addRow.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
addRow.dispose();
Extending extending = new Extending();
extendings.addElement(extending);
addRow(container, extending);
addRowAddButton(container);
container.getShell().pack();
}
});
}
@Override
protected void controlPanelOkPressed() {
operatorLabel.setText(getSpecificationAsString());
save();
pack();
}
@Override
public String getQuery() {
String source = getQueryForParameterUnparenthesised(0);
if (source == null)
return null;
return "EXTEND " + source + ": {" + operatorLabel.getText() + "}";
}
protected void delete() {
getDatabase().removeOperator_Extend(getID());
super.delete();
}
}