file.tcl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. ###########################################################
  2. # Name: file.tcl
  3. # Author: Daniele Bonini (posta@elettronica.lol)
  4. # Date: 27/11/2023
  5. # Desc: File Menu namespace of RadXIDE.
  6. #
  7. # File Menu namespace scaffolding and most of the code
  8. # here presented and distributed contains excerpts
  9. # from [alited](https://github.com/aplsimple/alited
  10. # by Alex Plotnikov and contributors to the project.
  11. # The original code of these excerpts could be
  12. # borrowed from other sources which the author
  13. # and the contributors to this RadXIDE have no
  14. # knowledge about.
  15. #
  16. # License: MIT. Copyrights 5 Mode (Last implementation and adaptations.)
  17. # Copyright (c) 2021-2023 Alex Plotnikov https://aplsimple.github.io (original scaffolding and excerpts.)
  18. #
  19. ###########################################################
  20. namespace eval file {
  21. #_________________________ addFile ______________________ #
  22. proc addFile {} {
  23. # Add a file to the current project
  24. namespace upvar ::radxide dan dan
  25. set tree $dan(TREEVIEW)
  26. if {[set ID [$tree selection]] eq {}} return
  27. ::radxide::tree::addFile $ID
  28. }
  29. #_________________________ closeFile ______________________ #
  30. proc closeFile {} {
  31. # Close the current file
  32. namespace upvar ::radxide dan dan menu menu project project
  33. # var reset
  34. set project(CUR_FILE_PATH) ""
  35. # ide text reset
  36. set t $dan(TEXT)
  37. $t config -state normal
  38. $t delete 1.0 end
  39. $t insert end ""
  40. $t config -state disabled
  41. ::radxide::win::fillGutter $dan(TEXT) $dan(GUTTEXT) 5 1 "#FFFFFF" "#222223"
  42. # Update file Menu
  43. $menu(FILE) entryconfigure $menu(SAVE_AS_ENTRY_IDX) -state disabled
  44. $menu(FILE) entryconfigure $menu(SAVE_ENTRY_IDX) -state disabled
  45. $menu(FILE) entryconfigure $menu(CLOSE_ENTRY_IDX) -state disabled
  46. $menu(EDIT) entryconfigure $menu(COPY_ENTRY_IDX) -state disabled
  47. $menu(EDIT) entryconfigure $menu(PASTE_ENTRY_IDX) -state disabled
  48. $menu(EDIT) entryconfigure $menu(CUT_ENTRY_IDX) -state disabled
  49. $menu(EDIT) entryconfigure $menu(FIND_ENTRY_IDX) -state disabled
  50. $menu(EDIT) entryconfigure $menu(GOTO_ENTRY_IDX) -state disabled
  51. ::radxide::main::updateAppTitle
  52. }
  53. #_________________________ closeProject ______________________ #
  54. proc closeProject {} {
  55. # Close all the files
  56. namespace upvar ::radxide dan dan menu menu project project
  57. # var reset
  58. set project(NAME) ""
  59. set project(ROOT) ""
  60. set project(PATH) ""
  61. set project(CUR_FILE_PATH) ""
  62. # ide text reset
  63. set t $dan(TEXT)
  64. $t config -state normal
  65. $t delete 1.0 end
  66. $t insert end ""
  67. $t config -state disabled
  68. ::radxide::win::fillGutter $dan(TEXT) $dan(GUTTEXT) 5 1 "#FFFFFF" "#222223"
  69. # ide treeviee reset
  70. set tree $dan(TREEVIEW)
  71. ::radxide::tree::delete $tree {}
  72. # Update file Menu
  73. $menu(FILE) entryconfigure $menu(ADD_FILE_ENTRY_IDX) -state disabled
  74. $menu(FILE) entryconfigure $menu(SAVE_AS_ENTRY_IDX) -state disabled
  75. $menu(FILE) entryconfigure $menu(SAVE_ENTRY_IDX) -state disabled
  76. $menu(FILE) entryconfigure $menu(CLOSE_ENTRY_IDX) -state disabled
  77. $menu(FILE) entryconfigure $menu(CLOSE_PROJECT_ENTRY_IDX) -state disabled
  78. $menu(EDIT) entryconfigure $menu(PASTE_ENTRY_IDX) -state disabled
  79. $menu(EDIT) entryconfigure $menu(CUT_ENTRY_IDX) -state disabled
  80. $menu(EDIT) entryconfigure $menu(FIND_ENTRY_IDX) -state disabled
  81. $menu(EDIT) entryconfigure $menu(GOTO_ENTRY_IDX) -state disabled
  82. ::radxide::main::updateAppTitle
  83. }
  84. # ________________________ createProjectStru _______________________ #
  85. proc createProjectStru {pjroot pjname} {
  86. namespace upvar ::radxide dan dan
  87. set init_txt ""
  88. set init_txt ${init_txt}project_name=$pjname\n
  89. set init_txt ${init_txt}project_root=$pjroot\n
  90. set fh [open $dan(WORKDIR)/$pjname.radx {WRONLY CREAT EXCL}]
  91. puts $fh $init_txt
  92. close $fh
  93. file mkdir $pjroot
  94. file mkdir $pjroot/Private
  95. file mkdir $pjroot/Public
  96. }
  97. # ________________________ newProject _______________________ #
  98. proc newProject {} {
  99. # Create a new project
  100. namespace upvar ::radxide dan dan project project icons icons menu menu
  101. set types {
  102. {{Project Files} {.radx} }
  103. {{All Files} * }
  104. }
  105. set oriprojectpath [tk_getSaveFile -initialdir $dan(WORKDIR) -filetypes $types]
  106. if {$oriprojectpath ne ""} {
  107. # Check: Parent path must equal to Working Dir..
  108. if {[string range $oriprojectpath 0 [expr [string last "/" $oriprojectpath]-1]] ne $dan(WORKDIR)} {
  109. tk_messageBox -title $dan(TITLE) -icon error -message "Project must be inside the Working Dir!"
  110. return
  111. }
  112. # Parsing project name and path ..
  113. set projectpath $oriprojectpath
  114. set projectname [string range $projectpath [expr [string last "/" $projectpath]+1] end]
  115. set projectname [string tolower $projectname]
  116. set projectname [string totitle $projectname]
  117. set projectname [string map {.radx ""} $projectname]
  118. set project(NAME) $projectname
  119. set project(ROOT) $dan(WORKDIR)/$project(NAME)
  120. set projectpath $project(ROOT).radx
  121. set project(PATH) $projectpath
  122. # Check: Project existance..
  123. if {[file exists $oriprojectpath] || [file exists $project(PATH)]} {
  124. tk_messageBox -title $dan(TITLE) -icon error -message "Project already exists!"
  125. return
  126. }
  127. # tk_messageBox -title $dan(TITLE) -icon error -message $project(NAME)
  128. # tk_messageBox -title $dan(TITLE) -icon error -message $project(ROOT)
  129. # tk_messageBox -title $dan(TITLE) -icon error -message $project(PATH)
  130. # Creating Project file structure
  131. createProjectStru $project(ROOT) $project(NAME)
  132. # Update Treeview
  133. #catch {::winfun::clearTree $dan(TREEVIEW) $project(TREE_PROJECT_ROOT)}
  134. #set project(TREE_PROJECT_ROOT) [$dan(TREEVIEW) insert {} 0 -text $project(NAME) -image $icons(PROJECT-ICONI) -open true]
  135. #set project(TREE_PRIVATE_ROOT) [$dan(TREEVIEW) insert $project(TREE_PROJECT_ROOT) 1 -text "Private" -image $icons(PRIVATEF-ICONI)]
  136. #set project(TREE_PUBLIC_ROOT) [$dan(TREEVIEW) insert $project(TREE_PROJECT_ROOT) 2 -text "Public" -image $icons(PUBLICF-ICONI)]
  137. ::radxide::tree::create
  138. # Update file Menu
  139. $menu(FILE) entryconfigure $menu(ADD_FILE_ENTRY_IDX) -state normal
  140. $menu(FILE) entryconfigure $menu(CLOSE_PROJECT_ENTRY_IDX) -state normal
  141. # Update text editor
  142. #$dan(TEXT) configure -state normal
  143. }
  144. }
  145. #_________________________ openProject ______________________ #
  146. proc openProject {} {
  147. # Open an existing project
  148. namespace upvar ::radxide dan dan project project icons icons menu menu
  149. set types {
  150. {{Project Files} {.radx} }
  151. {{All Files} * }
  152. }
  153. set oriprojectpath [tk_getOpenFile -initialdir $dan(WORKDIR) -filetypes $types]
  154. if {$oriprojectpath ne ""} {
  155. # Check: Parent path must equal to Working Dir..
  156. if {[string range $oriprojectpath 0 [expr [string last "/" $oriprojectpath]-1]] ne $dan(WORKDIR)} {
  157. tk_messageBox -title $dan(TITLE) -icon error -message "Project must be inside the Working Dir!"
  158. return
  159. }
  160. # Parsing project name and path ..
  161. set projectpath $oriprojectpath
  162. set projectname [string range $projectpath [expr [string last "/" $projectpath]+1] end]
  163. set projectname [string tolower $projectname]
  164. set projectname [string totitle $projectname]
  165. set projectname [string map {.radx ""} $projectname]
  166. set project(NAME) $projectname
  167. #tk_messageBox -title $dan(TITLE) -icon error -message $projectname
  168. #project_root=/home/pocahontas/.radxwork/Pippo
  169. if [catch {open $oriprojectpath} in] {
  170. tk_messageBox -title $dan(TITLE) -icon error -message "Cannot open $projectname."
  171. return
  172. }
  173. set project(ROOT) ""
  174. while {[gets $in line] >= 0} {
  175. regexp {^project_root\=(.+)} $line x project(ROOT)
  176. if {$project(ROOT) ne ""} {
  177. break
  178. }
  179. }
  180. #tk_messageBox -title $dan(TITLE) -icon error -message $projectname
  181. #tk_messageBox -title $dan(TITLE) -icon error -message $project(ROOT)
  182. #set project(ROOT) [gets $in line]
  183. set projectpath $project(ROOT).radx
  184. set project(PATH) $projectpath
  185. # Update Treeview
  186. ::radxide::tree::create
  187. # Update file Menu
  188. $menu(FILE) entryconfigure $menu(ADD_FILE_ENTRY_IDX) -state normal
  189. $menu(FILE) entryconfigure $menu(CLOSE_PROJECT_ENTRY_IDX) -state normal
  190. # Update text editor
  191. #$dan(TEXT) configure -state normal
  192. }
  193. }
  194. #____________________________ quit ______________________ #
  195. proc quit {} {
  196. # Quit the application
  197. radxide::quit
  198. }
  199. # ________________________ saveFileByName _______________________ #
  200. proc saveFileByName {{withGUI no}} {
  201. namespace upvar ::radxide dan dan project project
  202. #tk_messageBox -title $dan(TITLE) -icon error -message "file=$project(CUR_FILE_PATH)"
  203. if {$withGUI eq yes} {
  204. set initialdir [string range $project(CUR_FILE_PATH) 0 [expr [string last "/" $project(CUR_FILE_PATH)]-1]]
  205. set initialfile [string range $project(CUR_FILE_PATH) [expr [string last "/" $project(CUR_FILE_PATH)]+1] end]
  206. set types {
  207. {{HTML Files} {.html} }
  208. {{PHP Files} {.php} }
  209. {{INC Files} {.inc} }
  210. {{All Files} * }
  211. }
  212. set orifilepath [tk_getSaveFile -initialdir $initialdir -initialfile $initialfile -filetypes $types -defaultextension .php]
  213. if {$orifilepath eq ""} {return}
  214. # Check: Parent path must equal to Working Dir..
  215. if {([string first $project(ROOT)/Private $orifilepath] eq -1) && ([string first $project(ROOT)/Public $orifilepath] eq -1)} {
  216. tk_messageBox -title $dan(TITLE) -icon error -message "File must be saved inside a valid destination in the Working Dir ($project(ROOT)) !"
  217. return
  218. }
  219. set fname $orifilepath
  220. } else {
  221. set fname $project(CUR_FILE_PATH)
  222. }
  223. set t $dan(TEXT)
  224. set stxt [string trim [$t get 1.0 end]]
  225. ::radxide::filelib::saveFile $fname $stxt
  226. }
  227. #_________________________ saveFileAs ______________________ #
  228. proc saveFileAs {} {
  229. # Save the current file as..
  230. namespace upvar ::radxide dan dan
  231. #tk_messageBox -title $dan(TITLE) -icon info -message "Saved as!"
  232. namespace upvar ::radxide project project
  233. if {$project(CUR_FILE_PATH) ne ""} {
  234. saveFileByName yes
  235. }
  236. }
  237. #_________________________ saveFile ______________________ #
  238. proc saveFile {} {
  239. # Save the current file
  240. namespace upvar ::radxide dan dan project project
  241. #tk_messageBox -title $dan(TITLE) -icon info -message "Saved!"
  242. if {$project(CUR_FILE_PATH) ne ""} {
  243. saveFileByName no
  244. }
  245. }
  246. #_________________________#
  247. }
  248. # _________________________________ EOF _________________________________ #