/** * Դ�������ƣ�MetadataTreeListWithDetailPage.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.metadata.ui * ����˵����Ԫ�����û��༭��UIչ����ع��� * ����ĵ��� * ���ߣ� */ package com.hundsun.ares.studio.jres.metadata.ui.editors; import java.util.ArrayList; import java.util.EventObject; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter; 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.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.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.ToolTip; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.forms.widgets.FormToolkit; import com.hundsun.ares.studio.ui.editor.EMFFormEditor; import com.hundsun.ares.studio.ui.editor.actions.ButtonGroupManager; import com.hundsun.ares.studio.ui.editor.actions.IUpdateAction; import com.hundsun.ares.studio.ui.editor.blocks.ActionRegistry; import com.hundsun.ares.studio.ui.editor.viewers.ReferenceTreeContentProvider; import com.hundsun.ares.studio.ui.editor.viewers.RefreshViewerJob; /** * ������ͼ��Ԫ���ݱ༭����������������ϸ��ı༭��ҳ<BR> * ��ϸ��ӵ���Լ���Actionע���������Դ����Լ��İ�ť�Ͳ˵��� * @author gongyf * */ public abstract class MetadataTreeListWithDetailPage extends MetadataTreeListPage { private ColumnViewer detailColumnViewer; private ActionRegistry detailActionRegistry; private List<String> detailSelectionActions; private List<String> detailStackActions; private List<String> detailPropertyActions; /** * @param editor * @param id * @param title */ public MetadataTreeListWithDetailPage(EMFFormEditor editor, String id, String title) { super(editor, id, title); } /** * @return the detailActionRegistry */ protected ActionRegistry getDetailActionRegistry() { if (detailActionRegistry == null) { detailActionRegistry = new ActionRegistry(); } return detailActionRegistry; } /** * @return the detailPropertyActions */ protected List<String> getDetailPropertyActions() { if (detailPropertyActions == null) { detailPropertyActions = new ArrayList<String>(); } return detailPropertyActions; } /** * @return the detailStackActions */ protected List<String> getDetailStackActions() { if (detailStackActions == null) { detailStackActions = new ArrayList<String>(); } return detailStackActions; } /** * @return the detailSelectionActions */ protected List<String> getDetailSelectionActions() { if (detailSelectionActions == null) { detailSelectionActions = new ArrayList<String>(); } return detailSelectionActions; } /** * @return the detailViewer */ protected ColumnViewer getDetailColumnViewer() { return detailColumnViewer; } protected void initializeDetailActionRegistry() { createDetailActions(); updateDetailActions(getDetailPropertyActions()); updateDetailActions(getDetailStackActions()); } /** * ������ϸ��IJ��� */ protected void createDetailActions() { } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.metadata.ui.editors.MetadataListPage#firePropertyChange(int) */ @Override protected void firePropertyChange(int propertyId) { super.firePropertyChange(propertyId); updateDetailActions(getDetailPropertyActions()); } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.metadata.ui.editors.MetadataListPage#commandStackChanged(java.util.EventObject) */ @Override public void commandStackChanged(EventObject event) { super.commandStackChanged(event); RefreshViewerJob.refresh(getDetailColumnViewer(), null, false); updateDetailActions(getDetailStackActions()); } @Override protected Control createClient(Composite parent, FormToolkit toolkit) { SashForm sash = new SashForm(parent, SWT.VERTICAL | SWT.SMOOTH); Control upPane = super.createClient(sash, toolkit); Composite downPane = toolkit.createComposite(sash); Control viewer = createDetailColumnViewer(downPane, toolkit); Control buttons = createDetailViewerButtons(downPane, toolkit); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(downPane); GridDataFactory.fillDefaults().hint(100, 100).grab(true, true).applyTo(viewer); GridDataFactory.fillDefaults().grab(false, true).hint(80, -1).applyTo(buttons); sash.setWeights(new int[] { 70, 30 }); return sash; } /** * @param parent * @param toolkit * @return */ private Control createDetailViewerButtons(Composite parent, FormToolkit toolkit) { ButtonGroupManager btnGroupManager = new ButtonGroupManager(); createDetailButtons(btnGroupManager); btnGroupManager.createControl(parent); toolkit.adapt(btnGroupManager.getControl()); return btnGroupManager.getControl(); } /** * ������ϸ��İ��� * @param manager */ protected abstract void createDetailButtons(ButtonGroupManager manager); protected abstract EReference getDetailReference(); /** * @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); // ��Ϊ��ť�����DZ����صģ����Ա���ȱ�񴴽���ɺ��ʼ������ initializeDetailActionRegistry(); } /** * ������ϸ����Ҽ��˵� * @param manager */ protected abstract void createDetailMenus(IMenuManager manager); /** * ������ϸ�������Ϣ * @param columnViewer */ protected abstract void createDetailColumns(ColumnViewer columnViewer); /** * @param viewer */ protected void setDetailColumnViewer(ColumnViewer viewer) { if (this.detailColumnViewer != null) { this.detailColumnViewer.removeSelectionChangedListener(this); } this.detailColumnViewer = viewer; if (this.detailColumnViewer != null) { this.detailColumnViewer.addSelectionChangedListener(this); } } /* (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((EObject) selection.getFirstElement()); } else { notifyDetailViewer(null); } } else if (event.getSelectionProvider() == getDetailColumnViewer()) { updateDetailActions(getDetailSelectionActions()); } } protected void notifyDetailViewer(EObject input) { getDetailColumnViewer().setInput(input); updateDetailActions(getDetailPropertyActions()); updateDetailActions(getDetailSelectionActions()); updateDetailActions(getDetailStackActions()); } protected void updateDetailActions(final List<String> actionIds) { Display display = null; Shell shell = null; if(getSite() != null) { shell = getSite().getShell(); if(shell != null) { display = shell.getDisplay(); } } if(display != null && !display.isDisposed()) { Runnable runnable = new Runnable() { public void run() { ActionRegistry registry = getDetailActionRegistry(); Iterator<String> iter = actionIds.iterator(); while (iter.hasNext()) { IAction action = registry.getAction(iter.next()); if (action instanceof IUpdateAction) ((IUpdateAction) action).update(); } } }; display.syncExec(runnable); } } /** * ������ϸ�� * @param parent * @param toolkit * @return */ protected Control createDetailColumnViewer(Composite parent, FormToolkit toolkit) { TableViewer table = new TableViewer( toolkit.createTable( parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI)); table.getTable().setHeaderVisible(true); table.getTable().setLinesVisible(true); setDetailColumnViewer(table); configureDetailColumnViewer(getDetailColumnViewer()); int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK; Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() }; //������ק���� table.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(table)); table.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(getEditingDomain(), table)); return table.getControl(); } }