package countlinesofcode import Utilities class CountLinesOfCodeBehaviour( val form : CountLinesOfCodeForm ) : TreeBehaviour( "Count Lines of Code", Context( Context.FOLDER, form.folder.value ) ), Promptable { // Follows the same logic as ListFolderBehaviour. // i.e. When the user changes the folder via the field in the toolbar, we must create a NEW CountLinesOfCodeBehaviour. val mutableFolder = folderProperty( "Folder", form.folder.value ) val canonicalFolder = form.folder.value.canonicalOrAbsolute() val refresh = Action( "Refresh", this:>refresh ) .icon("refresh").shortcut( Key.F5.noMods() ) init { mutableFolder.listen( this:>onFolderChanged ) form.showFiles.listen( this:>refresh ) } override meth toolbar() = listOf( mutableFolder, spacer, separator, form.showFiles, separator, refresh ) meth onFolderChanged() { if (mutableFolder.value != null && mutableFolder.value.isFolder() && mutableFolder.value.canonicalOrAbsolute() != canonicalFolder) { changeToFolder( mutableFolder.value ) // We must reset this, otherwise, if we return to this behaviour (by going back in the container's history), // then the toolbar would show the wrong value. // Note, the "if" above prevents infinite recursion. mutableFolder.value = form.folder.value } } meth changeToFolder( newFolder : File ) { val newForm = form.copy().apply { folder.value = newFolder } container.addBehaviour( CountLinesOfCodeBehaviour( newForm ) ) } meth refresh() { message( "Processing, please wait" ) newThread( "CountLinesOfCode", this:>refreshThreaded, this:>finished ) } meth refreshThreaded() : TreeItem { try { val baseFolder = form.folder.value val extensions = Utilities.extensionsStringToList( form.extensions.value ) val theRoot = FileTreeItem( baseFolder.name, baseFolder ).apply { expanded = true leaf = false icon( "folder" ) } countFolder( theRoot, baseFolder, extensions ) return theRoot } catch ( e : Exception ) { return null } } meth finished( theRoot : TreeItem ) { if (theRoot == null) { message( "Failed" ) } else { root = theRoot message( "" ) } } override meth attached( container : Container ) { super.attached(container) refresh() } meth countFolder( parentItem : TreeItem, folder : File, extensions : List ) : int { var total = 0 for (file in folder.files(form.countHiddenFiles.value)) { if (extensions.isEmpty() || extensions.contains( file.extension() ) ) { val command = $( cat '$file' | grep -v '^ *package' | grep -v '^ *import' | grep -v '^ *#' | grep -v '^ *//' | grep -v '^ *\**$'| grep -v '^ *\*' | grep -v '^ *$' | grep -v '^ *[{}] *$' | wc -l ) val output = command.eval() val count = output.strip().toInt() total += count if (form.showFiles.value) { val item = FileTreeItem( "${file.name} (${count})", file ) parentItem.add( item ) parentItem.leaf = false } } } for (subFolder in folder.folders(form.countHiddenFolders.value)) { parentItem.leaf = false val item = FileTreeItem( subFolder.name, subFolder ) . icon( "folder" ) val subcount = countFolder( item, subFolder, extensions ) if (subcount != 0) { parentItem.add( item ) parentItem.expanded = true } total += subcount } parentItem.text = "${parentItem.text} ($total)" if ( total == 0 ) { parentItem.expanded = false } return total } override meth promptForm() = form }