/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.jres.script.internal.useroption;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.IARESModuleRoot;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.jres.script.internal.useroption.control.ControlManager;
import com.hundsun.ares.studio.jres.script.internal.useroption.control.IUserOptionControlProvider;
import com.hundsun.ares.studio.ui.ARESElementContentProvider;
import com.hundsun.ares.studio.ui.CommonElementLabelProvider;
/**
* FIXME ���ɽ���Ի���
* ����xml���ö�̬�����û�����
* ���ṩCHECK,RADIO,TEXT,COMBO���ֿؼ�������
* @author maxh
* @version 1.0
* @history
*/
public class UserOptionDialog extends org.eclipse.jface.dialogs.Dialog {
UserOptionRoot optionRoot;
IARESProject project;
public UserOptionDialog (Shell parentShell, UserOptionRoot xmlDialog , IARESProject project) {
super (parentShell);
this.optionRoot = xmlDialog;
this.project = project;
}
protected void setShellStyle(int newShellStyle) {
super.setShellStyle(newShellStyle | SWT.RESIZE | SWT.MAX);
}
private void create(Composite parent,IControlContainer container){
for(IControl contrl:container.getChildren()){
if(StringUtils.equals(IControl.TYPE_GROUP, contrl.getType())){
Group menuGroup = new Group (parent, SWT.NONE);
menuGroup.setVisible (true);
if (((IControlContainer)contrl).getChildren().length / 4 > 1) {
menuGroup.setLayout (new GridLayout(4, true));
}else {
menuGroup.setLayout (new GridLayout(4, false));
}
menuGroup.setText (contrl.getText());
/**
* ��Ϊ��RADIO��ԭ��group�����ȴ����ӿؼ��ٵ���setControl
*/
create(menuGroup, (IControlContainer)contrl);
contrl.setControl(menuGroup);
} else if(StringUtils.equals(IControl.TYPE_MODULE, contrl.getType())){
createRadioModuleCom(contrl, parent);
} else if(StringUtils.equals(IControl.TYPE_TEXT, contrl.getType())){
Label lable = new Label (parent, SWT.NONE);
lable.setText(contrl.getText());
Text text = new Text(parent, SWT.NONE);
contrl.setControl(text);
} else if(StringUtils.equals(IControl.TYPE_CHECK, contrl.getType())){
Button btn = new Button (parent, SWT.CHECK);
btn.setText (contrl.getText());
contrl.setControl(btn);
} else if(StringUtils.equals(IControl.TYPE_RADIO, contrl.getType())){
Button btn = new Button (parent, SWT.RADIO);
btn.setText (contrl.getText());
contrl.setControl(btn);
} else if(StringUtils.equals(IControl.TYPE_COMBO, contrl.getType())){
Label lable = new Label (parent, SWT.NONE);
lable.setText(contrl.getText());
Combo combo = new Combo(parent, SWT.READ_ONLY);
contrl.setControl(combo);
} else {
// Ĭ�ϵ�ʹ����չ��������
IUserOptionControlProvider provider = ControlManager.getInstance().getTypeProvider(contrl.getType());
if (provider != null) {
Control uiControl = provider.createUIControl(parent, contrl, project);
contrl.setControl(uiControl);
}
}
}
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea (parent);
create(composite, optionRoot);
return composite;
}
@Override
protected void okPressed() {
optionRoot.setOptionValue();
super.okPressed ();
}
@Override
public Shell getShell() {
Shell shell = super.getShell();
shell.setText("�û�����");
return shell;
}
private void createRadioModuleCom(final IControl contrl ,final Composite parent){
Label lable = new Label (parent, SWT.NONE);
lable.setText(contrl.getText());
final Text text = new Text(parent, SWT.NONE);
Button button = new Button(parent, SWT.BUTTON2);
button.setText("���");
GridDataFactory.fillDefaults().grab(true, false).applyTo(text);
GridDataFactory.fillDefaults().grab(true, false).applyTo(parent);
GridDataFactory.swtDefaults().applyTo(button);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
super.widgetSelected(e);
ARESElementContentProvider cp = new ARESElementContentProvider(){
@Override
protected Object[] getModuleRootChildren(
IARESModuleRoot root) throws ARESModelException {
List<IARESModule> modules = new ArrayList<IARESModule>();
for (IARESModule module : root.getModules()) {
if (StringUtils.isNotBlank(module.getElementName()) && StringUtils.indexOf(module.getElementName(), ".") == -1) {
modules.add(module);
}
}
return modules.toArray(new IARESModule[0]);
}
@Override
protected Object[] getModuleChildren(IARESModule module)
throws ARESModelException {
String moduleName = module.getElementName();
List<IARESModule> reMods = new ArrayList<IARESModule>();
for(IARESModule sm : module.getSubModules()){
if (StringUtils.split(sm.getElementName(), ".").length == StringUtils.split(moduleName , ".").length+1) {
reMods.add(sm);
}
}
return reMods.toArray(new IARESModule[0]);
}
@Override
protected Object[] getProjectChildren(IARESProject project) {
try {
return new Object[]{project.getModuleRoot(contrl.getModuleRoot())};
} catch (ARESModelException e) {
e.printStackTrace();
}
return null;
}
};
if (StringUtils.equals(contrl.getControlType(), IControl.TYPE_CHECK)) {
CheckedTreeSelectionDialog checkDialog = new CheckedTreeSelectionDialog(
parent.getShell(),
new CommonElementLabelProvider(null),//WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
cp){
protected CheckboxTreeViewer createTreeViewer(Composite parent) {
CheckboxTreeViewer tv = super.createTreeViewer(parent);
tv.addCheckStateListener(new CheckStateListener(tv));
return tv;
}
};
checkDialog.setInput(project);
int returnValue = checkDialog.open();
if (Dialog.OK == returnValue) {
Object[] result = checkDialog.getResult();
List<String> mn = new ArrayList<String>();
for (Object obj : result) {
if(obj instanceof IARESModule){
mn.add(((IARESModule) obj).getElementName());
}
}
text.setText(StringUtils.join(mn, ","));
}
}else {
ElementTreeSelectionDialog fileDialog = new ElementTreeSelectionDialog(
parent.getShell(),
new CommonElementLabelProvider(null),//WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
cp);//new WorkbenchContentProvider());
fileDialog.setAllowMultiple(false);
fileDialog.setInput(project);
int returnValue = fileDialog.open();
if (Dialog.OK == returnValue) {
Object[] result = fileDialog.getResult();
List<String> mn = new ArrayList<String>();
for (Object obj : result) {
if(obj instanceof IARESModule){
mn.add(((IARESModule) obj).getElementName());
}
}
text.setText(StringUtils.join(mn, ","));
}
}
}
});
contrl.setControl(text);
}
class CheckStateListener implements ICheckStateListener {
private CheckboxTreeViewer tv;
protected CheckStateListener(CheckboxTreeViewer tv){
this.tv = tv;
}
public void checkStateChanged(CheckStateChangedEvent event) {
Object thisObj = event.getElement();
tv.setSubtreeChecked(thisObj, event.getChecked());
}
}
}