package com.hundsun.ares.studio.jres.basicdata.ui.editor.blocks;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IManagedForm;
import com.hundsun.ares.studio.core.ARESCore;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.jres.basicdata.constant.IBasicDataEpacakgeConstant;
import com.hundsun.ares.studio.jres.basicdata.constant.IBasicDataRestypes;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicdataFactory;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicdataPackage;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.EpacakgeDefineList;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.MasterSlaveLinkTable;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.MasterSlaveTable;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.PackageDefine;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.SingleTable;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.impl.MasterSlaveLinkTableImpl;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.impl.MasterSlaveTableImpl;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.impl.SingleTableImpl;
import com.hundsun.ares.studio.jres.basicdata.logic.epackage.BasicDataEpackageFactory;
import com.hundsun.ares.studio.jres.basicdata.ui.editor.pages.MaterSlaveLinkTableDetailPage;
import com.hundsun.ares.studio.jres.basicdata.ui.editor.pages.MaterSlaveTableDetailPage;
import com.hundsun.ares.studio.jres.basicdata.ui.editor.pages.SingelTableDetailPage;
import com.hundsun.ares.studio.model.reference.ReferenceInfo;
import com.hundsun.ares.studio.reference.ReferenceManager;
import com.hundsun.ares.studio.ui.FilteredTable;
import com.hundsun.ares.studio.ui.TableViewerPatternFilter;
import com.hundsun.ares.studio.ui.editor.EMFFormPage;
import com.hundsun.ares.studio.ui.editor.IEMFFormPage;
import com.hundsun.ares.studio.ui.editor.viewers.RefreshViewerJob;
import com.hundsun.ares.studio.ui.editor.viewers.SynRefreshViewerJob;
import com.hundsun.ares.studio.ui.validate.IProblemView;
import com.hundsun.ares.studio.ui.validate.ProblemPoolChangeEvent;
public class EPackageMasterBlock extends BaseBasicMasterDetailsBlock implements CommandStackListener {
private TableViewer viewer;
List<PackageDefine> input = new ArrayList<PackageDefine>();
IARESResource resource;
public EPackageMasterBlock(EMFFormPage page) {
super(page);
input = ((EpacakgeDefineList)page.getEditor().getInfo()).getItems();
resource = page.getEditor().getARESResource();
}
@Override
protected String getPageHeadName() {
return null;
}
@Override
protected String getSectionName() {
return "�������Ϣ�б�";
}
@Override
protected String getDescription() {
return null;
}
@Override
protected Object[] getElementTypes() {
return new Object[]{SingleTableImpl.class,MasterSlaveTableImpl.class,MasterSlaveLinkTableImpl.class};
}
@Override
protected IDetailsPage getDetailPage(Object type) {
IARESResource resource = page.getEditor().getARESResource();
if(type.equals(MasterSlaveLinkTableImpl.class)){
return new MaterSlaveLinkTableDetailPage(resource,viewer);
}else if(type.equals(MasterSlaveTableImpl.class)){
return new MaterSlaveTableDetailPage(resource,viewer);
}else{
return new SingelTableDetailPage(resource,viewer);
}
}
@Override
protected Viewer createViewer(Composite client, IManagedForm managedForm,
IEMFFormPage page) {
FilteredTable table = new FilteredTable(client, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.V_SCROLL, new TableViewerPatternFilter(), true);
viewer = table.getViewer();
viewer.getTable().setHeaderVisible(false);
viewer.getTable().setLinesVisible(false);
fillTableContents();
// �������tooltip��ʾ
ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.RECREATE);
return viewer;
}
@Override
protected void createToolBarActions(IManagedForm managedForm) {
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.page.masterdetail.JresBasicMasterDetailsBlock#createButtons(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtons(Composite client) {
Button btnRefresh = new Button(client, SWT.BORDER);
btnRefresh.setText("ˢ������");
btnRefresh.addSelectionListener(new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
try {
refreshBasicData();
} catch (Exception e2) {
e2.printStackTrace();
}
}
});
final Button btneAddd = new Button(client, SWT.BORDER);
btneAddd.setText("��������");
btneAddd.addSelectionListener(new SelectionAdapter(){
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
try {
BasicDataTypeDialog basicDataTypeDialog = new BasicDataTypeDialog(btneAddd.getShell());
int state = basicDataTypeDialog.open();
if(Dialog.OK == state){
int type = basicDataTypeDialog.getBasicDataType();
PackageDefine tableDefine = (PackageDefine) createBasicDataInfo("",type);
Command command = createPackageDefineCommand(tableDefine);
page.getEditor().getEditingDomain().getCommandStack().execute(command);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
final Button btnRemove = new Button(client, SWT.BORDER);
btnRemove.setText("ɾ������");
btnRemove.addSelectionListener(new SelectionAdapter(){
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
StructuredSelection structuredSelection = (StructuredSelection) viewer.getSelection();
Iterator<PackageDefine> iterator = structuredSelection.iterator();
List<PackageDefine> removePackageDefine = new ArrayList<PackageDefine>();
CompoundCommand command = new CompoundCommand("");
while(iterator.hasNext()){
PackageDefine packageDefine =(PackageDefine) iterator.next();
command.append(removePackageDefineCommand(packageDefine)) ;
removePackageDefine.add(packageDefine);
}
if(!command.isEmpty()){
page.getEditor().getEditingDomain().getCommandStack().execute(command);
}
clearCommand(command);
}
});
}
/**
* ������ϵ
* @param tableDefine
* @return
*/
private Command createPackageDefineCommand(PackageDefine tableDefine) {
EObject owner = page.getEditor().getInfo();
CompoundCommand command = new CompoundCommand("");
command.append(AddCommand.create(page.getEditor().getEditingDomain(), owner, BasicdataPackage.Literals.EPACAKGE_DEFINE_LIST__ITEMS, tableDefine));
return command.unwrap();
}
/**
* ɾ����ϵ
* @param tableDefine
* @return
*/
private Command removePackageDefineCommand(PackageDefine tableDefine) {
EObject owner = page.getEditor().getInfo();
CompoundCommand command = new CompoundCommand("");
command.append(RemoveCommand.create(page.getEditor().getEditingDomain(), owner, BasicdataPackage.Literals.EPACAKGE_DEFINE_LIST__ITEMS, tableDefine));
return command.unwrap();
}
/**
* ˢ�»������ݹ���
* @param tableDefines
* @return
*/
private Command refreshPackageDefineCommand(List<PackageDefine>tableDefines) {
CompoundCommand command = new CompoundCommand("");
EpacakgeDefineList resourceInfo;
try {
resourceInfo = resource.getInfo(EpacakgeDefineList.class);
command.append(RemoveCommand.create(page.getEditor().getEditingDomain(), resourceInfo,BasicdataPackage.Literals.EPACAKGE_DEFINE_LIST__ITEMS,resourceInfo.getItems()));
//command.append(AddCommand.create(page.getEditor().getEditingDomain(), resourceInfo, BasicdataPackage.Literals.EPACAKGE_DEFINE_LIST__ITEMS, tableDefines));
} catch (ARESModelException e) {
e.printStackTrace();
}
return command.unwrap();
}
private void refreshBasicData() throws Exception{
EpacakgeDefineList resourceInfo = resource.getInfo(EpacakgeDefineList.class);
IProject project = resource.getARESProject().getProject();
List<PackageDefine> defines = fillEpackageDefineList(resource.getARESProject());
Command refreshCommand = refreshPackageDefineCommand(defines);
page.getEditor().getEditingDomain().getCommandStack().execute(refreshCommand);
//��Σ�ˢ�»���
for(PackageDefine item:resourceInfo.getItems()){
IFile file = project.getFile(item.getUrl());
IARESResource resource = (IARESResource)ARESCore.create(file);
BasicDataEpackageFactory.eINSTANCE.clearEPackage(resource);
}
}
/**
* @param input the input to set
*/
public void setInput(List<PackageDefine> input) {
this.input = input;
viewer.setInput(input);
}
/**
* ������Դģ��
* @param url
* @return
* @throws Exception
*/
private PackageDefine createBasicDataInfo(String url,int type)throws Exception{
PackageDefine tableDefine = createPackageDefine(url,type);
return tableDefine;
}
private PackageDefine createPackageDefine(String path,int type){
PackageDefine defineObj = null;
switch (type) {
case 0:
SingleTable table = BasicdataFactory.eINSTANCE.createSingleTable();
table.setMaster("");
defineObj = table;
break;
case 1:
MasterSlaveTable mtable = BasicdataFactory.eINSTANCE.createMasterSlaveTable();
mtable.setMaster("");
mtable.setSlave("");
defineObj = mtable;
break;
case 2:
MasterSlaveLinkTable mltable = BasicdataFactory.eINSTANCE.createMasterSlaveLinkTable();
mltable.setMaster("");
mltable.setSlave("");
mltable.setLink("");
defineObj = mltable;
break;
default:
break;
}
defineObj.setType(getBasicDataType());
defineObj.setUrl(path);
return defineObj;
}
/**
* ��ȡ����
* @return
* @throws Exception
*/
private String getBasicDataType(){
String type ="";
try {
type = StringUtils.defaultString(resource.getARESProject().getProjectProperty().getString(IBasicDataEpacakgeConstant.Property_Basic_Data_type_ID));
} catch (ARESModelException e) {
e.printStackTrace();
}
return type;
}
private List<PackageDefine> fillEpackageDefineList(IARESProject project) throws Exception{
List<PackageDefine> defines = new ArrayList<PackageDefine>();
List<ReferenceInfo> infos = ReferenceManager.getInstance().getReferenceInfos(project, IBasicDataRestypes.singleTable, true);
List<ReferenceInfo> msInfos = ReferenceManager.getInstance().getReferenceInfos(project, IBasicDataRestypes.MasterSlaveTable, true);
List<ReferenceInfo> mslInfos = ReferenceManager.getInstance().getReferenceInfos(project, IBasicDataRestypes.MasterSlaveLinkTable, true);
for(ReferenceInfo info : infos){
if (StringUtils.equals(info.getResource().getResource().getFileExtension(), IBasicDataRestypes.singleTable)) {
Object define = (Object) BasicDataEpackageFactory.eINSTANCE.getDefine(info.getResource());
if (define instanceof PackageDefine) {
defines.add((PackageDefine) define);
}else {
SingleTable pd = BasicdataFactory.eINSTANCE.createSingleTable();
pd.setType("jres.db.table");
pd.setUrl(StringUtils.substringAfter(info.getResource().getResource().getLocation().toOSString(), info.getResource().getARESProject().getElementName() + "\\"));
pd.setMaster(StringUtils.EMPTY);
defines.add(pd);
}
}
}
for(ReferenceInfo info : msInfos){
if (StringUtils.equals(info.getResource().getResource().getFileExtension(), IBasicDataRestypes.MasterSlaveTable)) {
Object define = (Object) BasicDataEpackageFactory.eINSTANCE.getDefine(info.getResource());
if (define instanceof PackageDefine) {
defines.add((PackageDefine) define);
}else {
MasterSlaveTable mst = BasicdataFactory.eINSTANCE.createMasterSlaveTable();
mst.setType("jres.db.table");
mst.setUrl(StringUtils.substringAfter(info.getResource().getResource().getLocation().toOSString(), info.getResource().getARESProject().getElementName() + "\\"));
mst.setMaster(StringUtils.EMPTY);
mst.setSlave(StringUtils.EMPTY);
defines.add(mst);
}
}
}
for(ReferenceInfo info : mslInfos){
if (StringUtils.equals(info.getResource().getResource().getFileExtension(), IBasicDataRestypes.MasterSlaveLinkTable)) {
Object define = (Object) BasicDataEpackageFactory.eINSTANCE.getDefine(info.getResource());
if (define instanceof PackageDefine) {
defines.add((PackageDefine) define);
}else {
MasterSlaveLinkTable mst = BasicdataFactory.eINSTANCE.createMasterSlaveLinkTable();
mst.setType("jres.db.table");
mst.setUrl(StringUtils.substringAfter(info.getResource().getResource().getLocation().toOSString(), info.getResource().getARESProject().getElementName() + "\\"));
mst.setMaster(StringUtils.EMPTY);
mst.setSlave(StringUtils.EMPTY);
mst.setLink(StringUtils.EMPTY);
defines.add(mst);
}
}
}
return defines;
}
private void fillTableContents() {
TableViewerColumn column = new TableViewerColumn(viewer, SWT.LEFT);
column.setLabelProvider(new BlockLabelProvider(page.getProblemPool()));
column.getColumn().setWidth(500);
column.getColumn().setText("���������б�");
viewer.setContentProvider(new ArrayContentProvider());
viewer.setInput(input);
page.getProblemPool().addView(new IProblemView() {
@Override
public void refresh(ProblemPoolChangeEvent event) {
//�������꣬������ˢ��
Object[] problems = ArrayUtils.addAll(event.getAddProblems(), event.getRemoveedProblems());
Set<Object> objects = new HashSet<Object>();
for (Object problem : problems) {
EObject eObj = (EObject) ((Diagnostic)problem).getData().get(0);
objects.add( eObj );
}
RefreshViewerJob.refresh(viewer, objects.toArray(), true);
}
});
}
/**
* �������ݹ�����ϵѡ��
* @author liaogc
*
*/
class BasicDataTypeDialog extends Dialog{
private int basicDataType = 0;
/**
* @param parentShell
*/
protected BasicDataTypeDialog(Shell parentShell) {
super(parentShell);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Group groupModeSelect = new Group(parent, SWT.BORDER);
groupModeSelect.setText("ģʽѡ��");
RowLayout layout = new RowLayout(SWT.HORIZONTAL);
groupModeSelect.setLayout(layout);
Button radioSingle = new Button(groupModeSelect, SWT.RADIO);
radioSingle.setSelection(true);
radioSingle.setText("����");
radioSingle.setSelection(true); // ��ʼ��
Button radioMasterSlave = new Button(groupModeSelect, SWT.RADIO);
radioMasterSlave.setText("���ӱ�");
Button radioMasterSlaveLink = new Button(groupModeSelect, SWT.RADIO);
radioMasterSlaveLink.setText("���ӹ�����");
// ��Ӽ�����
radioSingle.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
basicDataType = 0;
}
});
radioMasterSlave.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
basicDataType = 1;
}
});
radioMasterSlaveLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
basicDataType = 2;
}
});
applyDialogFont(groupModeSelect);
return groupModeSelect;
}
/**
* @return the basicDataType
*/
public int getBasicDataType() {
return basicDataType;
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.CommandStackListener#commandStackChanged(java.util.EventObject)
*/
@Override
public void commandStackChanged(EventObject event) {
RefreshViewerJob.refresh(viewer, null, false);
Command cmd = ((CommandStack)event.getSource()).getMostRecentCommand();
if (cmd != null) {
SynRefreshViewerJob.refresh(viewer, cmd.getAffectedObjects().toArray() ,cmd ,BasicdataPackage.Literals.PACKAGE_DEFINE__URL);
}
}
protected void clearCommand(Command command) {
if (command != null) {
command.dispose();
command = null;
}
}
}