package com.hundsun.ares.studio.jres.metadata.ui.menu.actions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.jres.metadata.ui.MetadataUI;
import com.hundsun.ares.studio.jres.metadata.ui.actions.IMetadataActionIDConstant;
import com.hundsun.ares.studio.jres.model.metadata.Function;
import com.hundsun.ares.studio.jres.model.metadata.FunctionProxy;
import com.hundsun.ares.studio.jres.model.metadata.MenuItem;
import com.hundsun.ares.studio.jres.model.metadata.MetadataFactory;
import com.hundsun.ares.studio.jres.model.metadata.MetadataPackage;
import com.hundsun.ares.studio.jres.model.metadata.util.MenuUtils;
import com.hundsun.ares.studio.ui.editor.actions.IUpdateAction;
import com.hundsun.ares.studio.ui.userdialog.CheckedTableSelectionDialog;
public class BatchAddFunctionProxyAction extends Action implements IUpdateAction{
TableViewer viewer;
EditingDomain domain;
IARESResource resource;
Map<FunctionProxy,Function> inputMap = new HashMap<FunctionProxy,Function>();
private static final String[] TITLES = {"���ܺ�","��������","��ע"};
public static final EAttribute[] ATTRIBUTES = new EAttribute[] {
MetadataPackage.Literals.NAMED_ELEMENT__NAME,
MetadataPackage.Literals.NAMED_ELEMENT__CHINESE_NAME,
MetadataPackage.Literals.NAMED_ELEMENT__DESCRIPTION
};
{
if(MenuUtils.isStockDepartment()){
TITLES[0] = "���ܺ�";
ATTRIBUTES[0] = MetadataPackage.Literals.NAMED_ELEMENT__NAME;
}else{
TITLES[0] = "�ӽ���";
ATTRIBUTES[0] = MetadataPackage.Literals.FUNCTION__SUB_TRANS_CODE;
}
}
public BatchAddFunctionProxyAction(TableViewer viewer,EditingDomain domain, IARESResource resource) {
super();
this.viewer = viewer;
this.domain = domain;
this.resource = resource;
setId(IMetadataActionIDConstant.CV_BATCH_ADD);
setText("�������");
setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(MetadataUI.PLUGIN_ID, "icons/full/obj16/batchedAdd.png"));
}
@Override
public void run() {
List<FunctionProxy> inputList = new ArrayList<FunctionProxy>();
List<FunctionProxy> initialList = new ArrayList<FunctionProxy>();
List<FunctionProxy> demodedList = new ArrayList<FunctionProxy>();
calculateFunctionProxyParams(inputList, initialList, demodedList);
FunctionProxySelectionDialog dialog = new FunctionProxySelectionDialog(viewer.getControl().getShell());
dialog.setInput(inputList);
dialog.setInitialElementSelections(initialList);
dialog.setDemodedElements(demodedList);
if(dialog.open() == Window.OK) {
List<FunctionProxy> results = dialog.getSelectedResults();
MenuItem item = (MenuItem)viewer.getInput();
Command command = SetCommand.create(domain, item, MetadataPackage.Literals.MENU_ITEM__FUNCTION_PROXYS, results);
if(command.canExecute()){
domain.getCommandStack().execute(command);
}
viewer.refresh();
}
}
@Override
public void update() {
Object obj = viewer.getInput();
setEnabled(obj != null && (obj instanceof MenuItem) && !resource.isReadOnly());
}
/**
* ����������ӳ�ʼ�б�
*
* @param inputList ��ʼ�б�
* @param initialList Ĭ��ѡ���б�
* @param demodedList �ѹ�ʱ�����б�
*/
private void calculateFunctionProxyParams(List<FunctionProxy> inputList,
List<FunctionProxy> initialList, List<FunctionProxy> demodedList) {
Object obj = viewer.getInput();
inputMap.clear();
if(obj != null && obj instanceof MenuItem){
MenuItem item = (MenuItem)obj;
EList<FunctionProxy> input = item.getFunctionProxys();
demodedList.addAll(input);
inputList.addAll(input);
for (Function function : MenuUtils.getFunctions(resource)) {
FunctionProxy fProxy = null;
if(MenuUtils.isStockDepartment()){
for (FunctionProxy proxy : input) {
if(function.getName().equals(proxy.getFunCode())){
demodedList.remove(proxy);
initialList.add(proxy);
fProxy = proxy;
inputMap.put(fProxy, function);
break;
}
}
}else{
for (FunctionProxy proxy : input) {
if(function.getSubTransCode().equals(proxy.getFunCode())){
demodedList.remove(proxy);
initialList.add(proxy);
fProxy = proxy;
inputMap.put(fProxy, function);
break;
}
}
}
if(fProxy == null){
fProxy = MetadataFactory.eINSTANCE.createFunctionProxy();
if(MenuUtils.isStockDepartment()){
fProxy.setFunCode(function.getName());
fProxy.setDescription(function.getDescription());
}else{
fProxy.setFunCode(function.getSubTransCode());
fProxy.setDescription(function.getDescription());
}
inputList.add(fProxy);
inputMap.put(fProxy, function);
}
}
}
}
private class FunctionProxySelectionDialog extends CheckedTableSelectionDialog<FunctionProxy> {
private List<FunctionProxy> demodedElements;
public FunctionProxySelectionDialog(Shell parent) {
super(parent,TITLES,ATTRIBUTES);
setTitle("�������");
}
/**
* ���ù�ʱ�������б�
*
* @param demodedElement
*/
public void setDemodedElements(List<FunctionProxy> demodedElements) {
this.demodedElements = demodedElements;
}
@Override
protected String getText(FunctionProxy element, EAttribute attribute) {
Function func = inputMap.get(element);
if(func != null){
return (String) func.eGet(attribute);
}
if(attribute.equals(ATTRIBUTES[0])){
return element.getFunCode();
}else if(attribute.equals(ATTRIBUTES[2])){
return element.getDescription();
}
return StringUtils.EMPTY;
}
@Override
protected Image getUncheckedImage(FunctionProxy element) {
if (demodedElements.contains(element)) {
return getDeleteCheckImage();
}
return super.getUncheckedImage(element);
}
}
}