package com.hundsun.ares.studio.jres.clearinghouse.ui;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.jres.model.database.DatabasePackage;
import com.hundsun.ares.studio.jres.model.database.ForeignKey;
import com.hundsun.ares.studio.jres.model.database.TableColumn;
import com.hundsun.ares.studio.jres.model.database.TableKey;
import com.hundsun.ares.studio.jres.model.database.key_type;
import com.hundsun.ares.studio.ui.editor.extend.ExtensibleModelColumnViewerProblemView;
import com.hundsun.ares.studio.ui.editor.extend.ExtensibleModelUtils;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnLabelProvider;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnViewerProblemView;
import com.hundsun.ares.studio.ui.editor.viewers.ReferenceTreeContentProvider;
/**
* ѡ��Լ���ĶԻ���
* @author sundl
*
*/
public class ConstraintSelectionDialog extends Dialog {
private IARESResource resource;
private EObject input;
private CheckboxTreeViewer treeViewer;
private String title;
private TableKey[] result = new TableKey[0];
public ConstraintSelectionDialog(Shell parentShell, IARESResource resource, EObject input) {
super(parentShell);
this.resource = resource;
this.input = input;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(title == null ? "ѡ����" : title);
}
public void setTitle(String title) {
this.title = title;
}
public IARESResource getResource() {
return this.resource;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
composite.setLayout(new GridLayout(1, false));
treeViewer = new CheckboxTreeViewer(composite, SWT.CHECK | SWT.BORDER);
treeViewer.setContentProvider(new ReferenceTreeContentProvider(DatabasePackage.Literals.TABLE_RESOURCE_DATA__KEYS));
treeViewer.getTree().setHeaderVisible(true);
treeViewer.getTree().setLinesVisible(true);
createColumns(treeViewer);
treeViewer.setInput(input);
GridDataFactory.fillDefaults().hint(-1, 300).applyTo(treeViewer.getTree());
return composite;
}
protected void createColumns(TreeViewer viewer) {
final TreeViewer treeViewer = (TreeViewer) viewer;
// ����һ�����
EObjectColumnViewerProblemView problemView = new EObjectColumnViewerProblemView(treeViewer);
// ������չ��
EObjectColumnViewerProblemView exProblemView = new ExtensibleModelColumnViewerProblemView(treeViewer);
{
EAttribute attribute = DatabasePackage.Literals.TABLE_KEY__MARK;
final TreeViewerColumn tvColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
tvColumn.getColumn().setWidth(100);
tvColumn.getColumn().setText("���");
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(attribute);
tvColumn.setLabelProvider(provider);
tvColumn.getColumn().setMoveable(true);
}
// �ֶ���
{
EAttribute attribute = DatabasePackage.Literals.TABLE_KEY__NAME;
TreeViewerColumn tvColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
tvColumn.getColumn().setWidth(200);
tvColumn.getColumn().setText("Լ����");
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(attribute);
tvColumn.setLabelProvider(provider);
tvColumn.getColumn().setMoveable(true);
}
// ����
{
EAttribute attribute = DatabasePackage.Literals.TABLE_KEY__TYPE;
final TreeViewerColumn tvColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
tvColumn.getColumn().setWidth(130);
tvColumn.getColumn().setText("����");
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(attribute);
tvColumn.setLabelProvider(provider);
}
// �ֶ��б�
{
EStructuralFeature feature = DatabasePackage.Literals.TABLE_KEY__COLUMNS;
final TreeViewerColumn tvColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
tvColumn.getColumn().setWidth(150);
tvColumn.getColumn().setText("�ֶ��б�");
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(feature){
@Override
public String getText(Object element) {
StringBuffer buffer = new StringBuffer();
if(element instanceof TableKey){
TableKey tableKey = (TableKey)element;
EList<TableColumn> colunms = tableKey.getColumns();
for(int index=0; index<colunms.size(); index++){
if(index > 0){
buffer.append(",");
}
buffer.append(colunms.get(index).getName());
}
}
return buffer.toString();
}
};
tvColumn.setLabelProvider(provider);
tvColumn.getColumn().setMoveable(true);
}
// ���
{
EStructuralFeature feature = DatabasePackage.Literals.TABLE_KEY__FOREIGN_KEY;
final TreeViewerColumn tvColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
tvColumn.getColumn().setWidth(150);
tvColumn.getColumn().setText("���");
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(feature) {
public String getText(Object element) {
if(element instanceof TableKey){
TableKey modify = (TableKey) element;
EList<ForeignKey> foreignKey = modify.getForeignKey();
StringBuffer buffer = new StringBuffer();
for (int i = 0, length = foreignKey.size(); i < length; i++) {
if (i == 0) {
String tableName = foreignKey.get(0).getTableName();
String shortName = StringUtils.substringAfterLast(tableName, ".");
buffer.append(shortName + "(");
}
buffer.append(foreignKey.get(i).getFieldName());
if (i < length - 1)
buffer.append(",");
else
buffer.append(")");
}
return buffer.toString();
}
return StringUtils.EMPTY;
}
@Override
public Color getBackground(Object element) {
if (resource != null && resource.isReadOnly()) {
return Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
}
TableKey key = (TableKey)element;
if(!key.getType().equals(key_type.FOREIGN)){
return Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
}
return super.getBackground(element);
}
};
tvColumn.setLabelProvider(provider);
tvColumn.getColumn().setMoveable(true);
}
ExtensibleModelUtils.createExtensibleModelTreeViewerColumns(
treeViewer, resource, DatabasePackage.Literals.TABLE_KEY, exProblemView);
}
public CheckboxTreeViewer getTreeViewer() {
return this.treeViewer;
}
@Override
protected void okPressed() {
List<TableKey> columns = new ArrayList<TableKey>();
for (Object obj : treeViewer.getCheckedElements()) {
columns.add((TableKey) obj);
}
this.result = columns.toArray(new TableKey[0]);
super.okPressed();
}
public TableKey[] getSelection() {
return result;
}
}