Abhishek Banthia
9 years ago
commit
bd6228efcb
34 changed files with 3556 additions and 0 deletions
@ -0,0 +1,401 @@
|
||||
// !$*UTF8*$! |
||||
{ |
||||
archiveVersion = 1; |
||||
classes = { |
||||
}; |
||||
objectVersion = 46; |
||||
objects = { |
||||
|
||||
/* Begin PBXBuildFile section */ |
||||
9A8605AE1BEC148400A810A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605AD1BEC148400A810A4 /* main.m */; }; |
||||
9A8605B31BEC14A600A810A4 /* ColoredButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B21BEC14A600A810A4 /* ColoredButton.m */; }; |
||||
9A8605B61BEC14BE00A810A4 /* MenubarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B41BEC14BE00A810A4 /* MenubarController.m */; }; |
||||
9A8605B71BEC14BE00A810A4 /* ApplicationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B51BEC14BE00A810A4 /* ApplicationDelegate.m */; }; |
||||
9A8605BA1BEC14DC00A810A4 /* StatusItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B81BEC14DC00A810A4 /* StatusItemView.m */; }; |
||||
9A8605BB1BEC14DC00A810A4 /* PanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B91BEC14DC00A810A4 /* PanelController.m */; }; |
||||
9A8605BF1BEC14F600A810A4 /* BackgroundView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605BC1BEC14F600A810A4 /* BackgroundView.m */; }; |
||||
9A8605C01BEC14F600A810A4 /* Panel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605BD1BEC14F600A810A4 /* Panel.m */; }; |
||||
9A8605C11BEC14F600A810A4 /* PreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605BE1BEC14F600A810A4 /* PreferencesWindowController.m */; }; |
||||
9A8605D41BEC155B00A810A4 /* Clock.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605C21BEC155B00A810A4 /* Clock.jpeg */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605D51BEC155B00A810A4 /* Clocker-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605C31BEC155B00A810A4 /* Clocker-Info.plist */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605D61BEC155B00A810A4 /* Panel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605CD1BEC155B00A810A4 /* Panel.xib */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605D71BEC155B00A810A4 /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605CE1BEC155B00A810A4 /* PreferencesWindow.xib */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605D81BEC155B00A810A4 /* PowerIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605CF1BEC155B00A810A4 /* PowerIcon.png */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605D91BEC155B00A810A4 /* Status.png in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605D01BEC155B00A810A4 /* Status.png */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605DA1BEC155B00A810A4 /* Status@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605D11BEC155B00A810A4 /* Status@2x.png */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605DB1BEC155B00A810A4 /* StatusHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605D21BEC155B00A810A4 /* StatusHighlighted.png */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605DC1BEC155B00A810A4 /* StatusHighlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605D31BEC155B00A810A4 /* StatusHighlighted@2x.png */; settings = {ASSET_TAGS = (); }; }; |
||||
9A8605DF1BEC15C400A810A4 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A8605DD1BEC15C400A810A4 /* MainMenu.xib */; settings = {ASSET_TAGS = (); }; }; |
||||
DD4F7C0913C30F9F00825C6E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD4F7C0813C30F9F00825C6E /* Cocoa.framework */; }; |
||||
/* End PBXBuildFile section */ |
||||
|
||||
/* Begin PBXFileReference section */ |
||||
9A8605AD1BEC148400A810A4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Clocker/main.m; sourceTree = "<group>"; }; |
||||
9A8605B21BEC14A600A810A4 /* ColoredButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ColoredButton.m; path = Clocker/ColoredButton.m; sourceTree = "<group>"; }; |
||||
9A8605B41BEC14BE00A810A4 /* MenubarController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MenubarController.m; path = Clocker/MenubarController.m; sourceTree = "<group>"; }; |
||||
9A8605B51BEC14BE00A810A4 /* ApplicationDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ApplicationDelegate.m; path = Clocker/ApplicationDelegate.m; sourceTree = "<group>"; }; |
||||
9A8605B81BEC14DC00A810A4 /* StatusItemView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = StatusItemView.m; path = Clocker/StatusItemView.m; sourceTree = "<group>"; }; |
||||
9A8605B91BEC14DC00A810A4 /* PanelController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PanelController.m; path = Clocker/PanelController.m; sourceTree = "<group>"; }; |
||||
9A8605BC1BEC14F600A810A4 /* BackgroundView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BackgroundView.m; path = Clocker/BackgroundView.m; sourceTree = "<group>"; }; |
||||
9A8605BD1BEC14F600A810A4 /* Panel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Panel.m; path = Clocker/Panel.m; sourceTree = "<group>"; }; |
||||
9A8605BE1BEC14F600A810A4 /* PreferencesWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PreferencesWindowController.m; path = Clocker/PreferencesWindowController.m; sourceTree = "<group>"; }; |
||||
9A8605C21BEC155B00A810A4 /* Clock.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = Clock.jpeg; path = Clocker/Clock.jpeg; sourceTree = "<group>"; }; |
||||
9A8605C31BEC155B00A810A4 /* Clocker-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Clocker-Info.plist"; path = "Clocker/Clocker-Info.plist"; sourceTree = "<group>"; }; |
||||
9A8605C41BEC155B00A810A4 /* BackgroundView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BackgroundView.h; path = Clocker/BackgroundView.h; sourceTree = "<group>"; }; |
||||
9A8605C51BEC155B00A810A4 /* StatusItemView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatusItemView.h; path = Clocker/StatusItemView.h; sourceTree = "<group>"; }; |
||||
9A8605C61BEC155B00A810A4 /* Panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Panel.h; path = Clocker/Panel.h; sourceTree = "<group>"; }; |
||||
9A8605C71BEC155B00A810A4 /* PreferencesWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PreferencesWindowController.h; path = Clocker/PreferencesWindowController.h; sourceTree = "<group>"; }; |
||||
9A8605C81BEC155B00A810A4 /* PanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PanelController.h; path = Clocker/PanelController.h; sourceTree = "<group>"; }; |
||||
9A8605C91BEC155B00A810A4 /* MenubarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenubarController.h; path = Clocker/MenubarController.h; sourceTree = "<group>"; }; |
||||
9A8605CA1BEC155B00A810A4 /* ApplicationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ApplicationDelegate.h; path = Clocker/ApplicationDelegate.h; sourceTree = "<group>"; }; |
||||
9A8605CB1BEC155B00A810A4 /* ColoredButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ColoredButton.h; path = Clocker/ColoredButton.h; sourceTree = "<group>"; }; |
||||
9A8605CC1BEC155B00A810A4 /* Clocker-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Clocker-Prefix.pch"; path = "Clocker/Clocker-Prefix.pch"; sourceTree = "<group>"; }; |
||||
9A8605CD1BEC155B00A810A4 /* Panel.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = Panel.xib; path = Clocker/Panel.xib; sourceTree = "<group>"; }; |
||||
9A8605CE1BEC155B00A810A4 /* PreferencesWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = PreferencesWindow.xib; path = Clocker/PreferencesWindow.xib; sourceTree = "<group>"; }; |
||||
9A8605CF1BEC155B00A810A4 /* PowerIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PowerIcon.png; path = Clocker/PowerIcon.png; sourceTree = "<group>"; }; |
||||
9A8605D01BEC155B00A810A4 /* Status.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Status.png; path = Clocker/Status.png; sourceTree = "<group>"; }; |
||||
9A8605D11BEC155B00A810A4 /* Status@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Status@2x.png"; path = "Clocker/Status@2x.png"; sourceTree = "<group>"; }; |
||||
9A8605D21BEC155B00A810A4 /* StatusHighlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = StatusHighlighted.png; path = Clocker/StatusHighlighted.png; sourceTree = "<group>"; }; |
||||
9A8605D31BEC155B00A810A4 /* StatusHighlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "StatusHighlighted@2x.png"; path = "Clocker/StatusHighlighted@2x.png"; sourceTree = "<group>"; }; |
||||
9A8605DE1BEC15C400A810A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Clocker/en.lproj/MainMenu.xib; sourceTree = "<group>"; }; |
||||
DD4F7C0413C30F9F00825C6E /* Clocker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Clocker.app; sourceTree = BUILT_PRODUCTS_DIR; }; |
||||
DD4F7C0813C30F9F00825C6E /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; |
||||
DD4F7C0B13C30F9F00825C6E /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; |
||||
DD4F7C0C13C30F9F00825C6E /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; |
||||
DD4F7C0D13C30F9F00825C6E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; |
||||
/* End PBXFileReference section */ |
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */ |
||||
DD4F7C0113C30F9F00825C6E /* Frameworks */ = { |
||||
isa = PBXFrameworksBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
DD4F7C0913C30F9F00825C6E /* Cocoa.framework in Frameworks */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
/* End PBXFrameworksBuildPhase section */ |
||||
|
||||
/* Begin PBXGroup section */ |
||||
9A8605E01BEC15F400A810A4 /* XIB */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
9A8605DD1BEC15C400A810A4 /* MainMenu.xib */, |
||||
9A8605CD1BEC155B00A810A4 /* Panel.xib */, |
||||
9A8605CE1BEC155B00A810A4 /* PreferencesWindow.xib */, |
||||
); |
||||
name = XIB; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
9A8605E11BEC160700A810A4 /* Images */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
9A8605C21BEC155B00A810A4 /* Clock.jpeg */, |
||||
9A8605CF1BEC155B00A810A4 /* PowerIcon.png */, |
||||
9A8605D01BEC155B00A810A4 /* Status.png */, |
||||
9A8605D11BEC155B00A810A4 /* Status@2x.png */, |
||||
9A8605D21BEC155B00A810A4 /* StatusHighlighted.png */, |
||||
9A8605D31BEC155B00A810A4 /* StatusHighlighted@2x.png */, |
||||
); |
||||
name = Images; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
9A8605E21BEC161300A810A4 /* Superclass */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
9A8605C61BEC155B00A810A4 /* Panel.h */, |
||||
9A8605BD1BEC14F600A810A4 /* Panel.m */, |
||||
9A8605CB1BEC155B00A810A4 /* ColoredButton.h */, |
||||
9A8605B21BEC14A600A810A4 /* ColoredButton.m */, |
||||
); |
||||
name = Superclass; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
9A8605E31BEC163100A810A4 /* Views */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
9A8605C41BEC155B00A810A4 /* BackgroundView.h */, |
||||
9A8605C51BEC155B00A810A4 /* StatusItemView.h */, |
||||
9A8605BC1BEC14F600A810A4 /* BackgroundView.m */, |
||||
9A8605B81BEC14DC00A810A4 /* StatusItemView.m */, |
||||
); |
||||
name = Views; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
9A8605E41BEC164C00A810A4 /* Main */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
9A8605C31BEC155B00A810A4 /* Clocker-Info.plist */, |
||||
9A8605CC1BEC155B00A810A4 /* Clocker-Prefix.pch */, |
||||
9A8605AD1BEC148400A810A4 /* main.m */, |
||||
); |
||||
name = Main; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
9A8605E51BEC165400A810A4 /* Controllers */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
9A8605CA1BEC155B00A810A4 /* ApplicationDelegate.h */, |
||||
9A8605B51BEC14BE00A810A4 /* ApplicationDelegate.m */, |
||||
9A8605C91BEC155B00A810A4 /* MenubarController.h */, |
||||
9A8605B41BEC14BE00A810A4 /* MenubarController.m */, |
||||
9A8605C81BEC155B00A810A4 /* PanelController.h */, |
||||
9A8605B91BEC14DC00A810A4 /* PanelController.m */, |
||||
9A8605C71BEC155B00A810A4 /* PreferencesWindowController.h */, |
||||
9A8605BE1BEC14F600A810A4 /* PreferencesWindowController.m */, |
||||
); |
||||
name = Controllers; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
DD4F7BF913C30F9F00825C6E = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
9A8605E01BEC15F400A810A4 /* XIB */, |
||||
9A8605E11BEC160700A810A4 /* Images */, |
||||
9A8605E41BEC164C00A810A4 /* Main */, |
||||
9A8605E31BEC163100A810A4 /* Views */, |
||||
9A8605E51BEC165400A810A4 /* Controllers */, |
||||
9A8605E21BEC161300A810A4 /* Superclass */, |
||||
DD4F7C0713C30F9F00825C6E /* Frameworks */, |
||||
DD4F7C0513C30F9F00825C6E /* Products */, |
||||
); |
||||
sourceTree = "<group>"; |
||||
}; |
||||
DD4F7C0513C30F9F00825C6E /* Products */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
DD4F7C0413C30F9F00825C6E /* Clocker.app */, |
||||
); |
||||
name = Products; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
DD4F7C0713C30F9F00825C6E /* Frameworks */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
DD4F7C0B13C30F9F00825C6E /* AppKit.framework */, |
||||
DD4F7C0C13C30F9F00825C6E /* CoreData.framework */, |
||||
DD4F7C0D13C30F9F00825C6E /* Foundation.framework */, |
||||
DD4F7C0813C30F9F00825C6E /* Cocoa.framework */, |
||||
); |
||||
name = Frameworks; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
/* End PBXGroup section */ |
||||
|
||||
/* Begin PBXNativeTarget section */ |
||||
DD4F7C0313C30F9F00825C6E /* Clocker */ = { |
||||
isa = PBXNativeTarget; |
||||
buildConfigurationList = DD4F7C2213C30F9F00825C6E /* Build configuration list for PBXNativeTarget "Clocker" */; |
||||
buildPhases = ( |
||||
DD4F7C0013C30F9F00825C6E /* Sources */, |
||||
DD4F7C0113C30F9F00825C6E /* Frameworks */, |
||||
DD4F7C0213C30F9F00825C6E /* Resources */, |
||||
); |
||||
buildRules = ( |
||||
); |
||||
dependencies = ( |
||||
); |
||||
name = Clocker; |
||||
productName = Popup; |
||||
productReference = DD4F7C0413C30F9F00825C6E /* Clocker.app */; |
||||
productType = "com.apple.product-type.application"; |
||||
}; |
||||
/* End PBXNativeTarget section */ |
||||
|
||||
/* Begin PBXProject section */ |
||||
DD4F7BFB13C30F9F00825C6E /* Project object */ = { |
||||
isa = PBXProject; |
||||
attributes = { |
||||
LastUpgradeCheck = 0700; |
||||
}; |
||||
buildConfigurationList = DD4F7BFE13C30F9F00825C6E /* Build configuration list for PBXProject "Clocker" */; |
||||
compatibilityVersion = "Xcode 3.2"; |
||||
developmentRegion = English; |
||||
hasScannedForEncodings = 0; |
||||
knownRegions = ( |
||||
en, |
||||
); |
||||
mainGroup = DD4F7BF913C30F9F00825C6E; |
||||
productRefGroup = DD4F7C0513C30F9F00825C6E /* Products */; |
||||
projectDirPath = ""; |
||||
projectRoot = ""; |
||||
targets = ( |
||||
DD4F7C0313C30F9F00825C6E /* Clocker */, |
||||
); |
||||
}; |
||||
/* End PBXProject section */ |
||||
|
||||
/* Begin PBXResourcesBuildPhase section */ |
||||
DD4F7C0213C30F9F00825C6E /* Resources */ = { |
||||
isa = PBXResourcesBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
9A8605D51BEC155B00A810A4 /* Clocker-Info.plist in Resources */, |
||||
9A8605D71BEC155B00A810A4 /* PreferencesWindow.xib in Resources */, |
||||
9A8605DF1BEC15C400A810A4 /* MainMenu.xib in Resources */, |
||||
9A8605D91BEC155B00A810A4 /* Status.png in Resources */, |
||||
9A8605D61BEC155B00A810A4 /* Panel.xib in Resources */, |
||||
9A8605D41BEC155B00A810A4 /* Clock.jpeg in Resources */, |
||||
9A8605DC1BEC155B00A810A4 /* StatusHighlighted@2x.png in Resources */, |
||||
9A8605DA1BEC155B00A810A4 /* Status@2x.png in Resources */, |
||||
9A8605DB1BEC155B00A810A4 /* StatusHighlighted.png in Resources */, |
||||
9A8605D81BEC155B00A810A4 /* PowerIcon.png in Resources */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
/* End PBXResourcesBuildPhase section */ |
||||
|
||||
/* Begin PBXSourcesBuildPhase section */ |
||||
DD4F7C0013C30F9F00825C6E /* Sources */ = { |
||||
isa = PBXSourcesBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
9A8605BF1BEC14F600A810A4 /* BackgroundView.m in Sources */, |
||||
9A8605C01BEC14F600A810A4 /* Panel.m in Sources */, |
||||
9A8605C11BEC14F600A810A4 /* PreferencesWindowController.m in Sources */, |
||||
9A8605BA1BEC14DC00A810A4 /* StatusItemView.m in Sources */, |
||||
9A8605BB1BEC14DC00A810A4 /* PanelController.m in Sources */, |
||||
9A8605B61BEC14BE00A810A4 /* MenubarController.m in Sources */, |
||||
9A8605B71BEC14BE00A810A4 /* ApplicationDelegate.m in Sources */, |
||||
9A8605B31BEC14A600A810A4 /* ColoredButton.m in Sources */, |
||||
9A8605AE1BEC148400A810A4 /* main.m in Sources */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
/* End PBXSourcesBuildPhase section */ |
||||
|
||||
/* Begin PBXVariantGroup section */ |
||||
9A8605DD1BEC15C400A810A4 /* MainMenu.xib */ = { |
||||
isa = PBXVariantGroup; |
||||
children = ( |
||||
9A8605DE1BEC15C400A810A4 /* en */, |
||||
); |
||||
name = MainMenu.xib; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
/* End PBXVariantGroup section */ |
||||
|
||||
/* Begin XCBuildConfiguration section */ |
||||
DD4F7C2013C30F9F00825C6E /* Debug */ = { |
||||
isa = XCBuildConfiguration; |
||||
buildSettings = { |
||||
ALWAYS_SEARCH_USER_PATHS = NO; |
||||
CLANG_WARN_BOOL_CONVERSION = YES; |
||||
CLANG_WARN_CONSTANT_CONVERSION = YES; |
||||
CLANG_WARN_EMPTY_BODY = YES; |
||||
CLANG_WARN_ENUM_CONVERSION = YES; |
||||
CLANG_WARN_INT_CONVERSION = YES; |
||||
CLANG_WARN_UNREACHABLE_CODE = YES; |
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; |
||||
COPY_PHASE_STRIP = NO; |
||||
ENABLE_STRICT_OBJC_MSGSEND = YES; |
||||
ENABLE_TESTABILITY = YES; |
||||
GCC_C_LANGUAGE_STANDARD = gnu99; |
||||
GCC_DYNAMIC_NO_PIC = NO; |
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES; |
||||
GCC_NO_COMMON_BLOCKS = YES; |
||||
GCC_OPTIMIZATION_LEVEL = 0; |
||||
GCC_PREPROCESSOR_DEFINITIONS = ( |
||||
"DEBUG=1", |
||||
"$(inherited)", |
||||
); |
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO; |
||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0; |
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; |
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; |
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES; |
||||
GCC_WARN_UNDECLARED_SELECTOR = YES; |
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES; |
||||
GCC_WARN_UNUSED_FUNCTION = YES; |
||||
GCC_WARN_UNUSED_VARIABLE = YES; |
||||
MACOSX_DEPLOYMENT_TARGET = 10.6; |
||||
ONLY_ACTIVE_ARCH = YES; |
||||
SDKROOT = macosx; |
||||
}; |
||||
name = Debug; |
||||
}; |
||||
DD4F7C2113C30F9F00825C6E /* Release */ = { |
||||
isa = XCBuildConfiguration; |
||||
buildSettings = { |
||||
ALWAYS_SEARCH_USER_PATHS = NO; |
||||
CLANG_WARN_BOOL_CONVERSION = YES; |
||||
CLANG_WARN_CONSTANT_CONVERSION = YES; |
||||
CLANG_WARN_EMPTY_BODY = YES; |
||||
CLANG_WARN_ENUM_CONVERSION = YES; |
||||
CLANG_WARN_INT_CONVERSION = YES; |
||||
CLANG_WARN_UNREACHABLE_CODE = YES; |
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; |
||||
COPY_PHASE_STRIP = YES; |
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; |
||||
ENABLE_STRICT_OBJC_MSGSEND = YES; |
||||
GCC_C_LANGUAGE_STANDARD = gnu99; |
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES; |
||||
GCC_NO_COMMON_BLOCKS = YES; |
||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0; |
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; |
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; |
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES; |
||||
GCC_WARN_UNDECLARED_SELECTOR = YES; |
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES; |
||||
GCC_WARN_UNUSED_FUNCTION = YES; |
||||
GCC_WARN_UNUSED_VARIABLE = YES; |
||||
MACOSX_DEPLOYMENT_TARGET = 10.6; |
||||
SDKROOT = macosx; |
||||
}; |
||||
name = Release; |
||||
}; |
||||
DD4F7C2313C30F9F00825C6E /* Debug */ = { |
||||
isa = XCBuildConfiguration; |
||||
buildSettings = { |
||||
CLANG_ENABLE_OBJC_ARC = YES; |
||||
COMBINE_HIDPI_IMAGES = YES; |
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES; |
||||
GCC_PREFIX_HEADER = "Clocker/Clocker-Prefix.pch"; |
||||
INFOPLIST_FILE = "Clocker/Clocker-Info.plist"; |
||||
MACOSX_DEPLOYMENT_TARGET = 10.10; |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker; |
||||
PRODUCT_NAME = Clocker; |
||||
WRAPPER_EXTENSION = app; |
||||
}; |
||||
name = Debug; |
||||
}; |
||||
DD4F7C2413C30F9F00825C6E /* Release */ = { |
||||
isa = XCBuildConfiguration; |
||||
buildSettings = { |
||||
CLANG_ENABLE_OBJC_ARC = YES; |
||||
COMBINE_HIDPI_IMAGES = YES; |
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES; |
||||
GCC_PREFIX_HEADER = "Clocker/Clocker-Prefix.pch"; |
||||
INFOPLIST_FILE = "Clocker/Clocker-Info.plist"; |
||||
MACOSX_DEPLOYMENT_TARGET = 10.10; |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker; |
||||
PRODUCT_NAME = Clocker; |
||||
WRAPPER_EXTENSION = app; |
||||
}; |
||||
name = Release; |
||||
}; |
||||
/* End XCBuildConfiguration section */ |
||||
|
||||
/* Begin XCConfigurationList section */ |
||||
DD4F7BFE13C30F9F00825C6E /* Build configuration list for PBXProject "Clocker" */ = { |
||||
isa = XCConfigurationList; |
||||
buildConfigurations = ( |
||||
DD4F7C2013C30F9F00825C6E /* Debug */, |
||||
DD4F7C2113C30F9F00825C6E /* Release */, |
||||
); |
||||
defaultConfigurationIsVisible = 0; |
||||
defaultConfigurationName = Release; |
||||
}; |
||||
DD4F7C2213C30F9F00825C6E /* Build configuration list for PBXNativeTarget "Clocker" */ = { |
||||
isa = XCConfigurationList; |
||||
buildConfigurations = ( |
||||
DD4F7C2313C30F9F00825C6E /* Debug */, |
||||
DD4F7C2413C30F9F00825C6E /* Release */, |
||||
); |
||||
defaultConfigurationIsVisible = 0; |
||||
defaultConfigurationName = Release; |
||||
}; |
||||
/* End XCConfigurationList section */ |
||||
}; |
||||
rootObject = DD4F7BFB13C30F9F00825C6E /* Project object */; |
||||
} |
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<Workspace |
||||
version = "1.0"> |
||||
<FileRef |
||||
location = "self:/Users/abhishekbanthia/Downloads/Popup-master/Clocker.xcodeproj"> |
||||
</FileRef> |
||||
</Workspace> |
Binary file not shown.
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<Bucket |
||||
type = "1" |
||||
version = "2.0"> |
||||
</Bucket> |
@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<Scheme |
||||
LastUpgradeVersion = "0700" |
||||
version = "1.3"> |
||||
<BuildAction |
||||
parallelizeBuildables = "YES" |
||||
buildImplicitDependencies = "YES"> |
||||
<BuildActionEntries> |
||||
<BuildActionEntry |
||||
buildForTesting = "YES" |
||||
buildForRunning = "YES" |
||||
buildForProfiling = "YES" |
||||
buildForArchiving = "YES" |
||||
buildForAnalyzing = "YES"> |
||||
<BuildableReference |
||||
BuildableIdentifier = "primary" |
||||
BlueprintIdentifier = "DD4F7C0313C30F9F00825C6E" |
||||
BuildableName = "Clocker.app" |
||||
BlueprintName = "Clocker" |
||||
ReferencedContainer = "container:Clocker.xcodeproj"> |
||||
</BuildableReference> |
||||
</BuildActionEntry> |
||||
</BuildActionEntries> |
||||
</BuildAction> |
||||
<TestAction |
||||
buildConfiguration = "Debug" |
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" |
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" |
||||
shouldUseLaunchSchemeArgsEnv = "YES"> |
||||
<Testables> |
||||
</Testables> |
||||
<MacroExpansion> |
||||
<BuildableReference |
||||
BuildableIdentifier = "primary" |
||||
BlueprintIdentifier = "DD4F7C0313C30F9F00825C6E" |
||||
BuildableName = "Clocker.app" |
||||
BlueprintName = "Clocker" |
||||
ReferencedContainer = "container:Clocker.xcodeproj"> |
||||
</BuildableReference> |
||||
</MacroExpansion> |
||||
<AdditionalOptions> |
||||
</AdditionalOptions> |
||||
</TestAction> |
||||
<LaunchAction |
||||
buildConfiguration = "Debug" |
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" |
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" |
||||
launchStyle = "0" |
||||
useCustomWorkingDirectory = "NO" |
||||
ignoresPersistentStateOnLaunch = "NO" |
||||
debugDocumentVersioning = "YES" |
||||
debugServiceExtension = "internal" |
||||
allowLocationSimulation = "YES"> |
||||
<BuildableProductRunnable |
||||
runnableDebuggingMode = "0"> |
||||
<BuildableReference |
||||
BuildableIdentifier = "primary" |
||||
BlueprintIdentifier = "DD4F7C0313C30F9F00825C6E" |
||||
BuildableName = "Clocker.app" |
||||
BlueprintName = "Clocker" |
||||
ReferencedContainer = "container:Clocker.xcodeproj"> |
||||
</BuildableReference> |
||||
</BuildableProductRunnable> |
||||
<AdditionalOptions> |
||||
</AdditionalOptions> |
||||
</LaunchAction> |
||||
<ProfileAction |
||||
buildConfiguration = "Release" |
||||
shouldUseLaunchSchemeArgsEnv = "YES" |
||||
savedToolIdentifier = "" |
||||
useCustomWorkingDirectory = "NO" |
||||
debugDocumentVersioning = "YES"> |
||||
<BuildableProductRunnable |
||||
runnableDebuggingMode = "0"> |
||||
<BuildableReference |
||||
BuildableIdentifier = "primary" |
||||
BlueprintIdentifier = "DD4F7C0313C30F9F00825C6E" |
||||
BuildableName = "Clocker.app" |
||||
BlueprintName = "Clocker" |
||||
ReferencedContainer = "container:Clocker.xcodeproj"> |
||||
</BuildableReference> |
||||
</BuildableProductRunnable> |
||||
</ProfileAction> |
||||
<AnalyzeAction |
||||
buildConfiguration = "Debug"> |
||||
</AnalyzeAction> |
||||
<ArchiveAction |
||||
buildConfiguration = "Release" |
||||
revealArchiveInOrganizer = "YES"> |
||||
</ArchiveAction> |
||||
</Scheme> |
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
||||
<plist version="1.0"> |
||||
<dict> |
||||
<key>SchemeUserState</key> |
||||
<dict> |
||||
<key>Clocker.xcscheme</key> |
||||
<dict> |
||||
<key>orderHint</key> |
||||
<integer>1</integer> |
||||
</dict> |
||||
</dict> |
||||
<key>SuppressBuildableAutocreation</key> |
||||
<dict> |
||||
<key>DD4F7C0313C30F9F00825C6E</key> |
||||
<dict> |
||||
<key>primary</key> |
||||
<true/> |
||||
</dict> |
||||
</dict> |
||||
</dict> |
||||
</plist> |
@ -0,0 +1,39 @@
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
#import "MenubarController.h" |
||||
#import "PanelController.h" |
||||
|
||||
@interface ApplicationDelegate : NSObject <NSApplicationDelegate, PanelControllerDelegate> |
||||
|
||||
@property (nonatomic, strong) MenubarController *menubarController; |
||||
@property (nonatomic, strong, readonly) PanelController *panelController; |
||||
|
||||
- (IBAction)togglePanel:(id)sender; |
||||
|
||||
@end |
@ -0,0 +1,97 @@
|
||||
// Created by Abhishek Banthia on 11/4/15. |
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved. |
||||
// |
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without modification, |
||||
// are permitted provided that the following conditions are met: |
||||
// |
||||
// Redistributions of source code must retain the above copyright notice, |
||||
// this list of conditions and the following disclaimer. |
||||
// |
||||
// Redistributions in binary form must reproduce the above copyright notice, |
||||
// this list of conditions and the following disclaimer in the documentation and/or |
||||
// other materials provided with the distribution. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#import "ApplicationDelegate.h" |
||||
|
||||
@implementation ApplicationDelegate |
||||
|
||||
@synthesize panelController = _panelController; |
||||
@synthesize menubarController = _menubarController; |
||||
|
||||
#pragma mark - |
||||
|
||||
- (void)dealloc |
||||
{ |
||||
[self.panelController removeObserver:self forKeyPath:@"hasActivePanel"]; |
||||
} |
||||
|
||||
#pragma mark - |
||||
|
||||
void *kContextActivePanel = &kContextActivePanel; |
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context |
||||
{ |
||||
if (context == kContextActivePanel) { |
||||
self.menubarController.hasActiveIcon = self.panelController.hasActivePanel; |
||||
} |
||||
else { |
||||
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; |
||||
} |
||||
} |
||||
|
||||
#pragma mark - NSApplicationDelegate |
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification |
||||
{ |
||||
// Install icon into the menu bar |
||||
self.menubarController = [[MenubarController alloc] init]; |
||||
} |
||||
|
||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender |
||||
{ |
||||
// Explicitly remove the icon from the menu bar |
||||
self.menubarController = nil; |
||||
return NSTerminateNow; |
||||
} |
||||
|
||||
#pragma mark - Actions |
||||
|
||||
- (IBAction)togglePanel:(id)sender |
||||
{ |
||||
self.menubarController.hasActiveIcon = !self.menubarController.hasActiveIcon; |
||||
self.panelController.hasActivePanel = self.menubarController.hasActiveIcon; |
||||
} |
||||
|
||||
#pragma mark - Public accessors |
||||
|
||||
- (PanelController *)panelController |
||||
{ |
||||
if (_panelController == nil) { |
||||
_panelController = [[PanelController alloc] initWithDelegate:self]; |
||||
[_panelController addObserver:self forKeyPath:@"hasActivePanel" options:0 context:kContextActivePanel]; |
||||
} |
||||
return _panelController; |
||||
} |
||||
|
||||
#pragma mark - PanelControllerDelegate |
||||
|
||||
- (StatusItemView *)statusItemViewForPanelController:(PanelController *)controller |
||||
{ |
||||
return self.menubarController.statusItemView; |
||||
} |
||||
|
||||
@end |
@ -0,0 +1,40 @@
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
#define ARROW_WIDTH 12 |
||||
#define ARROW_HEIGHT 12 |
||||
|
||||
@interface BackgroundView : NSView |
||||
{ |
||||
NSInteger _arrowX; |
||||
} |
||||
|
||||
@property (nonatomic, assign) NSInteger arrowX; |
||||
@property (nonatomic, strong) NSTrackingArea *trackingArea; |
||||
|
||||
@end |
@ -0,0 +1,144 @@
|
||||
// Created by Abhishek Banthia on 11/4/15. |
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved. |
||||
// |
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without modification, |
||||
// are permitted provided that the following conditions are met: |
||||
// |
||||
// Redistributions of source code must retain the above copyright notice, |
||||
// this list of conditions and the following disclaimer. |
||||
// |
||||
// Redistributions in binary form must reproduce the above copyright notice, |
||||
// this list of conditions and the following disclaimer in the documentation and/or |
||||
// other materials provided with the distribution. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
|
||||
#import "BackgroundView.h" |
||||
|
||||
#define FILL_OPACITY 0.9f |
||||
#define STROKE_OPACITY 1.0f |
||||
|
||||
#define LINE_THICKNESS 1.0f |
||||
#define CORNER_RADIUS 6.0f |
||||
|
||||
#define SEARCH_INSET 10.0f |
||||
#import "ApplicationDelegate.h" |
||||
#import "PanelController.h" |
||||
|
||||
#pragma mark - |
||||
|
||||
@implementation BackgroundView |
||||
|
||||
|
||||
@synthesize arrowX = _arrowX; |
||||
|
||||
#pragma mark - |
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect |
||||
{ |
||||
NSRect contentRect = NSInsetRect([self bounds], LINE_THICKNESS, LINE_THICKNESS); |
||||
NSBezierPath *path = [NSBezierPath bezierPath]; |
||||
|
||||
[path moveToPoint:NSMakePoint(_arrowX, NSMaxY(contentRect))]; |
||||
[path lineToPoint:NSMakePoint(_arrowX + ARROW_WIDTH / 2, NSMaxY(contentRect) - ARROW_HEIGHT)]; |
||||
[path lineToPoint:NSMakePoint(NSMaxX(contentRect) - CORNER_RADIUS, NSMaxY(contentRect) - ARROW_HEIGHT)]; |
||||
|
||||
NSPoint topRightCorner = NSMakePoint(NSMaxX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT); |
||||
[path curveToPoint:NSMakePoint(NSMaxX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT - CORNER_RADIUS) |
||||
controlPoint1:topRightCorner controlPoint2:topRightCorner]; |
||||
|
||||
[path lineToPoint:NSMakePoint(NSMaxX(contentRect), NSMinY(contentRect) + CORNER_RADIUS)]; |
||||
|
||||
NSPoint bottomRightCorner = NSMakePoint(NSMaxX(contentRect), NSMinY(contentRect)); |
||||
[path curveToPoint:NSMakePoint(NSMaxX(contentRect) - CORNER_RADIUS, NSMinY(contentRect)) |
||||
controlPoint1:bottomRightCorner controlPoint2:bottomRightCorner]; |
||||
|
||||
[path lineToPoint:NSMakePoint(NSMinX(contentRect) + CORNER_RADIUS, NSMinY(contentRect))]; |
||||
|
||||
[path curveToPoint:NSMakePoint(NSMinX(contentRect), NSMinY(contentRect) + CORNER_RADIUS) |
||||
controlPoint1:contentRect.origin controlPoint2:contentRect.origin]; |
||||
|
||||
[path lineToPoint:NSMakePoint(NSMinX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT - CORNER_RADIUS)]; |
||||
|
||||
NSPoint topLeftCorner = NSMakePoint(NSMinX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT); |
||||
[path curveToPoint:NSMakePoint(NSMinX(contentRect) + CORNER_RADIUS, NSMaxY(contentRect) - ARROW_HEIGHT) |
||||
controlPoint1:topLeftCorner controlPoint2:topLeftCorner]; |
||||
|
||||
[path lineToPoint:NSMakePoint(_arrowX - ARROW_WIDTH / 2, NSMaxY(contentRect) - ARROW_HEIGHT)]; |
||||
[path closePath]; |
||||
|
||||
[[NSColor colorWithDeviceWhite:1 alpha:FILL_OPACITY] setFill]; |
||||
[path fill]; |
||||
|
||||
[NSGraphicsContext saveGraphicsState]; |
||||
|
||||
NSBezierPath *clip = [NSBezierPath bezierPathWithRect:[self bounds]]; |
||||
[clip appendBezierPath:path]; |
||||
[clip addClip]; |
||||
|
||||
[path setLineWidth:LINE_THICKNESS * 2]; |
||||
[[NSColor whiteColor] setStroke]; |
||||
[path stroke]; |
||||
|
||||
[NSGraphicsContext restoreGraphicsState]; |
||||
} |
||||
|
||||
-(void)mouseEntered:(NSEvent *)theEvent |
||||
{ |
||||
[super mouseEntered:theEvent]; |
||||
|
||||
ApplicationDelegate *delegate = (ApplicationDelegate*)[NSApplication sharedApplication].delegate; |
||||
PanelController *controller = delegate.panelController; |
||||
|
||||
[controller showOptions:YES]; |
||||
} |
||||
|
||||
-(void)mouseExited:(NSEvent *)theEvent |
||||
{ |
||||
[super mouseExited:theEvent]; |
||||
|
||||
ApplicationDelegate *delegate = (ApplicationDelegate*) [NSApplication sharedApplication].delegate; |
||||
PanelController *controller = delegate.panelController; |
||||
|
||||
[controller showOptions:NO]; |
||||
} |
||||
|
||||
-(void)updateTrackingAreas |
||||
{ |
||||
if(self.trackingArea != nil) { |
||||
[self removeTrackingArea:self.trackingArea]; |
||||
} |
||||
|
||||
int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways); |
||||
self.trackingArea = [ [NSTrackingArea alloc] initWithRect:[self bounds] |
||||
options:opts |
||||
owner:self |
||||
userInfo:nil]; |
||||
[self addTrackingArea:self.trackingArea]; |
||||
} |
||||
|
||||
|
||||
|
||||
#pragma mark - |
||||
#pragma mark Public accessors |
||||
|
||||
- (void)setArrowX:(NSInteger)value |
||||
{ |
||||
_arrowX = value; |
||||
[self setNeedsDisplay:YES]; |
||||
} |
||||
|
||||
@end |
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
||||
<plist version="1.0"> |
||||
<dict> |
||||
<key>CFBundleDevelopmentRegion</key> |
||||
<string>en</string> |
||||
<key>CFBundleExecutable</key> |
||||
<string>${EXECUTABLE_NAME}</string> |
||||
<key>CFBundleIconFile</key> |
||||
<string></string> |
||||
<key>CFBundleIdentifier</key> |
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> |
||||
<key>CFBundleInfoDictionaryVersion</key> |
||||
<string>6.0</string> |
||||
<key>CFBundleName</key> |
||||
<string>${PRODUCT_NAME}</string> |
||||
<key>CFBundlePackageType</key> |
||||
<string>APPL</string> |
||||
<key>CFBundleShortVersionString</key> |
||||
<string>1.0</string> |
||||
<key>CFBundleSignature</key> |
||||
<string>????</string> |
||||
<key>CFBundleVersion</key> |
||||
<string>8</string> |
||||
<key>LSApplicationCategoryType</key> |
||||
<string>public.app-category.utilities</string> |
||||
<key>LSMinimumSystemVersion</key> |
||||
<string>${MACOSX_DEPLOYMENT_TARGET}</string> |
||||
<key>LSUIElement</key> |
||||
<true/> |
||||
<key>NSHumanReadableCopyright</key> |
||||
<string>Copyright © 2011, 2012 Shpakovski</string> |
||||
<key>NSMainNibFile</key> |
||||
<string>MainMenu</string> |
||||
<key>NSPrincipalClass</key> |
||||
<string>NSApplication</string> |
||||
</dict> |
||||
</plist> |
@ -0,0 +1,9 @@
|
||||
// |
||||
// Prefix header for all source files of the 'Clocker' target in the 'Clocker' project |
||||
// |
||||
|
||||
#ifdef __OBJC__ |
||||
|
||||
#import <Cocoa/Cocoa.h> |
||||
|
||||
#endif |
@ -0,0 +1,36 @@
|
||||
//
|
||||
// ColoredButton.h
|
||||
// Clocker
|
||||
//
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import <Cocoa/Cocoa.h> |
||||
|
||||
@interface ColoredButton : NSButton |
||||
|
||||
@end |
@ -0,0 +1,61 @@
|
||||
// |
||||
// ColoredButton.m |
||||
// Clocker |
||||
// |
||||
// Created by Abhishek Banthia on 11/4/15. |
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved. |
||||
// |
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without modification, |
||||
// are permitted provided that the following conditions are met: |
||||
// |
||||
// Redistributions of source code must retain the above copyright notice, |
||||
// this list of conditions and the following disclaimer. |
||||
// |
||||
// Redistributions in binary form must reproduce the above copyright notice, |
||||
// this list of conditions and the following disclaimer in the documentation and/or |
||||
// other materials provided with the distribution. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
|
||||
#import "ColoredButton.h" |
||||
|
||||
@implementation ColoredButton |
||||
|
||||
- (void)setButtonTitleFor:(NSButton*)button toString:(NSString*)title withColor:(NSColor*)color |
||||
{ |
||||
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; |
||||
[style setAlignment:NSLeftTextAlignment]; |
||||
NSFont *font = [NSFont fontWithName:@"HelveticaNeue-Light" size:13.0]; |
||||
NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:color, NSForegroundColorAttributeName, style, NSParagraphStyleAttributeName, font,NSFontAttributeName, nil]; |
||||
|
||||
|
||||
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc]initWithString:title attributes:attrsDictionary]; |
||||
[attrString setAlignment:NSTextAlignmentLeft range:NSMakeRange(0, self.title.length)]; |
||||
|
||||
|
||||
[button setAttributedTitle:attrString]; |
||||
} |
||||
|
||||
-(void)awakeFromNib |
||||
{ |
||||
NSString *title = self.title; |
||||
NSColor *color = [NSColor blackColor]; |
||||
[self setButtonTitleFor:self toString:title withColor:color]; |
||||
} |
||||
|
||||
|
||||
|
||||
@end |
@ -0,0 +1,44 @@
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
#define STATUS_ITEM_VIEW_WIDTH 24.0 |
||||
|
||||
#pragma mark - |
||||
|
||||
@class StatusItemView; |
||||
|
||||
@interface MenubarController : NSObject { |
||||
@private |
||||
StatusItemView *_statusItemView; |
||||
} |
||||
|
||||
@property (nonatomic) BOOL hasActiveIcon; |
||||
@property (nonatomic, strong, readonly) NSStatusItem *statusItem; |
||||
@property (nonatomic, strong, readonly) StatusItemView *statusItemView; |
||||
|
||||
@end |
@ -0,0 +1,52 @@
|
||||
|
||||
|
||||
#import "MenubarController.h" |
||||
#import "StatusItemView.h" |
||||
|
||||
@implementation MenubarController |
||||
|
||||
@synthesize statusItemView = _statusItemView; |
||||
|
||||
#pragma mark - |
||||
|
||||
- (id)init |
||||
{ |
||||
self = [super init]; |
||||
if (self != nil) |
||||
{ |
||||
// Install status item into the menu bar |
||||
NSStatusItem *statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:STATUS_ITEM_VIEW_WIDTH]; |
||||
_statusItemView = [[StatusItemView alloc] initWithStatusItem:statusItem]; |
||||
_statusItemView.image = [NSImage imageNamed:@"Status"]; |
||||
_statusItemView.alternateImage = [NSImage imageNamed:@"StatusHighlighted"]; |
||||
_statusItemView.action = @selector(togglePanel:); |
||||
} |
||||
return self; |
||||
} |
||||
|
||||
- (void)dealloc |
||||
{ |
||||
[[NSStatusBar systemStatusBar] removeStatusItem:self.statusItem]; |
||||
} |
||||
|
||||
#pragma mark - |
||||
#pragma mark Public accessors |
||||
|
||||
- (NSStatusItem *)statusItem |
||||
{ |
||||
return self.statusItemView.statusItem; |
||||
} |
||||
|
||||
#pragma mark - |
||||
|
||||
- (BOOL)hasActiveIcon |
||||
{ |
||||
return self.statusItemView.isHighlighted; |
||||
} |
||||
|
||||
- (void)setHasActiveIcon:(BOOL)flag |
||||
{ |
||||
self.statusItemView.isHighlighted = flag; |
||||
} |
||||
|
||||
@end |
@ -0,0 +1,30 @@
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
@interface Panel : NSPanel |
||||
@end |
@ -0,0 +1,54 @@
|
||||
// Created by Abhishek Banthia on 11/4/15. |
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved. |
||||
// |
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without modification, |
||||
// are permitted provided that the following conditions are met: |
||||
// |
||||
// Redistributions of source code must retain the above copyright notice, |
||||
// this list of conditions and the following disclaimer. |
||||
// |
||||
// Redistributions in binary form must reproduce the above copyright notice, |
||||
// this list of conditions and the following disclaimer in the documentation and/or |
||||
// other materials provided with the distribution. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
|
||||
#import "Panel.h" |
||||
|
||||
@implementation Panel |
||||
|
||||
- (BOOL)canBecomeKeyWindow; |
||||
{ |
||||
return YES; // Allow Search field to become the first responder |
||||
} |
||||
|
||||
|
||||
- (BOOL)canBecomeMainWindow |
||||
{ |
||||
return YES; |
||||
} |
||||
|
||||
-(void)keyDown:(NSEvent *)theEvent |
||||
{ |
||||
[super keyDown:theEvent]; |
||||
|
||||
if (theEvent.keyCode == 53) { |
||||
[self close]; |
||||
} |
||||
} |
||||
|
||||
|
||||
@end |
@ -0,0 +1,211 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> |
||||
<dependencies> |
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8191"/> |
||||
</dependencies> |
||||
<objects> |
||||
<customObject id="-2" userLabel="File's Owner" customClass="PanelController"> |
||||
<connections> |
||||
<outlet property="backgroundView" destination="6" id="20"/> |
||||
<outlet property="logoLabel" destination="HR1-ZK-Ey0" id="5Mh-OP-GqP"/> |
||||
<outlet property="mainTableview" destination="dFw-ts-8OZ" id="wwJ-jA-lCy"/> |
||||
<outlet property="preferencesButton" destination="OFy-u1-TnH" id="SId-Ih-ssT"/> |
||||
<outlet property="scrollView" destination="4Gd-Nv-fXr" id="mw5-Tt-83x"/> |
||||
<outlet property="scrollViewHeight" destination="QcT-N0-G4s" id="EHr-Co-L0Z"/> |
||||
<outlet property="shutdownButton" destination="nTt-pf-Hw2" id="gCK-0D-gnK"/> |
||||
<outlet property="window" destination="5" id="7"/> |
||||
</connections> |
||||
</customObject> |
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/> |
||||
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="none" id="5" customClass="Panel"> |
||||
<windowStyleMask key="styleMask" utility="YES" nonactivatingPanel="YES" texturedBackground="YES"/> |
||||
<windowCollectionBehavior key="collectionBehavior" moveToActiveSpace="YES" ignoresCycle="YES"/> |
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |
||||
<rect key="contentRect" x="162" y="101" width="280" height="273"/> |
||||
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/> |
||||
<view key="contentView" id="6" customClass="BackgroundView"> |
||||
<rect key="frame" x="0.0" y="0.0" width="280" height="273"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<subviews> |
||||
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="56" horizontalPageScroll="10" verticalLineScroll="56" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Gd-Nv-fXr"> |
||||
<rect key="frame" x="-1" y="0.0" width="282" height="265"/> |
||||
<clipView key="contentView" id="4MZ-Di-yNR"> |
||||
<rect key="frame" x="0.0" y="0.0" width="282" height="265"/> |
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
||||
<subviews> |
||||
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="55" viewBased="YES" id="dFw-ts-8OZ"> |
||||
<rect key="frame" x="0.0" y="0.0" width="282" height="0.0"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
<size key="intercellSpacing" width="3" height="1"/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
<tableViewGridLines key="gridStyleMask" dashed="YES"/> |
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> |
||||
<tableColumns> |
||||
<tableColumn width="279" minWidth="40" maxWidth="1000" id="LTt-db-Dwv"> |
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border"> |
||||
<font key="font" metaFont="smallSystem"/> |
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> |
||||
</tableHeaderCell> |
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="7LK-2q-H3f"> |
||||
<font key="font" metaFont="system"/> |
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> |
||||
<prototypeCellViews> |
||||
<tableCellView identifier="timeZoneCell" id="qbN-ba-fho"> |
||||
<rect key="frame" x="1" y="0.0" width="279" height="60"/> |
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
||||
<subviews> |
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="etF-33-bCB"> |
||||
<rect key="frame" x="8" y="29" width="144" height="26"/> |
||||
<constraints> |
||||
<constraint firstAttribute="width" constant="140" id="32b-h6-joo"/> |
||||
<constraint firstAttribute="height" constant="26" id="vod-YN-iNX"/> |
||||
</constraints> |
||||
<animations/> |
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" placeholderString="Timezone Name" id="rnh-AP-ooc"> |
||||
<font key="font" size="15" name="Helvetica-Light"/> |
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
</textField> |
||||
<textField verticalHuggingPriority="750" tag="102" translatesAutoresizingMaskIntoConstraints="NO" id="QUd-7D-q14"> |
||||
<rect key="frame" x="8" y="12" width="104" height="22"/> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="22" id="42Y-hy-Uo7"/> |
||||
<constraint firstAttribute="width" constant="100" id="fkH-oq-qvM"/> |
||||
</constraints> |
||||
<animations/> |
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" placeholderString="Date" id="74U-rv-5xj"> |
||||
<font key="font" size="13" name="Helvetica-Bold"/> |
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
</textField> |
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="vnv-J2-7r1"> |
||||
<rect key="frame" x="132" y="17" width="146" height="33"/> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="33" id="3WU-de-OQL"/> |
||||
<constraint firstAttribute="width" constant="142" id="cQV-gJ-zMz"/> |
||||
</constraints> |
||||
<animations/> |
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" placeholderString="23:46" id="g8s-EU-UHx"> |
||||
<font key="font" size="31" name="Helvetica-Light"/> |
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
</textField> |
||||
</subviews> |
||||
<constraints> |
||||
<constraint firstItem="QUd-7D-q14" firstAttribute="leading" secondItem="qbN-ba-fho" secondAttribute="leading" constant="10" id="0Qz-Ev-efP"/> |
||||
<constraint firstItem="etF-33-bCB" firstAttribute="top" secondItem="qbN-ba-fho" secondAttribute="top" constant="5" id="Lct-kG-usb"/> |
||||
<constraint firstItem="vnv-J2-7r1" firstAttribute="centerY" secondItem="qbN-ba-fho" secondAttribute="centerY" constant="-3.5" id="TuQ-gE-ZUh"/> |
||||
<constraint firstItem="QUd-7D-q14" firstAttribute="top" secondItem="etF-33-bCB" secondAttribute="bottom" constant="-5" id="VO6-Zn-eA3"/> |
||||
<constraint firstItem="etF-33-bCB" firstAttribute="leading" secondItem="qbN-ba-fho" secondAttribute="leading" constant="10" id="ueW-ow-ZRq"/> |
||||
<constraint firstAttribute="trailing" secondItem="vnv-J2-7r1" secondAttribute="trailing" constant="3" id="zXo-eA-0bQ"/> |
||||
</constraints> |
||||
<animations/> |
||||
<connections> |
||||
<outlet property="textField" destination="etF-33-bCB" id="6fd-cc-Qq2"/> |
||||
</connections> |
||||
</tableCellView> |
||||
</prototypeCellViews> |
||||
</tableColumn> |
||||
</tableColumns> |
||||
<connections> |
||||
<outlet property="dataSource" destination="-2" id="Q9t-Yx-hmz"/> |
||||
<outlet property="delegate" destination="-2" id="AqY-uU-Noo"/> |
||||
</connections> |
||||
</tableView> |
||||
</subviews> |
||||
<animations/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</clipView> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="265" id="QcT-N0-G4s"/> |
||||
</constraints> |
||||
<animations/> |
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="DJr-1R-9LK"> |
||||
<rect key="frame" x="-100" y="-100" width="223" height="15"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</scroller> |
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="cfu-8V-LKK"> |
||||
<rect key="frame" x="-100" y="-100" width="15" height="102"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</scroller> |
||||
</scrollView> |
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HR1-ZK-Ey0"> |
||||
<rect key="frame" x="0.0" y="2" width="279" height="22"/> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="22" id="IxM-FF-J1F"/> |
||||
</constraints> |
||||
<animations/> |
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" alignment="center" placeholderString="Clocker" drawsBackground="YES" id="KVB-OA-XfT"> |
||||
<font key="font" size="17" name="Palatino-Bold"/> |
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
</textField> |
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OFy-u1-TnH"> |
||||
<rect key="frame" x="246" y="1" width="29" height="19"/> |
||||
<constraints> |
||||
<constraint firstAttribute="width" constant="29" id="MIQ-4K-E5A"/> |
||||
<constraint firstAttribute="height" constant="18" id="X7D-ep-wB4"/> |
||||
</constraints> |
||||
<animations/> |
||||
<buttonCell key="cell" type="recessed" bezelStyle="recessed" image="NSActionTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="vYm-fs-Zjd"> |
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |
||||
<font key="font" metaFont="systemBold" size="12"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="openPreferences:" target="-2" id="0Yc-Eq-obQ"/> |
||||
</connections> |
||||
</button> |
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nTt-pf-Hw2"> |
||||
<rect key="frame" x="0.0" y="1" width="29" height="19"/> |
||||
<constraints> |
||||
<constraint firstAttribute="width" constant="29" id="8kZ-Pj-VK6"/> |
||||
<constraint firstAttribute="height" constant="18" id="sVG-VE-3q4"/> |
||||
</constraints> |
||||
<animations/> |
||||
<buttonCell key="cell" type="recessed" bezelStyle="recessed" image="PowerIcon" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="sUh-16-Fhk"> |
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/> |
||||
<font key="font" metaFont="systemBold" size="12"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="terminate:" target="-1" id="fpZ-pt-UiU"/> |
||||
</connections> |
||||
</button> |
||||
</subviews> |
||||
<constraints> |
||||
<constraint firstItem="4Gd-Nv-fXr" firstAttribute="top" secondItem="6" secondAttribute="top" constant="8" id="1g0-Hm-7Gh"/> |
||||
<constraint firstAttribute="trailing" secondItem="HR1-ZK-Ey0" secondAttribute="trailing" constant="1" id="1ol-mo-aQU"/> |
||||
<constraint firstAttribute="bottom" secondItem="HR1-ZK-Ey0" secondAttribute="bottom" constant="2" id="Jtb-Nx-FYR"/> |
||||
<constraint firstAttribute="bottom" secondItem="nTt-pf-Hw2" secondAttribute="bottom" constant="2" id="QoV-TI-KVJ"/> |
||||
<constraint firstAttribute="bottom" secondItem="OFy-u1-TnH" secondAttribute="bottom" constant="2" id="Ubf-Mv-WMp"/> |
||||
<constraint firstAttribute="trailing" secondItem="4Gd-Nv-fXr" secondAttribute="trailing" constant="-1" id="XP6-W0-2XT"/> |
||||
<constraint firstItem="HR1-ZK-Ey0" firstAttribute="leading" secondItem="6" secondAttribute="leading" id="XQ8-hU-ayC"/> |
||||
<constraint firstItem="4Gd-Nv-fXr" firstAttribute="leading" secondItem="6" secondAttribute="leading" constant="-1" id="fHc-VQ-mJ3"/> |
||||
<constraint firstAttribute="trailing" secondItem="OFy-u1-TnH" secondAttribute="trailing" constant="5" id="p2a-qj-LHE"/> |
||||
<constraint firstItem="nTt-pf-Hw2" firstAttribute="leading" secondItem="6" secondAttribute="leading" id="pKl-Ay-0cB"/> |
||||
</constraints> |
||||
<animations/> |
||||
</view> |
||||
<connections> |
||||
<outlet property="delegate" destination="-2" id="8"/> |
||||
</connections> |
||||
<point key="canvasLocation" x="230" y="392.5"/> |
||||
</window> |
||||
<userDefaultsController representsSharedInstance="YES" id="O3B-kK-4vm"/> |
||||
</objects> |
||||
<resources> |
||||
<image name="NSActionTemplate" width="14" height="14"/> |
||||
<image name="PowerIcon" width="270" height="270"/> |
||||
</resources> |
||||
</document> |
@ -0,0 +1,78 @@
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
#import "BackgroundView.h" |
||||
#import "StatusItemView.h" |
||||
#import "PreferencesWindowController.h" |
||||
|
||||
@class PanelController; |
||||
|
||||
@protocol PanelControllerDelegate <NSObject> |
||||
|
||||
@optional |
||||
|
||||
- (StatusItemView *)statusItemViewForPanelController:(PanelController *)controller; |
||||
|
||||
@end |
||||
|
||||
#pragma mark - |
||||
|
||||
@interface PanelController : NSWindowController <NSWindowDelegate, NSTableViewDataSource, NSTableViewDelegate> |
||||
{ |
||||
BOOL _hasActivePanel; |
||||
__unsafe_unretained BackgroundView *_backgroundView; |
||||
__unsafe_unretained id<PanelControllerDelegate> _delegate; |
||||
__unsafe_unretained NSSearchField *_searchField; |
||||
__unsafe_unretained NSTextField *_textField; |
||||
} |
||||
|
||||
@property (nonatomic, unsafe_unretained) IBOutlet BackgroundView *backgroundView; |
||||
@property (nonatomic, strong) PreferencesWindowController *preferencesWindow; |
||||
@property (nonatomic, strong) NSMutableArray *defaultPreferences; |
||||
|
||||
@property (nonatomic) BOOL hasActivePanel; |
||||
@property (nonatomic, unsafe_unretained, readonly) id<PanelControllerDelegate> delegate; |
||||
@property (weak) IBOutlet NSTableView *mainTableview; |
||||
@property (weak) IBOutlet NSScrollView *scrollView; |
||||
|
||||
@property (weak) IBOutlet NSLayoutConstraint *scrollViewHeight; |
||||
|
||||
@property (weak) IBOutlet NSButton *shutdownButton; |
||||
@property (weak) IBOutlet NSButton *preferencesButton; |
||||
@property (weak) IBOutlet NSTextField *logoLabel; |
||||
|
||||
|
||||
|
||||
- (id)initWithDelegate:(id<PanelControllerDelegate>)delegate; |
||||
|
||||
- (void)openPanel; |
||||
- (void)closePanel; |
||||
- (void) updateDefaultPreferences; |
||||
- (void)showOptions:(BOOL)value; |
||||
|
||||
@end |
@ -0,0 +1,433 @@
|
||||
// Created by Abhishek Banthia on 11/4/15. |
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved. |
||||
// |
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without modification, |
||||
// are permitted provided that the following conditions are met: |
||||
// |
||||
// Redistributions of source code must retain the above copyright notice, |
||||
// this list of conditions and the following disclaimer. |
||||
// |
||||
// Redistributions in binary form must reproduce the above copyright notice, |
||||
// this list of conditions and the following disclaimer in the documentation and/or |
||||
// other materials provided with the distribution. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
|
||||
#import "PanelController.h" |
||||
#import "BackgroundView.h" |
||||
#import "StatusItemView.h" |
||||
#import "MenubarController.h" |
||||
|
||||
#define OPEN_DURATION .15 |
||||
#define CLOSE_DURATION .1 |
||||
|
||||
#define SEARCH_INSET 17 |
||||
|
||||
#define POPUP_HEIGHT 300 |
||||
#define PANEL_WIDTH 280 |
||||
#define MENU_ANIMATION_DURATION .1 |
||||
|
||||
#define BUFFER 2 |
||||
#define MAX_TALL 15 |
||||
|
||||
#pragma mark - |
||||
|
||||
#import "PreferencesWindowController.h" |
||||
|
||||
@implementation PanelController |
||||
|
||||
|
||||
|
||||
#pragma mark - |
||||
|
||||
- (id)initWithDelegate:(id<PanelControllerDelegate>)delegate |
||||
{ |
||||
self = [super initWithWindowNibName:@"Panel"]; |
||||
if (self != nil) |
||||
{ |
||||
_delegate = delegate; |
||||
self.window.backgroundColor = [NSColor whiteColor]; |
||||
} |
||||
return self; |
||||
} |
||||
|
||||
#pragma mark - |
||||
|
||||
- (void)awakeFromNib |
||||
{ |
||||
[super awakeFromNib]; |
||||
|
||||
[self updateDefaultPreferences]; |
||||
|
||||
// Make a fully skinned panel |
||||
NSPanel *panel = (id)[self window]; |
||||
[panel setAcceptsMouseMovedEvents:YES]; |
||||
[panel setLevel:NSPopUpMenuWindowLevel]; |
||||
[panel setOpaque:NO]; |
||||
[panel setBackgroundColor:[NSColor clearColor]]; |
||||
|
||||
//Register for drag and drop |
||||
[self.mainTableview registerForDraggedTypes: [NSArray arrayWithObject: @"public.text"]]; |
||||
|
||||
} |
||||
|
||||
- (void) updateDefaultPreferences |
||||
{ |
||||
NSArray *defaultZones = [[NSUserDefaults standardUserDefaults] objectForKey:@"defaultPreferences"]; |
||||
|
||||
if (self.defaultPreferences == nil) |
||||
{ |
||||
self.defaultPreferences = [[NSMutableArray alloc] initWithArray:defaultZones]; |
||||
} |
||||
else |
||||
{ |
||||
self.defaultPreferences = [NSMutableArray arrayWithArray:defaultZones]; |
||||
} |
||||
|
||||
|
||||
if (self.defaultPreferences.count <= 10) { |
||||
self.scrollViewHeight.constant = self.window.contentView.frame.size.height; |
||||
} |
||||
else |
||||
{ |
||||
self.scrollViewHeight.constant = 550; |
||||
} |
||||
} |
||||
|
||||
#pragma mark - Public accessors |
||||
|
||||
- (BOOL)hasActivePanel |
||||
{ |
||||
return _hasActivePanel; |
||||
} |
||||
|
||||
- (void)setHasActivePanel:(BOOL)flag |
||||
{ |
||||
if (_hasActivePanel != flag) |
||||
{ |
||||
_hasActivePanel = flag; |
||||
|
||||
if (_hasActivePanel) |
||||
{ |
||||
[self openPanel]; |
||||
} |
||||
else |
||||
{ |
||||
[self closePanel]; |
||||
} |
||||
} |
||||
} |
||||
|
||||
#pragma mark - NSWindowDelegate |
||||
|
||||
- (void)windowWillClose:(NSNotification *)notification |
||||
{ |
||||
self.hasActivePanel = NO; |
||||
} |
||||
|
||||
- (void)windowDidResignKey:(NSNotification *)notification; |
||||
{ |
||||
if ([[self window] isVisible]) |
||||
{ |
||||
self.hasActivePanel = NO; |
||||
} |
||||
} |
||||
|
||||
- (void)windowDidResize:(NSNotification *)notification |
||||
{ |
||||
NSWindow *panel = [self window]; |
||||
NSRect statusRect = [self statusRectForWindow:panel]; |
||||
NSRect panelRect = [panel frame]; |
||||
|
||||
CGFloat statusX = roundf(NSMidX(statusRect)); |
||||
CGFloat panelX = statusX - NSMinX(panelRect); |
||||
|
||||
self.backgroundView.arrowX = panelX; |
||||
|
||||
} |
||||
|
||||
#pragma mark - Keyboard |
||||
|
||||
- (void)cancelOperation:(id)sender |
||||
{ |
||||
self.hasActivePanel = NO; |
||||
} |
||||
|
||||
#pragma mark - Public methods |
||||
|
||||
- (NSRect)statusRectForWindow:(NSWindow *)window |
||||
{ |
||||
NSRect screenRect = [[[NSScreen screens] objectAtIndex:0] frame]; |
||||
NSRect statusRect = NSZeroRect; |
||||
|
||||
StatusItemView *statusItemView = nil; |
||||
if ([self.delegate respondsToSelector:@selector(statusItemViewForPanelController:)]) |
||||
{ |
||||
statusItemView = [self.delegate statusItemViewForPanelController:self]; |
||||
} |
||||
|
||||
if (statusItemView) |
||||
{ |
||||
statusRect = statusItemView.globalRect; |
||||
statusRect.origin.y = NSMinY(statusRect) - NSHeight(statusRect); |
||||
} |
||||
else |
||||
{ |
||||
statusRect.size = NSMakeSize(STATUS_ITEM_VIEW_WIDTH, [[NSStatusBar systemStatusBar] thickness]); |
||||
statusRect.origin.x = roundf((NSWidth(screenRect) - NSWidth(statusRect)) / 2); |
||||
statusRect.origin.y = NSHeight(screenRect) - NSHeight(statusRect) * 2; |
||||
} |
||||
return statusRect; |
||||
} |
||||
|
||||
- (void)openPanel |
||||
{ |
||||
NSWindow *panel = [self window]; |
||||
|
||||
NSRect screenRect = [[[NSScreen screens] objectAtIndex:0] frame]; |
||||
NSRect statusRect = [self statusRectForWindow:panel]; |
||||
|
||||
|
||||
NSRect panelRect = [panel frame]; |
||||
panelRect.size.width = PANEL_WIDTH; |
||||
|
||||
if (self.defaultPreferences.count <= 10) |
||||
{ |
||||
panelRect.size.height = self.defaultPreferences.count*55 + 30; |
||||
} |
||||
else |
||||
{ |
||||
panelRect.size.height = 500; |
||||
} |
||||
|
||||
panelRect.origin.x = roundf(NSMidX(statusRect) - NSWidth(panelRect) / 2); |
||||
panelRect.origin.y = NSMaxY(statusRect) - NSHeight(panelRect); |
||||
|
||||
if (NSMaxX(panelRect) > (NSMaxX(screenRect) - ARROW_HEIGHT)) |
||||
panelRect.origin.x -= NSMaxX(panelRect) - (NSMaxX(screenRect) - ARROW_HEIGHT); |
||||
|
||||
[NSApp activateIgnoringOtherApps:NO]; |
||||
[panel setAlphaValue:0]; |
||||
[panel setFrame:statusRect display:YES]; |
||||
[panel makeKeyAndOrderFront:nil]; |
||||
|
||||
NSTimeInterval openDuration = OPEN_DURATION; |
||||
|
||||
NSEvent *currentEvent = [NSApp currentEvent]; |
||||
if ([currentEvent type] == NSLeftMouseDown) |
||||
{ |
||||
NSUInteger clearFlags = ([currentEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask); |
||||
BOOL shiftPressed = (clearFlags == NSShiftKeyMask); |
||||
BOOL shiftOptionPressed = (clearFlags == (NSShiftKeyMask | NSAlternateKeyMask)); |
||||
if (shiftPressed || shiftOptionPressed) |
||||
{ |
||||
openDuration *= 5; |
||||
|
||||
if (shiftOptionPressed) |
||||
NSLog(@"Icon is at %@\n\tMenu is on screen %@\n\tWill be animated to %@", |
||||
NSStringFromRect(statusRect), NSStringFromRect(screenRect), NSStringFromRect(panelRect)); |
||||
} |
||||
} |
||||
|
||||
[NSAnimationContext beginGrouping]; |
||||
[[NSAnimationContext currentContext] setDuration:openDuration]; |
||||
[[panel animator] setFrame:panelRect display:YES]; |
||||
[[panel animator] setAlphaValue:1]; |
||||
[NSAnimationContext endGrouping]; |
||||
|
||||
} |
||||
|
||||
- (void)closePanel |
||||
{ |
||||
[NSAnimationContext beginGrouping]; |
||||
[[NSAnimationContext currentContext] setDuration:CLOSE_DURATION]; |
||||
[[[self window] animator] setAlphaValue:0]; |
||||
[NSAnimationContext endGrouping]; |
||||
|
||||
dispatch_after(dispatch_walltime(NULL, NSEC_PER_SEC * CLOSE_DURATION * 2), dispatch_get_main_queue(), ^{ |
||||
|
||||
[self.window orderOut:nil]; |
||||
}); |
||||
} |
||||
|
||||
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView |
||||
{ |
||||
return self.defaultPreferences.count; |
||||
} |
||||
|
||||
-(NSView*)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row |
||||
{ |
||||
NSTableCellView *cell = [tableView makeViewWithIdentifier:@"timeZoneCell" owner:self]; |
||||
|
||||
NSTextField *cellText = [cell viewWithTag:100]; |
||||
|
||||
NSTextField *timeCell = [cell viewWithTag:101]; |
||||
|
||||
NSTextField *dateCell = [cell viewWithTag:102]; |
||||
|
||||
dateCell.stringValue = [self getDateForTimeZone:self.defaultPreferences[row]]; |
||||
|
||||
timeCell.stringValue = [self getTimeForTimeZone:self.defaultPreferences[row]]; |
||||
|
||||
NSNumber *shouldShowOnlyCity = [[NSUserDefaults standardUserDefaults] objectForKey:@"showOnlyCity"]; |
||||
|
||||
cellText.stringValue = [self formatStringShouldContainCity:shouldShowOnlyCity.boolValue withTimezoneName:self.defaultPreferences[row]]; |
||||
|
||||
return cell; |
||||
} |
||||
|
||||
- (NSString *)formatStringShouldContainCity:(BOOL)value withTimezoneName:(NSString *)name |
||||
{ |
||||
if (value) { |
||||
NSRange range = [name rangeOfString:@"/"]; |
||||
|
||||
if (range.location != NSNotFound) { |
||||
return [name substringFromIndex:range.location+1]; |
||||
} |
||||
} |
||||
|
||||
return name; |
||||
} |
||||
|
||||
- (NSString *)getTimeForTimeZone:(NSString *)timezoneName |
||||
{ |
||||
NSDate *currentDate = [NSDate date]; |
||||
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
||||
dateFormatter.dateStyle = kCFDateFormatterNoStyle; |
||||
|
||||
NSNumber *is24HourFormatSelected = [[NSUserDefaults standardUserDefaults] objectForKey:@"is24HourFormatSelected"]; |
||||
|
||||
is24HourFormatSelected.boolValue ? [dateFormatter setDateFormat:@"HH:mm"] : [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; |
||||
|
||||
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:timezoneName]; |
||||
//In the format 22:10 |
||||
|
||||
return [dateFormatter stringFromDate:currentDate]; |
||||
} |
||||
|
||||
- (NSString *)getLocalCurrentDate |
||||
{ |
||||
NSDate *currentDate = [NSDate date]; |
||||
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
||||
dateFormatter.dateStyle = kCFDateFormatterShortStyle; |
||||
dateFormatter.timeStyle = kCFDateFormatterNoStyle; |
||||
|
||||
|
||||
|
||||
dateFormatter.timeZone = [NSTimeZone systemTimeZone]; |
||||
|
||||
return [dateFormatter stringFromDate:currentDate]; |
||||
|
||||
} |
||||
|
||||
- (NSString *)compareSystemDate:(NSString *)systemDate toTimezoneDate:(NSString *)date |
||||
{ |
||||
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; |
||||
formatter.dateFormat = @"MM/dd/yy"; |
||||
|
||||
NSDate *localDate = [formatter dateFromString:systemDate]; |
||||
NSDate *timezoneDate = [formatter dateFromString:date]; |
||||
|
||||
// Specify which units we would like to use |
||||
unsigned units = NSCalendarUnitDay; |
||||
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; |
||||
NSInteger systemDay = [calendar component:units fromDate:localDate]; |
||||
NSInteger timezoneDay = [calendar component:units fromDate:timezoneDate]; |
||||
|
||||
if (systemDay == timezoneDay) { |
||||
return @"Today"; |
||||
} |
||||
else if (systemDay > timezoneDay) |
||||
{ |
||||
return @"Yesterday"; |
||||
} |
||||
else |
||||
{ |
||||
return @"Tomorrow"; |
||||
} |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
- (NSString *)getDateForTimeZone:(NSString *)timezoneName |
||||
{ |
||||
NSDate *currentDate = [NSDate date]; |
||||
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
||||
dateFormatter.dateStyle = kCFDateFormatterShortStyle; |
||||
dateFormatter.timeStyle = kCFDateFormatterNoStyle; |
||||
|
||||
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:timezoneName]; |
||||
//In the format 22:10 |
||||
|
||||
return [self compareSystemDate:[self getLocalCurrentDate] toTimezoneDate:[dateFormatter stringFromDate:currentDate]];; |
||||
} |
||||
|
||||
- (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard |
||||
{ |
||||
|
||||
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes]; |
||||
|
||||
[pboard declareTypes:[NSArray arrayWithObject:@"public.text"] owner:self]; |
||||
|
||||
[pboard setData:data forType:@"public.text"]; |
||||
|
||||
return YES; |
||||
} |
||||
|
||||
|
||||
-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation |
||||
{ |
||||
NSPasteboard *pBoard = [info draggingPasteboard]; |
||||
|
||||
NSData *data = [pBoard dataForType:@"public.text"]; |
||||
|
||||
NSIndexSet *rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:data]; |
||||
|
||||
[self.defaultPreferences exchangeObjectAtIndex:rowIndexes.firstIndex withObjectAtIndex:row]; |
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject:self.defaultPreferences forKey:@"defaultPreferences"]; |
||||
|
||||
[self.mainTableview reloadData]; |
||||
|
||||
return YES; |
||||
} |
||||
|
||||
-(NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id<NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation |
||||
{ |
||||
return NSDragOperationEvery; |
||||
} |
||||
|
||||
|
||||
|
||||
- (IBAction)openPreferences:(id)sender |
||||
{ |
||||
self.preferencesWindow = [PreferencesWindowController sharedPreferences]; |
||||
[self.preferencesWindow showWindow:nil]; |
||||
|
||||
[NSApp activateIgnoringOtherApps:YES]; |
||||
|
||||
} |
||||
|
||||
- (void)showOptions:(BOOL)value |
||||
{ |
||||
if (self.defaultPreferences.count > 0) { |
||||
self.shutdownButton.hidden = !value; |
||||
self.preferencesButton.hidden = !value; |
||||
} |
||||
} |
||||
|
||||
@end |
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,356 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> |
||||
<dependencies> |
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8191"/> |
||||
</dependencies> |
||||
<objects> |
||||
<customObject id="-2" userLabel="File's Owner" customClass="PreferencesWindowController"> |
||||
<connections> |
||||
<outlet property="availableTimezoneTableView" destination="6Hm-XH-CMI" id="GA1-tc-E9E"/> |
||||
<outlet property="is24HourFormatSelected" destination="N47-gw-Pay" id="2MV-F1-uYf"/> |
||||
<outlet property="messageLabel" destination="Rty-6T-aPw" id="Qg4-mk-P90"/> |
||||
<outlet property="searchField" destination="5jL-eb-qdB" id="K6C-JS-ko0"/> |
||||
<outlet property="timezonePanel" destination="Z6I-Ny-aGx" id="tXP-KH-Xfi"/> |
||||
<outlet property="timezoneTableView" destination="oKD-AN-gPT" id="oD2-n0-4jf"/> |
||||
<outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/> |
||||
</connections> |
||||
</customObject> |
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/> |
||||
<window identifier="Selected Timezones" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="documentWindow" id="F0z-JX-Cv5"> |
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> |
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |
||||
<rect key="contentRect" x="407" y="179" width="439" height="392"/> |
||||
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/> |
||||
<value key="minSize" type="size" width="439" height="351"/> |
||||
<view key="contentView" id="se5-gp-TjO"> |
||||
<rect key="frame" x="0.0" y="0.0" width="439" height="392"/> |
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
||||
<subviews> |
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="DCz-qN-ydK"> |
||||
<rect key="frame" x="11" y="107" width="21" height="22"/> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="20" id="aUK-f8-pvY"/> |
||||
<constraint firstAttribute="width" constant="21" id="hAr-3f-KNJ"/> |
||||
</constraints> |
||||
<animations/> |
||||
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSAddTemplate" imagePosition="overlaps" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="rjd-Yu-81P"> |
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |
||||
<font key="font" metaFont="system"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="addTimeZone:" target="-2" id="dXi-qw-Vu2"/> |
||||
</connections> |
||||
</button> |
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ixe-Sn-8qT"> |
||||
<rect key="frame" x="32" y="107" width="21" height="22"/> |
||||
<animations/> |
||||
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSRemoveTemplate" imagePosition="overlaps" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="SVO-Wt-Mfb"> |
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |
||||
<font key="font" metaFont="system"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="removeFromFavourites:" target="-2" id="65F-Jn-DMw"/> |
||||
</connections> |
||||
</button> |
||||
<scrollView focusRingType="none" autohidesScrollers="YES" horizontalLineScroll="22" horizontalPageScroll="10" verticalLineScroll="22" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cI0-M7-C9h"> |
||||
<rect key="frame" x="10" y="134" width="419" height="250"/> |
||||
<clipView key="contentView" id="WWk-6i-nI7"> |
||||
<rect key="frame" x="1" y="0.0" width="417" height="249"/> |
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
||||
<subviews> |
||||
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnSelection="YES" autosaveColumns="NO" rowHeight="20" headerView="dKI-Ue-9QX" id="oKD-AN-gPT"> |
||||
<rect key="frame" x="0.0" y="0.0" width="417" height="226"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
<size key="intercellSpacing" width="3" height="2"/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> |
||||
<tableColumns> |
||||
<tableColumn identifier="timezoneName" editable="NO" width="413.75" minWidth="40" maxWidth="1000" id="CJN-Eu-3s5"> |
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Selected Timezone(s)"> |
||||
<font key="font" metaFont="smallSystem"/> |
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> |
||||
</tableHeaderCell> |
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="Vu3-3D-aDG"> |
||||
<font key="font" size="13" name="HelveticaNeue-Light"/> |
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> |
||||
</tableColumn> |
||||
</tableColumns> |
||||
<connections> |
||||
<outlet property="dataSource" destination="-2" id="do8-kY-7j3"/> |
||||
<outlet property="delegate" destination="-2" id="whN-25-mkj"/> |
||||
</connections> |
||||
</tableView> |
||||
</subviews> |
||||
<animations/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</clipView> |
||||
<animations/> |
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="Hxj-Tc-UWs"> |
||||
<rect key="frame" x="1" y="214" width="337" height="15"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</scroller> |
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="s9V-58-jwp"> |
||||
<rect key="frame" x="-14" y="-7" width="15" height="0.0"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</scroller> |
||||
<tableHeaderView key="headerView" id="dKI-Ue-9QX"> |
||||
<rect key="frame" x="0.0" y="0.0" width="417" height="23"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</tableHeaderView> |
||||
</scrollView> |
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="P0l-kc-VxU" customClass="ColoredButton"> |
||||
<rect key="frame" x="9" y="58" width="219" height="18"/> |
||||
<animations/> |
||||
<buttonCell key="cell" type="check" title="Show only city/region name" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="jaB-eA-S6N"> |
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |
||||
<font key="font" size="14" name="Helvetica-Light"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="showOnlyCityName:" target="-2" id="1lf-cZ-gyt"/> |
||||
<binding destination="sEG-Zb-KUM" name="value" keyPath="values.showOnlyCity" id="xqX-Jx-epo"/> |
||||
</connections> |
||||
</button> |
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="GDz-2Z-uX5" customClass="ColoredButton"> |
||||
<rect key="frame" x="9" y="39" width="219" height="18"/> |
||||
<animations/> |
||||
<buttonCell key="cell" type="check" title="Start Clocker on system startup" bezelStyle="regularSquare" imagePosition="left" inset="2" id="h45-jZ-cPY"> |
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |
||||
<font key="font" size="14" name="Helvetica-Light"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<binding destination="-2" name="value" keyPath="self.launchOnLogin" id="Vqw-iQ-qOe"/> |
||||
</connections> |
||||
</button> |
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="N47-gw-Pay" customClass="ColoredButton"> |
||||
<rect key="frame" x="9" y="77" width="343" height="22"/> |
||||
<constraints> |
||||
<constraint firstAttribute="width" constant="339" id="0eX-T7-EbU"/> |
||||
<constraint firstAttribute="height" constant="18" id="qwS-Bk-vmy"/> |
||||
</constraints> |
||||
<animations/> |
||||
<buttonCell key="cell" type="check" title="Use a 24-hour clock" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="Fro-eC-cMC"> |
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> |
||||
<font key="font" size="14" name="Helvetica-Light"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="timeFormatSelectionChanged:" target="-2" id="6vB-XV-sSq"/> |
||||
<binding destination="sEG-Zb-KUM" name="value" keyPath="values.is24HourFormatSelected" id="wod-mK-9M5"/> |
||||
</connections> |
||||
</button> |
||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cso-OX-qzB"> |
||||
<rect key="frame" x="8" y="13" width="413" height="20"/> |
||||
<animations/> |
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" title="Clocker v1.0 is open source. Find the source code here." placeholderString="" id="l7j-wK-zcu"> |
||||
<font key="font" size="13" name="HelveticaNeue-Thin"/> |
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
</textField> |
||||
</subviews> |
||||
<constraints> |
||||
<constraint firstItem="DCz-qN-ydK" firstAttribute="top" secondItem="cI0-M7-C9h" secondAttribute="bottom" constant="6" id="6Ye-VD-kSE"/> |
||||
<constraint firstItem="cso-OX-qzB" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="10" id="Bux-4T-BB9"/> |
||||
<constraint firstItem="P0l-kc-VxU" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="11" id="DUR-uK-Ncx"/> |
||||
<constraint firstAttribute="bottom" secondItem="cso-OX-qzB" secondAttribute="bottom" constant="13" id="EdL-0P-Jrg"/> |
||||
<constraint firstItem="GDz-2Z-uX5" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="11" id="FLl-Pc-Gzn"/> |
||||
<constraint firstItem="cI0-M7-C9h" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="10" id="Fy5-6V-gu1"/> |
||||
<constraint firstItem="GDz-2Z-uX5" firstAttribute="top" secondItem="P0l-kc-VxU" secondAttribute="bottom" constant="5" id="NW3-cd-t0e"/> |
||||
<constraint firstAttribute="trailing" secondItem="cso-OX-qzB" secondAttribute="trailing" constant="20" id="Q4B-CE-JrO"/> |
||||
<constraint firstItem="ixe-Sn-8qT" firstAttribute="leading" secondItem="DCz-qN-ydK" secondAttribute="trailing" id="TLA-Fw-F7P"/> |
||||
<constraint firstItem="P0l-kc-VxU" firstAttribute="top" secondItem="N47-gw-Pay" secondAttribute="bottom" constant="5" id="Tfe-Y8-KcS"/> |
||||
<constraint firstItem="GDz-2Z-uX5" firstAttribute="width" secondItem="P0l-kc-VxU" secondAttribute="width" id="VUD-7V-5SX"/> |
||||
<constraint firstItem="DCz-qN-ydK" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="11" id="Waz-CP-UWF"/> |
||||
<constraint firstItem="GDz-2Z-uX5" firstAttribute="height" secondItem="P0l-kc-VxU" secondAttribute="height" id="c2z-Ik-d6W"/> |
||||
<constraint firstItem="N47-gw-Pay" firstAttribute="top" secondItem="ixe-Sn-8qT" secondAttribute="bottom" constant="11" id="gbd-HA-u9p"/> |
||||
<constraint firstItem="N47-gw-Pay" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="11" id="hXb-69-tI0"/> |
||||
<constraint firstItem="ixe-Sn-8qT" firstAttribute="width" secondItem="DCz-qN-ydK" secondAttribute="width" id="o7k-jf-cL0"/> |
||||
<constraint firstItem="cso-OX-qzB" firstAttribute="top" secondItem="GDz-2Z-uX5" secondAttribute="bottom" constant="8" id="qZY-wv-3kN"/> |
||||
<constraint firstItem="ixe-Sn-8qT" firstAttribute="height" secondItem="DCz-qN-ydK" secondAttribute="height" id="rsK-UP-Umg"/> |
||||
<constraint firstItem="cI0-M7-C9h" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="8" id="u5H-Ff-ivt"/> |
||||
<constraint firstAttribute="trailing" secondItem="cI0-M7-C9h" secondAttribute="trailing" constant="10" id="ut9-6b-cdu"/> |
||||
<constraint firstItem="N47-gw-Pay" firstAttribute="top" secondItem="DCz-qN-ydK" secondAttribute="bottom" constant="11" id="x0C-Ev-Imb"/> |
||||
</constraints> |
||||
<animations/> |
||||
</view> |
||||
<connections> |
||||
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/> |
||||
</connections> |
||||
<point key="canvasLocation" x="304.5" y="240"/> |
||||
</window> |
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hasShadow="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="alertPanel" appearanceType="aqua" frameAutosaveName="" id="Z6I-Ny-aGx" customClass="Panel"> |
||||
<windowStyleMask key="styleMask" closable="YES" miniaturizable="YES" resizable="YES" documentModal="YES" nonactivatingPanel="YES" texturedBackground="YES"/> |
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> |
||||
<rect key="contentRect" x="120" y="64" width="345" height="320"/> |
||||
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/> |
||||
<value key="minSize" type="size" width="345" height="320"/> |
||||
<value key="maxSize" type="size" width="345" height="320"/> |
||||
<view key="contentView" id="byp-2M-iAO"> |
||||
<rect key="frame" x="0.0" y="0.0" width="345" height="320"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<subviews> |
||||
<scrollView focusRingType="none" autohidesScrollers="YES" horizontalLineScroll="22" horizontalPageScroll="10" verticalLineScroll="22" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3B2-hV-f8v"> |
||||
<rect key="frame" x="8" y="27" width="329" height="257"/> |
||||
<clipView key="contentView" id="xtL-kR-J62"> |
||||
<rect key="frame" x="1" y="0.0" width="327" height="256"/> |
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
||||
<subviews> |
||||
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="20" headerView="hHn-48-RCd" id="6Hm-XH-CMI"> |
||||
<rect key="frame" x="0.0" y="0.0" width="327" height="233"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
<size key="intercellSpacing" width="3" height="2"/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
<tableViewGridLines key="gridStyleMask" vertical="YES"/> |
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> |
||||
<tableColumns> |
||||
<tableColumn identifier="availableTimezones" editable="NO" width="205.5" minWidth="40" maxWidth="1000" id="TEh-P6-jcT"> |
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Timezone Name"> |
||||
<font key="font" metaFont="smallSystem"/> |
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> |
||||
</tableHeaderCell> |
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="iJJ-UY-Q3g"> |
||||
<font key="font" size="13" name="HelveticaNeue-Light"/> |
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> |
||||
</tableColumn> |
||||
<tableColumn identifier="abbreviation" width="115.71875" minWidth="10" maxWidth="3.4028234663852886e+38" id="Iuq-hc-Ma0"> |
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Abbreviation"> |
||||
<font key="font" metaFont="smallSystem"/> |
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> |
||||
</tableHeaderCell> |
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="pwL-7P-icB"> |
||||
<font key="font" size="13" name="HelveticaNeue-Light"/> |
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> |
||||
</tableColumn> |
||||
</tableColumns> |
||||
<connections> |
||||
<binding destination="-2" name="doubleClickTarget" keyPath="self" id="88W-iC-qMj"> |
||||
<dictionary key="options"> |
||||
<string key="NSSelectorName">addToFavorites:</string> |
||||
</dictionary> |
||||
</binding> |
||||
<outlet property="dataSource" destination="-2" id="OMp-pn-8oq"/> |
||||
<outlet property="delegate" destination="-2" id="mJw-oC-0dA"/> |
||||
</connections> |
||||
</tableView> |
||||
</subviews> |
||||
<animations/> |
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</clipView> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="257" id="Yru-1j-SeJ"/> |
||||
</constraints> |
||||
<animations/> |
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="nBP-zr-k3M"> |
||||
<rect key="frame" x="1" y="241" width="327" height="15"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</scroller> |
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="x3e-JD-qwd"> |
||||
<rect key="frame" x="224" y="17" width="15" height="102"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</scroller> |
||||
<tableHeaderView key="headerView" id="hHn-48-RCd"> |
||||
<rect key="frame" x="0.0" y="0.0" width="327" height="23"/> |
||||
<autoresizingMask key="autoresizingMask"/> |
||||
<animations/> |
||||
</tableHeaderView> |
||||
</scrollView> |
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KlN-dU-s3o"> |
||||
<rect key="frame" x="2" y="-2" width="52" height="32"/> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="21" id="2QY-oM-3sO"/> |
||||
<constraint firstAttribute="width" constant="40" id="6JQ-5n-kb7"/> |
||||
</constraints> |
||||
<animations/> |
||||
<buttonCell key="cell" type="push" title="Add" bezelStyle="rounded" imagePosition="overlaps" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="kZe-ua-0p9"> |
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |
||||
<font key="font" size="13" name="HelveticaNeue-Light"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="addToFavorites:" target="-2" id="y27-tR-f1g"/> |
||||
</connections> |
||||
</button> |
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ueh-Ln-TC8"> |
||||
<rect key="frame" x="44" y="-2" width="65" height="32"/> |
||||
<constraints> |
||||
<constraint firstAttribute="width" constant="53" id="Bql-d6-oci"/> |
||||
</constraints> |
||||
<animations/> |
||||
<buttonCell key="cell" type="push" title="Close" bezelStyle="rounded" imagePosition="overlaps" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ODT-4D-sWu"> |
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> |
||||
<font key="font" size="13" name="HelveticaNeue-Light"/> |
||||
</buttonCell> |
||||
<connections> |
||||
<action selector="closePanel:" target="-2" id="6v9-wN-07n"/> |
||||
</connections> |
||||
</button> |
||||
<searchField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5jL-eb-qdB"> |
||||
<rect key="frame" x="8" y="287" width="329" height="25"/> |
||||
<animations/> |
||||
<searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" focusRingType="none" placeholderString="Enter Timezone Name" drawsBackground="YES" usesSingleLineMode="YES" id="2DC-BS-vbb"> |
||||
<font key="font" size="13" name="HelveticaNeue-Light"/> |
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> |
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> |
||||
</searchFieldCell> |
||||
<connections> |
||||
<action selector="filterArray:" target="-2" id="tX8-FN-IPy"/> |
||||
</connections> |
||||
</searchField> |
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Rty-6T-aPw"> |
||||
<rect key="frame" x="104" y="8" width="232" height="20"/> |
||||
<constraints> |
||||
<constraint firstAttribute="height" constant="20" id="y9Z-oT-NCB"/> |
||||
</constraints> |
||||
<animations/> |
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="ysU-zz-gJh"> |
||||
<font key="font" size="13" name="HelveticaNeue-Light"/> |
||||
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/> |
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> |
||||
</textFieldCell> |
||||
</textField> |
||||
</subviews> |
||||
<constraints> |
||||
<constraint firstAttribute="trailing" secondItem="Rty-6T-aPw" secondAttribute="trailing" constant="11" id="1Gg-n3-Hv8"/> |
||||
<constraint firstItem="3B2-hV-f8v" firstAttribute="leading" secondItem="byp-2M-iAO" secondAttribute="leading" constant="8" id="Ahs-HL-zfw"/> |
||||
<constraint firstAttribute="bottom" secondItem="KlN-dU-s3o" secondAttribute="bottom" constant="5" id="Hfs-he-pyg"/> |
||||
<constraint firstItem="3B2-hV-f8v" firstAttribute="top" secondItem="5jL-eb-qdB" secondAttribute="bottom" constant="3" id="Kkl-0p-AQX"/> |
||||
<constraint firstItem="5jL-eb-qdB" firstAttribute="top" secondItem="byp-2M-iAO" secondAttribute="top" constant="8" id="Lsa-mI-nMD"/> |
||||
<constraint firstItem="Rty-6T-aPw" firstAttribute="leading" secondItem="Ueh-Ln-TC8" secondAttribute="trailing" constant="3" id="NEj-GQ-4oy"/> |
||||
<constraint firstItem="5jL-eb-qdB" firstAttribute="leading" secondItem="byp-2M-iAO" secondAttribute="leading" constant="8" id="YFf-7y-AA0"/> |
||||
<constraint firstAttribute="bottom" secondItem="Ueh-Ln-TC8" secondAttribute="bottom" constant="5" id="kS2-Vc-NT7"/> |
||||
<constraint firstAttribute="bottom" secondItem="Rty-6T-aPw" secondAttribute="bottom" constant="8" id="pyy-35-q2k"/> |
||||
<constraint firstItem="Ueh-Ln-TC8" firstAttribute="leading" secondItem="KlN-dU-s3o" secondAttribute="trailing" constant="2" id="qYv-aW-l68"/> |
||||
<constraint firstAttribute="trailing" secondItem="3B2-hV-f8v" secondAttribute="trailing" constant="8" id="rae-0k-Dgj"/> |
||||
<constraint firstAttribute="trailing" secondItem="5jL-eb-qdB" secondAttribute="trailing" constant="8" id="uy8-q5-8Vi"/> |
||||
<constraint firstItem="KlN-dU-s3o" firstAttribute="leading" secondItem="byp-2M-iAO" secondAttribute="leading" constant="8" id="y6V-Aa-AZU"/> |
||||
<constraint firstItem="Ueh-Ln-TC8" firstAttribute="height" secondItem="KlN-dU-s3o" secondAttribute="height" id="zET-ty-u3G"/> |
||||
</constraints> |
||||
<animations/> |
||||
</view> |
||||
<point key="canvasLocation" x="582.5" y="681"/> |
||||
</window> |
||||
<userDefaultsController representsSharedInstance="YES" id="sEG-Zb-KUM"/> |
||||
</objects> |
||||
<resources> |
||||
<image name="NSAddTemplate" width="11" height="11"/> |
||||
<image name="NSRemoveTemplate" width="11" height="11"/> |
||||
</resources> |
||||
</document> |
@ -0,0 +1,46 @@
|
||||
//
|
||||
// PreferencesWindowController.h
|
||||
// Clocker
|
||||
//
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#import <Cocoa/Cocoa.h> |
||||
|
||||
@class AvailableTimezonesPanel; |
||||
|
||||
@interface PreferencesWindowController : NSWindowController <NSCopying, NSTableViewDelegate, NSTableViewDataSource> |
||||
|
||||
@property (strong, nonatomic) NSMutableArray *timeZoneArray; |
||||
@property (strong, nonatomic) NSMutableArray *selectedTimeZones; |
||||
@property (strong, nonatomic) NSArray *filteredArray; |
||||
@property (strong, nonatomic) NSArray *fontFamilies; |
||||
@property (atomic, assign) BOOL launchOnLogin; |
||||
|
||||
+ (instancetype)sharedPreferences; |
||||
|
||||
@end |
@ -0,0 +1,412 @@
|
||||
// |
||||
// PreferencesWindowController.m |
||||
// Clocker |
||||
// |
||||
// Created by Abhishek Banthia on 11/4/15. |
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved. |
||||
// |
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without modification, |
||||
// are permitted provided that the following conditions are met: |
||||
// |
||||
// Redistributions of source code must retain the above copyright notice, |
||||
// this list of conditions and the following disclaimer. |
||||
// |
||||
// Redistributions in binary form must reproduce the above copyright notice, |
||||
// this list of conditions and the following disclaimer in the documentation and/or |
||||
// other materials provided with the distribution. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
|
||||
#import "PreferencesWindowController.h" |
||||
#import "Panel.h" |
||||
#import "PanelController.h" |
||||
#import "ApplicationDelegate.h" |
||||
|
||||
@interface PreferencesWindowController () |
||||
|
||||
@property (weak) IBOutlet NSTableView *timezoneTableView; |
||||
@property (strong) IBOutlet Panel *timezonePanel; |
||||
|
||||
@property (weak) IBOutlet NSTableView *availableTimezoneTableView; |
||||
@property (weak) IBOutlet NSSearchField *searchField; |
||||
|
||||
@property (weak) IBOutlet NSButton *is24HourFormatSelected; |
||||
@property (weak) IBOutlet NSTextField *messageLabel; |
||||
|
||||
@end |
||||
|
||||
static PreferencesWindowController *sharedPreferences = nil; |
||||
|
||||
@implementation PreferencesWindowController |
||||
|
||||
- (void)windowDidLoad { |
||||
[super windowDidLoad]; |
||||
|
||||
NSMutableArray *defaultTimeZones = [[NSUserDefaults standardUserDefaults] objectForKey:@"defaultPreferences"]; |
||||
|
||||
if (!self.timeZoneArray || !self.selectedTimeZones) |
||||
{ |
||||
self.timeZoneArray = [[NSMutableArray alloc] initWithArray:[NSTimeZone knownTimeZoneNames]]; |
||||
self.selectedTimeZones = [[NSMutableArray alloc] initWithArray:defaultTimeZones]; |
||||
self.filteredArray = [[NSArray alloc] init]; |
||||
} |
||||
|
||||
self.fontFamilies = [[NSArray alloc] initWithArray:[[NSFontManager sharedFontManager] availableFonts]]; |
||||
|
||||
self.messageLabel.stringValue = @""; |
||||
|
||||
[self.timezoneTableView reloadData]; |
||||
[self.availableTimezoneTableView reloadData]; |
||||
|
||||
//Register for drag and drop |
||||
[self.timezoneTableView registerForDraggedTypes: [NSArray arrayWithObject: @"public.text"]]; |
||||
|
||||
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. |
||||
} |
||||
|
||||
-(id)copyWithZone:(NSZone *)zone |
||||
{ |
||||
id copy = [[[self class] alloc] initWithWindowNibName:@"PreferencesWindow"]; |
||||
|
||||
if (copy) |
||||
{ |
||||
self.timeZoneArray = [[NSMutableArray alloc] initWithArray:[NSTimeZone knownTimeZoneNames]]; |
||||
} |
||||
|
||||
return copy; |
||||
} |
||||
|
||||
-(BOOL)acceptsFirstResponder |
||||
{ |
||||
return YES; |
||||
} |
||||
|
||||
+ (instancetype)sharedPreferences |
||||
{ |
||||
if (sharedPreferences == nil) |
||||
{ |
||||
/*Using a thread safe pattern*/ |
||||
static dispatch_once_t onceToken; |
||||
dispatch_once(&onceToken, ^{ |
||||
sharedPreferences = [[self alloc] initWithWindowNibName:@"PreferencesWindow"]; |
||||
|
||||
}); |
||||
|
||||
} |
||||
|
||||
return sharedPreferences; |
||||
} |
||||
|
||||
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView |
||||
{ |
||||
if (tableView == self.timezoneTableView) { |
||||
return self.selectedTimeZones.count; |
||||
} |
||||
else |
||||
{ |
||||
if (self.searchField.stringValue.length > 0) { |
||||
return self.filteredArray.count; |
||||
} |
||||
return self.timeZoneArray.count; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
- (nullable id)tableView:(NSTableView *)tableView objectValueForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row |
||||
{ |
||||
if ([[tableColumn identifier] isEqualToString:@"timezoneName"]) |
||||
{ |
||||
return self.selectedTimeZones[row]; |
||||
} |
||||
else if([[tableColumn identifier] isEqualToString:@"availableTimezones"]) |
||||
{ |
||||
if (self.searchField.stringValue.length > 0) |
||||
{ |
||||
return self.filteredArray[row]; |
||||
} |
||||
|
||||
return self.timeZoneArray[row];; |
||||
} |
||||
if ([tableColumn.identifier isEqualToString:@"abbreviation"]) |
||||
{ |
||||
return [NSTimeZone timeZoneWithName:self.timeZoneArray[row]].abbreviation; |
||||
} |
||||
|
||||
return nil; |
||||
|
||||
} |
||||
|
||||
- (IBAction)addTimeZone:(id)sender |
||||
{ |
||||
|
||||
[self.window beginSheet:self.timezonePanel completionHandler:^(NSModalResponse returnCode) { |
||||
|
||||
}]; |
||||
} |
||||
|
||||
- (IBAction)addToFavorites:(id)sender |
||||
{ |
||||
NSString *selectedTimezone; |
||||
|
||||
if (self.selectedTimeZones.count > 9) |
||||
{ |
||||
self.messageLabel.stringValue = @"Maximum 10 timezones allowed!"; |
||||
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(clearLabel) userInfo:nil repeats:NO]; |
||||
return; |
||||
} |
||||
|
||||
for (NSString *name in self.selectedTimeZones) |
||||
{ |
||||
if (self.searchField.stringValue.length > 0) { |
||||
if ([name isEqualToString:self.filteredArray[self.availableTimezoneTableView.selectedRow]]) |
||||
{ |
||||
self.messageLabel.stringValue = @"Timezone has already been selected!"; |
||||
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(clearLabel) userInfo:nil repeats:NO]; |
||||
return; |
||||
} |
||||
} |
||||
else if ([name isEqualToString:self.timeZoneArray[self.availableTimezoneTableView.selectedRow]]) |
||||
{ |
||||
self.messageLabel.stringValue = @"Timezone has already been selected!"; |
||||
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(clearLabel) userInfo:nil repeats:NO]; |
||||
return; |
||||
} |
||||
} |
||||
|
||||
|
||||
selectedTimezone = self.searchField.stringValue.length > 0 ? self.filteredArray[self.availableTimezoneTableView.selectedRow] : self.timeZoneArray[self.availableTimezoneTableView.selectedRow]; |
||||
|
||||
[self.selectedTimeZones addObject:selectedTimezone]; |
||||
|
||||
NSArray *defaultTimeZones = [[NSUserDefaults standardUserDefaults] objectForKey:@"defaultPreferences"]; |
||||
NSMutableArray *newDefaults; |
||||
|
||||
if (defaultTimeZones == nil) |
||||
{ |
||||
defaultTimeZones = [[NSMutableArray alloc] init]; |
||||
} |
||||
|
||||
newDefaults = [[NSMutableArray alloc] initWithArray:defaultTimeZones]; |
||||
|
||||
[newDefaults addObject:selectedTimezone]; |
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject:newDefaults forKey:@"defaultPreferences"]; |
||||
|
||||
[self.timezoneTableView reloadData]; |
||||
|
||||
[self refreshMainTableview]; |
||||
|
||||
[self.timezonePanel close]; |
||||
} |
||||
|
||||
- (void)clearLabel |
||||
{ |
||||
self.messageLabel.stringValue = @""; |
||||
} |
||||
|
||||
- (IBAction)closePanel:(id)sender |
||||
{ |
||||
[self.timezonePanel close]; |
||||
} |
||||
|
||||
- (IBAction)removeFromFavourites:(id)sender |
||||
{ |
||||
|
||||
NSMutableArray *itemsToRemove = [NSMutableArray array]; |
||||
|
||||
if (self.timezoneTableView.selectedRow == -1) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
[self.timezoneTableView.selectedRowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { |
||||
|
||||
[itemsToRemove addObject:self.selectedTimeZones[idx]]; |
||||
|
||||
}]; |
||||
|
||||
[self.selectedTimeZones removeObjectsInArray:itemsToRemove]; |
||||
|
||||
|
||||
NSArray *defaultTimeZones = [[NSUserDefaults standardUserDefaults] objectForKey:@"defaultPreferences"]; |
||||
NSMutableArray *newDefaults; |
||||
|
||||
if (defaultTimeZones == nil) |
||||
{ |
||||
defaultTimeZones = [[NSMutableArray alloc] init]; |
||||
} |
||||
|
||||
newDefaults = [[NSMutableArray alloc] initWithArray:self.selectedTimeZones]; |
||||
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject:newDefaults forKey:@"defaultPreferences"]; |
||||
|
||||
[self.timezoneTableView reloadData]; |
||||
|
||||
[self refreshMainTableview]; |
||||
} |
||||
|
||||
-(void)keyDown:(NSEvent *)theEvent |
||||
{ |
||||
[super keyDown:theEvent]; |
||||
|
||||
if (theEvent.keyCode == 53) { |
||||
[self.timezonePanel close]; |
||||
} |
||||
|
||||
} |
||||
|
||||
-(void)keyUp:(NSEvent *)theEvent |
||||
{ |
||||
if (theEvent.keyCode == 53) { |
||||
[self.timezonePanel close]; |
||||
} |
||||
} |
||||
|
||||
- (IBAction)filterArray:(id)sender |
||||
{ |
||||
|
||||
if (self.searchField.stringValue.length > 0) { |
||||
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", self.searchField.stringValue]; |
||||
|
||||
self.filteredArray = [self.timeZoneArray filteredArrayUsingPredicate:predicate]; |
||||
} |
||||
|
||||
[self.availableTimezoneTableView reloadData]; |
||||
} |
||||
- (IBAction)timeFormatSelectionChanged:(id)sender { |
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:self.is24HourFormatSelected.state] forKey:@"is24HourFormatSelected"]; |
||||
|
||||
[self refreshMainTableview]; |
||||
} |
||||
|
||||
- (void)refreshMainTableview |
||||
{ |
||||
ApplicationDelegate *appDelegate = [[NSApplication sharedApplication] delegate]; |
||||
|
||||
PanelController *panelController = appDelegate.panelController; |
||||
|
||||
[panelController updateDefaultPreferences]; |
||||
|
||||
[panelController.mainTableview reloadData]; |
||||
|
||||
} |
||||
|
||||
- (IBAction)showOnlyCityName:(id)sender { |
||||
|
||||
NSButton *checkbox = (NSButton *)sender; |
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:checkbox.state] forKey:@"showOnlyCity"]; |
||||
|
||||
[self refreshMainTableview]; |
||||
} |
||||
|
||||
- (IBAction)startAppAtLogin:(id)sender |
||||
{ |
||||
} |
||||
|
||||
#pragma mark Reordering |
||||
|
||||
- (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard |
||||
{ |
||||
|
||||
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes]; |
||||
|
||||
[pboard declareTypes:[NSArray arrayWithObject:@"public.text"] owner:self]; |
||||
|
||||
[pboard setData:data forType:@"public.text"]; |
||||
|
||||
return YES; |
||||
} |
||||
|
||||
|
||||
-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation |
||||
{ |
||||
NSPasteboard *pBoard = [info draggingPasteboard]; |
||||
|
||||
NSData *data = [pBoard dataForType:@"public.text"]; |
||||
|
||||
NSIndexSet *rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:data]; |
||||
|
||||
[self.selectedTimeZones exchangeObjectAtIndex:rowIndexes.firstIndex withObjectAtIndex:row]; |
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject:self.selectedTimeZones forKey:@"defaultPreferences"]; |
||||
|
||||
[self.timezoneTableView reloadData]; |
||||
|
||||
[self refreshMainTableview]; |
||||
|
||||
return YES; |
||||
} |
||||
|
||||
-(NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id<NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation |
||||
{ |
||||
return NSDragOperationEvery; |
||||
} |
||||
|
||||
|
||||
- (BOOL)launchOnLogin |
||||
{ |
||||
LSSharedFileListRef loginItemsListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); |
||||
CFArrayRef snapshotRef = LSSharedFileListCopySnapshot(loginItemsListRef, NULL); |
||||
NSArray* loginItems = CFBridgingRelease(snapshotRef); |
||||
NSURL *bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; |
||||
for (id item in loginItems) { |
||||
LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item; |
||||
CFURLRef itemURLRef; |
||||
if (LSSharedFileListItemResolve(itemRef, 0, &itemURLRef, NULL) == noErr) { |
||||
NSURL *itemURL = (NSURL *)CFBridgingRelease(itemURLRef); |
||||
if ([itemURL isEqual:bundleURL]) { |
||||
return YES; |
||||
} |
||||
} |
||||
} |
||||
return NO; |
||||
} |
||||
|
||||
-(void)setLaunchOnLogin:(BOOL)launchOnLogin |
||||
{ |
||||
NSURL *bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; |
||||
LSSharedFileListRef loginItemsListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); |
||||
|
||||
if (launchOnLogin) { |
||||
NSDictionary *properties; |
||||
properties = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"com.apple.loginitem.HideOnLaunch"]; |
||||
LSSharedFileListItemRef itemRef = LSSharedFileListInsertItemURL(loginItemsListRef, kLSSharedFileListItemLast, NULL, NULL, (__bridge CFURLRef)bundleURL, (__bridge CFDictionaryRef)properties,NULL); |
||||
if (itemRef) { |
||||
CFRelease(itemRef); |
||||
} |
||||
} else { |
||||
LSSharedFileListRef loginItemsListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); |
||||
CFArrayRef snapshotRef = LSSharedFileListCopySnapshot(loginItemsListRef, NULL); |
||||
NSArray* loginItems = CFBridgingRelease(snapshotRef); |
||||
|
||||
for (id item in loginItems) { |
||||
LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item; |
||||
CFURLRef itemURLRef; |
||||
if (LSSharedFileListItemResolve(itemRef, 0, &itemURLRef, NULL) == noErr) { |
||||
NSURL *itemURL = (NSURL *)CFBridgingRelease(itemURLRef); |
||||
if ([itemURL isEqual:bundleURL]) { |
||||
LSSharedFileListItemRemove(loginItemsListRef, itemRef); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
@end |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 389 B |
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,49 @@
|
||||
// Created by Abhishek Banthia on 11/4/15.
|
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved.
|
||||
//
|
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation and/or
|
||||
// other materials provided with the distribution.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
@interface StatusItemView : NSView { |
||||
@private |
||||
NSImage *_image; |
||||
NSImage *_alternateImage; |
||||
NSStatusItem *_statusItem; |
||||
BOOL _isHighlighted; |
||||
SEL _action; |
||||
__unsafe_unretained id _target; |
||||
} |
||||
|
||||
- (id)initWithStatusItem:(NSStatusItem *)statusItem; |
||||
|
||||
@property (nonatomic, strong, readonly) NSStatusItem *statusItem; |
||||
@property (nonatomic, strong) NSImage *image; |
||||
@property (nonatomic, strong) NSImage *alternateImage; |
||||
@property (nonatomic, setter = setHighlighted:) BOOL isHighlighted; |
||||
@property (nonatomic, readonly) NSRect globalRect; |
||||
@property (nonatomic) SEL action; |
||||
@property (nonatomic, unsafe_unretained) id target; |
||||
|
||||
@end |
@ -0,0 +1,135 @@
|
||||
// Created by Abhishek Banthia on 11/4/15. |
||||
// Copyright (c) 2015 Abhishek Banthia All rights reserved. |
||||
// |
||||
|
||||
// Copyright (c) 2015, Abhishek Banthia |
||||
// All rights reserved. |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without modification, |
||||
// are permitted provided that the following conditions are met: |
||||
// |
||||
// Redistributions of source code must retain the above copyright notice, |
||||
// this list of conditions and the following disclaimer. |
||||
// |
||||
// Redistributions in binary form must reproduce the above copyright notice, |
||||
// this list of conditions and the following disclaimer in the documentation and/or |
||||
// other materials provided with the distribution. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
|
||||
#import "StatusItemView.h" |
||||
|
||||
@implementation StatusItemView |
||||
|
||||
@synthesize statusItem = _statusItem; |
||||
@synthesize image = _image; |
||||
@synthesize alternateImage = _alternateImage; |
||||
@synthesize isHighlighted = _isHighlighted; |
||||
@synthesize action = _action; |
||||
@synthesize target = _target; |
||||
|
||||
#pragma mark - |
||||
|
||||
- (id)initWithStatusItem:(NSStatusItem *)statusItem |
||||
{ |
||||
CGFloat itemWidth = [statusItem length]; |
||||
CGFloat itemHeight = [[NSStatusBar systemStatusBar] thickness]; |
||||
NSRect itemRect = NSMakeRect(0.0, 0.0, itemWidth, itemHeight); |
||||
self = [super initWithFrame:itemRect]; |
||||
|
||||
if (self != nil) { |
||||
_statusItem = statusItem; |
||||
_statusItem.view = self; |
||||
} |
||||
return self; |
||||
} |
||||
|
||||
|
||||
#pragma mark - |
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect |
||||
{ |
||||
[super drawRect:dirtyRect]; |
||||
|
||||
// Set up dark mode for icon |
||||
if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"] isEqual: @"Dark"]) |
||||
{ |
||||
self.image = [NSImage imageNamed:@"StatusHighlighted"]; |
||||
} |
||||
else |
||||
{ |
||||
if (self.isHighlighted) |
||||
self.image = [NSImage imageNamed:@"StatusHighlighted"]; |
||||
else |
||||
self.image = [NSImage imageNamed:@"Status"]; |
||||
} |
||||
[self.statusItem drawStatusBarBackgroundInRect:dirtyRect withHighlight:self.isHighlighted]; |
||||
|
||||
NSImage *icon = self.image; |
||||
NSSize iconSize = [icon size]; |
||||
NSRect bounds = self.bounds; |
||||
CGFloat iconX = roundf((NSWidth(bounds) - iconSize.width) / 2); |
||||
CGFloat iconY = roundf((NSHeight(bounds) - iconSize.height) / 2); |
||||
NSPoint iconPoint = NSMakePoint(iconX, iconY); |
||||
|
||||
[icon drawAtPoint:iconPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
#pragma mark - |
||||
#pragma mark Mouse tracking |
||||
|
||||
- (void)mouseDown:(NSEvent *)theEvent |
||||
{ |
||||
[NSApp sendAction:self.action to:self.target from:self]; |
||||
} |
||||
|
||||
#pragma mark - |
||||
#pragma mark Accessors |
||||
|
||||
- (void)setHighlighted:(BOOL)newFlag |
||||
{ |
||||
if (_isHighlighted == newFlag) return; |
||||
_isHighlighted = newFlag; |
||||
[self setNeedsDisplay:YES]; |
||||
} |
||||
|
||||
#pragma mark - |
||||
|
||||
- (void)setImage:(NSImage *)newImage |
||||
{ |
||||
if (_image != newImage) { |
||||
_image = newImage; |
||||
[self setNeedsDisplay:YES]; |
||||
} |
||||
} |
||||
|
||||
- (void)setAlternateImage:(NSImage *)newImage |
||||
{ |
||||
if (_alternateImage != newImage) { |
||||
_alternateImage = newImage; |
||||
if (self.isHighlighted) { |
||||
[self setNeedsDisplay:YES]; |
||||
} |
||||
} |
||||
} |
||||
|
||||
#pragma mark - |
||||
|
||||
- (NSRect)globalRect |
||||
{ |
||||
NSRect frame = [self frame]; |
||||
return [self.window convertRectToScreen:frame]; |
||||
} |
||||
@end |
@ -0,0 +1,652 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> |
||||
<dependencies> |
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8191"/> |
||||
</dependencies> |
||||
<objects> |
||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> |
||||
<connections> |
||||
<outlet property="delegate" destination="494" id="495"/> |
||||
</connections> |
||||
</customObject> |
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/> |
||||
<menu title="AMainMenu" systemMenu="main" id="29"> |
||||
<items> |
||||
<menuItem title="Clocker" id="56"> |
||||
<menu key="submenu" title="Clocker" systemMenu="apple" id="57"> |
||||
<items> |
||||
<menuItem title="About Clocker" id="58"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="236"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Preferences…" keyEquivalent="," id="129"/> |
||||
<menuItem isSeparatorItem="YES" id="143"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Services" id="131"> |
||||
<menu key="submenu" title="Services" systemMenu="services" id="130"/> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="144"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Hide Clocker" keyEquivalent="h" id="134"> |
||||
<connections> |
||||
<action selector="hide:" target="-1" id="367"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Hide Others" keyEquivalent="h" id="145"> |
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="hideOtherApplications:" target="-1" id="368"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Show All" id="150"> |
||||
<connections> |
||||
<action selector="unhideAllApplications:" target="-1" id="370"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="149"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Quit Clocker" keyEquivalent="q" id="136"> |
||||
<connections> |
||||
<action selector="terminate:" target="-3" id="449"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="File" id="83"> |
||||
<menu key="submenu" title="File" id="81"> |
||||
<items> |
||||
<menuItem title="New" keyEquivalent="n" id="82"> |
||||
<connections> |
||||
<action selector="newDocument:" target="-1" id="373"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Open…" keyEquivalent="o" id="72"> |
||||
<connections> |
||||
<action selector="openDocument:" target="-1" id="374"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Open Recent" id="124"> |
||||
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> |
||||
<items> |
||||
<menuItem title="Clear Menu" id="126"> |
||||
<connections> |
||||
<action selector="clearRecentDocuments:" target="-1" id="127"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="79"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Close" keyEquivalent="w" id="73"> |
||||
<connections> |
||||
<action selector="performClose:" target="-1" id="193"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Save…" keyEquivalent="s" id="75"> |
||||
<connections> |
||||
<action selector="saveDocument:" target="-1" id="362"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Revert to Saved" id="112"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="revertDocumentToSaved:" target="-1" id="364"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="74"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Page Setup..." keyEquivalent="P" id="77"> |
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="runPageLayout:" target="-1" id="87"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Print…" keyEquivalent="p" id="78"> |
||||
<connections> |
||||
<action selector="print:" target="-1" id="86"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Edit" id="217"> |
||||
<menu key="submenu" title="Edit" id="205"> |
||||
<items> |
||||
<menuItem title="Undo" keyEquivalent="z" id="207"> |
||||
<connections> |
||||
<action selector="undo:" target="-1" id="223"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Redo" keyEquivalent="Z" id="215"> |
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="redo:" target="-1" id="231"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="206"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Cut" keyEquivalent="x" id="199"> |
||||
<connections> |
||||
<action selector="cut:" target="-1" id="228"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Copy" keyEquivalent="c" id="197"> |
||||
<connections> |
||||
<action selector="copy:" target="-1" id="224"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Paste" keyEquivalent="v" id="203"> |
||||
<connections> |
||||
<action selector="paste:" target="-1" id="226"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485"> |
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="pasteAsPlainText:" target="-1" id="486"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Delete" id="202"> |
||||
<connections> |
||||
<action selector="delete:" target="-1" id="235"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Select All" keyEquivalent="a" id="198"> |
||||
<connections> |
||||
<action selector="selectAll:" target="-1" id="232"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="214"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Find" id="218"> |
||||
<menu key="submenu" title="Find" id="220"> |
||||
<items> |
||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209"> |
||||
<connections> |
||||
<action selector="performFindPanelAction:" target="-1" id="241"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534"> |
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="performFindPanelAction:" target="-1" id="535"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"> |
||||
<connections> |
||||
<action selector="performFindPanelAction:" target="-1" id="487"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> |
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="performFindPanelAction:" target="-1" id="488"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"> |
||||
<connections> |
||||
<action selector="performFindPanelAction:" target="-1" id="489"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="210"> |
||||
<connections> |
||||
<action selector="centerSelectionInVisibleArea:" target="-1" id="245"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Spelling and Grammar" id="216"> |
||||
<menu key="submenu" title="Spelling and Grammar" id="200"> |
||||
<items> |
||||
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"> |
||||
<connections> |
||||
<action selector="showGuessPanel:" target="-1" id="230"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Check Document Now" keyEquivalent=";" id="201"> |
||||
<connections> |
||||
<action selector="checkSpelling:" target="-1" id="225"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="453"/> |
||||
<menuItem title="Check Spelling While Typing" id="219"> |
||||
<connections> |
||||
<action selector="toggleContinuousSpellChecking:" target="-1" id="222"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Check Grammar With Spelling" id="346"> |
||||
<connections> |
||||
<action selector="toggleGrammarChecking:" target="-1" id="347"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Correct Spelling Automatically" id="454"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Substitutions" id="348"> |
||||
<menu key="submenu" title="Substitutions" id="349"> |
||||
<items> |
||||
<menuItem title="Show Substitutions" id="457"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="459"/> |
||||
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"> |
||||
<connections> |
||||
<action selector="toggleSmartInsertDelete:" target="-1" id="355"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"> |
||||
<connections> |
||||
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Smart Dashes" id="460"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> |
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Text Replacement" id="462"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Transformations" id="450"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Transformations" id="451"> |
||||
<items> |
||||
<menuItem title="Make Upper Case" id="452"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="uppercaseWord:" target="-1" id="464"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Make Lower Case" id="465"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="lowercaseWord:" target="-1" id="468"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Capitalize" id="466"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="capitalizeWord:" target="-1" id="467"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Speech" id="211"> |
||||
<menu key="submenu" title="Speech" id="212"> |
||||
<items> |
||||
<menuItem title="Start Speaking" id="196"> |
||||
<connections> |
||||
<action selector="startSpeaking:" target="-1" id="233"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Stop Speaking" id="195"> |
||||
<connections> |
||||
<action selector="stopSpeaking:" target="-1" id="227"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Format" id="375"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Format" id="376"> |
||||
<items> |
||||
<menuItem title="Font" id="377"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Font" systemMenu="font" id="388"> |
||||
<items> |
||||
<menuItem title="Show Fonts" keyEquivalent="t" id="389"> |
||||
<connections> |
||||
<action selector="orderFrontFontPanel:" target="420" id="424"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390"> |
||||
<connections> |
||||
<action selector="addFontTrait:" target="420" id="421"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391"> |
||||
<connections> |
||||
<action selector="addFontTrait:" target="420" id="422"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Underline" keyEquivalent="u" id="392"> |
||||
<connections> |
||||
<action selector="underline:" target="-1" id="432"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="393"/> |
||||
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"> |
||||
<connections> |
||||
<action selector="modifyFont:" target="420" id="425"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"> |
||||
<connections> |
||||
<action selector="modifyFont:" target="420" id="423"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="396"/> |
||||
<menuItem title="Kern" id="397"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Kern" id="415"> |
||||
<items> |
||||
<menuItem title="Use Default" id="416"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="useStandardKerning:" target="-1" id="438"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Use None" id="417"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="turnOffKerning:" target="-1" id="441"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Tighten" id="418"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="tightenKerning:" target="-1" id="431"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Loosen" id="419"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="loosenKerning:" target="-1" id="435"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Ligature" id="398"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Ligature" id="411"> |
||||
<items> |
||||
<menuItem title="Use Default" id="412"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="useStandardLigatures:" target="-1" id="439"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Use None" id="413"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="turnOffLigatures:" target="-1" id="440"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Use All" id="414"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="useAllLigatures:" target="-1" id="434"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Baseline" id="399"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Baseline" id="405"> |
||||
<items> |
||||
<menuItem title="Use Default" id="406"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="unscript:" target="-1" id="437"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Superscript" id="407"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="superscript:" target="-1" id="430"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Subscript" id="408"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="subscript:" target="-1" id="429"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Raise" id="409"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="raiseBaseline:" target="-1" id="426"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Lower" id="410"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="lowerBaseline:" target="-1" id="427"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="400"/> |
||||
<menuItem title="Show Colors" keyEquivalent="C" id="401"> |
||||
<connections> |
||||
<action selector="orderFrontColorPanel:" target="-1" id="433"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="402"/> |
||||
<menuItem title="Copy Style" keyEquivalent="c" id="403"> |
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="copyFont:" target="-1" id="428"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Paste Style" keyEquivalent="v" id="404"> |
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="pasteFont:" target="-1" id="436"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Text" id="496"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Text" id="497"> |
||||
<items> |
||||
<menuItem title="Align Left" keyEquivalent="{" id="498"> |
||||
<connections> |
||||
<action selector="alignLeft:" target="-1" id="524"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Center" keyEquivalent="|" id="499"> |
||||
<connections> |
||||
<action selector="alignCenter:" target="-1" id="518"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Justify" id="500"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="alignJustified:" target="-1" id="523"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Align Right" keyEquivalent="}" id="501"> |
||||
<connections> |
||||
<action selector="alignRight:" target="-1" id="521"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="502"/> |
||||
<menuItem title="Writing Direction" id="503"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Writing Direction" id="508"> |
||||
<items> |
||||
<menuItem title="Paragraph" enabled="NO" id="509"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
</menuItem> |
||||
<menuItem id="510"> |
||||
<string key="title"> Default</string> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem id="511"> |
||||
<string key="title"> Left to Right</string> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem id="512"> |
||||
<string key="title"> Right to Left</string> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="513"/> |
||||
<menuItem title="Selection" enabled="NO" id="514"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
</menuItem> |
||||
<menuItem id="515"> |
||||
<string key="title"> Default</string> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem id="516"> |
||||
<string key="title"> Left to Right</string> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem id="517"> |
||||
<string key="title"> Right to Left</string> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="504"/> |
||||
<menuItem title="Show Ruler" id="505"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<connections> |
||||
<action selector="toggleRuler:" target="-1" id="520"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Copy Ruler" keyEquivalent="c" id="506"> |
||||
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="copyRuler:" target="-1" id="522"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Paste Ruler" keyEquivalent="v" id="507"> |
||||
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="pasteRuler:" target="-1" id="519"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="View" id="295"> |
||||
<menu key="submenu" title="View" id="296"> |
||||
<items> |
||||
<menuItem title="Show Toolbar" keyEquivalent="t" id="297"> |
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> |
||||
<connections> |
||||
<action selector="toggleToolbarShown:" target="-1" id="366"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Customize Toolbar…" id="298"> |
||||
<connections> |
||||
<action selector="runToolbarCustomizationPalette:" target="-1" id="365"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Window" id="19"> |
||||
<menu key="submenu" title="Window" systemMenu="window" id="24"> |
||||
<items> |
||||
<menuItem title="Minimize" keyEquivalent="m" id="23"> |
||||
<connections> |
||||
<action selector="performMiniaturize:" target="-1" id="37"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem title="Zoom" id="239"> |
||||
<connections> |
||||
<action selector="performZoom:" target="-1" id="240"/> |
||||
</connections> |
||||
</menuItem> |
||||
<menuItem isSeparatorItem="YES" id="92"> |
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/> |
||||
</menuItem> |
||||
<menuItem title="Bring All to Front" id="5"> |
||||
<connections> |
||||
<action selector="arrangeInFront:" target="-1" id="39"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
<menuItem title="Help" id="490"> |
||||
<modifierMask key="keyEquivalentModifierMask"/> |
||||
<menu key="submenu" title="Help" systemMenu="help" id="491"> |
||||
<items> |
||||
<menuItem title="Clocker Help" keyEquivalent="?" id="492"> |
||||
<connections> |
||||
<action selector="showHelp:" target="-1" id="493"/> |
||||
</connections> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
</menuItem> |
||||
</items> |
||||
</menu> |
||||
<customObject id="494" customClass="ApplicationDelegate"/> |
||||
<customObject id="420" customClass="NSFontManager"/> |
||||
</objects> |
||||
</document> |
Loading…
Reference in new issue