package com.hundsun.ares.studio.ui.editor.outline; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IActionBars; import org.eclipse.ui.PartInitException; import org.eclipse.ui.SubActionBars; import org.eclipse.ui.part.IPageBookViewPage; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.part.Page; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; /** * ���ڶ�ҳ�༭���������Ҫÿ��ҳ���Ӧ�Լ��Ĵ����ͼ������������༭���ڷ������ * �����ͼ�ࡣ��Ҫ�ڶ�ҳ�༭����{@link MultiPageEditorPart#pageChange(int newPageIndex)} * ����{@link #setPageActive(IContentOutlinePage)}�����һ���Ҫע�ⲻҪ����ͬһ��ҳ���ж����ٶ���ʵ�� * @author gongyf * */ public class ContentOutlinePageForMultiPageEditorPart extends Page implements IContentOutlinePage, ISelectionChangedListener, IAdaptable { private IActionBars actionBars; private PageBook pagebook; private ISelection selection; private ArrayList<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();; private IContentOutlinePage currentPage; private IContentOutlinePage emptyPage; private Map<IContentOutlinePage, SubActionBars> pageToActionBarsMap = new HashMap<IContentOutlinePage, SubActionBars>(); @Override public void createControl(Composite parent) { pagebook = new PageBook(parent, SWT.NONE); } @Override public Control getControl() { return pagebook; } @Override public void setFocus() { if (currentPage != null) currentPage.setFocus(); } public Object getAdapter(Class adapter) { if (currentPage instanceof IAdaptable) { return ((IAdaptable) currentPage).getAdapter(adapter); } return null; } @Override public void dispose() { if (pagebook != null && !pagebook.isDisposed()) pagebook.dispose(); if (emptyPage != null) { emptyPage.dispose(); emptyPage = null; } pagebook = null; listeners = null; super.dispose(); } public void addSelectionChangedListener(ISelectionChangedListener listener) { listeners.add(listener); } public ISelection getSelection() { return selection; } public void removeSelectionChangedListener( ISelectionChangedListener listener) { listeners.remove(listener); } public void setSelection(ISelection selection) { this.selection = selection; SelectionChangedEvent e = new SelectionChangedEvent(this, selection); for (ISelectionChangedListener listener : listeners) { listener.selectionChanged(e); } } public void selectionChanged(SelectionChangedEvent event) { setSelection(event.getSelection()); } public void setActionBars(IActionBars actionBars) { this.actionBars = actionBars; if (currentPage != null) setPageActive(currentPage); } public IActionBars getActionBars() { return actionBars; } private IContentOutlinePage getEmptyPage() { if (emptyPage == null) emptyPage = new EmptyOutlinePage(); return emptyPage; } public void setPageActive(IContentOutlinePage page) { if (page == null) { page = getEmptyPage(); } if (currentPage != null) { currentPage.removeSelectionChangedListener(this); } page.addSelectionChangedListener(this); IContentOutlinePage oldPage = this.currentPage; this.currentPage = page; if (pagebook == null) { // still not being made return; } Control control = page.getControl(); if (control == null || control.isDisposed()) { if (page instanceof IPageBookViewPage) { try { SubPageSite subPageSite = new SubPageSite(getSite(), getActionBars()); ((IPageBookViewPage) page).init(subPageSite); pageToActionBarsMap.put(page, subPageSite.getActionBars()); } catch (PartInitException e) { e.printStackTrace(); } } // first time page.createControl(pagebook); if (!(page instanceof IPageBookViewPage)) { SubActionBars subActionBars = new SubActionBars(getActionBars()); page.setActionBars(subActionBars); pageToActionBarsMap.put(page, subActionBars); } control = page.getControl(); } pagebook.showPage(control); // ��ActionBar�ĸ��� SubActionBars subActionBars = pageToActionBarsMap.get(oldPage); if (subActionBars != null) { subActionBars.deactivate(); } subActionBars = pageToActionBarsMap.get(page); if (subActionBars != null) { subActionBars.activate(); } // ����ݼ�����ע�� if (subActionBars != null) { getActionBars().clearGlobalActionHandlers(); Map newActionHandlers = subActionBars.getGlobalActionHandlers(); if (newActionHandlers != null) { Set keys = newActionHandlers.entrySet(); Iterator iter = keys.iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); getActionBars().setGlobalActionHandler((String) entry.getKey(), (IAction) entry.getValue()); } } } getActionBars().updateActionBars(); } static class EmptyOutlinePage implements IContentOutlinePage { private Composite control; /** * */ public EmptyOutlinePage() { } /* (non-Javadoc) * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { control = new Composite(parent, SWT.NULL); } /* (non-Javadoc) * @see org.eclipse.ui.part.IPage#dispose() */ public void dispose() { } /* (non-Javadoc) * @see org.eclipse.ui.part.IPage#getControl() */ public Control getControl() { return control; } /* (non-Javadoc) * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars) */ public void setActionBars(IActionBars actionBars) { } /* (non-Javadoc) * @see org.eclipse.ui.part.IPage#setFocus() */ public void setFocus() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void addSelectionChangedListener(ISelectionChangedListener listener) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ public ISelection getSelection() { return new ISelection() { public boolean isEmpty() { return true; } }; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void removeSelectionChangedListener(ISelectionChangedListener listener) { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) */ public void setSelection(ISelection selection) { } } }