package com.hundsun.ares.studio.jres.metadata.ui.block;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.util.Pair;
import com.hundsun.ares.studio.jres.metadata.ui.MetadataUI;
import com.hundsun.ares.studio.jres.metadata.ui.actions.CopyAction;
import com.hundsun.ares.studio.jres.metadata.ui.actions.ExportMetadataAction;
import com.hundsun.ares.studio.jres.metadata.ui.actions.IMetadataActionIDConstant;
import com.hundsun.ares.studio.jres.metadata.ui.actions.ImportMetadataAction;
import com.hundsun.ares.studio.jres.metadata.ui.actions.InsertItemAction;
import com.hundsun.ares.studio.jres.metadata.ui.actions.RemoveAction;
import com.hundsun.ares.studio.jres.metadata.ui.actions.ShowCategoryAction;
import com.hundsun.ares.studio.jres.metadata.ui.editors.dnd.MenuDropAdapter;
import com.hundsun.ares.studio.jres.metadata.ui.menu.actions.AddChildMenuItemAction;
import com.hundsun.ares.studio.jres.metadata.ui.menu.actions.AddMenuItemAction;
import com.hundsun.ares.studio.jres.metadata.ui.menu.actions.MenuItemMoveDownAction;
import com.hundsun.ares.studio.jres.metadata.ui.menu.actions.MenuItemMoveUpAction;
import com.hundsun.ares.studio.jres.metadata.ui.menu.actions.MenuItemPasteAction;
import com.hundsun.ares.studio.jres.metadata.ui.refactor.MatadataRenameAction;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MenuColumnViewerProblemView;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MenuExtensibleModelColumnLabelProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MenuHeaderColumnLabelProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MenuListTreeContentProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataColumnLabelProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataDescColumnLabelProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataItemEditingSupportDecorator;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataTreeContentProvider;
import com.hundsun.ares.studio.jres.model.metadata.MetadataPackage;
import com.hundsun.ares.studio.jres.model.metadata.provider.LongTextEditingSupport;
import com.hundsun.ares.studio.ui.ColumnViewerHoverToolTip;
import com.hundsun.ares.studio.ui.editor.IDiagnosticProvider;
import com.hundsun.ares.studio.ui.editor.actions.ActionGroup;
import com.hundsun.ares.studio.ui.editor.actions.ColumnViewerDeleteAction;
import com.hundsun.ares.studio.ui.editor.actions.CopyCellAction;
import com.hundsun.ares.studio.ui.editor.actions.CopyColumnAction;
import com.hundsun.ares.studio.ui.editor.actions.IActionIDConstant;
import com.hundsun.ares.studio.ui.editor.actions.ValidateAction;
import com.hundsun.ares.studio.ui.editor.editable.ActionEditableUnit;
import com.hundsun.ares.studio.ui.editor.editingsupport.TextEditingSupport;
import com.hundsun.ares.studio.ui.editor.extend.ExtensibleModelColumnLabelProvider;
import com.hundsun.ares.studio.ui.editor.extend.ExtensibleModelEditingSupport;
import com.hundsun.ares.studio.ui.editor.extend.ExtensibleModelUtils;
import com.hundsun.ares.studio.ui.editor.extend.IExtensibleModelEditingSupport;
import com.hundsun.ares.studio.ui.editor.extend.IExtensibleModelPropertyDescriptor;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnLabelProvider;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnViewerProblemView;
import com.hundsun.ares.studio.ui.validate.IProblemPool;
public class MenuListViewerBlock extends MetadataListViewerBlock {
private MetadataTreeContentProvider contentProvider;
/**
* @param page
* @param editingDomain
* @param site
* @param resource
* @param problemPool
*/
public MenuListViewerBlock(FormPage page, EditingDomain editingDomain,
IWorkbenchPartSite site, IARESResource resource,
IProblemPool problemPool) {
super(page, editingDomain, site, resource, problemPool);
}
@Override
public Pair<EObject, IARESResource> getLinkedObject(ViewerCell cell) {
return null;
}
@Override
protected String getID() {
return getClass().getName();
}
@Override
protected boolean getDefaultShowCategory() {
return false;
}
@Override
protected void addDragSupport(TreeViewer viewer) {
int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };
//�༭���б�֧����ק����
viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
viewer.addDropSupport(dndOperations, transfers, new MenuDropAdapter(viewer, getEditingDomain()));
}
@Override
protected IContentProvider getColumnViewerContentProvider() {
contentProvider = new MenuListTreeContentProvider();
contentProvider.setShowCategory(false);
return contentProvider;
}
@Override
protected EStructuralFeature getHeadColumnFeature() {
return MetadataPackage.Literals.NAMED_ELEMENT__CHINESE_NAME;
}
@Override
protected void createColumns(TreeViewer viewer) {
/**
* a) ���飨����ֶη���һ�£������ԼҲһ�£�
b) ID
c) ����
d) ҳ��
e) ��ע
*/
final TreeViewer treeViewer = viewer;
EObjectColumnViewerProblemView problemView = new MenuColumnViewerProblemView(treeViewer);
/**����*/
{
// ����������
EAttribute attribute = MetadataPackage.Literals.NAMED_ELEMENT__CHINESE_NAME;
// ���������
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("�˵�����");
column.getColumn().setWidth(200);
// ���ñ�ǩ�ṩ��
EObjectColumnLabelProvider provider = new MenuHeaderColumnLabelProvider(attribute , getARESResource());
provider.setDiagnosticProvider(problemView);
column.setLabelProvider(provider);
// ���ñ༭֧��
TextEditingSupport es = new TextEditingSupport(viewer, attribute);
es.setDecorator(new MetadataItemEditingSupportDecorator(attribute,getARESResource()));
column.setEditingSupport(es);
column.getColumn().setMoveable(true);
}
/**ID*/
{
// ����������
EAttribute attribute = MetadataPackage.Literals.NAMED_ELEMENT__NAME;
// ���������
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("�˵���");
column.getColumn().setWidth(120);
// ���ñ�ǩ�ṩ��
EObjectColumnLabelProvider provider = new MetadataColumnLabelProvider(attribute, getARESResource());
provider.setDiagnosticProvider(problemView);
column.setLabelProvider(provider);
// ���ñ༭֧��
TextEditingSupport es = new TextEditingSupport(viewer, attribute);
es.setDecorator(new MetadataItemEditingSupportDecorator(attribute,getARESResource()));
column.setEditingSupport(es);
}
/**ҳ��*/
{
// ����������
EAttribute attribute = MetadataPackage.Literals.MENU_ITEM__URL;
// ���������
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("ҳ��");
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
// ���ñ�ǩ�ṩ��
EObjectColumnLabelProvider provider = new MetadataColumnLabelProvider(attribute, getARESResource());
provider.setDiagnosticProvider(problemView);
column.setLabelProvider(provider);
// ���ñ༭֧��
TextEditingSupport es = new TextEditingSupport(viewer, attribute);
// es.setDecorator(new MetadataItemEditingSupportDecorator(attribute,getARESResource()));
column.setEditingSupport(es);
column.getColumn().setMoveable(true);
}
/**��ע*/
{
// ����������
EAttribute attribute = MetadataPackage.Literals.NAMED_ELEMENT__DESCRIPTION;
// ���������
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("˵��");
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
// ���ñ�ǩ�ṩ��
EObjectColumnLabelProvider provider = new MetadataDescColumnLabelProvider(attribute, getARESResource());
provider.setDiagnosticProvider(problemView);
column.setLabelProvider(provider);
// ���ñ༭֧��
TextEditingSupport es = new LongTextEditingSupport(viewer, attribute);
es.setDecorator(new MetadataItemEditingSupportDecorator(attribute,getARESResource()));
column.setEditingSupport(es);
}
// ������չ��֧��
createExtensibleModelTreeViewerColumns(getColumnViewer(), getARESResource(),
MetadataPackage.Literals.MENU_ITEM, problemView);
// getEditableControl().addEditableUnit(new JresDefaultEditableUnit(viewer.getControl()));
getProblemPool().addView(problemView);
}
private void createExtensibleModelTreeViewerColumns(
TreeViewer viewer, IARESResource resource, EClass eClass,
IDiagnosticProvider diagnosticProvider) {
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);
ExtensibleModelColumnLabelProvider provider = new MenuExtensibleModelColumnLabelProvider(
support, descriptor,getARESResource());
provider.setDiagnosticProvider(diagnosticProvider);
tvColumn.setLabelProvider(provider);
tvColumn.setEditingSupport(new ExtensibleModelEditingSupport(
viewer, support, descriptor));
tvColumn.getColumn().setMoveable(true);
}
}
} finally {
gc.dispose();
}
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.ui.editors.MetadataListPage#createActions()
*/
@Override
protected void createActions() {
super.createActions();
List<IAction> actions = new ArrayList<IAction>();
IAction action = new AddMenuItemAction(
getColumnViewer(),
getEditingDomain(),
MetadataPackage.Literals.MENU_ITEM);
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
actions.add(action);
IAction actionInsert = new InsertItemAction(
getColumnViewer(),
getEditingDomain(),
MetadataPackage.Literals.MENU_ITEM);
getActionRegistry().registerAction(actionInsert);
getSelectionActions().add(actionInsert.getId());
action = new RemoveAction(getColumnViewer(), getEditingDomain());
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
actions.add(action);
action = new AddChildMenuItemAction(getColumnViewer(), getEditingDomain());
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
actions.add(action);
action = new ColumnViewerDeleteAction(getColumnViewer(), getEditingDomain());
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
actions.add(action);
action = new MenuItemMoveUpAction(getColumnViewer(), getEditingDomain());
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
getStackActions().add(action.getId());
actions.add(action);
action = new MenuItemMoveDownAction(getColumnViewer(), getEditingDomain());
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
getStackActions().add(action.getId());
actions.add(action);
action = new ShowCategoryAction(getColumnViewer());
getActionRegistry().registerAction(action);
actions.add(action);
IAction copyAction = new CopyAction(getColumnViewer());
getActionRegistry().registerAction(copyAction);
getSelectionActions().add(copyAction.getId());
IAction copyCellAction = new CopyCellAction(getColumnViewer());
getActionRegistry().registerAction(copyCellAction);
IAction copyColumnAction = new CopyColumnAction(getColumnViewer());
getActionRegistry().registerAction(copyColumnAction);
IAction pasteAction = new MenuItemPasteAction(getColumnViewer(), getEditingDomain(),
MetadataPackage.Literals.METADATA_CATEGORY, MetadataPackage.Literals.MENU_ITEM);
getActionRegistry().registerAction(pasteAction);
getSelectionActions().add(pasteAction.getId());
getClipboardActions().add(pasteAction.getId());
action = new ValidateAction(getFormPage());
getActionRegistry().registerAction(action);
actions.add(action);
ImportMetadataAction importAction = new ImportMetadataAction(getARESResource(), getColumnViewer(),getEditingDomain());
getActionRegistry().registerAction(importAction);
getSelectionActions().add(importAction.getId());
String dialogTitle = "�����˵��빦��";
String dialogMessage = "����Ŀ�еIJ˵��빦�ܵ���(Excel�ļ�).";
Image dialogImage = AbstractUIPlugin.imageDescriptorFromPlugin(MetadataUI.PLUGIN_ID, "icons/full/obj16/menu.gif").createImage();
ExportMetadataAction exportAction = new ExportMetadataAction(getARESResource(), getSite(),dialogTitle,dialogImage,dialogMessage);
getActionRegistry().registerAction(exportAction);
getSelectionActions().add(exportAction.getId());
for ( IAction item: actions) {
getEditableControl().addEditableUnit(new ActionEditableUnit(item));
}
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.ui.editors.MetadataListPage#createButtons(com.hundsun.ares.studio.jres.ui.actions.ButtonGroupManager)
*/
@Override
protected void createToolbarItems(ToolBarManager manager) {
//�����˵���Ŀ�б�IJ����б�
List<IAction> newActions = new ArrayList<IAction>();
IAction action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_ADD_ITEM);
newActions.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_ADD_CHILD_MENU_ITEM);
newActions.add(action);
ActionGroup newGroup = new ActionGroup(newActions.toArray(new IAction[0]));
manager.add(newGroup);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_INSERT_ITEM);
manager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_DELETE);
manager.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_MOVE_UP);
manager.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_MOVE_DOWN);
manager.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_IMPORT_METADATA);
manager.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_EXPORT_METADATA);
manager.add(action);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.ui.editors.MetadataListPage#createMenus(org.eclipse.jface.action.IMenuManager)
*/
@Override
protected void createMenus(IMenuManager menuManager) {
//�����˵���Ŀ���Ҽ��˵�
IAction action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_ADD_ITEM);
menuManager.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_ADD_CHILD_MENU_ITEM);
menuManager.add(action);
menuManager.add(new Separator());
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_REMOVE);
menuManager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_DELETE);
menuManager.add(action);
menuManager.add(new Separator());
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_MOVE_UP);
menuManager.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_MOVE_DOWN);
menuManager.add(action);
menuManager.add(new Separator());
action = getActionRegistry().getAction(IActionIDConstant.CV_COPY);
menuManager.add(action);
action = getActionRegistry().getAction(CopyCellAction.ID);
menuManager.add(action);
action = getActionRegistry().getAction(CopyColumnAction.ID);
menuManager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_PASTE);
menuManager.add(action);
menuManager.add(new Separator());
action = new MatadataRenameAction(getEditingDomain(),"�˵���",getFormPage().getEditor(),getColumnViewer(),getARESResource());
menuManager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_VALIDATE);
menuManager.add(action);
action = getActionRegistry().getAction(IMetadataActionIDConstant.CV_INSERT_ITEM);
menuManager.add(action);
}
@Override
protected void storeShowCategoryState(IDialogSettings settings) {
}
@Override
protected void restoreShowCategoryState(IDialogSettings settings) {
if (contentProvider != null) {
// sundl ǿ�Ʋ���ʾ����
contentProvider.setShowCategory(false);
}
}
@Override
protected void addToolTipSupport(TreeViewer viewer) {
ColumnViewerHoverToolTip.enableFor(viewer);
}
}