void (@NotNull final Module module, @NotNull final VirtualFile formFile, @Nullable final Locale stringDescriptorLocale) { final String tempPath; try { final File tempDirectory = FileUtil.createTempDirectory("FormPreview", ""); tempPath = tempDirectory.getAbsolutePath(); CopyResourcesUtil.copyFormsRuntime(tempPath, true); } catch (IOException e) { Messages.showErrorDialog( module.getProject(), UIDesignerBundle.message("error.cannot.preview.form", formFile.getPath().replace('/', File.separatorChar), e.toString()), CommonBundle.getErrorTitle() ); return; } URL[] platformUrls = null; Sdk sdk = ModuleRootManager.getInstance(module).getSdk(); if (sdk != null && sdk.getHomePath() != null && JavaSdk.getInstance().isOfVersionOrHigher(sdk, JavaSdkVersion.JDK_1_9)) { try { platformUrls = new URL[]{InstrumentationClassFinder.createJDKPlatformUrl(sdk.getHomePath())}; } catch (MalformedURLException ignore) { } } final PathsList sources = OrderEnumerator.orderEntries(module).withoutSdk().withoutLibraries().withoutDepModules().getSourcePathsList(); final String classPath = OrderEnumerator.orderEntries(module).recursively().getPathsList().getPathsString() + File.pathSeparator + sources.getPathsString() + File.pathSeparator + /* resources bundles */ tempPath; final InstrumentationClassFinder finder = createClassFinder(platformUrls, classPath); try { final Document doc = FileDocumentManager.getInstance().getDocument(formFile); final LwRootContainer rootContainer; try { rootContainer = Utils.getRootContainer(doc.getText(), new CompiledClassPropertiesProvider(finder.getLoader())); } catch (Exception e) { Messages.showErrorDialog( module.getProject(), UIDesignerBundle.message("error.cannot.read.form", formFile.getPath().replace('/', File.separatorChar), e.getMessage()), CommonBundle.getErrorTitle() ); return; } if (rootContainer.getComponentCount() == 0) { Messages.showErrorDialog( module.getProject(), UIDesignerBundle.message("error.cannot.preview.empty.form", formFile.getPath().replace('/', File.separatorChar)), CommonBundle.getErrorTitle() ); return; } setPreviewBindings(rootContainer, CLASS_TO_BIND_NAME); // 2. Copy previewer class and all its superclasses into TEMP directory and instrument it. try { PreviewNestedFormLoader nestedFormLoader = new PreviewNestedFormLoader(module, tempPath, finder); final File tempFile = CopyResourcesUtil.copyClass(tempPath, CLASS_TO_BIND_RESOURCE_NAME, true); //CopyResourcesUtil.copyClass(tempPath, CLASS_TO_BIND_NAME + "$1", true); CopyResourcesUtil.copyClass(tempPath, CLASS_TO_BIND_RESOURCE_NAME + "$MyExitAction", true); CopyResourcesUtil.copyClass(tempPath, CLASS_TO_BIND_RESOURCE_NAME + "$MyPackAction", true); CopyResourcesUtil.copyClass(tempPath, CLASS_TO_BIND_RESOURCE_NAME + "$MySetLafAction", true); Locale locale = Locale.getDefault(); if (locale.getCountry().length() > 0 && locale.getLanguage().length() > 0) { CopyResourcesUtil.copyProperties(tempPath, RUNTIME_BUNDLE_PREFIX + "_" + locale.getLanguage() + "_" + locale.getCountry() + PropertiesFileType.DOT_DEFAULT_EXTENSION); } if (locale.getLanguage().length() > 0) { CopyResourcesUtil.copyProperties(tempPath, RUNTIME_BUNDLE_PREFIX + "_" + locale.getLanguage() + PropertiesFileType.DOT_DEFAULT_EXTENSION); } CopyResourcesUtil.copyProperties(tempPath, RUNTIME_BUNDLE_PREFIX + "_" + locale.getLanguage() + PropertiesFileType.DOT_DEFAULT_EXTENSION); CopyResourcesUtil.copyProperties(tempPath, RUNTIME_BUNDLE_PREFIX + PropertiesFileType.DOT_DEFAULT_EXTENSION); final AsmCodeGenerator codeGenerator = new AsmCodeGenerator( rootContainer, finder, nestedFormLoader, true, new PsiClassWriter(module) ); codeGenerator.patchFile(tempFile); final FormErrorInfo[] errors = codeGenerator.getErrors(); if(errors.length != 0){ Messages.showErrorDialog( module.getProject(), UIDesignerBundle.message("error.cannot.preview.form", formFile.getPath().replace('/', File.separatorChar), errors[0].getErrorMessage()), CommonBundle.getErrorTitle() ); return; } } catch (Exception e) { LOG.debug(e); Messages.showErrorDialog( module.getProject(), UIDesignerBundle.message("error.cannot.preview.form", formFile.getPath().replace('/', File.separatorChar), e.getMessage() != null ? e.getMessage() : e.toString()), CommonBundle.getErrorTitle() ); return; } // 2.5. Copy up-to-date properties files to the output directory. final HashSet<String> bundleSet = new HashSet<>(); FormEditingUtil.iterateStringDescriptors( rootContainer, new FormEditingUtil.StringDescriptorVisitor<>() { @Override public boolean visit(final IComponent component, final StringDescriptor descriptor) { if (descriptor.getBundleName() != null) { bundleSet.add(descriptor.getDottedBundleName()); } return true; } }); if (bundleSet.size() > 0) { HashSet<VirtualFile> virtualFiles = new HashSet<>(); HashSet<Module> modules = new HashSet<>(); PropertiesReferenceManager manager = PropertiesReferenceManager.getInstance(module.getProject()); for(String bundleName: bundleSet) { for(PropertiesFile propFile: manager.findPropertiesFiles(module, bundleName)) { virtualFiles.add(propFile.getVirtualFile()); final Module moduleForFile = ModuleUtil.findModuleForFile(propFile.getVirtualFile(), module.getProject()); if (moduleForFile != null) { modules.add(moduleForFile); } } } FileSetCompileScope scope = new FileSetCompileScope(virtualFiles, modules.toArray(Module.EMPTY_ARRAY)); CompilerManager.getInstance(module.getProject()).make(scope, new CompileStatusNotification() { @Override public void finished(boolean aborted, int errors, int warnings, @NotNull final CompileContext compileContext) { if (!aborted && errors == 0) { runPreviewProcess(tempPath, sources, module, formFile, stringDescriptorLocale); } } }); } else { runPreviewProcess(tempPath, sources, module, formFile, stringDescriptorLocale); } } finally { finder.releaseResources(); } }