Skip to content

Commit 338d4e2

Browse files
committed
implemented menu item
1 parent d7507f8 commit 338d4e2

8 files changed

Lines changed: 160 additions & 18 deletions

File tree

SwiftLintPlugin.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
421CEBCD265EB31800FD1A2F /* Defaults in Frameworks */ = {isa = PBXBuildFile; productRef = 421CEBCC265EB31800FD1A2F /* Defaults */; };
1818
421CEBCE265EB35700FD1A2F /* PATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = 421CEBC6265EAA9B00FD1A2F /* PATH.swift */; };
1919
42296F39265932CD007372AE /* SwiftLintXPC.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 429D8B712659328D00BF9FB9 /* SwiftLintXPC.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
20+
4231EAA327B6593F004BCA53 /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4231EAA227B6593F004BCA53 /* NSImage.swift */; };
21+
4231EAA527B667A4004BCA53 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4231EAA427B667A4004BCA53 /* main.swift */; };
2022
42692BA5265A26A000A2CCAE /* XcodeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 42692BA4265A26A000A2CCAE /* XcodeHelper.m */; };
2123
42910795265A5FF2008F38F5 /* SwiftLintHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 42910794265A5FF2008F38F5 /* SwiftLintHelper.m */; };
2224
4291079E265C0D13008F38F5 /* Defaults in Frameworks */ = {isa = PBXBuildFile; productRef = 4291079D265C0D13008F38F5 /* Defaults */; };
@@ -127,6 +129,8 @@
127129
421CEBC3265EA79A00FD1A2F /* DEFINE.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DEFINE.swift; sourceTree = "<group>"; };
128130
421CEBC6265EAA9B00FD1A2F /* PATH.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PATH.swift; sourceTree = "<group>"; };
129131
42296F3B26593310007372AE /* XcodeEx-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XcodeEx-Bridging-Header.h"; sourceTree = "<group>"; };
132+
4231EAA227B6593F004BCA53 /* NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImage.swift; sourceTree = "<group>"; };
133+
4231EAA427B667A4004BCA53 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
130134
42692BA4265A26A000A2CCAE /* XcodeHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XcodeHelper.m; sourceTree = "<group>"; };
131135
42692BA6265A26F800A2CCAE /* XcodeHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XcodeHelper.h; sourceTree = "<group>"; };
132136
42910794265A5FF2008F38F5 /* SwiftLintHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SwiftLintHelper.m; sourceTree = "<group>"; };
@@ -285,10 +289,12 @@
285289
421CEBB5265E377400FD1A2F /* Defaults.Keys.swift */,
286290
421CEBC3265EA79A00FD1A2F /* DEFINE.swift */,
287291
421CEBC6265EAA9B00FD1A2F /* PATH.swift */,
292+
4231EAA227B6593F004BCA53 /* NSImage.swift */,
288293
42FD41C7265800F100D0FCBB /* Assets.xcassets */,
289294
42FD41C9265800F100D0FCBB /* Main.storyboard */,
290295
42FD41CC265800F100D0FCBB /* Info.plist */,
291296
42FD41CD265800F100D0FCBB /* SwiftLintPlugin.entitlements */,
297+
4231EAA427B667A4004BCA53 /* main.swift */,
292298
);
293299
path = SwiftLintPlugin;
294300
sourceTree = "<group>";
@@ -572,8 +578,10 @@
572578
files = (
573579
42FD41C6265800EE00D0FCBB /* ViewController.swift in Sources */,
574580
42FD41C4265800EE00D0FCBB /* AppDelegate.swift in Sources */,
581+
4231EAA527B667A4004BCA53 /* main.swift in Sources */,
575582
421CEBCE265EB35700FD1A2F /* PATH.swift in Sources */,
576583
421CEBB6265E377400FD1A2F /* Defaults.Keys.swift in Sources */,
584+
4231EAA327B6593F004BCA53 /* NSImage.swift in Sources */,
577585
421CEBC4265EA79A00FD1A2F /* DEFINE.swift in Sources */,
578586
421CEBB8265E923A00FD1A2F /* FilePathMode.swift in Sources */,
579587
);

SwiftLintPlugin/AppDelegate.swift

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,32 @@
77
//
88

99
import Cocoa
10+
import Defaults
1011

11-
@main
1212
class AppDelegate: NSObject, NSApplicationDelegate {
1313

14+
private let statusBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
15+
private let mainBarMenu = NSMenu(title: "SwiftLintXcodePlugin")
16+
var preferenceWindowController: NSWindowController?
17+
1418
func applicationDidFinishLaunching(_ aNotification: Notification) {
19+
20+
setupMenuBar()
21+
22+
if Defaults[.shouldOpenWindowWhenLaunch] {
23+
openPreferences()
24+
}
25+
26+
checkPermission()
27+
}
28+
29+
func applicationWillTerminate(_ aNotification: Notification) {
30+
// Insert code here to tear down your application
31+
}
32+
}
33+
34+
extension AppDelegate {
35+
func checkPermission() {
1536
let targetAEDescriptor = NSAppleEventDescriptor(bundleIdentifier: "com.apple.dt.Xcode")
1637
let status: OSStatus = AEDeterminePermissionToAutomateTarget(targetAEDescriptor.aeDesc, typeWildCard, typeWildCard, true)
1738

@@ -27,8 +48,32 @@ class AppDelegate: NSObject, NSApplicationDelegate {
2748
}
2849
}
2950

30-
func applicationWillTerminate(_ aNotification: Notification) {
31-
// Insert code here to tear down your application
51+
func setupPreferenceWindow() {
52+
guard let windowController = NSStoryboard(name: "Main", bundle: nil).instantiateInitialController() as? NSWindowController else {
53+
return
54+
}
55+
self.preferenceWindowController = windowController
3256
}
3357

58+
func setupMenuBar() {
59+
let image = NSImage(systemSymbolName: "s.circle", accessibilityDescription: nil)
60+
image?.isTemplate = true
61+
statusBarItem.button?.image = image
62+
63+
mainBarMenu.addItem(NSMenuItem(title: "Settings..", action: #selector(openPreferences), keyEquivalent: ","))
64+
mainBarMenu.addItem(NSMenuItem.separator())
65+
mainBarMenu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.shared.terminate(_:)), keyEquivalent: "q"))
66+
statusBarItem.menu = mainBarMenu
67+
}
68+
69+
@objc
70+
func openPreferences() {
71+
if let windowController = self.preferenceWindowController {
72+
windowController.showWindow(self)
73+
} else {
74+
setupPreferenceWindow()
75+
self.preferenceWindowController?.showWindow(self)
76+
}
77+
NSApp.activate(ignoringOtherApps: true)
78+
}
3479
}

SwiftLintPlugin/Base.lproj/Main.storyboard

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -706,15 +706,15 @@
706706
<scene sceneID="hIz-AP-VOD">
707707
<objects>
708708
<viewController id="XfG-lQ-9wD" customClass="ViewController" customModule="SwiftLintPlugin" customModuleProvider="target" sceneMemberID="viewController">
709-
<view key="view" id="m2S-Jp-Qdl">
710-
<rect key="frame" x="0.0" y="0.0" width="605" height="183"/>
709+
<view key="view" misplaced="YES" id="m2S-Jp-Qdl">
710+
<rect key="frame" x="0.0" y="0.0" width="605" height="202"/>
711711
<autoresizingMask key="autoresizingMask"/>
712712
<subviews>
713713
<stackView distribution="fillEqually" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pwp-p3-kYg">
714-
<rect key="frame" x="16" y="16" width="573" height="151"/>
714+
<rect key="frame" x="16" y="16" width="573" height="174"/>
715715
<subviews>
716716
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="yv7-F3-pfY">
717-
<rect key="frame" x="-2" y="71" width="577" height="80"/>
717+
<rect key="frame" x="-2" y="94" width="577" height="80"/>
718718
<textFieldCell key="cell" selectable="YES" id="zuB-8h-k5T">
719719
<font key="font" usesAppearanceFont="YES"/>
720720
<string key="title">SwiftLint Plugin for Xcode.
@@ -727,10 +727,10 @@ It can be set from Preference APP -&gt; Security &amp; Privacy -&gt; Privacy -&g
727727
</textFieldCell>
728728
</textField>
729729
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="GZw-aA-VnS">
730-
<rect key="frame" x="0.0" y="40" width="122" height="23"/>
730+
<rect key="frame" x="0.0" y="70" width="122" height="16"/>
731731
<subviews>
732732
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="EsX-QF-82t">
733-
<rect key="frame" x="-2" y="6" width="124" height="18"/>
733+
<rect key="frame" x="-2" y="-1" width="124" height="18"/>
734734
<buttonCell key="cell" type="check" title="Launch At Login" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="5Ba-NL-tZ0">
735735
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
736736
<font key="font" metaFont="system"/>
@@ -740,6 +740,35 @@ It can be set from Preference APP -&gt; Security &amp; Privacy -&gt; Privacy -&g
740740
</connections>
741741
</button>
742742
</subviews>
743+
<constraints>
744+
<constraint firstAttribute="bottom" secondItem="EsX-QF-82t" secondAttribute="bottom" id="7Uu-sL-K5E"/>
745+
<constraint firstItem="EsX-QF-82t" firstAttribute="top" secondItem="GZw-aA-VnS" secondAttribute="top" id="gFe-uI-GQP"/>
746+
</constraints>
747+
<visibilityPriorities>
748+
<integer value="1000"/>
749+
</visibilityPriorities>
750+
<customSpacing>
751+
<real value="3.4028234663852886e+38"/>
752+
</customSpacing>
753+
</stackView>
754+
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7hf-qg-ogu">
755+
<rect key="frame" x="0.0" y="46" width="268" height="16"/>
756+
<subviews>
757+
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NE4-rg-Kkc">
758+
<rect key="frame" x="-2" y="-1" width="270" height="18"/>
759+
<buttonCell key="cell" type="check" title="Open This Window When App Launched" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="jGa-99-pgU">
760+
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
761+
<font key="font" metaFont="system"/>
762+
</buttonCell>
763+
<connections>
764+
<action selector="handleShouldOpenWindowCheckBox:" target="XfG-lQ-9wD" id="9uO-Ul-4NJ"/>
765+
</connections>
766+
</button>
767+
</subviews>
768+
<constraints>
769+
<constraint firstAttribute="bottom" secondItem="NE4-rg-Kkc" secondAttribute="bottom" id="fZi-FR-RSU"/>
770+
<constraint firstItem="NE4-rg-Kkc" firstAttribute="top" secondItem="7hf-qg-ogu" secondAttribute="top" id="oPk-7M-1Yp"/>
771+
</constraints>
743772
<visibilityPriorities>
744773
<integer value="1000"/>
745774
</visibilityPriorities>
@@ -748,21 +777,21 @@ It can be set from Preference APP -&gt; Security &amp; Privacy -&gt; Privacy -&g
748777
</customSpacing>
749778
</stackView>
750779
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="VCT-eN-xA8">
751-
<rect key="frame" x="0.0" y="29" width="557" height="5"/>
780+
<rect key="frame" x="0.0" y="35" width="557" height="5"/>
752781
</box>
753782
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZMn-PH-OPt">
754-
<rect key="frame" x="0.0" y="0.0" width="573" height="23"/>
783+
<rect key="frame" x="0.0" y="0.0" width="573" height="29"/>
755784
<subviews>
756785
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KUl-qq-9kJ">
757-
<rect key="frame" x="-2" y="7" width="89" height="16"/>
786+
<rect key="frame" x="-2" y="13" width="89" height="16"/>
758787
<textFieldCell key="cell" lineBreakMode="clipping" title="SwiftLint Path" id="Yed-OX-SeH">
759788
<font key="font" usesAppearanceFont="YES"/>
760789
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
761790
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
762791
</textFieldCell>
763792
</textField>
764793
<popUpButton horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="e5u-68-49L">
765-
<rect key="frame" x="90" y="-1" width="87" height="25"/>
794+
<rect key="frame" x="90" y="5" width="87" height="25"/>
766795
<popUpButtonCell key="cell" type="push" title="Default" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="hlj-Ve-YRa" id="ugU-Pk-aXG">
767796
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
768797
<font key="font" metaFont="menu"/>
@@ -779,14 +808,18 @@ It can be set from Preference APP -&gt; Security &amp; Privacy -&gt; Privacy -&g
779808
</connections>
780809
</popUpButton>
781810
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Hb8-9R-wC2">
782-
<rect key="frame" x="181" y="2" width="392" height="21"/>
811+
<rect key="frame" x="181" y="4" width="392" height="21"/>
783812
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" id="4pz-Q8-MdH">
784813
<font key="font" metaFont="system"/>
785814
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
786815
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
787816
</textFieldCell>
788817
</textField>
789818
</subviews>
819+
<constraints>
820+
<constraint firstAttribute="bottom" secondItem="Hb8-9R-wC2" secondAttribute="bottom" constant="4" id="SdP-07-ooc"/>
821+
<constraint firstItem="Hb8-9R-wC2" firstAttribute="top" secondItem="ZMn-PH-OPt" secondAttribute="top" constant="4" id="dtO-7t-Ipl"/>
822+
</constraints>
790823
<visibilityPriorities>
791824
<integer value="1000"/>
792825
<integer value="1000"/>
@@ -808,12 +841,14 @@ It can be set from Preference APP -&gt; Security &amp; Privacy -&gt; Privacy -&g
808841
<integer value="1000"/>
809842
<integer value="1000"/>
810843
<integer value="1000"/>
844+
<integer value="1000"/>
811845
</visibilityPriorities>
812846
<customSpacing>
813847
<real value="3.4028234663852886e+38"/>
814848
<real value="3.4028234663852886e+38"/>
815849
<real value="3.4028234663852886e+38"/>
816850
<real value="3.4028234663852886e+38"/>
851+
<real value="3.4028234663852886e+38"/>
817852
</customSpacing>
818853
</stackView>
819854
</subviews>
@@ -826,6 +861,7 @@ It can be set from Preference APP -&gt; Security &amp; Privacy -&gt; Privacy -&g
826861
</view>
827862
<connections>
828863
<outlet property="launchAtLoginCheckBox" destination="EsX-QF-82t" id="9vh-CL-WyL"/>
864+
<outlet property="shouldOpenWindowCheckBox" destination="NE4-rg-Kkc" id="kOy-1U-MIr"/>
829865
<outlet property="swiftlintPathPopUpButton" destination="e5u-68-49L" id="1PZ-Mq-tIv"/>
830866
<outlet property="swiftlintPathTextField" destination="Hb8-9R-wC2" id="Qet-nl-f6W"/>
831867
</connections>

SwiftLintPlugin/Defaults.Keys.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ extension Defaults.Keys {
1717
static let swiftlintPath = Defaults.Key<String>("swiftlintPath", default: DEFINE.defaultSwiftLintPath, suite: groupUserDefaults ?? userDefaults)
1818

1919
static let shouldLaunchAtLogin = Defaults.Key<Bool>("shouldLaunchAtLogin", default: false)
20+
static let shouldOpenWindowWhenLaunch = Defaults.Key<Bool>("shouldOpenWindowWhenLaunch", default: true)
2021
}

SwiftLintPlugin/Info.plist

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
<string>1</string>
2323
<key>LSMinimumSystemVersion</key>
2424
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
25-
<key>NSMainStoryboardFile</key>
26-
<string>Main</string>
27-
<key>NSPrincipalClass</key>
28-
<string>NSApplication</string>
25+
<key>LSUIElement</key>
26+
<true/>
2927
<key>NSAppleEventsUsageDescription</key>
3028
<string>In order to get current open file on Xcode.</string>
29+
<key>NSPrincipalClass</key>
30+
<string>NSApplication</string>
3131
</dict>
3232
</plist>

0 commit comments

Comments
 (0)