package com.hundsun.ares.studio.cres.ui.action; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.PartInitException; import org.eclipse.ui.ide.IDE; import com.hundsun.ares.studio.core.ConsoleHelper; import com.hundsun.ares.studio.core.IARESModule; import com.hundsun.ares.studio.core.IARESProject; import com.hundsun.ares.studio.cres.extend.ui.module.gencode.GenCresModuleCodeManager; import com.hundsun.ares.studio.cres.extend.ui.module.gencode.IGenCresModuleCode; import com.hundsun.ares.studio.cres.extend.ui.module.gencode.MakeFileGenerator; import com.hundsun.ares.studio.cres.extend.ui.module.gencode.util.ModuleGeneratorHelper; import com.hundsun.ares.studio.ui.action.PopupAction; public class GenModuleCodeWithPathAction extends PopupAction{ private static Logger logger = Logger.getLogger(GenModuleCodeWithPathAction.class); static final Logger console = ConsoleHelper.getLogger(); static boolean running = false;//�Ƿ��������� static boolean isProcedureModule = false;//�Ƿ�Ϊ�洢����ģ�� private IARESProject project; private Set<IARESModule> modules = new HashSet<IARESModule>(); protected boolean isHeadCode = false; protected boolean isEndCode = false; /* (non-Javadoc) * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) */ @Override public void run(IAction action) { if (running) { MessageDialog dialog = new MessageDialog(getShell(), "ģ���������", null, "����ģ������������ɣ����Ժ�������", MessageDialog.INFORMATION, new String[] { "ȷ��" }, 0); dialog.open(); return; } Job job = new Job("����ģ�����") { @Override protected IStatus run(IProgressMonitor monitor) { try { running = true; HashSet<IGenCresModuleCode> genModuleCodeSet = GenCresModuleCodeManager.getInstance().getSet(); String newPath = ModuleGeneratorHelper.getModuleGenCodePath(project); //�ڲ���Ŀ¼���ɵ�����£�����������ϵȷ������˳�� if(!isGenCodeWithPath() && !isProcedureModule){ MakeFileGenerator generator = new MakeFileGenerator(modules); generator.createMakeFileWithoutFolder(newPath); } monitor.beginTask("����ģ�����", (modules.size() + genModuleCodeSet.size())*10 + 1); monitor.worked(1); for (IARESModule module : modules) { long l1 = System.currentTimeMillis(); StringBuffer errLog = new StringBuffer(); GenCresModuleCodeManager.getInstance(); for (IGenCresModuleCode genModuleCode : genModuleCodeSet) { if(genModuleCode.canGenCode(module)) { genModuleCode.setErrLog(errLog); genModuleCode.setIsHeadCode(isHeadCode); genModuleCode.setIsEndCode(isEndCode); genModuleCode.genModuleCode(module, genModuleCode.getContext(project), isGenCodeWithPath(), isGenCodeWithCNamePath(), new SubProgressMonitor(monitor, 10)); } monitor.worked(10); } openErrorLog(errLog, true); if(monitor.isCanceled()){ break; } long l2 = System.currentTimeMillis(); System.out.println("ģ��[" + module.getElementName() +"]����������ʱ��" + (l2-l1) + " ms"); } for (IGenCresModuleCode genModuleCode : genModuleCodeSet) { genModuleCode.clearCache(); } monitor.done(); running = false; } catch (Exception e) { running = false; } openDoneDialog(); return Status.OK_STATUS; } }; job.setUser(true); job.schedule(); } public static void genModuleCode() { } /** * ����ɶԻ��� */ protected void openDoneDialog() { getShell().getDisplay().asyncExec(new Runnable() { @Override public void run() { //���·�������� String path = ModuleGeneratorHelper.getModuleGenCodePath(project); MessageDialog dialogPath = new MessageDialog(getShell(), "�����������", null, "���ɸ�·����" + path, MessageDialog.INFORMATION, new String[] { "ȷ��" }, 0); dialogPath.open(); } }); } /** * ���������Ƿ��Ŀ¼�ṹ * @return */ protected boolean isGenCodeWithPath() { return true; } /** * ��������Ŀ¼�Ƿ�ʹ��ģ����������ΪĿ¼�� * @return */ protected boolean isGenCodeWithCNamePath() { return false; } /** * �򿪴�����־ * @param errLog * ������Ϣ * @param openErrorLog * �Ƿ�򿪴�����־�ļ� */ protected void openErrorLog(StringBuffer errLog,boolean openErrorLog) { // ������־Ϊ�յĻ�����д�ļ��� if(!errLog.toString().trim().equals("")) { errLog.insert(0, "������־��\n"); String fileName = "genCodeReport" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ".txt"; final IFile fReport = project.getProject().getFile(fileName); try { if (!fReport.exists()) { fReport.create( new ByteArrayInputStream(errLog.toString().getBytes(project.getProject().getDefaultCharset())), true, new NullProgressMonitor()); } else { fReport.setContents(new ByteArrayInputStream(errLog.toString().getBytes( project.getProject().getDefaultCharset())), true, false, new NullProgressMonitor()); } if(openErrorLog){ getShell().getDisplay().asyncExec(new Runnable() { @Override public void run() { try { IDE.openEditor(getWorkbenchPart().getSite().getPage(), fReport, true); } catch (PartInitException e) { e.printStackTrace(); } } }); } } catch (CoreException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } /* (non-Javadoc) * @see com.hundsun.ares.studio.ui.action.PopupAction#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) */ @Override public void selectionChanged(IAction action, ISelection selection) { if (running) { action.setEnabled(false); return; } modules.clear(); project = null; super.selectionChanged(action, selection); Iterator i = ((IStructuredSelection)selection).iterator(); while (i.hasNext()) { Object obj = i.next(); if (obj instanceof IARESModule) { modules.add((IARESModule) obj); if (project == null) { project = ((IARESModule) obj).getARESProject(); } } } //ֻ���߼���ԭ�ӡ����̲ſ��� boolean isCresModule = false; if (modules.size() > 0) { for (IARESModule module : modules) { if(module.getParent().getElementName().equalsIgnoreCase("logic")|| module.getParent().getElementName().equalsIgnoreCase("atom")|| module.getParent().getElementName().equalsIgnoreCase("procedure")) { if(module.getParent().getElementName().equalsIgnoreCase("procedure")){ isProcedureModule = true; } isCresModule = true; break; } } } if(isCresModule) { action.setEnabled(true); }else { action.setEnabled(false); } } }