diff --git a/Icon.icns b/Icon.icns
index 808fd9c..9063396 100644
Binary files a/Icon.icns and b/Icon.icns differ
diff --git a/Speaker-Info.plist b/Speaker-Info.plist
index 04c463e..ad20a9e 100644
--- a/Speaker-Info.plist
+++ b/Speaker-Info.plist
@@ -27,6 +27,6 @@
NSMainNibFile
MainMenu
NSPrincipalClass
- NSApplication
+ SpeakerApplication
diff --git a/Speaker.xcodeproj/jeena.mode1v3 b/Speaker.xcodeproj/jeena.mode1v3
index 779cf3e..b02d425 100644
--- a/Speaker.xcodeproj/jeena.mode1v3
+++ b/Speaker.xcodeproj/jeena.mode1v3
@@ -264,19 +264,20 @@
29B97314FDCFA39411CA2CEA
080E96DDFE201D6D7F000001
+ 29B97315FDCFA39411CA2CEA
29B97317FDCFA39411CA2CEA
1C37FABC05509CD000000102
PBXSmartGroupTreeModuleOutlineStateSelectionKey
- 8
- 5
+ 3
+ 1
0
PBXSmartGroupTreeModuleOutlineStateVisibleRectKey
- {{0, 0}, {186, 544}}
+ {{0, 0}, {186, 854}}
PBXTopSmartGroupGIDs
@@ -288,14 +289,14 @@
GeometryConfiguration
Frame
- {{0, 0}, {203, 562}}
+ {{0, 0}, {203, 872}}
GroupTreeTableConfiguration
MainColumn
186
RubberWindowFrame
- 277 575 787 603 0 0 1920 1178
+ 78 186 1101 913 0 0 1920 1178
Module
PBXSmartGroupTreeModule
@@ -306,12 +307,14 @@
Dock
+ BecomeActive
+
ContentConfiguration
PBXProjectModuleGUID
1CE0B20306471E060097A5F4
PBXProjectModuleLabel
- Speaker-Info.plist
+ SpeakerAppDelegate.m
PBXSplitModuleInNavigatorKey
Split0
@@ -319,18 +322,22 @@
PBXProjectModuleGUID
1CE0B20406471E060097A5F4
PBXProjectModuleLabel
- Speaker-Info.plist
+ SpeakerAppDelegate.m
_historyCapacity
0
bookmark
- 1FA38CDC124D437D004B8852
+ 1FF67C6B1294AEA400CA07A3
history
1FA38C5E124D2CD6004B8852
- 1FA38C98124D341C004B8852
- 1FA38CD9124D437D004B8852
1FA38CDA124D437D004B8852
- 1FA38CDB124D437D004B8852
+ 1FF67B481294919400CA07A3
+ 1FF67B491294919400CA07A3
+ 1FF67B4A1294919400CA07A3
+ 1FF67B4B1294919400CA07A3
+ 1FF67BEC1294A39500CA07A3
+ 1FF67C0B1294A9BE00CA07A3
+ 1FF67C0C1294A9BE00CA07A3
SplitCount
@@ -342,14 +349,14 @@
GeometryConfiguration
Frame
- {{0, 0}, {579, 557}}
+ {{0, 0}, {893, 867}}
RubberWindowFrame
- 277 575 787 603 0 0 1920 1178
+ 78 186 1101 913 0 0 1920 1178
Module
PBXNavigatorGroup
Proportion
- 557pt
+ 867pt
ContentConfiguration
@@ -362,9 +369,9 @@
GeometryConfiguration
Frame
- {{0, 562}, {579, 0}}
+ {{0, 872}, {893, 0}}
RubberWindowFrame
- 277 575 787 603 0 0 1920 1178
+ 78 186 1101 913 0 0 1920 1178
Module
XCDetailModule
@@ -373,7 +380,7 @@
Proportion
- 579pt
+ 893pt
Name
@@ -388,9 +395,9 @@
TableOfContents
- 1FA38C32124D2426004B8852
+ 1FF67B3012948CE400CA07A3
1CE0B1FE06471DED0097A5F4
- 1FA38C33124D2426004B8852
+ 1FF67B3112948CE400CA07A3
1CE0B20306471E060097A5F4
1CE0B20506471E060097A5F4
@@ -528,15 +535,15 @@
5
WindowOrderList
- 1FA38C63124D2CD6004B8852
- 1FA38C64124D2CD6004B8852
- 1C78EAAD065D492600B07095
+ 1FF67B551294919400CA07A3
+ 1FF67B561294919400CA07A3
1CD10A99069EF8BA00B06720
1FA38C35124D2426004B8852
+ 1C78EAAD065D492600B07095
/Users/jeena/Projects/Speaker/Speaker.xcodeproj
WindowString
- 277 575 787 603 0 0 1920 1178
+ 78 186 1101 913 0 0 1920 1178
WindowToolsV3
@@ -557,7 +564,7 @@
PBXProjectModuleGUID
1CD0528F0623707200166675
PBXProjectModuleLabel
- SpeakerAppDelegate.m
+
StatusBarVisibility
@@ -574,8 +581,6 @@
218pt
- BecomeActive
-
ContentConfiguration
PBXProjectModuleGUID
@@ -615,7 +620,7 @@
TableOfContents
1FA38C35124D2426004B8852
- 1FA38C36124D2426004B8852
+ 1FF67B3212948CE400CA07A3
1CD0528F0623707200166675
XCMainBuildResultsModuleGUID
@@ -659,8 +664,8 @@
yes
sizes
- {{0, 0}, {316, 185}}
- {{316, 0}, {378, 185}}
+ {{0, 0}, {316, 198}}
+ {{316, 0}, {378, 198}}
VerticalSplitView
@@ -675,8 +680,8 @@
yes
sizes
- {{0, 0}, {694, 185}}
- {{0, 185}, {694, 196}}
+ {{0, 0}, {694, 198}}
+ {{0, 198}, {694, 183}}
@@ -709,7 +714,7 @@
148
Frame
- {{316, 0}, {378, 185}}
+ {{316, 0}, {378, 198}}
RubberWindowFrame
298 733 694 422 0 0 1920 1178
@@ -737,13 +742,13 @@
TableOfContents
1CD10A99069EF8BA00B06720
- 1FA38C41124D2756004B8852
+ 1FF67B4E1294919400CA07A3
1C162984064C10D400B95A72
- 1FA38C42124D2756004B8852
- 1FA38C43124D2756004B8852
- 1FA38C44124D2756004B8852
- 1FA38C45124D2756004B8852
- 1FA38C46124D2756004B8852
+ 1FF67B4F1294919400CA07A3
+ 1FF67B501294919400CA07A3
+ 1FF67B511294919400CA07A3
+ 1FF67B521294919400CA07A3
+ 1FF67B531294919400CA07A3
ToolbarConfiguration
xcode.toolbar.config.debugV3
@@ -884,7 +889,7 @@
Frame
{{0, 0}, {650, 209}}
RubberWindowFrame
- 191 248 650 250 0 0 1920 1178
+ 1276 76 650 250 0 0 1920 1178
Module
PBXDebugCLIModule
@@ -907,17 +912,17 @@
TableOfContents
1C78EAAD065D492600B07095
- 1FA38C47124D2756004B8852
+ 1FF67B541294919400CA07A3
1C78EAAC065D492600B07095
ToolbarConfiguration
xcode.toolbar.config.consoleV3
WindowString
- 191 248 650 250 0 0 1920 1178
+ 1276 76 650 250 0 0 1920 1178
WindowToolGUID
1C78EAAD065D492600B07095
WindowToolIsVisible
-
+
Identifier
diff --git a/Speaker.xcodeproj/jeena.pbxuser b/Speaker.xcodeproj/jeena.pbxuser
index c00afb3..301070e 100644
--- a/Speaker.xcodeproj/jeena.pbxuser
+++ b/Speaker.xcodeproj/jeena.pbxuser
@@ -51,348 +51,10 @@
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
- 1FA38C56124D2CA0004B8852 /* XCBuildMessageTextBookmark */ = {
- isa = PBXTextBookmark;
- comments = "Invalid initializer";
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- fallbackIsa = XCBuildMessageTextBookmark;
- rLen = 1;
- rLoc = 21;
- rType = 1;
- };
- 1FA38C57124D2CA0004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 382;
- vrLoc = 139;
- };
1FA38C5E124D2CD6004B8852 /* PBXBookmark */ = {
isa = PBXBookmark;
fRef = 1FA38C48124D27C8004B8852 /* play-icon.png */;
};
- 1FA38C5F124D2CD6004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
- name = "SpeakerAppDelegate.h: 13";
- rLen = 10;
- rLoc = 255;
- rType = 0;
- vrLen = 380;
- vrLoc = 43;
- };
- 1FA38C60124D2CD6004B8852 /* XCBuildMessageTextBookmark */ = {
- isa = PBXTextBookmark;
- comments = "Invalid initializer";
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- fallbackIsa = XCBuildMessageTextBookmark;
- rLen = 1;
- rLoc = 21;
- rType = 1;
- };
- 1FA38C61124D2CD6004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 32";
- rLen = 0;
- rLoc = 1342;
- rType = 0;
- vrLen = 779;
- vrLoc = 77;
- };
- 1FA38C6D124D2D0C004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 779;
- vrLoc = 77;
- };
- 1FA38C71124D2D1E004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 779;
- vrLoc = 77;
- };
- 1FA38C75124D2D34004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 797;
- vrLoc = 77;
- };
- 1FA38C77124D2D5A004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 779;
- vrLoc = 77;
- };
- 1FA38C7A124D2DA5004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 760;
- vrLoc = 77;
- };
- 1FA38C7F124D2DBB004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 708;
- vrLoc = 0;
- };
- 1FA38C84124D2DCA004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 708;
- vrLoc = 0;
- };
- 1FA38C88124D2DE9004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 700;
- vrLoc = 77;
- };
- 1FA38C8F124D3162004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
- name = "SpeakerAppDelegate.h: 14";
- rLen = 0;
- rLoc = 324;
- rType = 0;
- vrLen = 458;
- vrLoc = 0;
- };
- 1FA38C90124D3162004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 20";
- rLen = 0;
- rLoc = 481;
- rType = 0;
- vrLen = 695;
- vrLoc = 77;
- };
- 1FA38C91124D3162004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 32";
- rLen = 0;
- rLoc = 1342;
- rType = 0;
- vrLen = 711;
- vrLoc = 140;
- };
- 1FA38C95124D31AD004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 34";
- rLen = 0;
- rLoc = 1339;
- rType = 0;
- vrLen = 706;
- vrLoc = 208;
- };
- 1FA38C98124D341C004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
- name = "SpeakerAppDelegate.h: 15";
- rLen = 0;
- rLoc = 324;
- rType = 0;
- vrLen = 477;
- vrLoc = 0;
- };
- 1FA38C99124D341C004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 24";
- rLen = 0;
- rLoc = 571;
- rType = 0;
- vrLen = 701;
- vrLoc = 208;
- };
- 1FA38C9A124D341C004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 39";
- rLen = 0;
- rLoc = 1339;
- rType = 0;
- vrLen = 620;
- vrLoc = 409;
- };
- 1FA38C9B124D34F4004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 41";
- rLen = 0;
- rLoc = 1312;
- rType = 0;
- vrLen = 655;
- vrLoc = 409;
- };
- 1FA38C9E124D3516004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 46";
- rLen = 0;
- rLoc = 1334;
- rType = 0;
- vrLen = 662;
- vrLoc = 449;
- };
- 1FA38CA8124D3666004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 30";
- rLen = 0;
- rLoc = 818;
- rType = 0;
- vrLen = 961;
- vrLoc = 208;
- };
- 1FA38CAB124D3695004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 28";
- rLen = 0;
- rLoc = 625;
- rType = 0;
- vrLen = 1023;
- vrLoc = 207;
- };
- 1FA38CAF124D36B6004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 33";
- rLen = 0;
- rLoc = 823;
- rType = 0;
- vrLen = 1079;
- vrLoc = 207;
- };
- 1FA38CB3124D3718004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 18";
- rLen = 0;
- rLoc = 441;
- rType = 0;
- vrLen = 1108;
- vrLoc = 207;
- };
- 1FA38CB5124D3736004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 33";
- rLen = 0;
- rLoc = 823;
- rType = 0;
- vrLen = 959;
- vrLoc = 207;
- };
- 1FA38CB8124D3793004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 32";
- rLen = 0;
- rLoc = 818;
- rType = 0;
- vrLen = 1018;
- vrLoc = 207;
- };
- 1FA38CBB124D37B2004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 32";
- rLen = 0;
- rLoc = 762;
- rType = 0;
- vrLen = 1029;
- vrLoc = 207;
- };
- 1FA38CBE124D3887004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 32";
- rLen = 0;
- rLoc = 762;
- rType = 0;
- vrLen = 1029;
- vrLoc = 207;
- };
- 1FA38CBF124D3897004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 32";
- rLen = 0;
- rLoc = 762;
- rType = 0;
- vrLen = 1004;
- vrLoc = 207;
- };
- 1FA38CC1124D38C2004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 33";
- rLen = 0;
- rLoc = 818;
- rType = 0;
- vrLen = 1020;
- vrLoc = 207;
- };
- 1FA38CD8124D437C004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 23";
- rLen = 0;
- rLoc = 482;
- rType = 0;
- vrLen = 360;
- vrLoc = 208;
- };
- 1FA38CD9124D437D004B8852 /* PBXTextBookmark */ = {
- isa = PBXTextBookmark;
- fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
- name = "SpeakerAppDelegate.m: 30";
- rLen = 0;
- rLoc = 662;
- rType = 0;
- vrLen = 1061;
- vrLoc = 207;
- };
1FA38CDA124D437D004B8852 /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 089C165DFE840E0CC02AAC07 /* English */;
@@ -403,38 +65,125 @@
vrLen = 45;
vrLoc = 0;
};
- 1FA38CDB124D437D004B8852 /* PBXBookmark */ = {
- isa = PBXBookmark;
- fRef = 8D1107310486CEB800E47090 /* Speaker-Info.plist */;
+ 1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {832, 812}}";
+ sepNavSelRange = "{267, 0}";
+ sepNavVisRange = "{0, 274}";
+ };
};
- 1FA38CDC124D437D004B8852 /* PlistBookmark */ = {
+ 1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {832, 915}}";
+ sepNavSelRange = "{1382, 8}";
+ sepNavVisRange = "{43, 1388}";
+ };
+ };
+ 1FF67B481294919400CA07A3 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 256AC3F00F4B6AF500CF3369 /* Speaker_Prefix.pch */;
+ name = "Speaker_Prefix.pch: 1";
+ rLen = 0;
+ rLoc = 0;
+ rType = 0;
+ vrLen = 145;
+ vrLoc = 0;
+ };
+ 1FF67B491294919400CA07A3 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 29B97316FDCFA39411CA2CEA /* main.m */;
+ name = "main.m: 1";
+ rLen = 0;
+ rLoc = 0;
+ rType = 0;
+ vrLen = 247;
+ vrLoc = 0;
+ };
+ 1FF67B4A1294919400CA07A3 /* PlistBookmark */ = {
isa = PlistBookmark;
fRef = 8D1107310486CEB800E47090 /* Speaker-Info.plist */;
fallbackIsa = PBXBookmark;
isK = 0;
kPath = (
- CFBundleIdentifier,
+ NSPrincipalClass,
);
name = "/Users/jeena/Projects/Speaker/Speaker-Info.plist";
rLen = 0;
rLoc = 9223372036854775807;
};
+ 1FF67B4B1294919400CA07A3 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */;
+ name = "SpeakerApplication.h: 16";
+ rLen = 0;
+ rLoc = 267;
+ rType = 0;
+ vrLen = 274;
+ vrLoc = 0;
+ };
+ 1FF67BEC1294A39500CA07A3 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */;
+ name = "SpeakerApplication.m: 55";
+ rLen = 8;
+ rLoc = 1382;
+ rType = 0;
+ vrLen = 1388;
+ vrLoc = 43;
+ };
+ 1FF67C0B1294A9BE00CA07A3 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */;
+ name = "SpeakerAppDelegate.h: 16";
+ rLen = 0;
+ rLoc = 374;
+ rType = 0;
+ vrLen = 594;
+ vrLoc = 0;
+ };
+ 1FF67C0C1294A9BE00CA07A3 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
+ name = "SpeakerAppDelegate.m: 58";
+ rLen = 13;
+ rLoc = 1816;
+ rType = 0;
+ vrLen = 1672;
+ vrLoc = 1375;
+ };
+ 1FF67C6B1294AEA400CA07A3 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */;
+ name = "SpeakerAppDelegate.m: 98";
+ rLen = 0;
+ rLoc = 2838;
+ rType = 0;
+ vrLen = 1528;
+ vrLoc = 1736;
+ };
256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {519, 403}}";
- sepNavSelRange = "{324, 0}";
- sepNavVisRange = "{0, 477}";
+ sepNavIntBoundsRect = "{{0, 0}, {832, 812}}";
+ sepNavSelRange = "{374, 0}";
+ sepNavVisRange = "{0, 594}";
};
};
256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {509, 930}}";
- sepNavSelRange = "{482, 0}";
- sepNavVisRange = "{208, 360}";
+ sepNavIntBoundsRect = "{{0, 0}, {1160, 1710}}";
+ sepNavSelRange = "{2838, 0}";
+ sepNavVisRange = "{1736, 1528}";
+ };
+ };
+ 256AC3F00F4B6AF500CF3369 /* Speaker_Prefix.pch */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {832, 835}}";
+ sepNavSelRange = "{0, 0}";
+ sepNavVisRange = "{0, 145}";
};
};
29B97313FDCFA39411CA2CEA /* Project object */ = {
- activeBuildConfigurationName = Debug;
+ activeBuildConfigurationName = Release;
activeExecutable = 1FA38C25124D2411004B8852 /* Speaker */;
activeTarget = 8D1107260486CEB800E47090 /* Speaker */;
addToTargets = (
@@ -450,9 +199,9 @@
PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
PBXFileTableDataSourceColumnWidthsKey = (
20,
- 340,
+ 654,
20,
- 48.16259765625,
+ 48,
43,
43,
20,
@@ -467,53 +216,32 @@
PBXFileDataSource_Target_ColumnID,
);
};
- PBXPerProjectTemplateStateSaveDate = 307045393;
- PBXWorkspaceStateSaveDate = 307045393;
+ PBXPerProjectTemplateStateSaveDate = 311725270;
+ PBXWorkspaceStateSaveDate = 311725270;
};
perUserProjectItems = {
- 1FA38C56124D2CA0004B8852 /* XCBuildMessageTextBookmark */ = 1FA38C56124D2CA0004B8852 /* XCBuildMessageTextBookmark */;
- 1FA38C57124D2CA0004B8852 /* PBXTextBookmark */ = 1FA38C57124D2CA0004B8852 /* PBXTextBookmark */;
1FA38C5E124D2CD6004B8852 /* PBXBookmark */ = 1FA38C5E124D2CD6004B8852 /* PBXBookmark */;
- 1FA38C5F124D2CD6004B8852 /* PBXTextBookmark */ = 1FA38C5F124D2CD6004B8852 /* PBXTextBookmark */;
- 1FA38C60124D2CD6004B8852 /* XCBuildMessageTextBookmark */ = 1FA38C60124D2CD6004B8852 /* XCBuildMessageTextBookmark */;
- 1FA38C61124D2CD6004B8852 /* PBXTextBookmark */ = 1FA38C61124D2CD6004B8852 /* PBXTextBookmark */;
- 1FA38C6D124D2D0C004B8852 /* PBXTextBookmark */ = 1FA38C6D124D2D0C004B8852 /* PBXTextBookmark */;
- 1FA38C71124D2D1E004B8852 /* PBXTextBookmark */ = 1FA38C71124D2D1E004B8852 /* PBXTextBookmark */;
- 1FA38C75124D2D34004B8852 /* PBXTextBookmark */ = 1FA38C75124D2D34004B8852 /* PBXTextBookmark */;
- 1FA38C77124D2D5A004B8852 /* PBXTextBookmark */ = 1FA38C77124D2D5A004B8852 /* PBXTextBookmark */;
- 1FA38C7A124D2DA5004B8852 /* PBXTextBookmark */ = 1FA38C7A124D2DA5004B8852 /* PBXTextBookmark */;
- 1FA38C7F124D2DBB004B8852 /* PBXTextBookmark */ = 1FA38C7F124D2DBB004B8852 /* PBXTextBookmark */;
- 1FA38C84124D2DCA004B8852 /* PBXTextBookmark */ = 1FA38C84124D2DCA004B8852 /* PBXTextBookmark */;
- 1FA38C88124D2DE9004B8852 /* PBXTextBookmark */ = 1FA38C88124D2DE9004B8852 /* PBXTextBookmark */;
- 1FA38C8F124D3162004B8852 /* PBXTextBookmark */ = 1FA38C8F124D3162004B8852 /* PBXTextBookmark */;
- 1FA38C90124D3162004B8852 /* PBXTextBookmark */ = 1FA38C90124D3162004B8852 /* PBXTextBookmark */;
- 1FA38C91124D3162004B8852 /* PBXTextBookmark */ = 1FA38C91124D3162004B8852 /* PBXTextBookmark */;
- 1FA38C95124D31AD004B8852 /* PBXTextBookmark */ = 1FA38C95124D31AD004B8852 /* PBXTextBookmark */;
- 1FA38C98124D341C004B8852 /* PBXTextBookmark */ = 1FA38C98124D341C004B8852 /* PBXTextBookmark */;
- 1FA38C99124D341C004B8852 /* PBXTextBookmark */ = 1FA38C99124D341C004B8852 /* PBXTextBookmark */;
- 1FA38C9A124D341C004B8852 /* PBXTextBookmark */ = 1FA38C9A124D341C004B8852 /* PBXTextBookmark */;
- 1FA38C9B124D34F4004B8852 /* PBXTextBookmark */ = 1FA38C9B124D34F4004B8852 /* PBXTextBookmark */;
- 1FA38C9E124D3516004B8852 /* PBXTextBookmark */ = 1FA38C9E124D3516004B8852 /* PBXTextBookmark */;
- 1FA38CA8124D3666004B8852 /* PBXTextBookmark */ = 1FA38CA8124D3666004B8852 /* PBXTextBookmark */;
- 1FA38CAB124D3695004B8852 /* PBXTextBookmark */ = 1FA38CAB124D3695004B8852 /* PBXTextBookmark */;
- 1FA38CAF124D36B6004B8852 /* PBXTextBookmark */ = 1FA38CAF124D36B6004B8852 /* PBXTextBookmark */;
- 1FA38CB3124D3718004B8852 /* PBXTextBookmark */ = 1FA38CB3124D3718004B8852 /* PBXTextBookmark */;
- 1FA38CB5124D3736004B8852 /* PBXTextBookmark */ = 1FA38CB5124D3736004B8852 /* PBXTextBookmark */;
- 1FA38CB8124D3793004B8852 /* PBXTextBookmark */ = 1FA38CB8124D3793004B8852 /* PBXTextBookmark */;
- 1FA38CBB124D37B2004B8852 /* PBXTextBookmark */ = 1FA38CBB124D37B2004B8852 /* PBXTextBookmark */;
- 1FA38CBE124D3887004B8852 /* PBXTextBookmark */ = 1FA38CBE124D3887004B8852 /* PBXTextBookmark */;
- 1FA38CBF124D3897004B8852 /* PBXTextBookmark */ = 1FA38CBF124D3897004B8852 /* PBXTextBookmark */;
- 1FA38CC1124D38C2004B8852 /* PBXTextBookmark */ = 1FA38CC1124D38C2004B8852 /* PBXTextBookmark */;
- 1FA38CD8124D437C004B8852 /* PBXTextBookmark */ = 1FA38CD8124D437C004B8852 /* PBXTextBookmark */;
- 1FA38CD9124D437D004B8852 /* PBXTextBookmark */ = 1FA38CD9124D437D004B8852 /* PBXTextBookmark */;
1FA38CDA124D437D004B8852 /* PBXTextBookmark */ = 1FA38CDA124D437D004B8852 /* PBXTextBookmark */;
- 1FA38CDB124D437D004B8852 /* PBXBookmark */ = 1FA38CDB124D437D004B8852 /* PBXBookmark */;
- 1FA38CDC124D437D004B8852 /* PlistBookmark */ = 1FA38CDC124D437D004B8852 /* PlistBookmark */;
+ 1FF67B481294919400CA07A3 /* PBXTextBookmark */ = 1FF67B481294919400CA07A3 /* PBXTextBookmark */;
+ 1FF67B491294919400CA07A3 /* PBXTextBookmark */ = 1FF67B491294919400CA07A3 /* PBXTextBookmark */;
+ 1FF67B4A1294919400CA07A3 /* PlistBookmark */ = 1FF67B4A1294919400CA07A3 /* PlistBookmark */;
+ 1FF67B4B1294919400CA07A3 /* PBXTextBookmark */ = 1FF67B4B1294919400CA07A3 /* PBXTextBookmark */;
+ 1FF67BEC1294A39500CA07A3 /* PBXTextBookmark */ = 1FF67BEC1294A39500CA07A3 /* PBXTextBookmark */;
+ 1FF67C0B1294A9BE00CA07A3 /* PBXTextBookmark */ = 1FF67C0B1294A9BE00CA07A3 /* PBXTextBookmark */;
+ 1FF67C0C1294A9BE00CA07A3 /* PBXTextBookmark */ = 1FF67C0C1294A9BE00CA07A3 /* PBXTextBookmark */;
+ 1FF67C6B1294AEA400CA07A3 /* PBXTextBookmark */ = 1FF67C6B1294AEA400CA07A3 /* PBXTextBookmark */;
};
sourceControlManager = 1FA38C37124D2426004B8852 /* Source Control */;
userBuildSettings = {
};
};
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {832, 835}}";
+ sepNavSelRange = "{0, 0}";
+ sepNavVisRange = "{0, 247}";
+ };
+ };
8D1107260486CEB800E47090 /* Speaker */ = {
activeExec = 0;
executables = (
diff --git a/Speaker.xcodeproj/project.pbxproj b/Speaker.xcodeproj/project.pbxproj
index fe7b9b2..ad9d641 100644
--- a/Speaker.xcodeproj/project.pbxproj
+++ b/Speaker.xcodeproj/project.pbxproj
@@ -10,6 +10,7 @@
1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; };
1FA38C49124D27C8004B8852 /* play-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FA38C48124D27C8004B8852 /* play-icon.png */; };
1FA38CD3124D4349004B8852 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1FA38CD2124D4349004B8852 /* Icon.icns */; };
+ 1FF67B3E12948FDE00CA07A3 /* SpeakerApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */; };
256AC3DA0F4B6AC300CF3369 /* SpeakerAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */; };
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
@@ -23,6 +24,8 @@
1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; };
1FA38C48124D27C8004B8852 /* play-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "play-icon.png"; sourceTree = ""; };
1FA38CD2124D4349004B8852 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = ""; };
+ 1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeakerApplication.h; sourceTree = ""; };
+ 1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpeakerApplication.m; sourceTree = ""; };
256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeakerAppDelegate.h; sourceTree = ""; };
256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpeakerAppDelegate.m; sourceTree = ""; };
256AC3F00F4B6AF500CF3369 /* Speaker_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speaker_Prefix.pch; sourceTree = ""; };
@@ -50,6 +53,8 @@
children = (
256AC3D80F4B6AC300CF3369 /* SpeakerAppDelegate.h */,
256AC3D90F4B6AC300CF3369 /* SpeakerAppDelegate.m */,
+ 1FF67B3C12948FDE00CA07A3 /* SpeakerApplication.h */,
+ 1FF67B3D12948FDE00CA07A3 /* SpeakerApplication.m */,
);
name = Classes;
sourceTree = "";
@@ -188,6 +193,7 @@
files = (
8D11072D0486CEB800E47090 /* main.m in Sources */,
256AC3DA0F4B6AC300CF3369 /* SpeakerAppDelegate.m in Sources */,
+ 1FF67B3E12948FDE00CA07A3 /* SpeakerApplication.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/SpeakerAppDelegate.h b/SpeakerAppDelegate.h
index 1974f6b..02993f1 100644
--- a/SpeakerAppDelegate.h
+++ b/SpeakerAppDelegate.h
@@ -8,16 +8,19 @@
#import
-@interface SpeakerAppDelegate : NSObject {
+@interface SpeakerAppDelegate : NSObject {
NSWindow *window;
NSTextView *textView;
NSSpeechSynthesizer *synth;
NSRange oldRange;
+ BOOL isNewLocation;
}
@property (assign) IBOutlet NSWindow *window;
@property (retain, nonatomic) IBOutlet NSTextView *textView;
-(IBAction)speakAction:(id)sender;
+-(IBAction)seekForward:(id)sender;
+-(IBAction)seekBack:(id)sender;
@end
diff --git a/SpeakerAppDelegate.m b/SpeakerAppDelegate.m
index 050cf10..f057897 100644
--- a/SpeakerAppDelegate.m
+++ b/SpeakerAppDelegate.m
@@ -15,16 +15,39 @@
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
synth = [[NSSpeechSynthesizer alloc] init];
+ synth.delegate = self;
oldRange = NSMakeRange(-1, -1);
+ isNewLocation = YES;
+
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ NSString *string = [defaults objectForKey:@"text"];
+ if (string) {
+ NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string];
+ [[textView textStorage] setAttributedString:attributedString];
+ [attributedString release];
+ NSRange aRange = NSMakeRange([defaults integerForKey:@"startLocation"], 0);
+ [textView setSelectedRange:aRange];
+ [textView scrollRangeToVisible:aRange];
+ }
+}
+
+- (void)applicationWillTerminate:(NSNotification *)aNotification {
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults setInteger:[textView selectedRange].location forKey:@"startLocation"];
+ [defaults setObject:[[textView textStorage] string] forKey:@"text"];
+ [defaults synchronize];
}
-(IBAction)speakAction:(id)sender {
-
if ([synth isSpeaking]) {
[synth pauseSpeakingAtBoundary:NSSpeechWordBoundary];
+ [textView setEditable:YES];
} else {
+
+ [textView setEditable:NO];
+
NSRange range = [textView selectedRange];
if (range.location == [[[textView textStorage] string] length]) {
@@ -33,7 +56,8 @@
[textView scrollRangeToVisible:NSMakeRange(0,0)];
}
- if (range.length != oldRange.length || range.location != oldRange.location) {
+ if (range.length != oldRange.length || range.location != oldRange.location || isNewLocation) {
+ isNewLocation = NO;
NSString *wholeText = [[textView textStorage] string];
NSString *text = nil;
@@ -50,10 +74,40 @@
} else {
[synth continueSpeaking];
-
+
}
}
}
+-(IBAction)seekForward:(id)sender {
+ // not working yet
+ /*
+ [self speakAction:self];
+ NSRange selected = [textView selectedRange];
+ NSString *wholeText = [[textView textStorage] string];
+ NSRange position = [wholeText rangeOfString:@". " options:NSLiteralSearch range:NSMakeRange(selected.location + 1, [wholeText length] - selected.location - 1)];
+ [textView setSelectedRange:NSMakeRange(position.location + 2, 0)];
+ isNewLocation = YES;
+ NSLog(@"sp %i", [synth isSpeaking]);
+ [self speakAction:self];
+ */
+}
+
+-(IBAction)seekBack:(id)sender {
+
+}
+
+- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)wordToSpeak ofString:(NSString *)text {
+ NSRange range = NSMakeRange(oldRange.location + wordToSpeak.location, wordToSpeak.length);
+ [textView scrollRangeToVisible:range];
+ [textView setSelectedRange:NSMakeRange(range.location, 0)];
+ [textView showFindIndicatorForRange:range];
+}
+
+- (void)dealloc {
+ [synth release];
+ [super dealloc];
+}
+
@end
diff --git a/SpeakerApplication.h b/SpeakerApplication.h
new file mode 100644
index 0000000..7b61114
--- /dev/null
+++ b/SpeakerApplication.h
@@ -0,0 +1,18 @@
+//
+// SpeakerApplication.h
+// Speaker
+//
+// Created by Jeena on 17.11.10.
+// Copyright 2010 __MyCompanyName__. All rights reserved.
+//
+
+#import
+
+
+@interface SpeakerApplication : NSApplication {
+
+}
+
+- (void)mediaKeyEvent:(int)key state:(BOOL)state;
+
+@end
diff --git a/SpeakerApplication.m b/SpeakerApplication.m
new file mode 100644
index 0000000..ea2c0cc
--- /dev/null
+++ b/SpeakerApplication.m
@@ -0,0 +1,60 @@
+//
+// SpeakerApplication.m
+// Speaker
+//
+// Created by Jeena on 17.11.10.
+// Copyright 2010 __MyCompanyName__. All rights reserved.
+//
+
+// from http://www.rogueamoeba.com/utm/2007/09/29/
+
+#import "SpeakerApplication.h"
+#import
+#import "SpeakerAppDelegate.h"
+
+
+@implementation SpeakerApplication
+
+- (void)sendEvent:(NSEvent *)event
+{
+ // Catch media key events
+ if ([event type] == NSSystemDefined && [event subtype] == 8)
+ {
+ int keyCode = (([event data1] & 0xFFFF0000) >> 16);
+ int keyFlags = ([event data1] & 0x0000FFFF);
+ int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
+
+ // Process the media key event and return
+ [self mediaKeyEvent:keyCode state:keyState];
+ return;
+ }
+
+ // Continue on to super
+ [super sendEvent:event];
+}
+
+- (void)mediaKeyEvent:(int)key state:(BOOL)state
+{
+ switch (key)
+ {
+ // Play pressed
+ case NX_KEYTYPE_PLAY:
+ if (state == NO)
+ [(SpeakerAppDelegate *)[self delegate] speakAction:self];
+ break;
+
+ // Rewind
+ case NX_KEYTYPE_FAST:
+ if (state == YES)
+ [(SpeakerAppDelegate *)[self delegate] seekForward:self];
+ break;
+
+ // Previous
+ case NX_KEYTYPE_REWIND:
+ if (state == YES)
+ [(SpeakerAppDelegate *)[self delegate] seekBack:self];
+ break;
+ }
+}
+
+@end