/** * Դ�������ƣ�GenSQLSelectPage.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.database.ui * ����˵����$desc * ����ĵ��� * ���ߣ� */ package com.hundsun.ares.studio.jres.database.ui.wizard.page; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Stack; import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Text; import com.hundsun.ares.studio.core.ARESModelException; import com.hundsun.ares.studio.core.IARESElement; import com.hundsun.ares.studio.core.IARESModule; import com.hundsun.ares.studio.core.IARESModuleRoot; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.ui.ARESElementSorter; import com.hundsun.ares.studio.ui.CommonElementContentProvider; import com.hundsun.ares.studio.ui.CommonElementLabelProvider; import com.hundsun.ares.studio.ui.control.CheckboxTreeViewerEx; /** * @author wangxh * */ public class GenSQLSelectPage extends WizardPage { /**ѡ���б�*/ CheckboxTreeViewerEx viewer; /**�Ҽ�ѡ�е�Ԫ��*/ ISelection select; /**���ɵ�·��*/ String path; /**·��*/ Text txtPath; CommonElementContentProvider cp; List<IARESResource>result = new ArrayList<IARESResource>(); /** * @param pageName */ public GenSQLSelectPage(String pageName,ISelection select) { super(pageName); this.select = select; setTitle(pageName); setDescription("��ѡ��Ҫ���ɵĶ����·��"); } private IARESElement[] getCheckedElements(Object[] selected) { Set<IARESElement> checkedElements = new HashSet<IARESElement>(); Stack<Object> selectElements = new Stack<Object>(); Collections.addAll(selectElements, selected); try { while (!selectElements.isEmpty()) { Object element = selectElements.pop(); if (element instanceof IARESModuleRoot) { Collections.addAll(selectElements, ((IARESModuleRoot) element).getChildren()); } else if (element instanceof IARESModule) { Collections.addAll(selectElements, ((IARESModule) element).getSubModules()); Collections.addAll(checkedElements, ((IARESModule) element).getChildren()); checkedElements.add((IARESModule) element); } else if (element instanceof IARESResource) { checkedElements.add((IARESResource) element); } } } catch (ARESModelException e) { // do nothing } return checkedElements.toArray(new IARESElement[checkedElements.size()]); } private IARESModuleRoot getModuleRoot(IARESElement element) { if (element instanceof IARESModuleRoot) { return (IARESModuleRoot) element; } else if (element instanceof IARESModule) { return ((IARESModule) element).getRoot(); } else if (element instanceof IARESResource) { return ((IARESResource) element).getRoot(); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { Composite client = new Composite(parent,SWT.None); Group viewerGroup = createResouceTreeviewer(client); Group buttonGroup = createButtons(client); // ��ѡ���Ԫ��ת��Ϊ����ѡ�е�Ԫ�� IARESElement[] elements = getCheckedElements(((IStructuredSelection)select).toArray()); IARESModuleRoot root = getModuleRoot(elements[0]); Assert.isNotNull(root); viewer.setInput(root); viewer.setCheckedElements(elements); viewer.setFilters(new ViewerFilter[]{new DBFilter()}); Group pathGroup = new Group(client, SWT.None); pathGroup.setText("ѡ������·��"); pathGroup.setLayout(new GridLayout(2, false)); txtPath = new Text(pathGroup, SWT.BORDER); Button btnPath = new Button(pathGroup, SWT.None); btnPath.setText("ѡ��·��"); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(client); GridDataFactory.fillDefaults().hint(200, 300).grab(true, true).applyTo(viewerGroup); GridDataFactory.fillDefaults().grab(false, true).hint(80, -1).applyTo(buttonGroup); GridDataFactory.fillDefaults().span(2, -1).grab(true, false).applyTo(pathGroup); GridDataFactory.fillDefaults().grab(true, false).applyTo(txtPath); GridDataFactory.fillDefaults().grab(false, false).applyTo(btnPath); setControl(client); UpdatePageComplete(); btnPath.addSelectionListener(new SelectionAdapter() { /* (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(getShell()); String path = dialog.open(); if(StringUtils.isNotBlank(path)){ txtPath.setText(path); } } }); txtPath.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { path = txtPath.getText(); UpdatePageComplete(); } }); } private void setAllChecked(final boolean state) { BusyIndicator.showWhile(viewer.getTree().getShell().getDisplay(), new Runnable(){ @Override public void run() { for (Object obj : cp.getElements(viewer.getInput())) { viewer.checkChange(new CheckStateChangedEvent(viewer, obj, state)); } } }); } /** * @param client * @return */ private Group createButtons(Composite client) { Group buttonGroup = new Group(client, SWT.None); Button btnSelectAll = new Button(buttonGroup, SWT.PUSH); btnSelectAll.setText("ȫѡ"); btnSelectAll.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { setAllChecked(true); UpdatePageComplete(); }}); Button btnDeselectAll = new Button(buttonGroup, SWT.PUSH); btnDeselectAll.setText("ȡ��ȫѡ"); btnDeselectAll.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { setAllChecked(false); UpdatePageComplete(); }}); buttonGroup.setLayout(new GridLayout(1, true)); GridDataFactory.fillDefaults().grab(true, false).applyTo(btnSelectAll); GridDataFactory.fillDefaults().grab(true, false).applyTo(btnDeselectAll); return buttonGroup; } /** * @param client * @return */ private Group createResouceTreeviewer(Composite client) { Group viewerGroup = new Group(client, SWT.None); viewerGroup.setText("ѡ����Դ"); viewerGroup.setLayout(new GridLayout(4,false)); viewerGroup.setLayoutData(new GridData(GridData.FILL_BOTH)); viewer = new CheckboxTreeViewerEx(viewerGroup, SWT.CHECK |SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); cp= new CommonElementContentProvider(){ /* (non-Javadoc) * @see com.hundsun.ares.studio.ui.CommonElementContentProvider#getModuleChildren(com.hundsun.ares.studio.core.IARESModule) */ @Override protected Object[] getModuleChildren(IARESModule module) throws ARESModelException { List<Object> list= new ArrayList<Object>(); list.addAll(Arrays.asList(module.getARESResources())); list.addAll(Arrays.asList(super.getModuleChildren(module))); return list.toArray(new Object[0]); } /* (non-Javadoc) * @see com.hundsun.ares.studio.ui.ARESElementContentProvider#getElements(java.lang.Object) */ @Override public Object[] getElements(Object element) { if(input instanceof IARESResource){ return new Object[]{input}; } return super.getElements(element); } }; viewer.setContentProvider(cp); viewer.setLabelProvider(new CommonElementLabelProvider(cp)); viewer.setComparator(new ARESElementSorter()); viewer.setUseHashlookup(true); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 4; gd.widthHint = 10; viewer.getTree().setLayoutData(gd); viewer.addCheckStateListener(new ICheckStateListener(){ public void checkStateChanged( final CheckStateChangedEvent event) { UpdatePageComplete(); //����ҳ���Ƿ���� }}); return viewerGroup; } private void UpdatePageComplete() { result = getSelectedResouces(); if(result.size() > 0 && StringUtils.isNotBlank(path)){ setPageComplete(true); }else{ setPageComplete(false); } } /** * ��ȡ��ѡ�е���Դ * @return */ private List<IARESResource> getSelectedResouces(){ List<IARESResource> resources = new ArrayList<IARESResource>(); Object obj[] = viewer.getCheckedElements(); for (Object object : obj) { if (object instanceof IARESResource) { resources.add((IARESResource) object); } } return resources; } /** * ��ȡ����ѡ�е���Դ * @return */ public List<IARESResource> getResult() { return result; } /** * ��ȡ·�� * @return the path */ public String getPath() { return path; } class DBFilter extends ViewerFilter { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IARESModule) { return true; } else if ((element instanceof IARESResource)){ if(StringUtils.equals("module.xml", ((IARESResource)element).getElementName())){ return false; } return true; } return false; } } }