package org.quickbundle.mda.gc; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Element; import org.dom4j.Node; import org.eclipse.jface.dialogs.IPageChangingListener; import org.eclipse.jface.dialogs.PageChangingEvent; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.quickbundle.mda.gc.project.IConfigProject; public class Config3MvmWizardPage extends WizardPage implements Listener { //Wizard对象 private GenerateCodeRule gcRule = null; private Combo comboMvm = null; public Config3MvmWizardPage(GenerateCodeWizard currentWizard) { super("mvmWizardPage"); setTitle("生成代码 3/3: 配置MVM参数"); //setDescription("请填入所有参数,然后点完成!"); this.gcRule = currentWizard.getGcRule(); } public void createControl(final Composite parent) { final int columns = 4; //定义列数 Composite container = null; if(parent.getChildren() != null && parent.getChildren().length > 1 && parent.getChildren()[1] instanceof ScrolledComposite) { ScrolledComposite scroll = (ScrolledComposite)parent.getChildren()[1]; container = new Composite(scroll, SWT.NULL); scroll.setContent(container); } else { container = new Composite(parent, SWT.NULL); } container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); container.setLayout(new GridLayout(columns, false)); GridData gd = null; Label labelTemplateSource = new Label(container, SWT.NULL); labelTemplateSource.setText("请选择模板源:"); gd = new GridData(GridData.CENTER); gd.horizontalSpan = columns; labelTemplateSource.setLayoutData(gd); new Label(container, SWT.NULL).setText("模板"); comboMvm = new Combo(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY); comboMvm.setItems(getMvmContextNames()); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; gd.widthHint = 800; comboMvm.setLayoutData(gd); new Label(container, SWT.NULL).setText("框架"); final Text textFramework = new Text(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY); textFramework.setText("jQuery-1.6 + Html + SpringMVC-3.2 + Spring-3.2 + MyBatis-3.2"); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; textFramework.setLayoutData(gd); createLine(container, columns); Label labelProjectPropHead = new Label(container, SWT.NULL); labelProjectPropHead.setText("请定义项目属性:"); gd = new GridData(GridData.CENTER); gd.horizontalSpan = columns; labelProjectPropHead.setLayoutData(gd); //选择不同的mvm final Canvas canvasProject = new Canvas(container, SWT.NONE); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = columns; canvasProject.setLayoutData(gd); comboMvm.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { Combo comboMvm = (Combo)e.getSource(); Element mvm = getMvm(comboMvm.getText()); textFramework.setText(mvm.valueOf("framework")); String configProjectClass = mvm.valueOf("configProjectClass"); if(configProjectClass == null || configProjectClass.trim().length() == 0) { return; } IConfigProject cp = null; try { cp = createInstance(configProjectClass.trim()); } catch (Exception e1) { e1.printStackTrace(); updateStatus(e1.toString()); } comboMvm.setData(cp); cp.draw(canvasProject, getProjectMap()); bindFocusIn(canvasProject); parent.layout(); } }); if(comboMvm.getItemCount() > 0) { comboMvm.select(0); } //定义Next事件 WizardDialog dialog = (WizardDialog) getContainer(); dialog.addPageChangingListener(new IPageChangingListener() { public void handlePageChanging(PageChangingEvent event) { if(event.getCurrentPage() instanceof Config3MvmWizardPage) { } } }); setControl(container); try { doValidateSaveProject(); } catch (Exception e1) { updateStatus("校验失败:" + e1.toString()); } } void bindFocusIn(Canvas canvasProject) { Control[] controls = canvasProject.getChildren(); for(Control ctrl : controls) { if(ctrl instanceof Text) { ctrl.addListener(SWT.Modify, this); } } } IConfigProject createInstance(String configProjectClass) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Object obj =this.getClass().getClassLoader().loadClass(configProjectClass).newInstance(); return (IConfigProject)obj; } @SuppressWarnings("unchecked") List<Element> getMvms() { return gcRule.getMainRule().selectNodes("/rules/codegen/mvms/mvm"); } String[] getMvmContextNames() { List<Element> lMvm = getMvms(); List<String> result = new ArrayList<String>(); for(Element mvm : lMvm) { result.add(mvm.valueOf("contextName")); } return result.toArray(new String[0]); } Element getMvm(String contextName) { return (Element)gcRule.getMainRule().selectSingleNode("/rules/codegen/mvms/mvm[contextName='" + contextName + "']"); } @SuppressWarnings("unchecked") public Map<String, String> getProjectMap() { Map<String, String> result = new HashMap<String, String>(); List<Node> lProperty = gcRule.getMainRule().selectNodes("/rules/project/node()"); for(Node property : lProperty) { if(property instanceof Element) { result.put(property.getName(), property.getText()); } } result.put("baseProjectPath", gcRule.getMainRule().valueOf("/rules/codegen/@baseProjectPath")); return result; } //生成一行分隔线 public static void createLine(Composite container, int ncol) { Label line = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL | SWT.BOLD); GridData gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = ncol; line.setLayoutData(gridData); } public void handleEvent(Event event) { if(event.type == SWT.Modify) { try { doValidateSaveProject(); } catch (Exception e1) { updateStatus("校验失败:" + e1.toString()); e1.printStackTrace(); event.doit = false; } } } private void doValidateSaveProject() throws Exception { Element mvms = (Element)gcRule.getMainRule().selectSingleNode("/rules/codegen/mvms"); mvms.addAttribute("contextName", comboMvm.getText()); IConfigProject cp = (IConfigProject)comboMvm.getData(); String errorMsg = cp.validate(); if(errorMsg != null) { throw new RuntimeException(errorMsg); } Map<String, String> projectMap = cp.extractProjectMap(); Element project = (Element)gcRule.getMainRule().selectSingleNode("/rules/project"); for(Map.Entry<String, String> en : projectMap.entrySet()) { Node node = project.selectSingleNode(en.getKey()); if(node == null) { node = project.addElement(en.getKey()); } node.setText(en.getValue()); } gcRule.save(); updateStatus(null); } public void updateStatus(String message) { setErrorMessage(message); if(message == null) { setPageComplete(true); } else { setPageComplete(false); } } }