package org.insightech.er.editor.view.dialog.element.relation;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.insightech.er.ResourceString;
import org.insightech.er.common.dialog.AbstractDialog;
import org.insightech.er.common.widgets.CompositeFactory;
import org.insightech.er.editor.model.diagram_contents.element.connection.Relation;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn;
import org.insightech.er.editor.model.diagram_contents.element.node.table.unique_key.ComplexUniqueKey;
import org.insightech.er.util.Check;
import org.insightech.er.util.Format;
public class RelationDialog extends AbstractDialog {
private Relation relation;
private Text nameText;
private Text parentTableNameText;
private Combo columnCombo;
private Combo parentCardinalityCombo;
private Combo childCardinalityCombo;
private Combo onUpdateCombo;
private Combo onDeleteCombo;
private ColumnComboInfo columnComboInfo;
public RelationDialog(Shell parentShell, Relation relation) {
super(parentShell, 2);
this.relation = relation;
}
/**
* {@inheritDoc}
*/
@Override
protected void initialize(Composite composite) {
CompositeFactory.createLabel(composite, "label.constraint.name", 2);
this.nameText = CompositeFactory.createText(this, composite, null, 2,
false);
createMethodGroup(composite);
int size = createParentGroup(composite);
createChildGroup(composite, size);
}
private void createMethodGroup(Composite composite) {
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalSpan = 2;
gridData.horizontalAlignment = GridData.FILL;
Group group = new Group(composite, SWT.NONE);
group.setLayoutData(gridData);
group.setLayout(gridLayout);
group.setText(ResourceString
.getResourceString("label.reference.operation"));
Label label1 = new Label(group, SWT.NONE);
label1.setText("ON UPDATE");
createOnUpdateCombo(group);
Label label2 = new Label(group, SWT.NONE);
label2.setText("ON DELETE");
createOnDeleteCombo(group);
}
private void createOnUpdateCombo(Group group) {
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
onUpdateCombo = new Combo(group, SWT.NONE);
onUpdateCombo.setLayoutData(gridData);
onUpdateCombo.add("RESTRICT");
onUpdateCombo.add("CASCADE");
onUpdateCombo.add("NO ACTION");
onUpdateCombo.add("SET NULL");
onUpdateCombo.add("SET DEFAULT");
}
private void createOnDeleteCombo(Group group) {
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
onDeleteCombo = new Combo(group, SWT.NONE);
onDeleteCombo.setLayoutData(gridData);
onDeleteCombo.add("RESTRICT");
onDeleteCombo.add("CASCADE");
onDeleteCombo.add("NO ACTION");
onDeleteCombo.add("SET NULL");
onDeleteCombo.add("SET DEFAULT");
}
private int createParentGroup(Composite composite) {
GridLayout gridLayout = new GridLayout();
gridLayout.verticalSpacing = 10;
gridLayout.marginHeight = 10;
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
Group group = new Group(composite, SWT.NONE);
group.setLayoutData(gridData);
group.setLayout(gridLayout);
group.setText(ResourceString.getResourceString("label.parent"));
Composite upperComposite = new Composite(group, SWT.NONE);
upperComposite.setLayoutData(gridData);
upperComposite.setLayout(gridLayout);
Label label1 = new Label(upperComposite, SWT.NONE);
label1.setText(ResourceString
.getResourceString("label.reference.table"));
parentTableNameText = new Text(upperComposite, SWT.BORDER
| SWT.READ_ONLY);
parentTableNameText.setLayoutData(gridData);
Label label2 = new Label(upperComposite, SWT.NONE);
label2.setText(ResourceString
.getResourceString("label.reference.column"));
this.createColumnCombo(upperComposite);
this.createParentMandatoryGroup(group);
upperComposite.pack();
return upperComposite.getSize().y;
}
/**
* This method initializes group1
*
*/
private void createChildGroup(Composite composite, int size) {
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 10;
gridLayout.verticalSpacing = 10;
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
Group group = new Group(composite, SWT.NONE);
group.setLayoutData(gridData);
group.setLayout(gridLayout);
group.setText(ResourceString.getResourceString("label.child"));
Label filler = new Label(group, SWT.NONE);
filler.setText("");
GridData fillerGridData = new GridData();
fillerGridData.heightHint = size;
filler.setLayoutData(fillerGridData);
this.createChildMandatoryGroup(group);
}
private void createColumnCombo(Composite parent) {
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
this.columnCombo = new Combo(parent, SWT.READ_ONLY);
this.columnCombo.setLayoutData(gridData);
this.columnCombo.setVisibleItemCount(20);
this.columnComboInfo = setReferencedColumnComboData(this.columnCombo,
(ERTable) relation.getSourceTableView());
}
public static ColumnComboInfo setReferencedColumnComboData(
Combo columnCombo, ERTable table) {
ColumnComboInfo info = new ColumnComboInfo();
int primaryKeySize = table.getPrimaryKeySize();
if (primaryKeySize != 0) {
columnCombo.add("PRIMARY KEY");
info.complexUniqueKeyStartIndex = 1;
info.candidatePK = true;
} else {
info.complexUniqueKeyStartIndex = 0;
info.candidatePK = false;
}
for (ComplexUniqueKey complexUniqueKey : table
.getComplexUniqueKeyList()) {
columnCombo.add(complexUniqueKey.getLabel());
}
info.columnStartIndex = info.complexUniqueKeyStartIndex
+ table.getComplexUniqueKeyList().size();
for (NormalColumn column : table.getNormalColumns()) {
if (column.isUniqueKey()) {
columnCombo.add(column.getLogicalName());
info.candidateColumns.add(column);
}
}
return info;
}
private void createParentMandatoryGroup(Group parent) {
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 10;
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
Group group = new Group(parent, SWT.NONE);
group.setLayout(gridLayout);
group.setLayoutData(gridData);
group.setText(ResourceString.getResourceString("label.mandatory"));
parentCardinalityCombo = new Combo(group, SWT.NONE);
parentCardinalityCombo.setLayoutData(gridData);
parentCardinalityCombo.setVisibleItemCount(5);
parentCardinalityCombo.add("1");
parentCardinalityCombo.add("0..1");
}
private void createChildMandatoryGroup(Group parent) {
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 10;
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
Group group = new Group(parent, SWT.NONE);
group.setLayout(gridLayout);
group.setLayoutData(gridData);
group.setText(ResourceString.getResourceString("label.mandatory"));
childCardinalityCombo = new Combo(group, SWT.NONE);
childCardinalityCombo.setLayoutData(gridData);
childCardinalityCombo.setVisibleItemCount(5);
childCardinalityCombo.add("1..n");
childCardinalityCombo.add("0..n");
childCardinalityCombo.add("1");
childCardinalityCombo.add("0..1");
}
/**
* {@inheritDoc}
*/
@Override
protected void setData() {
ERTable sourceTable = (ERTable) this.relation.getSourceTableView();
this.nameText.setText(Format.null2blank(this.relation.getName()));
if (this.relation.getOnUpdateAction() != null) {
this.onUpdateCombo.setText(this.relation.getOnUpdateAction());
}
if (this.relation.getOnDeleteAction() != null) {
this.onDeleteCombo.setText(this.relation.getOnDeleteAction());
}
if (!Check.isEmpty(this.relation.getParentCardinality())) {
this.parentCardinalityCombo.setText(this.relation
.getParentCardinality());
} else {
this.parentCardinalityCombo.select(0);
}
if (!Check.isEmpty(this.relation.getChildCardinality())) {
this.childCardinalityCombo.setText(this.relation
.getChildCardinality());
} else {
this.childCardinalityCombo.select(0);
}
if (this.relation.isReferenceForPK()) {
this.columnCombo.select(0);
} else if (this.relation.getReferencedComplexUniqueKey() != null) {
for (int i = 0; i < sourceTable.getComplexUniqueKeyList().size(); i++) {
if (sourceTable.getComplexUniqueKeyList().get(i) == this.relation
.getReferencedComplexUniqueKey()) {
this.columnCombo.select(i
+ this.columnComboInfo.complexUniqueKeyStartIndex);
break;
}
}
} else {
for (int i = 0; i < this.columnComboInfo.candidateColumns.size(); i++) {
if (this.columnComboInfo.candidateColumns.get(i) == this.relation
.getReferencedColumn()) {
this.columnCombo.select(i
+ this.columnComboInfo.columnStartIndex);
break;
}
}
}
if (this.relation.isReferedStrictly()) {
this.columnCombo.setEnabled(false);
}
this.parentTableNameText.setText(this.relation.getSourceTableView()
.getLogicalName());
}
/**
* {@inheritDoc}
*/
@Override
protected void perfomeOK() {
this.relation.setName(this.nameText.getText());
this.relation.setOnDeleteAction(this.onDeleteCombo.getText());
this.relation.setOnUpdateAction(this.onUpdateCombo.getText());
this.relation.setChildCardinality(this.childCardinalityCombo.getText());
this.relation.setParentCardinality(this.parentCardinalityCombo
.getText());
int index = this.columnCombo.getSelectionIndex();
if (index < this.columnComboInfo.complexUniqueKeyStartIndex) {
this.relation.setReferenceForPK(true);
this.relation.setReferencedComplexUniqueKey(null);
this.relation.setReferencedColumn(null);
} else if (index < this.columnComboInfo.columnStartIndex) {
ComplexUniqueKey complexUniqueKey = ((ERTable) this.relation
.getSourceTableView()).getComplexUniqueKeyList().get(
index - this.columnComboInfo.complexUniqueKeyStartIndex);
this.relation.setReferenceForPK(false);
this.relation.setReferencedComplexUniqueKey(complexUniqueKey);
this.relation.setReferencedColumn(null);
} else {
NormalColumn sourceColumn = this.columnComboInfo.candidateColumns
.get(index - this.columnComboInfo.columnStartIndex);
this.relation.setReferenceForPK(false);
this.relation.setReferencedComplexUniqueKey(null);
this.relation.setReferencedColumn(sourceColumn);
}
}
@Override
protected String getErrorMessage() {
String text = nameText.getText().trim();
if (!Check.isAlphabet(text)) {
return "error.constraint.name.not.alphabet";
}
return null;
}
@Override
protected String getTitle() {
return "dialog.title.relation";
}
public static class ColumnComboInfo {
public List<NormalColumn> candidateColumns;
public int complexUniqueKeyStartIndex;
public int columnStartIndex;
public boolean candidatePK;
public ColumnComboInfo() {
this.candidateColumns = new ArrayList<NormalColumn>();
}
}
}