From 04d48741240c61d75933d24084915a98d257d444 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sun, 2 Aug 2009 14:48:16 +0200
Subject: Slimber: Add restart menu.


diff --git a/Slimber/Cocoa/CocoaMenulet.h b/Slimber/Cocoa/CocoaMenulet.h
index 86f0eaa..73f5c2b 100644
--- a/Slimber/Cocoa/CocoaMenulet.h
+++ b/Slimber/Cocoa/CocoaMenulet.h
@@ -3,6 +3,7 @@
 #include <Cocoa/Cocoa.h>
 
 #include "Slimber/Menulet.h"
+#include "Slimber/Cocoa/CocoaMenuletDelegate.h"
 
 class CocoaMenulet : public Menulet {
 	public:
@@ -15,9 +16,11 @@ class CocoaMenulet : public Menulet {
 		virtual void addSeparator();
 		void setIcon(const Swift::String& icon);
 		virtual void addAboutItem();
+		virtual void addRestartItem();
 		virtual void addExitItem();
 	
 	private:
 		NSStatusItem* statusItem;
 		NSMenu* menu;
+		CocoaMenuletDelegate* delegate;
 };
diff --git a/Slimber/Cocoa/CocoaMenulet.mm b/Slimber/Cocoa/CocoaMenulet.mm
index c159aa8..f9981e0 100644
--- a/Slimber/Cocoa/CocoaMenulet.mm
+++ b/Slimber/Cocoa/CocoaMenulet.mm
@@ -3,6 +3,7 @@
 using namespace Swift;
 
 CocoaMenulet::CocoaMenulet() {
+	delegate = [[CocoaMenuletDelegate alloc] initWithMenulet: this];
 	menu = [[NSMenu alloc] init];
 
 	statusItem = [[[NSStatusBar systemStatusBar] 
@@ -14,8 +15,10 @@ CocoaMenulet::CocoaMenulet() {
 }
 
 CocoaMenulet::~CocoaMenulet() {
+	[delegate release];
 	[statusItem release];
 	[menu release];
+	[delegate release];
 }
 
 void CocoaMenulet::setIcon(const String& icon) {
@@ -54,6 +57,13 @@ void CocoaMenulet::addAboutItem() {
 	[item release];
 }
 
+void CocoaMenulet::addRestartItem() {
+	NSMenuItem* item = [[NSMenuItem alloc] initWithTitle: @"Restart" action: @selector(handleRestartClicked:) keyEquivalent: @""];
+	[item setTarget: delegate];
+	[menu addItem: item];
+	[item release];
+}
+
 void CocoaMenulet::addExitItem() {
 	NSMenuItem* item = [[NSMenuItem alloc] initWithTitle: @"Exit" action: @selector(terminate:) keyEquivalent: @""];
 	[item setTarget: [NSApplication sharedApplication]];
diff --git a/Slimber/Cocoa/CocoaMenuletDelegate.h b/Slimber/Cocoa/CocoaMenuletDelegate.h
new file mode 100644
index 0000000..5c28130
--- /dev/null
+++ b/Slimber/Cocoa/CocoaMenuletDelegate.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include <Cocoa/Cocoa.h>
+
+class CocoaMenulet;
+
+@interface CocoaMenuletDelegate : NSObject {
+	CocoaMenulet* menulet;
+}
+
+- (id) initWithMenulet: (CocoaMenulet*) m;
+- (void) handleRestartClicked: (id) sender;
+
+@end
diff --git a/Slimber/Cocoa/CocoaMenuletDelegate.mm b/Slimber/Cocoa/CocoaMenuletDelegate.mm
new file mode 100644
index 0000000..f4a7d7b
--- /dev/null
+++ b/Slimber/Cocoa/CocoaMenuletDelegate.mm
@@ -0,0 +1,17 @@
+#include "Slimber/Cocoa/CocoaMenuletDelegate.h"
+#include "Slimber/Cocoa/CocoaMenulet.h"
+
+@implementation CocoaMenuletDelegate
+
+- (id) initWithMenulet: (CocoaMenulet*) m {
+    if ([super init]) {
+			menulet = m;
+		}
+    return self;
+}
+
+- (void) handleRestartClicked: (id) sender {
+	menulet->onRestartClicked();
+}
+
+@end
diff --git a/Slimber/Cocoa/Makefile.inc b/Slimber/Cocoa/Makefile.inc
index 6d225a7..5ea1154 100644
--- a/Slimber/Cocoa/Makefile.inc
+++ b/Slimber/Cocoa/Makefile.inc
@@ -4,7 +4,8 @@ SLIMBER_COCOA_BINARY = \
 SLIMBER_COCOA_SOURCES = \
 	Slimber/Cocoa/main.mm \
 	Slimber/Cocoa/CocoaController.mm \
-	Slimber/Cocoa/CocoaMenulet.mm
+	Slimber/Cocoa/CocoaMenulet.mm \
+	Slimber/Cocoa/CocoaMenuletDelegate.mm
 SLIMBER_COCOA_XIBS = \
 	Slimber/Cocoa/MainMenu.xib
 SLIMBER_COCOA_RESOURCES = \
@@ -26,7 +27,7 @@ CLEANFILES += \
 	$(SLIMBER_COCOA_TARGET) \
 	$(SLIMBER_COCOA_BINARY)
 DEPS += \
-	$(SLIMBER_COCOA_SOURCES:.mm=.dep)
+	$(patsubst %.m, %.dep, $(patsubst %.mm, %.dep, $(SLIMBER_COCOA_SOURCES)))
 
 .PHONY: slimber-cocoa
 slimber-cocoa: $(SLIMBER_COCOA_TARGET)
diff --git a/Slimber/MainController.cpp b/Slimber/MainController.cpp
index 2d196a5..d723f3f 100644
--- a/Slimber/MainController.cpp
+++ b/Slimber/MainController.cpp
@@ -1,6 +1,7 @@
 #include "Slimber/MainController.h"
 
 #include <boost/bind.hpp>
+#include <iostream>
 
 #include "Swiften/Base/foreach.h"
 #include "Swiften/Application/Platform/PlatformApplication.h"
@@ -37,6 +38,8 @@ MainController::MainController(Menulet* menulet) : menulet(menulet) {
 			boost::bind(&MainController::handleSelfConnected, this, _1));
 
 	menuletController = new MenuletController(menulet);
+	menuletController->onRestartRequested.connect(boost::bind(
+			&MainController::handleRestartRequested, this));
 
 	handleSelfConnected(false);
 	handleServicesChanged();
@@ -78,3 +81,7 @@ void MainController::handleServerStopped(boost::optional<ServerError> error) {
 		menuletController->setXMPPStatus("XMPP Server Not Running", MenuletController::Offline);
 	}
 }
+
+void MainController::handleRestartRequested() {
+	std::cout << "RESTART!" << std::endl;
+}
diff --git a/Slimber/MainController.h b/Slimber/MainController.h
index 8d355fe..4ff9afd 100644
--- a/Slimber/MainController.h
+++ b/Slimber/MainController.h
@@ -24,6 +24,7 @@ class MainController {
 		void handleSelfConnected(bool b);
 		void handleServicesChanged();
 		void handleServerStopped(boost::optional<Swift::ServerError> error);
+		void handleRestartRequested();
 
 	private:
 		Menulet* menulet;
diff --git a/Slimber/Menulet.h b/Slimber/Menulet.h
index 631fbbd..1b8ed18 100644
--- a/Slimber/Menulet.h
+++ b/Slimber/Menulet.h
@@ -1,5 +1,7 @@
 #pragma once
 
+#include <boost/signal.hpp>
+
 #include "Swiften/Base/String.h"
 
 class Menulet {
@@ -9,7 +11,10 @@ class Menulet {
 		virtual void clear() = 0;
 		virtual void addItem(const Swift::String& name, const Swift::String& icon = Swift::String()) = 0;
 		virtual void addAboutItem() = 0;
+		virtual void addRestartItem() = 0;
 		virtual void addExitItem() = 0;
 		virtual void addSeparator() = 0;
 		virtual void setIcon(const Swift::String&) = 0;
+
+		boost::signal<void ()> onRestartClicked;
 };
diff --git a/Slimber/MenuletController.cpp b/Slimber/MenuletController.cpp
index ec11785..1532459 100644
--- a/Slimber/MenuletController.cpp
+++ b/Slimber/MenuletController.cpp
@@ -10,6 +10,7 @@ using namespace Swift;
 
 MenuletController::MenuletController(Menulet* menulet) : 
 		menulet(menulet), xmppStatus(Offline) {
+	menulet->onRestartClicked.connect(boost::ref(onRestartRequested));
 	update();
 }
 
@@ -45,5 +46,6 @@ void MenuletController::update() {
 	menulet->addSeparator();
 	menulet->addAboutItem();
 	menulet->addSeparator();
+	menulet->addRestartItem();
 	menulet->addExitItem();
 }
diff --git a/Slimber/MenuletController.h b/Slimber/MenuletController.h
index 4073900..5e45038 100644
--- a/Slimber/MenuletController.h
+++ b/Slimber/MenuletController.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <vector>
+#include <boost/signal.hpp>
 
 #include "Swiften/Base/String.h"
 
@@ -19,6 +20,8 @@ class MenuletController {
 		void setXMPPStatus(const Swift::String& message, Status status);
 		void setUserNames(const std::vector<Swift::String>&);
 	
+		boost::signal<void ()> onRestartRequested;
+
 	private:
 		void update();
 	
diff --git a/Slimber/UnitTest/MenuletControllerTest.cpp b/Slimber/UnitTest/MenuletControllerTest.cpp
index d50e2c0..c666679 100644
--- a/Slimber/UnitTest/MenuletControllerTest.cpp
+++ b/Slimber/UnitTest/MenuletControllerTest.cpp
@@ -28,7 +28,7 @@ class MenuletControllerTest : public CppUnit::TestFixture {
 		void testConstructor() {
 			MenuletController testling(menulet);
 
-			CPPUNIT_ASSERT_EQUAL(7, static_cast<int>(menulet->items.size()));
+			CPPUNIT_ASSERT_EQUAL(8, static_cast<int>(menulet->items.size()));
 			int i = 0;
 			CPPUNIT_ASSERT_EQUAL(String("No online users"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("-"), menulet->items[i++]);
@@ -36,6 +36,7 @@ class MenuletControllerTest : public CppUnit::TestFixture {
 			CPPUNIT_ASSERT_EQUAL(String("-"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("*About*"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("-"), menulet->items[i++]);
+			CPPUNIT_ASSERT_EQUAL(String("*Restart*"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("*Exit*"), menulet->items[i++]);
 		}
 
@@ -44,7 +45,7 @@ class MenuletControllerTest : public CppUnit::TestFixture {
 
 			testling.setXMPPStatus("You are connected", MenuletController::Online);
 
-			CPPUNIT_ASSERT_EQUAL(7, static_cast<int>(menulet->items.size()));
+			CPPUNIT_ASSERT_EQUAL(8, static_cast<int>(menulet->items.size()));
 			int i = 0;
 			CPPUNIT_ASSERT_EQUAL(String("No online users"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("-"), menulet->items[i++]);
@@ -52,6 +53,7 @@ class MenuletControllerTest : public CppUnit::TestFixture {
 			CPPUNIT_ASSERT_EQUAL(String("-"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("*About*"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("-"), menulet->items[i++]);
+			CPPUNIT_ASSERT_EQUAL(String("*Restart*"), menulet->items[i++]);
 			CPPUNIT_ASSERT_EQUAL(String("*Exit*"), menulet->items[i++]);
 		}
 
@@ -123,6 +125,10 @@ class MenuletControllerTest : public CppUnit::TestFixture {
 				items.push_back("*About*");
 			}
 
+			virtual void addRestartItem() {
+				items.push_back("*Restart*");
+			}
+
 			virtual void addExitItem() {
 				items.push_back("*Exit*");
 			}
-- 
cgit v0.10.2-6-g49f6