/**
* Դ�������ƣ�DictionaryListViewerBlock.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.metadata.ui
* ����˵����$desc
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.jres.metadata.ui.block;
import java.util.EventObject;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.util.Pair;
import com.hundsun.ares.studio.internal.core.ARESProject;
import com.hundsun.ares.studio.jres.metadata.constant.IMetadataRefType;
import com.hundsun.ares.studio.jres.metadata.ui.model.MetadataOverviewElement;
import com.hundsun.ares.studio.jres.metadata.ui.utils.MetadataOverviewExtensibleModelUtils;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataOverviewColumnLabelProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataOverviewContentProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataOverviewHeaderColumnLabelProvider;
import com.hundsun.ares.studio.jres.metadata.ui.viewer.MetadataOverviewProjectColumnLabelProvider;
import com.hundsun.ares.studio.jres.model.metadata.DictionaryType;
import com.hundsun.ares.studio.jres.model.metadata.MetadataItem;
import com.hundsun.ares.studio.jres.model.metadata.MetadataPackage;
import com.hundsun.ares.studio.jres.model.metadata.decrypt.DeDictionaryType;
import com.hundsun.ares.studio.jres.model.metadata.util.CircularReferenceException;
import com.hundsun.ares.studio.jres.model.metadata.util.MetadataUtil;
import com.hundsun.ares.studio.ui.ColumnSelectSorterListener;
import com.hundsun.ares.studio.ui.editor.actions.ButtonGroupManager;
import com.hundsun.ares.studio.ui.editor.viewers.BaseEObjectColumnLabelProvider;
import com.hundsun.ares.studio.ui.editor.viewers.ColumnViewerPatternFilter;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnLabelProvider;
import com.hundsun.ares.studio.ui.editor.viewers.ReferenceTreeContentProvider;
import com.hundsun.ares.studio.ui.editor.viewers.RefreshViewerJob;
import com.hundsun.ares.studio.ui.validate.IProblemPool;
/**
* @author yanwj06282
*
*/
public class DictionaryListOverviewViewerBlock extends MetadataListOverviewViewerBlock{
private ColumnViewer detailColumnViewer;
// protected int[] cachedWidthDetail = new int[]{};
//
// protected int[] cachedColumnDetail = new int[]{};
/**
* @param page
* @param editingDomain
* @param site
* @param resource
* @param problemPool
*/
public DictionaryListOverviewViewerBlock(FormPage page,
EditingDomain editingDomain, IWorkbenchPartSite site,
IARESResource resource, IProblemPool problemPool) {
super(page, editingDomain, site, resource, problemPool);
// int[] savedDetailColumnWidths = getSavedDetailColumnWidthes();
// if (savedDetailColumnWidths.length > 0) {
// cachedWidthDetail = savedDetailColumnWidths;
// }
// int[] saveDetailColumns = getSavedDetailColumns();
// if (saveDetailColumns.length > 0) {
// cachedColumnDetail = saveDetailColumns;
// }
}
// /**
// * ������ϸ�п�
// */
// private void saveColumnWidthDetail(IDialogSettings mySettings){
// // ������
// String[] widthes = new String[cachedWidthDetail.length];
// for (int i = 0; i < cachedWidthDetail.length; i++) {
// widthes[i] = String.valueOf(cachedWidthDetail[i]);
// }
// mySettings.put(DictionaryListViewerBlock.SAVED_WIDTHE_DETAIL, widthes);
//
// }
//
// /**
// * ������ϸ��
// */
// private void saveColumnDetail(IDialogSettings mySettings) {
// // ������
// String[] widthes = new String[cachedColumnDetail.length];
// for (int i = 0; i < cachedColumnDetail.length; i++) {
// widthes[i] = String.valueOf(cachedColumnDetail[i]);
// }
// mySettings.put(DictionaryListViewerBlock.SAVED_COLUMN_DETAIL, widthes);
// }
//
// /**
// * ȡ���ϴα������ϸ�п�
// * @return �ϴα������ϸ�п����顣
// */
// protected int[] getSavedDetailColumnWidthes() {
// String[] savedWidthes = null;
// IDialogSettings settings = JRESUI.getDefault().getDialogSettings().getSection(getID());
// if (settings != null) {
// savedWidthes = settings.getArray(DictionaryListViewerBlock.SAVED_WIDTHE_DETAIL);
// if (savedWidthes != null) {
// int[] saved = new int[savedWidthes.length];
// for (int i = 0; i < savedWidthes.length; i++) {
// saved[i] = Integer.parseInt(savedWidthes[i]);
// }
// return saved;
// }
// }
// return new int[0];
// }
//
// /**
// * ȡ���ϴα������ϸ�С�
// * @return �ϴα������ϸ�����顣
// */
// protected int[] getSavedDetailColumns() {
// String[] savedWidthes = null;
// IDialogSettings settings = JRESUI.getDefault().getDialogSettings().getSection(getID());
// if (settings != null) {
// savedWidthes = settings.getArray(DictionaryListViewerBlock.SAVED_COLUMN_DETAIL);
// if (savedWidthes != null) {
// int[] saved = new int[savedWidthes.length];
// for (int i = 0; i < savedWidthes.length; i++) {
// saved[i] = Integer.parseInt(savedWidthes[i]);
// }
// return saved;
// }
// }
// return new int[0];
// }
/**
* @return the detailColumnViewer
*/
public ColumnViewer getDetailColumnViewer() {
return detailColumnViewer;
}
@Override
protected IContentProvider getColumnViewerContentProvider() {
return new MetadataOverviewContentProvider(getARESResource(),IMetadataRefType.Dict);
}
@Override
public void commandStackChanged(EventObject event) {
super.commandStackChanged(event);
RefreshViewerJob.refresh(getDetailColumnViewer(), null, false);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#createControl(org.eclipse.swt.widgets.Composite, org.eclipse.ui.forms.widgets.FormToolkit)
*/
@Override
public void createControl(Composite parent, FormToolkit toolkit) {
SashForm sash = new SashForm(parent, SWT.VERTICAL | SWT.SMOOTH);
super.createControl(sash, toolkit);
Composite downPane = toolkit.createComposite(sash);
Control viewer = createDetailColumnViewer(downPane, toolkit);
GridLayoutFactory.swtDefaults().numColumns(1).applyTo(downPane);
GridDataFactory.fillDefaults().hint(100, 100).grab(true, true).applyTo(viewer);
sash.setWeights(new int[] { 70, 30 });
}
/**
* ������ϸ��
* @param parent
* @param toolkit
* @return
*/
protected Control createDetailColumnViewer(Composite parent,
FormToolkit toolkit) {
FilteredTree tree = new FilteredTree(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, new ColumnViewerPatternFilter(), true);
toolkit.adapt(tree);
tree.getViewer().getTree().setHeaderVisible(true);
tree.getViewer().getTree().setLinesVisible(true);
detailColumnViewer = tree.getViewer();
configureDetailColumnViewer(detailColumnViewer);
return tree;
}
protected EReference getDetailReference(){
return MetadataPackage.Literals.DICTIONARY_TYPE__ITEMS;
}
@Override
protected String getReferenceType() {
return IMetadataRefType.Dict;
}
/**
* @param columnViewer
*/
protected void configureDetailColumnViewer(ColumnViewer columnViewer) {
createDetailColumns(columnViewer);
columnViewer.setContentProvider(new ReferenceTreeContentProvider(getDetailReference()));
MenuManager menuManager = new MenuManager("#popup.items");
menuManager.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
manager.removeAll();
createDetailMenus(manager);
}
});
Menu menu = menuManager.createContextMenu(columnViewer.getControl());
columnViewer.getControl().setMenu(menu);
// �������tooltip��ʾ
ColumnViewerToolTipSupport.enableFor(columnViewer, ToolTip.RECREATE);
}
/**
* ������ϸ��İ���
* @param manager
*/
protected void createDetailButtons(ButtonGroupManager manager){
}
/**
* ������ϸ����Ҽ��˵�
* @param manager
*/
protected void createDetailMenus(IMenuManager manager){
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.ui.editors.MetadataListPage#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (event.getSelectionProvider() == getColumnViewer()) {
super.selectionChanged(event);
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if (!selection.isEmpty()) {
notifyDetailViewer((MetadataOverviewElement) selection.getFirstElement());
} else {
notifyDetailViewer(null);
}
}
}
protected void notifyDetailViewer(MetadataOverviewElement input) {
// ��������õĻ�����Ҫֻ��
if(input != null){
if (MetadataUtil.isReferencingItem(input.getItem())) {
DictionaryType type = null;
try {
IContentProvider contentProvider = getColumnViewer().getContentProvider();
if(contentProvider instanceof MetadataOverviewContentProvider){
Pair<MetadataItem, IARESResource> result = MetadataUtil.defaultResolve(input.getItem(), input.getResource());
input = new MetadataOverviewElement(result.second, result.first);
}
} catch (CircularReferenceException e) {
}
}
getDetailColumnViewer().setInput(input.getItem());
}
}
@Override
protected void createColumns(TreeViewer viewer) {
final TreeViewer treeViewer = (TreeViewer) viewer;
/**�ֵ���Ŀ*/
{
// ����������
EAttribute attribute = MetadataPackage.Literals.NAMED_ELEMENT__NAME;
// ���������
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("�ֵ���Ŀ");
column.getColumn().setWidth(120);
// ���ñ�ǩ�ṩ��
ColumnLabelProvider provider = new MetadataOverviewHeaderColumnLabelProvider(attribute);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
}
/**��Ŀ����*/
{
// ����������
EAttribute attribute = MetadataPackage.Literals.NAMED_ELEMENT__CHINESE_NAME;
// ���������
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("��Ŀ����");
column.getColumn().setWidth(120);
// ���ñ�ǩ�ṩ��
ColumnLabelProvider provider = new MetadataOverviewColumnLabelProvider(attribute);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
column.getColumn().setMoveable(true);
}
// 2013-05-15 sundl ֻ����ref nature����ӡ�������Ŀ"��
// ע�����������Ϊ�����Ϲ��̵ļ����ԣ���ref nature�IJ���ʾ���ýڵ㣻��ref nature�IJ���ʾ���ýڵ�
IARESResource res = getARESResource();
if (res == null)
return;
IARESProject proj = res.getARESProject();
if (proj != null && !ARESProject.hasRefNature(proj.getProject())) {
/**������Ŀ*/
{
// ���������
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("������Ŀ");
column.getColumn().setWidth(200);
// ���ñ�ǩ�ṩ��
ColumnLabelProvider provider = new MetadataOverviewProjectColumnLabelProvider();
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
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);
// ���ñ�ǩ�ṩ��
ColumnLabelProvider provider = new MetadataOverviewColumnLabelProvider(attribute);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
column.getColumn().setMoveable(true);
}
MetadataOverviewExtensibleModelUtils.createExtensibleModelTreeViewerColumns(getColumnViewer(), getARESResource(),
MetadataPackage.Literals.DICTIONARY_TYPE, null);
}
/**
* ������ϸ�������Ϣ
* @param columnViewer
*/
protected void createDetailColumns(ColumnViewer columnViewer){
final TreeViewer treeViewer = (TreeViewer) columnViewer;
/**ID*/
/*{
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("ID");
column.getColumn().setWidth(120);
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(MetadataPackage.Literals.DICTIONARY_ITEM__NAME);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
}*/
/**�ֵ���*/
{
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("�ֵ���");
column.getColumn().setWidth(120);
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(MetadataPackage.Literals.DICTIONARY_ITEM__VALUE);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
column.getColumn().setMoveable(true);
}
/**�ֵ���˵��*/
{
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("�ֵ���˵��");
column.getColumn().setWidth(200);
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(MetadataPackage.Literals.DICTIONARY_ITEM__CHINESE_NAME);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
column.getColumn().setMoveable(true);
}
/**����ID*/
{
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("�ֵ䳣��");
column.getColumn().setWidth(120);
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(MetadataPackage.Literals.DICTIONARY_ITEM__CONSTANT_NAME);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
column.getColumn().setMoveable(true);
}
/**��ע*/
{
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("��ע");
column.getColumn().setWidth(200);
EObjectColumnLabelProvider provider = new EObjectColumnLabelProvider(MetadataPackage.Literals.DICTIONARY_ITEM__DESCRIPTION);
column.setLabelProvider(provider);
column.getColumn().addSelectionListener(new ColumnSelectSorterListener(column, provider));
column.getColumn().setMoveable(true);
}
MetadataOverviewExtensibleModelUtils.createExtensibleModelTreeViewerColumns(treeViewer, getARESResource(),
MetadataPackage.Literals.DICTIONARY_ITEM, null);
// //STEP1:������˳��
// if (cachedColumnDetail.length > 0) {
// treeViewer.getTree().setColumnOrder(cachedColumnDetail);
// }
// //STEP2:������
// for (int i=0;i<cachedWidthDetail.length;i++) {
// treeViewer.getTree().getColumns()[i].setWidth(cachedWidthDetail[i]);
// }
//
// treeViewer.getControl().addDisposeListener(new DisposeListener() {
//
// @Override
// public void widgetDisposed(DisposeEvent e) {
// cachedColumnDetail = treeViewer.getTree().getColumnOrder();
// TreeColumn[] treeColumns = treeViewer.getTree().getColumns();
// cachedWidthDetail = new int[treeColumns.length];
// for (int i = 0; i < treeColumns.length; i++) {
// cachedWidthDetail[i] = treeColumns[i].getWidth();
// }
// saveColumnWidthDetail(mySettings);
// saveColumnDetail(mySettings);
// }
// });
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.viewers.link.ICellLinkProvider#getLinkedObject(org.eclipse.jface.viewers.ViewerCell)
*/
@Override
public Pair<EObject, IARESResource> getLinkedObject(ViewerCell cell) {
BaseEObjectColumnLabelProvider labelProvider = (BaseEObjectColumnLabelProvider) getColumnViewer().getLabelProvider(cell.getColumnIndex());
EStructuralFeature feature = labelProvider.getEStructuralFeature(cell.getElement());
Pair<MetadataItem, IARESResource> pair = (Pair<MetadataItem, IARESResource>) cell.getElement();
DeDictionaryType d = MetadataUtil.decrypt((DictionaryType) pair.first, pair.second);
if (MetadataPackage.Literals.METADATA_ITEM__REF_ID.equals(feature)) {
if(((Pair)d.getResolvedItem()).equals(pair)){
return null;
}
return (Pair)d.getResolvedItem();
}
return null;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.metadata.ui.block.MetadataListViewerBlock#getID()
*/
@Override
protected String getID() {
return getClass().getName();
}
}