/** * Դ�������ƣ�JresBasicMasterDetailsBlock.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.ui * ����˵����JRES Studio�Ľ���չ�ֻ�����ܺͱ༭��ع��� * ����ĵ��� * ���ߣ� */ package com.hundsun.ares.studio.ui.editor.blocks; import java.util.ArrayList; import java.util.EventObject; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CommandStack; import org.eclipse.emf.common.command.CommandStackListener; import org.eclipse.emf.edit.domain.EditingDomain; 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.action.ToolBarManager; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.forms.DetailsPart; import org.eclipse.ui.forms.IDetailsPage; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.MasterDetailsBlock; import org.eclipse.ui.forms.SectionPart; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import com.hundsun.ares.studio.core.util.StringUtil; import com.hundsun.ares.studio.ui.editor.EMFFormPage; import com.hundsun.ares.studio.ui.editor.IEMFFormPage; import com.hundsun.ares.studio.ui.editor.actions.IUpdateAction; import com.hundsun.ares.studio.ui.editor.editable.IEditableControl; import com.hundsun.ares.studio.ui.editor.viewers.RefreshViewerJob; import com.hundsun.ares.studio.ui.util.ARESEMFClipboard; import com.hundsun.ares.studio.ui.util.IJRESClipboardListener; /** * 2012-09-17 sundl ����actions�����б�����ֻ�����Ƽ����� * @author qinyuan * @author sundl * */ public abstract class JresBasicMasterDetailsBlock extends MasterDetailsBlock implements CommandStackListener, IPropertyListener, ISelectionChangedListener{ protected EMFFormPage page; protected ColumnViewer viewer; protected FormToolkit toolkit; private IEditableControl editableControl; private ActionRegistry actionRegistry; private List<String> selectionActions; private List<String> stackActions; private List<String> propertyActions; private List<String> clipboardActions; private IJRESClipboardListener clipboardListener = new IJRESClipboardListener() { @Override public void clipboardChanged(ARESEMFClipboard clipboard) { updateActions(getClipboardActions()); } @Override public void clipboardAboutToBeChanged(ARESEMFClipboard clipboard) { } }; public JresBasicMasterDetailsBlock(EMFFormPage page, IEditableControl editableControl) { this.page = page; this.editableControl = editableControl; } @Override public void createContent(IManagedForm managedForm) { super.createContent(managedForm); ARESEMFClipboard.getInstance().addClipboardListener(clipboardListener); ScrolledForm form = managedForm.getForm(); managedForm.getToolkit().decorateFormHeading(form.getForm()); form.setText(getPageHeadName()); form.setImage(getPageHeadImage()); managedForm.getForm().getBody().setLayout(new GridLayout(1,false)); } @Override protected void createMasterPart(final IManagedForm managedForm, Composite parent) { toolkit = managedForm.getToolkit(); Section section = toolkit.createSection(parent, Section.TITLE_BAR); section.setText(StringUtil.getStringSafely(getSectionName())); Composite client = toolkit.createComposite(section, SWT.WRAP); section.setDescription(StringUtils.defaultString(getDescription())); final SectionPart sPart = new SectionPart(section); managedForm.addPart(sPart); ColumnViewer columnViewer = createViewer(client,managedForm,page); setColumnViewer(columnViewer); viewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); viewer.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { managedForm.fireSelectionChanged(sPart, event.getSelection()); } }); initializeActionRegistry(); createButtons(client); createMenu(viewer); //���� setMasterLayout(client); section.setClient(client); } /** * �������� * @param input */ public void setInput(Object input) { if (viewer != null) { viewer.setInput(input); updateActions(getPropertyActions()); updateActions(getSelectionActions()); updateActions(getStackActions()); } } /** * ����master���沼�� */ protected void setMasterLayout(Composite client) { client.setLayout(new GridLayout()); } /** * �����Ҽ��˵� * @param client */ protected void createMenu(Viewer viewer) { MenuManager menuManager = new MenuManager("#popup"); menuManager.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { manager.removeAll(); createMenus(manager); } }); Menu menu = menuManager.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); } /** * �����Ҽ��˵� * @param manager */ protected void createMenus(IMenuManager manager) { } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.ui.page.masterdetail.JresBasicMasterDetailsBlock#createButtons(org.eclipse.swt.widgets.Composite) */ protected void createButtons(Composite client) { ToolBar toolbar = new ToolBar(client, SWT.VERTICAL); GridDataFactory.fillDefaults().grab(false, true).applyTo(toolbar); toolkit.adapt(toolbar, false, false); ToolBarManager manager = new ToolBarManager(toolbar); // �����������ť�� createToolbarItems(manager); manager.update(true); } protected abstract void createToolbarItems(ToolBarManager manager); protected void initializeActionRegistry() { createActions(); updateActions(getPropertyActions()); updateActions(getStackActions()); updateActions(getSelectionActions()); updateActions(getClipboardActions()); } protected void createActions() { } /** * @return the selectionActions */ protected List<String> getSelectionActions() { if (selectionActions == null) { selectionActions = new ArrayList<String>(); } return selectionActions; } /** * @return the stackActions */ protected List<String> getStackActions() { if (stackActions == null) { stackActions = new ArrayList<String>(); } return stackActions; } /** * @return the propertyActions */ protected List<String> getPropertyActions() { if (propertyActions == null) { propertyActions = new ArrayList<String>(); } return propertyActions; } /** * @return the clipboardActions */ protected List<String> getClipboardActions() { if (clipboardActions == null) { clipboardActions = new ArrayList<String>(); } return clipboardActions; } /** * @return the actionRegistry */ public ActionRegistry getActionRegistry() { if (actionRegistry == null) actionRegistry = new ActionRegistry(); return actionRegistry; } /** * @param columnViewer the columnViewer to set */ protected void setColumnViewer(ColumnViewer columnViewer) { if (this.viewer != null) { this.viewer.removeSelectionChangedListener(this); } this.viewer = columnViewer; if (this.viewer != null) { this.viewer.addSelectionChangedListener(this); } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ @Override public void selectionChanged(SelectionChangedEvent event) { updateActions(getSelectionActions()); } protected ColumnViewer getColumnViewer() { return viewer; } protected void updateActions(final List<String> actionIds) { Display.getDefault().syncExec(new Runnable() { @Override public void run() { ActionRegistry registry = getActionRegistry(); Iterator<String> iter = actionIds.iterator(); while (iter.hasNext()) { IAction action = registry.getAction(iter.next()); if (action instanceof IUpdateAction) ((IUpdateAction) action).update(); } } }); } /** * @return the editingDomain */ public EditingDomain getEditingDomain() { return page.getEditingDomain(); } @Override protected void registerPages(DetailsPart detailsPart) { for(Object type:getElementTypes()){ IDetailsPage page = getDetailPage(type); if(this.page != null && page != null){ if(page instanceof JresDetailsPage){ ((JresDetailsPage)page).setPage(this.page); } detailsPart.registerPage(type, page); } } } /* (non-Javadoc) * @see org.eclipse.emf.common.command.CommandStackListener#commandStackChanged(java.util.EventObject) */ @Override public void commandStackChanged(EventObject event) { RefreshViewerJob.refresh((ColumnViewer)viewer, null, false); Command cmd = ((CommandStack)event.getSource()).getMostRecentCommand(); if (cmd != null) { RefreshViewerJob.refresh((ColumnViewer) viewer, cmd.getAffectedObjects().toArray()); } updateActions(getStackActions()); } /* (non-Javadoc) * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object, int) */ @Override public void propertyChanged(Object source, int propId) { updateActions(getPropertyActions()); } /** * @return the editableControl */ public IEditableControl getEditableControl() { return editableControl; } /** * ��ȡҳ��ı���ͼƬ * @return */ protected Image getPageHeadImage(){ return null; } /** * ��ȡҳ��ı��� * @return */ protected abstract String getPageHeadName(); /** * ��ȡ���section�ı��� * @return */ protected abstract String getSectionName(); /** * ��ȡ���section������ * @return */ protected abstract String getDescription(); /** * ��ȡ������Ҫ����detialҳ������� * @return */ protected abstract Object[] getElementTypes(); /** * ��ȡij���ض����͵�detialҳ�� * @param type * @return */ protected abstract IDetailsPage getDetailPage(Object type); /** * * @param client * @param managedForm * @param page * @return */ protected abstract ColumnViewer createViewer(Composite client,final IManagedForm managedForm,IEMFFormPage page); }