/** * Դ�������ƣ�ExtensibleModelUtils.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.ui * ����˵����$desc * ����ĵ��� * ���ߣ���Ҷ�� */ package com.hundsun.ares.studio.ui.editor.extend; import java.security.Provider; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import com.hundsun.ares.studio.core.IARESElement; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.core.model.ExtensibleModel; import com.hundsun.ares.studio.ui.editor.IDiagnosticProvider; import com.hundsun.ares.studio.ui.editor.extend.user.IUserExtendedPropertyDescriptor; import com.hundsun.ares.studio.ui.editor.extend.user.UserExtendedPropertyColumnLabelProvider; import com.hundsun.ares.studio.ui.editor.extend.user.UserExtendedPropertyEditingSupport; /** * @author gongyf * */ public class ExtensibleModelUtils { /** * ��ȡ��ǰ��Ҫ�ṩ�ı༭֧�� * * @param resource * @param eClass * @return */ public static IExtensibleModelEditingSupport[] getEndabledEditingSupports( IARESElement resource, EClass eClass) { IExtensibleModelEditingSupport[] editingSupports = ExtensibleModelManager .getInstance().getExtensibleModelEditingSupports(eClass); List<IExtensibleModelEditingSupport> elementList = new ArrayList<IExtensibleModelEditingSupport>(); for (IExtensibleModelEditingSupport es : editingSupports) { if (es.isEnable(resource, eClass)) { elementList.add(es); } } return elementList .toArray(new IExtensibleModelEditingSupport[elementList.size()]); } /** * ����ָ������չģ�ͽ��г�ʼ��������װ�ر��������չ���� * * @param resource * @param model * @param force * ǿ�Ƹ��Ǵ��ڵ���չ���� */ public static void extend(IARESElement element, ExtensibleModel model, boolean force) { IExtensibleModelEditingSupport[] supports = getEndabledEditingSupports( element, model.eClass()); for (IExtensibleModelEditingSupport support : supports) { if (force || !model.getData2().containsKey(support.getKey())) { model.getData2().put(support.getKey(), support.createMapValueObject()); } } } /** * ��ģ���е���չģ�ͽ��г�ʼ��������װ�ر��������չ���� * * @param resource * @param res * @param force * ǿ�Ƹ��Ǵ��ڵ���չ���� */ public static void extendResource(IARESElement element, Resource res, boolean force) { List<ExtensibleModel> models = new ArrayList<ExtensibleModel>(); for (Iterator<Object> iterator = EcoreUtil.getAllContents(res, true); iterator .hasNext();) { Object obj = iterator.next(); // ���ﲻ��ֱ�Ӳ���ģ�ͣ���Ҫ�ȱ����� if (obj instanceof ExtensibleModel) { models.add((ExtensibleModel) obj); } } for (ExtensibleModel model : models) { extend(element, model, force); } } /** * ������չ�� * * @param viewer * @param resource * @param eClass * @param diagnosticProvider */ public static void createExtensibleModelTableViewerColumns( TableViewer viewer, IARESResource resource, EClass eClass, IDiagnosticProvider diagnosticProvider) { createExtensibleModelTableViewerColumns(viewer, resource, eClass, diagnosticProvider, true); } /** * ������չ�� * * @param viewer * @param resource * @param eClass * @param diagnosticProvider */ public static void createExtensibleModelTableViewerColumns( TableViewer viewer, IARESResource resource, EClass eClass, IDiagnosticProvider diagnosticProvider, boolean isEditingSupport) { IExtensibleModelEditingSupport[] editingSupports = ExtensibleModelUtils .getEndabledEditingSupports(resource, eClass); GC gc = new GC(viewer.getControl()); try { for (IExtensibleModelEditingSupport support : editingSupports) { for (IExtensibleModelPropertyDescriptor descriptor : support .getPropertyDescriptors(resource, eClass)) { TableViewerColumn tvColumn = new TableViewerColumn(viewer, SWT.LEFT); // ���ȸ�����ʵ����������� String displayName = descriptor.getDisplayName(); Point p = gc.stringExtent(displayName); tvColumn.getColumn().setWidth(p.x + 20); tvColumn.getColumn().setText(displayName); // �½ӿڱ�־�����µĴ���ʽ if (descriptor instanceof IUserExtendedPropertyDescriptor) { tvColumn.setLabelProvider(new UserExtendedPropertyColumnLabelProvider(descriptor)); tvColumn.setEditingSupport(new UserExtendedPropertyEditingSupport(viewer, descriptor)); } else { // ���������ϵĴ���ʽ ExtensibleModelColumnLabelProvider provider = new ExtensibleModelColumnLabelProvider( support, descriptor , resource); provider.setDiagnosticProvider(diagnosticProvider); tvColumn.setLabelProvider(provider); if (isEditingSupport) { tvColumn.setEditingSupport(new ExtensibleModelEditingSupport( viewer, support, descriptor)); } } tvColumn.getColumn().setMoveable(true); } } } finally { gc.dispose(); } } /** * ������չ�� * * @param viewer * @param resource * @param eClass * @param diagnosticProvider */ public static void createExtensibleModelTreeViewerColumns( TreeViewer viewer, IARESResource resource, EClass eClass, IDiagnosticProvider diagnosticProvider) { // 2012-10-29 sundl ���ȡ����resource������ִ�� if (resource == null) { return; } IExtensibleModelEditingSupport[] editingSupports = ExtensibleModelUtils .getEndabledEditingSupports(resource, eClass); GC gc = new GC(viewer.getControl()); try { for (IExtensibleModelEditingSupport support : editingSupports) { for (IExtensibleModelPropertyDescriptor descriptor : support.getPropertyDescriptors(resource, eClass)) { TreeViewerColumn tvColumn = new TreeViewerColumn(viewer, SWT.LEFT); // ���ȸ�����ʵ����������� String displayName = descriptor.getDisplayName(); Point p = gc.stringExtent(displayName); tvColumn.getColumn().setWidth(p.x + 20); tvColumn.getColumn().setText(displayName); if (descriptor instanceof IUserExtendedPropertyDescriptor) { tvColumn.setLabelProvider(new UserExtendedPropertyColumnLabelProvider(descriptor)); tvColumn.setEditingSupport(new UserExtendedPropertyEditingSupport(viewer, descriptor)); } else { ExtensibleModelColumnLabelProvider provider = new ExtensibleModelColumnLabelProvider(support, descriptor, resource); provider.setDiagnosticProvider(diagnosticProvider); tvColumn.setLabelProvider(provider); tvColumn.setEditingSupport(new ExtensibleModelEditingSupport(viewer, support, descriptor)); } tvColumn.getColumn().setMoveable(true); } } } finally { gc.dispose(); } } public static ExtensibleModel getHostExtensibleModel(EObject obj) { EObject parent = obj; while (parent != null && !(parent instanceof ExtensibleModel)) { parent = parent.eContainer(); } return (ExtensibleModel) parent; } }