@@ -2,12 +2,14 @@ package com.github.cnrture.quickprojectwizard.common.file
22
33import com.github.cnrture.quickprojectwizard.common.Constants
44import com.github.cnrture.quickprojectwizard.data.ModuleTemplate
5+ import com.github.cnrture.quickprojectwizard.data.FeatureTemplate
6+ import com.github.cnrture.quickprojectwizard.data.FileTemplate
57import com.github.cnrture.quickprojectwizard.data.SettingsService
68import com.github.cnrture.quickprojectwizard.projectwizard.xmlarch.ui.emptyFragmentLayout
79import com.github.cnrture.quickprojectwizard.projectwizard.xmlarch.ui.emptyMainFragment
810import com.github.cnrture.quickprojectwizard.projectwizard.xmlarch.ui.emptyMainUIState
911import com.github.cnrture.quickprojectwizard.projectwizard.xmlarch.ui.emptyMainViewModelXML
10- import com.github.cnrture.quickprojectwizard.toolwindow.template.FeatureTemplate
12+ import com.github.cnrture.quickprojectwizard.toolwindow.template.FeatureTemplate as FeatureTemplateOld
1113import com.github.cnrture.quickprojectwizard.toolwindow.template.GitIgnoreTemplate
1214import com.github.cnrture.quickprojectwizard.toolwindow.template.ManifestTemplate
1315import com.github.cnrture.quickprojectwizard.toolwindow.template.TemplateWriter
@@ -168,7 +170,19 @@ class FileWriter() {
168170 packageName : String ,
169171 showErrorDialog : (String ) -> Unit ,
170172 showSuccessDialog : () -> Unit ,
173+ selectedTemplate : FeatureTemplate ? = null,
171174 ): List <File > {
175+ if (selectedTemplate != null ) {
176+ return createFeatureFilesFromTemplate(
177+ file = file,
178+ featureName = featureName,
179+ packageName = packageName,
180+ template = selectedTemplate,
181+ showErrorDialog = showErrorDialog,
182+ showSuccessDialog = showSuccessDialog
183+ )
184+ }
185+
172186 val featureFile = Paths .get(file.absolutePath, featureName.lowercase()).toFile()
173187 featureFile.mkdirs()
174188
@@ -203,7 +217,7 @@ class FileWriter() {
203217 val writer: Writer = FileWriter (file)
204218 val dataToWrite = when (file.name) {
205219 " ${capitalizedModuleName} Screen.kt" -> {
206- FeatureTemplate .getScreen(packageName, capitalizedModuleName)
220+ FeatureTemplateOld .getScreen(packageName, capitalizedModuleName)
207221 }
208222
209223 " ${capitalizedModuleName} Fragment.kt" -> {
@@ -212,7 +226,7 @@ class FileWriter() {
212226
213227 " ${capitalizedModuleName} ViewModel.kt" -> {
214228 if (settings.state.isCompose) {
215- FeatureTemplate .getViewModel(
229+ FeatureTemplateOld .getViewModel(
216230 packageName,
217231 capitalizedModuleName,
218232 settings.state.isHiltEnable,
@@ -227,15 +241,15 @@ class FileWriter() {
227241 }
228242
229243 " ${capitalizedModuleName} Contract.kt" -> {
230- FeatureTemplate .getContract(packageName, capitalizedModuleName)
244+ FeatureTemplateOld .getContract(packageName, capitalizedModuleName)
231245 }
232246
233247 " ${capitalizedModuleName} UiState.kt" -> {
234248 emptyMainUIState(packageName, capitalizedModuleName)
235249 }
236250
237251 " ${capitalizedModuleName} ScreenPreviewProvider.kt" -> {
238- FeatureTemplate .getPreviewProvider(packageName, capitalizedModuleName)
252+ FeatureTemplateOld .getPreviewProvider(packageName, capitalizedModuleName)
239253 }
240254
241255 " app/src/main/res/layout/fragment$xmlName .xml" -> {
@@ -267,6 +281,63 @@ class FileWriter() {
267281 return successfullyCreatedFiles
268282 }
269283
284+ private fun createFeatureFilesFromTemplate (
285+ file : File ,
286+ featureName : String ,
287+ packageName : String ,
288+ template : FeatureTemplate ,
289+ showErrorDialog : (String ) -> Unit ,
290+ showSuccessDialog : () -> Unit ,
291+ ): List <File > {
292+ val featureFile = Paths .get(file.absolutePath, featureName.lowercase()).toFile()
293+ featureFile.mkdirs()
294+
295+ val filesCreated = mutableListOf<File >()
296+
297+ template.fileTemplates.forEach { fileTemplate: FileTemplate ->
298+ val fileName = fileTemplate.fileName
299+ .replace(" {FEATURE_NAME}" , featureName.replaceFirstChar { it.uppercase() })
300+ .replace(" {FEATURE_NAME_LOWERCASE}" , featureName.lowercase())
301+
302+ val fileDir = if (fileTemplate.filePath.isNotEmpty()) {
303+ val subDirPath = fileTemplate.filePath.replace(" ." , File .separator)
304+ Paths .get(featureFile.absolutePath, subDirPath).toFile().apply { mkdirs() }
305+ } else {
306+ featureFile
307+ }
308+
309+ val targetFile = File (fileDir, fileName)
310+
311+ val content = fileTemplate.fileContent
312+ .replace(" {FEATURE_NAME}" , featureName.replaceFirstChar { it.uppercase() })
313+ .replace(" {FEATURE_NAME_LOWERCASE}" , featureName.lowercase())
314+ .replace(" {PACKAGE}" , packageName)
315+ .replace(
316+ " {FILE_PACKAGE}" ,
317+ if (fileTemplate.filePath.isNotEmpty()) {
318+ " $packageName .${fileTemplate.filePath} "
319+ } else {
320+ packageName
321+ }
322+ )
323+
324+ try {
325+ val writer: Writer = FileWriter (targetFile)
326+ writer.write(content)
327+ writer.flush()
328+ writer.close()
329+ filesCreated.add(targetFile)
330+ } catch (e: IOException ) {
331+ showErrorDialog(" Error creating file ${fileName} : ${e.message} " )
332+ } catch (e: Exception ) {
333+ showErrorDialog(" Unexpected error: ${e.message} " )
334+ }
335+ }
336+
337+ showSuccessDialog()
338+ return filesCreated
339+ }
340+
270341 private fun createDefaultPackages (moduleFile : File , packageName : String ): List <File > {
271342 fun makePath (srcPath : File , packagePath : String ): File {
272343 val packagePathFile = Paths .get(
0 commit comments