//
// M e n u . s w i f t
// R S w i t c h
//
// C r e a t e d b y h r b r m s t r o n 8 / 2 4 / 1 9 .
// C o p y r i g h t © 2 0 1 9 B o b R u d i s . A l l r i g h t s r e s e r v e d .
//
import Foundation
import Cocoa
extension AppDelegate : NSMenuDelegate {
@objc func toggle_dock_icon ( _ sender : NSMenuItem ) {
Preferences . showDockIcon = ! Preferences . showDockIcon
DockIcon . standard . setVisibility ( Preferences . showDockIcon )
if let menu = statusItem . menu , let item = menu . item ( withTag : 99 ) {
item . state = Preferences . showDockIcon . stateValue
}
}
@objc func toggle_hourly_rstudio_check ( _ sender : NSMenuItem ) {
Preferences . hourlyRStudioCheck = ! Preferences . hourlyRStudioCheck
if ( Preferences . hourlyRStudioCheck ) { performRStudioCheck ( sender ) }
if let menu = statusItem . menu , let item = menu . item ( withTag : 98 ) {
item . state = Preferences . hourlyRStudioCheck . stateValue
}
}
@objc func toggle_ensure_file_handlers ( _ sender : NSMenuItem ) {
Preferences . ensureFileHandlers = ! Preferences . ensureFileHandlers
if ( Preferences . ensureFileHandlers ) { FileAssociationUtils . setHandlers ( ) }
if let menu = statusItem . menu , let item = menu . item ( withTag : 98 ) {
item . state = Preferences . ensureFileHandlers . stateValue
}
}
@objc func subscribeToMailingList ( _ sender : NSMenuItem ) {
NSWorkspace . shared . open ( URL ( string : " https://lists.sr.ht/~hrbrmstr/rswitch " ) ! )
}
func menuWillOpen ( _ menu : NSMenu ) {
if ( menu != self . statusMenu ) { return }
// c l e a r t h e m e n u
menu . removeAllItems ( )
// a d d s e l e c t i o n t o o p e n f r a m e w o r k s d i r i n F i n d e r
menu . addItem ( NSMenuItem ( title : " Open R Frameworks Directory " , action : #selector ( openFrameworksDir ) , keyEquivalent : " " ) )
menu . addItem ( NSMenuItem . separator ( ) )
menu . addItem ( NSMenuItem ( title : " Current R Version: " , action : nil , keyEquivalent : " " ) )
// p o p u l a t e i n s t a l l e d v e r s i o n s
RVersions . populateRVersionsMenu ( menu : menu , handler : #selector ( handleRSwitch ) )
// A d d i t e m s t o d o w n l o a d l a t e s t r - d e v e l t a r b a l l a n d l a t e s t m a c O S d a i l y
menu . addItem ( NSMenuItem . separator ( ) )
let rdevelItem = NSMenuItem ( title : NSLocalizedString ( " Download latest R-devel tarball " , comment : " Download latest tarball item " ) , action : self . rdevel_enabled ? #selector ( download_latest_tarball ) : nil , keyEquivalent : " " )
rdevelItem . isEnabled = self . rdevel_enabled
menu . addItem ( rdevelItem )
let rstudioItem = NSMenuItem ( title : NSLocalizedString ( " Download latest RStudio daily build " , comment : " Download latest RStudio item " ) , action : self . rstudio_enabled ? #selector ( download_latest_rstudio ) : nil , keyEquivalent : " " )
rstudioItem . isEnabled = self . rstudio_enabled
menu . addItem ( rstudioItem )
menu . addItem ( NSMenuItem . separator ( ) )
let refsDropdown = NSMenuItem ( title : " Reference Desk " , action : nil , keyEquivalent : " " )
let refsSub = NSMenu ( )
menu . addItem ( refsDropdown )
menu . setSubmenu ( refsSub , for : refsDropdown )
// A d d i t e m s t o o p e n v a r i o u s R f o r m a c O S p a g e s
BrowseMenuAction . populateWebItems ( menu : refsSub )
menu . addItem ( NSMenuItem . separator ( ) )
// A d d l i n k s t o l o c a l c o p i e s o f t h e R M a n u a l s
BrowseMenuAction . populateLocalRManualsItems ( menu : refsSub )
// A d d l i n k s t o f r e e R o n l i n e b o o k s
BrowseMenuAction . populateRBooksItems ( menu : refsSub )
// A d d r u n n i n g a p p s
populateRunningApps ( menu : menu )
// A d d l a u n c h e r s
AppMenuAction . populateLaunchers ( menu : menu )
RStudioServerMenuAction . populateRStudioServerSessions ( menu : menu , manager : sess )
menu . addItem ( NSMenuItem . separator ( ) )
// T o g g l e D o c k I c o n
menu . addItem ( NSMenuItem . separator ( ) )
let prefsDropdown = NSMenuItem ( title : " Preferences " , action : nil , keyEquivalent : " " )
let prefSub = NSMenu ( )
menu . addItem ( prefsDropdown )
menu . setSubmenu ( prefSub , for : prefsDropdown )
let dockItem = NSMenuItem ( title : " Show Dock Icon " , action : #selector ( toggle_dock_icon ) , keyEquivalent : " " )
dockItem . tag = 99
dockItem . target = self
dockItem . state = Preferences . showDockIcon . stateValue
prefSub . addItem ( dockItem )
let rstudioCheckItem = NSMenuItem ( title : " Notify me when a new RStudio Daily is available " , action : #selector ( toggle_hourly_rstudio_check ) , keyEquivalent : " " )
rstudioCheckItem . tag = 98
rstudioCheckItem . target = self
rstudioCheckItem . state = Preferences . hourlyRStudioCheck . stateValue
prefSub . addItem ( rstudioCheckItem )
let fileHandlersCheckItem = NSMenuItem ( title : " Ensure RStudio opens R/Rmd files " , action : #selector ( toggle_ensure_file_handlers ) , keyEquivalent : " " )
fileHandlersCheckItem . tag = 97
fileHandlersCheckItem . target = self
fileHandlersCheckItem . state = Preferences . ensureFileHandlers . stateValue
prefSub . addItem ( fileHandlersCheckItem )
menu . addItem ( NSMenuItem ( title : " Check for update… " , action : #selector ( checkForUpdate ) , keyEquivalent : " " ) )
menu . addItem ( NSMenuItem ( title : " Subscribe to mailing list… " , action : #selector ( subscribeToMailingList ) , keyEquivalent : " " ) )
menu . addItem ( NSMenuItem ( title : " About RSwitch… " , action : #selector ( showAbout ) , keyEquivalent : " " ) )
menu . addItem ( NSMenuItem ( title : " RSwitch Help… " , action : #selector ( rswitch_help ) , keyEquivalent : " " ) )
// A d d a Q u i t i t e m
menu . addItem ( NSMenuItem . separator ( ) )
let quitItem = NSMenuItem ( title : " Quit " , action : #selector ( NSApp . terminate ) , keyEquivalent : " q " )
quitItem . keyEquivalentModifierMask = NSEvent . ModifierFlags . option
menu . addItem ( quitItem )
}
}