diff --git a/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj b/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj index deba11e..c39146d 100644 --- a/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj +++ b/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj @@ -13,6 +13,9 @@ ECEBE1991BA0639500E5B4E3 /* ipbc_ClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEBE1981BA0639500E5B4E3 /* ipbc_ClientTests.swift */; }; ECEBE1A41BA0690B00E5B4E3 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEBE1A21BA0690B00E5B4E3 /* MainViewController.swift */; }; ECEBE1A51BA0690B00E5B4E3 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = ECEBE1A31BA0690B00E5B4E3 /* MainViewController.xib */; }; + ECEBE1A91BA0752600E5B4E3 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEBE1A81BA0752600E5B4E3 /* EventMonitor.swift */; }; + ECEBE1AB1BA07DD600E5B4E3 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEBE1AA1BA07DD600E5B4E3 /* Constants.swift */; }; + ECEBE1AE1BA0C61100E5B4E3 /* WebserviceClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEBE1AD1BA0C61100E5B4E3 /* WebserviceClient.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -36,6 +39,9 @@ ECEBE1981BA0639500E5B4E3 /* ipbc_ClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ipbc_ClientTests.swift; sourceTree = ""; }; ECEBE1A21BA0690B00E5B4E3 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MainViewController.swift; path = Controller/MainViewController.swift; sourceTree = ""; }; ECEBE1A31BA0690B00E5B4E3 /* MainViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MainViewController.xib; path = Controller/MainViewController.xib; sourceTree = ""; }; + ECEBE1A81BA0752600E5B4E3 /* EventMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventMonitor.swift; sourceTree = ""; }; + ECEBE1AA1BA07DD600E5B4E3 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + ECEBE1AD1BA0C61100E5B4E3 /* WebserviceClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebserviceClient.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -77,11 +83,14 @@ ECEBE1841BA0639500E5B4E3 /* ipbc-Client */ = { isa = PBXGroup; children = ( + ECEBE1AC1BA0C60000E5B4E3 /* WebService */, ECEBE1A71BA0693200E5B4E3 /* control */, ECEBE1A61BA0692000E5B4E3 /* view */, ECEBE1871BA0639500E5B4E3 /* AppDelegate.swift */, ECEBE1891BA0639500E5B4E3 /* Images.xcassets */, ECEBE1851BA0639500E5B4E3 /* Supporting Files */, + ECEBE1A81BA0752600E5B4E3 /* EventMonitor.swift */, + ECEBE1AA1BA07DD600E5B4E3 /* Constants.swift */, ); path = "ipbc-Client"; sourceTree = ""; @@ -128,6 +137,14 @@ name = control; sourceTree = ""; }; + ECEBE1AC1BA0C60000E5B4E3 /* WebService */ = { + isa = PBXGroup; + children = ( + ECEBE1AD1BA0C61100E5B4E3 /* WebserviceClient.swift */, + ); + name = WebService; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -228,8 +245,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + ECEBE1A91BA0752600E5B4E3 /* EventMonitor.swift in Sources */, + ECEBE1AE1BA0C61100E5B4E3 /* WebserviceClient.swift in Sources */, ECEBE1881BA0639500E5B4E3 /* AppDelegate.swift in Sources */, ECEBE1A41BA0690B00E5B4E3 /* MainViewController.swift in Sources */, + ECEBE1AB1BA07DD600E5B4E3 /* Constants.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -420,6 +440,7 @@ ECEBE19E1BA0639500E5B4E3 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; ECEBE19F1BA0639500E5B4E3 /* Build configuration list for PBXNativeTarget "ipbc-ClientTests" */ = { isa = XCConfigurationList; @@ -428,6 +449,7 @@ ECEBE1A11BA0639500E5B4E3 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcshareddata/ipbc-Client.xccheckout b/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcshareddata/ipbc-Client.xccheckout index d960e65..68f8f42 100644 --- a/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcshareddata/ipbc-Client.xccheckout +++ b/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcshareddata/ipbc-Client.xccheckout @@ -7,14 +7,14 @@ IDESourceControlProjectIdentifier B4996E80-3257-4F7C-86EA-7424113FB751 IDESourceControlProjectName - project + ipbc-Client IDESourceControlProjectOriginsDictionary 41A46EC74341898613642098E6535621FD117950 ssh://services.adawim.com:7999/ipbc/statusbar-app-osx.git IDESourceControlProjectPath - ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace + ipbc-Client/ipbc-Client.xcodeproj IDESourceControlProjectRelativeInstallPathDictionary 41A46EC74341898613642098E6535621FD117950 diff --git a/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/UserInterfaceState.xcuserstate b/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/UserInterfaceState.xcuserstate index 316ef3b..4b386d8 100644 Binary files a/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/UserInterfaceState.xcuserstate and b/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/ipbc-Client/ipbc-Client/AppDelegate.swift b/ipbc-Client/ipbc-Client/AppDelegate.swift index f962f5f..e134ed2 100644 --- a/ipbc-Client/ipbc-Client/AppDelegate.swift +++ b/ipbc-Client/ipbc-Client/AppDelegate.swift @@ -12,19 +12,31 @@ import Cocoa class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! - let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2) + let popover = NSPopover() + var eventMonitor: EventMonitor? + let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2) func applicationDidFinishLaunching(aNotification: NSNotification) { // Insert code here to initialize your application + // Icon if let button = statusItem.button { button.image = NSImage(named: "statusbar-icon") button.action = Selector("togglePopover:") } popover.contentViewController = MainViewController(nibName: "MainViewController", bundle: nil) + + + // EventMonitor + eventMonitor = EventMonitor(mask: .LeftMouseDownMask | .RightMouseDownMask) { [unowned self] event in + if self.popover.shown { + self.closePopover(event) + } + } + eventMonitor?.start() } func applicationWillTerminate(aNotification: NSNotification) { diff --git a/ipbc-Client/ipbc-Client/Constants.swift b/ipbc-Client/ipbc-Client/Constants.swift new file mode 100644 index 0000000..5d94b9c --- /dev/null +++ b/ipbc-Client/ipbc-Client/Constants.swift @@ -0,0 +1,26 @@ +// +// Constants.swift +// ipbc-Client +// +// Created by Gerrit Linnemann on 09.09.15. +// Copyright (c) 2015 Adawim UG (haftungsbeschränkt). All rights reserved. +// + +import Foundation + +struct Constants { + struct Web { + static let REGISTER = "https://www.ip-bc.org/login.xhtml" + } + + struct WebService { + static let BASE = "www.ip-bc.org" + static let UPDATE = "https://www.ip-bc.org/ws/update/ip" + static let GET_USERS_IP = "https://www.ip-bc.org/ws/info/ip" + } + + struct UserDefaults { + static let HOST = "USERDEFAULT_HOST" + static let TOKEN = "USERDEFAULT_TOKEN" + } +} \ No newline at end of file diff --git a/ipbc-Client/ipbc-Client/Controller/MainViewController.swift b/ipbc-Client/ipbc-Client/Controller/MainViewController.swift index d0006ec..5a8e901 100644 --- a/ipbc-Client/ipbc-Client/Controller/MainViewController.swift +++ b/ipbc-Client/ipbc-Client/Controller/MainViewController.swift @@ -9,10 +9,44 @@ import Cocoa class MainViewController: NSViewController { + + @IBOutlet weak var btnQuit: NSButton! + @IBOutlet weak var btnRegister: NSButton! + @IBOutlet weak var btnSave: NSButton! + @IBOutlet weak var btnCancel: NSButton! + @IBOutlet weak var lblCurrentIP: NSTextField! + @IBOutlet weak var txtName: NSTextField! + @IBOutlet weak var txtToken: NSTextField! override func viewDidLoad() { super.viewDidLoad() // Do view setup here. + + self.lblCurrentIP.stringValue = "" + + let defaults = NSUserDefaults.standardUserDefaults() + if let udHost = defaults.stringForKey(Constants.UserDefaults.HOST) { + txtName.stringValue = udHost + } + if let udToken = defaults.stringForKey(Constants.UserDefaults.TOKEN) { + txtToken.stringValue = udToken + } } + // MARK: Actions + + @IBAction func actionQuit(sender: NSButton) { + NSApplication.sharedApplication().terminate(self) + } + + @IBAction func actionOpenRegister(sender: NSButton) { + + } + + @IBAction func actionSaveSettings(sender: NSButton) { + let defaults = NSUserDefaults.standardUserDefaults() + + defaults.setObject(txtName.stringValue, forKey: Constants.UserDefaults.HOST) + defaults.setObject(txtToken.stringValue, forKey: Constants.UserDefaults.TOKEN) + } } diff --git a/ipbc-Client/ipbc-Client/Controller/MainViewController.xib b/ipbc-Client/ipbc-Client/Controller/MainViewController.xib index 5c94ef3..6d40a75 100644 --- a/ipbc-Client/ipbc-Client/Controller/MainViewController.xib +++ b/ipbc-Client/ipbc-Client/Controller/MainViewController.xib @@ -1,19 +1,133 @@ - + - + - + + + + + + + + - + - + + + + + + + + + + + This is an application that updates your hostnames with the latest IP address of your computer assuring that you will always have an updated hostname allowing you to connect to your computer from everywhere. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ipbc-Client/ipbc-Client/EventMonitor.swift b/ipbc-Client/ipbc-Client/EventMonitor.swift new file mode 100644 index 0000000..c3c829c --- /dev/null +++ b/ipbc-Client/ipbc-Client/EventMonitor.swift @@ -0,0 +1,37 @@ +// +// EventMonitor.swift +// ipbc-Client +// +// Created by Gerrit Linnemann on 09.09.15. +// Copyright (c) 2015 Adawim UG (haftungsbeschränkt). All rights reserved. +// +// More infos to EventMonitor: http://www.raywenderlich.com/98178/os-x-tutorial-menus-popovers-menu-bar-apps +// + +import Cocoa + +public class EventMonitor { + private var monitor: AnyObject? + private let mask: NSEventMask + private let handler: NSEvent? -> () + + public init(mask: NSEventMask, handler: NSEvent? -> ()) { + self.mask = mask + self.handler = handler + } + + deinit { + stop() + } + + public func start() { + monitor = NSEvent.addGlobalMonitorForEventsMatchingMask(mask, handler: handler) + } + + public func stop() { + if monitor != nil { + NSEvent.removeMonitor(monitor!) + monitor = nil + } + } +} \ No newline at end of file diff --git a/ipbc-Client/ipbc-Client/WebserviceClient.swift b/ipbc-Client/ipbc-Client/WebserviceClient.swift new file mode 100644 index 0000000..e506d95 --- /dev/null +++ b/ipbc-Client/ipbc-Client/WebserviceClient.swift @@ -0,0 +1,26 @@ +// +// WebserviceClient.swift +// ipbc-Client +// +// Created by Gerrit Linnemann on 09.09.15. +// Copyright (c) 2015 Adawim UG (haftungsbeschränkt). All rights reserved. +// + +import Foundation + + +private let x_SomeManagerSharedInstance = WebserviceClient() + + +class WebserviceClient { + private var isNetworkAvailable : Bool = false + private var isRequestRunning : Bool = false + + class var sharedInstance: WebserviceClient { + return x_SomeManagerSharedInstance + } + + init() { + + } +} \ No newline at end of file