aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/WireGuard/UI/macOS/MainMenu.swift
blob: 72bba7172657303a997f02c446c8f813e1e66471 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// SPDX-License-Identifier: MIT
// Copyright © 2018 WireGuard LLC. All Rights Reserved.

import Cocoa

class MainMenu: NSMenu {
    init() {
        super.init(title: "")
        addSubmenu(createApplicationMenu())
        addSubmenu(createFileMenu())
        addSubmenu(createEditMenu())
        addSubmenu(createTunnelMenu())
        addSubmenu(createWindowMenu())
    }

    required init(coder decoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func addSubmenu(_ menu: NSMenu) {
        let menuItem = self.addItem(withTitle: "", action: nil, keyEquivalent: "")
        self.setSubmenu(menu, for: menuItem)
    }

    private func createApplicationMenu() -> NSMenu {
        let menu = NSMenu()

        let aboutMenuItem = menu.addItem(withTitle: tr("macMenuAbout"),
            action: #selector(AppDelegate.aboutClicked), keyEquivalent: "")
        aboutMenuItem.target = NSApp.delegate

        menu.addItem(NSMenuItem.separator())

        menu.addItem(withTitle: tr("macMenuViewLog"),
                     action: #selector(TunnelsListTableViewController.handleViewLogAction), keyEquivalent: "")

        menu.addItem(NSMenuItem.separator())

        let hideMenuItem = menu.addItem(withTitle: tr("macMenuHideApp"),
                                        action: #selector(NSApplication.hide), keyEquivalent: "h")
        hideMenuItem.target = NSApp
        let hideOthersMenuItem = menu.addItem(withTitle: tr("macMenuHideOtherApps"),
                                              action: #selector(NSApplication.hideOtherApplications), keyEquivalent: "h")
        hideOthersMenuItem.keyEquivalentModifierMask = [.command, .option]
        hideOthersMenuItem.target = NSApp
        let showAllMenuItem = menu.addItem(withTitle: tr("macMenuShowAllApps"),
            action: #selector(NSApplication.unhideAllApplications), keyEquivalent: "")
        showAllMenuItem.target = NSApp

        menu.addItem(NSMenuItem.separator())

        let quitMenuItem = menu.addItem(withTitle: tr("macMenuQuit"),
            action: #selector(AppDelegate.quit), keyEquivalent: "q")
        quitMenuItem.target = NSApp.delegate

        return menu
    }

    private func createFileMenu() -> NSMenu {
        let menu = NSMenu(title: tr("macMenuFile"))

        menu.addItem(withTitle: tr("macMenuAddEmptyTunnel"),
            action: #selector(TunnelsListTableViewController.handleAddEmptyTunnelAction), keyEquivalent: "n")
        menu.addItem(withTitle: tr("macMenuImportTunnels"),
            action: #selector(TunnelsListTableViewController.handleImportTunnelAction), keyEquivalent: "o")

        menu.addItem(NSMenuItem.separator())

        menu.addItem(withTitle: tr("macMenuExportTunnels"),
            action: #selector(TunnelsListTableViewController.handleExportTunnelsAction), keyEquivalent: "")

        menu.addItem(NSMenuItem.separator())

        menu.addItem(withTitle: tr("macMenuCloseWindow"), action: #selector(NSWindow.performClose(_:)), keyEquivalent:"w")

        return menu
    }

    private func createEditMenu() -> NSMenu {
        let menu = NSMenu(title: tr("macMenuEdit"))

        menu.addItem(withTitle: tr("macMenuUndo"), action: #selector(UndoActionRespondable.undo(_:)), keyEquivalent:"z")
        menu.addItem(withTitle: tr("macMenuRedo"), action: #selector(UndoActionRespondable.redo(_:)), keyEquivalent:"Z")

        menu.addItem(NSMenuItem.separator())

        menu.addItem(withTitle: tr("macMenuCut"), action: #selector(NSText.cut(_:)), keyEquivalent:"x")
        menu.addItem(withTitle: tr("macMenuCopy"), action: #selector(NSText.copy(_:)), keyEquivalent:"c")
        menu.addItem(withTitle: tr("macMenuPaste"), action: #selector(NSText.paste(_:)), keyEquivalent:"v")

        menu.addItem(NSMenuItem.separator())

        menu.addItem(withTitle: tr("macMenuSelectAll"), action: #selector(NSText.selectAll(_:)), keyEquivalent:"a")

        return menu
    }

    private func createTunnelMenu() -> NSMenu {
        let menu = NSMenu(title: tr("macMenuTunnel"))

        menu.addItem(withTitle: tr("macMenuToggleStatus"), action: #selector(TunnelDetailTableViewController.handleToggleActiveStatusAction), keyEquivalent:"t")

        menu.addItem(NSMenuItem.separator())

        menu.addItem(withTitle: tr("macMenuEditTunnel"), action: #selector(TunnelDetailTableViewController.handleEditTunnelAction), keyEquivalent:"e")
        menu.addItem(withTitle: tr("macMenuDeleteSelected"), action: #selector(TunnelsListTableViewController.handleRemoveTunnelAction), keyEquivalent: "")

        return menu
    }

    private func createWindowMenu() -> NSMenu {
        let menu = NSMenu(title: tr("macMenuWindow"))

        menu.addItem(withTitle: tr("macMenuMinimize"), action: #selector(NSWindow.performMiniaturize(_:)), keyEquivalent:"m")
        menu.addItem(withTitle: tr("macMenuZoom"), action: #selector(NSWindow.performZoom(_:)), keyEquivalent:"")

        menu.addItem(NSMenuItem.separator())

        let fullScreenMenuItem = menu.addItem(withTitle: tr("macMenuFullScreen"), action: #selector(NSWindow.toggleFullScreen(_:)), keyEquivalent:"f")
        fullScreenMenuItem.keyEquivalentModifierMask = [.command, .control]

        return menu
    }
}

@objc protocol UndoActionRespondable {
    func undo(_ sender: AnyObject)
    func redo(_ sender: AnyObject)
}