class BasicFile : SimpleComponent(), TextToContexts { // ==== Register ==== override meth register() { registerTextSelectionToContexts() addFeatures(Context.FILE).apply { val newTab = contextAction( "Open", ::newTab ) val openFileExternal = contextAction( "Open in Associated App", ::openFileExternal ) val openTerminal = contextAction( "Open Parent Folder in a Terminal", ::openTerminal ) .icon("terminal") val browse = contextAction( "Browse Parent Folder", ::browse ) .icon("browse") val rename = contextAction( "Rename File…", ::rename ) val copy = contextAction( "Copy File…", ::copy ) val delete = contextAction( "Delete File…", ::delete ) val copyName = contextAction( "Copy File Name", ::copyFilename ) val copyPath = contextAction( "Copy File Path", ::copyPath ) contextMenu( newTab, openFileExternal, separator, openTerminal, browse, separator, rename, copy, delete, separator, copyName, copyPath ) menus( MenuFeature( "File", openFileExternal, separator, openTerminal, browse, separator, rename, copy, delete ) ) } } // ==== Actions ==== func newTab( context : Context ) { openFile( context.value as File ) } func openFileExternal( context : Context ) { openInExternalApp( context.value as File ) } func openTerminal( context : Context ) { openTerminal( (context.value as File).parentFile ) } func browse( context : Context ) { openInExternalApp( (context.value as File).parentFile ) } func rename( context : Context ) { RenameFileDialog( context.value as File, null ).show() } func copy( context : Context ) { CopyFileDialog( context.value as File, null ).show() } func delete( context : Context ) { DeleteFileDialog( context.value as File, null ).show() } func copyFilename( context : Context ) { copyString( (context.value as File).name ) } func copyPath( context : Context ) { copyString( (context.value as File).path ) } override meth selectionToContexts( sourceContexts : List, selection : String ) : List { if (selection.isEmpty()) { return null } val file = File(selection) if (file.isAbsolute()) { if (file.exists()) { return contextsForFile(file) } } else { for (context in sourceContexts) { if (context.type == Context.FOLDER) { val relativeFile = File( context.value as File, selection ) if ( relativeFile.exists() ) { return contextsForFile(relativeFile) } } } for (context in sourceContexts) { if (context.type == Context.FILE) { val relativeFile = File( (context.value as File).parentFile, selection ) if ( relativeFile.exists() ) { return contextsForFile(relativeFile) } } } } return null } override meth caretToContexts( sourceContexts : List, line : String, column : int) : List { val usingQuoted = selectionToContexts( sourceContexts, quotedTextAt( line, column ) ) if (usingQuoted != null && usingQuoted.size() > 0) { return usingQuoted } return selectionToContexts( sourceContexts, line.wordAt(column) ) } }