/**
* Դ�������ƣ�ColumnViewerListPage.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.log4j.Logger;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStack;
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.IContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
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.layout.FillLayout;
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.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;
import com.hundsun.ares.studio.ui.editor.EMFFormEditor;
import com.hundsun.ares.studio.ui.editor.EMFFormPage;
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.viewers.RefreshViewerJob;
/**
* ��һ��ColumnViewer��Ϊ��Ҫ�༭������ı༭��ҳ<br>
* �ṩ��Actionע�������ܸ�������ˢ�¼̳���{@link IUpdateAction}��Action<BR>
* Action��ˢ�·�Ϊ3��
* <li>��ColumnViewer��ѡ���л���ʱ��ˢ�µ� {@link #getSelectionActions()}</li>
* <li>������ջ�仯��ʱ��ˢ�µ� {@link #getStackActions()}</li>
* <li>�༭�����Ա仯��ʱ��ˢ�µ� {@link #getPropertyActions()}</li>
*
* Action��ʹ����Ҫ����{@link #createActions()}�н��д�����ע��<br>
* ��{@link #createButtons(ButtonGroupManager)}����Action�����ô�����ť�б�<br>
* ��{@link #createMenus(IMenuManager)}����Action�����ô����˵��б�
* @author gongyf
*
*/
public abstract class ColumnViewerListPage extends EMFFormPage implements ISelectionChangedListener {
private static final Logger logger = Logger.getLogger(ColumnViewerListPage.class);
private ColumnViewer columnViewer;
private ActionRegistry actionRegistry;
private List<String> selectionActions;
private List<String> stackActions;
private List<String> propertyActions;
/**
* @param editor
* @param id
* @param title
*/
public ColumnViewerListPage(EMFFormEditor editor, String id, String title) {
super(editor, id, title);
}
/**
* @param columnViewer the columnViewer to set
*/
protected void setColumnViewer(ColumnViewer columnViewer) {
if (this.columnViewer != null) {
this.columnViewer.removeSelectionChangedListener(this);
}
this.columnViewer = columnViewer;
if (this.columnViewer != null) {
this.columnViewer.addSelectionChangedListener(this);
}
}
/**
* @return the columnViewer
*/
public ColumnViewer getColumnViewer() {
return columnViewer;
}
/**
* @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 actionRegistry
*/
protected ActionRegistry getActionRegistry() {
if (actionRegistry == null)
actionRegistry = new ActionRegistry();
return actionRegistry;
}
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();
}
}
});
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateActions(getSelectionActions());
}
protected Control createClient(Composite parent, FormToolkit toolkit) {
Composite client = toolkit.createComposite(parent);
Control viewer = createColumnViewer(client, toolkit);
Control buttons = createViewerButtons(client, toolkit);
GridLayoutFactory.swtDefaults().numColumns(2).applyTo(client);
GridDataFactory.fillDefaults().hint(100, 100).grab(true, true).applyTo(viewer);
GridDataFactory.fillDefaults().grab(false, true).hint(80, -1).applyTo(buttons);
return client;
}
/**
* �ڲ�����{@link #setColumnViewer(ColumnViewer)} ��{@link #configureColumnViewer(ColumnViewer)}
* @param parent
* @param toolkit
* @return
*/
protected Control createColumnViewer(Composite parent, FormToolkit toolkit) {
TableViewer viewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(true);
setColumnViewer(viewer);
configureColumnViewer(getColumnViewer());
return viewer.getControl();
}
protected abstract void createMenus(IMenuManager menuManager);
protected abstract void createColumns(ColumnViewer viewer);
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.form.EMFFormPage#doCreateFormContent(org.eclipse.ui.forms.IManagedForm)
*/
@Override
protected void doCreateFormContent(IManagedForm managedForm) {
Composite body = managedForm.getForm().getBody();
FormToolkit toolkit = managedForm.getToolkit();
createClient(body, toolkit);
body.setLayout(new FillLayout());
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.form.EMFFormPage#infoChange()
*/
@Override
public void infoChange() {
getColumnViewer().setInput(getInfo());
updateActions(getPropertyActions());
updateActions(getSelectionActions());
super.infoChange();
updateActions(getStackActions());
}
protected Control createViewerButtons(Composite parent, FormToolkit toolkit) {
ButtonGroupManager btnGroupManager = new ButtonGroupManager();
createButtons(btnGroupManager);
btnGroupManager.createControl(parent);
toolkit.adapt(btnGroupManager.getControl());
return btnGroupManager.getControl();
}
protected void createButtons(ButtonGroupManager manager) {
}
/**
* ��ñ��������ṩ��
* @return
*/
protected abstract IContentProvider getColumnViewerContentProvider();
protected void configureColumnViewer(ColumnViewer viewer) {
viewer.setUseHashlookup(true);
createColumns(viewer);
viewer.setContentProvider(getColumnViewerContentProvider());
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);
// �������tooltip��ʾ
ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.RECREATE);
// ��Ϊ��ť�����DZ����صģ����Ա���ȱ����ɺ��ʼ������
initializeActionRegistry();
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.form.EMFFormPage#commandStackChanged(java.util.EventObject)
*/
@Override
public void commandStackChanged(EventObject event) {
super.commandStackChanged(event);
RefreshViewerJob.refresh(getColumnViewer(), null, false);
Command cmd = ((CommandStack)event.getSource()).getMostRecentCommand();
if (cmd != null) {
RefreshViewerJob.refresh(getColumnViewer(), cmd.getAffectedObjects().toArray());
}
updateActions(getStackActions());
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#firePropertyChange(int)
*/
@Override
protected void firePropertyChange(int propertyId) {
super.firePropertyChange(propertyId);
updateActions(getPropertyActions());
}
protected void initializeActionRegistry() {
createActions();
updateActions(getPropertyActions());
updateActions(getStackActions());
}
protected void createActions() {
}
@Override
public void setActive(boolean active) {
super.setActive(active);
if (active) {
ColumnViewer viewer = getColumnViewer();
if (viewer != null) {
getSite().setSelectionProvider(viewer);
logger.debug("Selection provider: " + viewer.hashCode() + " Site: " + getSite().hashCode());
} else {
logger.debug("Page actived, but no viewer!");
}
}
}
}