/**
* Դ�������ƣ�ButtonGroupManager.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.ui
* ����˵����JRES Studio�Ľ���չ�ֻ�����ܺͱ༭��ع���
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.ui.editor.actions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
/**
* ��Ҫ�Ա����������Control���в���
* @author gongyf
*
*/
public class ButtonGroupManager {
private final static String KEY_ACTION = "action";
private ToolBar composite;
private List<IAction> actions = new ArrayList<IAction>();
/**
* ��Action�Ŀ���״̬ͬ������ť��ȥ
*/
private IPropertyChangeListener listener = new IPropertyChangeListener(){
public void propertyChange(PropertyChangeEvent event) {
if (IAction.ENABLED.equals(event.getProperty()) ) {
updateEnableStatus();
} else if (IAction.TEXT.equals(event.getProperty())){
updateTexts();
}
}};
public void add(IAction action) {
actions.add(action);
action.addPropertyChangeListener(listener);
update();
}
public void remove(IAction action) {
actions.remove(action);
action.removePropertyChangeListener(listener);
update();
}
public void replaceActions(Collection<IAction> actions) {
for (IAction action : this.actions) {
action.removePropertyChangeListener(listener);
}
this.actions.clear();
this.actions.addAll(actions);
for (IAction action : this.actions) {
action.addPropertyChangeListener(listener);
}
update();
}
public Composite getControl() {
return composite;
}
protected ToolItem createButton(IAction action) {
ToolItem button = new ToolItem(composite, SWT.PUSH );
button.setData(KEY_ACTION, action);
button.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
IAction action = (IAction) e.widget.getData(KEY_ACTION);
action.run();
}
});
//GridDataFactory.fillDefaults().grab(true, false).applyTo(button);
return button;
}
public void createControl(Composite parent) {
composite = new ToolBar(parent, SWT.VERTICAL);
update();
GridLayoutFactory.swtDefaults().applyTo(composite);
composite.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
ButtonGroupManager.this.dispose();
}
});
}
protected void updateEnableStatus() {
if (composite != null) {
ToolItem[] children = composite.getItems();
for (ToolItem control : children) {
IAction action = (IAction) control.getData(KEY_ACTION);
control.setEnabled(action.isEnabled());
}
}
}
protected void updateTexts() {
if (composite != null) {
ToolItem[] children = composite.getItems();
for (ToolItem control : children) {
IAction action = (IAction) control.getData(KEY_ACTION);
Assert.isNotNull(action.getText(), "Action����������Text");
((ToolItem)control).setText(action.getText());
}
}
}
protected void updateImages() {
if (composite != null) {
ToolItem[] children = composite.getItems();
for (ToolItem control : children) {
IAction action = (IAction) control.getData(KEY_ACTION);
action.getImageDescriptor();
((ToolItem)control).setText(action.getText());
}
}
}
public void update() {
if (composite != null) {
ToolBar toolbar = new ToolBar(composite, SWT.VERTICAL);
ToolItem[] children = composite.getItems();
// ����ӳ��
Map<IAction, ToolItem> actionToButtonMap = new HashMap<IAction, ToolItem>();
for (ToolItem button : children) {
actionToButtonMap.put((IAction) button.getData(KEY_ACTION), button);
}
List<ToolItem> newButtons = new ArrayList<ToolItem>();
Set<ToolItem> removedButtons = new HashSet<ToolItem>(Arrays.asList(children));
for (int i = 0; i < actions.size(); i++) {
IAction action = actions.get(i);
ToolItem button = actionToButtonMap.get(action);
if (button == null) {
// ��Ҫ����
button = createButton(action);
} else {
removedButtons.remove(button);
}
newButtons.add(button);
}
for (ToolItem button : removedButtons) {
button.dispose();
}
removedButtons.clear();
actionToButtonMap.clear();
updateEnableStatus();
updateTexts();
composite.layout();
}
}
public void dispose() {
composite = null;
actions.clear();
actions = null;
}
}