[Unison-hackers] [unison-svn] r527 - in trunk/src: . lwt system ubase uimac14 uimac14/English.lproj uimac14/Frameworks uimac14/Frameworks/Growl.framework uimac14/Frameworks/Growl.framework/Headers uimac14/Frameworks/Growl.framework/Resources uimac14/Frameworks/Growl.framework/Versions uimac14/Frameworks/Growl.framework/Versions/A uimac14/Frameworks/Growl.framework/Versions/A/Headers uimac14/Frameworks/Growl.framework/Versions/A/Resources uimac14/Frameworks/Growl.framework/Versions/Current uimac14/Frameworks/Growl.framework/Versions/Current/Headers uimac14/Frameworks/Growl.framework/Versions/Current/Resources uimac14/progressicons uimac14/ssselectabletoolbar uimac14/tableicons uimac14/toolbar uimac14/uimacnew.xcodeproj uimacnew
bcpierce at seas.upenn.edu
bcpierce at seas.upenn.edu
Sat Jul 5 17:55:21 EDT 2014
Author: bcpierce
Date: 2014-07-05 17:55:19 -0400 (Sat, 05 Jul 2014)
New Revision: 527
Added:
trunk/src/uimac14/
trunk/src/uimac14/Bridge.h
trunk/src/uimac14/Bridge.m
trunk/src/uimac14/ColorGradientView.h
trunk/src/uimac14/ColorGradientView.m
trunk/src/uimac14/English.lproj/
trunk/src/uimac14/English.lproj/InfoPlist.strings
trunk/src/uimac14/English.lproj/MainMenu.xib
trunk/src/uimac14/Frameworks/
trunk/src/uimac14/Frameworks/Growl.framework/
trunk/src/uimac14/Frameworks/Growl.framework/Growl
trunk/src/uimac14/Frameworks/Growl.framework/Headers/
trunk/src/uimac14/Frameworks/Growl.framework/Headers/Growl.h
trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge-Carbon.h
trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge.h
trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlDefines.h
trunk/src/uimac14/Frameworks/Growl.framework/Resources/
trunk/src/uimac14/Frameworks/Growl.framework/Resources/Info.plist
trunk/src/uimac14/Frameworks/Growl.framework/Versions/
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Growl
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/Growl.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Resources/
trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Resources/Info.plist
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Growl
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/Growl.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge-Carbon.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlDefines.h
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Resources/
trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Resources/Info.plist
trunk/src/uimac14/ImageAndTextCell.h
trunk/src/uimac14/ImageAndTextCell.m
trunk/src/uimac14/Info.plist
trunk/src/uimac14/Info.plist.template
trunk/src/uimac14/MyController.h
trunk/src/uimac14/MyController.m
trunk/src/uimac14/NotificationController.h
trunk/src/uimac14/NotificationController.m
trunk/src/uimac14/PreferencesController.h
trunk/src/uimac14/PreferencesController.m
trunk/src/uimac14/ProfileController.h
trunk/src/uimac14/ProfileController.m
trunk/src/uimac14/ProfileTableView.h
trunk/src/uimac14/ProfileTableView.m
trunk/src/uimac14/ProgressCell.h
trunk/src/uimac14/ProgressCell.m
trunk/src/uimac14/ReconItem.h
trunk/src/uimac14/ReconItem.m
trunk/src/uimac14/ReconTableView.h
trunk/src/uimac14/ReconTableView.m
trunk/src/uimac14/TrevorsUnison.icns
trunk/src/uimac14/Unison.icns
trunk/src/uimac14/UnisonToolbar.h
trunk/src/uimac14/UnisonToolbar.m
trunk/src/uimac14/cltool.c
trunk/src/uimac14/main.m
trunk/src/uimac14/progressicons/
trunk/src/uimac14/progressicons/ProgressBarAdvanced.png
trunk/src/uimac14/progressicons/ProgressBarBlue.png
trunk/src/uimac14/progressicons/ProgressBarEndAdvanced.png
trunk/src/uimac14/progressicons/ProgressBarEndBlue.png
trunk/src/uimac14/progressicons/ProgressBarEndGray.png
trunk/src/uimac14/progressicons/ProgressBarEndGreen.png
trunk/src/uimac14/progressicons/ProgressBarEndWhite.png
trunk/src/uimac14/progressicons/ProgressBarGray.png
trunk/src/uimac14/progressicons/ProgressBarGreen.png
trunk/src/uimac14/progressicons/ProgressBarLightGreen.png
trunk/src/uimac14/progressicons/ProgressBarWhite.png
trunk/src/uimac14/ssselectabletoolbar/
trunk/src/uimac14/ssselectabletoolbar/README
trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.h
trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.m
trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.h
trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.m
trunk/src/uimac14/tableicons/
trunk/src/uimac14/tableicons/Change_Absent.png
trunk/src/uimac14/tableicons/Change_Created.png
trunk/src/uimac14/tableicons/Change_Deleted.png
trunk/src/uimac14/tableicons/Change_Modified.png
trunk/src/uimac14/tableicons/Change_PropsChanged.png
trunk/src/uimac14/tableicons/Change_Unmodified.png
trunk/src/uimac14/tableicons/Outline-Deep.png
trunk/src/uimac14/tableicons/Outline-Flat.png
trunk/src/uimac14/tableicons/Outline-Flattened.png
trunk/src/uimac14/tableicons/table-conflict.tif
trunk/src/uimac14/tableicons/table-error.tif
trunk/src/uimac14/tableicons/table-left-blue.tif
trunk/src/uimac14/tableicons/table-left-green.tif
trunk/src/uimac14/tableicons/table-merge.tif
trunk/src/uimac14/tableicons/table-mixed.tif
trunk/src/uimac14/tableicons/table-right-blue.tif
trunk/src/uimac14/tableicons/table-right-green.tif
trunk/src/uimac14/tableicons/table-skip.tif
trunk/src/uimac14/toolbar/
trunk/src/uimac14/toolbar/add.tif
trunk/src/uimac14/toolbar/diff.tif
trunk/src/uimac14/toolbar/go.tif
trunk/src/uimac14/toolbar/left.tif
trunk/src/uimac14/toolbar/merge.tif
trunk/src/uimac14/toolbar/quit.tif
trunk/src/uimac14/toolbar/rescan.tif
trunk/src/uimac14/toolbar/restart.tif
trunk/src/uimac14/toolbar/right.tif
trunk/src/uimac14/toolbar/save.tif
trunk/src/uimac14/toolbar/skip.tif
trunk/src/uimac14/uimacnew.xcodeproj/
trunk/src/uimac14/uimacnew.xcodeproj/project.pbxproj
Removed:
trunk/src/uimac/
trunk/src/uimacnew09/
Modified:
trunk/src/Makefile.OCaml
trunk/src/RECENTNEWS
trunk/src/abort.ml
trunk/src/bytearray.ml
trunk/src/bytearray.mli
trunk/src/bytearray_stubs.c
trunk/src/case.ml
trunk/src/case.mli
trunk/src/checksum.ml
trunk/src/checksum.mli
trunk/src/clroot.ml
trunk/src/clroot.mli
trunk/src/common.ml
trunk/src/common.mli
trunk/src/copy.ml
trunk/src/external.ml
trunk/src/external.mli
trunk/src/fileinfo.ml
trunk/src/fileinfo.mli
trunk/src/files.ml
trunk/src/files.mli
trunk/src/fileutil.ml
trunk/src/fileutil.mli
trunk/src/fingerprint.ml
trunk/src/fingerprint.mli
trunk/src/fpcache.ml
trunk/src/fpcache.mli
trunk/src/fs.ml
trunk/src/fs.mli
trunk/src/fspath.ml
trunk/src/fspath.mli
trunk/src/fswatch.ml
trunk/src/fswatch.mli
trunk/src/fswatchold.ml
trunk/src/globals.ml
trunk/src/globals.mli
trunk/src/linkgtk.ml
trunk/src/linkgtk2.ml
trunk/src/linktext.ml
trunk/src/lock.ml
trunk/src/lock.mli
trunk/src/lwt/depend
trunk/src/lwt/pqueue.ml
trunk/src/lwt/pqueue.mli
trunk/src/main.ml
trunk/src/mkProjectInfo.ml
trunk/src/name.ml
trunk/src/name.mli
trunk/src/os.ml
trunk/src/os.mli
trunk/src/osx.ml
trunk/src/osx.mli
trunk/src/path.ml
trunk/src/path.mli
trunk/src/pixmaps.ml
trunk/src/pred.ml
trunk/src/pred.mli
trunk/src/props.ml
trunk/src/props.mli
trunk/src/recon.ml
trunk/src/recon.mli
trunk/src/remote.ml
trunk/src/remote.mli
trunk/src/sortri.ml
trunk/src/sortri.mli
trunk/src/stasher.ml
trunk/src/strings.ml
trunk/src/strings.mli
trunk/src/system.ml
trunk/src/system.mli
trunk/src/system/system_generic.ml
trunk/src/system/system_intf.ml
trunk/src/system/system_win.ml
trunk/src/terminal.ml
trunk/src/test.ml
trunk/src/test.mli
trunk/src/transfer.ml
trunk/src/transfer.mli
trunk/src/transport.ml
trunk/src/transport.mli
trunk/src/tree.ml
trunk/src/tree.mli
trunk/src/ubase/depend
trunk/src/ubase/proplist.ml
trunk/src/ubase/proplist.mli
trunk/src/ubase/rx.ml
trunk/src/ubase/rx.mli
trunk/src/ubase/safelist.ml
trunk/src/ubase/safelist.mli
trunk/src/ubase/trace.ml
trunk/src/ubase/trace.mli
trunk/src/ubase/uarg.ml
trunk/src/ubase/util.ml
trunk/src/ubase/util.mli
trunk/src/ui.mli
trunk/src/uicommon.ml
trunk/src/uicommon.mli
trunk/src/uigtk2.ml
trunk/src/uigtk2.mli
trunk/src/uimacbridgenew.ml
trunk/src/uimacnew/Info.plist.template
trunk/src/uitext.ml
trunk/src/uitext.mli
trunk/src/unicode.ml
trunk/src/unicode.mli
trunk/src/update.ml
trunk/src/update.mli
trunk/src/uutil.ml
trunk/src/uutil.mli
trunk/src/xferhint.ml
trunk/src/xferhint.mli
Log:
* Incorporated a refresh of the OSX GUI, contributed by Alan Shutko.
* Update dates in copyright notices
* Tidying for beta-release
Modified: trunk/src/Makefile.OCaml
===================================================================
--- trunk/src/Makefile.OCaml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/Makefile.OCaml 2014-07-05 21:55:19 UTC (rev 527)
@@ -71,7 +71,7 @@
# UISTYLE=gtk2
# UISTYLE=mac (old and limited, but working)
# UISTYLE=macnew (spiffier)
-# UISTYLE=macnew09 (even spiffier, but not yet extensively tested)
+# UISTYLE=mac14 (even spiffier, but not yet extensively tested)
#
# This should be set to an appropriate value automatically, depending
# on whether the lablgtk library is available
@@ -80,7 +80,7 @@
##BCP [3/2007]: Removed temporarily, since the OSX UI is not working well
## at the moment and we don't want to confuse people by building it by default
ifeq ($(OSARCH),osx)
- UISTYLE=macnew09
+ UISTYLE=mac14
else
ifeq ($(wildcard $(LABLGTK2LIB)),$(LABLGTK2LIB))
UISTYLE=gtk2
@@ -178,9 +178,9 @@
buildexecutable:: macexecutable
UIMACDIR=uimacnew
else
-ifeq ($(UISTYLE),macnew09)
+ifeq ($(UISTYLE),mac14)
buildexecutable:: macexecutable
- UIMACDIR=uimacnew09
+ UIMACDIR=uimac14
else
buildexecutable:: $(NAME)$(EXEC_EXT)
endif
@@ -263,8 +263,8 @@
INCLFLAGS+=-thread
endif
-## New Mac UI, 2009 version
-ifeq ($(UISTYLE),macnew09)
+## New Mac UI, 2014 version
+ifeq ($(UISTYLE),mac14)
OCAMLOBJS+=uimacbridgenew.cmo
THREADS=true
OCAMLLIBS+=threads.cma
Modified: trunk/src/RECENTNEWS
===================================================================
--- trunk/src/RECENTNEWS 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/RECENTNEWS 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,3 +1,12 @@
+CHANGES FROM VERSION 2.47.0
+
+* Incorporated a refresh of the OSX GUI, contributed by Alan Shutko.
+
+* Update dates in copyright notices
+
+* Tidying for beta-release
+
+-------------------------------
CHANGES FROM VERSION 2.46.20
* Incorporated patch from Irányossy Knoblauch Artúr to make temp file
Modified: trunk/src/abort.ml
===================================================================
--- trunk/src/abort.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/abort.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/abort.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/bytearray.ml
===================================================================
--- trunk/src/bytearray.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/bytearray.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/bytearray.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/bytearray.mli
===================================================================
--- trunk/src/bytearray.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/bytearray.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/bytearray.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type t =
(char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t
Modified: trunk/src/bytearray_stubs.c
===================================================================
--- trunk/src/bytearray_stubs.c 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/bytearray_stubs.c 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
/* Unison file synchronizer: src/bytearray_stubs.c */
-/* Copyright 1999-2012 (see COPYING for details) */
+/* Copyright 1999-2014 (see COPYING for details) */
#include <string.h>
Modified: trunk/src/case.ml
===================================================================
--- trunk/src/case.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/case.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/case.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/case.mli
===================================================================
--- trunk/src/case.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/case.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/case.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
val caseInsensitiveMode : [`True|`False|`Default] Prefs.t
val unicodeEncoding : bool Prefs.t
Modified: trunk/src/checksum.ml
===================================================================
--- trunk/src/checksum.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/checksum.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/checksum.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/checksum.mli
===================================================================
--- trunk/src/checksum.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/checksum.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/checksum.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type t = int
type u = int array
Modified: trunk/src/clroot.ml
===================================================================
--- trunk/src/clroot.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/clroot.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/clroot.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/clroot.mli
===================================================================
--- trunk/src/clroot.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/clroot.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/clroot.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Command-line roots *)
type clroot =
Modified: trunk/src/common.ml
===================================================================
--- trunk/src/common.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/common.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/common.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/common.mli
===================================================================
--- trunk/src/common.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/common.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/common.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(***************************************************************************)
(* COMMON TYPES USED BY ALL MODULES *)
Modified: trunk/src/copy.ml
===================================================================
--- trunk/src/copy.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/copy.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/copy.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/external.ml
===================================================================
--- trunk/src/external.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/external.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/external.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/external.mli
===================================================================
--- trunk/src/external.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/external.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/external.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
val runExternalProgram : string -> (Unix.process_status * string) Lwt.t
val readChannelTillEof : in_channel -> string
Modified: trunk/src/fileinfo.ml
===================================================================
--- trunk/src/fileinfo.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fileinfo.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fileinfo.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/fileinfo.mli
===================================================================
--- trunk/src/fileinfo.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fileinfo.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fileinfo.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type typ = [`ABSENT | `FILE | `DIRECTORY | `SYMLINK]
val type2string : typ -> string
Modified: trunk/src/files.ml
===================================================================
--- trunk/src/files.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/files.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/files.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/files.mli
===================================================================
--- trunk/src/files.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/files.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/files.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* As usual, these functions should only be called by the client (i.e., in *)
(* the same address space as the user interface). *)
Modified: trunk/src/fileutil.ml
===================================================================
--- trunk/src/fileutil.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fileutil.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fileutil.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/fileutil.mli
===================================================================
--- trunk/src/fileutil.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fileutil.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fileutil.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Convert backslashes in a string to forward slashes. Useful in Windows. *)
val backslashes2forwardslashes : string -> string
Modified: trunk/src/fingerprint.ml
===================================================================
--- trunk/src/fingerprint.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fingerprint.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fingerprint.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/fingerprint.mli
===================================================================
--- trunk/src/fingerprint.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fingerprint.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fingerprint.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type t
Modified: trunk/src/fpcache.ml
===================================================================
--- trunk/src/fpcache.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fpcache.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fpcache.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/fpcache.mli
===================================================================
--- trunk/src/fpcache.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fpcache.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fpcache.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Initialize the cache *)
val init : bool -> bool -> System.fspath -> unit
Modified: trunk/src/fs.ml
===================================================================
--- trunk/src/fs.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fs.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fs.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/fs.mli
===================================================================
--- trunk/src/fs.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fs.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fs.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Operations on fspaths *)
Modified: trunk/src/fspath.ml
===================================================================
--- trunk/src/fspath.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fspath.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fspath.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/fspath.mli
===================================================================
--- trunk/src/fspath.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fspath.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fspath.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Defines an abstract type of absolute filenames (fspaths) *)
Modified: trunk/src/fswatch.ml
===================================================================
--- trunk/src/fswatch.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fswatch.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fswatch.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/fswatch.mli
===================================================================
--- trunk/src/fswatch.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fswatch.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fswatch.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type archiveHash = string
Modified: trunk/src/fswatchold.ml
===================================================================
--- trunk/src/fswatchold.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/fswatchold.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/fswatcherold.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/globals.ml
===================================================================
--- trunk/src/globals.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/globals.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/globals.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/globals.mli
===================================================================
--- trunk/src/globals.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/globals.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/globals.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Global variables and functions needed by top-level modules and user *)
(* interfaces *)
Modified: trunk/src/linkgtk.ml
===================================================================
--- trunk/src/linkgtk.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/linkgtk.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/linkgtk.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/linkgtk2.ml
===================================================================
--- trunk/src/linkgtk2.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/linkgtk2.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/linkgtk2.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/linktext.ml
===================================================================
--- trunk/src/linktext.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/linktext.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/linktext.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/lock.ml
===================================================================
--- trunk/src/lock.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/lock.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/lock.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/lock.mli
===================================================================
--- trunk/src/lock.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/lock.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/lock.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* A simple utility module for setting and releasing inter-process locks
using entries in the filesystem. *)
Modified: trunk/src/lwt/depend
===================================================================
--- trunk/src/lwt/depend 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/lwt/depend 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,12 +1,12 @@
-lwt.cmo: lwt.cmi
-lwt.cmx: lwt.cmi
-lwt_unix.cmo: lwt_unix.cmi
-lwt_unix.cmx: lwt_unix.cmi
-lwt_util.cmo: lwt.cmi lwt_util.cmi
-lwt_util.cmx: lwt.cmx lwt_util.cmi
-pqueue.cmo: pqueue.cmi
-pqueue.cmx: pqueue.cmi
-lwt.cmi:
-lwt_unix.cmi: lwt.cmi
-lwt_util.cmi: lwt.cmi
-pqueue.cmi:
+lwt.cmo : lwt.cmi
+lwt.cmx : lwt.cmi
+lwt_unix.cmo : lwt_unix.cmi
+lwt_unix.cmx : lwt_unix.cmi
+lwt_util.cmo : lwt.cmi lwt_util.cmi
+lwt_util.cmx : lwt.cmx lwt_util.cmi
+pqueue.cmo : pqueue.cmi
+pqueue.cmx : pqueue.cmi
+lwt.cmi :
+lwt_unix.cmi : lwt.cmi
+lwt_util.cmi : lwt.cmi
+pqueue.cmi :
Modified: trunk/src/lwt/pqueue.ml
===================================================================
--- trunk/src/lwt/pqueue.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/lwt/pqueue.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/lwt/pqueue.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/lwt/pqueue.mli
===================================================================
--- trunk/src/lwt/pqueue.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/lwt/pqueue.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/lwt/pqueue.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
module type OrderedType =
sig
Modified: trunk/src/main.ml
===================================================================
--- trunk/src/main.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/main.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/main.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -127,9 +127,9 @@
let catch_all f =
try
- Util.msg "Starting catch_all...\n";
+ (* Util.msg "Starting catch_all...\n"; *)
f ();
- Util.msg "Done catch_all...\n";
+ (* Util.msg "Done catch_all...\n"; *)
with e ->
Util.msg "Unison failed: %s\n" (Uicommon.exn2string e); exit 1;;
Modified: trunk/src/mkProjectInfo.ml
===================================================================
--- trunk/src/mkProjectInfo.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/mkProjectInfo.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -5,8 +5,8 @@
let projectName = "unison"
let majorVersion = 2
-let minorVersion = 46
-let pointVersionOrigin = 504 (* Revision that corresponds to point version 0 *)
+let minorVersion = 47
+let pointVersionOrigin = 526 (* Revision that corresponds to point version 0 *)
(* Documentation:
This is a program to construct a version of the form Major.Minor.Point,
@@ -92,3 +92,4 @@
+
Modified: trunk/src/name.ml
===================================================================
--- trunk/src/name.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/name.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/name.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/name.mli
===================================================================
--- trunk/src/name.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/name.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/name.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type t
Modified: trunk/src/os.ml
===================================================================
--- trunk/src/os.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/os.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/os.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/os.mli
===================================================================
--- trunk/src/os.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/os.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/os.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
val myCanonicalHostName : unit -> string
Modified: trunk/src/osx.ml
===================================================================
--- trunk/src/osx.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/osx.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/osx.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/osx.mli
===================================================================
--- trunk/src/osx.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/osx.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/osx.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
val init : bool -> unit
val isMacOSX : bool
Modified: trunk/src/path.ml
===================================================================
--- trunk/src/path.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/path.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/path.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/path.mli
===================================================================
--- trunk/src/path.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/path.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/path.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Abstract type of relative pathnames *)
type 'a path
Modified: trunk/src/pixmaps.ml
===================================================================
--- trunk/src/pixmaps.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/pixmaps.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/pixmaps.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/pred.ml
===================================================================
--- trunk/src/pred.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/pred.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/pred.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/pred.mli
===================================================================
--- trunk/src/pred.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/pred.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/pred.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Predicates over paths.
Modified: trunk/src/props.ml
===================================================================
--- trunk/src/props.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/props.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/props.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/props.mli
===================================================================
--- trunk/src/props.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/props.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/props.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* File properties: time, permission, length, etc. *)
Modified: trunk/src/recon.ml
===================================================================
--- trunk/src/recon.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/recon.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/recon.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/recon.mli
===================================================================
--- trunk/src/recon.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/recon.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/recon.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
val reconcileAll :
?allowPartial:bool (* whether we allow partial synchronization
Modified: trunk/src/remote.ml
===================================================================
--- trunk/src/remote.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/remote.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/remote.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/remote.mli
===================================================================
--- trunk/src/remote.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/remote.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/remote.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
module Thread : sig
val unwindProtect : (unit -> 'a Lwt.t) -> (exn -> unit Lwt.t) -> 'a Lwt.t
Modified: trunk/src/sortri.ml
===================================================================
--- trunk/src/sortri.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/sortri.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/sortri.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/sortri.mli
===================================================================
--- trunk/src/sortri.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/sortri.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/sortri.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Sort a list of recon items according to the current setting of
various preferences (defined in sort.ml, and accessible from the
Modified: trunk/src/stasher.ml
===================================================================
--- trunk/src/stasher.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/stasher.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,6 +1,6 @@
(* Unison file synchronizer: src/stasher.ml *)
(* $I2: Last modified by lescuyer *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/strings.ml
===================================================================
--- trunk/src/strings.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/strings.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -7,4 +7,5 @@
Version 2.46.6\n\
\n\
"))
-::
+:: []
+
Modified: trunk/src/strings.mli
===================================================================
--- trunk/src/strings.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/strings.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,4 +1,4 @@
(* Unison file synchronizer: src/strings.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
val docs : (string * (string * string)) list
Modified: trunk/src/system/system_generic.ml
===================================================================
--- trunk/src/system/system_generic.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/system/system_generic.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/system/system_generic.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/system/system_intf.ml
===================================================================
--- trunk/src/system/system_intf.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/system/system_intf.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/system/system_intf.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/system/system_win.ml
===================================================================
--- trunk/src/system/system_win.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/system/system_win.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/system/system_win.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/system.ml
===================================================================
--- trunk/src/system.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/system.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/system.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/system.mli
===================================================================
--- trunk/src/system.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/system.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/system.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Operations on filesystem path *)
Modified: trunk/src/terminal.ml
===================================================================
--- trunk/src/terminal.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/terminal.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/terminal.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/test.ml
===================================================================
--- trunk/src/test.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/test.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/test.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/test.mli
===================================================================
--- trunk/src/test.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/test.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/test.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Internal self-tests *)
Modified: trunk/src/transfer.ml
===================================================================
--- trunk/src/transfer.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/transfer.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/transfer.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/transfer.mli
===================================================================
--- trunk/src/transfer.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/transfer.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/transfer.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(*
Rsync : general algorithm description
Modified: trunk/src/transport.ml
===================================================================
--- trunk/src/transport.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/transport.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/transport.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/transport.mli
===================================================================
--- trunk/src/transport.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/transport.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/transport.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Executes the actions implied by the reconItem list. *)
val transportItem :
Modified: trunk/src/tree.ml
===================================================================
--- trunk/src/tree.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/tree.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/tree.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/tree.mli
===================================================================
--- trunk/src/tree.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/tree.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/tree.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* An ('a, 'b) t is a tree with 'a-labeled arcs and 'b-labeled nodes. *)
(* Labeling for the internal nodes is optional *)
Modified: trunk/src/ubase/depend
===================================================================
--- trunk/src/ubase/depend 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/depend 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,27 +1,27 @@
-myMap.cmo: myMap.cmi
-myMap.cmx: myMap.cmi
-prefs.cmo: util.cmi uarg.cmi safelist.cmi prefs.cmi
-prefs.cmx: util.cmx uarg.cmx safelist.cmx prefs.cmi
-proplist.cmo: util.cmi proplist.cmi
-proplist.cmx: util.cmx proplist.cmi
-rx.cmo: rx.cmi
-rx.cmx: rx.cmi
-safelist.cmo: safelist.cmi
-safelist.cmx: safelist.cmi
-trace.cmo: util.cmi safelist.cmi prefs.cmi trace.cmi
-trace.cmx: util.cmx safelist.cmx prefs.cmx trace.cmi
-uarg.cmo: util.cmi safelist.cmi uarg.cmi
-uarg.cmx: util.cmx safelist.cmx uarg.cmi
-uprintf.cmo: uprintf.cmi
-uprintf.cmx: uprintf.cmi
-util.cmo: uprintf.cmi safelist.cmi util.cmi
-util.cmx: uprintf.cmx safelist.cmx util.cmi
-myMap.cmi:
-prefs.cmi: util.cmi
-proplist.cmi:
-rx.cmi:
-safelist.cmi:
-trace.cmi: prefs.cmi
-uarg.cmi:
-uprintf.cmi:
-util.cmi:
+myMap.cmo : myMap.cmi
+myMap.cmx : myMap.cmi
+prefs.cmo : util.cmi uarg.cmi safelist.cmi prefs.cmi
+prefs.cmx : util.cmx uarg.cmx safelist.cmx prefs.cmi
+proplist.cmo : util.cmi proplist.cmi
+proplist.cmx : util.cmx proplist.cmi
+rx.cmo : rx.cmi
+rx.cmx : rx.cmi
+safelist.cmo : safelist.cmi
+safelist.cmx : safelist.cmi
+trace.cmo : util.cmi safelist.cmi prefs.cmi trace.cmi
+trace.cmx : util.cmx safelist.cmx prefs.cmx trace.cmi
+uarg.cmo : util.cmi safelist.cmi uarg.cmi
+uarg.cmx : util.cmx safelist.cmx uarg.cmi
+uprintf.cmo : uprintf.cmi
+uprintf.cmx : uprintf.cmi
+util.cmo : uprintf.cmi safelist.cmi util.cmi
+util.cmx : uprintf.cmx safelist.cmx util.cmi
+myMap.cmi :
+prefs.cmi : util.cmi
+proplist.cmi :
+rx.cmi :
+safelist.cmi :
+trace.cmi : prefs.cmi
+uarg.cmi :
+uprintf.cmi :
+util.cmi :
Modified: trunk/src/ubase/proplist.ml
===================================================================
--- trunk/src/ubase/proplist.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/proplist.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/proplist.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/ubase/proplist.mli
===================================================================
--- trunk/src/ubase/proplist.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/proplist.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/proplist.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type 'a key
type t
Modified: trunk/src/ubase/rx.ml
===================================================================
--- trunk/src/ubase/rx.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/rx.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/rx.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/ubase/rx.mli
===================================================================
--- trunk/src/ubase/rx.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/rx.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/rx.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
type t
Modified: trunk/src/ubase/safelist.ml
===================================================================
--- trunk/src/ubase/safelist.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/safelist.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/safelist.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/ubase/safelist.mli
===================================================================
--- trunk/src/ubase/safelist.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/safelist.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/safelist.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* All functions here are tail recursive and will work for arbitrary
sized lists (unlike some of the standard ones). The intention is that
Modified: trunk/src/ubase/trace.ml
===================================================================
--- trunk/src/ubase/trace.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/trace.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/trace.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/ubase/trace.mli
===================================================================
--- trunk/src/ubase/trace.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/trace.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/trace.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* ---------------------------------------------------------------------- *)
(* Debugging support *)
Modified: trunk/src/ubase/uarg.ml
===================================================================
--- trunk/src/ubase/uarg.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/uarg.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/uarg.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* by Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
(* Slightly modified by BCP, July 1999 *)
Modified: trunk/src/ubase/util.ml
===================================================================
--- trunk/src/ubase/util.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/util.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/util.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/ubase/util.mli
===================================================================
--- trunk/src/ubase/util.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ubase/util.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ubase/util.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Miscellaneous utility functions and datatypes *)
Modified: trunk/src/ui.mli
===================================================================
--- trunk/src/ui.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/ui.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/ui.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* The module Ui provides only the user interface signature.
Implementations are provided by Uitext and Uitk. *)
Modified: trunk/src/uicommon.ml
===================================================================
--- trunk/src/uicommon.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uicommon.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/uicommon.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/uicommon.mli
===================================================================
--- trunk/src/uicommon.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uicommon.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/uicommon.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* Kinds of UI *)
type interface =
Modified: trunk/src/uigtk2.ml
===================================================================
--- trunk/src/uigtk2.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uigtk2.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/uigtk2.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/uigtk2.mli
===================================================================
--- trunk/src/uigtk2.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uigtk2.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,4 +1,4 @@
(* Unison file synchronizer: src/uigtk2.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
module Body : Uicommon.UI
Added: trunk/src/uimac14/Bridge.h
===================================================================
--- trunk/src/uimac14/Bridge.h (rev 0)
+++ trunk/src/uimac14/Bridge.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,58 @@
+//
+// Bridge.h
+// uimac
+//
+// Created by Craig Federighi on 4/25/07.
+// Copyright 2007 __MyCompanyName__. All rights reserved.
+//
+#import <Cocoa/Cocoa.h>
+
+/*
+ Bridge supports safe calling from C back to OCaml by using daemon threads
+ spawned from OCaml to make the actual calls and converting all argument / return values
+ in the OCaml thread (when in possession of the OCaml lock)
+*/
+ at interface Bridge : NSObject {
+}
++ (void)startup:(const char **)argv;
+ at end
+
+/*
+ ocamlCall(sig, funcName, [args...]);
+
+ Call ocaml function (via safe thread handoff mechanism).
+ Args/return values are converted to/from C/OCaml according to the
+ supplied type signture string. Type codes are:
+ x - void (for return type)
+ i - long
+ s - char *
+ S - NSString *
+ N - NSNumber *
+ @ - OCamlValue (see below)
+
+ Examples:
+ long count = (long)ocamlCall("iS", "lengthOfString", @"Some String");
+
+ (void)ocamlCall("x", "someVoidOCamlFunction");
+
+ OCamlValue *v = (id)ocamlCall("@Si", "makeArray", @"Some String", 10);
+ NSString s = [v getField:0 withType:'S'];
+*/
+extern void *ocamlCall(const char *argTypes, ...);
+
+// Wrapper/proxy for unconverted OCaml values
+ at interface OCamlValue : NSObject {
+ long _v;
+}
+- initWithValue:(long)v;
+
+- (void *)getField:(long)i withType:(char)t;
+ // get value by position. See ocamlCall for list of type conversion codes
+
+- (long)count;
+ // count of items in array
+
+- (long)value;
+ // returns Ocaml value directly -- not safe to use except in direct callback from OCaml
+ // (i.e. in the OCaml thread)
+ at end
Added: trunk/src/uimac14/Bridge.m
===================================================================
--- trunk/src/uimac14/Bridge.m (rev 0)
+++ trunk/src/uimac14/Bridge.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,418 @@
+//
+// Bridge.m
+// uimac
+//
+// Created by Craig Federighi on 4/25/07.
+// Copyright 1999-2008 (see COPYING for details)
+//
+
+#import "Bridge.h"
+
+/* The following two define are a workaround for an incompatibility between
+ Ocaml 3.11.2 (and older) and the Mac OS X header files */
+#define uint64 uint64_caml
+#define int64 int64_caml
+
+#define CAML_NAME_SPACE
+#include <caml/callback.h>
+#include <caml/alloc.h>
+#include <caml/mlvalues.h>
+#include <caml/memory.h>
+#include <caml/signals.h>
+#import <ExceptionHandling/NSExceptionHandler.h>
+
+#include <pthread.h>
+#include <stdarg.h>
+
+/*
+ CMF, April 2007: Alternate strategy for solving UI crashes based on
+ http://alan.petitepomme.net/cwn/2005.03.08.html#9:
+ 1) Run OCaml in a separate thread from the Cocoa main run loop.
+ 2) Handle all calls to OCaml as callbacks -- have an OCaml thread
+ hang in C-land and use mutexes and conditions to pass control from the
+ C calling thread to the OCaml callback thread.
+
+ Value Conversion Done in Bridge Thread:
+ Value creation/conversion (like calls to caml_named_value or caml_copy_string)
+ or access calls (like Field) need to occur in the OCaml thread. We do this by
+ passing C args for conversion to the bridgeThreadWait() thread.
+
+ Example of vulnerability:
+ Field(caml_reconItems,j) could dereference caml_reconItems
+ when the GC (running independently in an OCaml thread) could be moving it.
+*/
+
+pthread_mutex_t init_lock = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t init_cond = PTHREAD_COND_INITIALIZER;
+static BOOL doneInit = NO;
+
+pthread_mutex_t global_call_lock = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t global_call_cond = PTHREAD_COND_INITIALIZER;
+pthread_mutex_t global_res_lock = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t global_res_cond = PTHREAD_COND_INITIALIZER;
+
+ at implementation Bridge
+static Bridge *_instance = NULL;
+
+const char **the_argv;
+
+- (void)_ocamlStartup:(id)ignore
+{
+
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ pthread_mutex_lock(&init_lock);
+
+ /* Initialize ocaml gc, etc. */
+ caml_startup((char **)the_argv); // cast to avoid warning, caml_startup assumes non-const,
+ // NSApplicationMain assumes const
+
+ // Register these with the collector
+ // NSLog(@"*** _ocamlStartup - back from startup; signalling! (%d)", pthread_self());
+ doneInit = TRUE;
+ pthread_cond_signal(&init_cond);
+ pthread_mutex_unlock(&init_lock);
+
+ // now start the callback thread
+ // NSLog(@"*** _ocamlStartup - calling callbackThreadCreate (%d)", pthread_self());
+ value *f = caml_named_value("callbackThreadCreate");
+ (void)caml_callback_exn(*f,Val_unit);
+ [pool release];
+}
+
++ (void)startup:(const char **)argv
+{
+ if (_instance) return;
+
+ _instance = [[Bridge alloc] init];
+
+ [[NSExceptionHandler defaultExceptionHandler] setDelegate:_instance];
+ [[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask:
+ (NSLogUncaughtExceptionMask | NSLogTopLevelExceptionMask)];
+
+ // Init OCaml in another thread and wait for it to be ready
+ pthread_mutex_lock(&init_lock);
+ the_argv = argv;
+ [NSThread detachNewThreadSelector:@selector(_ocamlStartup:)
+ toTarget:_instance withObject:nil];
+
+ // NSLog(@"*** waiting for completion of caml_init");
+ while (!doneInit) pthread_cond_wait(&init_cond, &init_lock);
+ pthread_mutex_unlock(&init_lock);
+ // NSLog(@"*** caml_init complete!");
+}
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
+typedef unsigned int NSUInteger;
+#endif
+- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException *)exception mask:(NSUInteger)aMask
+{
+ // if (![[exception name] isEqual:@"OCamlException"]) return YES;
+
+ NSString *msg = [NSString stringWithFormat:@"Uncaught exception: %@", [exception reason]];
+ msg = [[msg componentsSeparatedByString:@"\n"] componentsJoinedByString:@" "];
+ NSLog(@"%@", msg);
+ NSRunAlertPanel(@"Fatal error", msg, @"Exit", nil, nil);
+ exit(1);
+ return FALSE;
+}
+
+ at end
+
+
+// CallState struct is allocated on the C thread stack and then handed
+// to the OCaml callback thread to perform value conversion and issue the call
+typedef struct {
+ enum { SafeCall, OldCall, FieldAccess } opCode;
+
+ // New style calls
+ const char *argTypes;
+ va_list args;
+
+ // Field access
+ value *valueP;
+ long fieldIndex;
+ char fieldType;
+
+ // Return values
+ char *exception;
+ void *retV;
+ BOOL _autorelease;
+
+ // for old style (unsafe) calls
+ value call, a1, a2, a3, ret;
+ int argCount;
+} CallState;
+
+static CallState *_CallState = NULL;
+static CallState *_RetState = NULL;
+
+// Our OCaml callback server thread -- waits for call then makes them
+// Called from thread spawned from OCaml
+CAMLprim value bridgeThreadWait(value ignore)
+{
+ CAMLparam0();
+ CAMLlocal1 (args);
+ args = caml_alloc_tuple(3);
+
+ // NSLog(@"*** bridgeThreadWait init! (%d) Taking lock...", pthread_self());
+ while (TRUE) {
+ // unblock ocaml while we wait for work
+ caml_enter_blocking_section();
+
+ pthread_mutex_lock(&global_call_lock);
+ while (!_CallState) pthread_cond_wait(&global_call_cond, &global_call_lock);
+
+ // pick up our work and free up the call lock for other threads
+ CallState *cs = _CallState;
+ _CallState = NULL;
+ pthread_mutex_unlock(&global_call_lock);
+
+ // NSLog(@"*** bridgeThreadWait: have call -- leaving caml_blocking_section");
+
+ // we have a call to do -- get the ocaml lock
+ caml_leave_blocking_section();
+
+ // NSLog(@"*** bridgeThreadWait: doing call");
+
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ char retType = 'v';
+ value e = Val_unit;
+ if (cs->opCode == SafeCall) {
+ int i;
+ char *fname = va_arg(cs->args, char *);
+ value *f = caml_named_value(fname);
+ // varargs with C-based args -- convert them to OCaml values based on type code string
+ const char *p = cs->argTypes;
+ retType = *p++;
+ int argCount = 0;
+ for(; *p != '\0'; p++) {
+ const char *str;
+ switch (*p) {
+ case 's':
+ str = va_arg(cs->args, const char *);
+ Store_field (args, argCount, caml_copy_string(str));
+ break;
+ case 'S':
+ str = [va_arg(cs->args, NSString *) UTF8String];
+ Store_field (args, argCount, caml_copy_string(str));
+ break;
+ case 'i':
+ Store_field (args, argCount, Val_long(va_arg(cs->args, long)));
+ break;
+ case '@':
+ Store_field (args, argCount, [va_arg(cs->args, OCamlValue *) value]);
+ break;
+ default:
+ NSCAssert1(0, @"Unknown input type '%c'", *p);
+ break;
+ }
+ argCount++;
+ NSCAssert(argCount <= 3, @"More than 3 arguments");
+ }
+ // Call OCaml -- TODO: add support for > 3 args
+ if (argCount == 3) e = caml_callback3_exn(*f,Field(args,0),Field(args,1),Field(args,2));
+ else if (argCount == 2) e = caml_callback2_exn(*f,Field(args,0),Field(args,1));
+ else if (argCount == 1) e = caml_callback_exn(*f,Field(args,0));
+ else e = caml_callback_exn(*f,Val_unit);
+ for (i = 0; i < argCount; i++) Store_field (args, i, Val_unit);
+ } else if (cs->opCode == OldCall) {
+ // old style (unsafe) version where OCaml values were passed directly from C thread
+ if (cs->argCount == 3) e = caml_callback3_exn(cs->call,cs->a1,cs->a2,cs->a3);
+ else if (cs->argCount == 2) e = caml_callback2_exn(cs->call,cs->a1,cs->a2);
+ else e = caml_callback_exn(cs->call,cs->a1);
+ retType = 'v';
+ } else if (cs->opCode == FieldAccess) {
+ long index = cs->fieldIndex;
+ e = (index == -1) ? Val_long(Wosize_val(*cs->valueP)) : Field(*cs->valueP, index);
+ retType = cs->fieldType;
+ }
+
+ // Process return value
+ cs->_autorelease = FALSE;
+ cs->ret = e; // OCaml return type -- unsafe...
+ if (!Is_exception_result(e)) {
+ switch (retType) {
+ case 'S':
+ *((NSString **)&cs->retV) = (e == Val_unit) ? NULL : [[NSString alloc] initWithUTF8String:String_val(e)];
+ cs->_autorelease = TRUE;
+ break;
+ case 'N':
+ if (Is_long (e)) {
+ *((NSNumber **)&cs->retV) = [[NSNumber alloc] initWithLong:Long_val(e)];
+ } else {
+ *((NSNumber **)&cs->retV) = [[NSNumber alloc] initWithDouble:Double_val(e)];
+ }
+ cs->_autorelease = TRUE;
+ break;
+ case '@':
+ *((NSObject **)&cs->retV) = (e == Val_unit) ? NULL : [[OCamlValue alloc] initWithValue:e];
+ cs->_autorelease = TRUE;
+ break;
+ case 'i':
+ *((long *)&cs->retV) = Long_val(e);
+ break;
+ case 'x':
+ break;
+ default:
+ NSCAssert1(0, @"Unknown return type '%c'", retType);
+ break;
+ }
+ }
+
+ if (Is_exception_result(e)) {
+ // get exception string -- it will get thrown back in the calling thread
+ value *f = caml_named_value("unisonExnInfo");
+ // We leak memory here...
+ cs->exception = strdup(String_val(caml_callback(*f,Extract_exception(e))));
+ }
+
+ [pool release];
+
+ // NSLog(@"*** bridgeThreadWait: returning");
+
+ // we're done, signal back
+ pthread_mutex_lock(&global_res_lock);
+ _RetState = cs;
+ pthread_cond_signal(&global_res_cond);
+ pthread_mutex_unlock(&global_res_lock);
+ }
+ // Never get here...
+ CAMLreturn (Val_unit);
+}
+
+void *_passCall(CallState *cs)
+{
+ pthread_mutex_lock(&global_call_lock);
+ _CallState = cs;
+
+ // signal so call can happen on other thread
+ pthread_mutex_lock(&global_res_lock);
+ pthread_cond_signal(&global_call_cond);
+ pthread_mutex_unlock(&global_call_lock);
+
+ // NSLog(@"*** _passCall (%d) -- performing signal and waiting", pthread_self());
+
+ // wait until done -- make sure the result is for our call
+ while (_RetState != cs) pthread_cond_wait(&global_res_cond, &global_res_lock);
+ _RetState = NULL;
+ pthread_mutex_unlock(&global_res_lock);
+
+ // NSLog(@"*** doCallback -- back with result");
+ if (cs->exception) {
+ @throw [NSException exceptionWithName:@"OCamlException"
+ reason:[NSString stringWithUTF8String:cs->exception]
+ userInfo:nil];
+ }
+ if (cs->_autorelease) [((id)cs->retV) autorelease];
+ return cs->retV;
+}
+
+void *ocamlCall(const char *argTypes, ...)
+{
+ CallState cs;
+ cs.opCode = SafeCall;
+ cs.exception = NULL;
+ cs.argTypes = argTypes;
+ va_start(cs.args, argTypes);
+ void * res = _passCall(&cs);
+
+ va_end(cs.args);
+ return res;
+}
+
+void *getField(value *vP, long index, char type)
+{
+ CallState cs;
+ cs.opCode = FieldAccess;
+ cs.valueP = vP;
+ cs.fieldIndex = index;
+ cs.fieldType = type;
+ cs.exception = NULL;
+ return _passCall(&cs);
+}
+
+ at implementation OCamlValue
+
+- initWithValue:(long)v
+{
+ [super init];
+ _v = v;
+ caml_register_global_root((value *)&_v);
+ return self;
+}
+
+- (long)count
+{
+ return (long)getField((value *) &_v, -1, 'i');
+}
+
+- (void *)getField:(long)i withType:(char)t
+{
+ return getField((value *)&_v, i, t);
+}
+
+- (long)value
+{
+ // Unsafe to use!
+ return _v;
+}
+
+- (void)dealloc
+{
+ _v = Val_unit;
+ caml_remove_global_root((value *)&_v);
+ [super dealloc];
+}
+ at end
+
+
+// Legacy OCaml call API -- no longer needed
+#if 0
+
+extern value doCallback (value c, int argcount, value v1, value v2, value v3, BOOL exitOnException);
+extern value Callback_checkexn(value c,value v);
+extern value Callback2_checkexn(value c,value v1,value v2);
+extern value Callback3_checkexn(value c,value v1,value v2,value v3);
+
+void reportExn(const char *msg) {
+ NSString *s = [NSString stringWithFormat:@"Uncaught exception: %s", msg];
+ s = [[s componentsSeparatedByString:@"\n"] componentsJoinedByString:@" "];
+ NSLog(@"%@",s);
+ NSRunAlertPanel(@"Fatal error",s,@"Exit",nil,nil);
+}
+
+// FIXME! Claim is that value conversion must also happen in the OCaml thread...
+value doCallback (value c, int argcount, value v1, value v2, value v3, BOOL exitOnException) {
+ // NSLog(@"*** doCallback: (%d) -- trying to acquire global lock", pthread_self());
+ CallState cs;
+ cs.opCode = OldCall;
+ cs.exception = NULL;
+ cs.call = c;
+ cs.a1 = v1;
+ cs.a2 = v2;
+ cs.a3 = v3;
+ cs.argCount = argcount;
+ @try {
+ return _passCall(&cs);
+ } @catch (NSException *ex) {
+ if (exitOnException) {
+ reportExn(cs.exception);
+ exit(1);
+ }
+ @throw ex;
+ }
+}
+
+value Callback_checkexn(value c,value v) {
+ return doCallback(c, 1, v, 0, 0, TRUE);
+}
+
+value Callback2_checkexn(value c,value v1,value v2) {
+ return doCallback(c, 2, v1, v2, 0, TRUE);
+}
+
+value Callback3_checkexn(value c,value v1,value v2,value v3) {
+ return doCallback(c, 3, v1, v2, v3, TRUE);
+}
+#endif
Added: trunk/src/uimac14/ColorGradientView.h
===================================================================
--- trunk/src/uimac14/ColorGradientView.h (rev 0)
+++ trunk/src/uimac14/ColorGradientView.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,22 @@
+//
+// ColorGradientView.h
+// uimacnew
+//
+// From http://www.katoemba.net/makesnosenseatall/2008/01/09/nsview-with-gradient-background/
+//
+
+#import <Cocoa/Cocoa.h>
+
+ at interface ColorGradientView : NSView
+{
+ NSColor *startingColor;
+ NSColor *endingColor;
+ int angle;
+}
+
+// Define the variables as properties
+ at property(nonatomic, retain) NSColor *startingColor;
+ at property(nonatomic, retain) NSColor *endingColor;
+ at property(assign) int angle;
+
+ at end
Added: trunk/src/uimac14/ColorGradientView.m
===================================================================
--- trunk/src/uimac14/ColorGradientView.m (rev 0)
+++ trunk/src/uimac14/ColorGradientView.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,46 @@
+//
+// ColorGradientView.m
+// uimacnew
+//
+// From http://www.katoemba.net/makesnosenseatall/2008/01/09/nsview-with-gradient-background/
+//
+//
+
+#import "ColorGradientView.h"
+
+ at implementation ColorGradientView
+
+// Automatically create accessor methods
+ at synthesize startingColor;
+ at synthesize endingColor;
+ at synthesize angle;
+
+- (id)initWithFrame:(NSRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ // Initialization code here.
+ [self setStartingColor:[NSColor gridColor]];
+ [self setEndingColor:[NSColor controlShadowColor]];
+ [self setAngle:270];
+ }
+ return self;
+}
+
+- (void)drawRect:(NSRect)rect {
+ if (endingColor == nil || [startingColor isEqual:endingColor]) {
+ // Fill view with a standard background color
+ [startingColor set];
+ NSRectFill(rect);
+ }
+ else {
+ // Fill view with a top-down gradient
+ // from startingColor to endingColor
+ NSGradient* aGradient = [[NSGradient alloc]
+ initWithStartingColor:startingColor
+ endingColor:endingColor];
+ [aGradient drawInRect:[self bounds] angle:angle];
+ [aGradient release];
+ }
+}
+
+ at end
Added: trunk/src/uimac14/English.lproj/InfoPlist.strings
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/English.lproj/InfoPlist.strings
===================================================================
--- trunk/src/uimac14/English.lproj/InfoPlist.strings 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/English.lproj/InfoPlist.strings 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/English.lproj/InfoPlist.strings
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/English.lproj/MainMenu.xib
===================================================================
--- trunk/src/uimac14/English.lproj/MainMenu.xib (rev 0)
+++ trunk/src/uimac14/English.lproj/MainMenu.xib 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,6239 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">10K549</string>
+ <string key="IBDocument.InterfaceBuilderVersion">851</string>
+ <string key="IBDocument.AppKitVersion">1038.36</string>
+ <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">851</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="29"/>
+ <integer value="619"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="892182555">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="37863316">
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSApplication</characters>
+ </object>
+ </object>
+ <object class="NSCustomObject" id="279913758">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="878192733">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="355605687">
+ <int key="NSWindowStyleMask">4111</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{0, 364}, {480, 360}}</string>
+ <int key="NSWTFlags">1881669632</int>
+ <string key="NSWindowTitle">Unison</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="232668648">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSSegmentedControl" id="384288444">
+ <reference key="NSNextResponder" ref="232668648"/>
+ <int key="NSvFlags">296</int>
+ <string key="NSFrame">{{370, 317}, {83, 24}}</string>
+ <reference key="NSSuperview" ref="232668648"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSSegmentedCell" key="NSCell" id="673426767">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <object class="NSFont" key="NSSupport" id="599111291">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="384288444"/>
+ <object class="NSMutableArray" key="NSSegmentImages">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSSegmentItem">
+ <double key="NSSegmentItemWidth">24</double>
+ <object class="NSCustomResource" key="NSSegmentItemImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">Outline-Flat</string>
+ </object>
+ <string key="NSSegmentItemLabel"/>
+ <int key="NSSegmentItemTag">1</int>
+ <int key="NSSegmentItemImageScaling">2</int>
+ </object>
+ <object class="NSSegmentItem">
+ <double key="NSSegmentItemWidth">25.333333969116211</double>
+ <object class="NSCustomResource" key="NSSegmentItemImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">Outline-Flattened</string>
+ </object>
+ <string key="NSSegmentItemLabel">O</string>
+ <int key="NSSegmentItemTag">2</int>
+ <bool key="NSSegmentItemSelected">YES</bool>
+ <int key="NSSegmentItemImageScaling">2</int>
+ </object>
+ <object class="NSSegmentItem">
+ <double key="NSSegmentItemWidth">25.333333969116211</double>
+ <object class="NSCustomResource" key="NSSegmentItemImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">Outline-Deep</string>
+ </object>
+ <string key="NSSegmentItemLabel">D</string>
+ <int key="NSSegmentItemTag">3</int>
+ <int key="NSSegmentItemImageScaling">2</int>
+ </object>
+ </object>
+ <int key="NSSelectedSegment">1</int>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{480, 360}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSFrameAutosaveName">mainWindow</string>
+ </object>
+ <object class="NSMenu" id="395658688">
+ <string key="NSTitle">MainMenu</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="639283572">
+ <reference key="NSMenu" ref="395658688"/>
+ <string key="NSTitle">Unison</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="151838310">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="1045142073">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="77554793">
+ <string key="NSTitle">Unison</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="551642701">
+ <reference key="NSMenu" ref="77554793"/>
+ <string key="NSTitle">About Unison</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="671453401">
+ <reference key="NSMenu" ref="77554793"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="837410352">
+ <reference key="NSMenu" ref="77554793"/>
+ <string key="NSTitle">Preferences...</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="251970986">
+ <reference key="NSMenu" ref="77554793"/>
+ <string key="NSTitle">Install command-line tool</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="227484062">
+ <reference key="NSMenu" ref="77554793"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="422290158">
+ <reference key="NSMenu" ref="77554793"/>
+ <string key="NSTitle">Hide Unison</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="693945174">
+ <reference key="NSMenu" ref="77554793"/>
+ <string key="NSTitle">Hide Others</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="67252353">
+ <reference key="NSMenu" ref="77554793"/>
+ <string key="NSTitle">Show All</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="264975518">
+ <reference key="NSMenu" ref="77554793"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="526625829">
+ <reference key="NSMenu" ref="77554793"/>
+ <string key="NSTitle">Quit Unison</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ </object>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="972866920">
+ <reference key="NSMenu" ref="395658688"/>
+ <string key="NSTitle">Edit</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="1003509484">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">Edit</characters>
+ </object>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="73613290">
+ <reference key="NSMenu" ref="1003509484"/>
+ <string key="NSTitle">Cut</string>
+ <string key="NSKeyEquiv">x</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="918382228">
+ <reference key="NSMenu" ref="1003509484"/>
+ <string key="NSTitle">Copy</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="335015660">
+ <reference key="NSMenu" ref="1003509484"/>
+ <string key="NSTitle">Paste</string>
+ <string key="NSKeyEquiv">v</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="232124595">
+ <reference key="NSMenu" ref="1003509484"/>
+ <string key="NSTitle">Select All</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="833907567">
+ <reference key="NSMenu" ref="1003509484"/>
+ <string key="NSTitle">Select Conflicts</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="504811774">
+ <reference key="NSMenu" ref="395658688"/>
+ <string key="NSTitle">Actions</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="982210092">
+ <string key="NSTitle">Actions</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="938287255">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Propagate Left to Right</string>
+ <string key="NSKeyEquiv">></string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="473554979">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Propagate Right to Left</string>
+ <string key="NSKeyEquiv"><</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="273929861">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Propagate Newer to Older</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="502496676">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Propagate Older to Newer</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="170126817">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Leave Alone</string>
+ <string key="NSKeyEquiv">/</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="907786872">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Revert to Unison's Recommendation</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="879528549">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Merge</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="973931859">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Diff</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="501412924">
+ <reference key="NSMenu" ref="982210092"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="396820968">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Restart</string>
+ <string key="NSKeyEquiv">r</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="990697150">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Rescan</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="513780384">
+ <reference key="NSMenu" ref="982210092"/>
+ <string key="NSTitle">Synchronize all</string>
+ <string key="NSKeyEquiv">g</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="827672906">
+ <reference key="NSMenu" ref="395658688"/>
+ <string key="NSTitle">Ignore</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="366294269">
+ <string key="NSTitle">Ignore</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="299441153">
+ <reference key="NSMenu" ref="366294269"/>
+ <string key="NSTitle">Ignore Path</string>
+ <string key="NSKeyEquiv">i</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="188392331">
+ <reference key="NSMenu" ref="366294269"/>
+ <string key="NSTitle">Ignore Extension</string>
+ <string key="NSKeyEquiv">e</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ <object class="NSMenuItem" id="78895812">
+ <reference key="NSMenu" ref="366294269"/>
+ <string key="NSTitle">Ignore Name</string>
+ <string key="NSKeyEquiv">n</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="425916962">
+ <reference key="NSMenu" ref="395658688"/>
+ <string key="NSTitle">Help</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="75568110">
+ <string key="NSTitle">Help</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="411336073">
+ <reference key="NSMenu" ref="75568110"/>
+ <string key="NSTitle">Unison Online Help</string>
+ <string key="NSKeyEquiv">?</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomView" id="585072836">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="568004388">
+ <reference key="NSNextResponder" ref="585072836"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{17, 236}, {329, 25}}</string>
+ <reference key="NSSuperview" ref="585072836"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="767469197">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">138412032</int>
+ <string type="base64-UTF8" key="NSContents">UGxlYXNlIGNob29zZSBhIHByb2ZpbGUgb3IgY3JlYXRlIGEgbmV3IG9uZQo</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="568004388"/>
+ <object class="NSColor" key="NSBackgroundColor" id="339352646">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="176647248">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="274191033">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor" id="465092439">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSButton" id="965369806">
+ <reference key="NSNextResponder" ref="585072836"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{651, -524}, {84, 32}}</string>
+ <reference key="NSSuperview" ref="585072836"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="841579218">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Quit</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="965369806"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="599111291"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSScrollView" id="335527590">
+ <reference key="NSNextResponder" ref="585072836"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="629016622">
+ <reference key="NSNextResponder" ref="335527590"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableView" id="446416594">
+ <reference key="NSNextResponder" ref="629016622"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{306, 190}</string>
+ <reference key="NSSuperview" ref="629016622"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTableHeaderView" key="NSHeaderView" id="1286469">
+ <reference key="NSNextResponder" ref="214885356"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{306, 17}</string>
+ <reference key="NSSuperview" ref="214885356"/>
+ <reference key="NSTableView" ref="446416594"/>
+ </object>
+ <object class="_NSCornerView" key="NSCornerView" id="626227720">
+ <reference key="NSNextResponder" ref="335527590"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{307, 0}, {16, 17}}</string>
+ <reference key="NSSuperview" ref="335527590"/>
+ </object>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn" id="347342635">
+ <string key="NSIdentifier">profiles</string>
+ <double key="NSWidth">303.47698974609375</double>
+ <double key="NSMinWidth">47.477001190185547</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Profiles</string>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">11</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="761657717">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerTextColor</string>
+ <reference key="NSColor" ref="465092439"/>
+ </object>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="214722634">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="446416594"/>
+ <object class="NSColor" key="NSBackgroundColor" id="268561989">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <reference key="NSTableView" ref="446416594"/>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3</double>
+ <double key="NSIntercellSpacingHeight">2</double>
+ <reference key="NSBackgroundColor" ref="268561989"/>
+ <object class="NSColor" key="NSGridColor" id="837222830">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ </object>
+ <double key="NSRowHeight">17</double>
+ <int key="NSTvFlags">-1035993088</int>
+ <reference key="NSDelegate"/>
+ <reference key="NSDataSource"/>
+ <int key="NSColumnAutoresizingStyle">4</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ <int key="NSTableViewDraggingDestinationStyle">0</int>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 17}, {306, 190}}</string>
+ <reference key="NSSuperview" ref="335527590"/>
+ <reference key="NSNextKeyView" ref="446416594"/>
+ <reference key="NSDocView" ref="446416594"/>
+ <object class="NSColor" key="NSBGColor" id="571804419">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="176647248"/>
+ </object>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="852809690">
+ <reference key="NSNextResponder" ref="335527590"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{307, 17}, {15, 190}}</string>
+ <reference key="NSSuperview" ref="335527590"/>
+ <reference key="NSTarget" ref="335527590"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.99473685026168823</double>
+ </object>
+ <object class="NSScroller" id="370050818">
+ <reference key="NSNextResponder" ref="335527590"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-100, -100}, {113, 15}}</string>
+ <reference key="NSSuperview" ref="335527590"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="335527590"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.99047619104385376</double>
+ </object>
+ <object class="NSClipView" id="214885356">
+ <reference key="NSNextResponder" ref="335527590"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1286469"/>
+ </object>
+ <string key="NSFrame">{{1, 0}, {306, 17}}</string>
+ <reference key="NSSuperview" ref="335527590"/>
+ <reference key="NSNextKeyView" ref="1286469"/>
+ <reference key="NSDocView" ref="1286469"/>
+ <reference key="NSBGColor" ref="571804419"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <reference ref="626227720"/>
+ </object>
+ <string key="NSFrame">{{20, 20}, {323, 208}}</string>
+ <reference key="NSSuperview" ref="585072836"/>
+ <reference key="NSNextKeyView" ref="629016622"/>
+ <int key="NSsFlags">18</int>
+ <reference key="NSVScroller" ref="852809690"/>
+ <reference key="NSHScroller" ref="370050818"/>
+ <reference key="NSContentView" ref="629016622"/>
+ <reference key="NSHeaderClipView" ref="214885356"/>
+ <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
+ </object>
+ </object>
+ <string key="NSFrameSize">{363, 281}</string>
+ <string key="NSClassName">NSView</string>
+ <string key="NSExtension">NSResponder</string>
+ </object>
+ <object class="NSCustomView" id="754336264">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSSplitView" id="398078791">
+ <reference key="NSNextResponder" ref="754336264"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSScrollView" id="319719388">
+ <reference key="NSNextResponder" ref="398078791"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="674056095">
+ <reference key="NSNextResponder" ref="319719388"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableView" id="809169243">
+ <reference key="NSNextResponder" ref="674056095"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{730, 411}</string>
+ <reference key="NSSuperview" ref="674056095"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTableHeaderView" key="NSHeaderView" id="285438200">
+ <reference key="NSNextResponder" ref="34763187"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{730, 17}</string>
+ <reference key="NSSuperview" ref="34763187"/>
+ <reference key="NSTableView" ref="809169243"/>
+ </object>
+ <object class="_NSCornerView" key="NSCornerView" id="971941000">
+ <reference key="NSNextResponder" ref="319719388"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-26, 0}, {16, 17}}</string>
+ <reference key="NSSuperview" ref="319719388"/>
+ </object>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn" id="831965848">
+ <string key="NSIdentifier">path</string>
+ <double key="NSWidth">426</double>
+ <double key="NSMinWidth">27.095703125</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Path</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor" id="783127527">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerColor</string>
+ <reference key="NSColor" ref="268561989"/>
+ </object>
+ <reference key="NSTextColor" ref="761657717"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="168643022">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <object class="NSFont" key="NSSupport" id="745083723">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">12</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="809169243"/>
+ <reference key="NSBackgroundColor" ref="571804419"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <reference key="NSTableView" ref="809169243"/>
+ <object class="NSSortDescriptor" key="NSSortDescriptorPrototype">
+ <string key="NSKey">pathSortKey</string>
+ <bool key="NSAscending">YES</bool>
+ <string key="NSSelector">compare:</string>
+ </object>
+ </object>
+ <object class="NSTableColumn" id="1030582640">
+ <string key="NSIdentifier">fileSizeString</string>
+ <double key="NSWidth">70</double>
+ <double key="NSMinWidth">70</double>
+ <double key="NSMaxWidth">70</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">134219776</int>
+ <string key="NSContents">Size</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="783127527"/>
+ <reference key="NSTextColor" ref="761657717"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="1026449157">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">67109888</int>
+ <reference key="NSSupport" ref="745083723"/>
+ <reference key="NSControlView" ref="809169243"/>
+ <reference key="NSBackgroundColor" ref="571804419"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <reference key="NSTableView" ref="809169243"/>
+ <object class="NSSortDescriptor" key="NSSortDescriptorPrototype">
+ <string key="NSKey">fileSize</string>
+ <bool key="NSAscending">NO</bool>
+ <string key="NSSelector">compare:</string>
+ </object>
+ </object>
+ <object class="NSTableColumn" id="517689164">
+ <string key="NSIdentifier">leftIcon</string>
+ <double key="NSWidth">16</double>
+ <double key="NSMinWidth">16</double>
+ <double key="NSMaxWidth">16</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents"><</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="761657717"/>
+ </object>
+ <object class="NSImageCell" key="NSDataCell" id="129611902">
+ <int key="NSCellFlags">130560</int>
+ <int key="NSCellFlags2">33554432</int>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">0</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">YES</bool>
+ </object>
+ <reference key="NSTableView" ref="809169243"/>
+ <object class="NSSortDescriptor" key="NSSortDescriptorPrototype">
+ <string key="NSKey">leftSortKey</string>
+ <bool key="NSAscending">YES</bool>
+ <string key="NSSelector">compare:</string>
+ </object>
+ </object>
+ <object class="NSTableColumn" id="174176934">
+ <string key="NSIdentifier">percentTransferred</string>
+ <double key="NSWidth">76.63916015625</double>
+ <double key="NSMinWidth">42.10107421875</double>
+ <double key="NSMaxWidth">100</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">134219776</int>
+ <string key="NSContents">Action</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="783127527"/>
+ <reference key="NSTextColor" ref="761657717"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="802031427">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">67109888</int>
+ <reference key="NSSupport" ref="745083723"/>
+ <reference key="NSControlView" ref="809169243"/>
+ <reference key="NSBackgroundColor" ref="571804419"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ <reference key="NSTableView" ref="809169243"/>
+ <object class="NSSortDescriptor" key="NSSortDescriptorPrototype">
+ <string key="NSKey">directionSortKey</string>
+ <bool key="NSAscending">YES</bool>
+ <string key="NSSelector">compare:</string>
+ </object>
+ </object>
+ <object class="NSTableColumn" id="36867386">
+ <string key="NSIdentifier">rightIcon</string>
+ <double key="NSWidth">16</double>
+ <double key="NSMinWidth">16</double>
+ <double key="NSMaxWidth">16</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">></string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="783127527"/>
+ <reference key="NSTextColor" ref="761657717"/>
+ </object>
+ <object class="NSImageCell" key="NSDataCell" id="233842594">
+ <int key="NSCellFlags">130560</int>
+ <int key="NSCellFlags2">33554432</int>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">0</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">YES</bool>
+ </object>
+ <reference key="NSTableView" ref="809169243"/>
+ <object class="NSSortDescriptor" key="NSSortDescriptorPrototype">
+ <string key="NSKey">rightSortKey</string>
+ <bool key="NSAscending">YES</bool>
+ <string key="NSSelector">compare:</string>
+ </object>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3</double>
+ <double key="NSIntercellSpacingHeight">2</double>
+ <reference key="NSBackgroundColor" ref="268561989"/>
+ <reference key="NSGridColor" ref="837222830"/>
+ <double key="NSRowHeight">18</double>
+ <int key="NSTvFlags">-635437056</int>
+ <reference key="NSDelegate"/>
+ <reference key="NSDataSource"/>
+ <int key="NSColumnAutoresizingStyle">4</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ <int key="NSTableViewDraggingDestinationStyle">0</int>
+ </object>
+ </object>
+ <string key="NSFrame">{{0, 17}, {730, 411}}</string>
+ <reference key="NSSuperview" ref="319719388"/>
+ <reference key="NSNextKeyView" ref="809169243"/>
+ <reference key="NSDocView" ref="809169243"/>
+ <reference key="NSBGColor" ref="571804419"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="626547980">
+ <reference key="NSNextResponder" ref="319719388"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-30, 17}, {15, 391}}</string>
+ <reference key="NSSuperview" ref="319719388"/>
+ <reference key="NSTarget" ref="319719388"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.96419435739517212</double>
+ </object>
+ <object class="NSScroller" id="280329492">
+ <reference key="NSNextResponder" ref="319719388"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-100, -100}, {629, 15}}</string>
+ <reference key="NSSuperview" ref="319719388"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="319719388"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.99841266870498657</double>
+ </object>
+ <object class="NSClipView" id="34763187">
+ <reference key="NSNextResponder" ref="319719388"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="285438200"/>
+ </object>
+ <string key="NSFrameSize">{730, 17}</string>
+ <reference key="NSSuperview" ref="319719388"/>
+ <reference key="NSNextKeyView" ref="285438200"/>
+ <reference key="NSDocView" ref="285438200"/>
+ <reference key="NSBGColor" ref="571804419"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <reference ref="971941000"/>
+ </object>
+ <string key="NSFrameSize">{730, 428}</string>
+ <reference key="NSSuperview" ref="398078791"/>
+ <reference key="NSNextKeyView" ref="674056095"/>
+ <int key="NSsFlags">528</int>
+ <reference key="NSVScroller" ref="626547980"/>
+ <reference key="NSHScroller" ref="280329492"/>
+ <reference key="NSContentView" ref="674056095"/>
+ <reference key="NSHeaderClipView" ref="34763187"/>
+ <reference key="NSCornerView" ref="971941000"/>
+ <bytes key="NSScrollAmts">AAAAAAAAAABBoAAAQaAAAA</bytes>
+ </object>
+ <object class="NSView" id="700068909">
+ <reference key="NSNextResponder" ref="398078791"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="173308938">
+ <reference key="NSNextResponder" ref="700068909"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrame">{{2, 5}, {726, 74}}</string>
+ <reference key="NSSuperview" ref="700068909"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="900780132">
+ <int key="NSCellFlags">69336577</int>
+ <int key="NSCellFlags2">272760832</int>
+ <string key="NSContents">Label</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="173308938"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrame">{{0, 437}, {730, 85}}</string>
+ <reference key="NSSuperview" ref="398078791"/>
+ </object>
+ </object>
+ <string key="NSFrame">{{0, 24}, {730, 522}}</string>
+ <reference key="NSSuperview" ref="754336264"/>
+ </object>
+ <object class="NSProgressIndicator" id="85700482">
+ <reference key="NSNextResponder" ref="754336264"/>
+ <int key="NSvFlags">1314</int>
+ <object class="NSPSMatrix" key="NSDrawMatrix"/>
+ <string key="NSFrame">{{589, 6}, {122, 12}}</string>
+ <reference key="NSSuperview" ref="754336264"/>
+ <int key="NSpiFlags">16652</int>
+ <double key="NSMaxValue">100</double>
+ </object>
+ <object class="NSTextField" id="845737300">
+ <reference key="NSNextResponder" ref="754336264"/>
+ <int key="NSvFlags">258</int>
+ <string key="NSFrame">{{3, 6}, {582, 14}}</string>
+ <reference key="NSSuperview" ref="754336264"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="145074830">
+ <int key="NSCellFlags">67239488</int>
+ <int key="NSCellFlags2">272762880</int>
+ <string key="NSContents">Idle</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="845737300"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{730, 546}</string>
+ <string key="NSClassName">NSView</string>
+ <string key="NSExtension">NSResponder</string>
+ </object>
+ <object class="NSCustomObject" id="626222747">
+ <string key="NSClassName">MyController</string>
+ </object>
+ <object class="NSCustomObject" id="820844840">
+ <string key="NSClassName">ProfileController</string>
+ </object>
+ <object class="NSCustomObject" id="919673534">
+ <string key="NSClassName">PreferencesController</string>
+ </object>
+ <object class="NSCustomObject" id="185584375">
+ <string key="NSClassName">NotificationController</string>
+ </object>
+ <object class="NSCustomView" id="131437498">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSBox" id="777780043">
+ <reference key="NSNextResponder" ref="131437498"/>
+ <int key="NSvFlags">258</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSView" id="894096199">
+ <reference key="NSNextResponder" ref="777780043"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="538828701">
+ <reference key="NSNextResponder" ref="894096199"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{11, 20}, {30, 17}}</string>
+ <reference key="NSSuperview" ref="894096199"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="855328737">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string type="base64-UTF8" key="NSContents">RmlsZToKA</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="538828701"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="535928276">
+ <reference key="NSNextResponder" ref="894096199"/>
+ <int key="NSvFlags">258</int>
+ <string key="NSFrame">{{46, 18}, {427, 22}}</string>
+ <reference key="NSSuperview" ref="894096199"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="294533446">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4195328</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="535928276"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="695013634">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <reference key="NSColor" ref="268561989"/>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="917616157">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <reference key="NSColor" ref="465092439"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrame">{{2, 2}, {493, 51}}</string>
+ <reference key="NSSuperview" ref="777780043"/>
+ </object>
+ </object>
+ <string key="NSFrame">{{20, 129}, {497, 71}}</string>
+ <reference key="NSSuperview" ref="131437498"/>
+ <string key="NSOffsets">{0, 0}</string>
+ <object class="NSTextFieldCell" key="NSTitleCell">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">First root</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+ </object>
+ </object>
+ <reference key="NSContentView" ref="894096199"/>
+ <int key="NSBorderType">3</int>
+ <int key="NSBoxType">0</int>
+ <int key="NSTitlePosition">2</int>
+ <bool key="NSTransparent">NO</bool>
+ </object>
+ <object class="NSBox" id="223842171">
+ <reference key="NSNextResponder" ref="131437498"/>
+ <int key="NSvFlags">258</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSView" id="404397338">
+ <reference key="NSNextResponder" ref="223842171"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMatrix" id="588956057">
+ <reference key="NSNextResponder" ref="404397338"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{12, 39}, {70, 38}}</string>
+ <reference key="NSSuperview" ref="404397338"/>
+ <bool key="NSEnabled">YES</bool>
+ <int key="NSNumRows">2</int>
+ <int key="NSNumCols">1</int>
+ <object class="NSMutableArray" key="NSCells">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButtonCell" id="845367793">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Remote</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="588956057"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">0</int>
+ <object class="NSButtonImageSource" key="NSAlternateImage" id="366582153">
+ <string key="NSImageName">NSRadioButton</string>
+ </object>
+ <object class="NSMutableString" key="NSAlternateContents" id="1061064001">
+ <characters key="NS.bytes"/>
+ </object>
+ <reference key="NSKeyEquivalent" ref="1061064001"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ <object class="NSButtonCell" id="520995262">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Local</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="588956057"/>
+ <int key="NSTag">1</int>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">0</int>
+ <reference key="NSAlternateImage" ref="366582153"/>
+ <reference key="NSAlternateContents" ref="1061064001"/>
+ <reference key="NSKeyEquivalent" ref="1061064001"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <string key="NSCellSize">{70, 18}</string>
+ <string key="NSIntercellSpacing">{4, 2}</string>
+ <int key="NSMatrixFlags">1143472128</int>
+ <string key="NSCellClass">NSActionCell</string>
+ <object class="NSButtonCell" key="NSProtoCell" id="347365126">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Radio</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">0</int>
+ <reference key="NSAlternateImage" ref="366582153"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ <reference key="NSSelectedCell" ref="845367793"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSCellBackgroundColor" ref="268561989"/>
+ <reference key="NSFont" ref="599111291"/>
+ </object>
+ <object class="NSTextField" id="349912474">
+ <reference key="NSNextResponder" ref="404397338"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{97, 58}, {37, 17}}</string>
+ <reference key="NSSuperview" ref="404397338"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="952393256">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">User:</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="349912474"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="896768358">
+ <reference key="NSNextResponder" ref="404397338"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{134, 56}, {91, 22}}</string>
+ <reference key="NSSuperview" ref="404397338"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1053210155">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4195328</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="896768358"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="993405512">
+ <reference key="NSNextResponder" ref="404397338"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{236, 58}, {38, 17}}</string>
+ <reference key="NSSuperview" ref="404397338"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="2123321">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Host:</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="993405512"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="1048028362">
+ <reference key="NSNextResponder" ref="404397338"/>
+ <int key="NSvFlags">258</int>
+ <string key="NSFrame">{{274, 56}, {199, 22}}</string>
+ <reference key="NSSuperview" ref="404397338"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="372536919">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4195328</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="1048028362"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="982227363">
+ <reference key="NSNextResponder" ref="404397338"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{11, 16}, {30, 17}}</string>
+ <reference key="NSSuperview" ref="404397338"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="923729414">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">File:</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="982227363"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="282586762">
+ <reference key="NSNextResponder" ref="404397338"/>
+ <int key="NSvFlags">258</int>
+ <string key="NSFrame">{{46, 14}, {427, 22}}</string>
+ <reference key="NSSuperview" ref="404397338"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="208523218">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4195328</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="282586762"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrame">{{2, 2}, {493, 86}}</string>
+ <reference key="NSSuperview" ref="223842171"/>
+ </object>
+ </object>
+ <string key="NSFrame">{{20, 16}, {497, 106}}</string>
+ <reference key="NSSuperview" ref="131437498"/>
+ <string key="NSOffsets">{0, 0}</string>
+ <object class="NSTextFieldCell" key="NSTitleCell">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Second root</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+ </object>
+ </object>
+ <reference key="NSContentView" ref="404397338"/>
+ <int key="NSBorderType">3</int>
+ <int key="NSBoxType">0</int>
+ <int key="NSTitlePosition">2</int>
+ <bool key="NSTransparent">NO</bool>
+ </object>
+ <object class="NSTextField" id="45078194">
+ <reference key="NSNextResponder" ref="131437498"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{20, 213}, {87, 17}}</string>
+ <reference key="NSSuperview" ref="131437498"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="972568817">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Profile name:</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="45078194"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="459036983">
+ <reference key="NSNextResponder" ref="131437498"/>
+ <int key="NSvFlags">258</int>
+ <string key="NSFrame">{{106, 208}, {408, 22}}</string>
+ <reference key="NSSuperview" ref="131437498"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="316961684">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4195328</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="459036983"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{534, 250}</string>
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSView</characters>
+ </object>
+ <string key="NSExtension">NSResponder</string>
+ </object>
+ <object class="NSCustomView" id="976206435">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSProgressIndicator" id="899688332">
+ <reference key="NSNextResponder" ref="976206435"/>
+ <int key="NSvFlags">1325</int>
+ <object class="NSPSMatrix" key="NSDrawMatrix"/>
+ <string key="NSFrame">{{419, 263}, {32, 32}}</string>
+ <reference key="NSSuperview" ref="976206435"/>
+ <int key="NSpiFlags">20490</int>
+ <double key="NSMaxValue">100</double>
+ </object>
+ <object class="NSView" id="14416367">
+ <reference key="NSNextResponder" ref="976206435"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="894337796">
+ <reference key="NSNextResponder" ref="14416367"/>
+ <int key="NSvFlags">301</int>
+ <string key="NSFrame">{{304, 254}, {263, 19}}</string>
+ <reference key="NSSuperview" ref="14416367"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="687143868">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">138544128</int>
+ <string key="NSContents">Connecting...</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">16</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="894337796"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{871, 577}</string>
+ <reference key="NSSuperview" ref="976206435"/>
+ </object>
+ </object>
+ <string key="NSFrameSize">{871, 577}</string>
+ <object class="NSMutableString" key="NSClassName">
+ <characters key="NS.bytes">NSView</characters>
+ </object>
+ <string key="NSExtension">NSResponder</string>
+ </object>
+ <object class="NSWindowTemplate" id="621468052">
+ <int key="NSWindowStyleMask">7</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{2, 118}, {227, 128}}</string>
+ <int key="NSWTFlags">1886912512</int>
+ <string key="NSWindowTitle">PasswordWindow</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="813757358">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="340638115">
+ <reference key="NSNextResponder" ref="813757358"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{20, 60}, {187, 22}}</string>
+ <reference key="NSSuperview" ref="813757358"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="835745293">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4195328</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="340638115"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ <object class="NSButton" id="727137783">
+ <reference key="NSNextResponder" ref="813757358"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{115, 12}, {98, 32}}</string>
+ <reference key="NSSuperview" ref="813757358"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="80389260">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Continue</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="727137783"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage" id="119703982">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <object class="NSMutableString" key="NSAlternateContents">
+ <characters key="NS.bytes"/>
+ </object>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="366243254">
+ <reference key="NSNextResponder" ref="813757358"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{14, 12}, {84, 32}}</string>
+ <reference key="NSSuperview" ref="813757358"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="512512774">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">137887744</int>
+ <string key="NSContents">Cancel</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="366243254"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="119703982"/>
+ <object class="NSMutableString" key="NSAlternateContents">
+ <characters key="NS.bytes"/>
+ </object>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="23444779">
+ <reference key="NSNextResponder" ref="813757358"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{17, 90}, {193, 17}}</string>
+ <reference key="NSSuperview" ref="813757358"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="79825548">
+ <int key="NSCellFlags">67239488</int>
+ <int key="NSCellFlags2">4196352</int>
+ <string type="base64-UTF8" key="NSContents">UGxlYXNlIGVudGVyIHlvdXIgcGFzc3dvcmQKA</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="23444779"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{227, 128}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ <object class="NSWindowTemplate" id="329232122">
+ <int key="NSWindowStyleMask">3</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{194, 458}, {262, 266}}</string>
+ <int key="NSWTFlags">1886912512</int>
+ <string key="NSWindowTitle"/>
+ <string key="NSWindowClass">NSWindow</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="614370347">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="659712406">
+ <reference key="NSNextResponder" ref="614370347"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{22, 152}, {220, 22}}</string>
+ <reference key="NSSuperview" ref="614370347"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="538108566">
+ <int key="NSCellFlags">-2079195584</int>
+ <int key="NSCellFlags2">138413056</int>
+ <string key="NSContents">Unison</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande-Bold</string>
+ <double key="NSSize">18</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="659712406"/>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="267764307">
+ <reference key="NSNextResponder" ref="614370347"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{22, 20}, {224, 52}}</string>
+ <reference key="NSSuperview" ref="614370347"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="742877646">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">138412032</int>
+ <string type="base64-UTF8" key="NSContents">wqkgQ29weXJpZ2h0IDE5OTktMjAwNi4KClRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhl
+IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLg</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">10</double>
+ <int key="NSfFlags">2843</int>
+ </object>
+ <reference key="NSControlView" ref="267764307"/>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ <object class="NSImageView" id="753251315">
+ <reference key="NSNextResponder" ref="614370347"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableSet" key="NSDragTypes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="set.sortedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ </object>
+ </object>
+ <string key="NSFrame">{{20, 182}, {224, 64}}</string>
+ <reference key="NSSuperview" ref="614370347"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSImageCell" key="NSCell" id="652374412">
+ <int key="NSCellFlags">130560</int>
+ <int key="NSCellFlags2">33554432</int>
+ <object class="NSCustomResource" key="NSContents">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">Unison</string>
+ </object>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">0</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">NO</bool>
+ </object>
+ <bool key="NSEditable">YES</bool>
+ </object>
+ <object class="NSTextField" id="1025952662">
+ <reference key="NSNextResponder" ref="614370347"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{22, 101}, {224, 18}}</string>
+ <reference key="NSSuperview" ref="614370347"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="292039647">
+ <int key="NSCellFlags">-2079195584</int>
+ <int key="NSCellFlags2">138413056</int>
+ <string key="NSContents">Sync you very much!</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">Optima-Italic</string>
+ <double key="NSSize">12</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="1025952662"/>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="844769937">
+ <reference key="NSNextResponder" ref="614370347"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{22, 127}, {220, 17}}</string>
+ <reference key="NSSuperview" ref="614370347"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="173945597">
+ <int key="NSCellFlags">-2079195584</int>
+ <int key="NSCellFlags2">138413056</int>
+ <string key="NSContents">?.?.?</string>
+ <reference key="NSSupport" ref="745083723"/>
+ <reference key="NSControlView" ref="844769937"/>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="917616157"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{262, 266}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ <object class="NSWindowTemplate" id="923445797">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{519, 382}, {505, 342}}</string>
+ <int key="NSWTFlags">1886912512</int>
+ <string key="NSWindowTitle">Diff</string>
+ <object class="NSMutableString" key="NSWindowClass">
+ <characters key="NS.bytes">NSWindow</characters>
+ </object>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="441291314">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSScrollView" id="531171583">
+ <reference key="NSNextResponder" ref="441291314"/>
+ <int key="NSvFlags">319</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="638847102">
+ <reference key="NSNextResponder" ref="531171583"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextView" id="755012754">
+ <reference key="NSNextResponder" ref="638847102"/>
+ <int key="NSvFlags">2322</int>
+ <string key="NSFrameSize">{505, 14}</string>
+ <reference key="NSSuperview" ref="638847102"/>
+ <object class="NSTextContainer" key="NSTextContainer" id="285163648">
+ <object class="NSLayoutManager" key="NSLayoutManager">
+ <object class="NSTextStorage" key="NSTextStorage">
+ <object class="NSMutableString" key="NSString">
+ <characters key="NS.bytes"/>
+ </object>
+ <nil key="NSDelegate"/>
+ </object>
+ <object class="NSMutableArray" key="NSTextContainers">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="285163648"/>
+ </object>
+ <int key="NSLMFlags">6</int>
+ <nil key="NSDelegate"/>
+ </object>
+ <reference key="NSTextView" ref="755012754"/>
+ <double key="NSWidth">505</double>
+ <int key="NSTCFlags">1</int>
+ </object>
+ <object class="NSTextViewSharedData" key="NSSharedData">
+ <int key="NSFlags">11236</int>
+ <int key="NSTextCheckingTypes">0</int>
+ <nil key="NSMarkedAttributes"/>
+ <reference key="NSBackgroundColor" ref="268561989"/>
+ <object class="NSDictionary" key="NSSelectedAttributes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSBackgroundColor</string>
+ <string>NSColor</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">selectedTextBackgroundColor</string>
+ <reference key="NSColor" ref="176647248"/>
+ </object>
+ <object class="NSColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">selectedTextColor</string>
+ <reference key="NSColor" ref="465092439"/>
+ </object>
+ </object>
+ </object>
+ <reference key="NSInsertionColor" ref="465092439"/>
+ <object class="NSDictionary" key="NSLinkAttributes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSColor</string>
+ <string>NSUnderline</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSColor" id="438358543">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MCAwIDEAA</bytes>
+ </object>
+ <integer value="1"/>
+ </object>
+ </object>
+ <nil key="NSDefaultParagraphStyle"/>
+ </object>
+ <int key="NSTVFlags">6</int>
+ <string key="NSMaxSize">{1010, 1e+07}</string>
+ <string key="NSMinize">{114, 0}</string>
+ <nil key="NSDelegate"/>
+ </object>
+ </object>
+ <string key="NSFrameSize">{505, 342}</string>
+ <reference key="NSSuperview" ref="531171583"/>
+ <reference key="NSNextKeyView" ref="755012754"/>
+ <reference key="NSDocView" ref="755012754"/>
+ <reference key="NSBGColor" ref="268561989"/>
+ <object class="NSCursor" key="NSCursor">
+ <string key="NSHotSpot">{1, -1}</string>
+ <int key="NSCursorType">0</int>
+ </object>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="336081770">
+ <reference key="NSNextResponder" ref="531171583"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-30, 1}, {15, 356}}</string>
+ <reference key="NSSuperview" ref="531171583"/>
+ <reference key="NSTarget" ref="531171583"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1</double>
+ </object>
+ <object class="NSScroller" id="645744673">
+ <reference key="NSNextResponder" ref="531171583"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-100, -100}, {87, 18}}</string>
+ <reference key="NSSuperview" ref="531171583"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="531171583"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1</double>
+ <double key="NSPercent">0.94565218687057495</double>
+ </object>
+ </object>
+ <string key="NSFrameSize">{505, 342}</string>
+ <reference key="NSSuperview" ref="441291314"/>
+ <reference key="NSNextKeyView" ref="638847102"/>
+ <int key="NSsFlags">528</int>
+ <reference key="NSVScroller" ref="336081770"/>
+ <reference key="NSHScroller" ref="645744673"/>
+ <reference key="NSContentView" ref="638847102"/>
+ </object>
+ </object>
+ <string key="NSFrameSize">{505, 342}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ <object class="NSWindowTemplate" id="1047544150">
+ <int key="NSWindowStyleMask">1</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{163, 135}, {400, 229}}</string>
+ <int key="NSWTFlags">1886912512</int>
+ <string key="NSWindowTitle">Unison</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="18501583">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="159106305">
+ <reference key="NSNextResponder" ref="18501583"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{302, 12}, {84, 32}}</string>
+ <reference key="NSSuperview" ref="18501583"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="519522710">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Yes</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="159106305"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="599111291"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="565406362">
+ <reference key="NSNextResponder" ref="18501583"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{20, 188}, {383, 21}}</string>
+ <reference key="NSSuperview" ref="18501583"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="438918118">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Would you like to install the Unison command-line tool?</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande-Bold</string>
+ <double key="NSSize">12</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="565406362"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSButton" id="1066528945">
+ <reference key="NSNextResponder" ref="18501583"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{17, 36}, {145, 18}}</string>
+ <reference key="NSSuperview" ref="18501583"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="13750519">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">131072</int>
+ <string key="NSContents">Don't ask me again</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="1066528945"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSButtonImageSource" key="NSAlternateImage" id="478087450">
+ <string key="NSImageName">NSSwitch</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="67591844">
+ <reference key="NSNextResponder" ref="18501583"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{218, 12}, {84, 32}}</string>
+ <reference key="NSSuperview" ref="18501583"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="1020934634">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">No</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="67591844"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">1</int>
+ <reference key="NSAlternateImage" ref="599111291"/>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="847992124">
+ <reference key="NSNextResponder" ref="18501583"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{17, 60}, {366, 120}}</string>
+ <reference key="NSSuperview" ref="18501583"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="132645490">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">272629760</int>
+ <string type="base64-UTF8" key="NSContents">VGhlIGNvbW1hbmQtbGluZSB0b29sIGlzIGEgc21hbGwgcHJvZ3JhbSB0aGF0IGNhbiBiZSBpbnN0YWxs
+ZWQgaW4gYSBzdGFuZGFyZCBwbGFjZSBvbiB5b3VyIGNvbXB1dGVyICgvdXNyL2Jpbi91bmlzb24pIHNv
+IFVuaXNvbiBjYW4gZWFzaWx5IGJlIGZvdW5kLiBJZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHN5bmNo
+cm9uaXplIGZpbGVzIG9uIHRoaXMgY29tcHV0ZXIgYnkgcnVubmluZyBVbmlzb24gb24gYSByZW1vdGUg
+Y29tcHV0ZXIsIHlvdSBzaG91bGQgcHJvYmFibHkgaW5zdGFsbCBpdC4KCklmIHlvdSBkb24ndCBpbnN0
+YWxsIGl0IG5vdywgeW91IGNhbiBkbyBzbyBsYXRlciBieSBjaG9vc2luZyAnSW5zdGFsbCBjb21tYW5k
+LWxpbmUgdG9vbCcgZnJvbSB0aGUgVW5pc29uIG1lbnUuCg</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="847992124"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{400, 229}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ <object class="NSWindowTemplate" id="140516394">
+ <int key="NSWindowStyleMask">3</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{235, 475}, {446, 84}}</string>
+ <int key="NSWTFlags">1954022400</int>
+ <string key="NSWindowTitle">General</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <object class="NSToolbar" key="NSViewClass" id="131341969">
+ <object class="NSMutableString" key="NSToolbarIdentifier">
+ <characters key="NS.bytes">2780CC9C-D44A-4484-8D03-C65609351E57</characters>
+ </object>
+ <nil key="NSToolbarDelegate"/>
+ <bool key="NSToolbarPrefersToBeShown">YES</bool>
+ <bool key="NSToolbarShowsBaselineSeparator">YES</bool>
+ <bool key="NSToolbarAllowsUserCustomization">YES</bool>
+ <bool key="NSToolbarAutosavesConfiguration">NO</bool>
+ <int key="NSToolbarDisplayMode">1</int>
+ <int key="NSToolbarSizeMode">1</int>
+ <object class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>4A97E608-13A1-41D8-B077-1360865DB1A4</string>
+ <string>D5D59D5F-DFD1-4F67-8724-69D88EF5E355</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSToolbarItem" id="342729370">
+ <object class="NSMutableString" key="NSToolbarItemIdentifier">
+ <characters key="NS.bytes">4A97E608-13A1-41D8-B077-1360865DB1A4</characters>
+ </object>
+ <string key="NSToolbarItemLabel">General</string>
+ <string key="NSToolbarItemPaletteLabel">General</string>
+ <string key="NSToolbarItemToolTip"/>
+ <nil key="NSToolbarItemView"/>
+ <object class="NSCustomResource" key="NSToolbarItemImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSPreferencesGeneral</string>
+ </object>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{0, 0}</string>
+ <string key="NSToolbarItemMaxSize">{0, 0}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">-1</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ </object>
+ <object class="NSToolbarItem" id="576257785">
+ <object class="NSMutableString" key="NSToolbarItemIdentifier">
+ <characters key="NS.bytes">D5D59D5F-DFD1-4F67-8724-69D88EF5E355</characters>
+ </object>
+ <string key="NSToolbarItemLabel">Fonts</string>
+ <string key="NSToolbarItemPaletteLabel">Fonts</string>
+ <string key="NSToolbarItemToolTip">Show Font Panel</string>
+ <nil key="NSToolbarItemView"/>
+ <object class="NSCustomResource" key="NSToolbarItemImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSFontPanel</string>
+ </object>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{0, 0}</string>
+ <string key="NSToolbarItemMaxSize">{0, 0}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">-1</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ </object>
+ <object class="NSToolbarFlexibleSpaceItem" id="286400661">
+ <string key="NSToolbarItemIdentifier">NSToolbarFlexibleSpaceItem</string>
+ <string key="NSToolbarItemLabel"/>
+ <string key="NSToolbarItemPaletteLabel">Flexible Space</string>
+ <nil key="NSToolbarItemToolTip"/>
+ <nil key="NSToolbarItemView"/>
+ <nil key="NSToolbarItemImage"/>
+ <nil key="NSToolbarItemTarget"/>
+ <nil key="NSToolbarItemAction"/>
+ <string key="NSToolbarItemMinSize">{1, 5}</string>
+ <string key="NSToolbarItemMaxSize">{20000, 32}</string>
+ <bool key="NSToolbarItemEnabled">YES</bool>
+ <bool key="NSToolbarItemAutovalidates">YES</bool>
+ <int key="NSToolbarItemTag">-1</int>
+ <bool key="NSToolbarIsUserRemovable">YES</bool>
+ <int key="NSToolbarItemVisibilityPriority">0</int>
+ <object class="NSMenuItem" key="NSToolbarItemMenuFormRepresentation">
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="151838310"/>
+ <reference key="NSMixedImage" ref="1045142073"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSArray" key="NSToolbarIBAllowedItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="342729370"/>
+ <reference ref="576257785"/>
+ <reference ref="286400661"/>
+ </object>
+ <object class="NSMutableArray" key="NSToolbarIBDefaultItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="342729370"/>
+ <reference ref="576257785"/>
+ <reference ref="286400661"/>
+ </object>
+ <object class="NSMutableArray" key="NSToolbarIBSelectableItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <object class="NSView" key="NSWindowView" id="455994853">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{446, 84}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ <object class="NSUserDefaultsController" id="977013255">
+ <bool key="NSSharedInstance">YES</bool>
+ </object>
+ <object class="NSView" id="939529328">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="816515478">
+ <reference key="NSNextResponder" ref="939529328"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{18, 45}, {174, 18}}</string>
+ <reference key="NSSuperview" ref="939529328"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="248509277">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Open profile on startup:</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="816515478"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSCustomResource" key="NSNormalImage" id="616587014">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSSwitch</string>
+ </object>
+ <reference key="NSAlternateImage" ref="478087450"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="899290600">
+ <reference key="NSNextResponder" ref="939529328"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{18, 18}, {410, 18}}</string>
+ <reference key="NSSuperview" ref="939529328"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="606603162">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Delete log-file (~/unison.log) automatically on complete sync</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="899290600"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <reference key="NSNormalImage" ref="616587014"/>
+ <reference key="NSAlternateImage" ref="478087450"/>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSComboBox" id="357365612">
+ <reference key="NSNextResponder" ref="939529328"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{198, 40}, {231, 26}}</string>
+ <reference key="NSSuperview" ref="939529328"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSComboBoxCell" key="NSCell" id="551363216">
+ <int key="NSCellFlags">72482368</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="357365612"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="695013634"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ <int key="NSVisibleItemCount">5</int>
+ <bool key="NSHasVerticalScroller">YES</bool>
+ <bool key="NSCompletes">YES</bool>
+ <reference key="NSDelegate" ref="357365612"/>
+ <object class="NSComboTableView" key="NSTableView" id="931508487">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{15, 0}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn">
+ <integer value="0" key="NSIdentifier"/>
+ <double key="NSWidth">12</double>
+ <double key="NSMinWidth">10</double>
+ <double key="NSMaxWidth">1000</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="745083723"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="268561989"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="931508487"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="571804419"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <reference key="NSTableView" ref="931508487"/>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3</double>
+ <double key="NSIntercellSpacingHeight">2</double>
+ <reference key="NSBackgroundColor" ref="571804419"/>
+ <reference key="NSGridColor" ref="837222830"/>
+ <double key="NSRowHeight">19</double>
+ <string key="NSAction">tableViewAction:</string>
+ <int key="NSTvFlags">-767524864</int>
+ <reference key="NSDelegate" ref="551363216"/>
+ <reference key="NSDataSource" ref="551363216"/>
+ <reference key="NSTarget" ref="551363216"/>
+ <int key="NSColumnAutoresizingStyle">1</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ <int key="NSTableViewDraggingDestinationStyle">0</int>
+ </object>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{446, 84}</string>
+ </object>
+ <object class="NSView" id="439327882">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="678202428">
+ <reference key="NSNextResponder" ref="439327882"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{125, 50}, {213, 17}}</string>
+ <reference key="NSSuperview" ref="439327882"/>
+ <reference key="NSNextKeyView" ref="1065369439"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="751646106">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">xxxx</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="678202428"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSButton" id="1065369439">
+ <reference key="NSNextResponder" ref="439327882"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{343, 45}, {59, 25}}</string>
+ <reference key="NSSuperview" ref="439327882"/>
+ <reference key="NSNextKeyView" ref="760006057"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="84059826">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">choose</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="1065369439"/>
+ <int key="NSButtonFlags">-2038152961</int>
+ <int key="NSButtonFlags2">163</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="28911990">
+ <reference key="NSNextResponder" ref="439327882"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{125, 20}, {213, 17}}</string>
+ <reference key="NSSuperview" ref="439327882"/>
+ <reference key="NSNextKeyView" ref="364632432"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="400249441">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">xxxx</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="28911990"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSButton" id="364632432">
+ <reference key="NSNextResponder" ref="439327882"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{343, 15}, {59, 25}}</string>
+ <reference key="NSSuperview" ref="439327882"/>
+ <reference key="NSNextKeyView" ref="455994853"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="129627026">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">choose</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="364632432"/>
+ <int key="NSButtonFlags">-2038152961</int>
+ <int key="NSButtonFlags2">163</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="760006057">
+ <reference key="NSNextResponder" ref="439327882"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 20}, {106, 17}}</string>
+ <reference key="NSSuperview" ref="439327882"/>
+ <reference key="NSNextKeyView" ref="28911990"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="112946638">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">71304192</int>
+ <string key="NSContents">Diff font:</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="760006057"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="132542257">
+ <reference key="NSNextResponder" ref="439327882"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 50}, {106, 17}}</string>
+ <reference key="NSSuperview" ref="439327882"/>
+ <reference key="NSNextKeyView" ref="678202428"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1695119">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">71304192</int>
+ <string key="NSContents">Details font:</string>
+ <reference key="NSSupport" ref="599111291"/>
+ <reference key="NSControlView" ref="132542257"/>
+ <reference key="NSBackgroundColor" ref="339352646"/>
+ <reference key="NSTextColor" ref="274191033"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{422, 87}</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="37863316"/>
+ <reference key="destination" ref="526625829"/>
+ </object>
+ <int key="connectionID">139</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="37863316"/>
+ <reference key="destination" ref="693945174"/>
+ </object>
+ <int key="connectionID">146</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="37863316"/>
+ <reference key="destination" ref="422290158"/>
+ </object>
+ <int key="connectionID">152</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="37863316"/>
+ <reference key="destination" ref="67252353"/>
+ </object>
+ <int key="connectionID">153</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cut:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="73613290"/>
+ </object>
+ <int key="connectionID">175</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">paste:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="335015660"/>
+ </object>
+ <int key="connectionID">176</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">selectAll:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="232124595"/>
+ </object>
+ <int key="connectionID">179</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="918382228"/>
+ </object>
+ <int key="connectionID">181</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">updatesView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="754336264"/>
+ </object>
+ <int key="connectionID">210</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">chooseProfileView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="585072836"/>
+ </object>
+ <int key="connectionID">211</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mainWindow</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="355605687"/>
+ </object>
+ <int key="connectionID">216</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">tableView</string>
+ <reference key="source" ref="820844840"/>
+ <reference key="destination" ref="446416594"/>
+ </object>
+ <int key="connectionID">218</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="446416594"/>
+ <reference key="destination" ref="820844840"/>
+ </object>
+ <int key="connectionID">219</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">profileController</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="820844840"/>
+ </object>
+ <int key="connectionID">221</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">endPasswordWindow:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="727137783"/>
+ </object>
+ <int key="connectionID">240</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">passwordWindow</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="621468052"/>
+ </object>
+ <int key="connectionID">241</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">passwordText</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="340638115"/>
+ </object>
+ <int key="connectionID">242</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">endPasswordWindow:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="366243254"/>
+ </object>
+ <int key="connectionID">243</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">ignorePath:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="299441153"/>
+ </object>
+ <int key="connectionID">258</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">ignoreExt:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="188392331"/>
+ </object>
+ <int key="connectionID">259</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">ignoreName:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="78895812"/>
+ </object>
+ <int key="connectionID">260</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copyLR:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="938287255"/>
+ </object>
+ <int key="connectionID">270</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copyRL:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="473554979"/>
+ </object>
+ <int key="connectionID">271</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">selectConflicts:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="833907567"/>
+ </object>
+ <int key="connectionID">273</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">revert:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="907786872"/>
+ </object>
+ <int key="connectionID">274</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">forceNewer:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="273929861"/>
+ </object>
+ <int key="connectionID">282</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">forceOlder:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="502496676"/>
+ </object>
+ <int key="connectionID">283</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">leaveAlone:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="170126817"/>
+ </object>
+ <int key="connectionID">285</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">profileNameText</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="459036983"/>
+ </object>
+ <int key="connectionID">332</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">preferencesController</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="919673534"/>
+ </object>
+ <int key="connectionID">350</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">preferencesView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="131437498"/>
+ </object>
+ <int key="connectionID">358</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">firstRootText</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="535928276"/>
+ </object>
+ <int key="connectionID">373</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">secondRootUser</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="896768358"/>
+ </object>
+ <int key="connectionID">374</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">secondRootHost</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="1048028362"/>
+ </object>
+ <int key="connectionID">375</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">secondRootText</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="282586762"/>
+ </object>
+ <int key="connectionID">376</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">remoteButtonCell</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="845367793"/>
+ </object>
+ <int key="connectionID">377</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">localButtonCell</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="520995262"/>
+ </object>
+ <int key="connectionID">378</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="459036983"/>
+ <reference key="destination" ref="535928276"/>
+ </object>
+ <int key="connectionID">379</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="535928276"/>
+ <reference key="destination" ref="588956057"/>
+ </object>
+ <int key="connectionID">380</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="588956057"/>
+ <reference key="destination" ref="896768358"/>
+ </object>
+ <int key="connectionID">381</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="896768358"/>
+ <reference key="destination" ref="1048028362"/>
+ </object>
+ <int key="connectionID">382</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="1048028362"/>
+ <reference key="destination" ref="282586762"/>
+ </object>
+ <int key="connectionID">383</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">remoteClick:</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="845367793"/>
+ </object>
+ <int key="connectionID">386</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">localClick:</string>
+ <reference key="source" ref="919673534"/>
+ <reference key="destination" ref="520995262"/>
+ </object>
+ <int key="connectionID">387</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">passwordCancelButton</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="366243254"/>
+ </object>
+ <int key="connectionID">395</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="340638115"/>
+ <reference key="destination" ref="626222747"/>
+ </object>
+ <int key="connectionID">396</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">myController</string>
+ <reference key="source" ref="446416594"/>
+ <reference key="destination" ref="626222747"/>
+ </object>
+ <int key="connectionID">400</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">aboutWindow</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="329232122"/>
+ </object>
+ <int key="connectionID">412</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">versionText</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="844769937"/>
+ </object>
+ <int key="connectionID">413</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">onlineHelp:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="411336073"/>
+ </object>
+ <int key="connectionID">416</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">syncButton:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="513780384"/>
+ </object>
+ <int key="connectionID">421</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">ConnectingView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="976206435"/>
+ </object>
+ <int key="connectionID">425</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">restartButton:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="396820968"/>
+ </object>
+ <int key="connectionID">431</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">passwordPrompt</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="23444779"/>
+ </object>
+ <int key="connectionID">436</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">notificationController</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="185584375"/>
+ </object>
+ <int key="connectionID">438</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">raiseAboutWindow:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="551642701"/>
+ </object>
+ <int key="connectionID">462</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">diffWindow</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="923445797"/>
+ </object>
+ <int key="connectionID">479</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">diffView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="755012754"/>
+ </object>
+ <int key="connectionID">480</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">merge:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="879528549"/>
+ </object>
+ <int key="connectionID">482</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showDiff:</string>
+ <reference key="source" ref="279913758"/>
+ <reference key="destination" ref="973931859"/>
+ </object>
+ <int key="connectionID">483</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">rescan:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="990697150"/>
+ </object>
+ <int key="connectionID">485</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">progressBar</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="85700482"/>
+ </object>
+ <int key="connectionID">487</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">cltoolPref</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="1066528945"/>
+ </object>
+ <int key="connectionID">497</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">cltoolWindow</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="1047544150"/>
+ </object>
+ <int key="connectionID">500</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cltoolNoButton:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="67591844"/>
+ </object>
+ <int key="connectionID">503</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cltoolYesButton:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="159106305"/>
+ </object>
+ <int key="connectionID">505</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">initialFirstResponder</string>
+ <reference key="source" ref="1047544150"/>
+ <reference key="destination" ref="159106305"/>
+ </object>
+ <int key="connectionID">506</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">raiseCltoolWindow:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="251970986"/>
+ </object>
+ <int key="connectionID">507</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">tableModeSelector</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="384288444"/>
+ </object>
+ <int key="connectionID">516</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">tableModeChanged:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="384288444"/>
+ </object>
+ <int key="connectionID">517</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="878192733"/>
+ <reference key="destination" ref="626222747"/>
+ </object>
+ <int key="connectionID">571</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showPreferences:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="837410352"/>
+ </object>
+ <int key="connectionID">572</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">connectingAnimation</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="899688332"/>
+ </object>
+ <int key="connectionID">578</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statusText</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="845737300"/>
+ </object>
+ <int key="connectionID">585</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="809169243"/>
+ <reference key="destination" ref="626222747"/>
+ </object>
+ <int key="connectionID">605</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="809169243"/>
+ <reference key="destination" ref="626222747"/>
+ </object>
+ <int key="connectionID">606</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">detailsTextView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="173308938"/>
+ </object>
+ <int key="connectionID">609</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">tableView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="809169243"/>
+ </object>
+ <int key="connectionID">610</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">preferencesWindow</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="140516394"/>
+ </object>
+ <int key="connectionID">659</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">detailsFontLabel</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="678202428"/>
+ </object>
+ <int key="connectionID">661</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">diffFontLabel</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="28911990"/>
+ </object>
+ <int key="connectionID">662</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">chooseFont:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="1065369439"/>
+ </object>
+ <int key="connectionID">672</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">chooseFont:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="364632432"/>
+ </object>
+ <int key="connectionID">673</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">chooseDetailsFont</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="1065369439"/>
+ </object>
+ <int key="connectionID">676</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">chooseDiffFont</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="364632432"/>
+ </object>
+ <int key="connectionID">677</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">splitView</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="398078791"/>
+ </object>
+ <int key="connectionID">684</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">connectingViewGradient</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="14416367"/>
+ </object>
+ <int key="connectionID">686</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">detailsTextViewGradient</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="700068909"/>
+ </object>
+ <int key="connectionID">687</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: values.deleteLogOnExit</string>
+ <reference key="source" ref="899290600"/>
+ <reference key="destination" ref="977013255"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="899290600"/>
+ <reference key="NSDestination" ref="977013255"/>
+ <string key="NSLabel">value: values.deleteLogOnExit</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">values.deleteLogOnExit</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">706</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: values.openProfileAtStartup</string>
+ <reference key="source" ref="816515478"/>
+ <reference key="destination" ref="977013255"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="816515478"/>
+ <reference key="NSDestination" ref="977013255"/>
+ <string key="NSLabel">value: values.openProfileAtStartup</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">values.openProfileAtStartup</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">707</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: values.profileToOpen</string>
+ <reference key="source" ref="357365612"/>
+ <reference key="destination" ref="977013255"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="357365612"/>
+ <reference key="NSDestination" ref="977013255"/>
+ <string key="NSLabel">value: values.profileToOpen</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">values.profileToOpen</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">708</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">checkOpenProfileChanged:</string>
+ <reference key="source" ref="626222747"/>
+ <reference key="destination" ref="816515478"/>
+ </object>
+ <int key="connectionID">709</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="131341969"/>
+ <reference key="destination" ref="140516394"/>
+ </object>
+ <int key="connectionID">756</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">linkedView</string>
+ <reference key="source" ref="576257785"/>
+ <reference key="destination" ref="439327882"/>
+ </object>
+ <int key="connectionID">759</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">linkedView</string>
+ <reference key="source" ref="342729370"/>
+ <reference key="destination" ref="939529328"/>
+ </object>
+ <int key="connectionID">760</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="892182555"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="37863316"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="279913758"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="878192733"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">21</int>
+ <reference key="object" ref="355605687"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="232668648"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Window</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="232668648"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="384288444"/>
+ </object>
+ <reference key="parent" ref="355605687"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">515</int>
+ <reference key="object" ref="384288444"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="673426767"/>
+ </object>
+ <reference key="parent" ref="232668648"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="395658688"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="639283572"/>
+ <reference ref="425916962"/>
+ <reference ref="972866920"/>
+ <reference ref="827672906"/>
+ <reference ref="504811774"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MainMenu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="639283572"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="77554793"/>
+ </object>
+ <reference key="parent" ref="395658688"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="77554793"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="837410352"/>
+ <reference ref="422290158"/>
+ <reference ref="526625829"/>
+ <reference ref="227484062"/>
+ <reference ref="693945174"/>
+ <reference ref="264975518"/>
+ <reference ref="67252353"/>
+ <reference ref="671453401"/>
+ <reference ref="551642701"/>
+ <reference ref="251970986"/>
+ </object>
+ <reference key="parent" ref="639283572"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="837410352"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="422290158"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="526625829"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="227484062"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="693945174"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="264975518"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="67252353"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">196</int>
+ <reference key="object" ref="671453401"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">414</int>
+ <reference key="object" ref="551642701"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">428</int>
+ <reference key="object" ref="251970986"/>
+ <reference key="parent" ref="77554793"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">103</int>
+ <reference key="object" ref="425916962"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="75568110"/>
+ </object>
+ <reference key="parent" ref="395658688"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">106</int>
+ <reference key="object" ref="75568110"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="411336073"/>
+ </object>
+ <reference key="parent" ref="425916962"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">111</int>
+ <reference key="object" ref="411336073"/>
+ <reference key="parent" ref="75568110"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">163</int>
+ <reference key="object" ref="972866920"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1003509484"/>
+ </object>
+ <reference key="parent" ref="395658688"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">169</int>
+ <reference key="object" ref="1003509484"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="918382228"/>
+ <reference ref="73613290"/>
+ <reference ref="335015660"/>
+ <reference ref="232124595"/>
+ <reference ref="833907567"/>
+ </object>
+ <reference key="parent" ref="972866920"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">157</int>
+ <reference key="object" ref="918382228"/>
+ <reference key="parent" ref="1003509484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">160</int>
+ <reference key="object" ref="73613290"/>
+ <reference key="parent" ref="1003509484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">171</int>
+ <reference key="object" ref="335015660"/>
+ <reference key="parent" ref="1003509484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">172</int>
+ <reference key="object" ref="232124595"/>
+ <reference key="parent" ref="1003509484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">269</int>
+ <reference key="object" ref="833907567"/>
+ <reference key="parent" ref="1003509484"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">253</int>
+ <reference key="object" ref="827672906"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="366294269"/>
+ </object>
+ <reference key="parent" ref="395658688"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">254</int>
+ <reference key="object" ref="366294269"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="299441153"/>
+ <reference ref="188392331"/>
+ <reference ref="78895812"/>
+ </object>
+ <reference key="parent" ref="827672906"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">255</int>
+ <reference key="object" ref="299441153"/>
+ <reference key="parent" ref="366294269"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">256</int>
+ <reference key="object" ref="188392331"/>
+ <reference key="parent" ref="366294269"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">257</int>
+ <reference key="object" ref="78895812"/>
+ <reference key="parent" ref="366294269"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">261</int>
+ <reference key="object" ref="504811774"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="982210092"/>
+ </object>
+ <reference key="parent" ref="395658688"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">262</int>
+ <reference key="object" ref="982210092"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="938287255"/>
+ <reference ref="473554979"/>
+ <reference ref="502496676"/>
+ <reference ref="907786872"/>
+ <reference ref="273929861"/>
+ <reference ref="170126817"/>
+ <reference ref="973931859"/>
+ <reference ref="501412924"/>
+ <reference ref="513780384"/>
+ <reference ref="396820968"/>
+ <reference ref="879528549"/>
+ <reference ref="990697150"/>
+ </object>
+ <reference key="parent" ref="504811774"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">263</int>
+ <reference key="object" ref="938287255"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">266</int>
+ <reference key="object" ref="473554979"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">267</int>
+ <reference key="object" ref="502496676"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">268</int>
+ <reference key="object" ref="907786872"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">281</int>
+ <reference key="object" ref="273929861"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">284</int>
+ <reference key="object" ref="170126817"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">417</int>
+ <reference key="object" ref="973931859"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">419</int>
+ <reference key="object" ref="501412924"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">420</int>
+ <reference key="object" ref="513780384"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">430</int>
+ <reference key="object" ref="396820968"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">481</int>
+ <reference key="object" ref="879528549"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">484</int>
+ <reference key="object" ref="990697150"/>
+ <reference key="parent" ref="982210092"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">197</int>
+ <reference key="object" ref="585072836"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="568004388"/>
+ <reference ref="965369806"/>
+ <reference ref="335527590"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">chooseProfileView</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">199</int>
+ <reference key="object" ref="568004388"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="767469197"/>
+ </object>
+ <reference key="parent" ref="585072836"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">201</int>
+ <reference key="object" ref="965369806"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="841579218"/>
+ </object>
+ <reference key="parent" ref="585072836"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">203</int>
+ <reference key="object" ref="335527590"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="446416594"/>
+ <reference ref="852809690"/>
+ <reference ref="370050818"/>
+ <reference ref="1286469"/>
+ </object>
+ <reference key="parent" ref="585072836"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">205</int>
+ <reference key="object" ref="446416594"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="347342635"/>
+ </object>
+ <reference key="parent" ref="335527590"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">202</int>
+ <reference key="object" ref="347342635"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="214722634"/>
+ </object>
+ <reference key="parent" ref="446416594"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">198</int>
+ <reference key="object" ref="754336264"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="398078791"/>
+ <reference ref="85700482"/>
+ <reference ref="845737300"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">updatesView</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">209</int>
+ <reference key="object" ref="626222747"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">MyController</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">217</int>
+ <reference key="object" ref="820844840"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">ProfileController</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">234</int>
+ <reference key="object" ref="621468052"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="813757358"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">PasswordWindow</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">235</int>
+ <reference key="object" ref="813757358"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="340638115"/>
+ <reference ref="727137783"/>
+ <reference ref="366243254"/>
+ <reference ref="23444779"/>
+ </object>
+ <reference key="parent" ref="621468052"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">236</int>
+ <reference key="object" ref="340638115"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="835745293"/>
+ </object>
+ <reference key="parent" ref="813757358"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">237</int>
+ <reference key="object" ref="727137783"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="80389260"/>
+ </object>
+ <reference key="parent" ref="813757358"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">238</int>
+ <reference key="object" ref="366243254"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="512512774"/>
+ </object>
+ <reference key="parent" ref="813757358"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">239</int>
+ <reference key="object" ref="23444779"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="79825548"/>
+ </object>
+ <reference key="parent" ref="813757358"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">307</int>
+ <reference key="object" ref="131437498"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="777780043"/>
+ <reference ref="223842171"/>
+ <reference ref="45078194"/>
+ <reference ref="459036983"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">PreferencesView</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">321</int>
+ <reference key="object" ref="777780043"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="538828701"/>
+ <reference ref="535928276"/>
+ </object>
+ <reference key="parent" ref="131437498"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">323</int>
+ <reference key="object" ref="223842171"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="588956057"/>
+ <reference ref="349912474"/>
+ <reference ref="896768358"/>
+ <reference ref="993405512"/>
+ <reference ref="1048028362"/>
+ <reference ref="982227363"/>
+ <reference ref="282586762"/>
+ </object>
+ <reference key="parent" ref="131437498"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">329</int>
+ <reference key="object" ref="45078194"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="972568817"/>
+ </object>
+ <reference key="parent" ref="131437498"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">330</int>
+ <reference key="object" ref="459036983"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="316961684"/>
+ </object>
+ <reference key="parent" ref="131437498"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">331</int>
+ <reference key="object" ref="919673534"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">PreferencesController</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">402</int>
+ <reference key="object" ref="329232122"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="614370347"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">AboutWindow</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">401</int>
+ <reference key="object" ref="614370347"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="659712406"/>
+ <reference ref="267764307"/>
+ <reference ref="753251315"/>
+ <reference ref="1025952662"/>
+ <reference ref="844769937"/>
+ </object>
+ <reference key="parent" ref="329232122"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">406</int>
+ <reference key="object" ref="659712406"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="538108566"/>
+ </object>
+ <reference key="parent" ref="614370347"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">407</int>
+ <reference key="object" ref="267764307"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="742877646"/>
+ </object>
+ <reference key="parent" ref="614370347"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">409</int>
+ <reference key="object" ref="753251315"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="652374412"/>
+ </object>
+ <reference key="parent" ref="614370347"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">410</int>
+ <reference key="object" ref="1025952662"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="292039647"/>
+ </object>
+ <reference key="parent" ref="614370347"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">411</int>
+ <reference key="object" ref="844769937"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="173945597"/>
+ </object>
+ <reference key="parent" ref="614370347"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">437</int>
+ <reference key="object" ref="185584375"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">NotificationController</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">475</int>
+ <reference key="object" ref="923445797"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="441291314"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">DiffWindow</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">476</int>
+ <reference key="object" ref="441291314"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="531171583"/>
+ </object>
+ <reference key="parent" ref="923445797"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">477</int>
+ <reference key="object" ref="531171583"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="755012754"/>
+ <reference ref="336081770"/>
+ <reference ref="645744673"/>
+ </object>
+ <reference key="parent" ref="441291314"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">478</int>
+ <reference key="object" ref="755012754"/>
+ <reference key="parent" ref="531171583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">488</int>
+ <reference key="object" ref="1047544150"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="18501583"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">CltoolWindow</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">489</int>
+ <reference key="object" ref="18501583"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="159106305"/>
+ <reference ref="565406362"/>
+ <reference ref="1066528945"/>
+ <reference ref="67591844"/>
+ <reference ref="847992124"/>
+ </object>
+ <reference key="parent" ref="1047544150"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">491</int>
+ <reference key="object" ref="159106305"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="519522710"/>
+ </object>
+ <reference key="parent" ref="18501583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">493</int>
+ <reference key="object" ref="565406362"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="438918118"/>
+ </object>
+ <reference key="parent" ref="18501583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">494</int>
+ <reference key="object" ref="1066528945"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="13750519"/>
+ </object>
+ <reference key="parent" ref="18501583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">495</int>
+ <reference key="object" ref="67591844"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1020934634"/>
+ </object>
+ <reference key="parent" ref="18501583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">496</int>
+ <reference key="object" ref="847992124"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="132645490"/>
+ </object>
+ <reference key="parent" ref="18501583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">527</int>
+ <reference key="object" ref="673426767"/>
+ <reference key="parent" ref="384288444"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">528</int>
+ <reference key="object" ref="767469197"/>
+ <reference key="parent" ref="568004388"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">529</int>
+ <reference key="object" ref="841579218"/>
+ <reference key="parent" ref="965369806"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">531</int>
+ <reference key="object" ref="835745293"/>
+ <reference key="parent" ref="340638115"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">532</int>
+ <reference key="object" ref="80389260"/>
+ <reference key="parent" ref="727137783"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">533</int>
+ <reference key="object" ref="512512774"/>
+ <reference key="parent" ref="366243254"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">534</int>
+ <reference key="object" ref="79825548"/>
+ <reference key="parent" ref="23444779"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">543</int>
+ <reference key="object" ref="972568817"/>
+ <reference key="parent" ref="45078194"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">544</int>
+ <reference key="object" ref="316961684"/>
+ <reference key="parent" ref="459036983"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">545</int>
+ <reference key="object" ref="538108566"/>
+ <reference key="parent" ref="659712406"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">546</int>
+ <reference key="object" ref="742877646"/>
+ <reference key="parent" ref="267764307"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">547</int>
+ <reference key="object" ref="652374412"/>
+ <reference key="parent" ref="753251315"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">548</int>
+ <reference key="object" ref="292039647"/>
+ <reference key="parent" ref="1025952662"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">549</int>
+ <reference key="object" ref="173945597"/>
+ <reference key="parent" ref="844769937"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">551</int>
+ <reference key="object" ref="519522710"/>
+ <reference key="parent" ref="159106305"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">552</int>
+ <reference key="object" ref="438918118"/>
+ <reference key="parent" ref="565406362"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">553</int>
+ <reference key="object" ref="13750519"/>
+ <reference key="parent" ref="1066528945"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">554</int>
+ <reference key="object" ref="1020934634"/>
+ <reference key="parent" ref="67591844"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">555</int>
+ <reference key="object" ref="132645490"/>
+ <reference key="parent" ref="847992124"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">557</int>
+ <reference key="object" ref="214722634"/>
+ <reference key="parent" ref="347342635"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">561</int>
+ <reference key="object" ref="852809690"/>
+ <reference key="parent" ref="335527590"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">562</int>
+ <reference key="object" ref="370050818"/>
+ <reference key="parent" ref="335527590"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">563</int>
+ <reference key="object" ref="1286469"/>
+ <reference key="parent" ref="335527590"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">569</int>
+ <reference key="object" ref="336081770"/>
+ <reference key="parent" ref="531171583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">570</int>
+ <reference key="object" ref="645744673"/>
+ <reference key="parent" ref="531171583"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">362</int>
+ <reference key="object" ref="538828701"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="855328737"/>
+ </object>
+ <reference key="parent" ref="777780043"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">535</int>
+ <reference key="object" ref="855328737"/>
+ <reference key="parent" ref="538828701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">363</int>
+ <reference key="object" ref="535928276"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="294533446"/>
+ </object>
+ <reference key="parent" ref="777780043"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">536</int>
+ <reference key="object" ref="294533446"/>
+ <reference key="parent" ref="535928276"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">364</int>
+ <reference key="object" ref="588956057"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="347365126"/>
+ <reference ref="520995262"/>
+ <reference ref="845367793"/>
+ </object>
+ <reference key="parent" ref="223842171"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">556</int>
+ <reference key="object" ref="347365126"/>
+ <reference key="parent" ref="588956057"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">366</int>
+ <reference key="object" ref="520995262"/>
+ <reference key="parent" ref="588956057"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">365</int>
+ <reference key="object" ref="845367793"/>
+ <reference key="parent" ref="588956057"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">367</int>
+ <reference key="object" ref="349912474"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="952393256"/>
+ </object>
+ <reference key="parent" ref="223842171"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">537</int>
+ <reference key="object" ref="952393256"/>
+ <reference key="parent" ref="349912474"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">368</int>
+ <reference key="object" ref="896768358"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1053210155"/>
+ </object>
+ <reference key="parent" ref="223842171"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">538</int>
+ <reference key="object" ref="1053210155"/>
+ <reference key="parent" ref="896768358"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">369</int>
+ <reference key="object" ref="993405512"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="2123321"/>
+ </object>
+ <reference key="parent" ref="223842171"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">539</int>
+ <reference key="object" ref="2123321"/>
+ <reference key="parent" ref="993405512"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">370</int>
+ <reference key="object" ref="1048028362"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="372536919"/>
+ </object>
+ <reference key="parent" ref="223842171"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">540</int>
+ <reference key="object" ref="372536919"/>
+ <reference key="parent" ref="1048028362"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">371</int>
+ <reference key="object" ref="982227363"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="923729414"/>
+ </object>
+ <reference key="parent" ref="223842171"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">541</int>
+ <reference key="object" ref="923729414"/>
+ <reference key="parent" ref="982227363"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">372</int>
+ <reference key="object" ref="282586762"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="208523218"/>
+ </object>
+ <reference key="parent" ref="223842171"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">542</int>
+ <reference key="object" ref="208523218"/>
+ <reference key="parent" ref="282586762"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">586</int>
+ <reference key="object" ref="398078791"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="700068909"/>
+ <reference ref="319719388"/>
+ </object>
+ <reference key="parent" ref="754336264"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">589</int>
+ <reference key="object" ref="700068909"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="173308938"/>
+ </object>
+ <reference key="parent" ref="398078791"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">607</int>
+ <reference key="object" ref="173308938"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="900780132"/>
+ </object>
+ <reference key="parent" ref="700068909"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">608</int>
+ <reference key="object" ref="900780132"/>
+ <reference key="parent" ref="173308938"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">486</int>
+ <reference key="object" ref="85700482"/>
+ <reference key="parent" ref="754336264"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">590</int>
+ <reference key="object" ref="319719388"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="809169243"/>
+ <reference ref="626547980"/>
+ <reference ref="280329492"/>
+ <reference ref="285438200"/>
+ </object>
+ <reference key="parent" ref="398078791"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">594</int>
+ <reference key="object" ref="809169243"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="517689164"/>
+ <reference ref="36867386"/>
+ <reference ref="831965848"/>
+ <reference ref="1030582640"/>
+ <reference ref="174176934"/>
+ </object>
+ <reference key="parent" ref="319719388"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">599</int>
+ <reference key="object" ref="517689164"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="129611902"/>
+ </object>
+ <reference key="parent" ref="809169243"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">600</int>
+ <reference key="object" ref="129611902"/>
+ <reference key="parent" ref="517689164"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">598</int>
+ <reference key="object" ref="36867386"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="233842594"/>
+ </object>
+ <reference key="parent" ref="809169243"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">601</int>
+ <reference key="object" ref="233842594"/>
+ <reference key="parent" ref="36867386"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">597</int>
+ <reference key="object" ref="831965848"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="168643022"/>
+ </object>
+ <reference key="parent" ref="809169243"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">602</int>
+ <reference key="object" ref="168643022"/>
+ <reference key="parent" ref="831965848"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">596</int>
+ <reference key="object" ref="1030582640"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1026449157"/>
+ </object>
+ <reference key="parent" ref="809169243"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">603</int>
+ <reference key="object" ref="1026449157"/>
+ <reference key="parent" ref="1030582640"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">595</int>
+ <reference key="object" ref="174176934"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="802031427"/>
+ </object>
+ <reference key="parent" ref="809169243"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">604</int>
+ <reference key="object" ref="802031427"/>
+ <reference key="parent" ref="174176934"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">593</int>
+ <reference key="object" ref="626547980"/>
+ <reference key="parent" ref="319719388"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">592</int>
+ <reference key="object" ref="280329492"/>
+ <reference key="parent" ref="319719388"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">591</int>
+ <reference key="object" ref="285438200"/>
+ <reference key="parent" ref="319719388"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">583</int>
+ <reference key="object" ref="845737300"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="145074830"/>
+ </object>
+ <reference key="parent" ref="754336264"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">584</int>
+ <reference key="object" ref="145074830"/>
+ <reference key="parent" ref="845737300"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">618</int>
+ <reference key="object" ref="140516394"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="455994853"/>
+ <reference ref="131341969"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">PreferencesWindow</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">619</int>
+ <reference key="object" ref="455994853"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="parent" ref="140516394"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">423</int>
+ <reference key="object" ref="976206435"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="899688332"/>
+ <reference ref="14416367"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">ConnectingView</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">576</int>
+ <reference key="object" ref="899688332"/>
+ <reference key="parent" ref="976206435"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">653</int>
+ <reference key="object" ref="977013255"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">681</int>
+ <reference key="object" ref="14416367"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="894337796"/>
+ </object>
+ <reference key="parent" ref="976206435"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">682</int>
+ <reference key="object" ref="894337796"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="687143868"/>
+ </object>
+ <reference key="parent" ref="14416367"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">683</int>
+ <reference key="object" ref="687143868"/>
+ <reference key="parent" ref="894337796"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">699</int>
+ <reference key="object" ref="939529328"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="357365612"/>
+ <reference ref="899290600"/>
+ <reference ref="816515478"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">700</int>
+ <reference key="object" ref="357365612"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="551363216"/>
+ </object>
+ <reference key="parent" ref="939529328"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">701</int>
+ <reference key="object" ref="899290600"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="606603162"/>
+ </object>
+ <reference key="parent" ref="939529328"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">702</int>
+ <reference key="object" ref="816515478"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="248509277"/>
+ </object>
+ <reference key="parent" ref="939529328"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">703</int>
+ <reference key="object" ref="248509277"/>
+ <reference key="parent" ref="816515478"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">704</int>
+ <reference key="object" ref="606603162"/>
+ <reference key="parent" ref="899290600"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">705</int>
+ <reference key="object" ref="551363216"/>
+ <reference key="parent" ref="357365612"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">678</int>
+ <reference key="object" ref="439327882"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="678202428"/>
+ <reference ref="1065369439"/>
+ <reference ref="28911990"/>
+ <reference ref="364632432"/>
+ <reference ref="760006057"/>
+ <reference ref="132542257"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Font View</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">636</int>
+ <reference key="object" ref="678202428"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="751646106"/>
+ </object>
+ <reference key="parent" ref="439327882"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">637</int>
+ <reference key="object" ref="1065369439"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="84059826"/>
+ </object>
+ <reference key="parent" ref="439327882"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">640</int>
+ <reference key="object" ref="28911990"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="400249441"/>
+ </object>
+ <reference key="parent" ref="439327882"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">641</int>
+ <reference key="object" ref="364632432"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="129627026"/>
+ </object>
+ <reference key="parent" ref="439327882"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">644</int>
+ <reference key="object" ref="760006057"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="112946638"/>
+ </object>
+ <reference key="parent" ref="439327882"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">646</int>
+ <reference key="object" ref="132542257"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1695119"/>
+ </object>
+ <reference key="parent" ref="439327882"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">647</int>
+ <reference key="object" ref="1695119"/>
+ <reference key="parent" ref="132542257"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">645</int>
+ <reference key="object" ref="112946638"/>
+ <reference key="parent" ref="760006057"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">642</int>
+ <reference key="object" ref="129627026"/>
+ <reference key="parent" ref="364632432"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">643</int>
+ <reference key="object" ref="400249441"/>
+ <reference key="parent" ref="28911990"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">638</int>
+ <reference key="object" ref="84059826"/>
+ <reference key="parent" ref="1065369439"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">639</int>
+ <reference key="object" ref="751646106"/>
+ <reference key="parent" ref="678202428"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">737</int>
+ <reference key="object" ref="131341969"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="286400661"/>
+ <reference ref="576257785"/>
+ <reference ref="342729370"/>
+ </object>
+ <reference key="parent" ref="140516394"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">743</int>
+ <reference key="object" ref="286400661"/>
+ <reference key="parent" ref="131341969"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">757</int>
+ <reference key="object" ref="576257785"/>
+ <reference key="parent" ref="131341969"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">758</int>
+ <reference key="object" ref="342729370"/>
+ <reference key="parent" ref="131341969"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-3.IBPluginDependency</string>
+ <string>-3.ImportedFromIB2</string>
+ <string>103.IBPluginDependency</string>
+ <string>103.ImportedFromIB2</string>
+ <string>106.IBEditorWindowLastContentRect</string>
+ <string>106.IBPluginDependency</string>
+ <string>106.ImportedFromIB2</string>
+ <string>111.IBPluginDependency</string>
+ <string>111.ImportedFromIB2</string>
+ <string>129.IBPluginDependency</string>
+ <string>129.ImportedFromIB2</string>
+ <string>134.IBPluginDependency</string>
+ <string>134.ImportedFromIB2</string>
+ <string>136.IBPluginDependency</string>
+ <string>136.ImportedFromIB2</string>
+ <string>144.IBPluginDependency</string>
+ <string>144.ImportedFromIB2</string>
+ <string>145.IBPluginDependency</string>
+ <string>145.ImportedFromIB2</string>
+ <string>149.IBPluginDependency</string>
+ <string>149.ImportedFromIB2</string>
+ <string>150.IBPluginDependency</string>
+ <string>150.ImportedFromIB2</string>
+ <string>157.IBPluginDependency</string>
+ <string>157.ImportedFromIB2</string>
+ <string>160.IBPluginDependency</string>
+ <string>160.ImportedFromIB2</string>
+ <string>163.IBPluginDependency</string>
+ <string>163.ImportedFromIB2</string>
+ <string>169.IBEditorWindowLastContentRect</string>
+ <string>169.IBPluginDependency</string>
+ <string>169.ImportedFromIB2</string>
+ <string>171.IBPluginDependency</string>
+ <string>171.ImportedFromIB2</string>
+ <string>172.IBPluginDependency</string>
+ <string>172.ImportedFromIB2</string>
+ <string>196.IBPluginDependency</string>
+ <string>196.ImportedFromIB2</string>
+ <string>197.IBEditorWindowLastContentRect</string>
+ <string>197.IBPluginDependency</string>
+ <string>197.ImportedFromIB2</string>
+ <string>198.IBEditorWindowLastContentRect</string>
+ <string>198.IBPluginDependency</string>
+ <string>198.ImportedFromIB2</string>
+ <string>199.IBPluginDependency</string>
+ <string>199.ImportedFromIB2</string>
+ <string>2.IBPluginDependency</string>
+ <string>2.ImportedFromIB2</string>
+ <string>201.IBPluginDependency</string>
+ <string>201.ImportedFromIB2</string>
+ <string>202.IBPluginDependency</string>
+ <string>202.ImportedFromIB2</string>
+ <string>203.IBPluginDependency</string>
+ <string>203.ImportedFromIB2</string>
+ <string>205.CustomClassName</string>
+ <string>205.IBPluginDependency</string>
+ <string>205.ImportedFromIB2</string>
+ <string>209.ImportedFromIB2</string>
+ <string>21.IBEditorWindowLastContentRect</string>
+ <string>21.IBPluginDependency</string>
+ <string>21.IBWindowTemplateEditedContentRect</string>
+ <string>21.ImportedFromIB2</string>
+ <string>21.windowTemplate.hasMinSize</string>
+ <string>21.windowTemplate.minSize</string>
+ <string>217.ImportedFromIB2</string>
+ <string>234.IBEditorWindowLastContentRect</string>
+ <string>234.IBPluginDependency</string>
+ <string>234.IBWindowTemplateEditedContentRect</string>
+ <string>234.ImportedFromIB2</string>
+ <string>234.windowTemplate.hasMinSize</string>
+ <string>234.windowTemplate.minSize</string>
+ <string>235.IBPluginDependency</string>
+ <string>235.ImportedFromIB2</string>
+ <string>236.CustomClassName</string>
+ <string>236.IBPluginDependency</string>
+ <string>236.ImportedFromIB2</string>
+ <string>237.IBPluginDependency</string>
+ <string>237.ImportedFromIB2</string>
+ <string>238.IBPluginDependency</string>
+ <string>238.ImportedFromIB2</string>
+ <string>239.IBPluginDependency</string>
+ <string>239.ImportedFromIB2</string>
+ <string>253.IBPluginDependency</string>
+ <string>253.ImportedFromIB2</string>
+ <string>254.IBEditorWindowLastContentRect</string>
+ <string>254.IBPluginDependency</string>
+ <string>254.ImportedFromIB2</string>
+ <string>255.IBPluginDependency</string>
+ <string>255.ImportedFromIB2</string>
+ <string>256.IBPluginDependency</string>
+ <string>256.ImportedFromIB2</string>
+ <string>257.IBPluginDependency</string>
+ <string>257.ImportedFromIB2</string>
+ <string>261.IBPluginDependency</string>
+ <string>261.ImportedFromIB2</string>
+ <string>262.IBEditorWindowLastContentRect</string>
+ <string>262.IBPluginDependency</string>
+ <string>262.ImportedFromIB2</string>
+ <string>263.IBPluginDependency</string>
+ <string>263.ImportedFromIB2</string>
+ <string>266.IBPluginDependency</string>
+ <string>266.ImportedFromIB2</string>
+ <string>267.IBPluginDependency</string>
+ <string>267.ImportedFromIB2</string>
+ <string>268.IBPluginDependency</string>
+ <string>268.ImportedFromIB2</string>
+ <string>269.IBPluginDependency</string>
+ <string>269.ImportedFromIB2</string>
+ <string>281.IBPluginDependency</string>
+ <string>281.ImportedFromIB2</string>
+ <string>284.IBPluginDependency</string>
+ <string>284.ImportedFromIB2</string>
+ <string>29.IBEditorWindowLastContentRect</string>
+ <string>29.IBPluginDependency</string>
+ <string>29.ImportedFromIB2</string>
+ <string>307.IBEditorWindowLastContentRect</string>
+ <string>307.IBPluginDependency</string>
+ <string>307.ImportedFromIB2</string>
+ <string>321.IBPluginDependency</string>
+ <string>321.ImportedFromIB2</string>
+ <string>323.IBPluginDependency</string>
+ <string>323.ImportedFromIB2</string>
+ <string>329.IBPluginDependency</string>
+ <string>329.ImportedFromIB2</string>
+ <string>330.IBPluginDependency</string>
+ <string>330.ImportedFromIB2</string>
+ <string>331.ImportedFromIB2</string>
+ <string>362.IBPluginDependency</string>
+ <string>362.ImportedFromIB2</string>
+ <string>363.IBPluginDependency</string>
+ <string>363.ImportedFromIB2</string>
+ <string>364.IBPluginDependency</string>
+ <string>364.ImportedFromIB2</string>
+ <string>365.IBPluginDependency</string>
+ <string>365.ImportedFromIB2</string>
+ <string>366.IBPluginDependency</string>
+ <string>366.ImportedFromIB2</string>
+ <string>367.IBPluginDependency</string>
+ <string>367.ImportedFromIB2</string>
+ <string>368.IBPluginDependency</string>
+ <string>368.ImportedFromIB2</string>
+ <string>369.IBPluginDependency</string>
+ <string>369.ImportedFromIB2</string>
+ <string>370.IBPluginDependency</string>
+ <string>370.ImportedFromIB2</string>
+ <string>371.IBPluginDependency</string>
+ <string>371.ImportedFromIB2</string>
+ <string>372.IBPluginDependency</string>
+ <string>372.ImportedFromIB2</string>
+ <string>401.IBPluginDependency</string>
+ <string>401.ImportedFromIB2</string>
+ <string>402.IBEditorWindowLastContentRect</string>
+ <string>402.IBPluginDependency</string>
+ <string>402.IBWindowTemplateEditedContentRect</string>
+ <string>402.ImportedFromIB2</string>
+ <string>402.windowTemplate.hasMinSize</string>
+ <string>402.windowTemplate.minSize</string>
+ <string>406.IBPluginDependency</string>
+ <string>406.ImportedFromIB2</string>
+ <string>407.IBPluginDependency</string>
+ <string>407.ImportedFromIB2</string>
+ <string>409.IBPluginDependency</string>
+ <string>409.ImportedFromIB2</string>
+ <string>410.IBPluginDependency</string>
+ <string>410.ImportedFromIB2</string>
+ <string>411.IBPluginDependency</string>
+ <string>411.ImportedFromIB2</string>
+ <string>414.IBPluginDependency</string>
+ <string>414.ImportedFromIB2</string>
+ <string>417.IBPluginDependency</string>
+ <string>417.ImportedFromIB2</string>
+ <string>419.IBPluginDependency</string>
+ <string>419.ImportedFromIB2</string>
+ <string>420.IBPluginDependency</string>
+ <string>420.ImportedFromIB2</string>
+ <string>423.IBEditorWindowLastContentRect</string>
+ <string>423.IBPluginDependency</string>
+ <string>423.ImportedFromIB2</string>
+ <string>428.IBPluginDependency</string>
+ <string>428.ImportedFromIB2</string>
+ <string>430.IBPluginDependency</string>
+ <string>430.ImportedFromIB2</string>
+ <string>437.ImportedFromIB2</string>
+ <string>475.IBEditorWindowLastContentRect</string>
+ <string>475.IBPluginDependency</string>
+ <string>475.IBWindowTemplateEditedContentRect</string>
+ <string>475.ImportedFromIB2</string>
+ <string>475.windowTemplate.hasMinSize</string>
+ <string>475.windowTemplate.minSize</string>
+ <string>476.IBPluginDependency</string>
+ <string>476.ImportedFromIB2</string>
+ <string>477.IBPluginDependency</string>
+ <string>477.ImportedFromIB2</string>
+ <string>478.IBPluginDependency</string>
+ <string>478.ImportedFromIB2</string>
+ <string>481.IBPluginDependency</string>
+ <string>481.ImportedFromIB2</string>
+ <string>484.IBPluginDependency</string>
+ <string>484.ImportedFromIB2</string>
+ <string>486.IBPluginDependency</string>
+ <string>486.ImportedFromIB2</string>
+ <string>488.IBEditorWindowLastContentRect</string>
+ <string>488.IBPluginDependency</string>
+ <string>488.IBWindowTemplateEditedContentRect</string>
+ <string>488.ImportedFromIB2</string>
+ <string>488.windowTemplate.hasMinSize</string>
+ <string>488.windowTemplate.minSize</string>
+ <string>489.IBPluginDependency</string>
+ <string>489.ImportedFromIB2</string>
+ <string>491.IBPluginDependency</string>
+ <string>491.ImportedFromIB2</string>
+ <string>493.IBPluginDependency</string>
+ <string>493.ImportedFromIB2</string>
+ <string>494.IBPluginDependency</string>
+ <string>494.ImportedFromIB2</string>
+ <string>495.IBPluginDependency</string>
+ <string>495.ImportedFromIB2</string>
+ <string>496.IBPluginDependency</string>
+ <string>496.ImportedFromIB2</string>
+ <string>515.IBPluginDependency</string>
+ <string>515.ImportedFromIB2</string>
+ <string>527.IBPluginDependency</string>
+ <string>528.IBPluginDependency</string>
+ <string>529.IBPluginDependency</string>
+ <string>531.IBPluginDependency</string>
+ <string>532.IBPluginDependency</string>
+ <string>533.IBPluginDependency</string>
+ <string>534.IBPluginDependency</string>
+ <string>535.IBPluginDependency</string>
+ <string>536.IBPluginDependency</string>
+ <string>537.IBPluginDependency</string>
+ <string>538.IBPluginDependency</string>
+ <string>539.IBPluginDependency</string>
+ <string>540.IBPluginDependency</string>
+ <string>541.IBPluginDependency</string>
+ <string>542.IBPluginDependency</string>
+ <string>543.IBPluginDependency</string>
+ <string>544.IBPluginDependency</string>
+ <string>545.IBPluginDependency</string>
+ <string>546.IBPluginDependency</string>
+ <string>547.IBPluginDependency</string>
+ <string>548.IBPluginDependency</string>
+ <string>549.IBPluginDependency</string>
+ <string>551.IBPluginDependency</string>
+ <string>552.IBPluginDependency</string>
+ <string>553.IBPluginDependency</string>
+ <string>554.IBPluginDependency</string>
+ <string>555.IBPluginDependency</string>
+ <string>556.IBPluginDependency</string>
+ <string>557.IBPluginDependency</string>
+ <string>557.IBShouldRemoveOnLegacySave</string>
+ <string>56.IBPluginDependency</string>
+ <string>56.ImportedFromIB2</string>
+ <string>561.IBPluginDependency</string>
+ <string>561.IBShouldRemoveOnLegacySave</string>
+ <string>562.IBPluginDependency</string>
+ <string>562.IBShouldRemoveOnLegacySave</string>
+ <string>563.IBPluginDependency</string>
+ <string>563.IBShouldRemoveOnLegacySave</string>
+ <string>569.IBPluginDependency</string>
+ <string>569.IBShouldRemoveOnLegacySave</string>
+ <string>57.IBEditorWindowLastContentRect</string>
+ <string>57.IBPluginDependency</string>
+ <string>57.ImportedFromIB2</string>
+ <string>570.IBPluginDependency</string>
+ <string>570.IBShouldRemoveOnLegacySave</string>
+ <string>576.IBPluginDependency</string>
+ <string>589.CustomClassName</string>
+ <string>590.IBPluginDependency</string>
+ <string>590.ImportedFromIB2</string>
+ <string>591.IBPluginDependency</string>
+ <string>591.IBShouldRemoveOnLegacySave</string>
+ <string>592.IBPluginDependency</string>
+ <string>592.IBShouldRemoveOnLegacySave</string>
+ <string>593.IBPluginDependency</string>
+ <string>593.IBShouldRemoveOnLegacySave</string>
+ <string>594.CustomClassName</string>
+ <string>594.IBPluginDependency</string>
+ <string>594.ImportedFromIB2</string>
+ <string>595.IBPluginDependency</string>
+ <string>595.ImportedFromIB2</string>
+ <string>596.IBPluginDependency</string>
+ <string>596.ImportedFromIB2</string>
+ <string>597.IBPluginDependency</string>
+ <string>597.ImportedFromIB2</string>
+ <string>598.IBPluginDependency</string>
+ <string>598.ImportedFromIB2</string>
+ <string>599.IBPluginDependency</string>
+ <string>599.ImportedFromIB2</string>
+ <string>600.IBPluginDependency</string>
+ <string>600.ImportedFromIB2</string>
+ <string>601.IBPluginDependency</string>
+ <string>601.ImportedFromIB2</string>
+ <string>602.IBPluginDependency</string>
+ <string>602.IBShouldRemoveOnLegacySave</string>
+ <string>603.IBPluginDependency</string>
+ <string>603.IBShouldRemoveOnLegacySave</string>
+ <string>604.IBPluginDependency</string>
+ <string>604.IBShouldRemoveOnLegacySave</string>
+ <string>618.IBEditorWindowLastContentRect</string>
+ <string>618.IBPluginDependency</string>
+ <string>618.IBWindowTemplateEditedContentRect</string>
+ <string>618.NSWindowTemplate.visibleAtLaunch</string>
+ <string>619.IBPluginDependency</string>
+ <string>619.IBViewBoundsToFrameTransform</string>
+ <string>636.IBPluginDependency</string>
+ <string>637.IBPluginDependency</string>
+ <string>638.IBPluginDependency</string>
+ <string>639.IBPluginDependency</string>
+ <string>640.IBPluginDependency</string>
+ <string>641.IBPluginDependency</string>
+ <string>642.IBPluginDependency</string>
+ <string>643.IBPluginDependency</string>
+ <string>644.IBPluginDependency</string>
+ <string>645.IBPluginDependency</string>
+ <string>646.IBPluginDependency</string>
+ <string>647.IBPluginDependency</string>
+ <string>653.IBPluginDependency</string>
+ <string>678.IBPluginDependency</string>
+ <string>678.IBViewBoundsToFrameTransform</string>
+ <string>681.CustomClassName</string>
+ <string>681.IBViewIntegration.shadowColor</string>
+ <string>699.IBPluginDependency</string>
+ <string>699.IBViewBoundsToFrameTransform</string>
+ <string>700.IBPluginDependency</string>
+ <string>701.IBPluginDependency</string>
+ <string>702.IBPluginDependency</string>
+ <string>703.IBPluginDependency</string>
+ <string>704.IBPluginDependency</string>
+ <string>705.IBPluginDependency</string>
+ <string>737.CustomClassName</string>
+ <string>737.IBEditorWindowLastContentRect</string>
+ <string>737.IBPluginDependency</string>
+ <string>743.IBPluginDependency</string>
+ <string>757.CustomClassName</string>
+ <string>757.IBPluginDependency</string>
+ <string>757.toolbarItem.selectable</string>
+ <string>758.CustomClassName</string>
+ <string>758.IBPluginDependency</string>
+ <string>758.toolbarItem.selectable</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{582, 1091}, {202, 23}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{407, 1011}, {179, 103}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{345, 795}, {363, 281}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{329, 310}, {730, 546}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>ProfileTableView</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{{717, 719}, {480, 360}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{717, 719}, {480, 360}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{213, 107}</string>
+ <boolean value="YES"/>
+ <string>{{345, 994}, {227, 128}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{345, 994}, {227, 128}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{213, 107}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>NSSecureTextField</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{520, 1051}, {191, 63}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{451, 881}, {323, 233}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{811, 836}, {317, 20}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{345, 606}, {534, 250}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{345, 879}, {262, 266}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{345, 879}, {262, 266}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{213, 107}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{443, 279}, {871, 577}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{{345, 792}, {505, 342}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{345, 792}, {505, 342}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{213, 107}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{345, 916}, {400, 229}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{345, 916}, {400, 229}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{213, 107}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{338, 941}, {266, 173}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>ColorGradientView</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>ReconTableView</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>{{605, 124}, {446, 84}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{605, 124}, {446, 84}}</string>
+ <boolean value="NO"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform"/>
+ <string>ColorGradientView</string>
+ <object class="NSColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">alternateSelectedControlColor</string>
+ <reference key="NSColor" ref="438358543"/>
+ </object>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <object class="NSAffineTransform"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>SSSelectableToolbar</string>
+ <string>{{520, 208}, {616, 0}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>SSSelectableToolbarItem</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ <string>SSSelectableToolbarItem</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES"/>
+ </object>
+
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">760</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">ColorGradientView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ColorGradientView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">FirstResponder</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>copyLR:</string>
+ <string>copyRL:</string>
+ <string>forceNewer:</string>
+ <string>forceOlder:</string>
+ <string>ignoreExt:</string>
+ <string>ignoreName:</string>
+ <string>ignorePath:</string>
+ <string>leaveAlone:</string>
+ <string>merge:</string>
+ <string>revert:</string>
+ <string>selectConflicts:</string>
+ <string>showDiff:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>copyLR:</string>
+ <string>copyRL:</string>
+ <string>forceNewer:</string>
+ <string>forceOlder:</string>
+ <string>ignoreExt:</string>
+ <string>ignoreName:</string>
+ <string>ignorePath:</string>
+ <string>leaveAlone:</string>
+ <string>merge:</string>
+ <string>revert:</string>
+ <string>selectConflicts:</string>
+ <string>showDiff:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">copyLR:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">copyRL:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">forceNewer:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">forceOlder:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">ignoreExt:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">ignoreName:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">ignorePath:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">leaveAlone:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">merge:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">revert:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">selectConflicts:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">showDiff:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MyController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>cancelProfileButton:</string>
+ <string>checkOpenProfileChanged:</string>
+ <string>chooseFont:</string>
+ <string>cltoolNoButton:</string>
+ <string>cltoolYesButton:</string>
+ <string>createButton:</string>
+ <string>endPasswordWindow:</string>
+ <string>installCommandLineTool:</string>
+ <string>onlineHelp:</string>
+ <string>openButton:</string>
+ <string>raiseAboutWindow:</string>
+ <string>raiseCltoolWindow:</string>
+ <string>raiseWindow:</string>
+ <string>rescan:</string>
+ <string>restartButton:</string>
+ <string>saveProfileButton:</string>
+ <string>showPreferences:</string>
+ <string>syncButton:</string>
+ <string>tableModeChanged:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>NSWindow</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>cancelProfileButton:</string>
+ <string>checkOpenProfileChanged:</string>
+ <string>chooseFont:</string>
+ <string>cltoolNoButton:</string>
+ <string>cltoolYesButton:</string>
+ <string>createButton:</string>
+ <string>endPasswordWindow:</string>
+ <string>installCommandLineTool:</string>
+ <string>onlineHelp:</string>
+ <string>openButton:</string>
+ <string>raiseAboutWindow:</string>
+ <string>raiseCltoolWindow:</string>
+ <string>raiseWindow:</string>
+ <string>rescan:</string>
+ <string>restartButton:</string>
+ <string>saveProfileButton:</string>
+ <string>showPreferences:</string>
+ <string>syncButton:</string>
+ <string>tableModeChanged:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">cancelProfileButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">checkOpenProfileChanged:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">chooseFont:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">cltoolNoButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">cltoolYesButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">createButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">endPasswordWindow:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">installCommandLineTool:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">onlineHelp:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">openButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">raiseAboutWindow:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">raiseCltoolWindow:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">raiseWindow:</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">rescan:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">restartButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">saveProfileButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">showPreferences:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">syncButton:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">tableModeChanged:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>ConnectingView</string>
+ <string>aboutWindow</string>
+ <string>checkOpenProfile</string>
+ <string>chooseDetailsFont</string>
+ <string>chooseDiffFont</string>
+ <string>chooseProfileView</string>
+ <string>cltoolPref</string>
+ <string>cltoolWindow</string>
+ <string>connectingAnimation</string>
+ <string>connectingViewGradient</string>
+ <string>detailsFontLabel</string>
+ <string>detailsTextView</string>
+ <string>detailsTextViewGradient</string>
+ <string>diffFontLabel</string>
+ <string>diffView</string>
+ <string>diffWindow</string>
+ <string>fontChangeTarget</string>
+ <string>mainWindow</string>
+ <string>notificationController</string>
+ <string>passwordCancelButton</string>
+ <string>passwordPrompt</string>
+ <string>passwordText</string>
+ <string>passwordWindow</string>
+ <string>preferencesController</string>
+ <string>preferencesView</string>
+ <string>preferencesWindow</string>
+ <string>profileBox</string>
+ <string>profileController</string>
+ <string>progressBar</string>
+ <string>splitView</string>
+ <string>statusText</string>
+ <string>tableModeSelector</string>
+ <string>tableView</string>
+ <string>updatesText</string>
+ <string>updatesView</string>
+ <string>versionText</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSView</string>
+ <string>NSWindow</string>
+ <string>NSButton</string>
+ <string>NSButton</string>
+ <string>NSButton</string>
+ <string>NSView</string>
+ <string>NSButton</string>
+ <string>NSWindow</string>
+ <string>NSProgressIndicator</string>
+ <string>ColorGradientView</string>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ <string>ColorGradientView</string>
+ <string>NSTextField</string>
+ <string>NSTextView</string>
+ <string>NSWindow</string>
+ <string>id</string>
+ <string>NSWindow</string>
+ <string>NotificationController</string>
+ <string>NSButton</string>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ <string>NSWindow</string>
+ <string>PreferencesController</string>
+ <string>NSView</string>
+ <string>NSWindow</string>
+ <string>NSComboBox</string>
+ <string>ProfileController</string>
+ <string>NSProgressIndicator</string>
+ <string>NSSplitView</string>
+ <string>NSTextField</string>
+ <string>NSSegmentedControl</string>
+ <string>ReconTableView</string>
+ <string>NSTextField</string>
+ <string>NSView</string>
+ <string>NSTextField</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>ConnectingView</string>
+ <string>aboutWindow</string>
+ <string>checkOpenProfile</string>
+ <string>chooseDetailsFont</string>
+ <string>chooseDiffFont</string>
+ <string>chooseProfileView</string>
+ <string>cltoolPref</string>
+ <string>cltoolWindow</string>
+ <string>connectingAnimation</string>
+ <string>connectingViewGradient</string>
+ <string>detailsFontLabel</string>
+ <string>detailsTextView</string>
+ <string>detailsTextViewGradient</string>
+ <string>diffFontLabel</string>
+ <string>diffView</string>
+ <string>diffWindow</string>
+ <string>fontChangeTarget</string>
+ <string>mainWindow</string>
+ <string>notificationController</string>
+ <string>passwordCancelButton</string>
+ <string>passwordPrompt</string>
+ <string>passwordText</string>
+ <string>passwordWindow</string>
+ <string>preferencesController</string>
+ <string>preferencesView</string>
+ <string>preferencesWindow</string>
+ <string>profileBox</string>
+ <string>profileController</string>
+ <string>progressBar</string>
+ <string>splitView</string>
+ <string>statusText</string>
+ <string>tableModeSelector</string>
+ <string>tableView</string>
+ <string>updatesText</string>
+ <string>updatesView</string>
+ <string>versionText</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBToOneOutletInfo">
+ <string key="name">ConnectingView</string>
+ <string key="candidateClassName">NSView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">aboutWindow</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">checkOpenProfile</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">chooseDetailsFont</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">chooseDiffFont</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">chooseProfileView</string>
+ <string key="candidateClassName">NSView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">cltoolPref</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">cltoolWindow</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">connectingAnimation</string>
+ <string key="candidateClassName">NSProgressIndicator</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">connectingViewGradient</string>
+ <string key="candidateClassName">ColorGradientView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">detailsFontLabel</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">detailsTextView</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">detailsTextViewGradient</string>
+ <string key="candidateClassName">ColorGradientView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">diffFontLabel</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">diffView</string>
+ <string key="candidateClassName">NSTextView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">diffWindow</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">fontChangeTarget</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">mainWindow</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">notificationController</string>
+ <string key="candidateClassName">NotificationController</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">passwordCancelButton</string>
+ <string key="candidateClassName">NSButton</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">passwordPrompt</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">passwordText</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">passwordWindow</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">preferencesController</string>
+ <string key="candidateClassName">PreferencesController</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">preferencesView</string>
+ <string key="candidateClassName">NSView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">preferencesWindow</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">profileBox</string>
+ <string key="candidateClassName">NSComboBox</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">profileController</string>
+ <string key="candidateClassName">ProfileController</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">progressBar</string>
+ <string key="candidateClassName">NSProgressIndicator</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">splitView</string>
+ <string key="candidateClassName">NSSplitView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">statusText</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">tableModeSelector</string>
+ <string key="candidateClassName">NSSegmentedControl</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">tableView</string>
+ <string key="candidateClassName">ReconTableView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">updatesText</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">updatesView</string>
+ <string key="candidateClassName">NSView</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">versionText</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">MyController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MyController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSOutlineView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="716125380">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ReconTableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSOutlineView</string>
+ <string key="superclassName">NSTableView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSSegmentedControl</string>
+ <string key="superclassName">NSControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NotificationController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">NotificationController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NotificationController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PreferencesController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>anyEnter:</string>
+ <string>localClick:</string>
+ <string>remoteClick:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>anyEnter:</string>
+ <string>localClick:</string>
+ <string>remoteClick:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">anyEnter:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">localClick:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">remoteClick:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>firstRootText</string>
+ <string>localButtonCell</string>
+ <string>profileNameText</string>
+ <string>remoteButtonCell</string>
+ <string>secondRootHost</string>
+ <string>secondRootText</string>
+ <string>secondRootUser</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSTextField</string>
+ <string>NSButtonCell</string>
+ <string>NSTextField</string>
+ <string>NSButtonCell</string>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>firstRootText</string>
+ <string>localButtonCell</string>
+ <string>profileNameText</string>
+ <string>remoteButtonCell</string>
+ <string>secondRootHost</string>
+ <string>secondRootText</string>
+ <string>secondRootUser</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBToOneOutletInfo">
+ <string key="name">firstRootText</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">localButtonCell</string>
+ <string key="candidateClassName">NSButtonCell</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">profileNameText</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">remoteButtonCell</string>
+ <string key="candidateClassName">NSButtonCell</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">secondRootHost</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">secondRootText</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ <object class="IBToOneOutletInfo">
+ <string key="name">secondRootUser</string>
+ <string key="candidateClassName">NSTextField</string>
+ </object>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">PreferencesController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">PreferencesController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ProfileController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">tableView</string>
+ <string key="NS.object.0">NSTableView</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">tableView</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">tableView</string>
+ <string key="candidateClassName">NSTableView</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ProfileController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ProfileController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ProfileTableView</string>
+ <string key="superclassName">NSTableView</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">myController</string>
+ <string key="NS.object.0">MyController</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">myController</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">myController</string>
+ <string key="candidateClassName">MyController</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ProfileTableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ProfileTableView</string>
+ <string key="superclassName">NSTableView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ReconTableView</string>
+ <string key="superclassName">NSOutlineView</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>copyLR:</string>
+ <string>copyRL:</string>
+ <string>forceNewer:</string>
+ <string>forceOlder:</string>
+ <string>ignoreExt:</string>
+ <string>ignoreName:</string>
+ <string>ignorePath:</string>
+ <string>leaveAlone:</string>
+ <string>merge:</string>
+ <string>revert:</string>
+ <string>selectConflicts:</string>
+ <string>showDiff:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>copyLR:</string>
+ <string>copyRL:</string>
+ <string>forceNewer:</string>
+ <string>forceOlder:</string>
+ <string>ignoreExt:</string>
+ <string>ignoreName:</string>
+ <string>ignorePath:</string>
+ <string>leaveAlone:</string>
+ <string>merge:</string>
+ <string>revert:</string>
+ <string>selectConflicts:</string>
+ <string>showDiff:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBActionInfo">
+ <string key="name">copyLR:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">copyRL:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">forceNewer:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">forceOlder:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">ignoreExt:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">ignoreName:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">ignorePath:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">leaveAlone:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">merge:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">revert:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">selectConflicts:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo">
+ <string key="name">showDiff:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ </object>
+ <reference key="sourceIdentifier" ref="716125380"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">ReconTableView</string>
+ <string key="superclassName">NSOutlineView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">SSSelectableToolbar</string>
+ <string key="superclassName">NSToolbar</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">window</string>
+ <string key="NS.object.0">NSWindow</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">window</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">window</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ssselectabletoolbar/SSSelectableToolbar.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">SSSelectableToolbarItem</string>
+ <string key="superclassName">NSToolbarItem</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">linkedView</string>
+ <string key="NS.object.0">NSView</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">linkedView</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">linkedView</string>
+ <string key="candidateClassName">NSView</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">ssselectabletoolbar/SSSelectableToolbarItem.h</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">ExceptionHandling.framework/Headers/NSExceptionHandler.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">BWToolkitFramework.framework/Headers/NSView+BWAdditions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1060" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3100" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../uimacnew.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSFontPanel</string>
+ <string>NSMenuCheckmark</string>
+ <string>NSMenuMixedState</string>
+ <string>NSPreferencesGeneral</string>
+ <string>NSSwitch</string>
+ <string>Outline-Deep</string>
+ <string>Outline-Flat</string>
+ <string>Outline-Flattened</string>
+ <string>Unison</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{32, 32}</string>
+ <string>{9, 8}</string>
+ <string>{7, 2}</string>
+ <string>{32, 32}</string>
+ <string>{15, 15}</string>
+ <string>{24, 16}</string>
+ <string>{24, 16}</string>
+ <string>{24, 16}</string>
+ <string>{128, 128}</string>
+ </object>
+ </object>
+ </data>
+</archive>
Added: trunk/src/uimac14/Frameworks/Growl.framework/Growl
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/Frameworks/Growl.framework/Growl
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Growl 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Growl 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/Frameworks/Growl.framework/Growl
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/src/uimac14/Frameworks/Growl.framework/Headers/Growl.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Headers/Growl.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Headers/Growl.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,6 @@
+#include "GrowlDefines.h"
+
+#ifdef __OBJC__
+# include "GrowlApplicationBridge.h"
+#endif
+#include "GrowlApplicationBridge-Carbon.h"
Added: trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge-Carbon.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge-Carbon.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge-Carbon.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,780 @@
+//
+// GrowlApplicationBridge-Carbon.h
+// Growl
+//
+// Created by Mac-arena the Bored Zo on Wed Jun 18 2004.
+// Based on GrowlApplicationBridge.h by Evan Schoenberg.
+// This source code is in the public domain. You may freely link it into any
+// program.
+//
+
+#ifndef _GROWLAPPLICATIONBRIDGE_CARBON_H_
+#define _GROWLAPPLICATIONBRIDGE_CARBON_H_
+
+#include <sys/cdefs.h>
+#include <Carbon/Carbon.h>
+
+#ifndef GROWL_EXPORT
+#define GROWL_EXPORT __attribute__((visibility("default"))) DEPRECATED_ATTRIBUTE
+#endif
+
+/*! @header GrowlApplicationBridge-Carbon.h
+ * @abstract Declares an API that Carbon applications can use to interact with Growl.
+ * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX
+ * to Growl (such as your application's name and what notifications it may
+ * post) and to provide information to your application (such as that Growl
+ * is listening for notifications or that a notification has been clicked).
+ *
+ * You can set the Growldelegate with Growl_SetDelegate and find out the
+ * current delegate with Growl_GetDelegate. See struct Growl_Delegate for more
+ * information about the delegate.
+ */
+
+__BEGIN_DECLS
+
+/*! @struct Growl_Delegate
+ * @abstract Delegate to supply GrowlApplicationBridge with information and respond to events.
+ * @discussion The Growl delegate provides your interface to
+ * GrowlApplicationBridge. When GrowlApplicationBridge needs information about
+ * your application, it looks for it in the delegate; when Growl or the user
+ * does something that you might be interested in, GrowlApplicationBridge
+ * looks for a callback in the delegate and calls it if present
+ * (meaning, if it is not <code>NULL</code>).
+ * XXX on all of that
+ * @field size The size of the delegate structure.
+ * @field applicationName The name of your application.
+ * @field registrationDictionary A dictionary describing your application and the notifications it can send out.
+ * @field applicationIconData Your application's icon.
+ * @field growlInstallationWindowTitle The title of the installation window.
+ * @field growlInstallationInformation Text to display in the installation window.
+ * @field growlUpdateWindowTitle The title of the update window.
+ * @field growlUpdateInformation Text to display in the update window.
+ * @field referenceCount A count of owners of the delegate.
+ * @field retain Called when GrowlApplicationBridge receives this delegate.
+ * @field release Called when GrowlApplicationBridge no longer needs this delegate.
+ * @field growlIsReady Called when GrowlHelperApp is listening for notifications.
+ * @field growlNotificationWasClicked Called when a Growl notification is clicked.
+ * @field growlNotificationTimedOut Called when a Growl notification timed out.
+ */
+struct Growl_Delegate {
+ /* @discussion This should be sizeof(struct Growl_Delegate).
+ */
+ size_t size;
+
+ /*All of these attributes are optional.
+ *Optional attributes can be NULL; required attributes that
+ * are NULL cause setting the Growl delegate to fail.
+ *XXX - move optional/required status into the discussion for each field
+ */
+
+ /* This name is used both internally and in the Growl preferences.
+ *
+ * This should remain stable between different versions and incarnations of
+ * your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ *
+ * This can be <code>NULL</code> if it is provided elsewhere, namely in an
+ * auto-discoverable plist file in your app bundle
+ * (XXX refer to more information on that) or in registrationDictionary.
+ */
+ CFStringRef applicationName;
+
+ /*
+ * Must contain at least these keys:
+ * GROWL_NOTIFICATIONS_ALL (CFArray):
+ * Contains the names of all notifications your application may post.
+ *
+ * Can also contain these keys:
+ * GROWL_NOTIFICATIONS_DEFAULT (CFArray):
+ * Names of notifications that should be enabled by default.
+ * If omitted, GROWL_NOTIFICATIONS_ALL will be used.
+ * GROWL_APP_NAME (CFString):
+ * Same as the applicationName member of this structure.
+ * If both are present, the applicationName member shall prevail.
+ * If this key is present, you may omit applicationName (set it to <code>NULL</code>).
+ * GROWL_APP_ICON (CFData):
+ * Same as the iconData member of this structure.
+ * If both are present, the iconData member shall prevail.
+ * If this key is present, you may omit iconData (set it to <code>NULL</code>).
+ *
+ * If you change the contents of this dictionary after setting the delegate,
+ * be sure to call Growl_Reregister.
+ *
+ * This can be <code>NULL</code> if you have an auto-discoverable plist file in your app
+ * bundle. (XXX refer to more information on that)
+ */
+ CFDictionaryRef registrationDictionary;
+
+ /* The data can be in any format supported by NSImage. As of
+ * Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and
+ * PICT formats.
+ *
+ * If this is not supplied, Growl will look up your application's icon by
+ * its application name.
+ */
+ CFDataRef applicationIconData;
+
+ /* Installer display attributes
+ *
+ * These four attributes are used by the Growl installer, if this framework
+ * supports it.
+ * For any of these being <code>NULL</code>, a localised default will be
+ * supplied.
+ */
+
+ /* If this is <code>NULL</code>, Growl will use a default,
+ * localized title.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlInstallationWindowTitle;
+ /* This information may be as long or short as desired (the
+ * window will be sized to fit it). If Growl is not installed, it will
+ * be displayed to the user as an explanation of what Growl is and what
+ * it can do in your application.
+ * It should probably note that no download is required to install.
+ *
+ * If this is <code>NULL</code>, Growl will use a default, localized
+ * explanation.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlInstallationInformation;
+ /* If this is <code>NULL</code>, Growl will use a default,
+ * localized title.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlUpdateWindowTitle;
+ /* This information may be as long or short as desired (the
+ * window will be sized to fit it). If an older version of Growl is
+ * installed, it will be displayed to the user as an explanation that an
+ * updated version of Growl is included in your application and
+ * no download is required.
+ *
+ * If this is <code>NULL</code>, Growl will use a default, localized
+ * explanation.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlUpdateInformation;
+
+ /* This member is provided for use by your retain and release
+ * callbacks (see below).
+ *
+ * GrowlApplicationBridge never directly uses this member. Instead, it
+ * calls your retain callback (if non-<code>NULL</code>) and your release
+ * callback (if non-<code>NULL</code>).
+ */
+ unsigned referenceCount;
+
+ //Functions. Currently all of these are optional (any of them can be NULL).
+
+ /* When you call Growl_SetDelegate(newDelegate), it will call
+ * oldDelegate->release(oldDelegate), and then it will call
+ * newDelegate->retain(newDelegate), and the return value from retain
+ * is what will be set as the delegate.
+ * (This means that this member works like CFRetain and -[NSObject retain].)
+ * This member is optional (it can be <code>NULL</code>).
+ * For a delegate allocated with malloc, this member would be
+ * <code>NULL</code>.
+ * @result A delegate to which GrowlApplicationBridge holds a reference.
+ */
+ void *(*retain)(void *);
+ /* When you call Growl_SetDelegate(newDelegate), it will call
+ * oldDelegate->release(oldDelegate), and then it will call
+ * newDelegate->retain(newDelegate), and the return value from retain
+ * is what will be set as the delegate.
+ * (This means that this member works like CFRelease and
+ * -[NSObject release].)
+ * This member is optional (it can be NULL).
+ * For a delegate allocated with malloc, this member might be
+ * <code>free</code>(3).
+ */
+ void (*release)(void *);
+
+ /* Informs the delegate that Growl (specifically, the GrowlHelperApp) was
+ * launched successfully (or was already running). The application can
+ * take actions with the knowledge that Growl is installed and functional.
+ */
+ void (*growlIsReady)(void);
+
+ /* Informs the delegate that a Growl notification was clicked. It is only
+ * sent for notifications sent with a non-<code>NULL</code> clickContext,
+ * so if you want to receive a message when a notification is clicked,
+ * clickContext must not be <code>NULL</code> when calling
+ * Growl_PostNotification or
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
+ */
+ void (*growlNotificationWasClicked)(CFPropertyListRef clickContext);
+
+ /* Informs the delegate that a Growl notification timed out. It is only
+ * sent for notifications sent with a non-<code>NULL</code> clickContext,
+ * so if you want to receive a message when a notification is clicked,
+ * clickContext must not be <code>NULL</code> when calling
+ * Growl_PostNotification or
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
+ */
+ void (*growlNotificationTimedOut)(CFPropertyListRef clickContext);
+};
+
+/*! @struct Growl_Notification
+ * @abstract Structure describing a Growl notification.
+ * @discussion XXX
+ * @field size The size of the notification structure.
+ * @field name Identifies the notification.
+ * @field title Short synopsis of the notification.
+ * @field description Additional text.
+ * @field iconData An icon for the notification.
+ * @field priority An indicator of the notification's importance.
+ * @field reserved Bits reserved for future usage.
+ * @field isSticky Requests that a notification stay on-screen until dismissed explicitly.
+ * @field clickContext An identifier to be passed to your click callback when a notification is clicked.
+ * @field clickCallback A callback to call when the notification is clicked.
+ */
+struct Growl_Notification {
+ /* This should be sizeof(struct Growl_Notification).
+ */
+ size_t size;
+
+ /* The notification name distinguishes one type of
+ * notification from another. The name should be human-readable, as it
+ * will be displayed in the Growl preference pane.
+ *
+ * The name is used in the GROWL_NOTIFICATIONS_ALL and
+ * GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and
+ * in this member of the Growl_Notification structure.
+ */
+ CFStringRef name;
+
+ /* A notification's title describes the notification briefly.
+ * It should be easy to read quickly by the user.
+ */
+ CFStringRef title;
+
+ /* The description supplements the title with more
+ * information. It is usually longer and sometimes involves a list of
+ * subjects. For example, for a 'Download complete' notification, the
+ * description might have one filename per line. GrowlMail in Growl 0.6
+ * uses a description of '%d new mail(s)' (formatted with the number of
+ * messages).
+ */
+ CFStringRef description;
+
+ /* The notification icon usually indicates either what
+ * happened (it may have the same icon as e.g. a toolbar item that
+ * started the process that led to the notification), or what it happened
+ * to (e.g. a document icon).
+ *
+ * The icon data is optional, so it can be <code>NULL</code>. In that
+ * case, the application icon is used alone. Not all displays support
+ * icons.
+ *
+ * The data can be in any format supported by NSImage. As of Mac OS X
+ * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form
+ * ats.
+ */
+ CFDataRef iconData;
+
+ /* Priority is new in Growl 0.6, and is represented as a
+ * signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low
+ * priority, and +2 is Very High priority.
+ *
+ * Not all displays support priority. If you do not wish to assign a
+ * priority to your notification, assign 0.
+ */
+ signed int priority;
+
+ /* These bits are not used in Growl 0.6. Set them to 0.
+ */
+ unsigned reserved: 31;
+
+ /* When the sticky bit is clear, in most displays,
+ * notifications disappear after a certain amount of time. Sticky
+ * notifications, however, remain on-screen until the user dismisses them
+ * explicitly, usually by clicking them.
+ *
+ * Sticky notifications were introduced in Growl 0.6. Most notifications
+ * should not be sticky. Not all displays support sticky notifications,
+ * and the user may choose in Growl's preference pane to force the
+ * notification to be sticky or non-sticky, in which case the sticky bit
+ * in the notification will be ignored.
+ */
+ unsigned isSticky: 1;
+
+ /* If this is not <code>NULL</code>, and your click callback
+ * is not <code>NULL</code> either, this will be passed to the callback
+ * when your notification is clicked by the user.
+ *
+ * Click feedback was introduced in Growl 0.6, and it is optional. Not
+ * all displays support click feedback.
+ */
+ CFPropertyListRef clickContext;
+
+ /* If this is not <code>NULL</code>, it will be called instead
+ * of the Growl delegate's click callback when clickContext is
+ * non-<code>NULL</code> and the notification is clicked on by the user.
+ *
+ * Click feedback was introduced in Growl 0.6, and it is optional. Not
+ * all displays support click feedback.
+ *
+ * The per-notification click callback is not yet supported as of Growl
+ * 0.7.
+ */
+ void (*clickCallback)(CFPropertyListRef clickContext);
+
+ CFStringRef identifier;
+};
+
+#pragma mark -
+#pragma mark Easy initialisers
+
+/*! @defined InitGrowlDelegate
+ * @abstract Callable macro. Initializes a Growl delegate structure to defaults.
+ * @discussion Call with a pointer to a struct Growl_Delegate. All of the
+ * members of the structure will be set to 0 or <code>NULL</code>, except for
+ * size (which will be set to <code>sizeof(struct Growl_Delegate)</code>) and
+ * referenceCount (which will be set to 1).
+ */
+#define InitGrowlDelegate(delegate) \
+ do { \
+ if (delegate) { \
+ (delegate)->size = sizeof(struct Growl_Delegate); \
+ (delegate)->applicationName = NULL; \
+ (delegate)->registrationDictionary = NULL; \
+ (delegate)->applicationIconData = NULL; \
+ (delegate)->growlInstallationWindowTitle = NULL; \
+ (delegate)->growlInstallationInformation = NULL; \
+ (delegate)->growlUpdateWindowTitle = NULL; \
+ (delegate)->growlUpdateInformation = NULL; \
+ (delegate)->referenceCount = 1U; \
+ (delegate)->retain = NULL; \
+ (delegate)->release = NULL; \
+ (delegate)->growlIsReady = NULL; \
+ (delegate)->growlNotificationWasClicked = NULL; \
+ (delegate)->growlNotificationTimedOut = NULL; \
+ } \
+ } while(0)
+
+/*! @defined InitGrowlNotification
+ * @abstract Callable macro. Initializes a Growl notification structure to defaults.
+ * @discussion Call with a pointer to a struct Growl_Notification. All of
+ * the members of the structure will be set to 0 or <code>NULL</code>, except
+ * for size (which will be set to
+ * <code>sizeof(struct Growl_Notification)</code>).
+ */
+#define InitGrowlNotification(notification) \
+ do { \
+ if (notification) { \
+ (notification)->size = sizeof(struct Growl_Notification); \
+ (notification)->name = NULL; \
+ (notification)->title = NULL; \
+ (notification)->description = NULL; \
+ (notification)->iconData = NULL; \
+ (notification)->priority = 0; \
+ (notification)->reserved = 0U; \
+ (notification)->isSticky = false; \
+ (notification)->clickContext = NULL; \
+ (notification)->clickCallback = NULL; \
+ (notification)->identifier = NULL; \
+ } \
+ } while(0)
+
+#pragma mark -
+#pragma mark Public API
+
+// @functiongroup Managing the Growl delegate
+
+/*! @function Growl_SetDelegate
+ * @abstract Replaces the current Growl delegate with a new one, or removes
+ * the Growl delegate.
+ * @param newDelegate
+ * @result Returns false and does nothing else if a pointer that was passed in
+ * is unsatisfactory (because it is non-<code>NULL</code>, but at least one
+ * required member of it is <code>NULL</code>). Otherwise, sets or unsets the
+ * delegate and returns true.
+ * @discussion When <code>newDelegate</code> is non-<code>NULL</code>, sets
+ * the delegate to <code>newDelegate</code>. When it is <code>NULL</code>,
+ * the current delegate will be unset, and no delegate will be in place.
+ *
+ * It is legal for <code>newDelegate</code> to be the current delegate;
+ * nothing will happen, and Growl_SetDelegate will return true. It is also
+ * legal for it to be <code>NULL</code>, as described above; again, it will
+ * return true.
+ *
+ * If there was a delegate in place before the call, Growl_SetDelegate will
+ * call the old delegate's release member if it was non-<code>NULL</code>. If
+ * <code>newDelegate</code> is non-<code>NULL</code>, Growl_SetDelegate will
+ * call <code>newDelegate->retain</code>, and set the delegate to its return
+ * value.
+ *
+ * If you are using Growl-WithInstaller.framework, and an older version of
+ * Growl is installed on the user's system, the user will automatically be
+ * prompted to update.
+ *
+ * GrowlApplicationBridge currently does not copy this structure, nor does it
+ * retain any of the CF objects in the structure (it regards the structure as
+ * a container that retains the objects when they are added and releases them
+ * when they are removed or the structure is destroyed). Also,
+ * GrowlApplicationBridge currently does not modify any member of the
+ * structure, except possibly the referenceCount by calling the retain and
+ * release members.
+ */
+GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate);
+
+/*! @function Growl_GetDelegate
+ * @abstract Returns the current Growl delegate, if any.
+ * @result The current Growl delegate.
+ * @discussion Returns the last pointer passed into Growl_SetDelegate, or
+ * <code>NULL</code> if no such call has been made.
+ *
+ * This function follows standard Core Foundation reference-counting rules.
+ * Because it is a Get function, not a Copy function, it will not retain the
+ * delegate on your behalf. You are responsible for retaining and releasing
+ * the delegate as needed.
+ */
+GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void);
+
+#pragma mark -
+
+// @functiongroup Posting Growl notifications
+
+/*! @function Growl_PostNotification
+ * @abstract Posts a Growl notification.
+ * @param notification The notification to post.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>NULL</code> (or 0 or false as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl.
+ * If the user cancels, this function will have no effect until the next
+ * application session, at which time when it is called the user will be
+ * prompted again. The user is also given the option to not be prompted again.
+ * If the user does choose to install Growl, the requested notification will
+ * be displayed once Growl is installed and running.
+ */
+GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification);
+
+/*! @function Growl_PostNotificationWithDictionary
+* @abstract Notifies using a userInfo dictionary suitable for passing to
+* CFDistributedNotificationCenter.
+* @param userInfo The dictionary to notify with.
+* @discussion Before Growl 0.6, your application would have posted
+* notifications using CFDistributedNotificationCenter by creating a userInfo
+* dictionary with the notification data. This had the advantage of allowing
+* you to add other data to the dictionary for programs besides Growl that
+* might be listening.
+*
+* This function allows you to use such dictionaries without being restricted
+* to using CFDistributedNotificationCenter. The keys for this dictionary
+ * can be found in GrowlDefines.h.
+*/
+GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo);
+
+/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext
+ * @abstract Posts a Growl notification using parameter values.
+ * @param title The title of the notification.
+ * @param description The description of the notification.
+ * @param notificationName The name of the notification as listed in the
+ * registration dictionary.
+ * @param iconData Data representing a notification icon. Can be <code>NULL</code>.
+ * @param priority The priority of the notification (-2 to +2, with -2
+ * being Very Low and +2 being Very High).
+ * @param isSticky If true, requests that this notification wait for a
+ * response from the user.
+ * @param clickContext An object to pass to the clickCallback, if any. Can
+ * be <code>NULL</code>, in which case the clickCallback is not called.
+ * @discussion Creates a temporary Growl_Notification, fills it out with the
+ * supplied information, and calls Growl_PostNotification on it.
+ * See struct Growl_Notification and Growl_PostNotification for more
+ * information.
+ *
+ * The icon data can be in any format supported by NSImage. As of Mac OS X
+ * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats.
+ */
+GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext(
+ /*inhale*/
+ CFStringRef title,
+ CFStringRef description,
+ CFStringRef notificationName,
+ CFDataRef iconData,
+ signed int priority,
+ Boolean isSticky,
+ CFPropertyListRef clickContext);
+
+#pragma mark -
+
+// @functiongroup Registering
+
+/*! @function Growl_RegisterWithDictionary
+ * @abstract Register your application with Growl without setting a delegate.
+ * @discussion When you call this function with a dictionary,
+ * GrowlApplicationBridge registers your application using that dictionary.
+ * If you pass <code>NULL</code>, GrowlApplicationBridge will ask the delegate
+ * (if there is one) for a dictionary, and if that doesn't work, it will look
+ * in your application's bundle for an auto-discoverable plist.
+ * (XXX refer to more information on that)
+ *
+ * If you pass a dictionary to this function, it must include the
+ * <code>GROWL_APP_NAME</code> key, unless a delegate is set.
+ *
+ * This function is mainly an alternative to the delegate system introduced
+ * with Growl 0.6. Without a delegate, you cannot receive callbacks such as
+ * <code>growlIsReady</code> (since they are sent to the delegate). You can,
+ * however, set a delegate after registering without one.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result <code>false</code> if registration failed (e.g. if Growl isn't installed).
+ */
+GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict);
+
+/*! @function Growl_Reregister
+ * @abstract Updates your registration with Growl.
+ * @discussion If your application changes the contents of the
+ * GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the
+ * Growl delegate, or if it changes the value of that member, or if it
+ * changes the contents of its auto-discoverable plist, call this function
+ * to have Growl update its registration information for your application.
+ *
+ * Otherwise, this function does not normally need to be called. If you're
+ * using a delegate, your application will be registered when you set the
+ * delegate if both the delegate and its registrationDictionary member are
+ * non-<code>NULL</code>.
+ *
+ * This function is now implemented using
+ * <code>Growl_RegisterWithDictionary</code>.
+ */
+GROWL_EXPORT void Growl_Reregister(void);
+
+#pragma mark -
+
+/*! @function Growl_SetWillRegisterWhenGrowlIsReady
+ * @abstract Tells GrowlApplicationBridge to register with Growl when Growl
+ * launches (or not).
+ * @discussion When Growl has started listening for notifications, it posts a
+ * <code>GROWL_IS_READY</code> notification on the Distributed Notification
+ * Center. GrowlApplicationBridge listens for this notification, using it to
+ * perform various tasks (such as calling your delegate's
+ * <code>growlIsReady</code> callback, if it has one). If this function is
+ * called with <code>true</code>, one of those tasks will be to reregister
+ * with Growl (in the manner of <code>Growl_Reregister</code>).
+ *
+ * This attribute is automatically set back to <code>false</code>
+ * (the default) after every <code>GROWL_IS_READY</code> notification.
+ * @param flag <code>true</code> if you want GrowlApplicationBridge to register with
+ * Growl when next it is ready; <code>false</code> if not.
+ */
+GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag);
+/*! @function Growl_WillRegisterWhenGrowlIsReady
+ * @abstract Reports whether GrowlApplicationBridge will register with Growl
+ * when Growl next launches.
+ * @result <code>true</code> if GrowlApplicationBridge will register with
+ * Growl when next it posts GROWL_IS_READY; <code>false</code> if not.
+ */
+GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void);
+
+#pragma mark -
+
+// @functiongroup Obtaining registration dictionaries
+
+/*! @function Growl_CopyRegistrationDictionaryFromDelegate
+ * @abstract Asks the delegate for a registration dictionary.
+ * @discussion If no delegate is set, or if the delegate's
+ * <code>registrationDictionary</code> member is <code>NULL</code>, this
+ * function returns <code>NULL</code>.
+ *
+ * This function does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> or
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
+ * to try to fill in missing keys.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void);
+
+/*! @function Growl_CopyRegistrationDictionaryFromBundle
+ * @abstract Looks in a bundle for a registration dictionary.
+ * @discussion This function looks in a bundle for an auto-discoverable
+ * registration dictionary file using <code>CFBundleCopyResourceURL</code>.
+ * If it finds one, it loads the file using <code>CFPropertyList</code> and
+ * returns the result.
+ *
+ * If you pass <code>NULL</code> as the bundle, the main bundle is examined.
+ *
+ * This function does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary:</code> or
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
+ * to try to fill in missing keys.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle);
+
+/*! @function Growl_CreateBestRegistrationDictionary
+ * @abstract Obtains a registration dictionary, filled out to the best of
+ * GrowlApplicationBridge's knowledge.
+ * @discussion This function creates a registration dictionary as best
+ * GrowlApplicationBridge knows how.
+ *
+ * First, GrowlApplicationBridge examines the Growl delegate (if there is
+ * one) and gets the registration dictionary from that. If no such dictionary
+ * was obtained, GrowlApplicationBridge looks in your application's main
+ * bundle for an auto-discoverable registration dictionary file. If that
+ * doesn't exist either, this function returns <code>NULL</code>.
+ *
+ * Second, GrowlApplicationBridge calls
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> with
+ * whatever dictionary was obtained. The result of that function is the
+ * result of this function.
+ *
+ * GrowlApplicationBridge uses this function when you call
+ * <code>Growl_SetDelegate</code>, or when you call
+ * <code>Growl_RegisterWithDictionary</code> with <code>NULL</code>.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void);
+
+#pragma mark -
+
+// @functiongroup Filling in registration dictionaries
+
+/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @param regDict The dictionary to fill in.
+ * @result The dictionary with the keys filled in.
+ * @discussion This function examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Keys are only filled in if missing; if a key is present in the dictionary,
+ * its value will not be changed.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict);
+/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @param regDict The dictionary to fill in.
+ * @param keys The keys to fill in. If <code>NULL</code>, any missing keys are filled in.
+ * @result The dictionary with the keys filled in.
+ * @discussion This function examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Only those keys that are listed in <code>keys</code> will be filled in.
+ * Other missing keys are ignored. Also, keys are only filled in if missing;
+ * if a key is present in the dictionary, its value will not be changed.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys);
+
+/*! @brief Tries to fill in missing keys in a notification dictionary.
+ * @param notifDict The dictionary to fill in.
+ * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
+ * @discussion This function examines the \a notifDict for missing keys, and
+ * tries to get them from the last known registration dictionary. As of 1.1,
+ * the keys that it will look for are:
+ *
+ * \li <code>GROWL_APP_NAME</code>
+ * \li <code>GROWL_APP_ICON</code>
+ *
+ * @since Growl.framework 1.1
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict);
+
+#pragma mark -
+
+// @functiongroup Querying Growl's status
+
+/*! @function Growl_IsInstalled
+ * @abstract Determines whether the Growl prefpane and its helper app are
+ * installed.
+ * @result Returns true if Growl is installed, false otherwise.
+ */
+GROWL_EXPORT Boolean Growl_IsInstalled(void);
+
+/*! @function Growl_IsRunning
+ * @abstract Cycles through the process list to find whether GrowlHelperApp
+ * is running.
+ * @result Returns true if Growl is running, false otherwise.
+ */
+GROWL_EXPORT Boolean Growl_IsRunning(void);
+
+#pragma mark -
+
+// @functiongroup Launching Growl
+
+/*! @typedef GrowlLaunchCallback
+ * @abstract Callback to notify you that Growl is running.
+ * @param context The context pointer passed to Growl_LaunchIfInstalled.
+ * @discussion Growl_LaunchIfInstalled calls this callback function if Growl
+ * was already running or if it launched Growl successfully.
+ */
+typedef void (*GrowlLaunchCallback)(void *context);
+
+/*! @function Growl_LaunchIfInstalled
+ * @abstract Launches GrowlHelperApp if it is not already running.
+ * @param callback A callback function which will be called if Growl was successfully
+ * launched or was already running. Can be <code>NULL</code>.
+ * @param context The context pointer to pass to the callback. Can be <code>NULL</code>.
+ * @result Returns true if Growl was successfully launched or was already
+ * running; returns false and does not call the callback otherwise.
+ * @discussion Returns true and calls the callback (if the callback is not
+ * <code>NULL</code>) if the Growl helper app began launching or was already
+ * running. Returns false and performs no other action if Growl could not be
+ * launched (e.g. because the Growl preference pane is not properly installed).
+ *
+ * If <code>Growl_CreateBestRegistrationDictionary</code> returns
+ * non-<code>NULL</code>, this function will register with Growl atomically.
+ *
+ * The callback should take a single argument; this is to allow applications
+ * to have context-relevant information passed back. It is perfectly
+ * acceptable for context to be <code>NULL</code>. The callback itself can be
+ * <code>NULL</code> if you don't want one.
+ */
+GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context);
+
+#pragma mark -
+#pragma mark Constants
+
+/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER
+ * @abstract The CFBundleIdentifier of the Growl preference pane bundle.
+ * @discussion GrowlApplicationBridge uses this to determine whether Growl is
+ * currently installed, by searching for the Growl preference pane. Your
+ * application probably does not need to use this macro itself.
+ */
+#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER
+#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel")
+#endif
+
+__END_DECLS
+
+#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */
Added: trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlApplicationBridge.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,575 @@
+//
+// GrowlApplicationBridge.h
+// Growl
+//
+// Created by Evan Schoenberg on Wed Jun 16 2004.
+// Copyright 2004-2006 The Growl Project. All rights reserved.
+//
+
+/*!
+ * @header GrowlApplicationBridge.h
+ * @abstract Defines the GrowlApplicationBridge class.
+ * @discussion This header defines the GrowlApplicationBridge class as well as
+ * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant.
+ */
+
+#ifndef __GrowlApplicationBridge_h__
+#define __GrowlApplicationBridge_h__
+
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+#import "GrowlDefines.h"
+
+//Forward declarations
+ at protocol GrowlApplicationBridgeDelegate;
+
+//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation)
+#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install"
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @class GrowlApplicationBridge
+ * @abstract A class used to interface with Growl.
+ * @discussion This class provides a means to interface with Growl.
+ *
+ * Currently it provides a way to detect if Growl is installed and launch the
+ * GrowlHelperApp if it's not already running.
+ */
+ at interface GrowlApplicationBridge : NSObject {
+
+}
+
+/*!
+ * @method isGrowlInstalled
+ * @abstract Detects whether Growl is installed.
+ * @discussion Determines if the Growl prefpane and its helper app are installed.
+ * @result Returns YES if Growl is installed, NO otherwise.
+ */
++ (BOOL) isGrowlInstalled;
+
+/*!
+ * @method isGrowlRunning
+ * @abstract Detects whether GrowlHelperApp is currently running.
+ * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings.
+ * @result Returns YES if GrowlHelperApp is running, NO otherwise.
+ */
++ (BOOL) isGrowlRunning;
+
+#pragma mark -
+
+/*!
+ * @method setGrowlDelegate:
+ * @abstract Set the object which will be responsible for providing and receiving Growl information.
+ * @discussion This must be called before using GrowlApplicationBridge.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate protocol are required
+ * and return the basic information needed to register with Growl.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol
+ * informal protocol are individually optional. They provide a greater
+ * degree of interaction between the application and growl such as informing
+ * the application when one of its Growl notifications is clicked by the user.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol
+ * informal protocol are individually optional and are only applicable when
+ * using the Growl-WithInstaller.framework which allows for automated Growl
+ * installation.
+ *
+ * When this method is called, data will be collected from inDelegate, Growl
+ * will be launched if it is not already running, and the application will be
+ * registered with Growl.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is already installed
+ * but this copy of the framework has an updated version of Growl, the user
+ * will be prompted to update automatically.
+ *
+ * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol.
+ */
++ (void) setGrowlDelegate:(NSObject<GrowlApplicationBridgeDelegate> *)inDelegate;
+
+/*!
+ * @method growlDelegate
+ * @abstract Return the object responsible for providing and receiving Growl information.
+ * @discussion See setGrowlDelegate: for details.
+ * @result The Growl delegate.
+ */
++ (NSObject<GrowlApplicationBridgeDelegate> *) growlDelegate;
+
+#pragma mark -
+
+/*!
+ * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:
+ * @abstract Send a Growl notification.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>nil</code> (or 0 or NO as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl. If the user cancels, this method
+ * will have no effect until the next application session, at which time when
+ * it is called the user will be prompted again. The user is also given the
+ * option to not be prompted again. If the user does choose to install Growl,
+ * the requested notification will be displayed once Growl is installed and
+ * running.
+ *
+ * @param title The title of the notification displayed to the user.
+ * @param description The full description of the notification displayed to the user.
+ * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
+ * @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
+ * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
+ * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
+ * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
+ */
++ (void) notifyWithTitle:(NSString *)title
+ description:(NSString *)description
+ notificationName:(NSString *)notifName
+ iconData:(NSData *)iconData
+ priority:(signed int)priority
+ isSticky:(BOOL)isSticky
+ clickContext:(id)clickContext;
+
+/*!
+ * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:
+ * @abstract Send a Growl notification.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>nil</code> (or 0 or NO as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl. If the user cancels, this method
+ * will have no effect until the next application session, at which time when
+ * it is called the user will be prompted again. The user is also given the
+ * option to not be prompted again. If the user does choose to install Growl,
+ * the requested notification will be displayed once Growl is installed and
+ * running.
+ *
+ * @param title The title of the notification displayed to the user.
+ * @param description The full description of the notification displayed to the user.
+ * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
+ * @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
+ * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
+ * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
+ * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
+ * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced.
+ */
++ (void) notifyWithTitle:(NSString *)title
+ description:(NSString *)description
+ notificationName:(NSString *)notifName
+ iconData:(NSData *)iconData
+ priority:(signed int)priority
+ isSticky:(BOOL)isSticky
+ clickContext:(id)clickContext
+ identifier:(NSString *)identifier;
+
+/*! @method notifyWithDictionary:
+ * @abstract Notifies using a userInfo dictionary suitable for passing to
+ * <code>NSDistributedNotificationCenter</code>.
+ * @param userInfo The dictionary to notify with.
+ * @discussion Before Growl 0.6, your application would have posted
+ * notifications using <code>NSDistributedNotificationCenter</code> by
+ * creating a userInfo dictionary with the notification data. This had the
+ * advantage of allowing you to add other data to the dictionary for programs
+ * besides Growl that might be listening.
+ *
+ * This method allows you to use such dictionaries without being restricted
+ * to using <code>NSDistributedNotificationCenter</code>. The keys for this dictionary
+ * can be found in GrowlDefines.h.
+ */
++ (void) notifyWithDictionary:(NSDictionary *)userInfo;
+
+#pragma mark -
+
+/*! @method registerWithDictionary:
+ * @abstract Register your application with Growl without setting a delegate.
+ * @discussion When you call this method with a dictionary,
+ * GrowlApplicationBridge registers your application using that dictionary.
+ * If you pass <code>nil</code>, GrowlApplicationBridge will ask the delegate
+ * (if there is one) for a dictionary, and if that doesn't work, it will look
+ * in your application's bundle for an auto-discoverable plist.
+ * (XXX refer to more information on that)
+ *
+ * If you pass a dictionary to this method, it must include the
+ * <code>GROWL_APP_NAME</code> key, unless a delegate is set.
+ *
+ * This method is mainly an alternative to the delegate system introduced
+ * with Growl 0.6. Without a delegate, you cannot receive callbacks such as
+ * <code>-growlIsReady</code> (since they are sent to the delegate). You can,
+ * however, set a delegate after registering without one.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ */
++ (BOOL) registerWithDictionary:(NSDictionary *)regDict;
+
+/*! @method reregisterGrowlNotifications
+ * @abstract Reregister the notifications for this application.
+ * @discussion This method does not normally need to be called. If your
+ * application changes what notifications it is registering with Growl, call
+ * this method to have the Growl delegate's
+ * <code>-registrationDictionaryForGrowl</code> method called again and the
+ * Growl registration information updated.
+ *
+ * This method is now implemented using <code>-registerWithDictionary:</code>.
+ */
++ (void) reregisterGrowlNotifications;
+
+#pragma mark -
+
+/*! @method setWillRegisterWhenGrowlIsReady:
+ * @abstract Tells GrowlApplicationBridge to register with Growl when Growl
+ * launches (or not).
+ * @discussion When Growl has started listening for notifications, it posts a
+ * <code>GROWL_IS_READY</code> notification on the Distributed Notification
+ * Center. GrowlApplicationBridge listens for this notification, using it to
+ * perform various tasks (such as calling your delegate's
+ * <code>-growlIsReady</code> method, if it has one). If this method is
+ * called with <code>YES</code>, one of those tasks will be to reregister
+ * with Growl (in the manner of <code>-reregisterGrowlNotifications</code>).
+ *
+ * This attribute is automatically set back to <code>NO</code> (the default)
+ * after every <code>GROWL_IS_READY</code> notification.
+ * @param flag <code>YES</code> if you want GrowlApplicationBridge to register with
+ * Growl when next it is ready; <code>NO</code> if not.
+ */
++ (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag;
+/*! @method willRegisterWhenGrowlIsReady
+ * @abstract Reports whether GrowlApplicationBridge will register with Growl
+ * when Growl next launches.
+ * @result <code>YES</code> if GrowlApplicationBridge will register with Growl
+ * when next it posts GROWL_IS_READY; <code>NO</code> if not.
+ */
++ (BOOL) willRegisterWhenGrowlIsReady;
+
+#pragma mark -
+
+/*! @method registrationDictionaryFromDelegate
+ * @abstract Asks the delegate for a registration dictionary.
+ * @discussion If no delegate is set, or if the delegate's
+ * <code>-registrationDictionaryForGrowl</code> method returns
+ * <code>nil</code>, this method returns <code>nil</code>.
+ *
+ * This method does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:]</code> or
+ * <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
+ * to fill in missing keys.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) registrationDictionaryFromDelegate;
+
+/*! @method registrationDictionaryFromBundle:
+ * @abstract Looks in a bundle for a registration dictionary.
+ * @discussion This method looks in a bundle for an auto-discoverable
+ * registration dictionary file using <code>-[NSBundle
+ * pathForResource:ofType:]</code>. If it finds one, it loads the file using
+ * <code>+[NSDictionary dictionaryWithContentsOfFile:]</code> and returns the
+ * result.
+ *
+ * If you pass <code>nil</code> as the bundle, the main bundle is examined.
+ *
+ * This method does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:]</code> or
+ * <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
+ * to fill in missing keys.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle;
+
+/*! @method bestRegistrationDictionary
+ * @abstract Obtains a registration dictionary, filled out to the best of
+ * GrowlApplicationBridge's knowledge.
+ * @discussion This method creates a registration dictionary as best
+ * GrowlApplicationBridge knows how.
+ *
+ * First, GrowlApplicationBridge contacts the Growl delegate (if there is
+ * one) and gets the registration dictionary from that. If no such dictionary
+ * was obtained, GrowlApplicationBridge looks in your application's main
+ * bundle for an auto-discoverable registration dictionary file. If that
+ * doesn't exist either, this method returns <code>nil</code>.
+ *
+ * Second, GrowlApplicationBridge calls
+ * <code>+registrationDictionaryByFillingInDictionary:</code> with whatever
+ * dictionary was obtained. The result of that method is the result of this
+ * method.
+ *
+ * GrowlApplicationBridge uses this method when you call
+ * <code>+setGrowlDelegate:</code>, or when you call
+ * <code>+registerWithDictionary:</code> with <code>nil</code>.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) bestRegistrationDictionary;
+
+#pragma mark -
+
+/*! @method registrationDictionaryByFillingInDictionary:
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @discussion This method examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Keys are only filled in if missing; if a key is present in the dictionary,
+ * its value will not be changed.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @param regDict The dictionary to fill in.
+ * @result The dictionary with the keys filled in. This is an autoreleased
+ * copy of <code>regDict</code>.
+ */
++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
+/*! @method registrationDictionaryByFillingInDictionary:restrictToKeys:
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @discussion This method examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Only those keys that are listed in <code>keys</code> will be filled in.
+ * Other missing keys are ignored. Also, keys are only filled in if missing;
+ * if a key is present in the dictionary, its value will not be changed.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @param regDict The dictionary to fill in.
+ * @param keys The keys to fill in. If <code>nil</code>, any missing keys are filled in.
+ * @result The dictionary with the keys filled in. This is an autoreleased
+ * copy of <code>regDict</code>.
+ */
++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys;
+
+/*! @brief Tries to fill in missing keys in a notification dictionary.
+ * @param notifDict The dictionary to fill in.
+ * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
+ * @discussion This function examines the \a notifDict for missing keys, and
+ * tries to get them from the last known registration dictionary. As of 1.1,
+ * the keys that it will look for are:
+ *
+ * \li <code>GROWL_APP_NAME</code>
+ * \li <code>GROWL_APP_ICON</code>
+ *
+ * @since Growl.framework 1.1
+ */
++ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
+
++ (NSDictionary *) frameworkInfoDictionary;
+ at end
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @protocol GrowlApplicationBridgeDelegate
+ * @abstract Required protocol for the Growl delegate.
+ * @discussion The methods in this protocol are required and are called
+ * automatically as needed by GrowlApplicationBridge. See
+ * <code>+[GrowlApplicationBridge setGrowlDelegate:]</code>.
+ * See also <code>GrowlApplicationBridgeDelegate_InformalProtocol</code>.
+ */
+
+ at protocol GrowlApplicationBridgeDelegate
+
+// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7.
+
+ at end
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol)
+ * @abstract Methods which may be optionally implemented by the GrowlDelegate.
+ * @discussion The methods in this informal protocol will only be called if implemented by the delegate.
+ */
+ at interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol)
+
+/*!
+ * @method registrationDictionaryForGrowl
+ * @abstract Return the dictionary used to register this application with Growl.
+ * @discussion The returned dictionary gives Growl the complete list of
+ * notifications this application will ever send, and it also specifies which
+ * notifications should be enabled by default. Each is specified by an array
+ * of <code>NSString</code> objects.
+ *
+ * For most applications, these two arrays can be the same (if all sent
+ * notifications should be displayed by default).
+ *
+ * The <code>NSString</code> objects of these arrays will correspond to the
+ * <code>notificationName:</code> parameter passed in
+ * <code>+[GrowlApplicationBridge
+ * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]</code> calls.
+ *
+ * The dictionary should have the required key object pairs:
+ * key: GROWL_NOTIFICATIONS_ALL object: <code>NSArray</code> of <code>NSString</code> objects
+ * key: GROWL_NOTIFICATIONS_DEFAULT object: <code>NSArray</code> of <code>NSString</code> objects
+ *
+ * The dictionary may have the following key object pairs:
+ * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: <code>NSDictionary</code> of key: notification name object: human-readable notification name
+ *
+ * You do not need to implement this method if you have an auto-discoverable
+ * plist file in your app bundle. (XXX refer to more information on that)
+ *
+ * @result The <code>NSDictionary</code> to use for registration.
+ */
+- (NSDictionary *) registrationDictionaryForGrowl;
+
+/*!
+ * @method applicationNameForGrowl
+ * @abstract Return the name of this application which will be used for Growl bookkeeping.
+ * @discussion This name is used both internally and in the Growl preferences.
+ *
+ * This should remain stable between different versions and incarnations of
+ * your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ *
+ * You do not need to implement this method if you are providing the
+ * application name elsewhere, meaning in an auto-discoverable plist file in
+ * your app bundle (XXX refer to more information on that) or in the result
+ * of -registrationDictionaryForGrowl.
+ *
+ * @result The name of the application using Growl.
+ */
+- (NSString *) applicationNameForGrowl;
+
+/*!
+ * @method applicationIconForGrowl
+ * @abstract Return the <code>NSImage</code> to treat as the application icon.
+ * @discussion The delegate may optionally return an <code>NSImage</code>
+ * object to use as the application icon. If this method is not implemented,
+ * {{{-applicationIconDataForGrowl}}} is tried. If that method is not
+ * implemented, the application's own icon is used. Neither method is
+ * generally needed.
+ * @result The <code>NSImage</code> to treat as the application icon.
+ */
+- (NSImage *) applicationIconForGrowl;
+
+/*!
+ * @method applicationIconDataForGrowl
+ * @abstract Return the <code>NSData</code> to treat as the application icon.
+ * @discussion The delegate may optionally return an <code>NSData</code>
+ * object to use as the application icon; if this is not implemented, the
+ * application's own icon is used. This is not generally needed.
+ * @result The <code>NSData</code> to treat as the application icon.
+ * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}.
+ */
+- (NSData *) applicationIconDataForGrowl;
+
+/*!
+ * @method growlIsReady
+ * @abstract Informs the delegate that Growl has launched.
+ * @discussion Informs the delegate that Growl (specifically, the
+ * GrowlHelperApp) was launched successfully. The application can take actions
+ * with the knowledge that Growl is installed and functional.
+ */
+- (void) growlIsReady;
+
+/*!
+ * @method growlNotificationWasClicked:
+ * @abstract Informs the delegate that a Growl notification was clicked.
+ * @discussion Informs the delegate that a Growl notification was clicked. It
+ * is only sent for notifications sent with a non-<code>nil</code>
+ * clickContext, so if you want to receive a message when a notification is
+ * clicked, clickContext must not be <code>nil</code> when calling
+ * <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
+ * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
+ */
+- (void) growlNotificationWasClicked:(id)clickContext;
+
+/*!
+ * @method growlNotificationTimedOut:
+ * @abstract Informs the delegate that a Growl notification timed out.
+ * @discussion Informs the delegate that a Growl notification timed out. It
+ * is only sent for notifications sent with a non-<code>nil</code>
+ * clickContext, so if you want to receive a message when a notification is
+ * clicked, clickContext must not be <code>nil</code> when calling
+ * <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
+ * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
+ */
+- (void) growlNotificationTimedOut:(id)clickContext;
+
+ at end
+
+#pragma mark -
+/*!
+ * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
+ * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework.
+ * @discussion The methods in this informal protocol will only be called if
+ * implemented by the delegate. They allow greater control of the information
+ * presented to the user when installing or upgrading Growl from within your
+ * application when using Growl-WithInstaller.framework.
+ */
+ at interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
+
+/*!
+ * @method growlInstallationWindowTitle
+ * @abstract Return the title of the installation window.
+ * @discussion If not implemented, Growl will use a default, localized title.
+ * @result An NSString object to use as the title.
+ */
+- (NSString *)growlInstallationWindowTitle;
+
+/*!
+ * @method growlUpdateWindowTitle
+ * @abstract Return the title of the upgrade window.
+ * @discussion If not implemented, Growl will use a default, localized title.
+ * @result An NSString object to use as the title.
+ */
+- (NSString *)growlUpdateWindowTitle;
+
+/*!
+ * @method growlInstallationInformation
+ * @abstract Return the information to display when installing.
+ * @discussion This information may be as long or short as desired (the window
+ * will be sized to fit it). It will be displayed to the user as an
+ * explanation of what Growl is and what it can do in your application. It
+ * should probably note that no download is required to install.
+ *
+ * If this is not implemented, Growl will use a default, localized explanation.
+ * @result An NSAttributedString object to display.
+ */
+- (NSAttributedString *)growlInstallationInformation;
+
+/*!
+ * @method growlUpdateInformation
+ * @abstract Return the information to display when upgrading.
+ * @discussion This information may be as long or short as desired (the window
+ * will be sized to fit it). It will be displayed to the user as an
+ * explanation that an updated version of Growl is included in your
+ * application and no download is required.
+ *
+ * If this is not implemented, Growl will use a default, localized explanation.
+ * @result An NSAttributedString object to display.
+ */
+- (NSAttributedString *)growlUpdateInformation;
+
+ at end
+
+//private
+ at interface GrowlApplicationBridge (GrowlInstallationPrompt_private)
++ (void) _userChoseNotToInstallGrowl;
+ at end
+
+#endif /* __GrowlApplicationBridge_h__ */
Added: trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlDefines.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlDefines.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Headers/GrowlDefines.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,348 @@
+//
+// GrowlDefines.h
+//
+
+#ifndef _GROWLDEFINES_H
+#define _GROWLDEFINES_H
+
+#ifdef __OBJC__
+#define XSTR(x) (@x)
+#define STRING_TYPE NSString *
+#else
+#define XSTR CFSTR
+#define STRING_TYPE CFStringRef
+#endif
+
+/*! @header GrowlDefines.h
+ * @abstract Defines all the notification keys.
+ * @discussion Defines all the keys used for registration with Growl and for
+ * Growl notifications.
+ *
+ * Most applications should use the functions or methods of Growl.framework
+ * instead of posting notifications such as those described here.
+ * @updated 2004-01-25
+ */
+
+// UserInfo Keys for Registration
+#pragma mark UserInfo Keys for Registration
+
+/*! @group Registration userInfo keys */
+/* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification.
+ * @discussion The values of these keys describe the application and the
+ * notifications it may post.
+ *
+ * Your application must register with Growl before it can post Growl
+ * notifications (and have them not be ignored). However, as of Growl 0.6,
+ * posting GROWL_APP_REGISTRATION notifications directly is no longer the
+ * preferred way to register your application. Your application should instead
+ * use Growl.framework's delegate system.
+ * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
+ * more information.
+ */
+
+/*! @defined GROWL_APP_NAME
+ * @abstract The name of your application.
+ * @discussion The name of your application. This should remain stable between
+ * different versions and incarnations of your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ */
+#define GROWL_APP_NAME XSTR("ApplicationName")
+/*! @defined GROWL_APP_ID
+ * @abstract The bundle identifier of your application.
+ * @discussion The bundle identifier of your application. This key should
+ * be unique for your application while there may be several applications
+ * with the same GROWL_APP_NAME.
+ * This key is optional.
+ */
+#define GROWL_APP_ID XSTR("ApplicationId")
+/*! @defined GROWL_APP_ICON
+ * @abstract The image data for your application's icon.
+ * @discussion Image data representing your application's icon. This may be
+ * superimposed on a notification icon as a badge, used as the notification
+ * icon when a notification-specific icon is not supplied, or ignored
+ * altogether, depending on the display. Must be in a format supported by
+ * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_APP_ICON XSTR("ApplicationIcon")
+/*! @defined GROWL_NOTIFICATIONS_DEFAULT
+ * @abstract The array of notifications to turn on by default.
+ * @discussion These are the names of the notifications that should be enabled
+ * by default when your application registers for the first time. If your
+ * application reregisters, Growl will look here for any new notification
+ * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others.
+ */
+#define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications")
+/*! @defined GROWL_NOTIFICATIONS_ALL
+ * @abstract The array of all notifications your application can send.
+ * @discussion These are the names of all of the notifications that your
+ * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good
+ * notification names.
+ */
+#define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications")
+/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS
+ * @abstract A dictionary of human-readable names for your notifications.
+ * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL
+ * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display.
+ * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions.
+ * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed.
+ *
+ * This key is optional.
+ */
+#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames")
+/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS
+* @abstract A dictionary of descriptions of _when_ each notification occurs
+* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are
+* descriptions of _when_ each notification occurs, such as "You received a new mail message" or
+* "A file finished downloading".
+*
+* This key is optional.
+*/
+#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions")
+
+/*! @defined GROWL_TICKET_VERSION
+ * @abstract The version of your registration ticket.
+ * @discussion Include this key in a ticket plist file that you put in your
+ * application bundle for auto-discovery. The current ticket version is 1.
+ */
+#define GROWL_TICKET_VERSION XSTR("TicketVersion")
+// UserInfo Keys for Notifications
+#pragma mark UserInfo Keys for Notifications
+
+/*! @group Notification userInfo keys */
+/* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification.
+ * @discussion The values of these keys describe the content of a Growl
+ * notification.
+ *
+ * Not all of these keys are supported by all displays. Only the name, title,
+ * and description of a notification are universal. Most of the built-in
+ * displays do support all of these keys, and most other visual displays
+ * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays
+ * support only textual data.
+ */
+
+/*! @defined GROWL_NOTIFICATION_NAME
+ * @abstract The name of the notification.
+ * @discussion The name of the notification. Note that if you do not define
+ * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name
+ * will the one displayed within the Growl preference pane and should be human-readable.
+ */
+#define GROWL_NOTIFICATION_NAME XSTR("NotificationName")
+/*! @defined GROWL_NOTIFICATION_TITLE
+ * @abstract The title to display in the notification.
+ * @discussion The title of the notification. Should be very brief.
+ * The title usually says what happened, e.g. "Download complete".
+ */
+#define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle")
+/*! @defined GROWL_NOTIFICATION_DESCRIPTION
+ * @abstract The description to display in the notification.
+ * @discussion The description should be longer and more verbose than the title.
+ * The description usually tells the subject of the action,
+ * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes".
+ */
+#define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription")
+/*! @defined GROWL_NOTIFICATION_ICON
+ * @discussion Image data for the notification icon. Must be in a format
+ * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon")
+/*! @defined GROWL_NOTIFICATION_APP_ICON
+ * @discussion Image data for the application icon, in case GROWL_APP_ICON does
+ * not apply for some reason. Must be in a format supported by NSImage, such
+ * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon")
+/*! @defined GROWL_NOTIFICATION_PRIORITY
+ * @discussion The priority of the notification as an integer number from
+ * -2 to +2 (+2 being highest).
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority")
+/*! @defined GROWL_NOTIFICATION_STICKY
+ * @discussion A Boolean number controlling whether the notification is sticky.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky")
+/*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT
+ * @abstract Identifies which notification was clicked.
+ * @discussion An identifier for the notification for clicking purposes.
+ *
+ * This will be passed back to the application when the notification is
+ * clicked. It must be plist-encodable (a data, dictionary, array, number, or
+ * string object), and it should be unique for each notification you post.
+ * A good click context would be a UUID string returned by NSProcessInfo or
+ * CFUUID.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext")
+
+/*! @defined GROWL_DISPLAY_PLUGIN
+ * @discussion The name of a display plugin which should be used for this notification.
+ * Optional. If this key is not set or the specified display plugin does not
+ * exist, the display plugin stored in the application ticket is used. This key
+ * allows applications to use different default display plugins for their
+ * notifications. The user can still override those settings in the preference
+ * pane.
+ */
+#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin")
+
+/*! @defined GROWL_NOTIFICATION_IDENTIFIER
+ * @abstract An identifier for the notification for coalescing purposes.
+ * Notifications with the same identifier fall into the same class; only
+ * the last notification of a class is displayed on the screen. If a
+ * notification of the same class is currently being displayed, it is
+ * replaced by this notification.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier")
+
+/*! @defined GROWL_APP_PID
+ * @abstract The process identifier of the process which sends this
+ * notification. If this field is set, the application will only receive
+ * clicked and timed out notifications which originate from this process.
+ *
+ * Optional.
+ */
+#define GROWL_APP_PID XSTR("ApplicationPID")
+
+/*! @defined GROWL_NOTIFICATION_PROGRESS
+* @abstract If this key is set, it should contain a double value wrapped
+* in a NSNumber which describes some sort of progress (from 0.0 to 100.0).
+* If this is key is not set, no progress bar is shown.
+*
+* Optional. Not supported by all display plugins.
+*/
+#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress")
+
+// Notifications
+#pragma mark Notifications
+
+/*! @group Notification names */
+/* @abstract Names of distributed notifications used by Growl.
+ * @discussion These are notifications used by applications (directly or
+ * indirectly) to interact with Growl, and by Growl for interaction between
+ * its components.
+ *
+ * Most of these should no longer be used in Growl 0.6 and later, in favor of
+ * Growl.framework's GrowlApplicationBridge APIs.
+ */
+
+/*! @defined GROWL_APP_REGISTRATION
+ * @abstract The distributed notification for registering your application.
+ * @discussion This is the name of the distributed notification that can be
+ * used to register applications with Growl.
+ *
+ * The userInfo dictionary for this notification can contain these keys:
+ * <ul>
+ * <li>GROWL_APP_NAME</li>
+ * <li>GROWL_APP_ICON</li>
+ * <li>GROWL_NOTIFICATIONS_ALL</li>
+ * <li>GROWL_NOTIFICATIONS_DEFAULT</li>
+ * </ul>
+ *
+ * No longer recommended as of Growl 0.6. An alternate method of registering
+ * is to use Growl.framework's delegate system.
+ * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
+ * more information.
+ */
+#define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification")
+/*! @defined GROWL_APP_REGISTRATION_CONF
+ * @abstract The distributed notification for confirming registration.
+ * @discussion The name of the distributed notification sent to confirm the
+ * registration. Used by the Growl preference pane. Your application probably
+ * does not need to use this notification.
+ */
+#define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification")
+/*! @defined GROWL_NOTIFICATION
+ * @abstract The distributed notification for Growl notifications.
+ * @discussion This is what it all comes down to. This is the name of the
+ * distributed notification that your application posts to actually send a
+ * Growl notification.
+ *
+ * The userInfo dictionary for this notification can contain these keys:
+ * <ul>
+ * <li>GROWL_NOTIFICATION_NAME (required)</li>
+ * <li>GROWL_NOTIFICATION_TITLE (required)</li>
+ * <li>GROWL_NOTIFICATION_DESCRIPTION (required)</li>
+ * <li>GROWL_NOTIFICATION_ICON</li>
+ * <li>GROWL_NOTIFICATION_APP_ICON</li>
+ * <li>GROWL_NOTIFICATION_PRIORITY</li>
+ * <li>GROWL_NOTIFICATION_STICKY</li>
+ * <li>GROWL_NOTIFICATION_CLICK_CONTEXT</li>
+ * <li>GROWL_APP_NAME (required)</li>
+ * </ul>
+ *
+ * No longer recommended as of Growl 0.6. Three alternate methods of posting
+ * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:],
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and
+ * Growl_PostNotification.
+ */
+#define GROWL_NOTIFICATION XSTR("GrowlNotification")
+/*! @defined GROWL_SHUTDOWN
+* @abstract The distributed notification name that tells Growl to shutdown.
+* @discussion The Growl preference pane posts this notification when the
+* "Stop Growl" button is clicked.
+*/
+#define GROWL_SHUTDOWN XSTR("GrowlShutdown")
+/*! @defined GROWL_PING
+ * @abstract A distributed notification to check whether Growl is running.
+ * @discussion This is used by the Growl preference pane. If it receives a
+ * GROWL_PONG, the preference pane takes this to mean that Growl is running.
+ */
+#define GROWL_PING XSTR("Honey, Mind Taking Out The Trash")
+/*! @defined GROWL_PONG
+ * @abstract The distributed notification sent in reply to GROWL_PING.
+ * @discussion GrowlHelperApp posts this in reply to GROWL_PING.
+ */
+#define GROWL_PONG XSTR("What Do You Want From Me, Woman")
+/*! @defined GROWL_IS_READY
+ * @abstract The distributed notification sent when Growl starts up.
+ * @discussion GrowlHelperApp posts this when it has begin listening on all of
+ * its sources for new notifications. GrowlApplicationBridge (in
+ * Growl.framework), upon receiving this notification, reregisters using the
+ * registration dictionary supplied by its delegate.
+ */
+#define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!")
+/*! @defined GROWL_NOTIFICATION_CLICKED
+ * @abstract The distributed notification sent when a supported notification is clicked.
+ * @discussion When a Growl notification with a click context is clicked on by
+ * the user, Growl posts this distributed notification.
+ * The GrowlApplicationBridge responds to this notification by calling a
+ * callback in its delegate.
+ */
+#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!")
+#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!")
+
+/*! @group Other symbols */
+/* Symbols which don't fit into any of the other categories. */
+
+/*! @defined GROWL_KEY_CLICKED_CONTEXT
+ * @abstract Used internally as the key for the clickedContext passed over DNC.
+ * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the
+ * click context that was supplied in the original notification.
+ */
+#define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext")
+/*! @defined GROWL_REG_DICT_EXTENSION
+ * @abstract The filename extension for registration dictionaries.
+ * @discussion The GrowlApplicationBridge in Growl.framework registers with
+ * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION)
+ * and opening it in the GrowlHelperApp. This happens whether or not Growl is
+ * running; if it was stopped, it quits immediately without listening for
+ * notifications.
+ */
+#define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict")
+
+
+#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition"
+
+#endif //ndef _GROWLDEFINES_H
Added: trunk/src/uimac14/Frameworks/Growl.framework/Resources/Info.plist
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Resources/Info.plist (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Resources/Info.plist 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,24 @@
+<?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>English</string>
+ <key>CFBundleExecutable</key>
+ <string>Growl</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.growl.growlframework</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.2.1</string>
+ <key>CFBundleSignature</key>
+ <string>GRRR</string>
+ <key>CFBundleVersion</key>
+ <string>1.2.1</string>
+ <key>NSPrincipalClass</key>
+ <string>GrowlApplicationBridge</string>
+</dict>
+</plist>
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Growl
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Growl
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Growl 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Growl 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Growl
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/Growl.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/Growl.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/Growl.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,6 @@
+#include "GrowlDefines.h"
+
+#ifdef __OBJC__
+# include "GrowlApplicationBridge.h"
+#endif
+#include "GrowlApplicationBridge-Carbon.h"
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,780 @@
+//
+// GrowlApplicationBridge-Carbon.h
+// Growl
+//
+// Created by Mac-arena the Bored Zo on Wed Jun 18 2004.
+// Based on GrowlApplicationBridge.h by Evan Schoenberg.
+// This source code is in the public domain. You may freely link it into any
+// program.
+//
+
+#ifndef _GROWLAPPLICATIONBRIDGE_CARBON_H_
+#define _GROWLAPPLICATIONBRIDGE_CARBON_H_
+
+#include <sys/cdefs.h>
+#include <Carbon/Carbon.h>
+
+#ifndef GROWL_EXPORT
+#define GROWL_EXPORT __attribute__((visibility("default"))) DEPRECATED_ATTRIBUTE
+#endif
+
+/*! @header GrowlApplicationBridge-Carbon.h
+ * @abstract Declares an API that Carbon applications can use to interact with Growl.
+ * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX
+ * to Growl (such as your application's name and what notifications it may
+ * post) and to provide information to your application (such as that Growl
+ * is listening for notifications or that a notification has been clicked).
+ *
+ * You can set the Growldelegate with Growl_SetDelegate and find out the
+ * current delegate with Growl_GetDelegate. See struct Growl_Delegate for more
+ * information about the delegate.
+ */
+
+__BEGIN_DECLS
+
+/*! @struct Growl_Delegate
+ * @abstract Delegate to supply GrowlApplicationBridge with information and respond to events.
+ * @discussion The Growl delegate provides your interface to
+ * GrowlApplicationBridge. When GrowlApplicationBridge needs information about
+ * your application, it looks for it in the delegate; when Growl or the user
+ * does something that you might be interested in, GrowlApplicationBridge
+ * looks for a callback in the delegate and calls it if present
+ * (meaning, if it is not <code>NULL</code>).
+ * XXX on all of that
+ * @field size The size of the delegate structure.
+ * @field applicationName The name of your application.
+ * @field registrationDictionary A dictionary describing your application and the notifications it can send out.
+ * @field applicationIconData Your application's icon.
+ * @field growlInstallationWindowTitle The title of the installation window.
+ * @field growlInstallationInformation Text to display in the installation window.
+ * @field growlUpdateWindowTitle The title of the update window.
+ * @field growlUpdateInformation Text to display in the update window.
+ * @field referenceCount A count of owners of the delegate.
+ * @field retain Called when GrowlApplicationBridge receives this delegate.
+ * @field release Called when GrowlApplicationBridge no longer needs this delegate.
+ * @field growlIsReady Called when GrowlHelperApp is listening for notifications.
+ * @field growlNotificationWasClicked Called when a Growl notification is clicked.
+ * @field growlNotificationTimedOut Called when a Growl notification timed out.
+ */
+struct Growl_Delegate {
+ /* @discussion This should be sizeof(struct Growl_Delegate).
+ */
+ size_t size;
+
+ /*All of these attributes are optional.
+ *Optional attributes can be NULL; required attributes that
+ * are NULL cause setting the Growl delegate to fail.
+ *XXX - move optional/required status into the discussion for each field
+ */
+
+ /* This name is used both internally and in the Growl preferences.
+ *
+ * This should remain stable between different versions and incarnations of
+ * your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ *
+ * This can be <code>NULL</code> if it is provided elsewhere, namely in an
+ * auto-discoverable plist file in your app bundle
+ * (XXX refer to more information on that) or in registrationDictionary.
+ */
+ CFStringRef applicationName;
+
+ /*
+ * Must contain at least these keys:
+ * GROWL_NOTIFICATIONS_ALL (CFArray):
+ * Contains the names of all notifications your application may post.
+ *
+ * Can also contain these keys:
+ * GROWL_NOTIFICATIONS_DEFAULT (CFArray):
+ * Names of notifications that should be enabled by default.
+ * If omitted, GROWL_NOTIFICATIONS_ALL will be used.
+ * GROWL_APP_NAME (CFString):
+ * Same as the applicationName member of this structure.
+ * If both are present, the applicationName member shall prevail.
+ * If this key is present, you may omit applicationName (set it to <code>NULL</code>).
+ * GROWL_APP_ICON (CFData):
+ * Same as the iconData member of this structure.
+ * If both are present, the iconData member shall prevail.
+ * If this key is present, you may omit iconData (set it to <code>NULL</code>).
+ *
+ * If you change the contents of this dictionary after setting the delegate,
+ * be sure to call Growl_Reregister.
+ *
+ * This can be <code>NULL</code> if you have an auto-discoverable plist file in your app
+ * bundle. (XXX refer to more information on that)
+ */
+ CFDictionaryRef registrationDictionary;
+
+ /* The data can be in any format supported by NSImage. As of
+ * Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and
+ * PICT formats.
+ *
+ * If this is not supplied, Growl will look up your application's icon by
+ * its application name.
+ */
+ CFDataRef applicationIconData;
+
+ /* Installer display attributes
+ *
+ * These four attributes are used by the Growl installer, if this framework
+ * supports it.
+ * For any of these being <code>NULL</code>, a localised default will be
+ * supplied.
+ */
+
+ /* If this is <code>NULL</code>, Growl will use a default,
+ * localized title.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlInstallationWindowTitle;
+ /* This information may be as long or short as desired (the
+ * window will be sized to fit it). If Growl is not installed, it will
+ * be displayed to the user as an explanation of what Growl is and what
+ * it can do in your application.
+ * It should probably note that no download is required to install.
+ *
+ * If this is <code>NULL</code>, Growl will use a default, localized
+ * explanation.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlInstallationInformation;
+ /* If this is <code>NULL</code>, Growl will use a default,
+ * localized title.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlUpdateWindowTitle;
+ /* This information may be as long or short as desired (the
+ * window will be sized to fit it). If an older version of Growl is
+ * installed, it will be displayed to the user as an explanation that an
+ * updated version of Growl is included in your application and
+ * no download is required.
+ *
+ * If this is <code>NULL</code>, Growl will use a default, localized
+ * explanation.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlUpdateInformation;
+
+ /* This member is provided for use by your retain and release
+ * callbacks (see below).
+ *
+ * GrowlApplicationBridge never directly uses this member. Instead, it
+ * calls your retain callback (if non-<code>NULL</code>) and your release
+ * callback (if non-<code>NULL</code>).
+ */
+ unsigned referenceCount;
+
+ //Functions. Currently all of these are optional (any of them can be NULL).
+
+ /* When you call Growl_SetDelegate(newDelegate), it will call
+ * oldDelegate->release(oldDelegate), and then it will call
+ * newDelegate->retain(newDelegate), and the return value from retain
+ * is what will be set as the delegate.
+ * (This means that this member works like CFRetain and -[NSObject retain].)
+ * This member is optional (it can be <code>NULL</code>).
+ * For a delegate allocated with malloc, this member would be
+ * <code>NULL</code>.
+ * @result A delegate to which GrowlApplicationBridge holds a reference.
+ */
+ void *(*retain)(void *);
+ /* When you call Growl_SetDelegate(newDelegate), it will call
+ * oldDelegate->release(oldDelegate), and then it will call
+ * newDelegate->retain(newDelegate), and the return value from retain
+ * is what will be set as the delegate.
+ * (This means that this member works like CFRelease and
+ * -[NSObject release].)
+ * This member is optional (it can be NULL).
+ * For a delegate allocated with malloc, this member might be
+ * <code>free</code>(3).
+ */
+ void (*release)(void *);
+
+ /* Informs the delegate that Growl (specifically, the GrowlHelperApp) was
+ * launched successfully (or was already running). The application can
+ * take actions with the knowledge that Growl is installed and functional.
+ */
+ void (*growlIsReady)(void);
+
+ /* Informs the delegate that a Growl notification was clicked. It is only
+ * sent for notifications sent with a non-<code>NULL</code> clickContext,
+ * so if you want to receive a message when a notification is clicked,
+ * clickContext must not be <code>NULL</code> when calling
+ * Growl_PostNotification or
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
+ */
+ void (*growlNotificationWasClicked)(CFPropertyListRef clickContext);
+
+ /* Informs the delegate that a Growl notification timed out. It is only
+ * sent for notifications sent with a non-<code>NULL</code> clickContext,
+ * so if you want to receive a message when a notification is clicked,
+ * clickContext must not be <code>NULL</code> when calling
+ * Growl_PostNotification or
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
+ */
+ void (*growlNotificationTimedOut)(CFPropertyListRef clickContext);
+};
+
+/*! @struct Growl_Notification
+ * @abstract Structure describing a Growl notification.
+ * @discussion XXX
+ * @field size The size of the notification structure.
+ * @field name Identifies the notification.
+ * @field title Short synopsis of the notification.
+ * @field description Additional text.
+ * @field iconData An icon for the notification.
+ * @field priority An indicator of the notification's importance.
+ * @field reserved Bits reserved for future usage.
+ * @field isSticky Requests that a notification stay on-screen until dismissed explicitly.
+ * @field clickContext An identifier to be passed to your click callback when a notification is clicked.
+ * @field clickCallback A callback to call when the notification is clicked.
+ */
+struct Growl_Notification {
+ /* This should be sizeof(struct Growl_Notification).
+ */
+ size_t size;
+
+ /* The notification name distinguishes one type of
+ * notification from another. The name should be human-readable, as it
+ * will be displayed in the Growl preference pane.
+ *
+ * The name is used in the GROWL_NOTIFICATIONS_ALL and
+ * GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and
+ * in this member of the Growl_Notification structure.
+ */
+ CFStringRef name;
+
+ /* A notification's title describes the notification briefly.
+ * It should be easy to read quickly by the user.
+ */
+ CFStringRef title;
+
+ /* The description supplements the title with more
+ * information. It is usually longer and sometimes involves a list of
+ * subjects. For example, for a 'Download complete' notification, the
+ * description might have one filename per line. GrowlMail in Growl 0.6
+ * uses a description of '%d new mail(s)' (formatted with the number of
+ * messages).
+ */
+ CFStringRef description;
+
+ /* The notification icon usually indicates either what
+ * happened (it may have the same icon as e.g. a toolbar item that
+ * started the process that led to the notification), or what it happened
+ * to (e.g. a document icon).
+ *
+ * The icon data is optional, so it can be <code>NULL</code>. In that
+ * case, the application icon is used alone. Not all displays support
+ * icons.
+ *
+ * The data can be in any format supported by NSImage. As of Mac OS X
+ * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form
+ * ats.
+ */
+ CFDataRef iconData;
+
+ /* Priority is new in Growl 0.6, and is represented as a
+ * signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low
+ * priority, and +2 is Very High priority.
+ *
+ * Not all displays support priority. If you do not wish to assign a
+ * priority to your notification, assign 0.
+ */
+ signed int priority;
+
+ /* These bits are not used in Growl 0.6. Set them to 0.
+ */
+ unsigned reserved: 31;
+
+ /* When the sticky bit is clear, in most displays,
+ * notifications disappear after a certain amount of time. Sticky
+ * notifications, however, remain on-screen until the user dismisses them
+ * explicitly, usually by clicking them.
+ *
+ * Sticky notifications were introduced in Growl 0.6. Most notifications
+ * should not be sticky. Not all displays support sticky notifications,
+ * and the user may choose in Growl's preference pane to force the
+ * notification to be sticky or non-sticky, in which case the sticky bit
+ * in the notification will be ignored.
+ */
+ unsigned isSticky: 1;
+
+ /* If this is not <code>NULL</code>, and your click callback
+ * is not <code>NULL</code> either, this will be passed to the callback
+ * when your notification is clicked by the user.
+ *
+ * Click feedback was introduced in Growl 0.6, and it is optional. Not
+ * all displays support click feedback.
+ */
+ CFPropertyListRef clickContext;
+
+ /* If this is not <code>NULL</code>, it will be called instead
+ * of the Growl delegate's click callback when clickContext is
+ * non-<code>NULL</code> and the notification is clicked on by the user.
+ *
+ * Click feedback was introduced in Growl 0.6, and it is optional. Not
+ * all displays support click feedback.
+ *
+ * The per-notification click callback is not yet supported as of Growl
+ * 0.7.
+ */
+ void (*clickCallback)(CFPropertyListRef clickContext);
+
+ CFStringRef identifier;
+};
+
+#pragma mark -
+#pragma mark Easy initialisers
+
+/*! @defined InitGrowlDelegate
+ * @abstract Callable macro. Initializes a Growl delegate structure to defaults.
+ * @discussion Call with a pointer to a struct Growl_Delegate. All of the
+ * members of the structure will be set to 0 or <code>NULL</code>, except for
+ * size (which will be set to <code>sizeof(struct Growl_Delegate)</code>) and
+ * referenceCount (which will be set to 1).
+ */
+#define InitGrowlDelegate(delegate) \
+ do { \
+ if (delegate) { \
+ (delegate)->size = sizeof(struct Growl_Delegate); \
+ (delegate)->applicationName = NULL; \
+ (delegate)->registrationDictionary = NULL; \
+ (delegate)->applicationIconData = NULL; \
+ (delegate)->growlInstallationWindowTitle = NULL; \
+ (delegate)->growlInstallationInformation = NULL; \
+ (delegate)->growlUpdateWindowTitle = NULL; \
+ (delegate)->growlUpdateInformation = NULL; \
+ (delegate)->referenceCount = 1U; \
+ (delegate)->retain = NULL; \
+ (delegate)->release = NULL; \
+ (delegate)->growlIsReady = NULL; \
+ (delegate)->growlNotificationWasClicked = NULL; \
+ (delegate)->growlNotificationTimedOut = NULL; \
+ } \
+ } while(0)
+
+/*! @defined InitGrowlNotification
+ * @abstract Callable macro. Initializes a Growl notification structure to defaults.
+ * @discussion Call with a pointer to a struct Growl_Notification. All of
+ * the members of the structure will be set to 0 or <code>NULL</code>, except
+ * for size (which will be set to
+ * <code>sizeof(struct Growl_Notification)</code>).
+ */
+#define InitGrowlNotification(notification) \
+ do { \
+ if (notification) { \
+ (notification)->size = sizeof(struct Growl_Notification); \
+ (notification)->name = NULL; \
+ (notification)->title = NULL; \
+ (notification)->description = NULL; \
+ (notification)->iconData = NULL; \
+ (notification)->priority = 0; \
+ (notification)->reserved = 0U; \
+ (notification)->isSticky = false; \
+ (notification)->clickContext = NULL; \
+ (notification)->clickCallback = NULL; \
+ (notification)->identifier = NULL; \
+ } \
+ } while(0)
+
+#pragma mark -
+#pragma mark Public API
+
+// @functiongroup Managing the Growl delegate
+
+/*! @function Growl_SetDelegate
+ * @abstract Replaces the current Growl delegate with a new one, or removes
+ * the Growl delegate.
+ * @param newDelegate
+ * @result Returns false and does nothing else if a pointer that was passed in
+ * is unsatisfactory (because it is non-<code>NULL</code>, but at least one
+ * required member of it is <code>NULL</code>). Otherwise, sets or unsets the
+ * delegate and returns true.
+ * @discussion When <code>newDelegate</code> is non-<code>NULL</code>, sets
+ * the delegate to <code>newDelegate</code>. When it is <code>NULL</code>,
+ * the current delegate will be unset, and no delegate will be in place.
+ *
+ * It is legal for <code>newDelegate</code> to be the current delegate;
+ * nothing will happen, and Growl_SetDelegate will return true. It is also
+ * legal for it to be <code>NULL</code>, as described above; again, it will
+ * return true.
+ *
+ * If there was a delegate in place before the call, Growl_SetDelegate will
+ * call the old delegate's release member if it was non-<code>NULL</code>. If
+ * <code>newDelegate</code> is non-<code>NULL</code>, Growl_SetDelegate will
+ * call <code>newDelegate->retain</code>, and set the delegate to its return
+ * value.
+ *
+ * If you are using Growl-WithInstaller.framework, and an older version of
+ * Growl is installed on the user's system, the user will automatically be
+ * prompted to update.
+ *
+ * GrowlApplicationBridge currently does not copy this structure, nor does it
+ * retain any of the CF objects in the structure (it regards the structure as
+ * a container that retains the objects when they are added and releases them
+ * when they are removed or the structure is destroyed). Also,
+ * GrowlApplicationBridge currently does not modify any member of the
+ * structure, except possibly the referenceCount by calling the retain and
+ * release members.
+ */
+GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate);
+
+/*! @function Growl_GetDelegate
+ * @abstract Returns the current Growl delegate, if any.
+ * @result The current Growl delegate.
+ * @discussion Returns the last pointer passed into Growl_SetDelegate, or
+ * <code>NULL</code> if no such call has been made.
+ *
+ * This function follows standard Core Foundation reference-counting rules.
+ * Because it is a Get function, not a Copy function, it will not retain the
+ * delegate on your behalf. You are responsible for retaining and releasing
+ * the delegate as needed.
+ */
+GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void);
+
+#pragma mark -
+
+// @functiongroup Posting Growl notifications
+
+/*! @function Growl_PostNotification
+ * @abstract Posts a Growl notification.
+ * @param notification The notification to post.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>NULL</code> (or 0 or false as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl.
+ * If the user cancels, this function will have no effect until the next
+ * application session, at which time when it is called the user will be
+ * prompted again. The user is also given the option to not be prompted again.
+ * If the user does choose to install Growl, the requested notification will
+ * be displayed once Growl is installed and running.
+ */
+GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification);
+
+/*! @function Growl_PostNotificationWithDictionary
+* @abstract Notifies using a userInfo dictionary suitable for passing to
+* CFDistributedNotificationCenter.
+* @param userInfo The dictionary to notify with.
+* @discussion Before Growl 0.6, your application would have posted
+* notifications using CFDistributedNotificationCenter by creating a userInfo
+* dictionary with the notification data. This had the advantage of allowing
+* you to add other data to the dictionary for programs besides Growl that
+* might be listening.
+*
+* This function allows you to use such dictionaries without being restricted
+* to using CFDistributedNotificationCenter. The keys for this dictionary
+ * can be found in GrowlDefines.h.
+*/
+GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo);
+
+/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext
+ * @abstract Posts a Growl notification using parameter values.
+ * @param title The title of the notification.
+ * @param description The description of the notification.
+ * @param notificationName The name of the notification as listed in the
+ * registration dictionary.
+ * @param iconData Data representing a notification icon. Can be <code>NULL</code>.
+ * @param priority The priority of the notification (-2 to +2, with -2
+ * being Very Low and +2 being Very High).
+ * @param isSticky If true, requests that this notification wait for a
+ * response from the user.
+ * @param clickContext An object to pass to the clickCallback, if any. Can
+ * be <code>NULL</code>, in which case the clickCallback is not called.
+ * @discussion Creates a temporary Growl_Notification, fills it out with the
+ * supplied information, and calls Growl_PostNotification on it.
+ * See struct Growl_Notification and Growl_PostNotification for more
+ * information.
+ *
+ * The icon data can be in any format supported by NSImage. As of Mac OS X
+ * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats.
+ */
+GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext(
+ /*inhale*/
+ CFStringRef title,
+ CFStringRef description,
+ CFStringRef notificationName,
+ CFDataRef iconData,
+ signed int priority,
+ Boolean isSticky,
+ CFPropertyListRef clickContext);
+
+#pragma mark -
+
+// @functiongroup Registering
+
+/*! @function Growl_RegisterWithDictionary
+ * @abstract Register your application with Growl without setting a delegate.
+ * @discussion When you call this function with a dictionary,
+ * GrowlApplicationBridge registers your application using that dictionary.
+ * If you pass <code>NULL</code>, GrowlApplicationBridge will ask the delegate
+ * (if there is one) for a dictionary, and if that doesn't work, it will look
+ * in your application's bundle for an auto-discoverable plist.
+ * (XXX refer to more information on that)
+ *
+ * If you pass a dictionary to this function, it must include the
+ * <code>GROWL_APP_NAME</code> key, unless a delegate is set.
+ *
+ * This function is mainly an alternative to the delegate system introduced
+ * with Growl 0.6. Without a delegate, you cannot receive callbacks such as
+ * <code>growlIsReady</code> (since they are sent to the delegate). You can,
+ * however, set a delegate after registering without one.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result <code>false</code> if registration failed (e.g. if Growl isn't installed).
+ */
+GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict);
+
+/*! @function Growl_Reregister
+ * @abstract Updates your registration with Growl.
+ * @discussion If your application changes the contents of the
+ * GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the
+ * Growl delegate, or if it changes the value of that member, or if it
+ * changes the contents of its auto-discoverable plist, call this function
+ * to have Growl update its registration information for your application.
+ *
+ * Otherwise, this function does not normally need to be called. If you're
+ * using a delegate, your application will be registered when you set the
+ * delegate if both the delegate and its registrationDictionary member are
+ * non-<code>NULL</code>.
+ *
+ * This function is now implemented using
+ * <code>Growl_RegisterWithDictionary</code>.
+ */
+GROWL_EXPORT void Growl_Reregister(void);
+
+#pragma mark -
+
+/*! @function Growl_SetWillRegisterWhenGrowlIsReady
+ * @abstract Tells GrowlApplicationBridge to register with Growl when Growl
+ * launches (or not).
+ * @discussion When Growl has started listening for notifications, it posts a
+ * <code>GROWL_IS_READY</code> notification on the Distributed Notification
+ * Center. GrowlApplicationBridge listens for this notification, using it to
+ * perform various tasks (such as calling your delegate's
+ * <code>growlIsReady</code> callback, if it has one). If this function is
+ * called with <code>true</code>, one of those tasks will be to reregister
+ * with Growl (in the manner of <code>Growl_Reregister</code>).
+ *
+ * This attribute is automatically set back to <code>false</code>
+ * (the default) after every <code>GROWL_IS_READY</code> notification.
+ * @param flag <code>true</code> if you want GrowlApplicationBridge to register with
+ * Growl when next it is ready; <code>false</code> if not.
+ */
+GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag);
+/*! @function Growl_WillRegisterWhenGrowlIsReady
+ * @abstract Reports whether GrowlApplicationBridge will register with Growl
+ * when Growl next launches.
+ * @result <code>true</code> if GrowlApplicationBridge will register with
+ * Growl when next it posts GROWL_IS_READY; <code>false</code> if not.
+ */
+GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void);
+
+#pragma mark -
+
+// @functiongroup Obtaining registration dictionaries
+
+/*! @function Growl_CopyRegistrationDictionaryFromDelegate
+ * @abstract Asks the delegate for a registration dictionary.
+ * @discussion If no delegate is set, or if the delegate's
+ * <code>registrationDictionary</code> member is <code>NULL</code>, this
+ * function returns <code>NULL</code>.
+ *
+ * This function does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> or
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
+ * to try to fill in missing keys.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void);
+
+/*! @function Growl_CopyRegistrationDictionaryFromBundle
+ * @abstract Looks in a bundle for a registration dictionary.
+ * @discussion This function looks in a bundle for an auto-discoverable
+ * registration dictionary file using <code>CFBundleCopyResourceURL</code>.
+ * If it finds one, it loads the file using <code>CFPropertyList</code> and
+ * returns the result.
+ *
+ * If you pass <code>NULL</code> as the bundle, the main bundle is examined.
+ *
+ * This function does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary:</code> or
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
+ * to try to fill in missing keys.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle);
+
+/*! @function Growl_CreateBestRegistrationDictionary
+ * @abstract Obtains a registration dictionary, filled out to the best of
+ * GrowlApplicationBridge's knowledge.
+ * @discussion This function creates a registration dictionary as best
+ * GrowlApplicationBridge knows how.
+ *
+ * First, GrowlApplicationBridge examines the Growl delegate (if there is
+ * one) and gets the registration dictionary from that. If no such dictionary
+ * was obtained, GrowlApplicationBridge looks in your application's main
+ * bundle for an auto-discoverable registration dictionary file. If that
+ * doesn't exist either, this function returns <code>NULL</code>.
+ *
+ * Second, GrowlApplicationBridge calls
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> with
+ * whatever dictionary was obtained. The result of that function is the
+ * result of this function.
+ *
+ * GrowlApplicationBridge uses this function when you call
+ * <code>Growl_SetDelegate</code>, or when you call
+ * <code>Growl_RegisterWithDictionary</code> with <code>NULL</code>.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void);
+
+#pragma mark -
+
+// @functiongroup Filling in registration dictionaries
+
+/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @param regDict The dictionary to fill in.
+ * @result The dictionary with the keys filled in.
+ * @discussion This function examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Keys are only filled in if missing; if a key is present in the dictionary,
+ * its value will not be changed.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict);
+/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @param regDict The dictionary to fill in.
+ * @param keys The keys to fill in. If <code>NULL</code>, any missing keys are filled in.
+ * @result The dictionary with the keys filled in.
+ * @discussion This function examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Only those keys that are listed in <code>keys</code> will be filled in.
+ * Other missing keys are ignored. Also, keys are only filled in if missing;
+ * if a key is present in the dictionary, its value will not be changed.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys);
+
+/*! @brief Tries to fill in missing keys in a notification dictionary.
+ * @param notifDict The dictionary to fill in.
+ * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
+ * @discussion This function examines the \a notifDict for missing keys, and
+ * tries to get them from the last known registration dictionary. As of 1.1,
+ * the keys that it will look for are:
+ *
+ * \li <code>GROWL_APP_NAME</code>
+ * \li <code>GROWL_APP_ICON</code>
+ *
+ * @since Growl.framework 1.1
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict);
+
+#pragma mark -
+
+// @functiongroup Querying Growl's status
+
+/*! @function Growl_IsInstalled
+ * @abstract Determines whether the Growl prefpane and its helper app are
+ * installed.
+ * @result Returns true if Growl is installed, false otherwise.
+ */
+GROWL_EXPORT Boolean Growl_IsInstalled(void);
+
+/*! @function Growl_IsRunning
+ * @abstract Cycles through the process list to find whether GrowlHelperApp
+ * is running.
+ * @result Returns true if Growl is running, false otherwise.
+ */
+GROWL_EXPORT Boolean Growl_IsRunning(void);
+
+#pragma mark -
+
+// @functiongroup Launching Growl
+
+/*! @typedef GrowlLaunchCallback
+ * @abstract Callback to notify you that Growl is running.
+ * @param context The context pointer passed to Growl_LaunchIfInstalled.
+ * @discussion Growl_LaunchIfInstalled calls this callback function if Growl
+ * was already running or if it launched Growl successfully.
+ */
+typedef void (*GrowlLaunchCallback)(void *context);
+
+/*! @function Growl_LaunchIfInstalled
+ * @abstract Launches GrowlHelperApp if it is not already running.
+ * @param callback A callback function which will be called if Growl was successfully
+ * launched or was already running. Can be <code>NULL</code>.
+ * @param context The context pointer to pass to the callback. Can be <code>NULL</code>.
+ * @result Returns true if Growl was successfully launched or was already
+ * running; returns false and does not call the callback otherwise.
+ * @discussion Returns true and calls the callback (if the callback is not
+ * <code>NULL</code>) if the Growl helper app began launching or was already
+ * running. Returns false and performs no other action if Growl could not be
+ * launched (e.g. because the Growl preference pane is not properly installed).
+ *
+ * If <code>Growl_CreateBestRegistrationDictionary</code> returns
+ * non-<code>NULL</code>, this function will register with Growl atomically.
+ *
+ * The callback should take a single argument; this is to allow applications
+ * to have context-relevant information passed back. It is perfectly
+ * acceptable for context to be <code>NULL</code>. The callback itself can be
+ * <code>NULL</code> if you don't want one.
+ */
+GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context);
+
+#pragma mark -
+#pragma mark Constants
+
+/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER
+ * @abstract The CFBundleIdentifier of the Growl preference pane bundle.
+ * @discussion GrowlApplicationBridge uses this to determine whether Growl is
+ * currently installed, by searching for the Growl preference pane. Your
+ * application probably does not need to use this macro itself.
+ */
+#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER
+#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel")
+#endif
+
+__END_DECLS
+
+#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,575 @@
+//
+// GrowlApplicationBridge.h
+// Growl
+//
+// Created by Evan Schoenberg on Wed Jun 16 2004.
+// Copyright 2004-2006 The Growl Project. All rights reserved.
+//
+
+/*!
+ * @header GrowlApplicationBridge.h
+ * @abstract Defines the GrowlApplicationBridge class.
+ * @discussion This header defines the GrowlApplicationBridge class as well as
+ * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant.
+ */
+
+#ifndef __GrowlApplicationBridge_h__
+#define __GrowlApplicationBridge_h__
+
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+#import "GrowlDefines.h"
+
+//Forward declarations
+ at protocol GrowlApplicationBridgeDelegate;
+
+//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation)
+#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install"
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @class GrowlApplicationBridge
+ * @abstract A class used to interface with Growl.
+ * @discussion This class provides a means to interface with Growl.
+ *
+ * Currently it provides a way to detect if Growl is installed and launch the
+ * GrowlHelperApp if it's not already running.
+ */
+ at interface GrowlApplicationBridge : NSObject {
+
+}
+
+/*!
+ * @method isGrowlInstalled
+ * @abstract Detects whether Growl is installed.
+ * @discussion Determines if the Growl prefpane and its helper app are installed.
+ * @result Returns YES if Growl is installed, NO otherwise.
+ */
++ (BOOL) isGrowlInstalled;
+
+/*!
+ * @method isGrowlRunning
+ * @abstract Detects whether GrowlHelperApp is currently running.
+ * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings.
+ * @result Returns YES if GrowlHelperApp is running, NO otherwise.
+ */
++ (BOOL) isGrowlRunning;
+
+#pragma mark -
+
+/*!
+ * @method setGrowlDelegate:
+ * @abstract Set the object which will be responsible for providing and receiving Growl information.
+ * @discussion This must be called before using GrowlApplicationBridge.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate protocol are required
+ * and return the basic information needed to register with Growl.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol
+ * informal protocol are individually optional. They provide a greater
+ * degree of interaction between the application and growl such as informing
+ * the application when one of its Growl notifications is clicked by the user.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol
+ * informal protocol are individually optional and are only applicable when
+ * using the Growl-WithInstaller.framework which allows for automated Growl
+ * installation.
+ *
+ * When this method is called, data will be collected from inDelegate, Growl
+ * will be launched if it is not already running, and the application will be
+ * registered with Growl.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is already installed
+ * but this copy of the framework has an updated version of Growl, the user
+ * will be prompted to update automatically.
+ *
+ * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol.
+ */
++ (void) setGrowlDelegate:(NSObject<GrowlApplicationBridgeDelegate> *)inDelegate;
+
+/*!
+ * @method growlDelegate
+ * @abstract Return the object responsible for providing and receiving Growl information.
+ * @discussion See setGrowlDelegate: for details.
+ * @result The Growl delegate.
+ */
++ (NSObject<GrowlApplicationBridgeDelegate> *) growlDelegate;
+
+#pragma mark -
+
+/*!
+ * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:
+ * @abstract Send a Growl notification.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>nil</code> (or 0 or NO as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl. If the user cancels, this method
+ * will have no effect until the next application session, at which time when
+ * it is called the user will be prompted again. The user is also given the
+ * option to not be prompted again. If the user does choose to install Growl,
+ * the requested notification will be displayed once Growl is installed and
+ * running.
+ *
+ * @param title The title of the notification displayed to the user.
+ * @param description The full description of the notification displayed to the user.
+ * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
+ * @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
+ * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
+ * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
+ * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
+ */
++ (void) notifyWithTitle:(NSString *)title
+ description:(NSString *)description
+ notificationName:(NSString *)notifName
+ iconData:(NSData *)iconData
+ priority:(signed int)priority
+ isSticky:(BOOL)isSticky
+ clickContext:(id)clickContext;
+
+/*!
+ * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:
+ * @abstract Send a Growl notification.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>nil</code> (or 0 or NO as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl. If the user cancels, this method
+ * will have no effect until the next application session, at which time when
+ * it is called the user will be prompted again. The user is also given the
+ * option to not be prompted again. If the user does choose to install Growl,
+ * the requested notification will be displayed once Growl is installed and
+ * running.
+ *
+ * @param title The title of the notification displayed to the user.
+ * @param description The full description of the notification displayed to the user.
+ * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
+ * @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
+ * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
+ * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
+ * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
+ * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced.
+ */
++ (void) notifyWithTitle:(NSString *)title
+ description:(NSString *)description
+ notificationName:(NSString *)notifName
+ iconData:(NSData *)iconData
+ priority:(signed int)priority
+ isSticky:(BOOL)isSticky
+ clickContext:(id)clickContext
+ identifier:(NSString *)identifier;
+
+/*! @method notifyWithDictionary:
+ * @abstract Notifies using a userInfo dictionary suitable for passing to
+ * <code>NSDistributedNotificationCenter</code>.
+ * @param userInfo The dictionary to notify with.
+ * @discussion Before Growl 0.6, your application would have posted
+ * notifications using <code>NSDistributedNotificationCenter</code> by
+ * creating a userInfo dictionary with the notification data. This had the
+ * advantage of allowing you to add other data to the dictionary for programs
+ * besides Growl that might be listening.
+ *
+ * This method allows you to use such dictionaries without being restricted
+ * to using <code>NSDistributedNotificationCenter</code>. The keys for this dictionary
+ * can be found in GrowlDefines.h.
+ */
++ (void) notifyWithDictionary:(NSDictionary *)userInfo;
+
+#pragma mark -
+
+/*! @method registerWithDictionary:
+ * @abstract Register your application with Growl without setting a delegate.
+ * @discussion When you call this method with a dictionary,
+ * GrowlApplicationBridge registers your application using that dictionary.
+ * If you pass <code>nil</code>, GrowlApplicationBridge will ask the delegate
+ * (if there is one) for a dictionary, and if that doesn't work, it will look
+ * in your application's bundle for an auto-discoverable plist.
+ * (XXX refer to more information on that)
+ *
+ * If you pass a dictionary to this method, it must include the
+ * <code>GROWL_APP_NAME</code> key, unless a delegate is set.
+ *
+ * This method is mainly an alternative to the delegate system introduced
+ * with Growl 0.6. Without a delegate, you cannot receive callbacks such as
+ * <code>-growlIsReady</code> (since they are sent to the delegate). You can,
+ * however, set a delegate after registering without one.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ */
++ (BOOL) registerWithDictionary:(NSDictionary *)regDict;
+
+/*! @method reregisterGrowlNotifications
+ * @abstract Reregister the notifications for this application.
+ * @discussion This method does not normally need to be called. If your
+ * application changes what notifications it is registering with Growl, call
+ * this method to have the Growl delegate's
+ * <code>-registrationDictionaryForGrowl</code> method called again and the
+ * Growl registration information updated.
+ *
+ * This method is now implemented using <code>-registerWithDictionary:</code>.
+ */
++ (void) reregisterGrowlNotifications;
+
+#pragma mark -
+
+/*! @method setWillRegisterWhenGrowlIsReady:
+ * @abstract Tells GrowlApplicationBridge to register with Growl when Growl
+ * launches (or not).
+ * @discussion When Growl has started listening for notifications, it posts a
+ * <code>GROWL_IS_READY</code> notification on the Distributed Notification
+ * Center. GrowlApplicationBridge listens for this notification, using it to
+ * perform various tasks (such as calling your delegate's
+ * <code>-growlIsReady</code> method, if it has one). If this method is
+ * called with <code>YES</code>, one of those tasks will be to reregister
+ * with Growl (in the manner of <code>-reregisterGrowlNotifications</code>).
+ *
+ * This attribute is automatically set back to <code>NO</code> (the default)
+ * after every <code>GROWL_IS_READY</code> notification.
+ * @param flag <code>YES</code> if you want GrowlApplicationBridge to register with
+ * Growl when next it is ready; <code>NO</code> if not.
+ */
++ (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag;
+/*! @method willRegisterWhenGrowlIsReady
+ * @abstract Reports whether GrowlApplicationBridge will register with Growl
+ * when Growl next launches.
+ * @result <code>YES</code> if GrowlApplicationBridge will register with Growl
+ * when next it posts GROWL_IS_READY; <code>NO</code> if not.
+ */
++ (BOOL) willRegisterWhenGrowlIsReady;
+
+#pragma mark -
+
+/*! @method registrationDictionaryFromDelegate
+ * @abstract Asks the delegate for a registration dictionary.
+ * @discussion If no delegate is set, or if the delegate's
+ * <code>-registrationDictionaryForGrowl</code> method returns
+ * <code>nil</code>, this method returns <code>nil</code>.
+ *
+ * This method does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:]</code> or
+ * <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
+ * to fill in missing keys.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) registrationDictionaryFromDelegate;
+
+/*! @method registrationDictionaryFromBundle:
+ * @abstract Looks in a bundle for a registration dictionary.
+ * @discussion This method looks in a bundle for an auto-discoverable
+ * registration dictionary file using <code>-[NSBundle
+ * pathForResource:ofType:]</code>. If it finds one, it loads the file using
+ * <code>+[NSDictionary dictionaryWithContentsOfFile:]</code> and returns the
+ * result.
+ *
+ * If you pass <code>nil</code> as the bundle, the main bundle is examined.
+ *
+ * This method does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:]</code> or
+ * <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
+ * to fill in missing keys.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle;
+
+/*! @method bestRegistrationDictionary
+ * @abstract Obtains a registration dictionary, filled out to the best of
+ * GrowlApplicationBridge's knowledge.
+ * @discussion This method creates a registration dictionary as best
+ * GrowlApplicationBridge knows how.
+ *
+ * First, GrowlApplicationBridge contacts the Growl delegate (if there is
+ * one) and gets the registration dictionary from that. If no such dictionary
+ * was obtained, GrowlApplicationBridge looks in your application's main
+ * bundle for an auto-discoverable registration dictionary file. If that
+ * doesn't exist either, this method returns <code>nil</code>.
+ *
+ * Second, GrowlApplicationBridge calls
+ * <code>+registrationDictionaryByFillingInDictionary:</code> with whatever
+ * dictionary was obtained. The result of that method is the result of this
+ * method.
+ *
+ * GrowlApplicationBridge uses this method when you call
+ * <code>+setGrowlDelegate:</code>, or when you call
+ * <code>+registerWithDictionary:</code> with <code>nil</code>.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) bestRegistrationDictionary;
+
+#pragma mark -
+
+/*! @method registrationDictionaryByFillingInDictionary:
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @discussion This method examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Keys are only filled in if missing; if a key is present in the dictionary,
+ * its value will not be changed.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @param regDict The dictionary to fill in.
+ * @result The dictionary with the keys filled in. This is an autoreleased
+ * copy of <code>regDict</code>.
+ */
++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
+/*! @method registrationDictionaryByFillingInDictionary:restrictToKeys:
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @discussion This method examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Only those keys that are listed in <code>keys</code> will be filled in.
+ * Other missing keys are ignored. Also, keys are only filled in if missing;
+ * if a key is present in the dictionary, its value will not be changed.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @param regDict The dictionary to fill in.
+ * @param keys The keys to fill in. If <code>nil</code>, any missing keys are filled in.
+ * @result The dictionary with the keys filled in. This is an autoreleased
+ * copy of <code>regDict</code>.
+ */
++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys;
+
+/*! @brief Tries to fill in missing keys in a notification dictionary.
+ * @param notifDict The dictionary to fill in.
+ * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
+ * @discussion This function examines the \a notifDict for missing keys, and
+ * tries to get them from the last known registration dictionary. As of 1.1,
+ * the keys that it will look for are:
+ *
+ * \li <code>GROWL_APP_NAME</code>
+ * \li <code>GROWL_APP_ICON</code>
+ *
+ * @since Growl.framework 1.1
+ */
++ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
+
++ (NSDictionary *) frameworkInfoDictionary;
+ at end
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @protocol GrowlApplicationBridgeDelegate
+ * @abstract Required protocol for the Growl delegate.
+ * @discussion The methods in this protocol are required and are called
+ * automatically as needed by GrowlApplicationBridge. See
+ * <code>+[GrowlApplicationBridge setGrowlDelegate:]</code>.
+ * See also <code>GrowlApplicationBridgeDelegate_InformalProtocol</code>.
+ */
+
+ at protocol GrowlApplicationBridgeDelegate
+
+// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7.
+
+ at end
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol)
+ * @abstract Methods which may be optionally implemented by the GrowlDelegate.
+ * @discussion The methods in this informal protocol will only be called if implemented by the delegate.
+ */
+ at interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol)
+
+/*!
+ * @method registrationDictionaryForGrowl
+ * @abstract Return the dictionary used to register this application with Growl.
+ * @discussion The returned dictionary gives Growl the complete list of
+ * notifications this application will ever send, and it also specifies which
+ * notifications should be enabled by default. Each is specified by an array
+ * of <code>NSString</code> objects.
+ *
+ * For most applications, these two arrays can be the same (if all sent
+ * notifications should be displayed by default).
+ *
+ * The <code>NSString</code> objects of these arrays will correspond to the
+ * <code>notificationName:</code> parameter passed in
+ * <code>+[GrowlApplicationBridge
+ * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]</code> calls.
+ *
+ * The dictionary should have the required key object pairs:
+ * key: GROWL_NOTIFICATIONS_ALL object: <code>NSArray</code> of <code>NSString</code> objects
+ * key: GROWL_NOTIFICATIONS_DEFAULT object: <code>NSArray</code> of <code>NSString</code> objects
+ *
+ * The dictionary may have the following key object pairs:
+ * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: <code>NSDictionary</code> of key: notification name object: human-readable notification name
+ *
+ * You do not need to implement this method if you have an auto-discoverable
+ * plist file in your app bundle. (XXX refer to more information on that)
+ *
+ * @result The <code>NSDictionary</code> to use for registration.
+ */
+- (NSDictionary *) registrationDictionaryForGrowl;
+
+/*!
+ * @method applicationNameForGrowl
+ * @abstract Return the name of this application which will be used for Growl bookkeeping.
+ * @discussion This name is used both internally and in the Growl preferences.
+ *
+ * This should remain stable between different versions and incarnations of
+ * your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ *
+ * You do not need to implement this method if you are providing the
+ * application name elsewhere, meaning in an auto-discoverable plist file in
+ * your app bundle (XXX refer to more information on that) or in the result
+ * of -registrationDictionaryForGrowl.
+ *
+ * @result The name of the application using Growl.
+ */
+- (NSString *) applicationNameForGrowl;
+
+/*!
+ * @method applicationIconForGrowl
+ * @abstract Return the <code>NSImage</code> to treat as the application icon.
+ * @discussion The delegate may optionally return an <code>NSImage</code>
+ * object to use as the application icon. If this method is not implemented,
+ * {{{-applicationIconDataForGrowl}}} is tried. If that method is not
+ * implemented, the application's own icon is used. Neither method is
+ * generally needed.
+ * @result The <code>NSImage</code> to treat as the application icon.
+ */
+- (NSImage *) applicationIconForGrowl;
+
+/*!
+ * @method applicationIconDataForGrowl
+ * @abstract Return the <code>NSData</code> to treat as the application icon.
+ * @discussion The delegate may optionally return an <code>NSData</code>
+ * object to use as the application icon; if this is not implemented, the
+ * application's own icon is used. This is not generally needed.
+ * @result The <code>NSData</code> to treat as the application icon.
+ * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}.
+ */
+- (NSData *) applicationIconDataForGrowl;
+
+/*!
+ * @method growlIsReady
+ * @abstract Informs the delegate that Growl has launched.
+ * @discussion Informs the delegate that Growl (specifically, the
+ * GrowlHelperApp) was launched successfully. The application can take actions
+ * with the knowledge that Growl is installed and functional.
+ */
+- (void) growlIsReady;
+
+/*!
+ * @method growlNotificationWasClicked:
+ * @abstract Informs the delegate that a Growl notification was clicked.
+ * @discussion Informs the delegate that a Growl notification was clicked. It
+ * is only sent for notifications sent with a non-<code>nil</code>
+ * clickContext, so if you want to receive a message when a notification is
+ * clicked, clickContext must not be <code>nil</code> when calling
+ * <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
+ * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
+ */
+- (void) growlNotificationWasClicked:(id)clickContext;
+
+/*!
+ * @method growlNotificationTimedOut:
+ * @abstract Informs the delegate that a Growl notification timed out.
+ * @discussion Informs the delegate that a Growl notification timed out. It
+ * is only sent for notifications sent with a non-<code>nil</code>
+ * clickContext, so if you want to receive a message when a notification is
+ * clicked, clickContext must not be <code>nil</code> when calling
+ * <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
+ * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
+ */
+- (void) growlNotificationTimedOut:(id)clickContext;
+
+ at end
+
+#pragma mark -
+/*!
+ * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
+ * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework.
+ * @discussion The methods in this informal protocol will only be called if
+ * implemented by the delegate. They allow greater control of the information
+ * presented to the user when installing or upgrading Growl from within your
+ * application when using Growl-WithInstaller.framework.
+ */
+ at interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
+
+/*!
+ * @method growlInstallationWindowTitle
+ * @abstract Return the title of the installation window.
+ * @discussion If not implemented, Growl will use a default, localized title.
+ * @result An NSString object to use as the title.
+ */
+- (NSString *)growlInstallationWindowTitle;
+
+/*!
+ * @method growlUpdateWindowTitle
+ * @abstract Return the title of the upgrade window.
+ * @discussion If not implemented, Growl will use a default, localized title.
+ * @result An NSString object to use as the title.
+ */
+- (NSString *)growlUpdateWindowTitle;
+
+/*!
+ * @method growlInstallationInformation
+ * @abstract Return the information to display when installing.
+ * @discussion This information may be as long or short as desired (the window
+ * will be sized to fit it). It will be displayed to the user as an
+ * explanation of what Growl is and what it can do in your application. It
+ * should probably note that no download is required to install.
+ *
+ * If this is not implemented, Growl will use a default, localized explanation.
+ * @result An NSAttributedString object to display.
+ */
+- (NSAttributedString *)growlInstallationInformation;
+
+/*!
+ * @method growlUpdateInformation
+ * @abstract Return the information to display when upgrading.
+ * @discussion This information may be as long or short as desired (the window
+ * will be sized to fit it). It will be displayed to the user as an
+ * explanation that an updated version of Growl is included in your
+ * application and no download is required.
+ *
+ * If this is not implemented, Growl will use a default, localized explanation.
+ * @result An NSAttributedString object to display.
+ */
+- (NSAttributedString *)growlUpdateInformation;
+
+ at end
+
+//private
+ at interface GrowlApplicationBridge (GrowlInstallationPrompt_private)
++ (void) _userChoseNotToInstallGrowl;
+ at end
+
+#endif /* __GrowlApplicationBridge_h__ */
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Headers/GrowlDefines.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,348 @@
+//
+// GrowlDefines.h
+//
+
+#ifndef _GROWLDEFINES_H
+#define _GROWLDEFINES_H
+
+#ifdef __OBJC__
+#define XSTR(x) (@x)
+#define STRING_TYPE NSString *
+#else
+#define XSTR CFSTR
+#define STRING_TYPE CFStringRef
+#endif
+
+/*! @header GrowlDefines.h
+ * @abstract Defines all the notification keys.
+ * @discussion Defines all the keys used for registration with Growl and for
+ * Growl notifications.
+ *
+ * Most applications should use the functions or methods of Growl.framework
+ * instead of posting notifications such as those described here.
+ * @updated 2004-01-25
+ */
+
+// UserInfo Keys for Registration
+#pragma mark UserInfo Keys for Registration
+
+/*! @group Registration userInfo keys */
+/* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification.
+ * @discussion The values of these keys describe the application and the
+ * notifications it may post.
+ *
+ * Your application must register with Growl before it can post Growl
+ * notifications (and have them not be ignored). However, as of Growl 0.6,
+ * posting GROWL_APP_REGISTRATION notifications directly is no longer the
+ * preferred way to register your application. Your application should instead
+ * use Growl.framework's delegate system.
+ * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
+ * more information.
+ */
+
+/*! @defined GROWL_APP_NAME
+ * @abstract The name of your application.
+ * @discussion The name of your application. This should remain stable between
+ * different versions and incarnations of your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ */
+#define GROWL_APP_NAME XSTR("ApplicationName")
+/*! @defined GROWL_APP_ID
+ * @abstract The bundle identifier of your application.
+ * @discussion The bundle identifier of your application. This key should
+ * be unique for your application while there may be several applications
+ * with the same GROWL_APP_NAME.
+ * This key is optional.
+ */
+#define GROWL_APP_ID XSTR("ApplicationId")
+/*! @defined GROWL_APP_ICON
+ * @abstract The image data for your application's icon.
+ * @discussion Image data representing your application's icon. This may be
+ * superimposed on a notification icon as a badge, used as the notification
+ * icon when a notification-specific icon is not supplied, or ignored
+ * altogether, depending on the display. Must be in a format supported by
+ * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_APP_ICON XSTR("ApplicationIcon")
+/*! @defined GROWL_NOTIFICATIONS_DEFAULT
+ * @abstract The array of notifications to turn on by default.
+ * @discussion These are the names of the notifications that should be enabled
+ * by default when your application registers for the first time. If your
+ * application reregisters, Growl will look here for any new notification
+ * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others.
+ */
+#define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications")
+/*! @defined GROWL_NOTIFICATIONS_ALL
+ * @abstract The array of all notifications your application can send.
+ * @discussion These are the names of all of the notifications that your
+ * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good
+ * notification names.
+ */
+#define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications")
+/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS
+ * @abstract A dictionary of human-readable names for your notifications.
+ * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL
+ * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display.
+ * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions.
+ * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed.
+ *
+ * This key is optional.
+ */
+#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames")
+/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS
+* @abstract A dictionary of descriptions of _when_ each notification occurs
+* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are
+* descriptions of _when_ each notification occurs, such as "You received a new mail message" or
+* "A file finished downloading".
+*
+* This key is optional.
+*/
+#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions")
+
+/*! @defined GROWL_TICKET_VERSION
+ * @abstract The version of your registration ticket.
+ * @discussion Include this key in a ticket plist file that you put in your
+ * application bundle for auto-discovery. The current ticket version is 1.
+ */
+#define GROWL_TICKET_VERSION XSTR("TicketVersion")
+// UserInfo Keys for Notifications
+#pragma mark UserInfo Keys for Notifications
+
+/*! @group Notification userInfo keys */
+/* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification.
+ * @discussion The values of these keys describe the content of a Growl
+ * notification.
+ *
+ * Not all of these keys are supported by all displays. Only the name, title,
+ * and description of a notification are universal. Most of the built-in
+ * displays do support all of these keys, and most other visual displays
+ * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays
+ * support only textual data.
+ */
+
+/*! @defined GROWL_NOTIFICATION_NAME
+ * @abstract The name of the notification.
+ * @discussion The name of the notification. Note that if you do not define
+ * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name
+ * will the one displayed within the Growl preference pane and should be human-readable.
+ */
+#define GROWL_NOTIFICATION_NAME XSTR("NotificationName")
+/*! @defined GROWL_NOTIFICATION_TITLE
+ * @abstract The title to display in the notification.
+ * @discussion The title of the notification. Should be very brief.
+ * The title usually says what happened, e.g. "Download complete".
+ */
+#define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle")
+/*! @defined GROWL_NOTIFICATION_DESCRIPTION
+ * @abstract The description to display in the notification.
+ * @discussion The description should be longer and more verbose than the title.
+ * The description usually tells the subject of the action,
+ * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes".
+ */
+#define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription")
+/*! @defined GROWL_NOTIFICATION_ICON
+ * @discussion Image data for the notification icon. Must be in a format
+ * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon")
+/*! @defined GROWL_NOTIFICATION_APP_ICON
+ * @discussion Image data for the application icon, in case GROWL_APP_ICON does
+ * not apply for some reason. Must be in a format supported by NSImage, such
+ * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon")
+/*! @defined GROWL_NOTIFICATION_PRIORITY
+ * @discussion The priority of the notification as an integer number from
+ * -2 to +2 (+2 being highest).
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority")
+/*! @defined GROWL_NOTIFICATION_STICKY
+ * @discussion A Boolean number controlling whether the notification is sticky.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky")
+/*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT
+ * @abstract Identifies which notification was clicked.
+ * @discussion An identifier for the notification for clicking purposes.
+ *
+ * This will be passed back to the application when the notification is
+ * clicked. It must be plist-encodable (a data, dictionary, array, number, or
+ * string object), and it should be unique for each notification you post.
+ * A good click context would be a UUID string returned by NSProcessInfo or
+ * CFUUID.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext")
+
+/*! @defined GROWL_DISPLAY_PLUGIN
+ * @discussion The name of a display plugin which should be used for this notification.
+ * Optional. If this key is not set or the specified display plugin does not
+ * exist, the display plugin stored in the application ticket is used. This key
+ * allows applications to use different default display plugins for their
+ * notifications. The user can still override those settings in the preference
+ * pane.
+ */
+#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin")
+
+/*! @defined GROWL_NOTIFICATION_IDENTIFIER
+ * @abstract An identifier for the notification for coalescing purposes.
+ * Notifications with the same identifier fall into the same class; only
+ * the last notification of a class is displayed on the screen. If a
+ * notification of the same class is currently being displayed, it is
+ * replaced by this notification.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier")
+
+/*! @defined GROWL_APP_PID
+ * @abstract The process identifier of the process which sends this
+ * notification. If this field is set, the application will only receive
+ * clicked and timed out notifications which originate from this process.
+ *
+ * Optional.
+ */
+#define GROWL_APP_PID XSTR("ApplicationPID")
+
+/*! @defined GROWL_NOTIFICATION_PROGRESS
+* @abstract If this key is set, it should contain a double value wrapped
+* in a NSNumber which describes some sort of progress (from 0.0 to 100.0).
+* If this is key is not set, no progress bar is shown.
+*
+* Optional. Not supported by all display plugins.
+*/
+#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress")
+
+// Notifications
+#pragma mark Notifications
+
+/*! @group Notification names */
+/* @abstract Names of distributed notifications used by Growl.
+ * @discussion These are notifications used by applications (directly or
+ * indirectly) to interact with Growl, and by Growl for interaction between
+ * its components.
+ *
+ * Most of these should no longer be used in Growl 0.6 and later, in favor of
+ * Growl.framework's GrowlApplicationBridge APIs.
+ */
+
+/*! @defined GROWL_APP_REGISTRATION
+ * @abstract The distributed notification for registering your application.
+ * @discussion This is the name of the distributed notification that can be
+ * used to register applications with Growl.
+ *
+ * The userInfo dictionary for this notification can contain these keys:
+ * <ul>
+ * <li>GROWL_APP_NAME</li>
+ * <li>GROWL_APP_ICON</li>
+ * <li>GROWL_NOTIFICATIONS_ALL</li>
+ * <li>GROWL_NOTIFICATIONS_DEFAULT</li>
+ * </ul>
+ *
+ * No longer recommended as of Growl 0.6. An alternate method of registering
+ * is to use Growl.framework's delegate system.
+ * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
+ * more information.
+ */
+#define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification")
+/*! @defined GROWL_APP_REGISTRATION_CONF
+ * @abstract The distributed notification for confirming registration.
+ * @discussion The name of the distributed notification sent to confirm the
+ * registration. Used by the Growl preference pane. Your application probably
+ * does not need to use this notification.
+ */
+#define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification")
+/*! @defined GROWL_NOTIFICATION
+ * @abstract The distributed notification for Growl notifications.
+ * @discussion This is what it all comes down to. This is the name of the
+ * distributed notification that your application posts to actually send a
+ * Growl notification.
+ *
+ * The userInfo dictionary for this notification can contain these keys:
+ * <ul>
+ * <li>GROWL_NOTIFICATION_NAME (required)</li>
+ * <li>GROWL_NOTIFICATION_TITLE (required)</li>
+ * <li>GROWL_NOTIFICATION_DESCRIPTION (required)</li>
+ * <li>GROWL_NOTIFICATION_ICON</li>
+ * <li>GROWL_NOTIFICATION_APP_ICON</li>
+ * <li>GROWL_NOTIFICATION_PRIORITY</li>
+ * <li>GROWL_NOTIFICATION_STICKY</li>
+ * <li>GROWL_NOTIFICATION_CLICK_CONTEXT</li>
+ * <li>GROWL_APP_NAME (required)</li>
+ * </ul>
+ *
+ * No longer recommended as of Growl 0.6. Three alternate methods of posting
+ * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:],
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and
+ * Growl_PostNotification.
+ */
+#define GROWL_NOTIFICATION XSTR("GrowlNotification")
+/*! @defined GROWL_SHUTDOWN
+* @abstract The distributed notification name that tells Growl to shutdown.
+* @discussion The Growl preference pane posts this notification when the
+* "Stop Growl" button is clicked.
+*/
+#define GROWL_SHUTDOWN XSTR("GrowlShutdown")
+/*! @defined GROWL_PING
+ * @abstract A distributed notification to check whether Growl is running.
+ * @discussion This is used by the Growl preference pane. If it receives a
+ * GROWL_PONG, the preference pane takes this to mean that Growl is running.
+ */
+#define GROWL_PING XSTR("Honey, Mind Taking Out The Trash")
+/*! @defined GROWL_PONG
+ * @abstract The distributed notification sent in reply to GROWL_PING.
+ * @discussion GrowlHelperApp posts this in reply to GROWL_PING.
+ */
+#define GROWL_PONG XSTR("What Do You Want From Me, Woman")
+/*! @defined GROWL_IS_READY
+ * @abstract The distributed notification sent when Growl starts up.
+ * @discussion GrowlHelperApp posts this when it has begin listening on all of
+ * its sources for new notifications. GrowlApplicationBridge (in
+ * Growl.framework), upon receiving this notification, reregisters using the
+ * registration dictionary supplied by its delegate.
+ */
+#define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!")
+/*! @defined GROWL_NOTIFICATION_CLICKED
+ * @abstract The distributed notification sent when a supported notification is clicked.
+ * @discussion When a Growl notification with a click context is clicked on by
+ * the user, Growl posts this distributed notification.
+ * The GrowlApplicationBridge responds to this notification by calling a
+ * callback in its delegate.
+ */
+#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!")
+#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!")
+
+/*! @group Other symbols */
+/* Symbols which don't fit into any of the other categories. */
+
+/*! @defined GROWL_KEY_CLICKED_CONTEXT
+ * @abstract Used internally as the key for the clickedContext passed over DNC.
+ * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the
+ * click context that was supplied in the original notification.
+ */
+#define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext")
+/*! @defined GROWL_REG_DICT_EXTENSION
+ * @abstract The filename extension for registration dictionaries.
+ * @discussion The GrowlApplicationBridge in Growl.framework registers with
+ * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION)
+ * and opening it in the GrowlHelperApp. This happens whether or not Growl is
+ * running; if it was stopped, it quits immediately without listening for
+ * notifications.
+ */
+#define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict")
+
+
+#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition"
+
+#endif //ndef _GROWLDEFINES_H
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Resources/Info.plist
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Resources/Info.plist (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/A/Resources/Info.plist 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,24 @@
+<?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>English</string>
+ <key>CFBundleExecutable</key>
+ <string>Growl</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.growl.growlframework</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.2.1</string>
+ <key>CFBundleSignature</key>
+ <string>GRRR</string>
+ <key>CFBundleVersion</key>
+ <string>1.2.1</string>
+ <key>NSPrincipalClass</key>
+ <string>GrowlApplicationBridge</string>
+</dict>
+</plist>
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Growl
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Growl
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Growl 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Growl 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Growl
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/Growl.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/Growl.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/Growl.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,6 @@
+#include "GrowlDefines.h"
+
+#ifdef __OBJC__
+# include "GrowlApplicationBridge.h"
+#endif
+#include "GrowlApplicationBridge-Carbon.h"
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge-Carbon.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge-Carbon.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge-Carbon.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,780 @@
+//
+// GrowlApplicationBridge-Carbon.h
+// Growl
+//
+// Created by Mac-arena the Bored Zo on Wed Jun 18 2004.
+// Based on GrowlApplicationBridge.h by Evan Schoenberg.
+// This source code is in the public domain. You may freely link it into any
+// program.
+//
+
+#ifndef _GROWLAPPLICATIONBRIDGE_CARBON_H_
+#define _GROWLAPPLICATIONBRIDGE_CARBON_H_
+
+#include <sys/cdefs.h>
+#include <Carbon/Carbon.h>
+
+#ifndef GROWL_EXPORT
+#define GROWL_EXPORT __attribute__((visibility("default"))) DEPRECATED_ATTRIBUTE
+#endif
+
+/*! @header GrowlApplicationBridge-Carbon.h
+ * @abstract Declares an API that Carbon applications can use to interact with Growl.
+ * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX
+ * to Growl (such as your application's name and what notifications it may
+ * post) and to provide information to your application (such as that Growl
+ * is listening for notifications or that a notification has been clicked).
+ *
+ * You can set the Growldelegate with Growl_SetDelegate and find out the
+ * current delegate with Growl_GetDelegate. See struct Growl_Delegate for more
+ * information about the delegate.
+ */
+
+__BEGIN_DECLS
+
+/*! @struct Growl_Delegate
+ * @abstract Delegate to supply GrowlApplicationBridge with information and respond to events.
+ * @discussion The Growl delegate provides your interface to
+ * GrowlApplicationBridge. When GrowlApplicationBridge needs information about
+ * your application, it looks for it in the delegate; when Growl or the user
+ * does something that you might be interested in, GrowlApplicationBridge
+ * looks for a callback in the delegate and calls it if present
+ * (meaning, if it is not <code>NULL</code>).
+ * XXX on all of that
+ * @field size The size of the delegate structure.
+ * @field applicationName The name of your application.
+ * @field registrationDictionary A dictionary describing your application and the notifications it can send out.
+ * @field applicationIconData Your application's icon.
+ * @field growlInstallationWindowTitle The title of the installation window.
+ * @field growlInstallationInformation Text to display in the installation window.
+ * @field growlUpdateWindowTitle The title of the update window.
+ * @field growlUpdateInformation Text to display in the update window.
+ * @field referenceCount A count of owners of the delegate.
+ * @field retain Called when GrowlApplicationBridge receives this delegate.
+ * @field release Called when GrowlApplicationBridge no longer needs this delegate.
+ * @field growlIsReady Called when GrowlHelperApp is listening for notifications.
+ * @field growlNotificationWasClicked Called when a Growl notification is clicked.
+ * @field growlNotificationTimedOut Called when a Growl notification timed out.
+ */
+struct Growl_Delegate {
+ /* @discussion This should be sizeof(struct Growl_Delegate).
+ */
+ size_t size;
+
+ /*All of these attributes are optional.
+ *Optional attributes can be NULL; required attributes that
+ * are NULL cause setting the Growl delegate to fail.
+ *XXX - move optional/required status into the discussion for each field
+ */
+
+ /* This name is used both internally and in the Growl preferences.
+ *
+ * This should remain stable between different versions and incarnations of
+ * your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ *
+ * This can be <code>NULL</code> if it is provided elsewhere, namely in an
+ * auto-discoverable plist file in your app bundle
+ * (XXX refer to more information on that) or in registrationDictionary.
+ */
+ CFStringRef applicationName;
+
+ /*
+ * Must contain at least these keys:
+ * GROWL_NOTIFICATIONS_ALL (CFArray):
+ * Contains the names of all notifications your application may post.
+ *
+ * Can also contain these keys:
+ * GROWL_NOTIFICATIONS_DEFAULT (CFArray):
+ * Names of notifications that should be enabled by default.
+ * If omitted, GROWL_NOTIFICATIONS_ALL will be used.
+ * GROWL_APP_NAME (CFString):
+ * Same as the applicationName member of this structure.
+ * If both are present, the applicationName member shall prevail.
+ * If this key is present, you may omit applicationName (set it to <code>NULL</code>).
+ * GROWL_APP_ICON (CFData):
+ * Same as the iconData member of this structure.
+ * If both are present, the iconData member shall prevail.
+ * If this key is present, you may omit iconData (set it to <code>NULL</code>).
+ *
+ * If you change the contents of this dictionary after setting the delegate,
+ * be sure to call Growl_Reregister.
+ *
+ * This can be <code>NULL</code> if you have an auto-discoverable plist file in your app
+ * bundle. (XXX refer to more information on that)
+ */
+ CFDictionaryRef registrationDictionary;
+
+ /* The data can be in any format supported by NSImage. As of
+ * Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and
+ * PICT formats.
+ *
+ * If this is not supplied, Growl will look up your application's icon by
+ * its application name.
+ */
+ CFDataRef applicationIconData;
+
+ /* Installer display attributes
+ *
+ * These four attributes are used by the Growl installer, if this framework
+ * supports it.
+ * For any of these being <code>NULL</code>, a localised default will be
+ * supplied.
+ */
+
+ /* If this is <code>NULL</code>, Growl will use a default,
+ * localized title.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlInstallationWindowTitle;
+ /* This information may be as long or short as desired (the
+ * window will be sized to fit it). If Growl is not installed, it will
+ * be displayed to the user as an explanation of what Growl is and what
+ * it can do in your application.
+ * It should probably note that no download is required to install.
+ *
+ * If this is <code>NULL</code>, Growl will use a default, localized
+ * explanation.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlInstallationInformation;
+ /* If this is <code>NULL</code>, Growl will use a default,
+ * localized title.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlUpdateWindowTitle;
+ /* This information may be as long or short as desired (the
+ * window will be sized to fit it). If an older version of Growl is
+ * installed, it will be displayed to the user as an explanation that an
+ * updated version of Growl is included in your application and
+ * no download is required.
+ *
+ * If this is <code>NULL</code>, Growl will use a default, localized
+ * explanation.
+ *
+ * Only used if you're using Growl-WithInstaller.framework. Otherwise,
+ * this member is ignored.
+ */
+ CFStringRef growlUpdateInformation;
+
+ /* This member is provided for use by your retain and release
+ * callbacks (see below).
+ *
+ * GrowlApplicationBridge never directly uses this member. Instead, it
+ * calls your retain callback (if non-<code>NULL</code>) and your release
+ * callback (if non-<code>NULL</code>).
+ */
+ unsigned referenceCount;
+
+ //Functions. Currently all of these are optional (any of them can be NULL).
+
+ /* When you call Growl_SetDelegate(newDelegate), it will call
+ * oldDelegate->release(oldDelegate), and then it will call
+ * newDelegate->retain(newDelegate), and the return value from retain
+ * is what will be set as the delegate.
+ * (This means that this member works like CFRetain and -[NSObject retain].)
+ * This member is optional (it can be <code>NULL</code>).
+ * For a delegate allocated with malloc, this member would be
+ * <code>NULL</code>.
+ * @result A delegate to which GrowlApplicationBridge holds a reference.
+ */
+ void *(*retain)(void *);
+ /* When you call Growl_SetDelegate(newDelegate), it will call
+ * oldDelegate->release(oldDelegate), and then it will call
+ * newDelegate->retain(newDelegate), and the return value from retain
+ * is what will be set as the delegate.
+ * (This means that this member works like CFRelease and
+ * -[NSObject release].)
+ * This member is optional (it can be NULL).
+ * For a delegate allocated with malloc, this member might be
+ * <code>free</code>(3).
+ */
+ void (*release)(void *);
+
+ /* Informs the delegate that Growl (specifically, the GrowlHelperApp) was
+ * launched successfully (or was already running). The application can
+ * take actions with the knowledge that Growl is installed and functional.
+ */
+ void (*growlIsReady)(void);
+
+ /* Informs the delegate that a Growl notification was clicked. It is only
+ * sent for notifications sent with a non-<code>NULL</code> clickContext,
+ * so if you want to receive a message when a notification is clicked,
+ * clickContext must not be <code>NULL</code> when calling
+ * Growl_PostNotification or
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
+ */
+ void (*growlNotificationWasClicked)(CFPropertyListRef clickContext);
+
+ /* Informs the delegate that a Growl notification timed out. It is only
+ * sent for notifications sent with a non-<code>NULL</code> clickContext,
+ * so if you want to receive a message when a notification is clicked,
+ * clickContext must not be <code>NULL</code> when calling
+ * Growl_PostNotification or
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext.
+ */
+ void (*growlNotificationTimedOut)(CFPropertyListRef clickContext);
+};
+
+/*! @struct Growl_Notification
+ * @abstract Structure describing a Growl notification.
+ * @discussion XXX
+ * @field size The size of the notification structure.
+ * @field name Identifies the notification.
+ * @field title Short synopsis of the notification.
+ * @field description Additional text.
+ * @field iconData An icon for the notification.
+ * @field priority An indicator of the notification's importance.
+ * @field reserved Bits reserved for future usage.
+ * @field isSticky Requests that a notification stay on-screen until dismissed explicitly.
+ * @field clickContext An identifier to be passed to your click callback when a notification is clicked.
+ * @field clickCallback A callback to call when the notification is clicked.
+ */
+struct Growl_Notification {
+ /* This should be sizeof(struct Growl_Notification).
+ */
+ size_t size;
+
+ /* The notification name distinguishes one type of
+ * notification from another. The name should be human-readable, as it
+ * will be displayed in the Growl preference pane.
+ *
+ * The name is used in the GROWL_NOTIFICATIONS_ALL and
+ * GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and
+ * in this member of the Growl_Notification structure.
+ */
+ CFStringRef name;
+
+ /* A notification's title describes the notification briefly.
+ * It should be easy to read quickly by the user.
+ */
+ CFStringRef title;
+
+ /* The description supplements the title with more
+ * information. It is usually longer and sometimes involves a list of
+ * subjects. For example, for a 'Download complete' notification, the
+ * description might have one filename per line. GrowlMail in Growl 0.6
+ * uses a description of '%d new mail(s)' (formatted with the number of
+ * messages).
+ */
+ CFStringRef description;
+
+ /* The notification icon usually indicates either what
+ * happened (it may have the same icon as e.g. a toolbar item that
+ * started the process that led to the notification), or what it happened
+ * to (e.g. a document icon).
+ *
+ * The icon data is optional, so it can be <code>NULL</code>. In that
+ * case, the application icon is used alone. Not all displays support
+ * icons.
+ *
+ * The data can be in any format supported by NSImage. As of Mac OS X
+ * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form
+ * ats.
+ */
+ CFDataRef iconData;
+
+ /* Priority is new in Growl 0.6, and is represented as a
+ * signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low
+ * priority, and +2 is Very High priority.
+ *
+ * Not all displays support priority. If you do not wish to assign a
+ * priority to your notification, assign 0.
+ */
+ signed int priority;
+
+ /* These bits are not used in Growl 0.6. Set them to 0.
+ */
+ unsigned reserved: 31;
+
+ /* When the sticky bit is clear, in most displays,
+ * notifications disappear after a certain amount of time. Sticky
+ * notifications, however, remain on-screen until the user dismisses them
+ * explicitly, usually by clicking them.
+ *
+ * Sticky notifications were introduced in Growl 0.6. Most notifications
+ * should not be sticky. Not all displays support sticky notifications,
+ * and the user may choose in Growl's preference pane to force the
+ * notification to be sticky or non-sticky, in which case the sticky bit
+ * in the notification will be ignored.
+ */
+ unsigned isSticky: 1;
+
+ /* If this is not <code>NULL</code>, and your click callback
+ * is not <code>NULL</code> either, this will be passed to the callback
+ * when your notification is clicked by the user.
+ *
+ * Click feedback was introduced in Growl 0.6, and it is optional. Not
+ * all displays support click feedback.
+ */
+ CFPropertyListRef clickContext;
+
+ /* If this is not <code>NULL</code>, it will be called instead
+ * of the Growl delegate's click callback when clickContext is
+ * non-<code>NULL</code> and the notification is clicked on by the user.
+ *
+ * Click feedback was introduced in Growl 0.6, and it is optional. Not
+ * all displays support click feedback.
+ *
+ * The per-notification click callback is not yet supported as of Growl
+ * 0.7.
+ */
+ void (*clickCallback)(CFPropertyListRef clickContext);
+
+ CFStringRef identifier;
+};
+
+#pragma mark -
+#pragma mark Easy initialisers
+
+/*! @defined InitGrowlDelegate
+ * @abstract Callable macro. Initializes a Growl delegate structure to defaults.
+ * @discussion Call with a pointer to a struct Growl_Delegate. All of the
+ * members of the structure will be set to 0 or <code>NULL</code>, except for
+ * size (which will be set to <code>sizeof(struct Growl_Delegate)</code>) and
+ * referenceCount (which will be set to 1).
+ */
+#define InitGrowlDelegate(delegate) \
+ do { \
+ if (delegate) { \
+ (delegate)->size = sizeof(struct Growl_Delegate); \
+ (delegate)->applicationName = NULL; \
+ (delegate)->registrationDictionary = NULL; \
+ (delegate)->applicationIconData = NULL; \
+ (delegate)->growlInstallationWindowTitle = NULL; \
+ (delegate)->growlInstallationInformation = NULL; \
+ (delegate)->growlUpdateWindowTitle = NULL; \
+ (delegate)->growlUpdateInformation = NULL; \
+ (delegate)->referenceCount = 1U; \
+ (delegate)->retain = NULL; \
+ (delegate)->release = NULL; \
+ (delegate)->growlIsReady = NULL; \
+ (delegate)->growlNotificationWasClicked = NULL; \
+ (delegate)->growlNotificationTimedOut = NULL; \
+ } \
+ } while(0)
+
+/*! @defined InitGrowlNotification
+ * @abstract Callable macro. Initializes a Growl notification structure to defaults.
+ * @discussion Call with a pointer to a struct Growl_Notification. All of
+ * the members of the structure will be set to 0 or <code>NULL</code>, except
+ * for size (which will be set to
+ * <code>sizeof(struct Growl_Notification)</code>).
+ */
+#define InitGrowlNotification(notification) \
+ do { \
+ if (notification) { \
+ (notification)->size = sizeof(struct Growl_Notification); \
+ (notification)->name = NULL; \
+ (notification)->title = NULL; \
+ (notification)->description = NULL; \
+ (notification)->iconData = NULL; \
+ (notification)->priority = 0; \
+ (notification)->reserved = 0U; \
+ (notification)->isSticky = false; \
+ (notification)->clickContext = NULL; \
+ (notification)->clickCallback = NULL; \
+ (notification)->identifier = NULL; \
+ } \
+ } while(0)
+
+#pragma mark -
+#pragma mark Public API
+
+// @functiongroup Managing the Growl delegate
+
+/*! @function Growl_SetDelegate
+ * @abstract Replaces the current Growl delegate with a new one, or removes
+ * the Growl delegate.
+ * @param newDelegate
+ * @result Returns false and does nothing else if a pointer that was passed in
+ * is unsatisfactory (because it is non-<code>NULL</code>, but at least one
+ * required member of it is <code>NULL</code>). Otherwise, sets or unsets the
+ * delegate and returns true.
+ * @discussion When <code>newDelegate</code> is non-<code>NULL</code>, sets
+ * the delegate to <code>newDelegate</code>. When it is <code>NULL</code>,
+ * the current delegate will be unset, and no delegate will be in place.
+ *
+ * It is legal for <code>newDelegate</code> to be the current delegate;
+ * nothing will happen, and Growl_SetDelegate will return true. It is also
+ * legal for it to be <code>NULL</code>, as described above; again, it will
+ * return true.
+ *
+ * If there was a delegate in place before the call, Growl_SetDelegate will
+ * call the old delegate's release member if it was non-<code>NULL</code>. If
+ * <code>newDelegate</code> is non-<code>NULL</code>, Growl_SetDelegate will
+ * call <code>newDelegate->retain</code>, and set the delegate to its return
+ * value.
+ *
+ * If you are using Growl-WithInstaller.framework, and an older version of
+ * Growl is installed on the user's system, the user will automatically be
+ * prompted to update.
+ *
+ * GrowlApplicationBridge currently does not copy this structure, nor does it
+ * retain any of the CF objects in the structure (it regards the structure as
+ * a container that retains the objects when they are added and releases them
+ * when they are removed or the structure is destroyed). Also,
+ * GrowlApplicationBridge currently does not modify any member of the
+ * structure, except possibly the referenceCount by calling the retain and
+ * release members.
+ */
+GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate);
+
+/*! @function Growl_GetDelegate
+ * @abstract Returns the current Growl delegate, if any.
+ * @result The current Growl delegate.
+ * @discussion Returns the last pointer passed into Growl_SetDelegate, or
+ * <code>NULL</code> if no such call has been made.
+ *
+ * This function follows standard Core Foundation reference-counting rules.
+ * Because it is a Get function, not a Copy function, it will not retain the
+ * delegate on your behalf. You are responsible for retaining and releasing
+ * the delegate as needed.
+ */
+GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void);
+
+#pragma mark -
+
+// @functiongroup Posting Growl notifications
+
+/*! @function Growl_PostNotification
+ * @abstract Posts a Growl notification.
+ * @param notification The notification to post.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>NULL</code> (or 0 or false as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl.
+ * If the user cancels, this function will have no effect until the next
+ * application session, at which time when it is called the user will be
+ * prompted again. The user is also given the option to not be prompted again.
+ * If the user does choose to install Growl, the requested notification will
+ * be displayed once Growl is installed and running.
+ */
+GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification);
+
+/*! @function Growl_PostNotificationWithDictionary
+* @abstract Notifies using a userInfo dictionary suitable for passing to
+* CFDistributedNotificationCenter.
+* @param userInfo The dictionary to notify with.
+* @discussion Before Growl 0.6, your application would have posted
+* notifications using CFDistributedNotificationCenter by creating a userInfo
+* dictionary with the notification data. This had the advantage of allowing
+* you to add other data to the dictionary for programs besides Growl that
+* might be listening.
+*
+* This function allows you to use such dictionaries without being restricted
+* to using CFDistributedNotificationCenter. The keys for this dictionary
+ * can be found in GrowlDefines.h.
+*/
+GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo);
+
+/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext
+ * @abstract Posts a Growl notification using parameter values.
+ * @param title The title of the notification.
+ * @param description The description of the notification.
+ * @param notificationName The name of the notification as listed in the
+ * registration dictionary.
+ * @param iconData Data representing a notification icon. Can be <code>NULL</code>.
+ * @param priority The priority of the notification (-2 to +2, with -2
+ * being Very Low and +2 being Very High).
+ * @param isSticky If true, requests that this notification wait for a
+ * response from the user.
+ * @param clickContext An object to pass to the clickCallback, if any. Can
+ * be <code>NULL</code>, in which case the clickCallback is not called.
+ * @discussion Creates a temporary Growl_Notification, fills it out with the
+ * supplied information, and calls Growl_PostNotification on it.
+ * See struct Growl_Notification and Growl_PostNotification for more
+ * information.
+ *
+ * The icon data can be in any format supported by NSImage. As of Mac OS X
+ * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats.
+ */
+GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext(
+ /*inhale*/
+ CFStringRef title,
+ CFStringRef description,
+ CFStringRef notificationName,
+ CFDataRef iconData,
+ signed int priority,
+ Boolean isSticky,
+ CFPropertyListRef clickContext);
+
+#pragma mark -
+
+// @functiongroup Registering
+
+/*! @function Growl_RegisterWithDictionary
+ * @abstract Register your application with Growl without setting a delegate.
+ * @discussion When you call this function with a dictionary,
+ * GrowlApplicationBridge registers your application using that dictionary.
+ * If you pass <code>NULL</code>, GrowlApplicationBridge will ask the delegate
+ * (if there is one) for a dictionary, and if that doesn't work, it will look
+ * in your application's bundle for an auto-discoverable plist.
+ * (XXX refer to more information on that)
+ *
+ * If you pass a dictionary to this function, it must include the
+ * <code>GROWL_APP_NAME</code> key, unless a delegate is set.
+ *
+ * This function is mainly an alternative to the delegate system introduced
+ * with Growl 0.6. Without a delegate, you cannot receive callbacks such as
+ * <code>growlIsReady</code> (since they are sent to the delegate). You can,
+ * however, set a delegate after registering without one.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result <code>false</code> if registration failed (e.g. if Growl isn't installed).
+ */
+GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict);
+
+/*! @function Growl_Reregister
+ * @abstract Updates your registration with Growl.
+ * @discussion If your application changes the contents of the
+ * GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the
+ * Growl delegate, or if it changes the value of that member, or if it
+ * changes the contents of its auto-discoverable plist, call this function
+ * to have Growl update its registration information for your application.
+ *
+ * Otherwise, this function does not normally need to be called. If you're
+ * using a delegate, your application will be registered when you set the
+ * delegate if both the delegate and its registrationDictionary member are
+ * non-<code>NULL</code>.
+ *
+ * This function is now implemented using
+ * <code>Growl_RegisterWithDictionary</code>.
+ */
+GROWL_EXPORT void Growl_Reregister(void);
+
+#pragma mark -
+
+/*! @function Growl_SetWillRegisterWhenGrowlIsReady
+ * @abstract Tells GrowlApplicationBridge to register with Growl when Growl
+ * launches (or not).
+ * @discussion When Growl has started listening for notifications, it posts a
+ * <code>GROWL_IS_READY</code> notification on the Distributed Notification
+ * Center. GrowlApplicationBridge listens for this notification, using it to
+ * perform various tasks (such as calling your delegate's
+ * <code>growlIsReady</code> callback, if it has one). If this function is
+ * called with <code>true</code>, one of those tasks will be to reregister
+ * with Growl (in the manner of <code>Growl_Reregister</code>).
+ *
+ * This attribute is automatically set back to <code>false</code>
+ * (the default) after every <code>GROWL_IS_READY</code> notification.
+ * @param flag <code>true</code> if you want GrowlApplicationBridge to register with
+ * Growl when next it is ready; <code>false</code> if not.
+ */
+GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag);
+/*! @function Growl_WillRegisterWhenGrowlIsReady
+ * @abstract Reports whether GrowlApplicationBridge will register with Growl
+ * when Growl next launches.
+ * @result <code>true</code> if GrowlApplicationBridge will register with
+ * Growl when next it posts GROWL_IS_READY; <code>false</code> if not.
+ */
+GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void);
+
+#pragma mark -
+
+// @functiongroup Obtaining registration dictionaries
+
+/*! @function Growl_CopyRegistrationDictionaryFromDelegate
+ * @abstract Asks the delegate for a registration dictionary.
+ * @discussion If no delegate is set, or if the delegate's
+ * <code>registrationDictionary</code> member is <code>NULL</code>, this
+ * function returns <code>NULL</code>.
+ *
+ * This function does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> or
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
+ * to try to fill in missing keys.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void);
+
+/*! @function Growl_CopyRegistrationDictionaryFromBundle
+ * @abstract Looks in a bundle for a registration dictionary.
+ * @discussion This function looks in a bundle for an auto-discoverable
+ * registration dictionary file using <code>CFBundleCopyResourceURL</code>.
+ * If it finds one, it loads the file using <code>CFPropertyList</code> and
+ * returns the result.
+ *
+ * If you pass <code>NULL</code> as the bundle, the main bundle is examined.
+ *
+ * This function does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary:</code> or
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys</code>
+ * to try to fill in missing keys.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle);
+
+/*! @function Growl_CreateBestRegistrationDictionary
+ * @abstract Obtains a registration dictionary, filled out to the best of
+ * GrowlApplicationBridge's knowledge.
+ * @discussion This function creates a registration dictionary as best
+ * GrowlApplicationBridge knows how.
+ *
+ * First, GrowlApplicationBridge examines the Growl delegate (if there is
+ * one) and gets the registration dictionary from that. If no such dictionary
+ * was obtained, GrowlApplicationBridge looks in your application's main
+ * bundle for an auto-discoverable registration dictionary file. If that
+ * doesn't exist either, this function returns <code>NULL</code>.
+ *
+ * Second, GrowlApplicationBridge calls
+ * <code>Growl_CreateRegistrationDictionaryByFillingInDictionary</code> with
+ * whatever dictionary was obtained. The result of that function is the
+ * result of this function.
+ *
+ * GrowlApplicationBridge uses this function when you call
+ * <code>Growl_SetDelegate</code>, or when you call
+ * <code>Growl_RegisterWithDictionary</code> with <code>NULL</code>.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void);
+
+#pragma mark -
+
+// @functiongroup Filling in registration dictionaries
+
+/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @param regDict The dictionary to fill in.
+ * @result The dictionary with the keys filled in.
+ * @discussion This function examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Keys are only filled in if missing; if a key is present in the dictionary,
+ * its value will not be changed.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict);
+/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @param regDict The dictionary to fill in.
+ * @param keys The keys to fill in. If <code>NULL</code>, any missing keys are filled in.
+ * @result The dictionary with the keys filled in.
+ * @discussion This function examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Only those keys that are listed in <code>keys</code> will be filled in.
+ * Other missing keys are ignored. Also, keys are only filled in if missing;
+ * if a key is present in the dictionary, its value will not be changed.
+ *
+ * This function was introduced in Growl.framework 0.7.
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys);
+
+/*! @brief Tries to fill in missing keys in a notification dictionary.
+ * @param notifDict The dictionary to fill in.
+ * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
+ * @discussion This function examines the \a notifDict for missing keys, and
+ * tries to get them from the last known registration dictionary. As of 1.1,
+ * the keys that it will look for are:
+ *
+ * \li <code>GROWL_APP_NAME</code>
+ * \li <code>GROWL_APP_ICON</code>
+ *
+ * @since Growl.framework 1.1
+ */
+GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict);
+
+#pragma mark -
+
+// @functiongroup Querying Growl's status
+
+/*! @function Growl_IsInstalled
+ * @abstract Determines whether the Growl prefpane and its helper app are
+ * installed.
+ * @result Returns true if Growl is installed, false otherwise.
+ */
+GROWL_EXPORT Boolean Growl_IsInstalled(void);
+
+/*! @function Growl_IsRunning
+ * @abstract Cycles through the process list to find whether GrowlHelperApp
+ * is running.
+ * @result Returns true if Growl is running, false otherwise.
+ */
+GROWL_EXPORT Boolean Growl_IsRunning(void);
+
+#pragma mark -
+
+// @functiongroup Launching Growl
+
+/*! @typedef GrowlLaunchCallback
+ * @abstract Callback to notify you that Growl is running.
+ * @param context The context pointer passed to Growl_LaunchIfInstalled.
+ * @discussion Growl_LaunchIfInstalled calls this callback function if Growl
+ * was already running or if it launched Growl successfully.
+ */
+typedef void (*GrowlLaunchCallback)(void *context);
+
+/*! @function Growl_LaunchIfInstalled
+ * @abstract Launches GrowlHelperApp if it is not already running.
+ * @param callback A callback function which will be called if Growl was successfully
+ * launched or was already running. Can be <code>NULL</code>.
+ * @param context The context pointer to pass to the callback. Can be <code>NULL</code>.
+ * @result Returns true if Growl was successfully launched or was already
+ * running; returns false and does not call the callback otherwise.
+ * @discussion Returns true and calls the callback (if the callback is not
+ * <code>NULL</code>) if the Growl helper app began launching or was already
+ * running. Returns false and performs no other action if Growl could not be
+ * launched (e.g. because the Growl preference pane is not properly installed).
+ *
+ * If <code>Growl_CreateBestRegistrationDictionary</code> returns
+ * non-<code>NULL</code>, this function will register with Growl atomically.
+ *
+ * The callback should take a single argument; this is to allow applications
+ * to have context-relevant information passed back. It is perfectly
+ * acceptable for context to be <code>NULL</code>. The callback itself can be
+ * <code>NULL</code> if you don't want one.
+ */
+GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context);
+
+#pragma mark -
+#pragma mark Constants
+
+/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER
+ * @abstract The CFBundleIdentifier of the Growl preference pane bundle.
+ * @discussion GrowlApplicationBridge uses this to determine whether Growl is
+ * currently installed, by searching for the Growl preference pane. Your
+ * application probably does not need to use this macro itself.
+ */
+#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER
+#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel")
+#endif
+
+__END_DECLS
+
+#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlApplicationBridge.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,575 @@
+//
+// GrowlApplicationBridge.h
+// Growl
+//
+// Created by Evan Schoenberg on Wed Jun 16 2004.
+// Copyright 2004-2006 The Growl Project. All rights reserved.
+//
+
+/*!
+ * @header GrowlApplicationBridge.h
+ * @abstract Defines the GrowlApplicationBridge class.
+ * @discussion This header defines the GrowlApplicationBridge class as well as
+ * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant.
+ */
+
+#ifndef __GrowlApplicationBridge_h__
+#define __GrowlApplicationBridge_h__
+
+#import <Foundation/Foundation.h>
+#import <AppKit/AppKit.h>
+#import "GrowlDefines.h"
+
+//Forward declarations
+ at protocol GrowlApplicationBridgeDelegate;
+
+//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation)
+#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install"
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @class GrowlApplicationBridge
+ * @abstract A class used to interface with Growl.
+ * @discussion This class provides a means to interface with Growl.
+ *
+ * Currently it provides a way to detect if Growl is installed and launch the
+ * GrowlHelperApp if it's not already running.
+ */
+ at interface GrowlApplicationBridge : NSObject {
+
+}
+
+/*!
+ * @method isGrowlInstalled
+ * @abstract Detects whether Growl is installed.
+ * @discussion Determines if the Growl prefpane and its helper app are installed.
+ * @result Returns YES if Growl is installed, NO otherwise.
+ */
++ (BOOL) isGrowlInstalled;
+
+/*!
+ * @method isGrowlRunning
+ * @abstract Detects whether GrowlHelperApp is currently running.
+ * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings.
+ * @result Returns YES if GrowlHelperApp is running, NO otherwise.
+ */
++ (BOOL) isGrowlRunning;
+
+#pragma mark -
+
+/*!
+ * @method setGrowlDelegate:
+ * @abstract Set the object which will be responsible for providing and receiving Growl information.
+ * @discussion This must be called before using GrowlApplicationBridge.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate protocol are required
+ * and return the basic information needed to register with Growl.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol
+ * informal protocol are individually optional. They provide a greater
+ * degree of interaction between the application and growl such as informing
+ * the application when one of its Growl notifications is clicked by the user.
+ *
+ * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol
+ * informal protocol are individually optional and are only applicable when
+ * using the Growl-WithInstaller.framework which allows for automated Growl
+ * installation.
+ *
+ * When this method is called, data will be collected from inDelegate, Growl
+ * will be launched if it is not already running, and the application will be
+ * registered with Growl.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is already installed
+ * but this copy of the framework has an updated version of Growl, the user
+ * will be prompted to update automatically.
+ *
+ * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol.
+ */
++ (void) setGrowlDelegate:(NSObject<GrowlApplicationBridgeDelegate> *)inDelegate;
+
+/*!
+ * @method growlDelegate
+ * @abstract Return the object responsible for providing and receiving Growl information.
+ * @discussion See setGrowlDelegate: for details.
+ * @result The Growl delegate.
+ */
++ (NSObject<GrowlApplicationBridgeDelegate> *) growlDelegate;
+
+#pragma mark -
+
+/*!
+ * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:
+ * @abstract Send a Growl notification.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>nil</code> (or 0 or NO as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl. If the user cancels, this method
+ * will have no effect until the next application session, at which time when
+ * it is called the user will be prompted again. The user is also given the
+ * option to not be prompted again. If the user does choose to install Growl,
+ * the requested notification will be displayed once Growl is installed and
+ * running.
+ *
+ * @param title The title of the notification displayed to the user.
+ * @param description The full description of the notification displayed to the user.
+ * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
+ * @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
+ * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
+ * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
+ * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
+ */
++ (void) notifyWithTitle:(NSString *)title
+ description:(NSString *)description
+ notificationName:(NSString *)notifName
+ iconData:(NSData *)iconData
+ priority:(signed int)priority
+ isSticky:(BOOL)isSticky
+ clickContext:(id)clickContext;
+
+/*!
+ * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier:
+ * @abstract Send a Growl notification.
+ * @discussion This is the preferred means for sending a Growl notification.
+ * The notification name and at least one of the title and description are
+ * required (all three are preferred). All other parameters may be
+ * <code>nil</code> (or 0 or NO as appropriate) to accept default values.
+ *
+ * If using the Growl-WithInstaller framework, if Growl is not installed the
+ * user will be prompted to install Growl. If the user cancels, this method
+ * will have no effect until the next application session, at which time when
+ * it is called the user will be prompted again. The user is also given the
+ * option to not be prompted again. If the user does choose to install Growl,
+ * the requested notification will be displayed once Growl is installed and
+ * running.
+ *
+ * @param title The title of the notification displayed to the user.
+ * @param description The full description of the notification displayed to the user.
+ * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane.
+ * @param iconData <code>NSData</code> object to show with the notification as its icon. If <code>nil</code>, the application's icon will be used instead.
+ * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority.
+ * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications.
+ * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of <code>NSString</code>, <code>NSArray</code>, <code>NSNumber</code>, <code>NSDictionary</code>, and <code>NSData</code> types).
+ * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced.
+ */
++ (void) notifyWithTitle:(NSString *)title
+ description:(NSString *)description
+ notificationName:(NSString *)notifName
+ iconData:(NSData *)iconData
+ priority:(signed int)priority
+ isSticky:(BOOL)isSticky
+ clickContext:(id)clickContext
+ identifier:(NSString *)identifier;
+
+/*! @method notifyWithDictionary:
+ * @abstract Notifies using a userInfo dictionary suitable for passing to
+ * <code>NSDistributedNotificationCenter</code>.
+ * @param userInfo The dictionary to notify with.
+ * @discussion Before Growl 0.6, your application would have posted
+ * notifications using <code>NSDistributedNotificationCenter</code> by
+ * creating a userInfo dictionary with the notification data. This had the
+ * advantage of allowing you to add other data to the dictionary for programs
+ * besides Growl that might be listening.
+ *
+ * This method allows you to use such dictionaries without being restricted
+ * to using <code>NSDistributedNotificationCenter</code>. The keys for this dictionary
+ * can be found in GrowlDefines.h.
+ */
++ (void) notifyWithDictionary:(NSDictionary *)userInfo;
+
+#pragma mark -
+
+/*! @method registerWithDictionary:
+ * @abstract Register your application with Growl without setting a delegate.
+ * @discussion When you call this method with a dictionary,
+ * GrowlApplicationBridge registers your application using that dictionary.
+ * If you pass <code>nil</code>, GrowlApplicationBridge will ask the delegate
+ * (if there is one) for a dictionary, and if that doesn't work, it will look
+ * in your application's bundle for an auto-discoverable plist.
+ * (XXX refer to more information on that)
+ *
+ * If you pass a dictionary to this method, it must include the
+ * <code>GROWL_APP_NAME</code> key, unless a delegate is set.
+ *
+ * This method is mainly an alternative to the delegate system introduced
+ * with Growl 0.6. Without a delegate, you cannot receive callbacks such as
+ * <code>-growlIsReady</code> (since they are sent to the delegate). You can,
+ * however, set a delegate after registering without one.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ */
++ (BOOL) registerWithDictionary:(NSDictionary *)regDict;
+
+/*! @method reregisterGrowlNotifications
+ * @abstract Reregister the notifications for this application.
+ * @discussion This method does not normally need to be called. If your
+ * application changes what notifications it is registering with Growl, call
+ * this method to have the Growl delegate's
+ * <code>-registrationDictionaryForGrowl</code> method called again and the
+ * Growl registration information updated.
+ *
+ * This method is now implemented using <code>-registerWithDictionary:</code>.
+ */
++ (void) reregisterGrowlNotifications;
+
+#pragma mark -
+
+/*! @method setWillRegisterWhenGrowlIsReady:
+ * @abstract Tells GrowlApplicationBridge to register with Growl when Growl
+ * launches (or not).
+ * @discussion When Growl has started listening for notifications, it posts a
+ * <code>GROWL_IS_READY</code> notification on the Distributed Notification
+ * Center. GrowlApplicationBridge listens for this notification, using it to
+ * perform various tasks (such as calling your delegate's
+ * <code>-growlIsReady</code> method, if it has one). If this method is
+ * called with <code>YES</code>, one of those tasks will be to reregister
+ * with Growl (in the manner of <code>-reregisterGrowlNotifications</code>).
+ *
+ * This attribute is automatically set back to <code>NO</code> (the default)
+ * after every <code>GROWL_IS_READY</code> notification.
+ * @param flag <code>YES</code> if you want GrowlApplicationBridge to register with
+ * Growl when next it is ready; <code>NO</code> if not.
+ */
++ (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag;
+/*! @method willRegisterWhenGrowlIsReady
+ * @abstract Reports whether GrowlApplicationBridge will register with Growl
+ * when Growl next launches.
+ * @result <code>YES</code> if GrowlApplicationBridge will register with Growl
+ * when next it posts GROWL_IS_READY; <code>NO</code> if not.
+ */
++ (BOOL) willRegisterWhenGrowlIsReady;
+
+#pragma mark -
+
+/*! @method registrationDictionaryFromDelegate
+ * @abstract Asks the delegate for a registration dictionary.
+ * @discussion If no delegate is set, or if the delegate's
+ * <code>-registrationDictionaryForGrowl</code> method returns
+ * <code>nil</code>, this method returns <code>nil</code>.
+ *
+ * This method does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:]</code> or
+ * <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
+ * to fill in missing keys.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) registrationDictionaryFromDelegate;
+
+/*! @method registrationDictionaryFromBundle:
+ * @abstract Looks in a bundle for a registration dictionary.
+ * @discussion This method looks in a bundle for an auto-discoverable
+ * registration dictionary file using <code>-[NSBundle
+ * pathForResource:ofType:]</code>. If it finds one, it loads the file using
+ * <code>+[NSDictionary dictionaryWithContentsOfFile:]</code> and returns the
+ * result.
+ *
+ * If you pass <code>nil</code> as the bundle, the main bundle is examined.
+ *
+ * This method does not attempt to clean up the dictionary in any way - for
+ * example, if it is missing the <code>GROWL_APP_NAME</code> key, the result
+ * will be missing it too. Use <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:]</code> or
+ * <code>+[GrowlApplicationBridge
+ * registrationDictionaryByFillingInDictionary:restrictToKeys:]</code> to try
+ * to fill in missing keys.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle;
+
+/*! @method bestRegistrationDictionary
+ * @abstract Obtains a registration dictionary, filled out to the best of
+ * GrowlApplicationBridge's knowledge.
+ * @discussion This method creates a registration dictionary as best
+ * GrowlApplicationBridge knows how.
+ *
+ * First, GrowlApplicationBridge contacts the Growl delegate (if there is
+ * one) and gets the registration dictionary from that. If no such dictionary
+ * was obtained, GrowlApplicationBridge looks in your application's main
+ * bundle for an auto-discoverable registration dictionary file. If that
+ * doesn't exist either, this method returns <code>nil</code>.
+ *
+ * Second, GrowlApplicationBridge calls
+ * <code>+registrationDictionaryByFillingInDictionary:</code> with whatever
+ * dictionary was obtained. The result of that method is the result of this
+ * method.
+ *
+ * GrowlApplicationBridge uses this method when you call
+ * <code>+setGrowlDelegate:</code>, or when you call
+ * <code>+registerWithDictionary:</code> with <code>nil</code>.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @result A registration dictionary.
+ */
++ (NSDictionary *) bestRegistrationDictionary;
+
+#pragma mark -
+
+/*! @method registrationDictionaryByFillingInDictionary:
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @discussion This method examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Keys are only filled in if missing; if a key is present in the dictionary,
+ * its value will not be changed.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @param regDict The dictionary to fill in.
+ * @result The dictionary with the keys filled in. This is an autoreleased
+ * copy of <code>regDict</code>.
+ */
++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
+/*! @method registrationDictionaryByFillingInDictionary:restrictToKeys:
+ * @abstract Tries to fill in missing keys in a registration dictionary.
+ * @discussion This method examines the passed-in dictionary for missing keys,
+ * and tries to work out correct values for them. As of 0.7, it uses:
+ *
+ * Key Value
+ * --- -----
+ * <code>GROWL_APP_NAME</code> <code>CFBundleExecutableName</code>
+ * <code>GROWL_APP_ICON</code> The icon of the application.
+ * <code>GROWL_APP_LOCATION</code> The location of the application.
+ * <code>GROWL_NOTIFICATIONS_DEFAULT</code> <code>GROWL_NOTIFICATIONS_ALL</code>
+ *
+ * Only those keys that are listed in <code>keys</code> will be filled in.
+ * Other missing keys are ignored. Also, keys are only filled in if missing;
+ * if a key is present in the dictionary, its value will not be changed.
+ *
+ * This method was introduced in Growl.framework 0.7.
+ * @param regDict The dictionary to fill in.
+ * @param keys The keys to fill in. If <code>nil</code>, any missing keys are filled in.
+ * @result The dictionary with the keys filled in. This is an autoreleased
+ * copy of <code>regDict</code>.
+ */
++ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys;
+
+/*! @brief Tries to fill in missing keys in a notification dictionary.
+ * @param notifDict The dictionary to fill in.
+ * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict.
+ * @discussion This function examines the \a notifDict for missing keys, and
+ * tries to get them from the last known registration dictionary. As of 1.1,
+ * the keys that it will look for are:
+ *
+ * \li <code>GROWL_APP_NAME</code>
+ * \li <code>GROWL_APP_ICON</code>
+ *
+ * @since Growl.framework 1.1
+ */
++ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict;
+
++ (NSDictionary *) frameworkInfoDictionary;
+ at end
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @protocol GrowlApplicationBridgeDelegate
+ * @abstract Required protocol for the Growl delegate.
+ * @discussion The methods in this protocol are required and are called
+ * automatically as needed by GrowlApplicationBridge. See
+ * <code>+[GrowlApplicationBridge setGrowlDelegate:]</code>.
+ * See also <code>GrowlApplicationBridgeDelegate_InformalProtocol</code>.
+ */
+
+ at protocol GrowlApplicationBridgeDelegate
+
+// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7.
+
+ at end
+
+//------------------------------------------------------------------------------
+#pragma mark -
+
+/*!
+ * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol)
+ * @abstract Methods which may be optionally implemented by the GrowlDelegate.
+ * @discussion The methods in this informal protocol will only be called if implemented by the delegate.
+ */
+ at interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol)
+
+/*!
+ * @method registrationDictionaryForGrowl
+ * @abstract Return the dictionary used to register this application with Growl.
+ * @discussion The returned dictionary gives Growl the complete list of
+ * notifications this application will ever send, and it also specifies which
+ * notifications should be enabled by default. Each is specified by an array
+ * of <code>NSString</code> objects.
+ *
+ * For most applications, these two arrays can be the same (if all sent
+ * notifications should be displayed by default).
+ *
+ * The <code>NSString</code> objects of these arrays will correspond to the
+ * <code>notificationName:</code> parameter passed in
+ * <code>+[GrowlApplicationBridge
+ * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]</code> calls.
+ *
+ * The dictionary should have the required key object pairs:
+ * key: GROWL_NOTIFICATIONS_ALL object: <code>NSArray</code> of <code>NSString</code> objects
+ * key: GROWL_NOTIFICATIONS_DEFAULT object: <code>NSArray</code> of <code>NSString</code> objects
+ *
+ * The dictionary may have the following key object pairs:
+ * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: <code>NSDictionary</code> of key: notification name object: human-readable notification name
+ *
+ * You do not need to implement this method if you have an auto-discoverable
+ * plist file in your app bundle. (XXX refer to more information on that)
+ *
+ * @result The <code>NSDictionary</code> to use for registration.
+ */
+- (NSDictionary *) registrationDictionaryForGrowl;
+
+/*!
+ * @method applicationNameForGrowl
+ * @abstract Return the name of this application which will be used for Growl bookkeeping.
+ * @discussion This name is used both internally and in the Growl preferences.
+ *
+ * This should remain stable between different versions and incarnations of
+ * your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ *
+ * You do not need to implement this method if you are providing the
+ * application name elsewhere, meaning in an auto-discoverable plist file in
+ * your app bundle (XXX refer to more information on that) or in the result
+ * of -registrationDictionaryForGrowl.
+ *
+ * @result The name of the application using Growl.
+ */
+- (NSString *) applicationNameForGrowl;
+
+/*!
+ * @method applicationIconForGrowl
+ * @abstract Return the <code>NSImage</code> to treat as the application icon.
+ * @discussion The delegate may optionally return an <code>NSImage</code>
+ * object to use as the application icon. If this method is not implemented,
+ * {{{-applicationIconDataForGrowl}}} is tried. If that method is not
+ * implemented, the application's own icon is used. Neither method is
+ * generally needed.
+ * @result The <code>NSImage</code> to treat as the application icon.
+ */
+- (NSImage *) applicationIconForGrowl;
+
+/*!
+ * @method applicationIconDataForGrowl
+ * @abstract Return the <code>NSData</code> to treat as the application icon.
+ * @discussion The delegate may optionally return an <code>NSData</code>
+ * object to use as the application icon; if this is not implemented, the
+ * application's own icon is used. This is not generally needed.
+ * @result The <code>NSData</code> to treat as the application icon.
+ * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}.
+ */
+- (NSData *) applicationIconDataForGrowl;
+
+/*!
+ * @method growlIsReady
+ * @abstract Informs the delegate that Growl has launched.
+ * @discussion Informs the delegate that Growl (specifically, the
+ * GrowlHelperApp) was launched successfully. The application can take actions
+ * with the knowledge that Growl is installed and functional.
+ */
+- (void) growlIsReady;
+
+/*!
+ * @method growlNotificationWasClicked:
+ * @abstract Informs the delegate that a Growl notification was clicked.
+ * @discussion Informs the delegate that a Growl notification was clicked. It
+ * is only sent for notifications sent with a non-<code>nil</code>
+ * clickContext, so if you want to receive a message when a notification is
+ * clicked, clickContext must not be <code>nil</code> when calling
+ * <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
+ * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
+ */
+- (void) growlNotificationWasClicked:(id)clickContext;
+
+/*!
+ * @method growlNotificationTimedOut:
+ * @abstract Informs the delegate that a Growl notification timed out.
+ * @discussion Informs the delegate that a Growl notification timed out. It
+ * is only sent for notifications sent with a non-<code>nil</code>
+ * clickContext, so if you want to receive a message when a notification is
+ * clicked, clickContext must not be <code>nil</code> when calling
+ * <code>+[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]</code>.
+ * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:].
+ */
+- (void) growlNotificationTimedOut:(id)clickContext;
+
+ at end
+
+#pragma mark -
+/*!
+ * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
+ * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework.
+ * @discussion The methods in this informal protocol will only be called if
+ * implemented by the delegate. They allow greater control of the information
+ * presented to the user when installing or upgrading Growl from within your
+ * application when using Growl-WithInstaller.framework.
+ */
+ at interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol)
+
+/*!
+ * @method growlInstallationWindowTitle
+ * @abstract Return the title of the installation window.
+ * @discussion If not implemented, Growl will use a default, localized title.
+ * @result An NSString object to use as the title.
+ */
+- (NSString *)growlInstallationWindowTitle;
+
+/*!
+ * @method growlUpdateWindowTitle
+ * @abstract Return the title of the upgrade window.
+ * @discussion If not implemented, Growl will use a default, localized title.
+ * @result An NSString object to use as the title.
+ */
+- (NSString *)growlUpdateWindowTitle;
+
+/*!
+ * @method growlInstallationInformation
+ * @abstract Return the information to display when installing.
+ * @discussion This information may be as long or short as desired (the window
+ * will be sized to fit it). It will be displayed to the user as an
+ * explanation of what Growl is and what it can do in your application. It
+ * should probably note that no download is required to install.
+ *
+ * If this is not implemented, Growl will use a default, localized explanation.
+ * @result An NSAttributedString object to display.
+ */
+- (NSAttributedString *)growlInstallationInformation;
+
+/*!
+ * @method growlUpdateInformation
+ * @abstract Return the information to display when upgrading.
+ * @discussion This information may be as long or short as desired (the window
+ * will be sized to fit it). It will be displayed to the user as an
+ * explanation that an updated version of Growl is included in your
+ * application and no download is required.
+ *
+ * If this is not implemented, Growl will use a default, localized explanation.
+ * @result An NSAttributedString object to display.
+ */
+- (NSAttributedString *)growlUpdateInformation;
+
+ at end
+
+//private
+ at interface GrowlApplicationBridge (GrowlInstallationPrompt_private)
++ (void) _userChoseNotToInstallGrowl;
+ at end
+
+#endif /* __GrowlApplicationBridge_h__ */
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlDefines.h
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlDefines.h (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Headers/GrowlDefines.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,348 @@
+//
+// GrowlDefines.h
+//
+
+#ifndef _GROWLDEFINES_H
+#define _GROWLDEFINES_H
+
+#ifdef __OBJC__
+#define XSTR(x) (@x)
+#define STRING_TYPE NSString *
+#else
+#define XSTR CFSTR
+#define STRING_TYPE CFStringRef
+#endif
+
+/*! @header GrowlDefines.h
+ * @abstract Defines all the notification keys.
+ * @discussion Defines all the keys used for registration with Growl and for
+ * Growl notifications.
+ *
+ * Most applications should use the functions or methods of Growl.framework
+ * instead of posting notifications such as those described here.
+ * @updated 2004-01-25
+ */
+
+// UserInfo Keys for Registration
+#pragma mark UserInfo Keys for Registration
+
+/*! @group Registration userInfo keys */
+/* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification.
+ * @discussion The values of these keys describe the application and the
+ * notifications it may post.
+ *
+ * Your application must register with Growl before it can post Growl
+ * notifications (and have them not be ignored). However, as of Growl 0.6,
+ * posting GROWL_APP_REGISTRATION notifications directly is no longer the
+ * preferred way to register your application. Your application should instead
+ * use Growl.framework's delegate system.
+ * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
+ * more information.
+ */
+
+/*! @defined GROWL_APP_NAME
+ * @abstract The name of your application.
+ * @discussion The name of your application. This should remain stable between
+ * different versions and incarnations of your application.
+ * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and
+ * "SurfWriter Lite" are not.
+ */
+#define GROWL_APP_NAME XSTR("ApplicationName")
+/*! @defined GROWL_APP_ID
+ * @abstract The bundle identifier of your application.
+ * @discussion The bundle identifier of your application. This key should
+ * be unique for your application while there may be several applications
+ * with the same GROWL_APP_NAME.
+ * This key is optional.
+ */
+#define GROWL_APP_ID XSTR("ApplicationId")
+/*! @defined GROWL_APP_ICON
+ * @abstract The image data for your application's icon.
+ * @discussion Image data representing your application's icon. This may be
+ * superimposed on a notification icon as a badge, used as the notification
+ * icon when a notification-specific icon is not supplied, or ignored
+ * altogether, depending on the display. Must be in a format supported by
+ * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_APP_ICON XSTR("ApplicationIcon")
+/*! @defined GROWL_NOTIFICATIONS_DEFAULT
+ * @abstract The array of notifications to turn on by default.
+ * @discussion These are the names of the notifications that should be enabled
+ * by default when your application registers for the first time. If your
+ * application reregisters, Growl will look here for any new notification
+ * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others.
+ */
+#define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications")
+/*! @defined GROWL_NOTIFICATIONS_ALL
+ * @abstract The array of all notifications your application can send.
+ * @discussion These are the names of all of the notifications that your
+ * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good
+ * notification names.
+ */
+#define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications")
+/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS
+ * @abstract A dictionary of human-readable names for your notifications.
+ * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL
+ * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display.
+ * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions.
+ * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed.
+ *
+ * This key is optional.
+ */
+#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames")
+/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS
+* @abstract A dictionary of descriptions of _when_ each notification occurs
+* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are
+* descriptions of _when_ each notification occurs, such as "You received a new mail message" or
+* "A file finished downloading".
+*
+* This key is optional.
+*/
+#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions")
+
+/*! @defined GROWL_TICKET_VERSION
+ * @abstract The version of your registration ticket.
+ * @discussion Include this key in a ticket plist file that you put in your
+ * application bundle for auto-discovery. The current ticket version is 1.
+ */
+#define GROWL_TICKET_VERSION XSTR("TicketVersion")
+// UserInfo Keys for Notifications
+#pragma mark UserInfo Keys for Notifications
+
+/*! @group Notification userInfo keys */
+/* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification.
+ * @discussion The values of these keys describe the content of a Growl
+ * notification.
+ *
+ * Not all of these keys are supported by all displays. Only the name, title,
+ * and description of a notification are universal. Most of the built-in
+ * displays do support all of these keys, and most other visual displays
+ * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays
+ * support only textual data.
+ */
+
+/*! @defined GROWL_NOTIFICATION_NAME
+ * @abstract The name of the notification.
+ * @discussion The name of the notification. Note that if you do not define
+ * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name
+ * will the one displayed within the Growl preference pane and should be human-readable.
+ */
+#define GROWL_NOTIFICATION_NAME XSTR("NotificationName")
+/*! @defined GROWL_NOTIFICATION_TITLE
+ * @abstract The title to display in the notification.
+ * @discussion The title of the notification. Should be very brief.
+ * The title usually says what happened, e.g. "Download complete".
+ */
+#define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle")
+/*! @defined GROWL_NOTIFICATION_DESCRIPTION
+ * @abstract The description to display in the notification.
+ * @discussion The description should be longer and more verbose than the title.
+ * The description usually tells the subject of the action,
+ * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes".
+ */
+#define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription")
+/*! @defined GROWL_NOTIFICATION_ICON
+ * @discussion Image data for the notification icon. Must be in a format
+ * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon")
+/*! @defined GROWL_NOTIFICATION_APP_ICON
+ * @discussion Image data for the application icon, in case GROWL_APP_ICON does
+ * not apply for some reason. Must be in a format supported by NSImage, such
+ * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon")
+/*! @defined GROWL_NOTIFICATION_PRIORITY
+ * @discussion The priority of the notification as an integer number from
+ * -2 to +2 (+2 being highest).
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority")
+/*! @defined GROWL_NOTIFICATION_STICKY
+ * @discussion A Boolean number controlling whether the notification is sticky.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky")
+/*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT
+ * @abstract Identifies which notification was clicked.
+ * @discussion An identifier for the notification for clicking purposes.
+ *
+ * This will be passed back to the application when the notification is
+ * clicked. It must be plist-encodable (a data, dictionary, array, number, or
+ * string object), and it should be unique for each notification you post.
+ * A good click context would be a UUID string returned by NSProcessInfo or
+ * CFUUID.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext")
+
+/*! @defined GROWL_DISPLAY_PLUGIN
+ * @discussion The name of a display plugin which should be used for this notification.
+ * Optional. If this key is not set or the specified display plugin does not
+ * exist, the display plugin stored in the application ticket is used. This key
+ * allows applications to use different default display plugins for their
+ * notifications. The user can still override those settings in the preference
+ * pane.
+ */
+#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin")
+
+/*! @defined GROWL_NOTIFICATION_IDENTIFIER
+ * @abstract An identifier for the notification for coalescing purposes.
+ * Notifications with the same identifier fall into the same class; only
+ * the last notification of a class is displayed on the screen. If a
+ * notification of the same class is currently being displayed, it is
+ * replaced by this notification.
+ *
+ * Optional. Not supported by all display plugins.
+ */
+#define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier")
+
+/*! @defined GROWL_APP_PID
+ * @abstract The process identifier of the process which sends this
+ * notification. If this field is set, the application will only receive
+ * clicked and timed out notifications which originate from this process.
+ *
+ * Optional.
+ */
+#define GROWL_APP_PID XSTR("ApplicationPID")
+
+/*! @defined GROWL_NOTIFICATION_PROGRESS
+* @abstract If this key is set, it should contain a double value wrapped
+* in a NSNumber which describes some sort of progress (from 0.0 to 100.0).
+* If this is key is not set, no progress bar is shown.
+*
+* Optional. Not supported by all display plugins.
+*/
+#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress")
+
+// Notifications
+#pragma mark Notifications
+
+/*! @group Notification names */
+/* @abstract Names of distributed notifications used by Growl.
+ * @discussion These are notifications used by applications (directly or
+ * indirectly) to interact with Growl, and by Growl for interaction between
+ * its components.
+ *
+ * Most of these should no longer be used in Growl 0.6 and later, in favor of
+ * Growl.framework's GrowlApplicationBridge APIs.
+ */
+
+/*! @defined GROWL_APP_REGISTRATION
+ * @abstract The distributed notification for registering your application.
+ * @discussion This is the name of the distributed notification that can be
+ * used to register applications with Growl.
+ *
+ * The userInfo dictionary for this notification can contain these keys:
+ * <ul>
+ * <li>GROWL_APP_NAME</li>
+ * <li>GROWL_APP_ICON</li>
+ * <li>GROWL_NOTIFICATIONS_ALL</li>
+ * <li>GROWL_NOTIFICATIONS_DEFAULT</li>
+ * </ul>
+ *
+ * No longer recommended as of Growl 0.6. An alternate method of registering
+ * is to use Growl.framework's delegate system.
+ * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for
+ * more information.
+ */
+#define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification")
+/*! @defined GROWL_APP_REGISTRATION_CONF
+ * @abstract The distributed notification for confirming registration.
+ * @discussion The name of the distributed notification sent to confirm the
+ * registration. Used by the Growl preference pane. Your application probably
+ * does not need to use this notification.
+ */
+#define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification")
+/*! @defined GROWL_NOTIFICATION
+ * @abstract The distributed notification for Growl notifications.
+ * @discussion This is what it all comes down to. This is the name of the
+ * distributed notification that your application posts to actually send a
+ * Growl notification.
+ *
+ * The userInfo dictionary for this notification can contain these keys:
+ * <ul>
+ * <li>GROWL_NOTIFICATION_NAME (required)</li>
+ * <li>GROWL_NOTIFICATION_TITLE (required)</li>
+ * <li>GROWL_NOTIFICATION_DESCRIPTION (required)</li>
+ * <li>GROWL_NOTIFICATION_ICON</li>
+ * <li>GROWL_NOTIFICATION_APP_ICON</li>
+ * <li>GROWL_NOTIFICATION_PRIORITY</li>
+ * <li>GROWL_NOTIFICATION_STICKY</li>
+ * <li>GROWL_NOTIFICATION_CLICK_CONTEXT</li>
+ * <li>GROWL_APP_NAME (required)</li>
+ * </ul>
+ *
+ * No longer recommended as of Growl 0.6. Three alternate methods of posting
+ * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:],
+ * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and
+ * Growl_PostNotification.
+ */
+#define GROWL_NOTIFICATION XSTR("GrowlNotification")
+/*! @defined GROWL_SHUTDOWN
+* @abstract The distributed notification name that tells Growl to shutdown.
+* @discussion The Growl preference pane posts this notification when the
+* "Stop Growl" button is clicked.
+*/
+#define GROWL_SHUTDOWN XSTR("GrowlShutdown")
+/*! @defined GROWL_PING
+ * @abstract A distributed notification to check whether Growl is running.
+ * @discussion This is used by the Growl preference pane. If it receives a
+ * GROWL_PONG, the preference pane takes this to mean that Growl is running.
+ */
+#define GROWL_PING XSTR("Honey, Mind Taking Out The Trash")
+/*! @defined GROWL_PONG
+ * @abstract The distributed notification sent in reply to GROWL_PING.
+ * @discussion GrowlHelperApp posts this in reply to GROWL_PING.
+ */
+#define GROWL_PONG XSTR("What Do You Want From Me, Woman")
+/*! @defined GROWL_IS_READY
+ * @abstract The distributed notification sent when Growl starts up.
+ * @discussion GrowlHelperApp posts this when it has begin listening on all of
+ * its sources for new notifications. GrowlApplicationBridge (in
+ * Growl.framework), upon receiving this notification, reregisters using the
+ * registration dictionary supplied by its delegate.
+ */
+#define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!")
+/*! @defined GROWL_NOTIFICATION_CLICKED
+ * @abstract The distributed notification sent when a supported notification is clicked.
+ * @discussion When a Growl notification with a click context is clicked on by
+ * the user, Growl posts this distributed notification.
+ * The GrowlApplicationBridge responds to this notification by calling a
+ * callback in its delegate.
+ */
+#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!")
+#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!")
+
+/*! @group Other symbols */
+/* Symbols which don't fit into any of the other categories. */
+
+/*! @defined GROWL_KEY_CLICKED_CONTEXT
+ * @abstract Used internally as the key for the clickedContext passed over DNC.
+ * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the
+ * click context that was supplied in the original notification.
+ */
+#define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext")
+/*! @defined GROWL_REG_DICT_EXTENSION
+ * @abstract The filename extension for registration dictionaries.
+ * @discussion The GrowlApplicationBridge in Growl.framework registers with
+ * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION)
+ * and opening it in the GrowlHelperApp. This happens whether or not Growl is
+ * running; if it was stopped, it quits immediately without listening for
+ * notifications.
+ */
+#define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict")
+
+
+#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition"
+
+#endif //ndef _GROWLDEFINES_H
Added: trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Resources/Info.plist
===================================================================
--- trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Resources/Info.plist (rev 0)
+++ trunk/src/uimac14/Frameworks/Growl.framework/Versions/Current/Resources/Info.plist 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,24 @@
+<?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>English</string>
+ <key>CFBundleExecutable</key>
+ <string>Growl</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.growl.growlframework</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.2.1</string>
+ <key>CFBundleSignature</key>
+ <string>GRRR</string>
+ <key>CFBundleVersion</key>
+ <string>1.2.1</string>
+ <key>NSPrincipalClass</key>
+ <string>GrowlApplicationBridge</string>
+</dict>
+</plist>
Added: trunk/src/uimac14/ImageAndTextCell.h
===================================================================
--- trunk/src/uimac14/ImageAndTextCell.h (rev 0)
+++ trunk/src/uimac14/ImageAndTextCell.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,20 @@
+//
+// ImageAndTextCell.h
+//
+// Copyright (c) 2001-2002, Apple. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+ at interface ImageAndTextCell : NSTextFieldCell {
+ at private
+ NSImage *image;
+}
+
+- (void)setImage:(NSImage *)anImage;
+- (NSImage *)image;
+
+- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView;
+- (NSSize)cellSize;
+
+ at end
Added: trunk/src/uimac14/ImageAndTextCell.m
===================================================================
--- trunk/src/uimac14/ImageAndTextCell.m (rev 0)
+++ trunk/src/uimac14/ImageAndTextCell.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,131 @@
+/*
+ ImageAndTextCell.m
+ Copyright (c) 2001-2004, Apple Computer, Inc., all rights reserved.
+ Author: Chuck Pisula
+
+ Milestones:
+ Initially created 3/1/01
+
+ Subclass of NSTextFieldCell which can display text and an image simultaneously.
+*/
+
+/*
+ IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
+ consideration of your agreement to the following terms, and your use, installation,
+ modification or redistribution of this Apple software constitutes acceptance of these
+ terms. If you do not agree with these terms, please do not use, install, modify or
+ redistribute this Apple software.
+
+ In consideration of your agreement to abide by the following terms, and subject to these
+ terms, Apple grants you a personal, non-exclusive license, under AppleÕs copyrights in
+ this original Apple software (the "Apple Software"), to use, reproduce, modify and
+ redistribute the Apple Software, with or without modifications, in source and/or binary
+ forms; provided that if you redistribute the Apple Software in its entirety and without
+ modifications, you must retain this notice and the following text and disclaimers in all
+ such redistributions of the Apple Software. Neither the name, trademarks, service marks
+ or logos of Apple Computer, Inc. may be used to endorse or promote products derived from
+ the Apple Software without specific prior written permission from Apple. Except as expressly
+ stated in this notice, no other rights or licenses, express or implied, are granted by Apple
+ herein, including but not limited to any patent rights that may be infringed by your
+ derivative works or by other works in which the Apple Software may be incorporated.
+
+ The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES,
+ EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT,
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS
+ USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+ IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
+ REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND
+ WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
+ OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#import "ImageAndTextCell.h"
+
+ at implementation ImageAndTextCell
+
+- (void)dealloc {
+ [image release];
+ image = nil;
+ [super dealloc];
+}
+
+- copyWithZone:(NSZone *)zone {
+ ImageAndTextCell *cell = (ImageAndTextCell *)[super copyWithZone:zone];
+ cell->image = [image retain];
+ return cell;
+}
+
+- (void)setImage:(NSImage *)anImage {
+ if (anImage != image) {
+ [image release];
+ image = [anImage retain];
+ }
+}
+
+- (NSImage *)image {
+ return image;
+}
+
+- (NSRect)imageFrameForCellFrame:(NSRect)cellFrame {
+ if (image != nil) {
+ NSRect imageFrame;
+ imageFrame.size = [image size];
+ imageFrame.origin = cellFrame.origin;
+ imageFrame.origin.x += 3;
+ imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2);
+ return imageFrame;
+ }
+ else
+ return NSZeroRect;
+}
+
+- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent {
+ NSRect textFrame, imageFrame;
+ NSDivideRect (aRect, &imageFrame, &textFrame, 3 + [image size].width, NSMinXEdge);
+ [super editWithFrame: textFrame inView: controlView editor:textObj delegate:anObject event: theEvent];
+}
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
+typedef int NSInteger;
+#endif
+- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength {
+ NSRect textFrame, imageFrame;
+ NSDivideRect (aRect, &imageFrame, &textFrame, 3 + [image size].width, NSMinXEdge);
+ [super selectWithFrame: textFrame inView: controlView editor:textObj delegate:anObject start:selStart length:selLength];
+}
+
+- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
+ if (image != nil) {
+ NSSize imageSize;
+ NSRect imageFrame;
+
+ imageSize = [image size];
+ NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge);
+ if ([self drawsBackground]) {
+ [[self backgroundColor] set];
+ NSRectFill(imageFrame);
+ }
+ imageFrame.origin.x += 3;
+ imageFrame.size = imageSize;
+
+ if ([controlView isFlipped])
+ imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2);
+ else
+ imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2);
+
+ [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver];
+ }
+ [super drawWithFrame:cellFrame inView:controlView];
+}
+
+- (NSSize)cellSize {
+ NSSize cellSize = [super cellSize];
+ cellSize.width += (image ? [image size].width : 0) + 3;
+ return cellSize;
+}
+
+ at end
+
Added: trunk/src/uimac14/Info.plist
===================================================================
--- trunk/src/uimac14/Info.plist (rev 0)
+++ trunk/src/uimac14/Info.plist 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,32 @@
+<?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>CFBundleName</key>
+ <string>Unison</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>Unison</string>
+ <key>CFBundleIconFile</key>
+ <string>Unison.icns</string>
+ <key>CFBundleIdentifier</key>
+ <string>edu.upenn.cis.Unison</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleShortVersionString</key>
+ <string>$(MARKETING_VERSION)</string>
+ <key>CFBundleGetInfoString</key>
+ <string>${MARKETING_VERSION}, ©1999-2014, licensed under GNU GPL.</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>©1999-2014, licensed under GNU GPL v3.</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
Added: trunk/src/uimac14/Info.plist.template
===================================================================
--- trunk/src/uimac14/Info.plist.template (rev 0)
+++ trunk/src/uimac14/Info.plist.template 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleName</key>
+ <string>Unison</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>Unison</string>
+ <key>CFBundleIconFile</key>
+ <string>Unison.icns</string>
+ <key>CFBundleIdentifier</key>
+ <string>edu.upenn.cis.Unison</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>@@VERSION@@</string>
+ <key>CFBundleShortVersionString</key>
+ <string>@@VERSION@@</string>
+ <key>CFBundleGetInfoString</key>
+ <string>@@VERSION@@. ©1999-2007, licensed under GNU GPL.</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>©1999-2006, licensed under GNU GPL.</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
Added: trunk/src/uimac14/MyController.h
===================================================================
--- trunk/src/uimac14/MyController.h (rev 0)
+++ trunk/src/uimac14/MyController.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,147 @@
+/* MyController */
+/* Copyright (c) 2003, 2014, see file COPYING for details. */
+
+#import <Cocoa/Cocoa.h>
+
+#import "ProfileController.h"
+#import "PreferencesController.h"
+#import "NotificationController.h"
+#import "ReconItem.h"
+#import "ReconTableView.h"
+#import "UnisonToolbar.h"
+#import "ImageAndTextCell.h"
+#import "ProgressCell.h"
+#import "ColorGradientView.h"
+#import "Bridge.h"
+
+ at interface MyController : NSObject
+{
+ IBOutlet NSWindow *mainWindow;
+ UnisonToolbar *toolbar;
+
+ IBOutlet NSWindow *cltoolWindow;
+ IBOutlet NSButton *cltoolPref;
+
+ IBOutlet ProfileController *profileController;
+ IBOutlet NSView *chooseProfileView;
+ NSString *myProfile;
+
+ IBOutlet PreferencesController *preferencesController;
+ IBOutlet NSView *preferencesView;
+
+ IBOutlet NSView *updatesView;
+ IBOutlet NSView *ConnectingView;
+ IBOutlet ColorGradientView *connectingViewGradient;
+
+ NSView *blankView;
+
+ IBOutlet ReconTableView *tableView;
+ IBOutlet NSTextField *updatesText;
+ IBOutlet NSTextField *detailsTextView;
+ IBOutlet NSTextField *statusText;
+ IBOutlet ColorGradientView *detailsTextViewGradient;
+
+ IBOutlet NSWindow *passwordWindow;
+ IBOutlet NSTextField *passwordPrompt;
+ IBOutlet NSTextField *passwordText;
+ IBOutlet NSButton *passwordCancelButton;
+ BOOL waitingForPassword;
+
+ IBOutlet NSWindow *aboutWindow;
+ IBOutlet NSTextField *versionText;
+
+ IBOutlet NSProgressIndicator *progressBar;
+
+ IBOutlet NotificationController *notificationController;
+
+ BOOL syncable;
+ BOOL duringSync;
+ BOOL afterSync;
+
+ NSMutableArray *reconItems;
+ ParentReconItem *rootItem;
+ OCamlValue *preconn;
+
+ BOOL doneFirstDiff;
+ IBOutlet NSWindow *diffWindow;
+ IBOutlet NSTextView *diffView;
+ IBOutlet NSSegmentedControl *tableModeSelector;
+ IBOutlet NSProgressIndicator *connectingAnimation;
+
+ IBOutlet NSWindow *preferencesWindow;
+ IBOutlet NSButton* checkOpenProfile;
+ IBOutlet NSComboBox *profileBox;
+ IBOutlet NSTextField *detailsFontLabel;
+ IBOutlet NSTextField *diffFontLabel;
+ IBOutlet NSButton *chooseDetailsFont;
+ IBOutlet NSButton *chooseDiffFont;
+
+ IBOutlet NSSplitView *splitView;
+
+ id fontChangeTarget;
+
+ BOOL isBatchSet;
+ NSTimer *_timer;
+ NSAlert *_timeoutAlert;
+ NSUInteger _secondsRemaining;
+
+ BOOL shouldExitAfterWarning;
+}
+
+- (id)init;
+- (void)awakeFromNib;
+
+- (void)chooseProfiles;
+- (IBAction)createButton:(id)sender;
+- (IBAction)saveProfileButton:(id)sender;
+- (IBAction)cancelProfileButton:(id)sender;
+- (NSString *)profile;
+- (void)profileSelected:(NSString *)aProfile;
+
+- (IBAction)showPreferences:(id)sender;
+- (IBAction)restartButton:(id)sender;
+- (IBAction)rescan:(id)sender;
+
+- (IBAction)openButton:(id)sender;
+- (void)connect:(NSString *)profileName;
+- (void)raisePasswordWindow:(NSString *)prompt;
+- (void)controlTextDidEndEditing:(NSNotification *)notification;
+- (IBAction)endPasswordWindow:(id)sender;
+- (void)afterOpen;
+
+- (IBAction)syncButton:(id)sender;
+- (IBAction)tableModeChanged:(id)sender;
+- (void)initTableMode;
+
+- (NSMutableArray *)reconItems;
+- (void)updateForChangedItems;
+- (void)updateReconItems:(OCamlValue *)items;
+- (id)updateForIgnore:(id)i;
+
+- (void)statusTextSet:(NSString *)s;
+- (void)diffViewTextSet:(NSString *)title bodyText:(NSString *)body;
+- (void)displayDetails:(ReconItem *)item;
+- (void)clearDetails;
+
+- (IBAction)raiseCltoolWindow:(id)sender;
+- (IBAction)cltoolYesButton:(id)sender;
+- (IBAction)cltoolNoButton:(id)sender;
+
+- (IBAction)raiseAboutWindow:(id)sender;
+- (IBAction)raiseWindow:(NSWindow *)theWindow;
+- (IBAction)onlineHelp:(id)sender;
+- (IBAction)installCommandLineTool:(id)sender;
+
+- (BOOL)validateItem:(SEL) action;
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem;
+- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem;
+
+- (void)resizeWindowToSize:(NSSize)newSize;
+- (float)toolbarHeightForWindow:(NSWindow *)window;
+
+- (IBAction) checkOpenProfileChanged:(id)sender;
+- (IBAction) chooseFont:(id)sender;
+- (void) updateFontDisplay;
+
+ at end
+
Added: trunk/src/uimac14/MyController.m
===================================================================
--- trunk/src/uimac14/MyController.m (rev 0)
+++ trunk/src/uimac14/MyController.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,1227 @@
+/* Copyright (c) 2003, 2014, see file COPYING for details. */
+
+#import "MyController.h"
+
+/* The following two define are a workaround for an incompatibility between
+Ocaml 3.11.2 (and older) and the Mac OS X header files */
+#define uint64 uint64_caml
+#define int64 int64_caml
+
+#define CAML_NAME_SPACE
+#include <caml/callback.h>
+#include <caml/alloc.h>
+#include <caml/mlvalues.h>
+#include <caml/memory.h>
+
+ at interface NSString (_UnisonUtil)
+- (NSString *)trim;
+ at end
+
+ at implementation MyController
+
+static MyController *me; // needed by reloadTable and displayStatus, below
+
+// BCP (11/09): Added per Onne Gorter:
+// if user closes main window, terminate app, instead of keeping an empty app around with no window
+- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication {
+ return YES;
+}
+
+- (id)init
+{
+ if (([super init])) {
+
+ /* Initialize locals */
+ me = self;
+ doneFirstDiff = NO;
+
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
+ /* By default, invite user to install cltool */
+ @"YES", @"CheckCltool",
+ @"NO", @"openProfileAtStartup",
+ @"", @"profileToOpen",
+ @"NO", @"deleteLogOnExit",
+ @"", @"detailsFont",
+ @"", @"diffFont",
+ nil];
+
+ [defaults registerDefaults:appDefaults];
+ fontChangeTarget = nil;
+ }
+
+ return self;
+}
+
+- (void) applicationWillTerminate:(NSNotification *)aNotification {
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults setObject:[NSArchiver archivedDataWithRootObject:[detailsTextView font]] forKey:@"detailsFont"];
+ [defaults setObject:[NSArchiver archivedDataWithRootObject:[diffView font]] forKey:@"diffFont"];
+ [defaults synchronize];
+}
+
+- (void)awakeFromNib
+{
+ [splitView setAutosaveName:@"splitView"];
+
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ NSFont *defaultFont = [NSFont fontWithName:@"Monaco" size:11];
+ NSData *detailsFontData = [defaults dataForKey:@"detailsFont"];
+ if (detailsFontData) {
+ NSFont *tmpFont = (NSFont*) [NSUnarchiver unarchiveObjectWithData:detailsFontData];
+ if (tmpFont)
+ [detailsTextView setFont:tmpFont];
+ else
+ [detailsTextView setFont:defaultFont];
+ } else
+ [detailsTextView setFont:defaultFont];
+ [detailsTextView.cell setBackgroundStyle:NSBackgroundStyleRaised];
+ [detailsTextView.cell setBackgroundStyle:NSBackgroundStyleRaised];
+
+ NSColor *startColor = [NSColor colorWithCalibratedRed:0.613 green:0.665 blue:0.715 alpha:1.000];
+ NSColor *endColor = [NSColor colorWithCalibratedRed:0.439 green:0.496 blue:0.548 alpha:1.000];
+
+ [detailsTextViewGradient setStartingColor:startColor];
+ [detailsTextViewGradient setEndingColor:endColor];
+ [detailsTextViewGradient setAngle:270];
+ [connectingViewGradient setStartingColor:startColor];
+ [connectingViewGradient setEndingColor:endColor];
+ [connectingViewGradient setAngle:270];
+
+ NSData *diffFontData = [defaults dataForKey:@"diffFont"];
+ if (diffFontData) {
+ NSFont *tmpFont = (NSFont*) [NSUnarchiver unarchiveObjectWithData:diffFontData];
+ if (tmpFont)
+ [diffView setFont:tmpFont];
+ else
+ [diffView setFont:defaultFont];
+ } else
+ [diffView setFont:defaultFont];
+
+ blankView = [[NSView alloc] init];
+
+ /* Double clicking in the profile list will open the profile */
+ [[profileController tableView] setTarget:self];
+ [[profileController tableView] setDoubleAction:@selector(openButton:)];
+
+ [tableView setAutoresizesOutlineColumn:NO];
+
+ // use combo-cell for path
+ [[tableView tableColumnWithIdentifier:@"path"] setDataCell:[[[ImageAndTextCell alloc] init] autorelease]];
+
+ // Custom progress cell
+ ProgressCell *progressCell = [[[ProgressCell alloc] init] autorelease];
+ [[tableView tableColumnWithIdentifier:@"percentTransferred"] setDataCell:progressCell];
+
+ /* Set up the version string in the about box. We use a custom
+ about box just because PRCS doesn't seem capable of getting the
+ version into the InfoPlist.strings file; otherwise we'd use the
+ standard about box. */
+ [versionText setStringValue:ocamlCall("S", "unisonGetVersion")];
+
+ /* Command-line processing */
+ OCamlValue *clprofile = (id)ocamlCall("@", "unisonInit0");
+
+ BOOL areRootsSet = (long)ocamlCall("i", "areRootsSet") ? YES : NO;
+ if (areRootsSet) {
+ NSLog(@"Roots are on the command line");
+ }
+ else {
+ NSLog(@"Roots are not set on the command line");
+ }
+
+ /* Add toolbar */
+ toolbar = [[[UnisonToolbar alloc]
+ initWithIdentifier: @"unisonToolbar" :self :tableView] autorelease];
+ [mainWindow setToolbar: toolbar];
+ [toolbar takeTableModeView:tableModeSelector];
+ [self initTableMode];
+
+
+ /* Set up the first window the user will see */
+ if (clprofile) {
+ /* A profile name was given on the command line */
+ NSString *profileName = [clprofile getField:0 withType:'S'];
+ [self profileSelected:profileName];
+
+ /* If invoked from terminal we need to bring the app to the front */
+ [NSApp activateIgnoringOtherApps:YES];
+
+ /* Start the connection */
+ [self connect:profileName];
+ }
+ else if (areRootsSet) {
+ /* If invoked from terminal we need to bring the app to the front */
+ [NSApp activateIgnoringOtherApps:YES];
+ /* Start the connection with the empty profile name, indicating roots only */
+ [self connect:@""];
+ }
+ else {
+ /* If invoked from terminal we need to bring the app to the front */
+ [NSApp activateIgnoringOtherApps:YES];
+ if ([[NSUserDefaults standardUserDefaults] boolForKey:@"openProfileAtStartup"]) {
+ NSString *profileToOpen = [[NSUserDefaults standardUserDefaults]
+ stringForKey:@"profileToOpen"];
+ if ([[profileToOpen trim] compare:@""] != NSOrderedSame &&
+ [[profileController getProfiles] indexOfObject:profileToOpen] != NSNotFound) {
+ [self profileSelected:profileToOpen];
+ [self connect:profileToOpen];
+ } else {
+ /* Bring up the dialog to choose a profile */
+ [self chooseProfiles];
+ }
+ } else {
+ /* Bring up the dialog to choose a profile */
+ [self chooseProfiles];
+ }
+ }
+
+ [mainWindow display];
+ [mainWindow makeKeyAndOrderFront:nil];
+
+ /* unless user has clicked Don't ask me again, ask about cltool */
+ if ( ([[NSUserDefaults standardUserDefaults] boolForKey:@"CheckCltool"]) &&
+ (![[NSFileManager defaultManager]
+ fileExistsAtPath:@"/usr/bin/unison"]) )
+ [self raiseCltoolWindow:nil];
+}
+
+- (IBAction) checkOpenProfileChanged:(id)sender {
+ [profileBox setEnabled:[checkOpenProfile state]];
+ if ([profileBox isEnabled] && [profileBox indexOfSelectedItem] < 0) {
+ [profileBox selectItemAtIndex:0];
+ [[NSUserDefaults standardUserDefaults] setObject:[profileBox itemObjectValueAtIndex:0] forKey:@"profileToOpen"];
+ }
+}
+
+- (IBAction) chooseFont:(id)sender {
+ [[NSFontPanel sharedFontPanel] makeKeyAndOrderFront:self];
+ [[NSFontManager sharedFontManager] setDelegate:self];
+ fontChangeTarget = sender;
+}
+
+- (void) changeFont:(id)sender {
+ NSFont *newFont = [sender convertFont:[detailsTextView font]];
+ if (fontChangeTarget == chooseDetailsFont)
+ [detailsTextView setFont:newFont];
+ else if (fontChangeTarget == chooseDiffFont)
+ [diffView setFont:newFont];
+ [self updateFontDisplay];
+}
+
+- (void) updateFontDisplay {
+ NSFont *detailsFont = [detailsTextView font];
+ NSFont *diffFont = [diffView font];
+ [detailsFontLabel setStringValue:[NSString stringWithFormat:@"%@ : %d", [detailsFont displayName], (NSInteger) [detailsFont pointSize]]];
+ [diffFontLabel setStringValue:[NSString stringWithFormat:@"%@ : %d", [diffFont displayName], (NSInteger) [diffFont pointSize]]];
+}
+
+- (void)chooseProfiles
+{
+ [mainWindow setContentView:blankView];
+ [self resizeWindowToSize:[chooseProfileView frame].size];
+ [mainWindow setContentMinSize:
+ NSMakeSize(NSWidth([[mainWindow contentView] frame]),150)];
+ [mainWindow setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
+ [mainWindow setContentView:chooseProfileView];
+ [toolbar setView:@"chooseProfileView"];
+ [mainWindow setTitle:@"Unison"];
+
+ // profiles get keyboard input
+ [mainWindow makeFirstResponder:[profileController tableView]];
+ [chooseProfileView display];
+}
+
+- (IBAction)createButton:(id)sender
+{
+ [preferencesController reset];
+ [mainWindow setContentView:blankView];
+ [self resizeWindowToSize:[preferencesView frame].size];
+ [mainWindow setContentMinSize:
+ NSMakeSize(400,NSHeight([[mainWindow contentView] frame]))];
+ [mainWindow setContentMaxSize:
+ NSMakeSize(FLT_MAX,NSHeight([[mainWindow contentView] frame]))];
+ [mainWindow setContentView:preferencesView];
+ [toolbar setView:@"preferencesView"];
+}
+
+- (IBAction)saveProfileButton:(id)sender
+{
+ if ([preferencesController validatePrefs]) {
+ // so the list contains the new profile
+ [profileController initProfiles];
+ [self chooseProfiles];
+ }
+}
+
+- (IBAction)cancelProfileButton:(id)sender
+{
+ [self chooseProfiles];
+}
+
+/* Only valid once a profile has been selected */
+- (NSString *)profile {
+ return myProfile;
+}
+
+- (void)profileSelected:(NSString *)aProfile
+{
+ [aProfile retain];
+ [myProfile release];
+ myProfile = aProfile;
+ [mainWindow setTitle: [NSString stringWithFormat:@"Unison: %@", myProfile]];
+}
+
+- (IBAction)showPreferences:(id)sender {
+ [profileBox removeAllItems];
+ [profileBox addItemsWithObjectValues:[profileController getProfiles]];
+ NSUInteger index = [[profileController getProfiles] indexOfObject:
+ [[NSUserDefaults standardUserDefaults]
+ stringForKey:@"profileToOpen"]];
+ if (index == NSNotFound) {
+ [checkOpenProfile setState:NSOffState];
+ [profileBox setStringValue:@""];
+ } else
+ [profileBox selectItemAtIndex:index];
+
+ [profileBox setEnabled:[checkOpenProfile state]];
+ if ([profileBox isEnabled] && [profileBox indexOfSelectedItem] < 0)
+ [profileBox selectItemAtIndex:0];
+
+ [self updateFontDisplay];
+
+ [self raiseWindow:preferencesWindow];
+}
+
+- (IBAction)restartButton:(id)sender
+{
+ [tableView setEditable:NO];
+ [self chooseProfiles];
+}
+
+- (IBAction)rescan:(id)sender
+{
+ /* There is a delay between turning off the button and it
+ actually being disabled. Make sure we don't respond. */
+ if ([self validateItem:@selector(rescan:)]) {
+ waitingForPassword = NO;
+ [self afterOpen];
+ }
+}
+
+- (IBAction)openButton:(id)sender
+{
+ NSString *profile = [profileController selected];
+ [self profileSelected:profile];
+ [self connect:profile];
+ return;
+}
+
+- (void)updateToolbar
+{
+ [toolbar validateVisibleItems];
+ [tableModeSelector setEnabled:((syncable && !duringSync) || afterSync)];
+
+ // Why?
+ [updatesView setNeedsDisplay:YES];
+}
+
+- (void)updateTableViewWithReset:(BOOL)shouldResetSelection
+{
+ [tableView reloadData];
+ if (shouldResetSelection) {
+ [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
+ shouldResetSelection = NO;
+ }
+ [updatesView setNeedsDisplay:YES];
+}
+
+- (void)updateProgressBar:(NSNumber *)newProgress
+{
+ // NSLog(@"Updating progress bar: %i - %i", (int)[newProgress doubleValue], (int)[progressBar doubleValue]);
+ [progressBar incrementBy:([newProgress doubleValue] - [progressBar doubleValue])];
+}
+
+- (void)updateTableViewSelection
+{
+ int n = [tableView numberOfSelectedRows];
+ if (n == 1) [self displayDetails:[tableView itemAtRow:[tableView selectedRow]]];
+ else [self clearDetails];
+}
+
+- (void)outlineViewSelectionDidChange:(NSNotification *)note
+{
+ [self updateTableViewSelection];
+}
+
+- (void)connect:(NSString *)profileName
+{
+ // contact server, propagate prefs
+ NSLog(@"Connecting to %@...", profileName);
+
+ // Switch to ConnectingView
+ [mainWindow setContentView:blankView];
+ [self resizeWindowToSize:[updatesView frame].size];
+ [mainWindow setContentMinSize:NSMakeSize(150,150)];
+ [mainWindow setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
+ [mainWindow setContentView:ConnectingView];
+ [toolbar setView:@"connectingView"];
+
+ // Update (almost) immediately
+ [ConnectingView display];
+ [connectingAnimation startAnimation:self];
+
+ syncable = NO;
+ afterSync = NO;
+
+ [self updateToolbar];
+
+ // will spawn thread on OCaml side and callback when complete
+ (void)ocamlCall("xS", "unisonInit1", profileName);
+}
+
+CAMLprim value unisonInit1Complete(value v)
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ if (v == Val_unit) {
+ NSLog(@"Connected.");
+ [me->connectingAnimation stopAnimation:me];
+ [me->preconn release];
+ me->preconn = NULL;
+ [me performSelectorOnMainThread:@selector(afterOpen:) withObject:nil waitUntilDone:FALSE];
+ } else {
+ // prompting required
+ me->preconn = [[OCamlValue alloc] initWithValue:Field(v,0)]; // value of Some
+ [me performSelectorOnMainThread:@selector(unisonInit1Complete:) withObject:nil waitUntilDone:FALSE];
+ }
+ [pool release];
+ return Val_unit;
+}
+
+- (void)unisonInit1Complete:(id)ignore
+{
+ @try {
+ OCamlValue *prompt = ocamlCall("@@", "openConnectionPrompt", preconn);
+ if (!prompt) {
+ // turns out, no prompt needed, but must finish opening connection
+ ocamlCall("x@", "openConnectionEnd", preconn);
+ NSLog(@"Connected.");
+ waitingForPassword = NO;
+ [self afterOpen];
+ return;
+ }
+ waitingForPassword = YES;
+
+ [self raisePasswordWindow:[prompt getField:0 withType:'S']];
+ } @catch (NSException *ex) {
+ NSRunAlertPanel(@"Connection Error", [ex description], @"OK", nil, nil);
+ [self chooseProfiles];
+ return;
+ }
+
+ NSLog(@"Connected.");
+}
+
+- (void)raisePasswordWindow:(NSString *)prompt
+{
+ // FIX: some prompts don't ask for password, need to look at it
+ NSLog(@"Got the prompt: '%@'",prompt);
+ if ((long)ocamlCall("iS", "unisonPasswordMsg", prompt)) {
+ [passwordPrompt setStringValue:@"Please enter your password"];
+ [NSApp beginSheet:passwordWindow
+ modalForWindow:mainWindow
+ modalDelegate:nil
+ didEndSelector:nil
+ contextInfo:nil];
+ return;
+ }
+ if ((long)ocamlCall("iS", "unisonPassphraseMsg", prompt)) {
+ [passwordPrompt setStringValue:@"Please enter your passphrase"];
+ [NSApp beginSheet:passwordWindow
+ modalForWindow:mainWindow
+ modalDelegate:nil
+ didEndSelector:nil
+ contextInfo:nil];
+ return;
+ }
+ if ((long)ocamlCall("iS", "unisonAuthenticityMsg", prompt)) {
+ int i = NSRunAlertPanel(@"New host",prompt,@"Yes",@"No",nil);
+ if (i == NSAlertDefaultReturn) {
+ ocamlCall("x at s", "openConnectionReply", preconn, "yes");
+ prompt = ocamlCall("S@", "openConnectionPrompt", preconn);
+ if (!prompt) {
+ // all done with prompts, finish opening connection
+ ocamlCall("x@", "openConnectionEnd", preconn);
+ waitingForPassword = NO;
+ [self afterOpen];
+ return;
+ }
+ else {
+ [self raisePasswordWindow:[NSString
+ stringWithUTF8String:String_val(Field(prompt,0))]];
+ return;
+ }
+ }
+ if (i == NSAlertAlternateReturn) {
+ ocamlCall("x@", "openConnectionCancel", preconn);
+ return;
+ }
+ else {
+ NSLog(@"Unrecognized response '%d' from NSRunAlertPanel",i);
+ ocamlCall("x@", "openConnectionCancel", preconn);
+ return;
+ }
+ }
+ NSLog(@"Unrecognized message from ssh: %@",prompt);
+ ocamlCall("x@", "openConnectionCancel", preconn);
+}
+
+// The password window will invoke this when Enter occurs, b/c we
+// are the delegate.
+- (void)controlTextDidEndEditing:(NSNotification *)notification
+{
+ NSNumber *reason = [[notification userInfo] objectForKey:@"NSTextMovement"];
+ int code = [reason intValue];
+ if (code == NSReturnTextMovement)
+ [self endPasswordWindow:self];
+}
+// Or, the Continue button will invoke this when clicked
+- (IBAction)endPasswordWindow:(id)sender
+{
+ [passwordWindow orderOut:self];
+ [NSApp endSheet:passwordWindow];
+ if ([sender isEqualTo:passwordCancelButton]) {
+ ocamlCall("x@", "openConnectionCancel", preconn);
+ [self chooseProfiles];
+ return;
+ }
+ NSString *password = [passwordText stringValue];
+ ocamlCall("x at S", "openConnectionReply", preconn, password);
+
+ OCamlValue *prompt = ocamlCall("@@", "openConnectionPrompt", preconn);
+ if (!prompt) {
+ // all done with prompts, finish opening connection
+ ocamlCall("x@", "openConnectionEnd", preconn);
+ waitingForPassword = NO;
+ [self afterOpen];
+ }
+ else {
+ [self raisePasswordWindow:[prompt getField:0 withType:'S']];
+ }
+}
+
+- (void)afterOpen:(id)ignore
+{
+ [self afterOpen];
+}
+
+- (void)afterOpen
+{
+ if (waitingForPassword) return;
+ // move to updates window after clearing it
+ [self updateReconItems:nil];
+ [progressBar setDoubleValue:0.0];
+ [progressBar stopAnimation:self];
+ // [self clearDetails];
+ [mainWindow setContentView:blankView];
+ [self resizeWindowToSize:[updatesView frame].size];
+ [mainWindow setContentMinSize:
+ NSMakeSize(NSWidth([[mainWindow contentView] frame]),200)];
+ [mainWindow setContentMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
+ [mainWindow setContentView:updatesView];
+ [toolbar setView:@"updatesView"];
+
+ syncable = NO;
+ afterSync = NO;
+
+ [tableView deselectAll:self];
+ [self updateToolbar];
+ [self updateProgressBar:[NSNumber numberWithDouble:0.0]];
+
+ // this should depend on the number of reconitems, and is now done
+ // in updateReconItems:
+ // reconItems table gets keyboard input
+ //[mainWindow makeFirstResponder:tableView];
+ [tableView scrollRowToVisible:0];
+
+ [preconn release];
+ preconn = nil; // so old preconn can be garbage collected
+ // This will run in another thread spawned in OCaml and will return immediately
+ // We'll get a call back to unisonInit2Complete() when it is complete
+ ocamlCall("x", "unisonInit2");
+}
+
+- (void)doSync
+{
+ [tableView setEditable:NO];
+ syncable = NO;
+ duringSync = YES;
+
+ [self updateToolbar];
+
+ // This will run in another thread spawned in OCaml and will return immediately
+ // We'll get a call back to syncComplete() when it is complete
+ ocamlCall("x", "unisonSynchronize");
+}
+
+- (IBAction)syncButton:(id)sender
+{
+ [self doSync];
+}
+
+
+- (void)afterUpdate:(id)retainedReconItems
+{
+ // NSLog(@"In afterUpdate:...");
+ [self updateReconItems:retainedReconItems];
+ [retainedReconItems release];
+
+ [notificationController updateFinishedFor:[self profile]];
+
+ // label the left and right columns with the roots
+ NSString *leftHost = [(NSString *)ocamlCall("S", "unisonFirstRootString") trim];
+ NSString *rightHost = [(NSString *)ocamlCall("S", "unisonSecondRootString") trim];
+ /*
+ [[[tableView tableColumnWithIdentifier:@"left"] headerCell] setObjectValue:lefthost];
+ [[[tableView tableColumnWithIdentifier:@"right"] headerCell] setObjectValue:rightHost];
+ */
+ [mainWindow setTitle: [NSString stringWithFormat:@"Unison: %@ (%@ <-> %@)",
+ [self profile], leftHost, rightHost]];
+
+ // initial sort
+ [tableView setSortDescriptors:[NSArray arrayWithObjects:
+ [[tableView tableColumnWithIdentifier:@"fileSizeString"] sortDescriptorPrototype],
+ [[tableView tableColumnWithIdentifier:@"path"] sortDescriptorPrototype],
+ nil]];
+
+ [self updateTableViewWithReset:([reconItems count] > 0)];
+ [self updateToolbar];
+ isBatchSet = (long)ocamlCall("i", "isBatchSet") ? YES : NO;
+ if (isBatchSet) {
+ NSLog(@"batch set on the command line");
+ }
+ else {
+ NSLog(@"batch not set on the command line");
+ }
+
+ if (isBatchSet) {
+ [self doSync];
+ }
+}
+
+CAMLprim value unisonInit2Complete(value v)
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ [me performSelectorOnMainThread:@selector(afterUpdate:) withObject:[[OCamlValue alloc] initWithValue:v] waitUntilDone:FALSE];
+ [pool release];
+ return Val_unit;
+}
+
+- (void)afterSync:(id)ignore
+{
+ [notificationController syncFinishedFor:[self profile]];
+ duringSync = NO;
+ afterSync = YES;
+ [self updateToolbar];
+
+ int i;
+ for (i = 0; i < [reconItems count]; i++) {
+ [[reconItems objectAtIndex:i] resetProgress];
+ }
+
+ [self updateTableViewSelection];
+
+ [self updateTableViewWithReset:FALSE];
+}
+
+- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
+{
+ [_timer invalidate];
+
+ switch (returnCode) {
+ case NSAlertAlternateReturn:
+ return;
+ break;
+
+ default:
+ [[NSApplication sharedApplication] performSelector: @selector(terminate:) withObject: nil afterDelay: 0.0];
+ break;
+ }
+}
+
+- (void)updateCountdown
+{
+ if (_secondsRemaining == 0) {
+ [_timer invalidate];
+ [[_timeoutAlert window] orderOut: nil];
+ [self alertDidEnd: _timeoutAlert returnCode: NSAlertDefaultReturn contextInfo: nil];
+ } else {
+ [_timeoutAlert setMessageText: [NSString stringWithFormat: @"Unison will quit in %lu seconds", _secondsRemaining]];
+ _secondsRemaining--;
+ }
+}
+
+
+- (void)quitIfBatch:(id)ignore
+{
+ if (isBatchSet) {
+ NSLog(@"Automatically quitting because of -batch");
+ _timeoutAlert = [NSAlert alertWithMessageText: @"" defaultButton: @"Quit" alternateButton: @"Cancel" otherButton: nil informativeTextWithFormat: @""];
+
+ _secondsRemaining = 10;
+
+ _timer = [NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector(updateCountdown) userInfo: nil repeats: YES];
+
+ [_timeoutAlert beginSheetModalForWindow: mainWindow modalDelegate: self didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:) contextInfo: NULL];
+ }
+}
+
+// TODO: (BCP, 3/2012) Note that the string literal "~/unison.log" here is wrong --
+// this is a user-settable preference (in ubase/trace.ml) and we should ask for its value.
+CAMLprim value syncComplete()
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ [me performSelectorOnMainThread:@selector(afterSync:) withObject:nil waitUntilDone:FALSE];
+ if ([[NSUserDefaults standardUserDefaults] boolForKey:@"deleteLogOnExit"])
+ [[NSFileManager defaultManager] removeItemAtPath:[@"~/unison.log" stringByExpandingTildeInPath] error:nil];
+ [pool release];
+
+ [me performSelectorOnMainThread:@selector(quitIfBatch:) withObject:nil waitUntilDone:FALSE];
+
+ return Val_unit;
+}
+
+// A function called from ocaml
+- (void)reloadTable:(NSNumber *)i
+{
+ // NSLog(@"*** ReloadTable: %i", [i intValue]);
+
+ [[reconItems objectAtIndex:[i intValue]] resetProgress];
+ [self updateTableViewWithReset:FALSE];
+}
+
+CAMLprim value reloadTable(value row)
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ // NSLog(@"OCaml says... ReloadTable: %i", Int_val(row));
+ NSNumber *num = [[NSNumber alloc] initWithInt:Int_val(row)];
+ [me performSelectorOnMainThread:@selector(reloadTable:) withObject:num waitUntilDone:FALSE];
+ [num release];
+ [pool release];
+ return Val_unit;
+}
+
+- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
+ if (item == nil) item = rootItem;
+ return [[item children] count];
+}
+
+- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
+ return [item isKindOfClass:[ParentReconItem class]];
+}
+
+- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item {
+ if (item == nil) item = rootItem;
+ return [[item children] objectAtIndex:index];
+}
+
+- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
+ NSString *identifier = [tableColumn identifier];
+ if (item == nil) item = rootItem;
+
+ if ([identifier isEqualToString:@"percentTransferred"] && (!duringSync && !afterSync)) return nil;
+
+ return [item valueForKey:identifier];
+}
+
+static NSDictionary *_SmallGreyAttributes = nil;
+
+- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item {
+ NSString *identifier = [tableColumn identifier];
+ if ([identifier isEqualToString:@"path"]) {
+ // The file icon
+ [(ImageAndTextCell*)cell setImage:[item fileIcon]];
+
+ // For parents, format the file count into the text
+ long fileCount = [item fileCount];
+ if (fileCount > 1) {
+ NSString *countString = [NSString stringWithFormat:@" (%ld files)", fileCount];
+ NSString *fullString = [(NSString *)[cell objectValue] stringByAppendingString:countString];
+ NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:fullString];
+
+ if (!_SmallGreyAttributes) {
+ NSColor *txtColor = [NSColor grayColor];
+ NSFont *txtFont = [NSFont systemFontOfSize:9.0];
+ _SmallGreyAttributes = [[NSDictionary dictionaryWithObjectsAndKeys:txtFont,
+ NSFontAttributeName, txtColor, NSForegroundColorAttributeName, nil] retain];
+ }
+ [as setAttributes:_SmallGreyAttributes range:NSMakeRange([fullString length] - [countString length], [countString length])];
+ [cell setAttributedStringValue:as];
+ [as release];
+ }
+ } else if ([identifier isEqualToString:@"percentTransferred"]) {
+ [(ProgressCell*)cell setIcon:[item direction]];
+ [(ProgressCell*)cell setStatusString:[item progressString]];
+ [(ProgressCell*)cell setIsActive:[item isKindOfClass:[LeafReconItem class]]];
+ }
+}
+
+- (void)outlineView:(NSOutlineView *)outlineView
+ sortDescriptorsDidChange:(NSArray *)oldDescriptors {
+ NSArray *originalSelection = [outlineView selectedObjects];
+
+ // do we want to catch case of object changes to allow resort in same direction for progress / direction?
+ // Could check if our objects change and if the first item at the head of new and old were the same
+ [rootItem sortUsingDescriptors:[outlineView sortDescriptors]];
+ [outlineView reloadData];
+ [outlineView setSelectedObjects:originalSelection];
+}
+
+// Delegate methods
+
+- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item {
+ return NO;
+}
+
+- (NSMutableArray *)reconItems // used in ReconTableView only
+{
+ return reconItems;
+}
+
+- (int)tableMode
+{
+ return [tableModeSelector selectedSegment];
+}
+
+- (IBAction)tableModeChanged:(id)sender
+{
+ [[NSUserDefaults standardUserDefaults] setInteger:[self tableMode]+1 forKey:@"TableLayout"];
+ [self updateForChangedItems];
+}
+
+- (void)initTableMode
+{
+ int mode = [[NSUserDefaults standardUserDefaults] integerForKey:@"TableLayout"] - 1;
+ if (mode == -1) mode = 1;
+ [tableModeSelector setSelectedSegment:mode];
+}
+
+- (void)updateReconItems:(OCamlValue *)caml_reconItems
+{
+ [reconItems release];
+ reconItems = [[NSMutableArray alloc] init];
+ long i, n =[caml_reconItems count];
+ for (i=0; i<n; i++) {
+ LeafReconItem *item = [[LeafReconItem alloc] initWithRiAndIndex:(id)[caml_reconItems getField:i withType:'@'] index:i];
+ [reconItems addObject:item];
+ [item release];
+ }
+ [self updateForChangedItems];
+}
+
+- (void)expandConflictedParent:(ParentReconItem *)parent
+{
+ if ([parent hasConflictedChildren]) {
+ // NSLog(@"Expanding conflictedParent: %@", [parent fullPath]);
+ [tableView expandItem:parent expandChildren:NO];
+ NSArray *children = [parent children];
+ int i = 0, count = [children count];
+ for (;i < count; i++) {
+ id child = [children objectAtIndex:i];
+ if ([child isKindOfClass:[ParentReconItem class]]) [self expandConflictedParent:child];
+ }
+ }
+}
+
+- (void)updateForChangedItems
+{
+ int tableMode = [self tableMode];
+
+ [rootItem release];
+ ParentReconItem *root = rootItem = [[ParentReconItem alloc] init];
+
+ if (tableMode != 0 && [reconItems count]) {
+ // Special roll-up root item for outline displays
+ root = [[ParentReconItem alloc] init];
+ [rootItem addChild:root nested:NO];
+ [root setPath:@"All Changes..."];
+ [root setFullPath:@""];
+ [root release];
+ }
+
+ int j = 0, n =[reconItems count];
+ for (; j<n; j++) {
+ [root addChild:[reconItems objectAtIndex:j] nested:(tableMode != 0)];
+ }
+
+ if (tableMode == 1) [root collapseParentsWithSingleChildren:YES];
+
+ [tableView reloadData];
+
+ if (NO) {
+ // Pre-expand entire tree
+ int i = [[rootItem children] count];
+ while (i--) {
+ [tableView expandItem:[[rootItem children] objectAtIndex:i] expandChildren:YES];
+ }
+ } else if (tableMode != 0) {
+ // Always open root node
+ [tableView expandItem:rootItem expandChildren:NO];
+
+ // then smart expand to reveal conflicts / changes in direction
+ [self expandConflictedParent:root];
+
+ // then open more levels if we can do so without causing scrolling
+ [tableView expandChildrenIfSpace];
+ }
+
+ // Make sure details get updated (or cleared)
+ [self updateTableViewSelection];
+
+ // Only enable sync if there are reconitems
+ if ([reconItems count]>0) {
+ [tableView setEditable:YES];
+
+ // reconItems table gets keyboard input
+ [mainWindow makeFirstResponder:tableView];
+
+ syncable = YES;
+ }
+ else {
+ [tableView setEditable:NO];
+ afterSync = YES; // rescan should be enabled
+
+ // reconItems table no longer gets keyboard input
+ [mainWindow makeFirstResponder:nil];
+ }
+ [self updateToolbar];
+}
+
+- (id)updateForIgnore:(id)item
+{
+ long j = (long)ocamlCall("ii", "unisonUpdateForIgnore", [reconItems indexOfObjectIdenticalTo:item]);
+ NSLog(@"Updating for ignore...");
+ [self updateReconItems:(OCamlValue *)ocamlCall("@", "unisonState")];
+ return [reconItems objectAtIndex:j];
+}
+
+// A function called from ocaml
+CAMLprim value displayStatus(value s)
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ NSString *str = [[NSString alloc] initWithUTF8String:String_val(s)];
+ // NSLog(@"displayStatus: %@", str);
+ [me performSelectorOnMainThread:@selector(statusTextSet:) withObject:str waitUntilDone:FALSE];
+ [str release];
+ [pool release];
+ return Val_unit;
+}
+
+- (void)statusTextSet:(NSString *)s {
+ /* filter out strings with # reconitems, and empty strings */
+ if (!NSEqualRanges([s rangeOfString:@"reconitems"],
+ NSMakeRange(NSNotFound,0))) return;
+ [statusText setStringValue:s];
+}
+
+// Called from ocaml to dislpay progress bar
+CAMLprim value displayGlobalProgress(value p)
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ NSNumber *num = [[NSNumber alloc] initWithDouble:Double_val(p)];
+ [me performSelectorOnMainThread:@selector(updateProgressBar:)
+ withObject:num waitUntilDone:FALSE];
+ [num release];
+ [pool release];
+ return Val_unit;
+}
+
+// Called from ocaml to display diff
+CAMLprim value displayDiff(value s, value s2)
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ [me performSelectorOnMainThread:@selector(diffViewTextSet:)
+ withObject:[NSArray arrayWithObjects:[NSString stringWithUTF8String:String_val(s)],
+ [NSString stringWithUTF8String:String_val(s2)], nil]
+ waitUntilDone:FALSE];
+ [pool release];
+ return Val_unit;
+}
+
+// Called from ocaml to display diff error messages
+CAMLprim value displayDiffErr(value s)
+{
+ id pool = [[NSAutoreleasePool alloc] init];
+ NSString * str = [NSString stringWithUTF8String:String_val(s)];
+ str = [[str componentsSeparatedByString:@"\n"] componentsJoinedByString:@" "];
+ [me->statusText performSelectorOnMainThread:@selector(setStringValue:)
+ withObject:str waitUntilDone:FALSE];
+ [pool release];
+ return Val_unit;
+}
+
+- (void)diffViewTextSet:(NSArray *)args
+{
+ [self diffViewTextSet:[args objectAtIndex:0] bodyText:[args objectAtIndex:1]];
+}
+
+- (void)diffViewTextSet:(NSString *)title bodyText:(NSString *)body {
+ if ([body length]==0) return;
+ [diffWindow setTitle:title];
+ //[diffView setFont:diffFont];
+ [diffView setString:body];
+ if (!doneFirstDiff) {
+ /* On first open, position the diff window to the right of
+ the main window, but without going off the mainwindow's screen */
+ float screenOriginX = [[mainWindow screen] visibleFrame].origin.x;
+ float screenWidth = [[mainWindow screen] visibleFrame].size.width;
+ float mainOriginX = [mainWindow frame].origin.x;
+ float mainOriginY = [mainWindow frame].origin.y;
+ float mainWidth = [mainWindow frame].size.width;
+ float mainHeight = [mainWindow frame].size.height;
+ float diffWidth = [diffWindow frame].size.width;
+
+ float diffX = mainOriginX+mainWidth;
+ float maxX = screenOriginX+screenWidth-diffWidth;
+ if (diffX > maxX) diffX = maxX;
+ float diffY = mainOriginY + mainHeight;
+
+ NSPoint diffOrigin = NSMakePoint(diffX,diffY);
+ [diffWindow cascadeTopLeftFromPoint:diffOrigin];
+
+ doneFirstDiff = YES;
+ }
+ [diffWindow orderFront:nil];
+}
+
+- (void)displayDetails:(ReconItem *)item
+{
+ //[detailsTextView setFont:diffFont];
+ NSString *text = [item details];
+ if (!text) text = @"";
+ [detailsTextView setStringValue:text];
+}
+
+- (void)clearDetails
+{
+ [detailsTextView setStringValue:@""];
+}
+
+- (IBAction)raiseCltoolWindow:(id)sender
+{
+ [cltoolPref setState:[[NSUserDefaults standardUserDefaults] boolForKey:@"CheckCltool"] ? NSOffState : NSOnState];
+ [self raiseWindow: cltoolWindow];
+}
+
+- (IBAction)cltoolYesButton:(id)sender;
+{
+ [[NSUserDefaults standardUserDefaults] setBool:([cltoolPref state] != NSOnState) forKey:@"CheckCltool"];
+ [self installCommandLineTool:self];
+ [cltoolWindow close];
+}
+
+- (IBAction)cltoolNoButton:(id)sender;
+{
+ [[NSUserDefaults standardUserDefaults] setBool:([cltoolPref state] != NSOnState) forKey:@"CheckCltool"];
+ [cltoolWindow close];
+}
+
+- (IBAction)raiseAboutWindow:(id)sender
+{
+ [self raiseWindow: aboutWindow];
+}
+
+- (void)raiseWindow:(NSWindow *)theWindow
+{
+ NSRect screenFrame = [[mainWindow screen] visibleFrame];
+ NSRect mainWindowFrame = [mainWindow frame];
+ NSRect theWindowFrame = [theWindow frame];
+
+ float winX = mainWindowFrame.origin.x +
+ (mainWindowFrame.size.width - theWindowFrame.size.width)/2;
+ float winY = mainWindowFrame.origin.y +
+ (mainWindowFrame.size.height + theWindowFrame.size.height)/2;
+
+ if (winX<screenFrame.origin.x) winX=screenFrame.origin.x;
+ float maxX = screenFrame.origin.x+screenFrame.size.width-
+ theWindowFrame.size.width;
+ if (winX>maxX) winX=maxX;
+ float minY = screenFrame.origin.y+theWindowFrame.size.height;
+ if (winY<minY) winY=minY;
+ float maxY = screenFrame.origin.y+screenFrame.size.height;
+ if (winY>maxY) winY=maxY;
+
+ [theWindow cascadeTopLeftFromPoint:
+ NSMakePoint(winX,winY)];
+
+ [theWindow makeKeyAndOrderFront:nil];
+}
+
+- (IBAction)onlineHelp:(id)sender
+{
+ [[NSWorkspace sharedWorkspace]
+ openURL:[NSURL URLWithString:@"http://www.cis.upenn.edu/~bcpierce/unison/docs.html"]];
+}
+
+/* from http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/index.html */
+#include <Security/Authorization.h>
+#include <Security/AuthorizationTags.h>
+- (IBAction)installCommandLineTool:(id)sender
+{
+ /* Install the command-line tool in /usr/bin/unison.
+ Requires root privilege, so we ask for it and
+ pass the task off to /bin/sh. */
+
+ OSStatus myStatus;
+
+ AuthorizationFlags myFlags = kAuthorizationFlagDefaults;
+ AuthorizationRef myAuthorizationRef;
+ myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,
+ myFlags, &myAuthorizationRef);
+ if (myStatus != errAuthorizationSuccess) return;
+
+ {
+ AuthorizationItem myItems = {kAuthorizationRightExecute, 0,
+ NULL, 0};
+ AuthorizationRights myRights = {1, &myItems};
+ myFlags = kAuthorizationFlagDefaults |
+ kAuthorizationFlagInteractionAllowed |
+ kAuthorizationFlagPreAuthorize |
+ kAuthorizationFlagExtendRights;
+ myStatus =
+ AuthorizationCopyRights(myAuthorizationRef,&myRights,NULL,myFlags,NULL);
+ }
+ if (myStatus == errAuthorizationSuccess) {
+ NSBundle *bundle = [NSBundle mainBundle];
+ NSString *bundle_path = [bundle bundlePath];
+ NSString *exec_path =
+ [bundle_path stringByAppendingString:@"/Contents/MacOS/cltool"];
+ // Not sure why but this doesn't work:
+ // [bundle pathForResource:@"cltool" ofType:nil];
+
+ if (exec_path == nil) return;
+ char *args[] = { "-f", (char *)[exec_path UTF8String],
+ "/usr/bin/unison", NULL };
+
+ myFlags = kAuthorizationFlagDefaults;
+ myStatus = AuthorizationExecuteWithPrivileges
+ (myAuthorizationRef, "/bin/cp", myFlags, args,
+ NULL);
+ }
+ AuthorizationFree (myAuthorizationRef, kAuthorizationFlagDefaults);
+
+ /*
+ if (myStatus == errAuthorizationCanceled)
+ NSLog(@"The attempt was canceled\n");
+ else if (myStatus)
+ NSLog(@"There was an authorization error: %ld\n", myStatus);
+ */
+}
+
+- (BOOL)validateItem:(SEL) action
+{
+ if (action == @selector(syncButton:)) return syncable;
+ // FIXME Restarting during sync is disabled because it causes UI corruption
+ else if (action == @selector(restartButton:)) return !duringSync;
+ else if (action == @selector(rescan:)) return ((syncable && !duringSync) || afterSync);
+ else return YES;
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
+{
+ return [self validateItem:[menuItem action]];
+}
+
+- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
+{
+ return [self validateItem:[toolbarItem action]];
+}
+
+- (void)resizeWindowToSize:(NSSize)newSize
+{
+ NSRect aFrame;
+
+ float newHeight = newSize.height+[self toolbarHeightForWindow:mainWindow];
+ float newWidth = newSize.width;
+
+ aFrame = [NSWindow contentRectForFrameRect:[mainWindow frame]
+ styleMask:[mainWindow styleMask]];
+
+ aFrame.origin.y += aFrame.size.height;
+ aFrame.origin.y -= newHeight;
+ aFrame.size.height = newHeight;
+ aFrame.size.width = newWidth;
+
+ aFrame = [NSWindow frameRectForContentRect:aFrame
+ styleMask:[mainWindow styleMask]];
+
+ [mainWindow setFrame:aFrame display:YES animate:YES];
+}
+
+- (float)toolbarHeightForWindow:(NSWindow *)window
+{
+ NSToolbar *aToolbar;
+ float toolbarHeight = 0.0;
+ NSRect windowFrame;
+
+ aToolbar = [window toolbar];
+ if(aToolbar && [aToolbar isVisible])
+ {
+ windowFrame = [NSWindow contentRectForFrameRect:[window frame]
+ styleMask:[window styleMask]];
+ toolbarHeight = NSHeight(windowFrame)
+ - NSHeight([[window contentView] frame]);
+ }
+ return toolbarHeight;
+}
+
+CAMLprim value fatalError(value s)
+{
+ NSString *str = [[NSString alloc] initWithUTF8String:String_val(s)];
+
+ [me performSelectorOnMainThread:@selector(fatalError:) withObject:str waitUntilDone:FALSE];
+ [str release];
+ return Val_unit;
+}
+
+- (void)fatalError:(NSString *)msg {
+ NSRunAlertPanel(@"Fatal error", msg, @"Exit", nil, nil);
+ exit(1);
+}
+
+/* Returns true if we need to exit, false if we proceed */
+
+CAMLprim value warnPanel(value s)
+{
+ NSString *str = [[NSString alloc] initWithUTF8String:String_val(s)];
+
+ [me performSelectorOnMainThread:@selector(warnPanel:) withObject:str waitUntilDone:TRUE];
+ [str release];
+ if (me -> shouldExitAfterWarning) {
+ return Val_true;
+ } else {
+ return Val_false;
+ }
+}
+
+- (void)warnPanel:(NSString *)msg {
+ int warnVal = NSRunAlertPanel(@"Warning", msg, @"Proceed", @"Exit", nil);
+ NSLog(@"Warning Panel Returned %d",warnVal);
+ if (warnVal == NSAlertAlternateReturn) {
+ shouldExitAfterWarning = YES;
+ } else {
+ shouldExitAfterWarning = FALSE;
+ }
+}
+
+ at end
+
+ at implementation NSString (_UnisonUtil)
+- (NSString *)trim
+{
+ NSCharacterSet *ws = [NSCharacterSet whitespaceCharacterSet];
+ int len = [self length], i = len;
+ while (i && [ws characterIsMember:[self characterAtIndex:i-1]]) i--;
+ return (i == len) ? self : [self substringToIndex:i];
+}
+ at end
Added: trunk/src/uimac14/NotificationController.h
===================================================================
--- trunk/src/uimac14/NotificationController.h (rev 0)
+++ trunk/src/uimac14/NotificationController.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,23 @@
+//
+// NotificationController.h
+// uimac
+//
+// Created by Alan Schmitt on 02/02/06.
+// Copyright 2006, see file COPYING for details. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <Growl/Growl.h>
+
+ at interface NotificationController : NSObject <GrowlApplicationBridgeDelegate>
+{
+}
+
+- (void)updateFinishedFor: (NSString *)profile;
+- (void)syncFinishedFor: (NSString *)profile;
+
+/* Implement the GrowlApplicationBridgeDelegate protocol */
+- (NSDictionary *)registrationDictionaryForGrowl;
+- (NSString *)applicationNameForGrowl;
+
+ at end
Added: trunk/src/uimac14/NotificationController.m
===================================================================
--- trunk/src/uimac14/NotificationController.m (rev 0)
+++ trunk/src/uimac14/NotificationController.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,65 @@
+//
+// NotificationController.m
+// uimac
+//
+// Created by Alan Schmitt on 02/02/06.
+// Copyright 2006, see file COPYING for details. All rights reserved.
+//
+
+#import "NotificationController.h"
+
+#define NOTIFY_UPDATE @"Scan finished"
+#define NOTIFY_SYNC @"Synchronization finished"
+
+/* Show a simple notification */
+static void simpleNotify(NSString *name, NSString *descFmt, NSString *profile);
+
+ at implementation NotificationController
+
+- (void)awakeFromNib
+{
+ [GrowlApplicationBridge setGrowlDelegate:self];
+}
+
+- (void)updateFinishedFor: (NSString *)profile
+{
+ simpleNotify(NOTIFY_UPDATE,
+ @"Profile '%@' is finished scanning for updates",
+ profile);
+}
+
+- (void)syncFinishedFor: (NSString *)profile {
+ simpleNotify(NOTIFY_SYNC,
+ @"Profile '%@' is finished synchronizing",
+ profile);
+}
+
+- (NSDictionary *)registrationDictionaryForGrowl
+{
+ NSArray* notifications = [NSArray arrayWithObjects:
+ NOTIFY_UPDATE,
+ NOTIFY_SYNC,
+ nil];
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ notifications, GROWL_NOTIFICATIONS_ALL,
+ notifications, GROWL_NOTIFICATIONS_DEFAULT,
+ nil];
+}
+
+- (NSString *)applicationNameForGrowl
+{
+ return @"Unison";
+}
+
+ at end
+
+static void simpleNotify(NSString *name, NSString *descFmt, NSString *profile)
+{
+ [GrowlApplicationBridge notifyWithTitle:name
+ description:[NSString stringWithFormat:descFmt, profile]
+ notificationName:name
+ iconData:nil
+ priority:0
+ isSticky:false
+ clickContext:nil];
+}
\ No newline at end of file
Added: trunk/src/uimac14/PreferencesController.h
===================================================================
--- trunk/src/uimac14/PreferencesController.h (rev 0)
+++ trunk/src/uimac14/PreferencesController.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,20 @@
+/* PreferencesController */
+
+#import <Cocoa/Cocoa.h>
+
+ at interface PreferencesController : NSObject
+{
+ IBOutlet NSTextField *firstRootText;
+ IBOutlet NSButtonCell *localButtonCell;
+ IBOutlet NSTextField *profileNameText;
+ IBOutlet NSButtonCell *remoteButtonCell;
+ IBOutlet NSTextField *secondRootHost;
+ IBOutlet NSTextField *secondRootText;
+ IBOutlet NSTextField *secondRootUser;
+}
+- (IBAction)anyEnter:(id)sender;
+- (IBAction)localClick:(id)sender;
+- (IBAction)remoteClick:(id)sender;
+- (BOOL)validatePrefs;
+- (void)reset;
+ at end
Added: trunk/src/uimac14/PreferencesController.m
===================================================================
--- trunk/src/uimac14/PreferencesController.m (rev 0)
+++ trunk/src/uimac14/PreferencesController.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,89 @@
+#import "PreferencesController.h"
+#import "Bridge.h"
+
+ at implementation PreferencesController
+
+- (void)reset
+{
+ [profileNameText setStringValue:@""];
+ [firstRootText setStringValue:@""];
+ [secondRootUser setStringValue:@""];
+ [secondRootHost setStringValue:@""];
+ [secondRootText setStringValue:@""];
+ [remoteButtonCell setState:NSOnState];
+ [localButtonCell setState:NSOffState];
+ [secondRootUser setSelectable:YES];
+ [secondRootUser setEditable:YES];
+ [secondRootHost setSelectable:YES];
+ [secondRootHost setEditable:YES];
+}
+
+- (BOOL)validatePrefs
+{
+ NSString *profileName = [profileNameText stringValue];
+ if (profileName == nil | [profileName isEqualTo:@""]) {
+ // FIX: should check for already existing names too
+ NSRunAlertPanel(@"Error",@"You must enter a profile name",@"OK",nil,nil);
+ return NO;
+ }
+ NSString *firstRoot = [firstRootText stringValue];
+ if (firstRoot == nil | [firstRoot isEqualTo:@""]) {
+ NSRunAlertPanel(@"Error",@"You must enter a first root",@"OK",nil,nil);
+ return NO;
+ }
+ NSString *secondRoot;
+ if ([remoteButtonCell state] == NSOnState) {
+ NSString *user = [secondRootUser stringValue];
+ if (user == nil | [user isEqualTo:@""]) {
+ NSRunAlertPanel(@"Error",@"You must enter a user",@"OK",nil,nil);
+ return NO;
+ }
+ NSString *host = [secondRootHost stringValue];
+ if (host == nil | [host isEqualTo:@""]) {
+ NSRunAlertPanel(@"Error",@"You must enter a host",@"OK",nil,nil);
+ return NO;
+ }
+ NSString *file = [secondRootText stringValue];
+ // OK for empty file, e.g., ssh://foo@bar/
+ secondRoot = [NSString stringWithFormat:@"ssh://%@@%@/%@",user,host,file];
+ }
+ else {
+ secondRoot = [secondRootText stringValue];
+ if (secondRoot == nil | [secondRoot isEqualTo:@""]) {
+ NSRunAlertPanel(@"Error",@"You must enter a second root file",@"OK",nil,nil);
+ return NO;
+ }
+ }
+ ocamlCall("xSSS", "unisonProfileInit", profileName, firstRoot, secondRoot);
+ return YES;
+}
+
+/* The target when enter is pressed in any of the text fields */
+// FIX: this is broken, it takes tab, mouse clicks, etc.
+- (IBAction)anyEnter:(id)sender
+{
+ NSLog(@"enter");
+ [self validatePrefs];
+}
+
+- (IBAction)localClick:(id)sender
+{
+ NSLog(@"local");
+ [secondRootUser setStringValue:@""];
+ [secondRootHost setStringValue:@""];
+ [secondRootUser setSelectable:NO];
+ [secondRootUser setEditable:NO];
+ [secondRootHost setSelectable:NO];
+ [secondRootHost setEditable:NO];
+}
+
+- (IBAction)remoteClick:(id)sender
+{
+ NSLog(@"remote");
+ [secondRootUser setSelectable:YES];
+ [secondRootUser setEditable:YES];
+ [secondRootHost setSelectable:YES];
+ [secondRootHost setEditable:YES];
+}
+
+ at end
Added: trunk/src/uimac14/ProfileController.h
===================================================================
--- trunk/src/uimac14/ProfileController.h (rev 0)
+++ trunk/src/uimac14/ProfileController.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,20 @@
+/* ProfileController */
+/* Copyright (c) 2003, see file COPYING for details. */
+
+#import <Cocoa/Cocoa.h>
+
+ at interface ProfileController : NSObject
+{
+ IBOutlet NSTableView *tableView;
+ NSMutableArray *profiles;
+ int defaultIndex; // -1 if no default, else the index in profiles of @"default"
+}
+- (void)initProfiles;
+- (int)numberOfRowsInTableView:(NSTableView *)aTableView;
+- (id)tableView:(NSTableView *)aTableView
+ objectValueForTableColumn:(NSTableColumn *)aTableColumn
+ row:(int)rowIndex;
+- (NSString *)selected;
+- (NSTableView *)tableView; // allows MyController to set up firstResponder
+- (NSMutableArray*) getProfiles;
+ at end
Added: trunk/src/uimac14/ProfileController.m
===================================================================
--- trunk/src/uimac14/ProfileController.m (rev 0)
+++ trunk/src/uimac14/ProfileController.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,84 @@
+/* Copyright (c) 2003, see file COPYING for details. */
+
+#import "ProfileController.h"
+#import "Bridge.h"
+
+ at implementation ProfileController
+
+NSString *unisonDirectory()
+{
+ return (NSString *)ocamlCall("S", "unisonDirectory");
+}
+
+- (void)initProfiles
+{
+ NSString *directory = unisonDirectory();
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+ NSArray *files = [[NSFileManager defaultManager] directoryContentsAtPath:directory];
+#else
+ NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
+#endif
+ unsigned int count = [files count];
+ unsigned int i,j;
+
+ [profiles release];
+ profiles = [[NSMutableArray alloc] init];
+ defaultIndex = -1;
+
+ for (i = j = 0; i < count; i++) {
+ NSString *file = [files objectAtIndex:i];
+ if ([[file pathExtension] isEqualTo:@"prf"]) {
+ NSString *withoutExtension = [file stringByDeletingPathExtension];
+ [profiles insertObject:withoutExtension atIndex:j];
+ if ([@"default" isEqualTo:withoutExtension]) defaultIndex = j;
+ j++;
+ }
+ }
+ if (j > 0)
+ [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO];
+}
+
+- (void)awakeFromNib
+{
+ // start with the default profile selected
+ [self initProfiles];
+ if (defaultIndex >= 0)
+ [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:defaultIndex] byExtendingSelection:NO];
+ // on awake the scroll bar is inactive, but after adding profiles we might need it;
+ // reloadData makes it happen. Q: is setNeedsDisplay more efficient?
+ [tableView reloadData];
+}
+
+- (int)numberOfRowsInTableView:(NSTableView *)aTableView
+{
+ if (!profiles) return 0;
+ else return [profiles count];
+}
+
+- (id)tableView:(NSTableView *)aTableView
+ objectValueForTableColumn:(NSTableColumn *)aTableColumn
+ row:(int)rowIndex
+{
+ if (rowIndex >= 0 && rowIndex < [profiles count])
+ return [profiles objectAtIndex:rowIndex];
+ else return @"[internal error!]";
+}
+
+- (NSString *)selected
+{
+ int rowIndex = [tableView selectedRow];
+ if (rowIndex >= 0 && rowIndex < [profiles count])
+ return [profiles objectAtIndex:rowIndex];
+ else return @"[internal error!]";
+}
+
+- (NSTableView *)tableView
+{
+ return tableView;
+}
+
+- (NSMutableArray*)getProfiles {
+ return profiles;
+}
+
+ at end
Added: trunk/src/uimac14/ProfileTableView.h
===================================================================
--- trunk/src/uimac14/ProfileTableView.h (rev 0)
+++ trunk/src/uimac14/ProfileTableView.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,11 @@
+/* ProfileTableView */
+
+#import <Cocoa/Cocoa.h>
+
+ at class MyController;
+
+ at interface ProfileTableView : NSTableView
+{
+ IBOutlet MyController *myController;
+}
+ at end
Added: trunk/src/uimac14/ProfileTableView.m
===================================================================
--- trunk/src/uimac14/ProfileTableView.m (rev 0)
+++ trunk/src/uimac14/ProfileTableView.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,36 @@
+#import "MyController.h"
+#import "ProfileTableView.h"
+
+ at implementation ProfileTableView
+
+- (void)keyDown:(NSEvent *)event
+{
+ /* some keys return zero-length strings */
+ if ([[event characters] length] == 0) {
+ [super keyDown:event];
+ return;
+ }
+
+ unichar c = [[event characters] characterAtIndex:0];
+ switch (c) {
+ case '\r':
+ [myController openButton:self];
+ break;
+ default:
+ [super keyDown:event];
+ break;
+ }
+}
+
+/* Override default highlight colour to match ReconTableView */
+- (id)_highlightColorForCell:(NSCell *)cell
+{
+ if(([[self window] firstResponder] == self) &&
+ [[self window] isMainWindow] &&
+ [[self window] isKeyWindow])
+
+ return [NSColor colorWithCalibratedRed:0.7 green:0.75 blue:0.8 alpha:1.0];
+ else return [NSColor colorWithCalibratedRed:0.8 green:0.8 blue:0.8 alpha:1.0];
+}
+
+ at end
Added: trunk/src/uimac14/ProgressCell.h
===================================================================
--- trunk/src/uimac14/ProgressCell.h (rev 0)
+++ trunk/src/uimac14/ProgressCell.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,15 @@
+#import <Cocoa/Cocoa.h>
+
+ at interface ProgressCell : NSCell
+{
+ float _minVal, _maxVal; // defaults to 0.0, 100.0
+ BOOL _isActive;
+ BOOL _useFullView; // default: NO
+ BOOL _isError; // default: NO
+ NSImage *_icon;
+ NSString *_statusString;
+}
+- (void)setStatusString:(NSString *)string;
+- (void)setIcon:(NSImage *)image;
+- (void)setIsActive:(BOOL)yn;
+ at end
Added: trunk/src/uimac14/ProgressCell.m
===================================================================
--- trunk/src/uimac14/ProgressCell.m (rev 0)
+++ trunk/src/uimac14/ProgressCell.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,199 @@
+/******************************************************************************
+ * Copyright 2008, 2014 (see file COPYING for more information)
+ *
+ * Loosely based on TorrentCell from Transmission (.png files are from
+ * the original).
+ *****************************************************************************/
+
+#import "ProgressCell.h"
+
+#define BAR_HEIGHT 12.0
+
+static NSImage *_ProgressWhite, *_ProgressBlue, *_ProgressGray, *_ProgressGreen,
+ *_ProgressAdvanced, *_ProgressEndWhite, *_ProgressEndBlue,
+ *_ProgressEndGray, *_ProgressEndGreen, *_ProgressLightGreen,
+ *_ProgressEndAdvanced, * _ErrorImage;
+static NSSize ZeroSize;
+
+ at implementation ProgressCell
+
++ (void) initialize
+{
+ NSSize startSize = NSMakeSize(100.0, BAR_HEIGHT);
+ ZeroSize = NSMakeSize(0.0, 0.0);
+
+ _ProgressWhite = [NSImage imageNamed: @"ProgressBarWhite.png"];
+ [_ProgressWhite setScalesWhenResized: YES];
+
+ _ProgressBlue = [NSImage imageNamed: @"ProgressBarBlue.png"];
+ [_ProgressBlue setScalesWhenResized: YES];
+ [_ProgressBlue setSize: startSize];
+
+ _ProgressGray = [NSImage imageNamed: @"ProgressBarGray.png"];
+ [_ProgressGray setScalesWhenResized: YES];
+ [_ProgressGray setSize: startSize];
+
+ _ProgressGreen = [NSImage imageNamed: @"ProgressBarGreen.png"];
+ [_ProgressGreen setScalesWhenResized: YES];
+
+ _ProgressLightGreen = [NSImage imageNamed: @"ProgressBarLightGreen.png"];
+ [_ProgressLightGreen setScalesWhenResized: YES];
+
+ _ProgressAdvanced = [NSImage imageNamed: @"ProgressBarAdvanced.png"];
+ [_ProgressAdvanced setScalesWhenResized: YES];
+
+ _ProgressEndWhite = [NSImage imageNamed: @"ProgressBarEndWhite.png"];
+ _ProgressEndBlue = [NSImage imageNamed: @"ProgressBarEndBlue.png"];
+ _ProgressEndGray = [NSImage imageNamed: @"ProgressBarEndGray.png"];
+ _ProgressEndGreen = [NSImage imageNamed: @"ProgressBarEndGreen.png"];
+ _ProgressEndAdvanced = [NSImage imageNamed: @"ProgressBarEndAdvanced.png"];
+
+ _ErrorImage = [[NSImage imageNamed: @"Error.tiff"] copy];
+ [_ErrorImage setFlipped: YES];
+}
+
+- (id)init
+{
+ self = [super init];
+ _minVal = 0.0;
+ _maxVal = 100.0;
+ _isActive = YES;
+ _statusString = @"";
+
+ return self;
+}
+
+ - (void)dealloc
+ {
+ [_icon release];
+ [_statusString release];
+ [super dealloc];
+ }
+
+- (void)setStatusString:(NSString *)string
+{
+ _statusString = [string retain];
+}
+
+- (void)setIcon:(NSImage *)image
+{
+ _icon = [image retain];
+}
+
+- (void)setIsActive:(BOOL)yn
+{
+ _isActive = yn;
+}
+
+- (void)drawBarImage:(NSImage *)barImage width:(float)width point:(NSPoint)point
+{
+ if (width <= 0.0)
+ return;
+
+ if ([barImage size].width < width)
+ [barImage setSize: NSMakeSize(width * 2.0, BAR_HEIGHT)];
+
+ [barImage compositeToPoint: point fromRect: NSMakeRect(0, 0, width, BAR_HEIGHT) operation: NSCompositeSourceOver];
+}
+
+- (void)drawBar:(float)width point:(NSPoint)point
+{
+ id objectValue = [self objectValue];
+ if (!objectValue) return;
+
+ float value = [objectValue floatValue];
+ float progress = (value - _minVal)/ (_maxVal - _minVal);
+
+ width -= 2.0;
+ float completedWidth, remainingWidth = 0.0;
+
+ //bar images and widths
+ NSImage * barLeftEnd, * barRightEnd, * barComplete, * barRemaining;
+ if (progress >= 1.0) {
+ completedWidth = width;
+ barLeftEnd = _ProgressEndGreen;
+ barRightEnd = _ProgressEndGreen;
+ barComplete = _ProgressGreen;
+ barRemaining = _ProgressLightGreen;
+ }
+ else {
+ completedWidth = progress * width;
+ remainingWidth = width - completedWidth;
+ barLeftEnd = (remainingWidth == width) ? _ProgressEndWhite
+ : ((_isActive) ? _ProgressEndBlue : _ProgressEndGray);
+ barRightEnd = (completedWidth < width) ? _ProgressEndWhite
+ : ((_isActive) ? _ProgressEndBlue : _ProgressEndGray);
+ barComplete = _isActive ? _ProgressBlue : _ProgressGray;
+ barRemaining = _ProgressWhite;
+ }
+
+ [barLeftEnd compositeToPoint: point operation: NSCompositeSourceOver];
+
+ point.x += 1.0;
+ [self drawBarImage: barComplete width: completedWidth point: point];
+
+ point.x += completedWidth;
+ [self drawBarImage: barRemaining width: remainingWidth point: point];
+
+ point.x += remainingWidth;
+ [barRightEnd compositeToPoint: point operation: NSCompositeSourceOver];
+}
+
+- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)view
+{
+ NSPoint pen = cellFrame.origin;
+ const float PADDING = 3.0;
+
+ // progress bar
+ pen.y += PADDING + BAR_HEIGHT;
+ float mainWidth = cellFrame.size.width;
+ float barWidth = mainWidth;
+ [self drawBar: barWidth point: pen];
+
+ //icon
+ NSImage * image = _isError ? _ErrorImage : _icon;
+ if (image) {
+ NSSize imageSize = [image size];
+ NSRect imageFrame;
+ imageFrame.origin = cellFrame.origin;
+ imageFrame.size = imageSize;
+ imageFrame.origin.x += ceil((cellFrame.size.width - imageSize.width) / 2);
+ imageFrame.origin.y += [view isFlipped] ?
+ ceil((cellFrame.size.height + imageSize.height) / 2)
+ : ceil((cellFrame.size.height - imageSize.height) / 2);
+ [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver];
+ }
+
+ // status string
+ if (_statusString) {
+ BOOL highlighted = [self isHighlighted] && [[self highlightColorWithFrame: cellFrame inView: view]
+ isEqual: [NSColor alternateSelectedControlColor]];
+ NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
+ [paragraphStyle setLineBreakMode: NSLineBreakByTruncatingTail];
+
+ NSDictionary * statusAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
+ highlighted ? [NSColor whiteColor] : [NSColor darkGrayColor], NSForegroundColorAttributeName,
+ [NSFont boldSystemFontOfSize: 9.0], NSFontAttributeName,
+ paragraphStyle, NSParagraphStyleAttributeName, nil];
+ [paragraphStyle release];
+
+ NSSize statusSize = [_statusString sizeWithAttributes: statusAttributes];
+ pen = cellFrame.origin;
+ pen.x += (cellFrame.size.width - statusSize.width) * 0.5;
+ pen.y += (cellFrame.size.height - statusSize.height) * 0.5;
+
+ [_statusString drawInRect: NSMakeRect(pen.x, pen.y, statusSize.width, statusSize.height)
+ withAttributes: statusAttributes];
+ [statusAttributes release];
+ }
+}
+
+- (id)copyWithZone: (NSZone *)zone
+{
+ ProgressCell *newObj = [super copyWithZone: zone];
+ newObj->_statusString = [_statusString retain];
+ newObj->_icon = [_icon retain];
+ return newObj;
+}
+
+ at end
Added: trunk/src/uimac14/ReconItem.h
===================================================================
--- trunk/src/uimac14/ReconItem.h (rev 0)
+++ trunk/src/uimac14/ReconItem.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,80 @@
+/* ReconItem */
+
+#import <Cocoa/Cocoa.h>
+
+ at class OCamlValue;
+
+ at interface ReconItem : NSObject
+{
+ ReconItem *parent;
+ NSString *path;
+ NSString *fullPath;
+ BOOL selected;
+ NSImage *direction;
+ NSString *directionSortString;
+ double fileSize;
+ double bytesTransferred;
+ BOOL resolved;
+}
+- (BOOL)selected;
+- (void)setSelected:(BOOL)x;
+- (NSString *)path;
+- (NSString *)fullPath;
+- (NSString *)left;
+- (NSString *)right;
+- (NSImage *)direction;
+- (NSImage *)fileIcon;
+- (long)fileCount;
+- (double)fileSize;
+- (NSString *)fileSizeString;
+- (double)bytesTransferred;
+- (NSString *)bytesTransferredString;
+- (void)setDirection:(char *)d;
+- (void) doAction:(unichar)action;
+- (void) doIgnore:(unichar)action;
+- (NSString *)progress;
+- (NSString *)progressString;
+- (void)resetProgress;
+- (NSString *)details;
+- (NSString *)updateDetails;
+- (BOOL)isConflict;
+- (BOOL)changedFromDefault;
+- (void)revertDirection;
+- (BOOL)canDiff;
+- (void)showDiffs;
+- (NSString *)leftSortKey;
+- (NSString *)rightSortKey;
+- (NSString *)replicaSortKey:(NSString *)sortString;
+- (NSString *)directionSortKey;
+- (NSString *)progressSortKey;
+- (NSString *)pathSortKey;
+- (NSArray *)children;
+- (ReconItem *)collapseParentsWithSingleChildren:(BOOL)isRoot;
+- (ReconItem *)parent;
+- (void)setPath:(NSString *)aPath;
+- (void)setFullPath:(NSString *)p;
+- (void)setParent:(ReconItem *)p;
+- (void)willChange;
+ at end
+
+ at interface LeafReconItem : ReconItem
+{
+ NSString *left;
+ NSString *right;
+ NSString *progress;
+ NSString *details;
+ OCamlValue *ri; // an ocaml Common.reconItem
+ long index; // index in Ri list
+}
+- initWithRiAndIndex:(OCamlValue *)v index:(long)i;
+ at end
+
+ at interface ParentReconItem : ReconItem
+{
+ NSMutableArray *_children;
+ long fileCount;
+}
+- (void)addChild:(ReconItem *)item nested:(BOOL)useNesting;
+- (void)sortUsingDescriptors:(NSArray *)sortDescriptors;
+- (BOOL)hasConflictedChildren;
+ at end
Added: trunk/src/uimac14/ReconItem.m
===================================================================
--- trunk/src/uimac14/ReconItem.m (rev 0)
+++ trunk/src/uimac14/ReconItem.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,862 @@
+#import "ReconItem.h"
+#import "Bridge.h"
+
+#import <Carbon/Carbon.h>
+
+ at implementation ReconItem
+
+- init {
+ [super init];
+ selected = NO; // NB only used/updated during sorts. Not a
+ // reliable indicator of whether item is selected
+ fileSize = -1.;
+ bytesTransferred = -1.;
+ return self;
+}
+
+- (void)dealloc
+{
+ [path release];
+ [fullPath release];
+ // [direction release]; // assuming retained by cache, so not retained
+ // [directionSortString release]; // no retain/release necessary because is constant
+ [super dealloc];
+}
+
+- (ReconItem *)parent
+{
+ return parent;
+}
+
+- (void)setParent:(ReconItem *)p
+{
+ parent = p;
+}
+
+- (void)willChange
+{
+ // propagate up parent chain
+ [parent willChange];
+}
+
+- (NSArray *)children
+{
+ return nil;
+}
+
+- (BOOL)selected
+{
+ return selected;
+}
+
+- (void)setSelected:(BOOL)x
+{
+ selected = x;
+}
+
+- (NSString *)path
+{
+ return path;
+}
+
+- (void)setPath:(NSString *)aPath
+{
+ [path autorelease];
+ path = [aPath retain];
+
+ // invalidate
+ [fullPath autorelease];
+ fullPath = nil;
+}
+
+- (NSString *)fullPath
+{
+ if (!fullPath) {
+ NSString *parentPath = [parent fullPath];
+ [self setFullPath:(([parentPath length] > 0) ? [parentPath stringByAppendingFormat:@"/%@", path] : path)];
+ }
+
+ return fullPath;
+}
+
+- (void)setFullPath:(NSString *)p
+{
+ [fullPath autorelease];
+ fullPath = [p retain];
+}
+
+- (NSString *)left
+{
+ return nil;
+}
+
+- (NSString *)right
+{
+ return nil;
+}
+
+static NSMutableDictionary *_ChangeIconsByType = nil;
+
+- (NSImage *)changeIconFor:(NSString *)type other:(NSString *)other
+{
+ if (![type length]) {
+ if ([other isEqual:@"Created"]) {
+ type = @"Absent";
+ } else if ([other length]) {
+ type = @"Unmodified";
+ } else
+ return nil;
+ }
+
+ NSImage *result = [_ChangeIconsByType objectForKey:type];
+ if (!result) {
+ NSString *imageName = [NSString stringWithFormat:@"Change_%@.png", type];
+ result = [NSImage imageNamed:imageName];
+ if (!_ChangeIconsByType) _ChangeIconsByType = [[NSMutableDictionary alloc] init];
+ [_ChangeIconsByType setObject:result forKey:type];
+ }
+ return result;
+}
+
+- (NSImage *)leftIcon
+{
+ return [self changeIconFor:[self left] other:[self right]];
+}
+
+- (NSImage *)rightIcon
+{
+ return [self changeIconFor:[self right] other:[self left]];
+}
+
+
+- (double)computeFileSize
+{
+ return 0.;
+}
+
+- (double)bytesTransferred
+{
+ return 0.;
+}
+
+- (long)fileCount
+{
+ return 1;
+}
+
+- (double)fileSize
+{
+ if (fileSize == -1.) fileSize = [self computeFileSize];
+ return fileSize;
+}
+
+- (NSString *)formatFileSize:(double)size
+{
+ if (size == 0) return @"--";
+ if (size < 1024) return @"< 1KB"; // return [NSString stringWithFormat:@"%i bytes", size];
+ size /= 1024;
+ if (size < 1024) return [NSString stringWithFormat:@"%i KB", (int)size];
+ size /= 1024;
+ if (size < 1024) return [NSString stringWithFormat:@"%1.1f MB", size];
+ size = size / 1024;
+ return [NSString stringWithFormat:@"%1.1f GB", size];
+}
+
+- (NSString *)fileSizeString
+{
+ return [self formatFileSize:[self fileSize]];
+}
+
+- (NSString *)bytesTransferredString
+{
+ return [self formatFileSize:[self bytesTransferred]];
+}
+
+- (NSNumber *)percentTransferred
+{
+ double size = [self computeFileSize];
+ return (size > 0) ? [NSNumber numberWithDouble:([self bytesTransferred] / (size) * 100.0)]
+ : nil;
+}
+
+static NSMutableDictionary *_iconsByExtension = nil;
+
+- (NSImage *)iconForExtension:(NSString *)extension
+{
+ NSImage *icon = [_iconsByExtension objectForKey:extension];
+ if (!_iconsByExtension) _iconsByExtension = [[NSMutableDictionary alloc] init];
+ if (!icon) {
+ icon = [[NSWorkspace sharedWorkspace] iconForFileType:extension];
+ [icon setSize:NSMakeSize(16.0, 16.0)];
+ [_iconsByExtension setObject:icon forKey:extension];
+ }
+ return icon;
+}
+
+- (NSImage *)fileIcon
+{
+ return [self iconForExtension:NSFileTypeForHFSTypeCode(kOpenFolderIcon)];
+}
+
+- (NSString *)dirString
+{
+ return @"<-?->";
+}
+
+- (NSImage *)direction
+{
+ if (direction) return direction;
+ NSString * dirString = [self dirString];
+
+ BOOL changedFromDefault = [self changedFromDefault];
+
+ if ([dirString isEqual:@"<-?->"]) {
+ if (changedFromDefault | resolved) {
+ direction = [NSImage imageNamed: @"table-skip.tif"];
+ directionSortString = @"3";
+ }
+ else {
+ direction = [NSImage imageNamed: @"table-conflict.tif"];
+ directionSortString = @"2";
+ }
+ }
+
+ else if ([dirString isEqual:@"---->"]) {
+ if (changedFromDefault) {
+ direction = [NSImage imageNamed: @"table-right-blue.tif"];
+ directionSortString = @"6";
+ }
+ else {
+ direction = [NSImage imageNamed: @"table-right-green.tif"];
+ directionSortString = @"8";
+ }
+ }
+
+ else if ([dirString isEqual:@"<----"]) {
+ if (changedFromDefault) {
+ direction = [NSImage imageNamed: @"table-left-blue.tif"];
+ directionSortString = @"5";
+ }
+ else {
+ direction = [NSImage imageNamed: @"table-left-green.tif"];
+ directionSortString = @"7";
+ }
+ }
+
+ else if ([dirString isEqual:@"<-M->"]) {
+ direction = [NSImage imageNamed: @"table-merge.tif"];
+ directionSortString = @"4";
+ }
+
+ else if ([dirString isEqual:@"<--->"]) {
+ direction = [NSImage imageNamed: @"table-mixed.tif"];
+ directionSortString = @"9";
+ }
+
+ else {
+ direction = [NSImage imageNamed: @"table-error.tif"];
+ directionSortString = @"1";
+ }
+
+ [direction retain];
+ return direction;
+}
+
+- (void)setDirection:(char *)d
+{
+ [direction autorelease];
+ direction = nil;
+}
+
+- (void)doAction:(unichar)action
+{
+ switch (action) {
+ case '>':
+ [self setDirection:"unisonRiSetRight"];
+ break;
+ case '<':
+ [self setDirection:"unisonRiSetLeft"];
+ break;
+ case '/':
+ [self setDirection:"unisonRiSetConflict"];
+ resolved = YES;
+ break;
+ case '-':
+ [self setDirection:"unisonRiForceOlder"];
+ break;
+ case '+':
+ [self setDirection:"unisonRiForceNewer"];
+ break;
+ case 'm':
+ [self setDirection:"unisonRiSetMerge"];
+ break;
+ case 'd':
+ [self showDiffs];
+ break;
+ case 'R':
+ [self revertDirection];
+ break;
+ default:
+ NSLog(@"ReconItem.doAction : unknown action");
+ break;
+ }
+}
+
+- (void)doIgnore:(unichar)action
+{
+ switch (action) {
+ case 'I':
+ ocamlCall("xS", "unisonIgnorePath", [self fullPath]);
+ break;
+ case 'E':
+ ocamlCall("xS", "unisonIgnoreExt", [self path]);
+ break;
+ case 'N':
+ ocamlCall("xS", "unisonIgnoreName", [self path]);
+ break;
+ default:
+ NSLog(@"ReconItem.doIgnore : unknown ignore");
+ break;
+ }
+}
+
+/* Sorting functions. These have names equal to
+ column identifiers + "SortKey", and return NSStrings that
+ can be automatically sorted with their compare method */
+
+- (NSString *) leftSortKey
+{
+ return [self replicaSortKey:[self left]];
+}
+
+- (NSString *) rightSortKey
+{
+ return [self replicaSortKey:[self right]];
+}
+
+- (NSString *) replicaSortKey:(NSString *)sortString
+{
+ /* sort order for left and right replicas */
+
+ if ([sortString isEqualToString:@"Created"]) return @"1";
+ else if ([sortString isEqualToString:@"Deleted"]) return @"2";
+ else if ([sortString isEqualToString:@"Modified"]) return @"3";
+ else if ([sortString isEqualToString:@""]) return @"4";
+ else return @"5";
+}
+
+- (NSString *) directionSortKey
+{
+ /* Since the direction indicators are unsortable images, use
+ directionSortString instead */
+
+ if ([directionSortString isEqual:@""])
+ [self direction];
+ return directionSortString;
+}
+
+- (NSString *) progressSortKey
+{
+ /* Percentages, "done" and "" are sorted OK without help,
+ but "start " should be sorted after "" and before "0%" */
+
+ NSString * progressString = [self progress];
+ if ([progressString isEqualToString:@"start "]) progressString = @" ";
+ return progressString;
+}
+
+- (NSString *) pathSortKey
+{
+ /* default alphanumeric sort is fine for paths */
+ return [self path];
+}
+
+- (NSString *)progress
+{
+ return nil;
+}
+
+- (BOOL)transferInProgress
+{
+ double soFar = [self bytesTransferred];
+ return (soFar > 0) && (soFar < [self fileSize]);
+}
+
+- (void)resetProgress
+{
+}
+
+- (NSString *)progressString
+{
+ NSString *progress = [self progress];
+ if ([progress length] == 0. || [progress hasSuffix:@"%"])
+ progress = [self transferInProgress] ? [self bytesTransferredString] : @"";
+ else if ([progress isEqual:@"done"]) progress = @"";
+ return progress;
+}
+
+- (NSString *)details
+{
+ return nil;
+}
+
+- (NSString *)updateDetails
+{
+ return [self details];
+}
+
+- (BOOL)isConflict
+{
+ return NO;
+}
+
+- (BOOL)changedFromDefault
+{
+ return NO;
+}
+
+- (void)revertDirection
+{
+ [self willChange];
+ [direction release];
+ direction = nil;
+ resolved = NO;
+}
+
+- (BOOL)canDiff
+{
+ return NO;
+}
+
+- (void)showDiffs
+{
+}
+
+- (ReconItem *)collapseParentsWithSingleChildren:(BOOL)isRoot
+{
+ return self;
+}
+
+- (NSString *)description
+{
+ return [NSString stringWithFormat:@"ReconItem: %@ %@", fullPath, path];
+}
+
+- (NSString *)debugDescription
+{
+ return [self description];
+}
+ at end
+
+
+// --- Leaf items -- actually corresponding to ReconItems in OCaml
+ at implementation LeafReconItem
+
+- initWithRiAndIndex:(OCamlValue *)v index:(long)i
+{
+ [super init];
+ ri = [v retain];
+ index = i;
+ resolved = NO;
+ directionSortString = @"";
+ return self;
+}
+
+-(void)dealloc
+{
+ [ri release];
+ [left release];
+ [right release];
+ [progress release];
+ [details release];
+
+ [super dealloc];
+}
+
+- (NSString *)path
+{
+ if (!path) path = [(NSString *)ocamlCall("S@", "unisonRiToPath", ri) retain];
+ return path;
+}
+
+- (NSString *)left
+{
+ if (!left) left = [(NSString *)ocamlCall("S@", "unisonRiToLeft", ri) retain];
+ return left;
+}
+
+- (NSString *)right
+{
+ if (!right) right = [(NSString *)ocamlCall("S@", "unisonRiToRight", ri) retain];
+ return right;
+}
+
+- (double)computeFileSize
+{
+ return [(NSNumber *)ocamlCall("N@", "unisonRiToFileSize", ri) doubleValue];
+}
+
+- (double)bytesTransferred
+{
+ if (bytesTransferred == -1.) {
+ // need to force to fileSize if done, otherwise may not match up to 100%
+ bytesTransferred = ([[self progress] isEqual:@"done"]) ? [self fileSize]
+ : [(NSNumber*)ocamlCall("N@", "unisonRiToBytesTransferred", ri) doubleValue];
+ }
+ return bytesTransferred;
+}
+
+- (NSImage *)fileIcon
+{
+ NSString *extension = [[self path] pathExtension];
+
+ if ([@"" isEqual:extension]) {
+ NSString *type = (NSString *)ocamlCall("S@", "unisonRiToFileType", ri);
+ extension = [type isEqual:@"dir"]
+ ? NSFileTypeForHFSTypeCode(kGenericFolderIcon)
+ : NSFileTypeForHFSTypeCode(kGenericDocumentIcon);
+ }
+ return [self iconForExtension:extension];
+}
+
+- (NSString *)dirString
+{
+ return (NSString *)ocamlCall("S@", "unisonRiToDirection", ri);
+}
+
+- (void)setDirection:(char *)d
+{
+ [self willChange];
+ [super setDirection:d];
+ ocamlCall("x@", d, ri);
+}
+
+- (NSString *)progress
+{
+ if (!progress) {
+ progress = [(NSString *)ocamlCall("S@", "unisonRiToProgress", ri) retain];
+ if ([progress isEqual:@"FAILED"]) [self updateDetails];
+ }
+ return progress;
+}
+
+- (void)resetProgress
+{
+ // Get rid of the memoized progress because we expect it to change
+ [self willChange];
+ bytesTransferred = -1.;
+ [progress release];
+
+ // Force update now so we get the result while the OCaml thread is available
+ // [self progress];
+ // [self bytesTransferred];
+ progress = nil;
+}
+
+- (NSString *)details
+{
+ if (details) return details;
+ return [self updateDetails];
+}
+
+- (NSString *)updateDetails
+{
+ [details autorelease];
+ details = [(NSString *)ocamlCall("S@", "unisonRiToDetails", ri) retain];
+ return details;
+}
+
+- (BOOL)isConflict
+{
+ return ((long)ocamlCall("i@", "unisonRiIsConflict", ri) ? YES : NO);
+}
+
+- (BOOL)changedFromDefault
+{
+ return ((long)ocamlCall("i@", "changedFromDefault", ri) ? YES : NO);
+}
+
+- (void)revertDirection
+{
+ ocamlCall("x@", "unisonRiRevert", ri);
+ [super revertDirection];
+}
+
+- (BOOL)canDiff
+{
+ return ((long)ocamlCall("i@", "canDiff", ri) ? YES : NO);
+}
+
+- (void)showDiffs
+{
+ ocamlCall("x at i", "runShowDiffs", ri, index);
+}
+
+ at end
+
+ at interface NSImage (TintedImage)
+- (NSImage *)tintedImageWithColor:(NSColor *) tint operation:(NSCompositingOperation) op;
+ at end
+
+ at implementation NSImage (TintedImage)
+
+- (NSImage *)tintedImageWithColor:(NSColor *) tint operation:(NSCompositingOperation) op
+{
+ NSSize size = [self size];
+ NSRect imageBounds = NSMakeRect(0, 0, size.width, size.height);
+ NSImage *newImage = [[NSImage alloc] initWithSize:size];
+
+ [newImage lockFocus];
+ [self compositeToPoint:NSZeroPoint operation:NSCompositeSourceOver];
+ [tint set];
+ NSRectFillUsingOperation(imageBounds, op);
+ [newImage unlockFocus];
+
+ return [newImage autorelease];
+}
+
+ at end
+
+// ---- Parent nodes in grouped items
+ at implementation ParentReconItem
+
+- init
+{
+ [super init];
+ _children = [[NSMutableArray alloc] init];
+ return self;
+}
+
+- initWithPath:(NSString *)aPath
+{
+ [self init];
+ path = [aPath retain];
+ return self;
+}
+
+- (void)dealloc
+{
+ [_children release];
+ [super dealloc];
+}
+
+- (NSArray *)children;
+{
+ return _children;
+}
+
+- (ReconItem *)findChildWithPath:(NSArray *)pathArray level:level{
+ ReconItem *item;
+ NSString *element = [pathArray count] ? [pathArray objectAtIndex:level] : @"";
+
+ for (item in _children) {
+ if ([item isKindOfClass:[ParentReconItem class]] && [[item path] isEqual:element]) {
+ return item;
+ }
+ }
+ return nil;
+}
+
+- (void)addChild:(ReconItem *)item pathArray:(NSArray *)pathArray level:(int)level
+{
+ // NSLog(@"Adding child: %@", pathArray);
+ NSString *element = [pathArray count] ? [pathArray objectAtIndex:level] : @"";
+
+ // if we're at the leaf of the path, then add the item
+ if (((0 == [pathArray count]) && (0 == level)) || (level == [pathArray count]-1)) {
+ [item setParent:self];
+ [item setPath:element];
+ [_children addObject:item];
+ return;
+ }
+
+ // find / add matching parent node
+ ReconItem *parentItem = [self findChildWithPath:pathArray level:level];
+ if (parentItem == nil || ![parentItem isKindOfClass:[ParentReconItem class]]) {
+ parentItem = [[ParentReconItem alloc] initWithPath:element];
+ [parentItem setParent:self];
+ [_children addObject:parentItem];
+ [parentItem release];
+ }
+
+ [(ParentReconItem *)parentItem addChild:item pathArray:pathArray level:level+1];
+}
+
+- (void)addChild:(ReconItem *)item nested:(BOOL)nested
+{
+ [item setPath:nil]; // invalidate/reset
+
+ if (nested) {
+ [self addChild:item pathArray:[[item path] pathComponents] level:0];
+ } else {
+ [item setParent:self];
+ [_children addObject:item];
+ }
+}
+
+- (void)sortUsingDescriptors:(NSArray *)sortDescriptors
+{
+ // sort our children
+ [_children sortUsingDescriptors:sortDescriptors];
+
+ // then have them sort theirs
+ int i = [_children count];
+ while (i--) {
+ id child = [_children objectAtIndex:i];
+ if ([child isKindOfClass:[ParentReconItem class]]) [child sortUsingDescriptors:sortDescriptors];
+ }
+}
+
+- (ReconItem *)collapseParentsWithSingleChildren:(BOOL)isRoot
+{
+ // replace ourselves?
+ if (!isRoot && [_children count] == 1) {
+ ReconItem *child = [_children lastObject];
+ [child setPath:[path stringByAppendingFormat:@"/%@", [child path]]];
+ return [child collapseParentsWithSingleChildren:NO];
+ }
+
+ // recurse
+ int i = [_children count];
+ while (i--) {
+ ReconItem *child = [_children objectAtIndex:i];
+ ReconItem *replacement = [child collapseParentsWithSingleChildren:NO];
+ if (child != replacement) {
+ [_children replaceObjectAtIndex:i withObject:replacement];
+ [replacement setParent:self];
+ }
+ }
+ return self;
+}
+
+- (void)willChange
+{
+ // invalidate child-based state
+ // Assuming caches / constant, so not retained / released
+ // [direction autorelease];
+ // [directionSortString autorelease];
+ direction = nil;
+ directionSortString = nil;
+ bytesTransferred = -1.;
+ // fileSize = -1;
+ // resolved = NO;
+
+ // propagate up parent chain
+ [parent willChange];
+}
+
+// Propagation methods
+- (void)doAction:(unichar)action
+{
+ int i = [_children count];
+ while (i--) {
+ ReconItem *child = [_children objectAtIndex:i];
+ [child doAction:action];
+ }
+}
+
+- (void)doIgnore:(unichar)action
+{
+ // handle Path ignores at this level, name and extension at the child nodes
+ if (action == 'I') {
+ [super doIgnore:'I'];
+ } else {
+ int i = [_children count];
+ while (i--) {
+ ReconItem *child = [_children objectAtIndex:i];
+ [child doIgnore:action];
+ }
+ }
+}
+
+// Rollup methods
+- (long)fileCount
+{
+ if (fileCount == 0) {
+ int i = [_children count];
+ while (i--) {
+ ReconItem *child = [_children objectAtIndex:i];
+ fileCount += [child fileCount];
+ }
+ }
+ return fileCount;
+}
+
+- (double)computeFileSize
+{
+ double size = 0;
+ int i = [_children count];
+ while (i--) {
+ ReconItem *child = [_children objectAtIndex:i];
+ size += [child fileSize];
+ }
+ return size;
+}
+
+- (double)bytesTransferred
+{
+ if (bytesTransferred == -1.) {
+ bytesTransferred = 0.;
+ int i = [_children count];
+ while (i--) {
+ ReconItem *child = [_children objectAtIndex:i];
+ bytesTransferred += [child bytesTransferred];
+ }
+ }
+ return bytesTransferred;
+}
+
+
+
+- (NSString *)dirString
+{
+ NSString *rollup = nil;
+ int i = [_children count];
+ while (i--) {
+ ReconItem *child = [_children objectAtIndex:i];
+ NSString *dirString = [child dirString];
+ if (!rollup || [dirString isEqual:rollup]) {
+ rollup = dirString;
+ } else {
+ // conflict
+ if ([dirString isEqual:@"---->"] || [dirString isEqual:@"<----"] || [dirString isEqual:@"<--->"]) {
+ if ([rollup isEqual:@"---->"] || [rollup isEqual:@"<----"] || [rollup isEqual:@"<--->"]) {
+ rollup = @"<--->";
+ }
+ } else {
+ rollup = @"<-?->";
+ }
+ }
+ }
+ // NSLog(@"dirString for %@: %@", path, rollup);
+ return rollup;
+}
+
+- (BOOL)hasConflictedChildren
+{
+ NSString *dirString = [self dirString];
+ BOOL result = [dirString isEqual:@"<--->"] || [dirString isEqual:@"<-?->"];
+ // NSLog(@"hasConflictedChildren (%@): %@: %i", [self path], dirString, result);
+ return result;
+}
+
+static NSMutableDictionary *_parentImages = nil;
+static NSColor *_veryLightGreyColor = nil;
+- (NSImage *)direction
+{
+ if (!_parentImages) {
+ _parentImages = [[NSMutableDictionary alloc] init];
+ _veryLightGreyColor = [[NSColor colorWithCalibratedRed:0.7 green:0.7 blue:0.7 alpha:1.0] retain];
+ }
+ NSImage *baseImage = [super direction];
+ NSImage *parentImage = [_parentImages objectForKey:baseImage];
+ if (!parentImage) {
+ // make parent images a grey version of the leaf images
+ parentImage = [baseImage tintedImageWithColor:_veryLightGreyColor operation:NSCompositeSourceIn];
+ [_parentImages setObject:parentImage forKey:baseImage];
+ }
+ return parentImage;
+}
+
+ at end
+
Added: trunk/src/uimac14/ReconTableView.h
===================================================================
--- trunk/src/uimac14/ReconTableView.h (rev 0)
+++ trunk/src/uimac14/ReconTableView.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,43 @@
+//
+// ReconTableView.h
+//
+// NSTableView extended to handle additional keyboard events for the reconcile window.
+// The keyDown: method is redefined.
+//
+// Created by Trevor Jim on Wed Aug 27 2003.
+// Copyright (c) 2003, 2014, licensed under GNU GPL.
+//
+
+#import <AppKit/AppKit.h>
+
+ at interface ReconTableView : NSOutlineView {
+ BOOL editable;
+}
+- (BOOL)editable;
+- (void)setEditable:(BOOL)x;
+- (BOOL)validateItem:(SEL) action;
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem;
+- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem;
+- (IBAction)ignorePath:(id)sender;
+- (IBAction)ignoreExt:(id)sender;
+- (IBAction)ignoreName:(id)sender;
+- (IBAction)copyLR:(id)sender;
+- (IBAction)copyRL:(id)sender;
+- (IBAction)leaveAlone:(id)sender;
+- (IBAction)forceOlder:(id)sender;
+- (IBAction)forceNewer:(id)sender;
+- (IBAction)selectConflicts:(id)sender;
+- (IBAction)revert:(id)sender;
+- (IBAction)merge:(id)sender;
+- (IBAction)showDiff:(id)sender;
+- (BOOL)canDiffSelection;
+ at end
+
+ at interface NSOutlineView (_UnisonExtras)
+- (NSArray *)selectedObjects;
+- (NSEnumerator *)selectedObjectEnumerator;
+- (void)setSelectedObjects:(NSArray *)selection;
+
+- (void)expandChildrenIfSpace;
+
+ at end
Added: trunk/src/uimac14/ReconTableView.m
===================================================================
--- trunk/src/uimac14/ReconTableView.m (rev 0)
+++ trunk/src/uimac14/ReconTableView.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,298 @@
+//
+// ReconTableView.m
+// Unison
+//
+// Created by Trevor Jim on Wed Aug 27 2003.
+// Copyright (c) 2003, 2014. See file COPYING for details.
+//
+
+#import "ReconTableView.h"
+#import "ReconItem.h"
+#import "MyController.h"
+
+ at implementation NSOutlineView (_UnisonExtras)
+
+- (NSArray *)selectedObjects
+{
+ NSMutableArray *result = [NSMutableArray array];
+ NSIndexSet *set = [self selectedRowIndexes];
+ NSUInteger index = [set firstIndex];
+ while (index != NSNotFound) {
+ [result addObject:[self itemAtRow:index]];
+ index = [set indexGreaterThanIndex: index];
+ }
+ return result;
+}
+
+- (void)setSelectedObjects:(NSArray *)selectedObjects
+{
+ NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
+ int i = [selectedObjects count];
+ while (i--) {
+ int index = [self rowForItem:[selectedObjects objectAtIndex:i]];
+ if (index >= 0) [set addIndex:index];
+ }
+ [self selectRowIndexes:set byExtendingSelection:NO];
+}
+
+- (NSEnumerator *)selectedObjectEnumerator
+{
+ return [[self selectedObjects] objectEnumerator];
+}
+
+- (int)rowCapacityWithoutScrolling
+{
+ float bodyHeight = [self visibleRect].size.height;
+ bodyHeight -= [[self headerView] visibleRect].size.height;
+ return bodyHeight / ([self rowHeight] + 2.0);
+}
+
+- (BOOL)_canAcceptRowCountWithoutScrolling:(int)rows
+{
+ return ([self numberOfRows] + rows) <= [self rowCapacityWithoutScrolling];
+}
+
+- (BOOL)_expandChildrenIfSpace:(id)parent level:(int)level
+{
+ BOOL didExpand = NO;
+ id dataSource = [self dataSource];
+ int count = [dataSource outlineView:self numberOfChildrenOfItem:parent];
+ if (level == 0) {
+ if (count && ([self isItemExpanded:parent] || [self _canAcceptRowCountWithoutScrolling:count])) {
+ [self expandItem:parent expandChildren:NO];
+ didExpand = YES;
+ }
+ } else {
+ // try expanding each of our children. If all expand, then return YES,
+ // indicating that it may be worth trying the next level
+ int i;
+ for (i=0; i < count; i++) {
+ id child = [dataSource outlineView:self child:i ofItem:parent];
+ didExpand = [self _expandChildrenIfSpace:child level:level-1] || didExpand;
+ }
+ }
+
+ return didExpand;
+}
+
+- (void)expandChildrenIfSpace
+{
+ int level = 1;
+ while ([self _expandChildrenIfSpace:nil level:level]) level++;
+}
+
+ at end
+
+ at implementation ReconTableView
+
+- (BOOL)editable
+{
+ return editable;
+}
+
+- (void)setEditable:(BOOL)x
+{
+ editable = x;
+}
+
+- (BOOL)validateItem:(SEL) action
+{
+ if (action == @selector(selectAll:)
+ || action == @selector(selectConflicts:)
+ || action == @selector(copyLR:)
+ || action == @selector(copyRL:)
+ || action == @selector(leaveAlone:)
+ || action == @selector(forceNewer:)
+ || action == @selector(forceOlder:)
+ || action == @selector(revert:)
+ || action == @selector(ignorePath:)
+ || action == @selector(ignoreExt:)
+ || action == @selector(ignoreName:))
+ return editable;
+ else if (action == @selector(merge:)) {
+ if (!editable) return NO;
+ else return [self canDiffSelection];
+ }
+ else if (action == @selector(showDiff:)) {
+ if ((!editable) || (!([self numberOfSelectedRows]==1)))
+ return NO;
+ else return [self canDiffSelection];
+ }
+ else return YES;
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
+{
+ return [self validateItem:[menuItem action]];
+}
+
+- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
+{
+ return [self validateItem:[toolbarItem action]];
+}
+
+- (void)doIgnore:(unichar)c
+{
+ NSEnumerator *e = [self selectedObjectEnumerator];
+ ReconItem *item, *last = nil;
+ while (item = [e nextObject]) {
+ [item doIgnore:c];
+ last = item;
+ }
+ if (last) { // something was selected
+ MyController* controller = (MyController*) [self dataSource];
+ last = [controller updateForIgnore:last];
+ [self selectRowIndexes:[NSIndexSet indexSetWithIndex:[self rowForItem:last]] byExtendingSelection:NO];
+ [self reloadData];
+ }
+}
+
+- (IBAction)ignorePath:(id)sender
+{
+ [self doIgnore:'I'];
+}
+
+- (IBAction)ignoreExt:(id)sender
+{
+ [self doIgnore:'E'];
+}
+
+- (IBAction)ignoreName:(id)sender
+{
+ [self doIgnore:'N'];
+}
+
+- (void)doAction:(unichar)c
+{
+ int numSelected = 0;
+ NSEnumerator *e = [self selectedObjectEnumerator];
+ ReconItem *item, *last = nil;
+ while (item = [e nextObject]) {
+ numSelected++;
+ [item doAction:c];
+ last = item;
+ }
+ if (numSelected>0) {
+ int nextRow = [self rowForItem:last] + 1;
+ if (numSelected == 1 && [self numberOfRows] > nextRow && c!='d') {
+ // Move to next row, unless already at last row, or if more than one row selected
+ [self selectRowIndexes:[NSIndexSet indexSetWithIndex:nextRow] byExtendingSelection:NO];
+ [self scrollRowToVisible:nextRow];
+ }
+ [self reloadData];
+ }
+}
+
+- (IBAction)copyLR:(id)sender
+{
+ [self doAction:'>'];
+}
+
+- (IBAction)copyRL:(id)sender
+{
+ [self doAction:'<'];
+}
+
+- (IBAction)leaveAlone:(id)sender
+{
+ [self doAction:'/'];
+}
+
+- (IBAction)forceOlder:(id)sender
+{
+ [self doAction:'-'];
+}
+
+- (IBAction)forceNewer:(id)sender
+{
+ [self doAction:'+'];
+}
+
+- (IBAction)selectConflicts:(id)sender
+{
+ [self deselectAll:self];
+ MyController* controller = (MyController*) [self dataSource];
+ NSMutableArray *reconItems = [controller reconItems];
+ int i = 0;
+ for (; i < [reconItems count]; i++) {
+ ReconItem *item = [reconItems objectAtIndex:i];
+ if ([item isConflict])
+ [self selectRowIndexes:[NSIndexSet indexSetWithIndex:[self rowForItem:item]] byExtendingSelection:YES];
+ }
+}
+
+- (IBAction)revert:(id)sender
+{
+ [self doAction:'R'];
+}
+
+- (IBAction)merge:(id)sender
+{
+ [self doAction:'m'];
+}
+
+- (IBAction)showDiff:(id)sender
+{
+ [self doAction:'d'];
+}
+
+/* There are menu commands for these, but we add some shortcuts so you don't
+ have to press the Command key */
+- (void)keyDown:(NSEvent *)event
+{
+ /* some keys return zero-length strings */
+ if ([[event characters] length] == 0) {
+ [super keyDown:event];
+ return;
+ }
+
+ /* actions are disabled when when menu items are */
+ if (!editable) {
+ [super keyDown:event];
+ return;
+ }
+
+ unichar c = [[event characters] characterAtIndex:0];
+ switch (c) {
+ case '>':
+ case NSRightArrowFunctionKey:
+ [self doAction:'>'];
+ break;
+ case '<':
+ case NSLeftArrowFunctionKey:
+ [self doAction:'<'];
+ break;
+ case '?':
+ case '/':
+ [self doAction:'/'];
+ break;
+ default:
+ [super keyDown:event];
+ break;
+ }
+}
+
+- (BOOL)canDiffSelection
+{
+ BOOL canDiff = YES;
+ NSEnumerator *e = [self selectedObjectEnumerator];
+ ReconItem *item;
+ while (item = [e nextObject]) {
+ if (![item canDiff]) canDiff= NO;
+ }
+ return canDiff;
+}
+
+/* Override default highlight colour because it's hard to see the
+ conflict/resolution icons */
+- (id)_highlightColorForCell:(NSCell *)cell
+{
+ if(([[self window] firstResponder] == self) &&
+ [[self window] isMainWindow] &&
+ [[self window] isKeyWindow])
+
+ return [NSColor colorWithCalibratedRed:0.7 green:0.75 blue:0.8 alpha:1.0];
+ else return [NSColor colorWithCalibratedRed:0.8 green:0.8 blue:0.8 alpha:1.0];
+}
+
+ at end
Added: trunk/src/uimac14/TrevorsUnison.icns
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/TrevorsUnison.icns
===================================================================
--- trunk/src/uimac14/TrevorsUnison.icns 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/TrevorsUnison.icns 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/TrevorsUnison.icns
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/Unison.icns
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/Unison.icns
===================================================================
--- trunk/src/uimac14/Unison.icns 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/Unison.icns 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/Unison.icns
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/UnisonToolbar.h
===================================================================
--- trunk/src/uimac14/UnisonToolbar.h (rev 0)
+++ trunk/src/uimac14/UnisonToolbar.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,33 @@
+//
+// UnisonToolbar.h
+//
+// Extended NSToolbar with several views
+//
+// Created by Ben Willmore on Sun March 12 2006.
+// Copyright (c) 2006, licensed under GNU GPL.
+//
+
+#import <AppKit/AppKit.h>
+
+ at class ReconTableView, MyController;
+
+ at interface UnisonToolbar : NSToolbar
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
+ <NSToolbarDelegate>
+#endif
+{
+ ReconTableView* tableView;
+ MyController* myController;
+ NSString* currentView;
+ NSView* tableModeView;
+}
+
+- initWithIdentifier:(NSString *) identifier :(MyController *) aController :(ReconTableView *) aTableView;
+- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted;
+- (NSArray *) itemIdentifiersForView: (NSString *) whichView;
+- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar;
+- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar;
+- (void) setView: (NSString *) whichView;
+- (void)takeTableModeView:(NSView *)view;
+
+ at end
Added: trunk/src/uimac14/UnisonToolbar.m
===================================================================
--- trunk/src/uimac14/UnisonToolbar.m (rev 0)
+++ trunk/src/uimac14/UnisonToolbar.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,216 @@
+//
+// UnisonToolbar.h
+//
+// Extended NSToolbar with several views
+//
+// Created by Ben Willmore on Sun March 12 2006.
+// Copyright (c) 2006, licensed under GNU GPL.
+//
+
+#import "UnisonToolbar.h"
+#import "MyController.h"
+
+static NSString* QuitItemIdentifier = @"Quit";
+static NSString* OpenItemIdentifier = @"Open";
+static NSString* NewItemIdentifier = @"New";
+static NSString* GoItemIdentifier = @"Go";
+static NSString* CancelItemIdentifier = @"Cancel";
+static NSString* SaveItemIdentifier = @"Save";
+static NSString* RestartItemIdentifier = @"Restart";
+static NSString* RescanItemIdentifier = @"Rescan";
+static NSString* RToLItemIdentifier = @"RToL";
+static NSString* MergeItemIdentifier = @"Merge";
+static NSString* LToRItemIdentifier = @"LToR";
+static NSString* SkipItemIdentifier = @"Skip";
+static NSString* DiffItemIdentifier = @"Diff";
+static NSString* TableModeIdentifier = @"TableMode";
+
+ at implementation UnisonToolbar
+
+- initWithIdentifier:(NSString *) identifier :(MyController *) aController :(ReconTableView *) aTableView {
+
+ if ((self = [super initWithIdentifier: identifier])) {
+ [self setAllowsUserCustomization: NO];
+ [self setAutosavesConfiguration: NO];
+ [self setDelegate: self];
+ myController = aController;
+ tableView = aTableView;
+ currentView = @"";
+ }
+
+ return self;
+}
+
+- (void)takeTableModeView:(NSView *)view
+{
+ tableModeView = [view retain];
+ [view setHidden:YES];
+}
+
+- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted {
+
+ NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
+ if ([itemIdent isEqual: QuitItemIdentifier]) {
+ [toolbarItem setLabel: @"Quit"];
+ [toolbarItem setImage: [NSImage imageNamed: @"quit.tif"]];
+ [toolbarItem setTarget:NSApp];
+ [toolbarItem setAction:@selector(terminate:)];
+ }
+ else if ([itemIdent isEqual: OpenItemIdentifier]) {
+ [toolbarItem setLabel: @"Open"];
+ [toolbarItem setImage: [NSImage imageNamed: @"go.tif"]];
+ [toolbarItem setTarget:myController];
+ [toolbarItem setAction:@selector(openButton:)];
+ }
+ else if ([itemIdent isEqual: NewItemIdentifier]) {
+ [toolbarItem setLabel: @"New"];
+ [toolbarItem setImage: [NSImage imageNamed: @"add.tif"]];
+ [toolbarItem setTarget:myController];
+ [toolbarItem setAction:@selector(createButton:)];
+ }
+ else if ([itemIdent isEqual: CancelItemIdentifier]) {
+ [toolbarItem setLabel: @"Cancel"];
+ [toolbarItem setImage: [NSImage imageNamed: @"restart.tif"]];
+ [toolbarItem setTarget:myController];
+ [toolbarItem setAction:@selector(chooseProfiles)];
+ }
+ else if ([itemIdent isEqual: SaveItemIdentifier]) {
+ [toolbarItem setLabel: @"Save"];
+ [toolbarItem setImage: [NSImage imageNamed: @"save.tif"]];
+ [toolbarItem setTarget:myController];
+ [toolbarItem setAction:@selector(saveProfileButton:)];
+ }
+ else if ([itemIdent isEqual: GoItemIdentifier]) {
+ [toolbarItem setLabel: @"Go"];
+ [toolbarItem setImage: [NSImage imageNamed: @"go.tif"]];
+ [toolbarItem setTarget:myController];
+ [toolbarItem setAction:@selector(syncButton:)];
+ }
+ else if ([itemIdent isEqual: RestartItemIdentifier]) {
+ [toolbarItem setLabel: @"Restart"];
+ [toolbarItem setImage: [NSImage imageNamed: @"restart.tif"]];
+ [toolbarItem setTarget:myController];
+ [toolbarItem setAction:@selector(restartButton:)];
+ }
+ else if ([itemIdent isEqual: RescanItemIdentifier]) {
+ [toolbarItem setLabel: @"Rescan"];
+ [toolbarItem setImage: [NSImage imageNamed: @"rescan.tif"]];
+ [toolbarItem setTarget:myController];
+ [toolbarItem setAction:@selector(rescan:)];
+ }
+ else if ([itemIdent isEqual: RToLItemIdentifier]) {
+ [toolbarItem setLabel: @"Right to left"];
+ [toolbarItem setImage: [NSImage imageNamed: @"left.tif"]];
+ [toolbarItem setTarget:tableView];
+ [toolbarItem setAction:@selector(copyRL:)];
+ }
+ else if ([itemIdent isEqual: MergeItemIdentifier]) {
+ [toolbarItem setLabel: @"Merge"];
+ [toolbarItem setImage: [NSImage imageNamed: @"merge.tif"]];
+ [toolbarItem setTarget:tableView];
+ [toolbarItem setAction:@selector(merge:)];
+ }
+ else if ([itemIdent isEqual: LToRItemIdentifier]) {
+ [toolbarItem setLabel: @"Left to right"];
+ [toolbarItem setImage: [NSImage imageNamed: @"right.tif"]];
+ [toolbarItem setTarget:tableView];
+ [toolbarItem setAction:@selector(copyLR:)];
+ }
+ else if ([itemIdent isEqual: SkipItemIdentifier]) {
+ [toolbarItem setLabel: @"Skip"];
+ [toolbarItem setImage: [NSImage imageNamed: @"skip.tif"]];
+ [toolbarItem setTarget:tableView];
+ [toolbarItem setAction:@selector(leaveAlone:)];
+ }
+ else if ([itemIdent isEqual: DiffItemIdentifier]) {
+ [toolbarItem setLabel: @"Diff"];
+ [toolbarItem setImage: [NSImage imageNamed: @"diff.tif"]];
+ [toolbarItem setTarget:tableView];
+ [toolbarItem setAction:@selector(showDiff:)];
+ }
+ else if ([itemIdent isEqual: TableModeIdentifier]) {
+ [toolbarItem setLabel:@"Layout"];
+ [toolbarItem setToolTip:@"Switch table nesting"];
+ [tableModeView setHidden:NO];
+ [toolbarItem setView:tableModeView];
+ //[toolbarItem setMinSize:NSMakeSize(NSWidth([tableModeView frame]),NSHeight([tableModeView frame])+10)];
+ //[toolbarItem setMaxSize:NSMakeSize(NSWidth([tableModeView frame]),NSHeight([tableModeView frame])+10)];
+ }
+
+ return toolbarItem;
+}
+
+- (NSArray *) itemIdentifiersForView: (NSString *) whichView {
+ if ([whichView isEqual: @"chooseProfileView"]) {
+ return [NSArray arrayWithObjects: QuitItemIdentifier, NewItemIdentifier, OpenItemIdentifier, nil];
+ }
+ else if ([whichView isEqual: @"preferencesView"]) {
+ return [NSArray arrayWithObjects: QuitItemIdentifier, SaveItemIdentifier, CancelItemIdentifier, nil];
+ }
+ else if ([whichView isEqual: @"ConnectingView"]) {
+ return [NSArray arrayWithObjects: QuitItemIdentifier, nil];
+ }
+ else if ([whichView isEqual: @"updatesView"]) {
+ return [NSArray arrayWithObjects: QuitItemIdentifier,
+ RestartItemIdentifier,
+ NSToolbarSpaceItemIdentifier,
+ GoItemIdentifier,
+ RescanItemIdentifier,
+ NSToolbarSpaceItemIdentifier,
+ RToLItemIdentifier, MergeItemIdentifier, LToRItemIdentifier,
+ SkipItemIdentifier,
+ NSToolbarSpaceItemIdentifier,
+ DiffItemIdentifier,
+ TableModeIdentifier, nil];
+ }
+ else {
+ return [NSArray arrayWithObjects: QuitItemIdentifier, Nil];
+ }
+}
+
+- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar {
+ return [NSArray arrayWithObjects: QuitItemIdentifier, NewItemIdentifier, OpenItemIdentifier, nil];
+}
+
+- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar {
+ return [NSArray arrayWithObjects: QuitItemIdentifier, OpenItemIdentifier, NewItemIdentifier,
+ CancelItemIdentifier, SaveItemIdentifier,
+ GoItemIdentifier, RestartItemIdentifier, RescanItemIdentifier,
+ RToLItemIdentifier, MergeItemIdentifier, LToRItemIdentifier,
+ SkipItemIdentifier, DiffItemIdentifier,
+ NSToolbarSpaceItemIdentifier, nil];
+}
+
+- (void) setView: (NSString *) whichView {
+ if ([whichView isEqual:currentView]) return;
+
+ currentView = whichView;
+
+ int i;
+ NSArray *identifiers;
+ NSString *oldIdentifier;
+ NSString *newIdentifier;
+
+ identifiers=[self itemIdentifiersForView:whichView];
+ for (i=0; i<[identifiers count]; i++) {
+ newIdentifier = [identifiers objectAtIndex:i];
+ if (i<[[self items] count]) {
+ oldIdentifier = [[[self items] objectAtIndex:i] itemIdentifier];
+ if ([newIdentifier isEqual: oldIdentifier] ) {
+ [[[self items] objectAtIndex:i] setEnabled:YES];
+ }
+ else {
+ [self removeItemAtIndex:i];
+ [self insertItemWithItemIdentifier:newIdentifier atIndex:i];
+ }
+ }
+ else {
+ [self insertItemWithItemIdentifier:newIdentifier atIndex:i];
+ }
+ }
+ while ([[self items] count] > [identifiers count]) {
+ [self removeItemAtIndex:[identifiers count]];
+ }
+}
+
+ at end
Added: trunk/src/uimac14/cltool.c
===================================================================
--- trunk/src/uimac14/cltool.c (rev 0)
+++ trunk/src/uimac14/cltool.c 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,67 @@
+/* cltool.c
+
+ This is a command-line tool for Mac OS X that looks up the unison
+ application, where ever it has been installed, and runs it. This
+ is intended to be installed in a standard place (e.g.,
+ /usr/bin/unison) to make it easy to invoke unison as a server, or
+ to use unison from the command line when it has been installed with
+ a GUI.
+
+ */
+
+#import <CoreServices/CoreServices.h>
+#import <ApplicationServices/ApplicationServices.h>
+#include <stdio.h>
+
+#define BUFSIZE 1024
+#define EXECPATH "/Contents/MacOS/Unison"
+
+int main(int argc, char **argv) {
+
+ /* Look up the application by its bundle identifier, which is given
+ in the Info.plist file. This will continue to work even if the
+ user changes the name of the application, unlike
+ fullPathForApplication. */
+
+ FSRef fsref;
+ OSStatus status;
+ int len;
+ char buf[BUFSIZE];
+
+ status = LSFindApplicationForInfo(kLSUnknownCreator,CFSTR("edu.upenn.cis.Unison"),NULL,&fsref,NULL);
+ if (status) {
+ if (status == kLSApplicationNotFoundErr) {
+ fprintf(stderr,"Error: can't find the Unison application using the Launch Services database.\n");
+ fprintf(stderr,"Try launching Unison from the Finder, and then try this again.\n",status);
+ }
+ else fprintf(stderr,"Error: can't find Unison application (%ld).\n",status);
+ exit(1);
+ }
+
+ status = FSRefMakePath(&fsref,(UInt8 *)buf,BUFSIZE);
+ if (status) {
+ fprintf(stderr,"Error: problem building path to Unison application (%ld).\n",status);
+ exit(1);
+ }
+
+ len = strlen(buf);
+ if (len + strlen(EXECPATH) + 1 > BUFSIZE) {
+ fprintf(stderr,"Error: path to Unison application exceeds internal buffer size (%d).\n",BUFSIZE);
+ exit(1);
+ }
+ strcat(buf,EXECPATH);
+
+ /* It's important to pass the absolute path on to the GUI,
+ that's how it knows where to find the bundle, e.g., the
+ Info.plist file. */
+ argv[0] = buf;
+
+ // printf("The Unison executable is at %s\n",argv[0]);
+ // printf("Running...\n");
+
+ execv(argv[0],argv);
+
+ /* If we get here the execv has failed; print an error message to stderr */
+ perror("unison");
+ exit(1);
+}
Added: trunk/src/uimac14/main.m
===================================================================
--- trunk/src/uimac14/main.m (rev 0)
+++ trunk/src/uimac14/main.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,53 @@
+//
+// main.m
+// uimac
+//
+// Created by Trevor Jim on Sun Aug 17 2003.
+// Copyright (c) 2003, see file COPYING for details.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "Bridge.h"
+
+int main(int argc, const char *argv[])
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ int i;
+
+ /* When you click-start or use the open command, the program is invoked with
+ a command-line arg of the form -psn_XXXXXXXXX. The XXXXXXXX is a "process
+ serial number" and it seems to be important for Carbon programs. We need
+ to get rid of it if it's there so the ocaml code won't exit. Note, the
+ extra arg is not added if the binary is invoked directly from the command
+ line without using the open command. */
+ if (argc == 2 && strncmp(argv[1],"-psn_",5) == 0) {
+ argc--;
+ argv[1] = NULL;
+ }
+
+ [Bridge startup:argv];
+
+ /* Check for invocations that don't start up the gui */
+ for (i=1; i<argc; i++) {
+ if (!strcmp(argv[i],"-doc") ||
+ !strcmp(argv[i],"-help") ||
+ !strcmp(argv[i],"-version") ||
+ !strcmp(argv[i],"-server") ||
+ !strcmp(argv[i],"-socket") ||
+ !strcmp(argv[i],"-ui")) {
+ NSLog(@"Calling nonGuiStartup");
+ @try {
+ ocamlCall("x", "unisonNonGuiStartup");
+ } @catch (NSException *ex) {
+ NSLog(@"Uncaught exception: %@", [ex reason]);
+ exit(1);
+ }
+ /* If we get here without exiting first, the non GUI startup detected a
+ -ui graphic or command-line profile, and we should in fact start the GUI. */
+ }
+ }
+
+ /* go! */
+ [pool release];
+ return NSApplicationMain(argc, argv);
+}
Added: trunk/src/uimac14/progressicons/ProgressBarAdvanced.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarAdvanced.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarAdvanced.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarAdvanced.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarAdvanced.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarBlue.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarBlue.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarBlue.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarBlue.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarBlue.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarEndAdvanced.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarEndAdvanced.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarEndAdvanced.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarEndAdvanced.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarEndAdvanced.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarEndBlue.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarEndBlue.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarEndBlue.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarEndBlue.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarEndBlue.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarEndGray.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarEndGray.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarEndGray.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarEndGray.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarEndGray.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarEndGreen.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarEndGreen.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarEndGreen.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarEndGreen.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarEndGreen.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarEndWhite.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarEndWhite.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarEndWhite.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarEndWhite.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarEndWhite.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarGray.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarGray.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarGray.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarGray.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarGray.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarGreen.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarGreen.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarGreen.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarGreen.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarGreen.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarLightGreen.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarLightGreen.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarLightGreen.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarLightGreen.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarLightGreen.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/progressicons/ProgressBarWhite.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/progressicons/ProgressBarWhite.png
===================================================================
--- trunk/src/uimac14/progressicons/ProgressBarWhite.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/progressicons/ProgressBarWhite.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/progressicons/ProgressBarWhite.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/ssselectabletoolbar/README
===================================================================
--- trunk/src/uimac14/ssselectabletoolbar/README (rev 0)
+++ trunk/src/uimac14/ssselectabletoolbar/README 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,58 @@
+SSSelectable Toolbar
+--------------------
+
+Copyright (c) 2011 Steve Streeting
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Why?
+----
+
+I needed a preference-pane style selectable toolbar which switched views easily,
+allowing different sizes per pane, and not requiring a lot of manual code. I
+wanted to do most of the work in Interface Builder still.
+
+I liked the selectable toolbar in BWToolkit, but it had a few issues such as
+crashing Interface Builder, getting the vertical position wrong at times, and
+also that in XCode 4, Interface Builder plugins are no longer supported. So I
+needed a selectable toolbar that worked in IB without any plugins.
+
+How to use
+----------
+
+1) Add all the source files in the 'toolbar' subfolder to your XCode project
+2) In Interface Builder, drag & drop an NSToolbar on to your window
+3) Change the type to 'SSSelectableToolbar'
+4) Connect the 'window' outlet of the toolbar to the parent window
+5) Drag & drop NSToolbarItem instances on to the toolbar and check the
+ 'Selectable' option
+6) Change the type of each one to 'SSSelectableToolbarItem'
+7) Create a Custom View instance at the root of the document (not in the window)
+ for each pane and populate them how you like
+8) Connect the 'linkedView' outlet of each toolbar item to the corresponding
+ pane view
+9) Connect the 'nextKeyView' outlet of each custom view to the control that
+ should become the first responder when switching to that tab (Optional)
+
+And you're ready to go. Each toolbar item will switch to its corresponding pane,
+resizing the window as necessary. You can make the window resizable if you like,
+and the user size will be remembered when switching back and forth.
+
+
+
+
Added: trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.h
===================================================================
--- trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.h (rev 0)
+++ trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,27 @@
+//
+// SSToolbar.h
+// SelectableToolbarHelper
+//
+// Created by Steven Streeting on 19/06/2011.
+// Copyright 2011 Torus Knot Software Ltd. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+ at interface SSSelectableToolbar : NSToolbar
+{
+ NSWindow* window;
+ NSView* blankView;
+ NSInteger defaultItemIndex;
+}
+ at property (nonatomic, retain) IBOutlet NSWindow* window;
+ at property (nonatomic, assign) NSInteger defaultItemIndex;
+
+-(NSToolbarItem*)itemWithIdentifier:(NSString*)identifier;
+// select the item with the given index, ordered as per the palette and ignoring
+// all types of buttons except SSSelectableToolbarItem
+-(void)selectItemWithIndex:(NSInteger)idx;
+// Convert a selectable item index (ignoring all except selectable items in palette)
+// to a main index which can be used for other purposes
+-(NSInteger)selectableItemIndexToMainIndex:(NSInteger)idx;
+ at end
Added: trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.m
===================================================================
--- trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.m (rev 0)
+++ trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbar.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,157 @@
+//
+// SSToolbar.m
+// SelectableToolbarHelper
+//
+// Created by Steven Streeting on 19/06/2011.
+// Copyright 2011 Torus Knot Software Ltd. All rights reserved.
+//
+
+#import "SSSelectableToolbar.h"
+#import "SSSelectableToolbarItem.h"
+
+
+ at implementation SSSelectableToolbar
+ at synthesize window;
+ at synthesize defaultItemIndex;
+
+- (id) initWithIdentifier:(NSString *)identifier
+{
+ if (self = [super initWithIdentifier:identifier])
+ {
+ blankView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
+ }
+ return self;
+}
+
+- (void) dealloc
+{
+ [blankView release];
+ [window release];
+ [super dealloc];
+
+}
+-(IBAction)toolbarItemClicked:sender
+{
+ // this is really only here so I can set up a target / action which makes button clickable
+}
+
+-(void)selectDefaultItem:sender
+{
+ // select the default item first time becomes key
+ [self selectItemWithIndex:defaultItemIndex];
+ // Don't tell us again
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidBecomeKeyNotification object:window];
+
+}
+
+-(void) awakeFromNib
+{
+ // Set target / action on all buttons to make them clickable
+ NSArray* items = [self visibleItems];
+ for (NSToolbarItem* item in items)
+ {
+ if ([item isKindOfClass:[SSSelectableToolbarItem class]])
+ {
+ [item setTarget:self];
+ [item setAction:@selector(toolbarItemClicked:)];
+ }
+ }
+
+ // Wait until window displayed before sizing (important for displaying in sheets)
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(selectDefaultItem:)
+ name:NSWindowDidBecomeKeyNotification
+ object:window];
+
+
+}
+
+-(NSToolbarItem*)itemWithIdentifier:(NSString*)identifier
+{
+ for (NSToolbarItem* item in [self items])
+ {
+ if ([[item itemIdentifier] isEqual:identifier])
+ return item;
+ }
+ return nil;
+}
+
+- (void)setSelectedItemIdentifier:(NSString *)itemIdentifier
+{
+ [super setSelectedItemIdentifier:itemIdentifier];
+
+ NSToolbarItem* item = [self itemWithIdentifier:itemIdentifier];
+ if ([item isKindOfClass:[SSSelectableToolbarItem class]])
+ {
+ SSSelectableToolbarItem* ssitem = (SSSelectableToolbarItem*)item;
+
+ NSView* view = [ssitem linkedView];
+ if (view && window)
+ {
+ NSView* oldView = [window contentView];
+ NSRect oldFrame = [oldView frame];
+ NSRect newFrame = [view frame];
+ NSRect oldWinFrame = [window frame];
+ NSRect winFrame = oldWinFrame;
+ float toolbarHeight = NSHeight(oldWinFrame) - NSHeight(oldFrame);
+
+ // resize
+ winFrame.size.width = newFrame.size.width;
+ winFrame.size.height = newFrame.size.height + toolbarHeight;
+ winFrame.origin.y -= NSHeight(winFrame) - NSHeight(oldWinFrame);
+ [window setContentView:blankView];
+ [window setFrame:winFrame display:YES animate:YES];
+ [window setContentView:view];
+
+ // change title
+ [window setTitle:[ssitem label]];
+
+ // tab to first control (if nextKeyView connected)
+ NSView* keyView = [view nextKeyView];
+ if (keyView)
+ [window makeFirstResponder:keyView];
+
+
+ }
+ }
+}
+
+-(void)selectItemWithIndex:(NSInteger)idx
+{
+ NSInteger currIdx = 0;
+ for (NSToolbarItem* item in [self items])
+ {
+ if ([item isKindOfClass:[SSSelectableToolbarItem class]])
+ {
+ if (currIdx == idx)
+ {
+ [self setSelectedItemIdentifier:[item itemIdentifier]];
+ return;
+ }
+ // We're only counting these types, ignore spacing and other default items
+ ++currIdx;
+ }
+ }
+
+}
+
+-(NSInteger)selectableItemIndexToMainIndex:(NSInteger)idx
+{
+ NSInteger selIdx = 0;
+ NSInteger mainIdx = 0;
+ for (NSToolbarItem* item in [self items])
+ {
+ if ([item isKindOfClass:[SSSelectableToolbarItem class]])
+ {
+ if (selIdx == idx)
+ {
+ return mainIdx;
+ }
+ ++selIdx;
+ }
+ ++mainIdx;
+ }
+
+ return -1;
+}
+ at end
Added: trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.h
===================================================================
--- trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.h (rev 0)
+++ trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.h 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,19 @@
+//
+// SSToolbarItem.h
+// SelectableToolbarHelper
+//
+// Created by Steven Streeting on 19/06/2011.
+// Copyright 2011 Torus Knot Software Ltd. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+
+ at interface SSSelectableToolbarItem : NSToolbarItem
+{
+ NSView* linkedView;
+}
+
+ at property (nonatomic, retain) IBOutlet NSView* linkedView;
+
+ at end
Added: trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.m
===================================================================
--- trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.m (rev 0)
+++ trunk/src/uimac14/ssselectabletoolbar/SSSelectableToolbarItem.m 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,22 @@
+//
+// SSToolbarItem.m
+// SelectableToolbarHelper
+//
+// Created by Steven Streeting on 19/06/2011.
+// Copyright 2011 Torus Knot Software Ltd. All rights reserved.
+//
+
+#import "SSSelectableToolbarItem.h"
+
+
+ at implementation SSSelectableToolbarItem
+
+ at synthesize linkedView;
+
+-(void) dealloc
+{
+ [linkedView release];
+ [super dealloc];
+}
+
+ at end
Added: trunk/src/uimac14/tableicons/Change_Absent.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Change_Absent.png
===================================================================
--- trunk/src/uimac14/tableicons/Change_Absent.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Change_Absent.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Change_Absent.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Change_Created.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Change_Created.png
===================================================================
--- trunk/src/uimac14/tableicons/Change_Created.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Change_Created.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Change_Created.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Change_Deleted.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Change_Deleted.png
===================================================================
--- trunk/src/uimac14/tableicons/Change_Deleted.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Change_Deleted.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Change_Deleted.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Change_Modified.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Change_Modified.png
===================================================================
--- trunk/src/uimac14/tableicons/Change_Modified.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Change_Modified.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Change_Modified.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Change_PropsChanged.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Change_PropsChanged.png
===================================================================
--- trunk/src/uimac14/tableicons/Change_PropsChanged.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Change_PropsChanged.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Change_PropsChanged.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Change_Unmodified.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Change_Unmodified.png
===================================================================
--- trunk/src/uimac14/tableicons/Change_Unmodified.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Change_Unmodified.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Change_Unmodified.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Outline-Deep.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Outline-Deep.png
===================================================================
--- trunk/src/uimac14/tableicons/Outline-Deep.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Outline-Deep.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Outline-Deep.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Outline-Flat.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Outline-Flat.png
===================================================================
--- trunk/src/uimac14/tableicons/Outline-Flat.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Outline-Flat.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Outline-Flat.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/Outline-Flattened.png
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/Outline-Flattened.png
===================================================================
--- trunk/src/uimac14/tableicons/Outline-Flattened.png 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/Outline-Flattened.png 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/Outline-Flattened.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-conflict.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-conflict.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-conflict.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-conflict.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-conflict.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-error.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-error.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-error.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-error.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-error.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-left-blue.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-left-blue.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-left-blue.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-left-blue.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-left-blue.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-left-green.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-left-green.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-left-green.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-left-green.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-left-green.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-merge.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-merge.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-merge.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-merge.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-merge.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-mixed.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-mixed.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-mixed.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-mixed.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-mixed.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-right-blue.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-right-blue.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-right-blue.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-right-blue.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-right-blue.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-right-green.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-right-green.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-right-green.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-right-green.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-right-green.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/tableicons/table-skip.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/tableicons/table-skip.tif
===================================================================
--- trunk/src/uimac14/tableicons/table-skip.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/tableicons/table-skip.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/tableicons/table-skip.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/add.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/add.tif
===================================================================
--- trunk/src/uimac14/toolbar/add.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/add.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/add.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/diff.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/diff.tif
===================================================================
--- trunk/src/uimac14/toolbar/diff.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/diff.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/diff.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/go.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/go.tif
===================================================================
--- trunk/src/uimac14/toolbar/go.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/go.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/go.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/left.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/left.tif
===================================================================
--- trunk/src/uimac14/toolbar/left.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/left.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/left.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/merge.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/merge.tif
===================================================================
--- trunk/src/uimac14/toolbar/merge.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/merge.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/merge.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/quit.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/quit.tif
===================================================================
--- trunk/src/uimac14/toolbar/quit.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/quit.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/quit.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/rescan.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/rescan.tif
===================================================================
--- trunk/src/uimac14/toolbar/rescan.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/rescan.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/rescan.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/restart.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/restart.tif
===================================================================
--- trunk/src/uimac14/toolbar/restart.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/restart.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/restart.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/right.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/right.tif
===================================================================
--- trunk/src/uimac14/toolbar/right.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/right.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/right.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/save.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/save.tif
===================================================================
--- trunk/src/uimac14/toolbar/save.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/save.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/save.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/toolbar/skip.tif
===================================================================
(Binary files differ)
Index: trunk/src/uimac14/toolbar/skip.tif
===================================================================
--- trunk/src/uimac14/toolbar/skip.tif 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimac14/toolbar/skip.tif 2014-07-05 21:55:19 UTC (rev 527)
Property changes on: trunk/src/uimac14/toolbar/skip.tif
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/src/uimac14/uimacnew.xcodeproj/project.pbxproj
===================================================================
--- trunk/src/uimac14/uimacnew.xcodeproj/project.pbxproj (rev 0)
+++ trunk/src/uimac14/uimacnew.xcodeproj/project.pbxproj 2014-07-05 21:55:19 UTC (rev 527)
@@ -0,0 +1,796 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 2A124E780DE1C48400524237 /* Create ExternalSettings */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 2A124E7C0DE1C4A200524237 /* Build configuration list for PBXAggregateTarget "Create ExternalSettings" */;
+ buildPhases = (
+ 2A124E7E0DE1C4BE00524237 /* Run Script (version, ocaml lib dir) */,
+ );
+ dependencies = (
+ );
+ name = "Create ExternalSettings";
+ productName = "Create ExternalSettings";
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 2A3C3F7D09922D4900E404E9 /* NotificationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3C3F7B09922D4900E404E9 /* NotificationController.m */; };
+ 2E282CC80D9AE2B000439D01 /* unison-blob.o in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E282CC70D9AE2B000439D01 /* unison-blob.o */; };
+ 44042CB60BE4FC9B00A6BBB2 /* ProgressCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 44042CB40BE4FC9B00A6BBB2 /* ProgressCell.m */; };
+ 44042D1B0BE52AED00A6BBB2 /* ProgressBarAdvanced.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D100BE52AED00A6BBB2 /* ProgressBarAdvanced.png */; };
+ 44042D1C0BE52AEE00A6BBB2 /* ProgressBarBlue.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D110BE52AED00A6BBB2 /* ProgressBarBlue.png */; };
+ 44042D1D0BE52AEE00A6BBB2 /* ProgressBarEndAdvanced.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D120BE52AED00A6BBB2 /* ProgressBarEndAdvanced.png */; };
+ 44042D1E0BE52AEE00A6BBB2 /* ProgressBarEndBlue.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D130BE52AED00A6BBB2 /* ProgressBarEndBlue.png */; };
+ 44042D1F0BE52AEE00A6BBB2 /* ProgressBarEndGray.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D140BE52AED00A6BBB2 /* ProgressBarEndGray.png */; };
+ 44042D200BE52AEE00A6BBB2 /* ProgressBarEndGreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D150BE52AED00A6BBB2 /* ProgressBarEndGreen.png */; };
+ 44042D210BE52AEE00A6BBB2 /* ProgressBarEndWhite.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D160BE52AED00A6BBB2 /* ProgressBarEndWhite.png */; };
+ 44042D220BE52AEE00A6BBB2 /* ProgressBarGray.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D170BE52AED00A6BBB2 /* ProgressBarGray.png */; };
+ 44042D230BE52AEE00A6BBB2 /* ProgressBarGreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D180BE52AED00A6BBB2 /* ProgressBarGreen.png */; };
+ 44042D240BE52AEE00A6BBB2 /* ProgressBarLightGreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D190BE52AED00A6BBB2 /* ProgressBarLightGreen.png */; };
+ 44042D250BE52AEE00A6BBB2 /* ProgressBarWhite.png in Resources */ = {isa = PBXBuildFile; fileRef = 44042D1A0BE52AED00A6BBB2 /* ProgressBarWhite.png */; };
+ 440EEAF30C03EC3D00ACAAB0 /* Change_Created.png in Resources */ = {isa = PBXBuildFile; fileRef = 440EEAF20C03EC3D00ACAAB0 /* Change_Created.png */; };
+ 440EEAF90C03F0B800ACAAB0 /* Change_Deleted.png in Resources */ = {isa = PBXBuildFile; fileRef = 440EEAF60C03F0B800ACAAB0 /* Change_Deleted.png */; };
+ 440EEAFA0C03F0B800ACAAB0 /* Change_Modified.png in Resources */ = {isa = PBXBuildFile; fileRef = 440EEAF70C03F0B800ACAAB0 /* Change_Modified.png */; };
+ 440EEAFB0C03F0B800ACAAB0 /* Change_PropsChanged.png in Resources */ = {isa = PBXBuildFile; fileRef = 440EEAF80C03F0B800ACAAB0 /* Change_PropsChanged.png */; };
+ 445A291B0BFA5B3300E4E641 /* Outline-Deep.png in Resources */ = {isa = PBXBuildFile; fileRef = 445A291A0BFA5B3300E4E641 /* Outline-Deep.png */; };
+ 445A29270BFA5C1200E4E641 /* Outline-Flat.png in Resources */ = {isa = PBXBuildFile; fileRef = 445A29260BFA5C1200E4E641 /* Outline-Flat.png */; };
+ 445A29290BFA5C1B00E4E641 /* Outline-Flattened.png in Resources */ = {isa = PBXBuildFile; fileRef = 445A29280BFA5C1B00E4E641 /* Outline-Flattened.png */; };
+ 445A2A5E0BFAB6C300E4E641 /* ImageAndTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 445A2A5D0BFAB6C300E4E641 /* ImageAndTextCell.m */; };
+ 449F03E10BE00DE9003F15C8 /* Bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 449F03DF0BE00DE9003F15C8 /* Bridge.m */; };
+ 44A794A10BE16C380069680C /* ExceptionHandling.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44A794A00BE16C380069680C /* ExceptionHandling.framework */; };
+ 44A797F40BE3F9B70069680C /* table-mixed.tif in Resources */ = {isa = PBXBuildFile; fileRef = 44A797F10BE3F9B70069680C /* table-mixed.tif */; };
+ 44F472B10C0DB735006428EF /* Change_Absent.png in Resources */ = {isa = PBXBuildFile; fileRef = 44F472AF0C0DB735006428EF /* Change_Absent.png */; };
+ 44F472B20C0DB735006428EF /* Change_Unmodified.png in Resources */ = {isa = PBXBuildFile; fileRef = 44F472B00C0DB735006428EF /* Change_Unmodified.png */; };
+ 69C625E70664EC3300B3C46A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
+ 69C625E80664EC3300B3C46A /* Unison.icns in Resources */ = {isa = PBXBuildFile; fileRef = 69C625CA0664E94E00B3C46A /* Unison.icns */; };
+ 69C625EA0664EC3300B3C46A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
+ 69C625EB0664EC3300B3C46A /* MyController.m in Sources */ = {isa = PBXBuildFile; fileRef = 69660DC704F08CC100CF23A4 /* MyController.m */; };
+ 69C625EC0664EC3300B3C46A /* ProfileController.m in Sources */ = {isa = PBXBuildFile; fileRef = 690F564504F11EC300CF23A4 /* ProfileController.m */; };
+ 69C625ED0664EC3300B3C46A /* ReconItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 69D3C6F904F1CC3700CF23A4 /* ReconItem.m */; };
+ 69C625EE0664EC3300B3C46A /* ReconTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 69BA7DA904FD695200CF23A4 /* ReconTableView.m */; };
+ 69C625EF0664EC3300B3C46A /* PreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 697985CE050CFA2D00CF23A4 /* PreferencesController.m */; };
+ 69C625F00664EC3300B3C46A /* ProfileTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 691CE181051BB44A00CF23A4 /* ProfileTableView.m */; };
+ 69C625F20664EC3300B3C46A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ 69E407BA07EB95AA00D37AA1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69E407B907EB95AA00D37AA1 /* Security.framework */; };
+ 8450B1381918859E00A2C4D6 /* ColorGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8450B1371918859E00A2C4D6 /* ColorGradientView.m */; };
+ 849BE4FF191AC10E001B6FBF /* README in Resources */ = {isa = PBXBuildFile; fileRef = 849BE4FA191AC10E001B6FBF /* README */; };
+ 849BE500191AC10E001B6FBF /* SSSelectableToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 849BE4FC191AC10E001B6FBF /* SSSelectableToolbar.m */; };
+ 849BE501191AC10E001B6FBF /* SSSelectableToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 849BE4FE191AC10E001B6FBF /* SSSelectableToolbarItem.m */; };
+ B518071C09D6652100B1B21F /* add.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071209D6652100B1B21F /* add.tif */; };
+ B518071D09D6652100B1B21F /* diff.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071309D6652100B1B21F /* diff.tif */; };
+ B518071E09D6652100B1B21F /* go.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071409D6652100B1B21F /* go.tif */; };
+ B518071F09D6652100B1B21F /* left.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071509D6652100B1B21F /* left.tif */; };
+ B518072009D6652100B1B21F /* merge.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071609D6652100B1B21F /* merge.tif */; };
+ B518072109D6652100B1B21F /* quit.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071709D6652100B1B21F /* quit.tif */; };
+ B518072209D6652100B1B21F /* restart.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071809D6652100B1B21F /* restart.tif */; };
+ B518072309D6652100B1B21F /* right.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071909D6652100B1B21F /* right.tif */; };
+ B518072409D6652100B1B21F /* save.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071A09D6652100B1B21F /* save.tif */; };
+ B518072509D6652100B1B21F /* skip.tif in Resources */ = {isa = PBXBuildFile; fileRef = B518071B09D6652100B1B21F /* skip.tif */; };
+ B554004109C4E5AA0089E1C3 /* UnisonToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = B554004009C4E5AA0089E1C3 /* UnisonToolbar.m */; };
+ B5B44C1909DF61A4000DC7AF /* table-conflict.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1109DF61A4000DC7AF /* table-conflict.tif */; };
+ B5B44C1A09DF61A4000DC7AF /* table-error.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1209DF61A4000DC7AF /* table-error.tif */; };
+ B5B44C1B09DF61A4000DC7AF /* table-left-blue.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1309DF61A4000DC7AF /* table-left-blue.tif */; };
+ B5B44C1C09DF61A4000DC7AF /* table-left-green.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1409DF61A4000DC7AF /* table-left-green.tif */; };
+ B5B44C1D09DF61A4000DC7AF /* table-merge.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1509DF61A4000DC7AF /* table-merge.tif */; };
+ B5B44C1E09DF61A4000DC7AF /* table-right-blue.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1609DF61A4000DC7AF /* table-right-blue.tif */; };
+ B5B44C1F09DF61A4000DC7AF /* table-right-green.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1709DF61A4000DC7AF /* table-right-green.tif */; };
+ B5B44C2009DF61A4000DC7AF /* table-skip.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5B44C1809DF61A4000DC7AF /* table-skip.tif */; };
+ B5E03B3909E38B9E0058C7B9 /* rescan.tif in Resources */ = {isa = PBXBuildFile; fileRef = B5E03B3809E38B9E0058C7B9 /* rescan.tif */; };
+ BB1ADE26114AEB1100575BFC /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BBE2BCAC11355CDD00B187F2 /* Growl.framework */; };
+ BBE2BCAE11355CDD00B187F2 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBE2BCAC11355CDD00B187F2 /* Growl.framework */; };
+ DE2444D610C294EA007E1546 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = DE2444D410C294EA007E1546 /* MainMenu.xib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 2A124E7F0DE1C4E400524237 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 2A124E780DE1C48400524237;
+ remoteInfo = "Create ExternalSettings";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 2A3C3F3709922AA600E404E9 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ BB1ADE26114AEB1100575BFC /* Growl.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ BB6E50CF10CAA57600E23F8A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 7;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 2A3C3F7A09922D4900E404E9 /* NotificationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotificationController.h; sourceTree = "<group>"; };
+ 2A3C3F7B09922D4900E404E9 /* NotificationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotificationController.m; sourceTree = "<group>"; };
+ 2E282CC70D9AE2B000439D01 /* unison-blob.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; name = "unison-blob.o"; path = "../unison-blob.o"; sourceTree = SOURCE_ROOT; };
+ 2E282CCC0D9AE2E800439D01 /* ExternalSettings.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ExternalSettings.xcconfig; sourceTree = "<group>"; };
+ 44042CB30BE4FC9B00A6BBB2 /* ProgressCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ProgressCell.h; sourceTree = "<group>"; };
+ 44042CB40BE4FC9B00A6BBB2 /* ProgressCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ProgressCell.m; sourceTree = "<group>"; };
+ 44042D100BE52AED00A6BBB2 /* ProgressBarAdvanced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarAdvanced.png; path = progressicons/ProgressBarAdvanced.png; sourceTree = "<group>"; };
+ 44042D110BE52AED00A6BBB2 /* ProgressBarBlue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarBlue.png; path = progressicons/ProgressBarBlue.png; sourceTree = "<group>"; };
+ 44042D120BE52AED00A6BBB2 /* ProgressBarEndAdvanced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarEndAdvanced.png; path = progressicons/ProgressBarEndAdvanced.png; sourceTree = "<group>"; };
+ 44042D130BE52AED00A6BBB2 /* ProgressBarEndBlue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarEndBlue.png; path = progressicons/ProgressBarEndBlue.png; sourceTree = "<group>"; };
+ 44042D140BE52AED00A6BBB2 /* ProgressBarEndGray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarEndGray.png; path = progressicons/ProgressBarEndGray.png; sourceTree = "<group>"; };
+ 44042D150BE52AED00A6BBB2 /* ProgressBarEndGreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarEndGreen.png; path = progressicons/ProgressBarEndGreen.png; sourceTree = "<group>"; };
+ 44042D160BE52AED00A6BBB2 /* ProgressBarEndWhite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarEndWhite.png; path = progressicons/ProgressBarEndWhite.png; sourceTree = "<group>"; };
+ 44042D170BE52AED00A6BBB2 /* ProgressBarGray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarGray.png; path = progressicons/ProgressBarGray.png; sourceTree = "<group>"; };
+ 44042D180BE52AED00A6BBB2 /* ProgressBarGreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarGreen.png; path = progressicons/ProgressBarGreen.png; sourceTree = "<group>"; };
+ 44042D190BE52AED00A6BBB2 /* ProgressBarLightGreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarLightGreen.png; path = progressicons/ProgressBarLightGreen.png; sourceTree = "<group>"; };
+ 44042D1A0BE52AED00A6BBB2 /* ProgressBarWhite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ProgressBarWhite.png; path = progressicons/ProgressBarWhite.png; sourceTree = "<group>"; };
+ 440EEAF20C03EC3D00ACAAB0 /* Change_Created.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Change_Created.png; sourceTree = "<group>"; };
+ 440EEAF60C03F0B800ACAAB0 /* Change_Deleted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Change_Deleted.png; sourceTree = "<group>"; };
+ 440EEAF70C03F0B800ACAAB0 /* Change_Modified.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Change_Modified.png; sourceTree = "<group>"; };
+ 440EEAF80C03F0B800ACAAB0 /* Change_PropsChanged.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Change_PropsChanged.png; sourceTree = "<group>"; };
+ 445A291A0BFA5B3300E4E641 /* Outline-Deep.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Outline-Deep.png"; sourceTree = "<group>"; };
+ 445A29260BFA5C1200E4E641 /* Outline-Flat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Outline-Flat.png"; sourceTree = "<group>"; };
+ 445A29280BFA5C1B00E4E641 /* Outline-Flattened.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Outline-Flattened.png"; sourceTree = "<group>"; };
+ 445A2A5B0BFAB6A100E4E641 /* ImageAndTextCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ImageAndTextCell.h; sourceTree = "<group>"; };
+ 445A2A5D0BFAB6C300E4E641 /* ImageAndTextCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ImageAndTextCell.m; sourceTree = "<group>"; };
+ 449F03DE0BE00DE9003F15C8 /* Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bridge.h; sourceTree = "<group>"; };
+ 449F03DF0BE00DE9003F15C8 /* Bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Bridge.m; sourceTree = "<group>"; };
+ 44A794A00BE16C380069680C /* ExceptionHandling.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExceptionHandling.framework; path = /System/Library/Frameworks/ExceptionHandling.framework; sourceTree = "<absolute>"; };
+ 44A797F10BE3F9B70069680C /* table-mixed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-mixed.tif"; sourceTree = "<group>"; };
+ 44F472AF0C0DB735006428EF /* Change_Absent.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Change_Absent.png; sourceTree = "<group>"; };
+ 44F472B00C0DB735006428EF /* Change_Unmodified.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Change_Unmodified.png; sourceTree = "<group>"; };
+ 690F564404F11EC300CF23A4 /* ProfileController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ProfileController.h; sourceTree = "<group>"; };
+ 690F564504F11EC300CF23A4 /* ProfileController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ProfileController.m; sourceTree = "<group>"; };
+ 691CE180051BB44A00CF23A4 /* ProfileTableView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ProfileTableView.h; sourceTree = "<group>"; };
+ 691CE181051BB44A00CF23A4 /* ProfileTableView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ProfileTableView.m; sourceTree = "<group>"; };
+ 69660DC604F08CC100CF23A4 /* MyController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MyController.h; sourceTree = "<group>"; };
+ 69660DC704F08CC100CF23A4 /* MyController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MyController.m; sourceTree = "<group>"; };
+ 697985CD050CFA2D00CF23A4 /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PreferencesController.h; sourceTree = "<group>"; };
+ 697985CE050CFA2D00CF23A4 /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PreferencesController.m; sourceTree = "<group>"; };
+ 69BA7DA804FD695200CF23A4 /* ReconTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReconTableView.h; sourceTree = "<group>"; };
+ 69BA7DA904FD695200CF23A4 /* ReconTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReconTableView.m; sourceTree = "<group>"; };
+ 69C625CA0664E94E00B3C46A /* Unison.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Unison.icns; sourceTree = "<group>"; };
+ 69C625F40664EC3300B3C46A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 69C625F50664EC3300B3C46A /* Unison.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Unison.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 69D3C6F904F1CC3700CF23A4 /* ReconItem.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ReconItem.m; sourceTree = "<group>"; };
+ 69D3C6FA04F1CC3700CF23A4 /* ReconItem.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ReconItem.h; sourceTree = "<group>"; };
+ 69E407B907EB95AA00D37AA1 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; };
+ 8450B1361918859E00A2C4D6 /* ColorGradientView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorGradientView.h; sourceTree = "<group>"; };
+ 8450B1371918859E00A2C4D6 /* ColorGradientView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ColorGradientView.m; sourceTree = "<group>"; };
+ 849BE4FA191AC10E001B6FBF /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
+ 849BE4FB191AC10E001B6FBF /* SSSelectableToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSSelectableToolbar.h; sourceTree = "<group>"; };
+ 849BE4FC191AC10E001B6FBF /* SSSelectableToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSSelectableToolbar.m; sourceTree = "<group>"; };
+ 849BE4FD191AC10E001B6FBF /* SSSelectableToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSSelectableToolbarItem.h; sourceTree = "<group>"; };
+ 849BE4FE191AC10E001B6FBF /* SSSelectableToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSSelectableToolbarItem.m; sourceTree = "<group>"; };
+ B518071209D6652100B1B21F /* add.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = add.tif; sourceTree = "<group>"; };
+ B518071309D6652100B1B21F /* diff.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = diff.tif; sourceTree = "<group>"; };
+ B518071409D6652100B1B21F /* go.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = go.tif; sourceTree = "<group>"; };
+ B518071509D6652100B1B21F /* left.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = left.tif; sourceTree = "<group>"; };
+ B518071609D6652100B1B21F /* merge.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = merge.tif; sourceTree = "<group>"; };
+ B518071709D6652100B1B21F /* quit.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = quit.tif; sourceTree = "<group>"; };
+ B518071809D6652100B1B21F /* restart.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = restart.tif; sourceTree = "<group>"; };
+ B518071909D6652100B1B21F /* right.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = right.tif; sourceTree = "<group>"; };
+ B518071A09D6652100B1B21F /* save.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = save.tif; sourceTree = "<group>"; };
+ B518071B09D6652100B1B21F /* skip.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = skip.tif; sourceTree = "<group>"; };
+ B554003E09C4E5A00089E1C3 /* UnisonToolbar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = UnisonToolbar.h; sourceTree = "<group>"; };
+ B554004009C4E5AA0089E1C3 /* UnisonToolbar.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = UnisonToolbar.m; sourceTree = "<group>"; };
+ B5B44C1109DF61A4000DC7AF /* table-conflict.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-conflict.tif"; sourceTree = "<group>"; };
+ B5B44C1209DF61A4000DC7AF /* table-error.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-error.tif"; sourceTree = "<group>"; };
+ B5B44C1309DF61A4000DC7AF /* table-left-blue.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-left-blue.tif"; sourceTree = "<group>"; };
+ B5B44C1409DF61A4000DC7AF /* table-left-green.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-left-green.tif"; sourceTree = "<group>"; };
+ B5B44C1509DF61A4000DC7AF /* table-merge.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-merge.tif"; sourceTree = "<group>"; };
+ B5B44C1609DF61A4000DC7AF /* table-right-blue.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-right-blue.tif"; sourceTree = "<group>"; };
+ B5B44C1709DF61A4000DC7AF /* table-right-green.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-right-green.tif"; sourceTree = "<group>"; };
+ B5B44C1809DF61A4000DC7AF /* table-skip.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-skip.tif"; sourceTree = "<group>"; };
+ B5E03B3809E38B9E0058C7B9 /* rescan.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = rescan.tif; sourceTree = "<group>"; };
+ BBE2BCAC11355CDD00B187F2 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = Frameworks/Growl.framework; sourceTree = "<group>"; };
+ DE2444D510C294EA007E1546 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 69C625F10664EC3300B3C46A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 69C625F20664EC3300B3C46A /* Cocoa.framework in Frameworks */,
+ 69E407BA07EB95AA00D37AA1 /* Security.framework in Frameworks */,
+ 44A794A10BE16C380069680C /* ExceptionHandling.framework in Frameworks */,
+ 2E282CC80D9AE2B000439D01 /* unison-blob.o in Frameworks */,
+ BBE2BCAE11355CDD00B187F2 /* Growl.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 69C625F50664EC3300B3C46A /* Unison.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* uimac */ = {
+ isa = PBXGroup;
+ children = (
+ 44042D0F0BE52AD700A6BBB2 /* progressicons */,
+ B5B44C1009DF61A4000DC7AF /* tableicons */,
+ B518071109D6652000B1B21F /* toolbar */,
+ 44A795C90BE2B91B0069680C /* Classes */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ 69C625F40664EC3300B3C46A /* Info.plist */,
+ 2E282CCC0D9AE2E800439D01 /* ExternalSettings.xcconfig */,
+ 2E282CB80D9AE16300439D01 /* External objects */,
+ );
+ name = uimac;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ DE2444D410C294EA007E1546 /* MainMenu.xib */,
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
+ 69C625CA0664E94E00B3C46A /* Unison.icns */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
+ BBE2BCAC11355CDD00B187F2 /* Growl.framework */,
+ 44A794A00BE16C380069680C /* ExceptionHandling.framework */,
+ 69E407B907EB95AA00D37AA1 /* Security.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 2E282CB80D9AE16300439D01 /* External objects */ = {
+ isa = PBXGroup;
+ children = (
+ 2E282CC70D9AE2B000439D01 /* unison-blob.o */,
+ );
+ name = "External objects";
+ sourceTree = "<group>";
+ };
+ 44042D0F0BE52AD700A6BBB2 /* progressicons */ = {
+ isa = PBXGroup;
+ children = (
+ 44042D100BE52AED00A6BBB2 /* ProgressBarAdvanced.png */,
+ 44042D110BE52AED00A6BBB2 /* ProgressBarBlue.png */,
+ 44042D120BE52AED00A6BBB2 /* ProgressBarEndAdvanced.png */,
+ 44042D130BE52AED00A6BBB2 /* ProgressBarEndBlue.png */,
+ 44042D140BE52AED00A6BBB2 /* ProgressBarEndGray.png */,
+ 44042D150BE52AED00A6BBB2 /* ProgressBarEndGreen.png */,
+ 44042D160BE52AED00A6BBB2 /* ProgressBarEndWhite.png */,
+ 44042D170BE52AED00A6BBB2 /* ProgressBarGray.png */,
+ 44042D180BE52AED00A6BBB2 /* ProgressBarGreen.png */,
+ 44042D190BE52AED00A6BBB2 /* ProgressBarLightGreen.png */,
+ 44042D1A0BE52AED00A6BBB2 /* ProgressBarWhite.png */,
+ );
+ name = progressicons;
+ sourceTree = "<group>";
+ };
+ 44A795C90BE2B91B0069680C /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 849BE4F9191AC10E001B6FBF /* ssselectabletoolbar */,
+ 8450B1361918859E00A2C4D6 /* ColorGradientView.h */,
+ 8450B1371918859E00A2C4D6 /* ColorGradientView.m */,
+ 69660DC604F08CC100CF23A4 /* MyController.h */,
+ 69660DC704F08CC100CF23A4 /* MyController.m */,
+ 2A3C3F7A09922D4900E404E9 /* NotificationController.h */,
+ 2A3C3F7B09922D4900E404E9 /* NotificationController.m */,
+ 69BA7DA804FD695200CF23A4 /* ReconTableView.h */,
+ 69BA7DA904FD695200CF23A4 /* ReconTableView.m */,
+ 69D3C6FA04F1CC3700CF23A4 /* ReconItem.h */,
+ 69D3C6F904F1CC3700CF23A4 /* ReconItem.m */,
+ 445A2A5B0BFAB6A100E4E641 /* ImageAndTextCell.h */,
+ 445A2A5D0BFAB6C300E4E641 /* ImageAndTextCell.m */,
+ 44042CB30BE4FC9B00A6BBB2 /* ProgressCell.h */,
+ 44042CB40BE4FC9B00A6BBB2 /* ProgressCell.m */,
+ 690F564404F11EC300CF23A4 /* ProfileController.h */,
+ 690F564504F11EC300CF23A4 /* ProfileController.m */,
+ 697985CD050CFA2D00CF23A4 /* PreferencesController.h */,
+ 697985CE050CFA2D00CF23A4 /* PreferencesController.m */,
+ 691CE180051BB44A00CF23A4 /* ProfileTableView.h */,
+ 691CE181051BB44A00CF23A4 /* ProfileTableView.m */,
+ B554003E09C4E5A00089E1C3 /* UnisonToolbar.h */,
+ B554004009C4E5AA0089E1C3 /* UnisonToolbar.m */,
+ 449F03DE0BE00DE9003F15C8 /* Bridge.h */,
+ 449F03DF0BE00DE9003F15C8 /* Bridge.m */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 849BE4F9191AC10E001B6FBF /* ssselectabletoolbar */ = {
+ isa = PBXGroup;
+ children = (
+ 849BE4FA191AC10E001B6FBF /* README */,
+ 849BE4FB191AC10E001B6FBF /* SSSelectableToolbar.h */,
+ 849BE4FC191AC10E001B6FBF /* SSSelectableToolbar.m */,
+ 849BE4FD191AC10E001B6FBF /* SSSelectableToolbarItem.h */,
+ 849BE4FE191AC10E001B6FBF /* SSSelectableToolbarItem.m */,
+ );
+ path = ssselectabletoolbar;
+ sourceTree = "<group>";
+ };
+ B518071109D6652000B1B21F /* toolbar */ = {
+ isa = PBXGroup;
+ children = (
+ B5E03B3809E38B9E0058C7B9 /* rescan.tif */,
+ B518071209D6652100B1B21F /* add.tif */,
+ B518071309D6652100B1B21F /* diff.tif */,
+ B518071409D6652100B1B21F /* go.tif */,
+ B518071509D6652100B1B21F /* left.tif */,
+ B518071609D6652100B1B21F /* merge.tif */,
+ B518071709D6652100B1B21F /* quit.tif */,
+ B518071809D6652100B1B21F /* restart.tif */,
+ B518071909D6652100B1B21F /* right.tif */,
+ B518071A09D6652100B1B21F /* save.tif */,
+ B518071B09D6652100B1B21F /* skip.tif */,
+ );
+ path = toolbar;
+ sourceTree = "<group>";
+ };
+ B5B44C1009DF61A4000DC7AF /* tableicons */ = {
+ isa = PBXGroup;
+ children = (
+ 44F472AF0C0DB735006428EF /* Change_Absent.png */,
+ 44F472B00C0DB735006428EF /* Change_Unmodified.png */,
+ 440EEAF60C03F0B800ACAAB0 /* Change_Deleted.png */,
+ 440EEAF70C03F0B800ACAAB0 /* Change_Modified.png */,
+ 440EEAF80C03F0B800ACAAB0 /* Change_PropsChanged.png */,
+ 440EEAF20C03EC3D00ACAAB0 /* Change_Created.png */,
+ 44A797F10BE3F9B70069680C /* table-mixed.tif */,
+ B5B44C1109DF61A4000DC7AF /* table-conflict.tif */,
+ B5B44C1209DF61A4000DC7AF /* table-error.tif */,
+ B5B44C1309DF61A4000DC7AF /* table-left-blue.tif */,
+ B5B44C1409DF61A4000DC7AF /* table-left-green.tif */,
+ B5B44C1509DF61A4000DC7AF /* table-merge.tif */,
+ B5B44C1609DF61A4000DC7AF /* table-right-blue.tif */,
+ B5B44C1709DF61A4000DC7AF /* table-right-green.tif */,
+ B5B44C1809DF61A4000DC7AF /* table-skip.tif */,
+ 445A291A0BFA5B3300E4E641 /* Outline-Deep.png */,
+ 445A29260BFA5C1200E4E641 /* Outline-Flat.png */,
+ 445A29280BFA5C1B00E4E641 /* Outline-Flattened.png */,
+ );
+ path = tableicons;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 69C625DD0664EC3300B3C46A /* uimac */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 2A3C3F280992245300E404E9 /* Build configuration list for PBXNativeTarget "uimac" */;
+ buildPhases = (
+ 2E282CBA0D9AE17300439D01 /* Run Script (make unison-blob.o) */,
+ 69C625E50664EC3300B3C46A /* Resources */,
+ 69C625E90664EC3300B3C46A /* Sources */,
+ 69C625F10664EC3300B3C46A /* Frameworks */,
+ 2A3C3F3709922AA600E404E9 /* CopyFiles */,
+ BB6E50CF10CAA57600E23F8A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 2A124E800DE1C4E400524237 /* PBXTargetDependency */,
+ );
+ name = uimac;
+ productInstallPath = "$(HOME)/Applications";
+ productName = uimac;
+ productReference = 69C625F50664EC3300B3C46A /* Unison.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
+ buildConfigurationList = 2A3C3F2C0992245300E404E9 /* Build configuration list for PBXProject "uimacnew" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* uimac */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 69C625DD0664EC3300B3C46A /* uimac */,
+ 2A124E780DE1C48400524237 /* Create ExternalSettings */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 69C625E50664EC3300B3C46A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 69C625E70664EC3300B3C46A /* InfoPlist.strings in Resources */,
+ 69C625E80664EC3300B3C46A /* Unison.icns in Resources */,
+ B518071C09D6652100B1B21F /* add.tif in Resources */,
+ B518071D09D6652100B1B21F /* diff.tif in Resources */,
+ B518071E09D6652100B1B21F /* go.tif in Resources */,
+ B518071F09D6652100B1B21F /* left.tif in Resources */,
+ B518072009D6652100B1B21F /* merge.tif in Resources */,
+ B518072109D6652100B1B21F /* quit.tif in Resources */,
+ B518072209D6652100B1B21F /* restart.tif in Resources */,
+ B518072309D6652100B1B21F /* right.tif in Resources */,
+ B518072409D6652100B1B21F /* save.tif in Resources */,
+ B518072509D6652100B1B21F /* skip.tif in Resources */,
+ B5B44C1909DF61A4000DC7AF /* table-conflict.tif in Resources */,
+ B5B44C1A09DF61A4000DC7AF /* table-error.tif in Resources */,
+ B5B44C1B09DF61A4000DC7AF /* table-left-blue.tif in Resources */,
+ B5B44C1C09DF61A4000DC7AF /* table-left-green.tif in Resources */,
+ B5B44C1D09DF61A4000DC7AF /* table-merge.tif in Resources */,
+ B5B44C1E09DF61A4000DC7AF /* table-right-blue.tif in Resources */,
+ B5B44C1F09DF61A4000DC7AF /* table-right-green.tif in Resources */,
+ B5B44C2009DF61A4000DC7AF /* table-skip.tif in Resources */,
+ B5E03B3909E38B9E0058C7B9 /* rescan.tif in Resources */,
+ 44A797F40BE3F9B70069680C /* table-mixed.tif in Resources */,
+ 44042D1B0BE52AED00A6BBB2 /* ProgressBarAdvanced.png in Resources */,
+ 44042D1C0BE52AEE00A6BBB2 /* ProgressBarBlue.png in Resources */,
+ 44042D1D0BE52AEE00A6BBB2 /* ProgressBarEndAdvanced.png in Resources */,
+ 44042D1E0BE52AEE00A6BBB2 /* ProgressBarEndBlue.png in Resources */,
+ 44042D1F0BE52AEE00A6BBB2 /* ProgressBarEndGray.png in Resources */,
+ 44042D200BE52AEE00A6BBB2 /* ProgressBarEndGreen.png in Resources */,
+ 44042D210BE52AEE00A6BBB2 /* ProgressBarEndWhite.png in Resources */,
+ 44042D220BE52AEE00A6BBB2 /* ProgressBarGray.png in Resources */,
+ 44042D230BE52AEE00A6BBB2 /* ProgressBarGreen.png in Resources */,
+ 44042D240BE52AEE00A6BBB2 /* ProgressBarLightGreen.png in Resources */,
+ 44042D250BE52AEE00A6BBB2 /* ProgressBarWhite.png in Resources */,
+ 445A291B0BFA5B3300E4E641 /* Outline-Deep.png in Resources */,
+ 445A29270BFA5C1200E4E641 /* Outline-Flat.png in Resources */,
+ 445A29290BFA5C1B00E4E641 /* Outline-Flattened.png in Resources */,
+ 440EEAF30C03EC3D00ACAAB0 /* Change_Created.png in Resources */,
+ 440EEAF90C03F0B800ACAAB0 /* Change_Deleted.png in Resources */,
+ 440EEAFA0C03F0B800ACAAB0 /* Change_Modified.png in Resources */,
+ 440EEAFB0C03F0B800ACAAB0 /* Change_PropsChanged.png in Resources */,
+ 44F472B10C0DB735006428EF /* Change_Absent.png in Resources */,
+ 44F472B20C0DB735006428EF /* Change_Unmodified.png in Resources */,
+ DE2444D610C294EA007E1546 /* MainMenu.xib in Resources */,
+ 849BE4FF191AC10E001B6FBF /* README in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 2A124E7E0DE1C4BE00524237 /* Run Script (version, ocaml lib dir) */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script (version, ocaml lib dir)";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "if [ -x /usr/libexec/path_helper ]; then\n eval `/usr/libexec/path_helper -s`\nfi\nif [ ! -x ${PROJECT_DIR}/../Makefile.ProjectInfo ]; then\n if [ ! -x ${PROJECT_DIR}/../mkProjectInfo ]; then\n cd ${PROJECT_DIR}/..; ocamlc -o mkProjectInfo unix.cma str.cma mkProjectInfo.ml\n fi\n cd ${PROJECT_DIR}/..; ./mkProjectInfo > Makefile.ProjectInfo\nfi\nOCAMLLIBDIR=`ocamlc -v | tail -n -1 | sed -e 's/.* //g' | sed -e 's/\\\\\\/\\\\//g' | tr -d '\\r'`\nsource ${PROJECT_DIR}/../Makefile.ProjectInfo\necho MARKETING_VERSION = $VERSION > ${PROJECT_DIR}/ExternalSettings.xcconfig\necho OCAMLLIBDIR = $OCAMLLIBDIR >> ${PROJECT_DIR}/ExternalSettings.xcconfig";
+ };
+ 2E282CBA0D9AE17300439D01 /* Run Script (make unison-blob.o) */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script (make unison-blob.o)";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"Building unison-blob.o...\"\nif [ -x /usr/libexec/path_helper ]; then\n eval `/usr/libexec/path_helper -s`\nfi\ncd ${PROJECT_DIR}/..\nmake unison-blob.o\necho \"done\"";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 69C625E90664EC3300B3C46A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 69C625EA0664EC3300B3C46A /* main.m in Sources */,
+ 69C625EB0664EC3300B3C46A /* MyController.m in Sources */,
+ 69C625EC0664EC3300B3C46A /* ProfileController.m in Sources */,
+ 69C625ED0664EC3300B3C46A /* ReconItem.m in Sources */,
+ 69C625EE0664EC3300B3C46A /* ReconTableView.m in Sources */,
+ 69C625EF0664EC3300B3C46A /* PreferencesController.m in Sources */,
+ 69C625F00664EC3300B3C46A /* ProfileTableView.m in Sources */,
+ 2A3C3F7D09922D4900E404E9 /* NotificationController.m in Sources */,
+ B554004109C4E5AA0089E1C3 /* UnisonToolbar.m in Sources */,
+ 449F03E10BE00DE9003F15C8 /* Bridge.m in Sources */,
+ 44042CB60BE4FC9B00A6BBB2 /* ProgressCell.m in Sources */,
+ 445A2A5E0BFAB6C300E4E641 /* ImageAndTextCell.m in Sources */,
+ 8450B1381918859E00A2C4D6 /* ColorGradientView.m in Sources */,
+ 849BE500191AC10E001B6FBF /* SSSelectableToolbar.m in Sources */,
+ 849BE501191AC10E001B6FBF /* SSSelectableToolbarItem.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 2A124E800DE1C4E400524237 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 2A124E780DE1C48400524237 /* Create ExternalSettings */;
+ targetProxy = 2A124E7F0DE1C4E400524237 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C165DFE840E0CC02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ DE2444D410C294EA007E1546 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DE2444D510C294EA007E1546 /* English */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 2A124E790DE1C48400524237 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ PRODUCT_NAME = "Create ExternalSettings";
+ };
+ name = Development;
+ };
+ 2A124E7A0DE1C48400524237 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ PRODUCT_NAME = "Create ExternalSettings";
+ ZERO_LINK = NO;
+ };
+ name = Deployment;
+ };
+ 2A124E7B0DE1C48400524237 /* Default */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "Create ExternalSettings";
+ };
+ name = Default;
+ };
+ 2A3C3F290992245300E404E9 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(FRAMEWORK_SEARCH_PATHS)",
+ "$(SRCROOT)",
+ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "\"$(SRCROOT)/Frameworks\"",
+ );
+ FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/Frameworks\"";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ LIBRARY_SEARCH_PATHS = "";
+ NSZombieEnabled = YES;
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = (
+ "-L$(OCAMLLIBDIR)",
+ "-lunix",
+ "-lthreadsnat",
+ "-lcamlstr",
+ "-lbigarray",
+ "-lasmrun",
+ );
+ PRODUCT_NAME = Unison;
+ SECTORDER_FLAGS = "";
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = YES;
+ };
+ name = Development;
+ };
+ 2A3C3F2A0992245300E404E9 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(FRAMEWORK_SEARCH_PATHS)",
+ "$(SRCROOT)",
+ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "\"$(SRCROOT)/Frameworks\"",
+ );
+ FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/Frameworks\"";
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = (
+ "-L$(OCAMLLIBDIR)",
+ "-lunix",
+ "-lthreadsnat",
+ "-lcamlstr",
+ "-lbigarray",
+ "-lasmrun",
+ );
+ PRODUCT_NAME = Unison;
+ SECTORDER_FLAGS = "";
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = NO;
+ };
+ name = Deployment;
+ };
+ 2A3C3F2B0992245300E404E9 /* Default */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(FRAMEWORK_SEARCH_PATHS)",
+ "$(SRCROOT)",
+ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "\"$(SRCROOT)/Frameworks\"",
+ );
+ FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/Frameworks\"";
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ LIBRARY_SEARCH_PATHS = "";
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = (
+ "-L$(OCAMLLIBDIR)",
+ "-lunix",
+ "-lthreadsnat",
+ "-lcamlstr",
+ "-lbigarray",
+ "-lasmrun",
+ );
+ PRODUCT_NAME = Unison;
+ SECTORDER_FLAGS = "";
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = NO;
+ };
+ name = Default;
+ };
+ 2A3C3F2D0992245300E404E9 /* Development */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 2E282CCC0D9AE2E800439D01 /* ExternalSettings.xcconfig */;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = "Frameworks/**";
+ LIBRARY_SEARCH_PATHS = "";
+ SDKROOT = macosx;
+ USER_HEADER_SEARCH_PATHS = $OCAMLLIBDIR;
+ };
+ name = Development;
+ };
+ 2A3C3F2E0992245300E404E9 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 2E282CCC0D9AE2E800439D01 /* ExternalSettings.xcconfig */;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = "Frameworks/**";
+ LIBRARY_SEARCH_PATHS = "";
+ SDKROOT = macosx;
+ USER_HEADER_SEARCH_PATHS = $OCAMLLIBDIR;
+ };
+ name = Deployment;
+ };
+ 2A3C3F2F0992245300E404E9 /* Default */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 2E282CCC0D9AE2E800439D01 /* ExternalSettings.xcconfig */;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = "Frameworks/**";
+ LIBRARY_SEARCH_PATHS = "";
+ SDKROOT = macosx;
+ USER_HEADER_SEARCH_PATHS = $OCAMLLIBDIR;
+ };
+ name = Default;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 2A124E7C0DE1C4A200524237 /* Build configuration list for PBXAggregateTarget "Create ExternalSettings" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 2A124E790DE1C48400524237 /* Development */,
+ 2A124E7A0DE1C48400524237 /* Deployment */,
+ 2A124E7B0DE1C48400524237 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 2A3C3F280992245300E404E9 /* Build configuration list for PBXNativeTarget "uimac" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 2A3C3F290992245300E404E9 /* Development */,
+ 2A3C3F2A0992245300E404E9 /* Deployment */,
+ 2A3C3F2B0992245300E404E9 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+ 2A3C3F2C0992245300E404E9 /* Build configuration list for PBXProject "uimacnew" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 2A3C3F2D0992245300E404E9 /* Development */,
+ 2A3C3F2E0992245300E404E9 /* Deployment */,
+ 2A3C3F2F0992245300E404E9 /* Default */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Default;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
Modified: trunk/src/uimacbridgenew.ml
===================================================================
--- trunk/src/uimacbridgenew.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimacbridgenew.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -443,7 +443,7 @@
Callback.register "unisonRiToFileType" unisonRiToFileType;;
let direction2niceString = function (* from Uicommon where it's not exported *)
- Conflict -> "<-?->"
+ Conflict _ -> "<-?->"
| Replica1ToReplica2 -> "---->"
| Replica2ToReplica1 -> "<----"
| Merge -> "<-M->"
@@ -466,7 +466,7 @@
let unisonRiSetConflict ri =
match ri.ri.replicas with
Problem _ -> ()
- | Different diff -> diff.direction <- Conflict;;
+ | Different diff -> diff.direction <- Conflict "skip requested";;
Callback.register "unisonRiSetConflict" unisonRiSetConflict;;
let unisonRiSetMerge ri =
match ri.ri.replicas with
@@ -484,7 +484,7 @@
match (ri.statusMessage, ri.whatHappened,ri.ri.replicas) with
(None,None,_) -> ""
| (Some s,None,_) -> Unicode.protect s
- | (_,_,Different {direction = Conflict}) -> ""
+ | (_,_,Different {direction = Conflict "files differed"}) -> ""
| (_,_,Problem _) -> ""
| (_,Some Util.Succeeded,_) -> "done"
| (_,Some (Util.Failed s),_) -> "FAILED";;
@@ -664,9 +664,9 @@
match si.ri.replicas with
Problem err ->
(si, [err], "error during update detection") :: l
- | Different diff when diff.direction = Conflict ->
+ | Different diff when (isConflict diff.direction) ->
(si, [],
- if diff.default_direction = Conflict then
+ if (isConflict diff.default_direction) then
"conflict"
else "skipped") :: l
| _ ->
@@ -758,7 +758,7 @@
the current setting is Conflict *)
let unisonRiIsConflict ri =
match ri.ri.replicas with
- | Different {default_direction = Conflict} -> true
+ | Different {default_direction = Conflict "files differ"} -> true
| _ -> false;;
Callback.register "unisonRiIsConflict" unisonRiIsConflict;;
Modified: trunk/src/uimacnew/Info.plist.template
===================================================================
--- trunk/src/uimacnew/Info.plist.template 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uimacnew/Info.plist.template 2014-07-05 21:55:19 UTC (rev 527)
@@ -23,9 +23,9 @@
<key>CFBundleShortVersionString</key>
<string>@@VERSION@@</string>
<key>CFBundleGetInfoString</key>
- <string>@@VERSION@@. ©1999-2007, licensed under GNU GPL.</string>
+ <string>@@VERSION@@. ©1999-2014, licensed under GNU GPL.</string>
<key>NSHumanReadableCopyright</key>
- <string>©1999-2006, licensed under GNU GPL.</string>
+ <string>©1999-2014, licensed under GNU GPL.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
Modified: trunk/src/uitext.ml
===================================================================
--- trunk/src/uitext.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uitext.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/uitext.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/uitext.mli
===================================================================
--- trunk/src/uitext.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uitext.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,4 +1,4 @@
(* Unison file synchronizer: src/uitext.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
module Body : Uicommon.UI
Modified: trunk/src/unicode.ml
===================================================================
--- trunk/src/unicode.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/unicode.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/unicode.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/unicode.mli
===================================================================
--- trunk/src/unicode.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/unicode.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/unicode.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
exception Invalid
Modified: trunk/src/update.ml
===================================================================
--- trunk/src/update.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/update.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/update.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/update.mli
===================================================================
--- trunk/src/update.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/update.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/update.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
module NameMap : MyMap.S with type key = Name.t
Modified: trunk/src/uutil.ml
===================================================================
--- trunk/src/uutil.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uutil.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/uutil.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/uutil.mli
===================================================================
--- trunk/src/uutil.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/uutil.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/uutil.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* This module collects a number of low-level, Unison-specific utility
functions. It is kept separate from the Util module so that that module
Modified: trunk/src/xferhint.ml
===================================================================
--- trunk/src/xferhint.ml 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/xferhint.ml 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/xferhint.ml *)
-(* Copyright 1999-2012, Benjamin C. Pierce
+(* Copyright 1999-2014, Benjamin C. Pierce
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/src/xferhint.mli
===================================================================
--- trunk/src/xferhint.mli 2014-01-21 22:58:27 UTC (rev 526)
+++ trunk/src/xferhint.mli 2014-07-05 21:55:19 UTC (rev 527)
@@ -1,5 +1,5 @@
(* Unison file synchronizer: src/xferhint.mli *)
-(* Copyright 1999-2012, Benjamin C. Pierce (see COPYING for details) *)
+(* Copyright 1999-2014, Benjamin C. Pierce (see COPYING for details) *)
(* This module maintains a cache that can be used to map
an Os.fullfingerprint to a (Fspath.t * Path.t) naming a file that *may*
More information about the Unison-hackers
mailing list