diff --git a/README b/README
index f74683d6..642f1184 100644
--- a/README
+++ b/README
@@ -94,7 +94,7 @@ Build on OSX:
Get the Mono Framework, Monodevelop, and MacPorts.
Install git-core, automake and intltool using 'port install'.
-
+Make sure that git or a symbolic link to git is in /usr/bin.
Frequently Asked Question
=========================
diff --git a/SparkleLib/Defines.cs.in b/SparkleLib/Defines.cs.in
index f5beeba7..7ef0803c 100644
--- a/SparkleLib/Defines.cs.in
+++ b/SparkleLib/Defines.cs.in
@@ -22,6 +22,7 @@ namespace SparkleLib {
public const string VERSION = "@VERSION@";
public const string LOCALE_DIR = "@prefix@/share/locale";
+ public const string DATAROOTDIR = "@expanded_datadir@";
public const string GETTEXT_PACKAGE = "@GETTEXT_PACKAGE@";
public const string PREFIX = "@prefix@";
public const string OPEN_COMMAND = "xdg-open";
diff --git a/SparkleLib/SparklePaths.cs b/SparkleLib/SparklePaths.cs
index c45adc01..138379f6 100644
--- a/SparkleLib/SparklePaths.cs
+++ b/SparkleLib/SparklePaths.cs
@@ -24,7 +24,7 @@ namespace SparkleLib {
public static class SparklePaths
{
- public static string GitPath = GetGitPath ();
+ public static string GitPath = "/usr/bin/git"; // TODO: Don't hardcode this
public static string HomePath = new UnixUserInfo (UnixEnvironment.UserName).HomeDirectory;
@@ -40,7 +40,7 @@ namespace SparkleLib {
public static string SparkleLocalIconPath = SparkleHelpers.CombineMore (SparkleConfigPath, "icons", "hicolor");
- public static string SparkleIconPath = SparkleHelpers.CombineMore (Defines.PREFIX, "share", "sparkleshare",
+ public static string SparkleIconPath = SparkleHelpers.CombineMore (Defines.DATAROOTDIR, "sparkleshare",
"icons");
diff --git a/SparkleShare/Mac/SparkleShare/AppDelegate.cs b/SparkleShare/Mac/SparkleShare/AppDelegate.cs
deleted file mode 100644
index 77d455bd..00000000
--- a/SparkleShare/Mac/SparkleShare/AppDelegate.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-using System;
-using System.Drawing;
-using MonoMac.Foundation;
-using MonoMac.AppKit;
-using MonoMac.ObjCRuntime;
-using SparkleLib;
-
-namespace SparkleShare
-{
- public partial class AppDelegate : NSApplicationDelegate
- {
-
- MainWindowController mainWindowController;
- NSStatusItem StatusItem;
-
- NSMenu Menu;
- NSMenuItem FolderMenuItem;
- NSMenuItem [] FolderMenuItems;
- NSMenuItem SyncMenuItem;
- NSMenuItem NotificationsMenuItem;
- NSMenuItem AboutMenuItem;
- NSMenuItem QuitMenuItem;
-
-
- public AppDelegate ()
- {
- }
-
- public override void FinishedLaunching (NSObject notification)
- {
-
- // mainWindowController = new MainWindowController ();
- // mainWindowController.Window.MakeKeyAndOrderFront (this);
-
- // SparkleStatusIcon = new SparkleStatusIcon ();
-
- // SparkleRepo repo = new SparkleRepo ("/Users/hbons/SparkleShare/SparkleShare-Test");
-
- StatusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (32);
-
- StatusItem.Enabled = true;
- StatusItem.Image = NSImage.ImageNamed ("sparkleshare-idle.png");
- StatusItem.AlternateImage = NSImage.ImageNamed ("sparkleshare-idle-focus.png");
- StatusItem.Image.Size = new SizeF (13, 13);
- StatusItem.AlternateImage.Size = new SizeF (13, 13);
- StatusItem.HighlightMode = true;
-
- Menu = new NSMenu ();
-
-
- Menu.AddItem (new NSMenuItem () { Title="Up to date (102 ᴍʙ)", Enabled = true });
- Menu.AddItem (NSMenuItem.SeparatorItem);
-
-
- FolderMenuItem = new NSMenuItem () {
- Title="SparkleShare", Enabled = true,
- Action = new Selector ("ddd")
- };
-
- FolderMenuItem.Activated += delegate {
- Console.WriteLine ("DDDD");
- };
-
- FolderMenuItem.Image = NSImage.ImageNamed ("NSFolder");
- FolderMenuItem.Image.Size = new SizeF (16, 16);
-
- Menu.AddItem (FolderMenuItem);
-
- FolderMenuItems = new NSMenuItem [2] {
- new NSMenuItem () { Title = "gnome-design" },
- new NSMenuItem () { Title = "tango-icons" }
- };
-
- foreach (NSMenuItem item in FolderMenuItems) {
-
- item.Activated += delegate {
-
- };
-
- item.Image = NSImage.ImageNamed ("NSFolder");
- Menu.AddItem (item);
- };
-
-
- Menu.AddItem (NSMenuItem.SeparatorItem);
-
-
- SyncMenuItem = new NSMenuItem () {
- Title = "Sync Remote Folder..."
- };
-
- SyncMenuItem.Activated += delegate {
-
- };
-
- Menu.AddItem (SyncMenuItem);
-
-
- Menu.AddItem (NSMenuItem.SeparatorItem);
-
-
- NotificationsMenuItem = new NSMenuItem () {
- Title = "Show Notifications",
- State = NSCellStateValue.On
- };
-
- NotificationsMenuItem.Activated += delegate {
-
- //StatusItem.Image = NSImage.ImageNamed ("NSComputer");
- if (NotificationsMenuItem.State == NSCellStateValue.On)
-
- NotificationsMenuItem.State = NSCellStateValue.Off;
-
- else
-
- NotificationsMenuItem.State = NSCellStateValue.On;
-
- };
-
- Menu.AddItem (NotificationsMenuItem);
-
-
- Menu.AddItem (NSMenuItem.SeparatorItem);
-
-
- AboutMenuItem = new NSMenuItem () {
- Title = "About"
- };
-
- AboutMenuItem.Activated += delegate {
-
- };
-
- Menu.AddItem (AboutMenuItem);
-
-
- Menu.AddItem (NSMenuItem.SeparatorItem);
-
-
- QuitMenuItem = new NSMenuItem () {
- Title = "Quit"
- };
-
- QuitMenuItem.Activated += delegate {
- Environment.Exit (0);
- };
-
- Menu.AddItem (QuitMenuItem);
-
- StatusItem.Menu = Menu;
-
- }
- }
-}
-
diff --git a/SparkleShare/Mac/SparkleShare/Info.plist b/SparkleShare/Mac/SparkleShare/Info.plist
index 16ec0ef3..4431992a 100644
--- a/SparkleShare/Mac/SparkleShare/Info.plist
+++ b/SparkleShare/Mac/SparkleShare/Info.plist
@@ -2,13 +2,15 @@
+ CFBundleIconFile
+ sparkleshare.icns
LSEnvironment
PATH
/opt/local/bin
CFBundleIdentifier
- com.yourcompany.SparkleShare
+ org.sparkleshare.sparkleshare
CFBundleName
SparkleShare
CFBundleVersion
@@ -19,5 +21,7 @@
MainMenu
NSPrincipalClass
NSApplication
+ LSBackgroundOnly
+
diff --git a/SparkleShare/Mac/SparkleShare/Layout.cs b/SparkleShare/Mac/SparkleShare/Layout.cs
new file mode 100644
index 00000000..56bccafd
--- /dev/null
+++ b/SparkleShare/Mac/SparkleShare/Layout.cs
@@ -0,0 +1,298 @@
+//
+// Layout.cs
+//
+// Author:
+// Michael Hutchinson
+//
+// Copyright (c) 2010 Novell, Inc.
+//
+// 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.
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using MonoMac.AppKit;
+using System.Linq;
+namespace MonoDevelop.Platform.Mac
+{
+ interface ILayout
+ {
+ LayoutRequest BeginLayout ();
+ void EndLayout (LayoutRequest request, PointF origin, SizeF allocation);
+ }
+
+ class LayoutRequest
+ {
+ public SizeF Size { get; set; }
+ public bool Visible { get; set; }
+ public bool ExpandWidth { get; set; }
+ public bool ExpandHeight { get; set; }
+ }
+
+ abstract class LayoutBox : IEnumerable, ILayout
+ {
+ List children = new List ();
+
+ public float Spacing { get; set; }
+ public float PadLeft { get; set; }
+ public float PadRight { get; set; }
+ public float PadTop { get; set; }
+ public float PadBottom { get; set; }
+ public LayoutAlign Align { get; set; }
+
+ public LayoutDirection Direction { get; set; }
+
+ public LayoutBox (LayoutDirection direction, float spacing) : this (direction, spacing, 0)
+ {
+ }
+
+ public LayoutBox (LayoutDirection direction, float spacing, float padding)
+ {
+ PadLeft = PadRight = PadTop = PadBottom = padding;
+ this.Direction = direction;
+ this.Spacing = spacing;
+ this.Align = LayoutAlign.Center;
+ }
+
+ public int Count { get { return children.Count; } }
+
+ bool IsHorizontal { get { return Direction == LayoutDirection.Horizontal; } }
+
+ public IEnumerator GetEnumerator ()
+ {
+ return children.GetEnumerator ();
+ }
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator ()
+ {
+ return children.GetEnumerator ();
+ }
+
+ public void Add (ILayout child)
+ {
+ children.Add (child);
+ OnChildAdded (child);
+ }
+
+ ContainerLayoutRequest request = new ContainerLayoutRequest ();
+
+ public virtual LayoutRequest BeginLayout ()
+ {
+ float width = 0;
+ float height = 0;
+
+ request.ChildRequests.Clear ();
+ request.ChildRequests.AddRange (children.Select (c => c.BeginLayout ()));
+
+ foreach (var r in request.ChildRequests) {
+ if (!r.Visible)
+ continue;
+ request.Visible = true;
+ if (r.ExpandWidth)
+ request.ExpandWidth = true;
+ if (r.ExpandHeight)
+ request.ExpandHeight = true;
+
+ if (IsHorizontal) {
+ if (width != 0)
+ width += Spacing;
+ width += r.Size.Width;
+ height = Math.Max (height, r.Size.Height);
+ } else {
+ if (height != 0)
+ height += Spacing;
+ height += r.Size.Height;
+ width = Math.Max (width, r.Size.Width);
+ }
+ }
+
+ request.Size = new SizeF (width + PadLeft + PadRight, height + PadTop + PadBottom);
+ return request;
+ }
+
+ public virtual void EndLayout (LayoutRequest request, PointF origin, SizeF allocation)
+ {
+ var childRequests = ((ContainerLayoutRequest) request).ChildRequests;
+
+ allocation = new SizeF (allocation.Width - PadLeft - PadRight, allocation.Height - PadBottom - PadTop);
+ origin = new PointF (origin.X + PadLeft, origin.Y + PadBottom);
+
+ var size = request.Size;
+ size.Height -= (PadTop + PadBottom);
+ size.Width -= (PadLeft + PadRight);
+
+ int wExpandCount = 0;
+ int hExpandCount = 0;
+ int visibleCount = 0;
+ foreach (var childRequest in childRequests) {
+ if (childRequest.Visible)
+ visibleCount++;
+ else
+ continue;
+ if (childRequest.ExpandWidth)
+ wExpandCount++;
+ if (childRequest.ExpandHeight)
+ hExpandCount++;
+ }
+
+ float wExpand = 0;
+ if (allocation.Width > size.Width) {
+ wExpand = allocation.Width - size.Width;
+ if (wExpandCount > 0)
+ wExpand /= wExpandCount;
+ }
+ float hExpand = 0;
+ if (allocation.Height > size.Height) {
+ hExpand = allocation.Height - size.Height;
+ if (hExpandCount > 0)
+ hExpand /= hExpandCount;
+ }
+
+ if (Direction == LayoutDirection.Horizontal) {
+ float pos = PadLeft;
+ if (wExpandCount == 0) {
+ if (Align == LayoutAlign.End)
+ pos += wExpand;
+ else if (Align == LayoutAlign.Center)
+ pos += wExpand / 2;
+ }
+ for (int i = 0; i < childRequests.Count; i++) {
+ var child = children[i];
+ var childReq = childRequests[i];
+ if (!childReq.Visible)
+ continue;
+
+ var childSize = new SizeF (childReq.Size.Width, allocation.Height);
+ if (childReq.ExpandWidth) {
+ childSize.Width += wExpand;
+ } else if (hExpandCount == 0 && Align == LayoutAlign.Fill) {
+ childSize.Width += wExpand / visibleCount;
+ }
+
+ child.EndLayout (childReq, new PointF (pos, origin.Y), childSize);
+ pos += childSize.Width + Spacing;
+ }
+ } else {
+ float pos = PadBottom;
+ if (hExpandCount == 0) {
+ if (Align == LayoutAlign.End)
+ pos += hExpand;
+ else if (Align == LayoutAlign.Center)
+ pos += hExpand / 2;
+ }
+ for (int i = 0; i < childRequests.Count; i++) {
+ var child = children[i];
+ var childReq = childRequests[i];
+ if (!childReq.Visible)
+ continue;
+
+ var childSize = new SizeF (allocation.Width, childReq.Size.Height);
+ if (childReq.ExpandHeight) {
+ childSize.Height += hExpand;
+ } else if (hExpandCount == 0 && Align == LayoutAlign.Fill) {
+ childSize.Height += hExpand / visibleCount;
+ }
+
+ child.EndLayout (childReq, new PointF (origin.X, pos), childSize);
+ pos += childSize.Height + Spacing;
+ }
+ }
+ }
+
+ protected abstract void OnChildAdded (ILayout child);
+
+ class ContainerLayoutRequest : LayoutRequest
+ {
+ public List ChildRequests = new List ();
+ }
+ }
+
+ public enum LayoutAlign
+ {
+ Begin, Center, End, Fill
+ }
+
+ public enum LayoutDirection
+ {
+ Horizontal, Vertical
+ }
+
+ abstract class LayoutAlignment : ILayout
+ {
+ public LayoutAlignment ()
+ {
+ XAlign = YAlign = LayoutAlign.Center;
+ }
+
+ public LayoutAlign XAlign { get; set; }
+ public LayoutAlign YAlign { get; set; }
+ public bool ExpandHeight { get; set; }
+ public bool ExpandWidth { get; set; }
+ public float MinHeight { get; set; }
+ public float MinWidth { get; set; }
+ public float PadLeft { get; set; }
+ public float PadRight { get; set; }
+ public float PadTop { get; set; }
+ public float PadBottom { get; set; }
+ public bool Visible { get; set; }
+
+ LayoutRequest request = new LayoutRequest ();
+
+ public virtual LayoutRequest BeginLayout ()
+ {
+ request.Size = new SizeF (MinWidth + PadLeft + PadRight, MinHeight + PadTop + PadBottom);
+ request.ExpandHeight = this.ExpandHeight;
+ request.ExpandWidth = this.ExpandWidth;
+ request.Visible = this.Visible;
+ return request;
+ }
+
+ public virtual void EndLayout (LayoutRequest request, PointF origin, SizeF allocation)
+ {
+ var frame = new RectangleF (origin.X + PadLeft, origin.Y + PadBottom,
+ allocation.Width - PadLeft - PadRight, allocation.Height - PadTop - PadBottom);
+
+ if (allocation.Height > request.Size.Height) {
+ if (YAlign != LayoutAlign.Fill) {
+ frame.Height = request.Size.Height - PadTop - PadBottom;
+ if (YAlign == LayoutAlign.Center) {
+ frame.Y += (allocation.Height - request.Size.Height) / 2;
+ } else if (YAlign == LayoutAlign.End) {
+ frame.Y += (allocation.Height - request.Size.Height);
+ }
+ }
+ }
+
+ if (allocation.Width > request.Size.Width) {
+ if (XAlign != LayoutAlign.Fill) {
+ frame.Width = request.Size.Width - PadLeft - PadRight;
+ if (XAlign == LayoutAlign.Center) {
+ frame.X += (allocation.Width - request.Size.Width) / 2;
+ } else if (XAlign == LayoutAlign.End) {
+ frame.X += (allocation.Width - request.Size.Width);
+ }
+ }
+ }
+
+ OnLayoutEnded (frame);
+ }
+
+ protected abstract void OnLayoutEnded (RectangleF frame);
+ }
+}
\ No newline at end of file
diff --git a/SparkleShare/Mac/SparkleShare/Main.cs b/SparkleShare/Mac/SparkleShare/Main.cs
deleted file mode 100644
index f54dc597..00000000
--- a/SparkleShare/Mac/SparkleShare/Main.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using System.Drawing;
-using MonoMac.Foundation;
-using MonoMac.AppKit;
-using MonoMac.ObjCRuntime;
-
-namespace SparkleShare
-{
- class MainClass
- {
- static void Main (string[] args)
- {
- NSApplication.Init ();
- NSApplication.Main (args);
- }
- }
-}
-
diff --git a/SparkleShare/Mac/SparkleShare/MainMenu.xib b/SparkleShare/Mac/SparkleShare/MainMenu.xib
index 0a42fa19..ed428a77 100644
--- a/SparkleShare/Mac/SparkleShare/MainMenu.xib
+++ b/SparkleShare/Mac/SparkleShare/MainMenu.xib
@@ -2,7 +2,7 @@
1060
- 10D573
+ 10D2162
762
1038.29
460.00
@@ -61,45 +61,6 @@
MacCocoaApp
-
-
-
-
39
-
-
-
- runPageLayout:
-
-
-
- 87
-
-
-
- clearRecentDocuments:
-
-
-
- 127
-
-
-
- orderFrontStandardAboutPanel:
-
-
-
- 142
-
-
-
- performClose:
-
-
-
- 193
-
-
-
- toggleContinuousSpellChecking:
-
-
-
- 222
-
-
-
- undo:
-
-
-
- 223
-
-
-
- copy:
-
-
-
- 224
-
-
-
- checkSpelling:
-
-
-
- 225
-
-
-
- paste:
-
-
-
- 226
-
-
-
- stopSpeaking:
-
-
-
- 227
-
-
-
- cut:
-
-
-
- 228
-
-
-
- showGuessPanel:
-
-
-
- 230
-
-
-
- redo:
-
-
-
- 231
-
-
-
- selectAll:
-
-
-
- 232
-
-
-
- startSpeaking:
-
-
-
- 233
-
-
-
- delete:
-
-
-
- 235
-
performZoom:
@@ -1484,94 +257,6 @@
240
-
-
- performFindPanelAction:
-
-
-
- 241
-
-
-
- centerSelectionInVisibleArea:
-
-
-
- 245
-
-
-
- toggleGrammarChecking:
-
-
-
- 347
-
-
-
- toggleSmartInsertDelete:
-
-
-
- 355
-
-
-
- toggleAutomaticQuoteSubstitution:
-
-
-
- 356
-
-
-
- toggleAutomaticLinkDetection:
-
-
-
- 357
-
-
-
- saveDocument:
-
-
-
- 362
-
-
-
- saveDocumentAs:
-
-
-
- 363
-
-
-
- revertDocumentToSaved:
-
-
-
- 364
-
-
-
- runToolbarCustomizationPalette:
-
-
-
- 365
-
-
-
- toggleToolbarShown:
-
-
-
- 366
-
hide:
@@ -1596,190 +281,6 @@
370
-
-
- newDocument:
-
-
-
- 373
-
-
-
- openDocument:
-
-
-
- 374
-
-
-
- addFontTrait:
-
-
-
- 421
-
-
-
- addFontTrait:
-
-
-
- 422
-
-
-
- modifyFont:
-
-
-
- 423
-
-
-
- orderFrontFontPanel:
-
-
-
- 424
-
-
-
- modifyFont:
-
-
-
- 425
-
-
-
- raiseBaseline:
-
-
-
- 426
-
-
-
- lowerBaseline:
-
-
-
- 427
-
-
-
- copyFont:
-
-
-
- 428
-
-
-
- subscript:
-
-
-
- 429
-
-
-
- superscript:
-
-
-
- 430
-
-
-
- tightenKerning:
-
-
-
- 431
-
-
-
- underline:
-
-
-
- 432
-
-
-
- orderFrontColorPanel:
-
-
-
- 433
-
-
-
- useAllLigatures:
-
-
-
- 434
-
-
-
- loosenKerning:
-
-
-
- 435
-
-
-
- pasteFont:
-
-
-
- 436
-
-
-
- unscript:
-
-
-
- 437
-
-
-
- useStandardKerning:
-
-
-
- 438
-
-
-
- useStandardLigatures:
-
-
-
- 439
-
-
-
- turnOffLigatures:
-
-
-
- 440
-
-
-
- turnOffKerning:
-
-
-
- 441
-
terminate:
@@ -1788,94 +289,6 @@
449
-
-
- toggleAutomaticSpellingCorrection:
-
-
-
- 456
-
-
-
- orderFrontSubstitutionsPanel:
-
-
-
- 458
-
-
-
- toggleAutomaticDashSubstitution:
-
-
-
- 461
-
-
-
- toggleAutomaticTextReplacement:
-
-
-
- 463
-
-
-
- uppercaseWord:
-
-
-
- 464
-
-
-
- capitalizeWord:
-
-
-
- 467
-
-
-
- lowercaseWord:
-
-
-
- 468
-
-
-
- pasteAsPlainText:
-
-
-
- 486
-
-
-
- performFindPanelAction:
-
-
-
- 487
-
-
-
- performFindPanelAction:
-
-
-
- 488
-
-
-
- performFindPanelAction:
-
-
-
- 489
-
showHelp:
@@ -1884,110 +297,6 @@
493
-
-
- alignCenter:
-
-
-
- 518
-
-
-
- pasteRuler:
-
-
-
- 519
-
-
-
- toggleRuler:
-
-
-
- 520
-
-
-
- alignRight:
-
-
-
- 521
-
-
-
- copyRuler:
-
-
-
- 522
-
-
-
- alignJustified:
-
-
-
- 523
-
-
-
- alignLeft:
-
-
-
- 524
-
-
-
- makeBaseWritingDirectionNatural:
-
-
-
- 525
-
-
-
- makeBaseWritingDirectionLeftToRight:
-
-
-
- 526
-
-
-
- makeBaseWritingDirectionRightToLeft:
-
-
-
- 527
-
-
-
- makeTextWritingDirectionNatural:
-
-
-
- 528
-
-
-
- makeTextWritingDirectionLeftToRight:
-
-
-
- 529
-
-
-
- makeTextWritingDirectionRightToLeft:
-
-
-
- 530
-
delegate
@@ -2029,25 +338,12 @@
YES
-
-
-
-
-
+
-
- 19
-
-
- YES
-
-
-
-
56
@@ -2057,326 +353,39 @@
-
- 217
-
-
- YES
-
-
-
-
-
- 83
-
-
- YES
-
-
-
-
-
- 81
-
-
- YES
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 75
-
-
-
-
- 80
-
-
-
-
- 78
-
-
-
-
- 72
-
-
-
-
- 82
-
-
-
-
- 124
-
-
- YES
-
-
-
-
-
- 77
-
-
-
-
- 73
-
-
-
-
- 79
-
-
-
-
- 112
-
-
-
-
- 74
-
-
-
-
- 125
-
-
- YES
-
-
-
-
-
- 126
-
-
-
-
- 205
-
-
- YES
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 202
-
-
-
-
- 198
-
-
-
-
- 207
-
-
-
-
- 214
-
-
-
-
- 199
-
-
-
-
- 203
-
-
-
-
- 197
-
-
-
-
- 206
-
-
-
-
- 215
-
-
-
-
- 218
-
-
- YES
-
-
-
-
-
- 216
-
-
- YES
-
-
-
-
-
- 200
-
-
- YES
-
-
-
-
-
-
-
-
-
-
- 219
-
-
-
-
- 201
-
-
-
-
- 204
-
-
-
-
- 220
-
-
- YES
-
-
-
-
-
-
-
-
-
- 213
-
-
-
-
- 210
-
-
-
-
- 221
-
-
-
-
- 208
-
-
-
-
- 209
-
-
-
57
YES
-
-
-
-
-
-
-
-
+
+
+
+
-
- 58
-
-
-
-
- 134
-
-
-
-
- 150
-
-
-
136
- 144
-
-
+ 420
+
+
- 129
-
-
+ 533
+
+
- 143
-
-
-
-
- 236
-
+ 149
+
@@ -2389,8 +398,13 @@
- 149
-
+ 144
+
+
+
+
+ 150
+
@@ -2398,460 +412,16 @@
+
+ 134
+
+
+
130
-
- 24
-
-
- YES
-
-
-
-
-
-
-
-
- 92
-
-
-
-
- 5
-
-
-
-
- 239
-
-
-
-
- 23
-
-
-
-
- 295
-
-
- YES
-
-
-
-
-
- 296
-
-
- YES
-
-
-
-
-
-
- 297
-
-
-
-
- 298
-
-
-
-
- 211
-
-
- YES
-
-
-
-
-
- 212
-
-
- YES
-
-
-
-
-
-
- 195
-
-
-
-
- 196
-
-
-
-
- 346
-
-
-
-
- 348
-
-
- YES
-
-
-
-
-
- 349
-
-
- YES
-
-
-
-
-
-
-
-
-
-
-
- 350
-
-
-
-
- 351
-
-
-
-
- 354
-
-
-
-
- 375
-
-
- YES
-
-
-
-
-
- 376
-
-
- YES
-
-
-
-
-
-
- 377
-
-
- YES
-
-
-
-
-
- 388
-
-
- YES
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 389
-
-
-
-
- 390
-
-
-
-
- 391
-
-
-
-
- 392
-
-
-
-
- 393
-
-
-
-
- 394
-
-
-
-
- 395
-
-
-
-
- 396
-
-
-
-
- 397
-
-
- YES
-
-
-
-
-
- 398
-
-
- YES
-
-
-
-
-
- 399
-
-
- YES
-
-
-
-
-
- 400
-
-
-
-
- 401
-
-
-
-
- 402
-
-
-
-
- 403
-
-
-
-
- 404
-
-
-
-
- 405
-
-
- YES
-
-
-
-
-
-
-
-
-
- 406
-
-
-
-
- 407
-
-
-
-
- 408
-
-
-
-
- 409
-
-
-
-
- 410
-
-
-
-
- 411
-
-
- YES
-
-
-
-
-
-
-
- 412
-
-
-
-
- 413
-
-
-
-
- 414
-
-
-
-
- 415
-
-
- YES
-
-
-
-
-
-
-
-
- 416
-
-
-
-
- 417
-
-
-
-
- 418
-
-
-
-
- 419
-
-
-
-
- 420
-
-
-
-
- 450
-
-
- YES
-
-
-
-
-
- 451
-
-
- YES
-
-
-
-
-
-
-
- 452
-
-
-
-
- 453
-
-
-
-
- 454
-
-
-
-
- 457
-
-
-
-
- 459
-
-
-
-
- 460
-
-
-
-
- 462
-
-
-
-
- 465
-
-
-
-
- 466
-
-
-
-
- 485
-
-
-
490
@@ -2861,6 +431,47 @@
+
+ 19
+
+
+ YES
+
+
+
+
+
+ 24
+
+
+ YES
+
+
+
+
+
+
+
+
+ 23
+
+
+
+
+ 239
+
+
+
+
+ 5
+
+
+
+
+ 92
+
+
+
491
@@ -2875,154 +486,6 @@
-
- 496
-
-
- YES
-
-
-
-
-
- 497
-
-
- YES
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 498
-
-
-
-
- 499
-
-
-
-
- 500
-
-
-
-
- 501
-
-
-
-
- 502
-
-
-
-
- 503
-
-
- YES
-
-
-
-
-
- 504
-
-
-
-
- 505
-
-
-
-
- 506
-
-
-
-
- 507
-
-
-
-
- 508
-
-
- YES
-
-
-
-
-
-
-
-
-
-
-
-
-
- 509
-
-
-
-
- 510
-
-
-
-
- 511
-
-
-
-
- 512
-
-
-
-
- 513
-
-
-
-
- 514
-
-
-
-
- 515
-
-
-
-
- 516
-
-
-
-
- 517
-
-
-
-
- 533
-
-
-
@@ -3030,17 +493,7 @@
YES
-3.IBPluginDependency
- 112.IBPluginDependency
- 112.ImportedFromIB2
- 124.IBPluginDependency
- 124.ImportedFromIB2
- 125.IBPluginDependency
- 125.ImportedFromIB2
- 125.editorWindowContentRectSynchronizationRect
- 126.IBPluginDependency
- 126.ImportedFromIB2
- 129.IBPluginDependency
- 129.ImportedFromIB2
+ 130.IBEditorWindowLastContentRect
130.IBPluginDependency
130.ImportedFromIB2
130.editorWindowContentRectSynchronizationRect
@@ -3050,8 +503,6 @@
134.ImportedFromIB2
136.IBPluginDependency
136.ImportedFromIB2
- 143.IBPluginDependency
- 143.ImportedFromIB2
144.IBPluginDependency
144.ImportedFromIB2
145.IBPluginDependency
@@ -3062,71 +513,8 @@
150.ImportedFromIB2
19.IBPluginDependency
19.ImportedFromIB2
- 195.IBPluginDependency
- 195.ImportedFromIB2
- 196.IBPluginDependency
- 196.ImportedFromIB2
- 197.IBPluginDependency
- 197.ImportedFromIB2
- 198.IBPluginDependency
- 198.ImportedFromIB2
- 199.IBPluginDependency
- 199.ImportedFromIB2
- 200.IBEditorWindowLastContentRect
- 200.IBPluginDependency
- 200.ImportedFromIB2
- 200.editorWindowContentRectSynchronizationRect
- 201.IBPluginDependency
- 201.ImportedFromIB2
- 202.IBPluginDependency
- 202.ImportedFromIB2
- 203.IBPluginDependency
- 203.ImportedFromIB2
- 204.IBPluginDependency
- 204.ImportedFromIB2
- 205.IBEditorWindowLastContentRect
- 205.IBPluginDependency
- 205.ImportedFromIB2
- 205.editorWindowContentRectSynchronizationRect
- 206.IBPluginDependency
- 206.ImportedFromIB2
- 207.IBPluginDependency
- 207.ImportedFromIB2
- 208.IBPluginDependency
- 208.ImportedFromIB2
- 209.IBPluginDependency
- 209.ImportedFromIB2
- 210.IBPluginDependency
- 210.ImportedFromIB2
- 211.IBPluginDependency
- 211.ImportedFromIB2
- 212.IBPluginDependency
- 212.ImportedFromIB2
- 212.editorWindowContentRectSynchronizationRect
- 213.IBPluginDependency
- 213.ImportedFromIB2
- 214.IBPluginDependency
- 214.ImportedFromIB2
- 215.IBPluginDependency
- 215.ImportedFromIB2
- 216.IBPluginDependency
- 216.ImportedFromIB2
- 217.IBPluginDependency
- 217.ImportedFromIB2
- 218.IBPluginDependency
- 218.ImportedFromIB2
- 219.IBPluginDependency
- 219.ImportedFromIB2
- 220.IBEditorWindowLastContentRect
- 220.IBPluginDependency
- 220.ImportedFromIB2
- 220.editorWindowContentRectSynchronizationRect
- 221.IBPluginDependency
- 221.ImportedFromIB2
23.IBPluginDependency
23.ImportedFromIB2
- 236.IBPluginDependency
- 236.ImportedFromIB2
239.IBPluginDependency
239.ImportedFromIB2
24.IBEditorWindowLastContentRect
@@ -3138,155 +526,25 @@
29.ImportedFromIB2
29.WindowOrigin
29.editorWindowContentRectSynchronizationRect
- 295.IBPluginDependency
- 296.IBEditorWindowLastContentRect
- 296.IBPluginDependency
- 296.editorWindowContentRectSynchronizationRect
- 297.IBPluginDependency
- 298.IBPluginDependency
- 346.IBPluginDependency
- 346.ImportedFromIB2
- 348.IBPluginDependency
- 348.ImportedFromIB2
- 349.IBEditorWindowLastContentRect
- 349.IBPluginDependency
- 349.ImportedFromIB2
- 349.editorWindowContentRectSynchronizationRect
- 350.IBPluginDependency
- 350.ImportedFromIB2
- 351.IBPluginDependency
- 351.ImportedFromIB2
- 354.IBPluginDependency
- 354.ImportedFromIB2
- 375.IBPluginDependency
- 376.IBEditorWindowLastContentRect
- 376.IBPluginDependency
- 377.IBPluginDependency
- 388.IBEditorWindowLastContentRect
- 388.IBPluginDependency
- 389.IBPluginDependency
- 390.IBPluginDependency
- 391.IBPluginDependency
- 392.IBPluginDependency
- 393.IBPluginDependency
- 394.IBPluginDependency
- 395.IBPluginDependency
- 396.IBPluginDependency
- 397.IBPluginDependency
- 398.IBPluginDependency
- 399.IBPluginDependency
- 400.IBPluginDependency
- 401.IBPluginDependency
- 402.IBPluginDependency
- 403.IBPluginDependency
- 404.IBPluginDependency
- 405.IBPluginDependency
- 406.IBPluginDependency
- 407.IBPluginDependency
- 408.IBPluginDependency
- 409.IBPluginDependency
- 410.IBPluginDependency
- 411.IBPluginDependency
- 412.IBPluginDependency
- 413.IBPluginDependency
- 414.IBPluginDependency
- 415.IBPluginDependency
- 416.IBPluginDependency
- 417.IBPluginDependency
- 418.IBPluginDependency
- 419.IBPluginDependency
- 450.IBPluginDependency
- 451.IBEditorWindowLastContentRect
- 451.IBPluginDependency
- 452.IBPluginDependency
- 453.IBPluginDependency
- 454.IBPluginDependency
- 457.IBPluginDependency
- 459.IBPluginDependency
- 460.IBPluginDependency
- 462.IBPluginDependency
- 465.IBPluginDependency
- 466.IBPluginDependency
- 485.IBPluginDependency
490.IBPluginDependency
491.IBEditorWindowLastContentRect
491.IBPluginDependency
492.IBPluginDependency
- 496.IBPluginDependency
- 497.IBEditorWindowLastContentRect
- 497.IBPluginDependency
- 498.IBPluginDependency
- 499.IBPluginDependency
5.IBPluginDependency
5.ImportedFromIB2
- 500.IBPluginDependency
- 501.IBPluginDependency
- 502.IBPluginDependency
- 503.IBPluginDependency
- 504.IBPluginDependency
- 505.IBPluginDependency
- 506.IBPluginDependency
- 507.IBPluginDependency
- 508.IBEditorWindowLastContentRect
- 508.IBPluginDependency
- 509.IBPluginDependency
- 510.IBPluginDependency
- 511.IBPluginDependency
- 512.IBPluginDependency
- 513.IBPluginDependency
- 514.IBPluginDependency
- 515.IBPluginDependency
- 516.IBPluginDependency
- 517.IBPluginDependency
56.IBPluginDependency
56.ImportedFromIB2
57.IBEditorWindowLastContentRect
57.IBPluginDependency
57.ImportedFromIB2
57.editorWindowContentRectSynchronizationRect
- 58.IBPluginDependency
- 58.ImportedFromIB2
- 72.IBPluginDependency
- 72.ImportedFromIB2
- 73.IBPluginDependency
- 73.ImportedFromIB2
- 74.IBPluginDependency
- 74.ImportedFromIB2
- 75.IBPluginDependency
- 75.ImportedFromIB2
- 77.IBPluginDependency
- 77.ImportedFromIB2
- 78.IBPluginDependency
- 78.ImportedFromIB2
- 79.IBPluginDependency
- 79.ImportedFromIB2
- 80.IBPluginDependency
- 80.ImportedFromIB2
- 81.IBEditorWindowLastContentRect
- 81.IBPluginDependency
- 81.ImportedFromIB2
- 81.editorWindowContentRectSynchronizationRect
- 82.IBPluginDependency
- 82.ImportedFromIB2
- 83.IBPluginDependency
- 83.ImportedFromIB2
92.IBPluginDependency
92.ImportedFromIB2
YES
com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{522, 812}, {146, 23}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
+ {{581, 686}, {64, 6}}
com.apple.InterfaceBuilder.CocoaPlugin
{{436, 809}, {64, 6}}
@@ -3310,214 +568,29 @@
com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{753, 187}, {275, 113}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{608, 612}, {275, 83}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{453, 408}, {254, 283}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{187, 434}, {243, 243}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{608, 612}, {167, 43}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{753, 217}, {238, 103}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{608, 612}, {241, 103}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{613, 618}, {194, 73}}
+ {{470, 649}, {194, 73}}
com.apple.InterfaceBuilder.CocoaPlugin
{{525, 802}, {197, 73}}
- {{346, 722}, {402, 20}}
+ {{346, 722}, {256, 20}}
com.apple.InterfaceBuilder.CocoaPlugin
{74, 862}
{{6, 978}, {478, 20}}
com.apple.InterfaceBuilder.CocoaPlugin
- {{563, 648}, {231, 43}}
- com.apple.InterfaceBuilder.CocoaPlugin
- {{475, 832}, {234, 43}}
+ {{541, 699}, {194, 23}}
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
com.apple.InterfaceBuilder.CocoaPlugin
- {{746, 287}, {220, 133}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{608, 612}, {215, 63}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
- {{497, 648}, {83, 43}}
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- {{580, 408}, {175, 283}}
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- {{753, 197}, {170, 63}}
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- {{684, 668}, {142, 23}}
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- {{674, 260}, {204, 183}}
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- {{878, 180}, {164, 173}}
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{355, 508}, {183, 183}}
+ {{358, 599}, {213, 123}}
com.apple.InterfaceBuilder.CocoaPlugin
{{23, 794}, {245, 183}}
com.apple.InterfaceBuilder.CocoaPlugin
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{411, 488}, {196, 203}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- {{145, 474}, {199, 203}}
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
@@ -3595,83 +668,6 @@
AppKit.framework/Headers/NSUserInterfaceItemSearching.h
-
- NSBrowser
- NSControl
-
- IBFrameworkSource
- AppKit.framework/Headers/NSBrowser.h
-
-
-
- NSControl
- NSView
-
- IBFrameworkSource
- AppKit.framework/Headers/NSControl.h
-
-
-
- NSDocument
- NSObject
-
- YES
-
- YES
- printDocument:
- revertDocumentToSaved:
- runPageLayout:
- saveDocument:
- saveDocumentAs:
- saveDocumentTo:
-
-
- YES
- id
- id
- id
- id
- id
- id
-
-
-
- IBFrameworkSource
- AppKit.framework/Headers/NSDocument.h
-
-
-
- NSDocument
-
- IBFrameworkSource
- AppKit.framework/Headers/NSDocumentScripting.h
-
-
-
- NSDocumentController
- NSObject
-
- YES
-
- YES
- clearRecentDocuments:
- newDocument:
- openDocument:
- saveAllDocuments:
-
-
- YES
- id
- id
- id
- id
-
-
-
- IBFrameworkSource
- AppKit.framework/Headers/NSDocumentController.h
-
-
NSFontManager
NSObject
@@ -3680,22 +676,6 @@
AppKit.framework/Headers/NSFontManager.h
-
- NSFormatter
- NSObject
-
- IBFrameworkSource
- Foundation.framework/Headers/NSFormatter.h
-
-
-
- NSMatrix
- NSControl
-
- IBFrameworkSource
- AppKit.framework/Headers/NSMatrix.h
-
-
NSMenu
NSObject
@@ -3712,14 +692,6 @@
AppKit.framework/Headers/NSMenuItem.h
-
- NSMovieView
- NSView
-
- IBFrameworkSource
- AppKit.framework/Headers/NSMovieView.h
-
-
NSObject
@@ -3741,7 +713,10 @@
NSObject
-
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSControl.h
+
NSObject
@@ -3809,7 +784,7 @@
NSObject
-
+
IBFrameworkSource
AppKit.framework/Headers/NSTableView.h
@@ -3976,27 +951,6 @@
AppKit.framework/Headers/NSResponder.h
-
- NSTableView
- NSControl
-
-
-
- NSText
- NSView
-
- IBFrameworkSource
- AppKit.framework/Headers/NSText.h
-
-
-
- NSTextView
- NSText
-
- IBFrameworkSource
- AppKit.framework/Headers/NSTextView.h
-
-
NSView
@@ -4072,4 +1026,3 @@
-
diff --git a/SparkleShare/Mac/SparkleShare/MainWindow.cs b/SparkleShare/Mac/SparkleShare/MainWindow.cs
deleted file mode 100644
index 2cbe2ae5..00000000
--- a/SparkleShare/Mac/SparkleShare/MainWindow.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using MonoMac.Foundation;
-using MonoMac.AppKit;
-
-namespace SparkleShare
-{
- public partial class MainWindow : MonoMac.AppKit.NSWindow
- {
- #region Constructors
-
- // Called when created from unmanaged code
- public MainWindow (IntPtr handle) : base(handle)
- {
- Initialize ();
- }
-
- // Called when created directly from a XIB file
- [Export("initWithCoder:")]
- public MainWindow (NSCoder coder) : base(coder)
- {
- Initialize ();
- }
-
- // Shared initialization code
- void Initialize ()
- {
- }
-
- #endregion
- }
-}
-
diff --git a/SparkleShare/Mac/SparkleShare/MainWindow.xib.designer.cs b/SparkleShare/Mac/SparkleShare/MainWindow.xib.designer.cs
deleted file mode 100644
index 2be04caa..00000000
--- a/SparkleShare/Mac/SparkleShare/MainWindow.xib.designer.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-// ------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Mono Runtime Version: 2.0.50727.1433
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-// ------------------------------------------------------------------------------
-
-namespace SparkleShare {
-
-
- // Should subclass MonoMac.AppKit.NSWindow
- [MonoMac.Foundation.Register("MainWindow")]
- public partial class MainWindow {
- }
-
- // Should subclass MonoMac.AppKit.NSWindowController
- [MonoMac.Foundation.Register("MainWindowController")]
- public partial class MainWindowController {
- }
-}
diff --git a/SparkleShare/Mac/SparkleShare/MainWindowController.cs b/SparkleShare/Mac/SparkleShare/MainWindowController.cs
deleted file mode 100644
index 22f30d23..00000000
--- a/SparkleShare/Mac/SparkleShare/MainWindowController.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using MonoMac.Foundation;
-using MonoMac.AppKit;
-
-namespace SparkleShare
-{
- public partial class MainWindowController : MonoMac.AppKit.NSWindowController
- {
- #region Constructors
-
- // Called when created from unmanaged code
- public MainWindowController (IntPtr handle) : base(handle)
- {
- Initialize ();
- }
-
- // Called when created directly from a XIB file
- [Export("initWithCoder:")]
- public MainWindowController (NSCoder coder) : base(coder)
- {
- Initialize ();
- }
-
- // Call to load from the XIB/NIB file
- public MainWindowController () : base("MainWindow")
- {
- Initialize ();
- }
-
- // Shared initialization code
- void Initialize ()
- {
- }
-
- #endregion
-
- //strongly typed window accessor
- public new MainWindow Window {
- get { return (MainWindow)base.Window; }
- }
- }
-}
-
diff --git a/SparkleShare/Mac/SparkleShare/Pixmaps/idle-active.png b/SparkleShare/Mac/SparkleShare/Pixmaps/idle-active.png
new file mode 100644
index 00000000..ca826a08
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/Pixmaps/idle-active.png differ
diff --git a/SparkleShare/Mac/SparkleShare/Pixmaps/idle.png b/SparkleShare/Mac/SparkleShare/Pixmaps/idle.png
new file mode 100644
index 00000000..ebb7f00b
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/Pixmaps/idle.png differ
diff --git a/SparkleShare/Mac/SparkleShare/Pixmaps/idle0.png b/SparkleShare/Mac/SparkleShare/Pixmaps/idle0.png
new file mode 100644
index 00000000..0070a165
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/Pixmaps/idle0.png differ
diff --git a/SparkleShare/Mac/SparkleShare/Pixmaps/idle1.png b/SparkleShare/Mac/SparkleShare/Pixmaps/idle1.png
new file mode 100644
index 00000000..863cc299
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/Pixmaps/idle1.png differ
diff --git a/SparkleShare/Mac/SparkleShare/Pixmaps/idle2.png b/SparkleShare/Mac/SparkleShare/Pixmaps/idle2.png
new file mode 100644
index 00000000..7b8cdcfc
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/Pixmaps/idle2.png differ
diff --git a/SparkleShare/Mac/SparkleShare/Pixmaps/idle3.png b/SparkleShare/Mac/SparkleShare/Pixmaps/idle3.png
new file mode 100644
index 00000000..c4eaa098
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/Pixmaps/idle3.png differ
diff --git a/SparkleShare/Mac/SparkleShare/Pixmaps/idle4.png b/SparkleShare/Mac/SparkleShare/Pixmaps/idle4.png
new file mode 100644
index 00000000..a53e2261
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/Pixmaps/idle4.png differ
diff --git a/SparkleShare/Mac/SparkleShare/sparkleshare-idle-focus.png b/SparkleShare/Mac/SparkleShare/Pixmaps/sparkleshare-idle-focus.png
similarity index 100%
rename from SparkleShare/Mac/SparkleShare/sparkleshare-idle-focus.png
rename to SparkleShare/Mac/SparkleShare/Pixmaps/sparkleshare-idle-focus.png
diff --git a/SparkleShare/Mac/SparkleShare/sparkleshare-idle.png b/SparkleShare/Mac/SparkleShare/Pixmaps/sparkleshare-idle.png
similarity index 100%
rename from SparkleShare/Mac/SparkleShare/sparkleshare-idle.png
rename to SparkleShare/Mac/SparkleShare/Pixmaps/sparkleshare-idle.png
diff --git a/SparkleShare/Mac/SparkleShare/SparkleLog.cs b/SparkleShare/Mac/SparkleShare/SparkleLog.cs
new file mode 100644
index 00000000..4052ce8b
--- /dev/null
+++ b/SparkleShare/Mac/SparkleShare/SparkleLog.cs
@@ -0,0 +1,128 @@
+// SparkleShare, an instant update workflow to Git.
+// Copyright (C) 2010 Hylke Bons
+//
+// 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
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+
+using System;
+using System.Drawing;
+using MonoMac.Foundation;
+using MonoMac.AppKit;
+using MonoMac.ObjCRuntime;
+using MonoMac.WebKit;
+
+namespace SparkleShare {
+
+ public class SparkleLog : NSWindow {
+
+ public readonly string LocalPath;
+
+ private WebView WebView;
+ private NSButton CloseButton;
+ private NSButton OpenFolderButton;
+
+ public SparkleLog (IntPtr handle) : base (handle) { }
+
+ public SparkleLog (string path) : base ()
+ {
+
+ LocalPath = path;
+
+ Delegate = new LogDelegate ();
+
+ SetFrame (new RectangleF (0, 0, 480, 640), true);
+
+ Center ();
+
+ StyleMask = (NSWindowStyle.Closable |
+ NSWindowStyle.Miniaturizable |
+ NSWindowStyle.Titled);
+
+ MaxSize = new SizeF (480, 640);
+ MinSize = new SizeF (480, 640);
+ HasShadow = true;
+ BackingType = NSBackingStore.Buffered;
+
+
+ ContentView.AddSubview (CreateEventLog ());
+
+ OpenFolderButton = new NSButton (new RectangleF (16, 12, 120, 31)) {
+ Title = "Open Folder",
+ BezelStyle = NSBezelStyle.Rounded
+ };
+
+ OpenFolderButton.Activated += delegate {
+ SparkleShare.Controller.OpenSparkleShareFolder (LocalPath);
+ };
+
+ ContentView.AddSubview (OpenFolderButton);
+
+
+ CloseButton = new NSButton (new RectangleF (480 - 120 - 16, 12, 120, 31)) {
+ Title = "Close",
+ BezelStyle = NSBezelStyle.Rounded
+ };
+
+ CloseButton.Activated += delegate {
+ InvokeOnMainThread (delegate {
+ PerformClose (this);
+ });
+ };
+
+ ContentView.AddSubview (CloseButton);
+
+
+ string name = System.IO.Path.GetFileName (LocalPath);
+ Title = String.Format ("Recent Events in ‘{0}’", name);
+
+ OrderFrontRegardless ();
+
+ }
+
+
+ public void UpdateEventLog ()
+ {
+
+ }
+
+
+ private WebView CreateEventLog ()
+ {
+
+ RectangleF frame = new RectangleF (0, 12 + 31 + 16, 480, 640 - (12 + 31 + 16));
+
+ WebView = new WebView (frame, "", "");
+ WebView.MainFrameUrl = "http://www.google.nl/";
+
+ return WebView;
+
+ }
+
+ }
+
+
+ public class LogDelegate : NSWindowDelegate {
+
+ public override void WillClose (NSNotification notification)
+ {
+
+ InvokeOnMainThread (delegate {
+ SparkleUI.OpenLogs.Remove ((SparkleLog) notification.Object);
+ });
+
+ }
+
+ }
+
+}
diff --git a/SparkleShare/Mac/SparkleShare/SparkleMacController.cs b/SparkleShare/Mac/SparkleShare/SparkleMacController.cs
new file mode 100644
index 00000000..3937009b
--- /dev/null
+++ b/SparkleShare/Mac/SparkleShare/SparkleMacController.cs
@@ -0,0 +1,95 @@
+// SparkleShare, an instant update workflow to Git.
+// Copyright (C) 2010 Hylke Bons
+//
+// 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
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+
+using MonoMac.Foundation;
+using MonoMac.AppKit;
+using MonoMac.ObjCRuntime;
+using SparkleLib;
+using System;
+using System.Diagnostics;
+using System.IO;
+
+namespace SparkleShare {
+
+ public class SparkleMacController : SparkleController {
+
+ public override void EnableSystemAutostart ()
+ {
+
+ // N/A
+
+ }
+
+
+ // Installs a launcher so the user can launch SparkleShare
+ // from the Internet category if needed
+ public override void InstallLauncher ()
+ {
+
+ // N/A
+
+ }
+
+
+ // Adds the SparkleShare folder to the user's
+ // list of bookmarked places
+ public override void AddToBookmarks ()
+ {
+
+
+
+ }
+
+
+ // Creates the SparkleShare folder in the user's home folder
+ public override bool CreateSparkleShareFolder ()
+ {
+
+ if (!Directory.Exists (SparklePaths.SparklePath)) {
+
+ Directory.CreateDirectory (SparklePaths.SparklePath);
+
+ NSWorkspace.SharedWorkspace.SetIconforFile (NSImage.ImageNamed ("sparkleshare.icns"),
+ SparklePaths.SparklePath, 0);
+
+ return true;
+
+ } else {
+
+ return false;
+
+ }
+
+ }
+
+
+ // Opens the SparkleShare folder or an (optional) subfolder
+ public override void OpenSparkleShareFolder (string subfolder)
+ {
+
+ string folder = Path.Combine (SparklePaths.SparklePath, subfolder);
+
+ Process process = new Process ();
+ process.StartInfo.Arguments = folder.Replace (" ", "\\ "); // Escape space-characters
+ process.StartInfo.FileName = "open";
+ process.Start ();
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/SparkleShare/Mac/SparkleShare/SparkleShare.csproj b/SparkleShare/Mac/SparkleShare/SparkleShare.csproj
index 8387f87f..50a86364 100644
--- a/SparkleShare/Mac/SparkleShare/SparkleShare.csproj
+++ b/SparkleShare/Mac/SparkleShare/SparkleShare.csproj
@@ -44,27 +44,26 @@
False
+
-
- MainWindow.xib
-
-
- MainWindow.xib
-
-
- MainWindow.xib
-
-
-
- MainMenu.xib
-
MainMenu.xib
+
+
+
+
+ SparkleShare.cs
+
+
+ SparkleController.cs
+
+
+
+
-
@@ -73,8 +72,19 @@
-
-
+
+
+
+
+
+
+
+
+
+
+ Pixmaps\side-splash.png
+
+
@@ -82,4 +92,7 @@
SparkleLib
+
+
+
\ No newline at end of file
diff --git a/SparkleShare/Mac/SparkleShare/SparkleStatusIcon.cs b/SparkleShare/Mac/SparkleShare/SparkleStatusIcon.cs
new file mode 100644
index 00000000..9357f7f7
--- /dev/null
+++ b/SparkleShare/Mac/SparkleShare/SparkleStatusIcon.cs
@@ -0,0 +1,399 @@
+// SparkleShare, an instant update workflow to Git.
+// Copyright (C) 2010 Hylke Bons
+//
+// 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
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+using System;
+using System.Drawing;
+using System.Timers;
+using MonoMac.Foundation;
+using MonoMac.AppKit;
+using MonoMac.ObjCRuntime;
+using Mono.Unix;
+
+namespace SparkleShare {
+
+ // The statusicon that stays in the
+ // user's notification area
+ public class SparkleStatusIcon : NSObject {
+
+ private Timer Animation;
+ private int FrameNumber;
+ private string StateText;
+
+ private NSStatusItem StatusItem;
+ private NSMenu Menu;
+ private NSMenuItem StateMenuItem;
+ private NSMenuItem FolderMenuItem;
+ private NSMenuItem [] FolderMenuItems;
+ private NSMenuItem SyncMenuItem;
+ private NSMenuItem NotificationsMenuItem;
+ private NSMenuItem AboutMenuItem;
+
+ private delegate void Task ();
+ private EventHandler [] Tasks;
+
+
+ // Short alias for the translations
+ public static string _ (string s)
+ {
+ return Catalog.GetString (s);
+ }
+
+
+ public SparkleStatusIcon () : base ()
+ {
+
+ Animation = CreateAnimation ();
+
+ StatusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (28);
+ StatusItem.HighlightMode = true;
+
+
+ SetNormalState ();
+ CreateMenu ();
+
+ Menu.Delegate = new SparkleStatusIconMenuDelegate ();
+
+
+ SparkleShare.Controller.FolderSizeChanged += delegate {
+ InvokeOnMainThread (delegate {
+ UpdateMenu ();
+ });
+ };
+
+ SparkleShare.Controller.FolderListChanged += delegate {
+ InvokeOnMainThread (delegate {
+ SetNormalState ();
+ CreateMenu ();
+ });
+ };
+
+ SparkleShare.Controller.OnIdle += delegate {
+ InvokeOnMainThread (delegate {
+ SetNormalState ();
+ UpdateMenu ();
+ });
+ };
+
+ SparkleShare.Controller.OnSyncing += delegate {
+ InvokeOnMainThread (delegate {
+ SetAnimationState ();
+ UpdateMenu ();
+ });
+ };
+
+ SparkleShare.Controller.OnError += delegate {
+ InvokeOnMainThread (delegate {
+ SetNormalState (true);
+ UpdateMenu ();
+ });
+ };
+
+ }
+
+
+ // Creates the Animation that handles the syncing animation
+ private Timer CreateAnimation ()
+ {
+
+ FrameNumber = 0;
+
+ Timer Animation = new Timer () {
+ Interval = 35
+ };
+
+ Animation.Elapsed += delegate {
+
+ if (FrameNumber < 4)
+ FrameNumber++;
+ else
+ FrameNumber = 0;
+
+ InvokeOnMainThread (delegate {
+
+ StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle" + FrameNumber + ".png");
+ StatusItem.AlternateImage.Size = new SizeF (16, 16);
+
+ StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle" + FrameNumber + ".png");
+ StatusItem.Image.Size = new SizeF (16, 16);
+
+ });
+
+ };
+
+ return Animation;
+
+ }
+
+
+ // Creates the menu that is popped up when the
+ // user clicks the status icon
+ public void CreateMenu ()
+ {
+
+ Menu = new NSMenu ();
+
+ StateMenuItem = new NSMenuItem () {
+ Title = StateText
+ };
+
+ Menu.AddItem (StateMenuItem);
+ Menu.AddItem (NSMenuItem.SeparatorItem);
+
+
+ FolderMenuItem = new NSMenuItem () {
+ Title = "SparkleShare"
+ };
+
+ FolderMenuItem.Activated += delegate {
+ SparkleShare.Controller.OpenSparkleShareFolder ();
+ };
+
+ //FolderMenuItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/sparkleshare.icns");
+ FolderMenuItem.Image = NSImage.ImageNamed ("NSFolder");
+ FolderMenuItem.Image.Size = new SizeF (16, 16);
+
+ Menu.AddItem (FolderMenuItem);
+
+
+ if (SparkleShare.Controller.Folders.Count > 0) {
+
+ FolderMenuItems = new NSMenuItem [SparkleShare.Controller.Folders.Count];
+ Tasks = new EventHandler [SparkleShare.Controller.Folders.Count];
+
+ int i = 0;
+
+ foreach (string path in SparkleShare.Controller.Folders) {
+
+// if (repo.HasUnsyncedChanges)
+// folder_action.IconName = "dialog-error";
+
+ NSMenuItem item = new NSMenuItem ();
+
+ item.Title = System.IO.Path.GetFileName (path);
+ item.Image = NSImage.ImageNamed ("NSFolder");
+ item.Image.Size = new SizeF (16, 16);
+
+ Tasks [i] = OpenEventLogDelegate(item.Title);
+
+ FolderMenuItems [i] = item;
+ FolderMenuItems [i].Activated += Tasks [i];
+ Menu.AddItem (FolderMenuItems [i]);
+
+ i++;
+
+ };
+
+ } else {
+
+ // TODO: No Remote Folders Yet
+
+ }
+
+ Menu.AddItem (NSMenuItem.SeparatorItem);
+
+
+ SyncMenuItem = new NSMenuItem () {
+ Title = "Add Remote Folder..."
+ };
+
+ if (SparkleShare.Controller.FirstRun)
+ SyncMenuItem.Enabled = false;
+
+ SyncMenuItem.Activated += delegate {
+ SparkleWindow w = new SparkleWindow ();
+ };
+
+ Menu.AddItem (SyncMenuItem);
+
+
+ Menu.AddItem (NSMenuItem.SeparatorItem);
+
+
+ NotificationsMenuItem = new NSMenuItem () {
+ Title = "Show Notifications"
+ };
+
+ if (SparkleShare.Controller.NotificationsEnabled)
+ NotificationsMenuItem.State = NSCellStateValue.On;
+
+ NotificationsMenuItem.Activated += delegate {
+
+ SparkleShare.Controller.ToggleNotifications ();
+
+ if (SparkleShare.Controller.NotificationsEnabled)
+ NotificationsMenuItem.State = NSCellStateValue.On;
+ else
+ NotificationsMenuItem.State = NSCellStateValue.Off;
+
+ };
+
+ Menu.AddItem (NotificationsMenuItem);
+
+
+ Menu.AddItem (NSMenuItem.SeparatorItem);
+
+
+ AboutMenuItem = new NSMenuItem () {
+ Title = "About"
+ };
+
+ AboutMenuItem.Activated += delegate {
+ // TODO
+ };
+
+ Menu.AddItem (AboutMenuItem);
+
+ StatusItem.Menu = Menu;
+ StatusItem.Menu.Update ();
+ Console.WriteLine ("MENU UPDATED");
+
+ }
+
+
+ // A method reference that makes sure that opening the
+ // event log for each repository works correctly
+ private EventHandler OpenEventLogDelegate (string path)
+ {
+
+ return delegate {
+
+ SparkleLog log = SparkleUI.OpenLogs.Find (delegate (SparkleLog l) {
+ return l.LocalPath.Equals (path);
+ });
+
+ // Check whether the log is already open, create a new one if
+ // that's not the case or present it to the user if it is
+ if (log == null) {
+
+ InvokeOnMainThread (delegate {
+ SparkleUI.OpenLogs.Add (new SparkleLog (path));
+ });
+
+ } else {
+
+ InvokeOnMainThread (delegate {
+ log.OrderFrontRegardless ();
+ });
+
+ }
+
+ };
+
+ }
+
+
+ public void UpdateMenu ()
+ {
+
+ StateMenuItem.Title = StateText;
+
+ }
+
+
+ // The state when there's nothing going on
+ private void SetNormalState ()
+ {
+
+ SetNormalState (false);
+
+ }
+
+
+ // The state when there's nothing going on
+ private void SetNormalState (bool error)
+ {
+
+ Animation.Stop ();
+
+ if (SparkleShare.Controller.Folders.Count == 0) {
+
+ StateText = _("Welcome to SparkleShare!");
+ InvokeOnMainThread (delegate {
+
+ StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle.png");
+ StatusItem.Image.Size = new SizeF (16, 16);
+
+ StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle-active.png");
+ StatusItem.AlternateImage.Size = new SizeF (16, 16);
+
+ });
+
+ } else {
+
+ if (error) {
+
+ StateText = _("Not everything is synced");
+ InvokeOnMainThread (delegate {
+ //Pixbuf = SparkleUIHelpers.GetIcon ("sparkleshare-syncing-error", 24);
+ });
+
+ } else {
+
+ StateText = _("Up to date") + " (" + SparkleShare.Controller.FolderSize + ")";
+ InvokeOnMainThread (delegate {
+
+ StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle.png");
+ StatusItem.Image.Size = new SizeF (16, 16);
+
+ StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle-active.png");
+ StatusItem.AlternateImage.Size = new SizeF (16, 16);
+
+ });
+
+ }
+
+ }
+
+ }
+
+
+ // The state when animating
+ private void SetAnimationState ()
+ {
+
+ StateText = _("Syncing…");
+
+ if (!Animation.Enabled)
+ Animation.Start ();
+
+ }
+
+ }
+
+
+ public class SparkleStatusIconMenuDelegate : NSMenuDelegate {
+
+ public override void MenuWillHighlightItem (NSMenu menu, NSMenuItem item) { }
+
+ public override void MenuWillOpen (NSMenu menu)
+ {
+
+ Console.WriteLine ("OPENED");
+
+ InvokeOnMainThread (delegate {
+
+ foreach (SparkleLog log in SparkleUI.OpenLogs)
+ log.OrderFrontRegardless ();
+
+ });
+
+ }
+
+ }
+
+}
+
+
diff --git a/SparkleShare/Mac/SparkleShare/SparkleUI.cs b/SparkleShare/Mac/SparkleShare/SparkleUI.cs
index 8ce3cf2f..f551d6dd 100644
--- a/SparkleShare/Mac/SparkleShare/SparkleUI.cs
+++ b/SparkleShare/Mac/SparkleShare/SparkleUI.cs
@@ -8,164 +8,58 @@
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-using Gtk;
-using Mono.Unix;
-using Mono.Unix.Native;
-using SparkleLib;
+
using System;
using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
+using System.Drawing;
+using System.Timers;
+using MonoMac.Foundation;
+using MonoMac.AppKit;
+using MonoMac.ObjCRuntime;
+using MonoMac.WebKit;
namespace SparkleShare {
- public class SparkleUI {
-
+ public partial class AppDelegate : NSApplicationDelegate {
+ // Workaround to be able to work with SparkleUI as the main class
+ }
+
+
+ public class SparkleUI : AppDelegate
+ {
+
public static SparkleStatusIcon StatusIcon;
public static List OpenLogs;
-
- // Short alias for the translations
- public static string _(string s)
- {
- return Catalog.GetString (s);
- }
-
-
+
+
public SparkleUI ()
{
- // Initialize the application
- Application.Init ();
+ NSApplication.Init ();
- // Create the statusicon
+ NSApplication.SharedApplication.applicationIconImage
+ = NSImage.ImageNamed ("sparkleshare.icns");
+
+ OpenLogs = new List ();
StatusIcon = new SparkleStatusIcon ();
-
- // Keep track of which event logs are open
- SparkleUI.OpenLogs = new List ();
-
- SparkleShare.Controller.OnFirstRun += delegate {
- Application.Invoke (delegate {
-
- SparkleIntro intro = new SparkleIntro ();
- intro.ShowAll ();
-
- });
- };
-
- SparkleShare.Controller.OnInvitation += delegate (string invitation_file_path) {
- Application.Invoke (delegate {
-
- SparkleInvitation invitation = new SparkleInvitation (invitation_file_path);
- invitation.Present ();
-
- });
- };
-
- // Show a bubble when there are new changes
- SparkleShare.Controller.NotificationRaised += delegate (SparkleCommit commit, string repository_path) {
-
- string file_name = "";
- string message = null;
-
- if (commit.Added.Count > 0) {
-
- foreach (string added in commit.Added) {
- file_name = added;
- break;
- }
-
- message = String.Format (_("added ‘{0}’"), file_name);
-
- }
-
- if (commit.Edited.Count > 0) {
-
- foreach (string modified in commit.Edited) {
- file_name = modified;
- break;
- }
-
- message = String.Format (_("edited ‘{0}’"), file_name);
-
- }
-
- if (commit.Deleted.Count > 0) {
-
- foreach (string removed in commit.Deleted) {
- file_name = removed;
- break;
- }
-
- message = String.Format (_("deleted ‘{0}’"), file_name);
-
- }
-
- int changes_count = (commit.Added.Count +
- commit.Edited.Count +
- commit.Deleted.Count);
-
- if (changes_count > 1)
- message += " + " + (changes_count - 1);
-
-
- Application.Invoke (delegate {
-
- SparkleBubble bubble = new SparkleBubble (commit.UserName, message);
-
- string avatar_file_path = SparkleUIHelpers.GetAvatar (commit.UserEmail, 32);
-
- if (avatar_file_path != null)
- bubble.Icon = new Gdk.Pixbuf (avatar_file_path);
- else
- bubble.Icon = SparkleUIHelpers.GetIcon ("avatar-default", 32);
-
-// bubble.AddAction ("", "Show Events", delegate {
-
-// SparkleLog log = new SparkleLog (repository_path);
-// log.ShowAll ();
-
-// });
-
-// bubble.Show ();
-
- });
-
- };
-
- // Show a bubble when there was a conflict
- SparkleShare.Controller.ConflictNotificationRaised += delegate {
- Application.Invoke (delegate {
-
- string title = _("Ouch! Mid-air collision!");
- string subtext = _("Don't worry, SparkleShare made a copy of each conflicting file.");
-
- SparkleBubble bubble = new SparkleBubble(title, subtext);
-// bubble.Show ();
-
- });
- };
}
-
- // Runs the application
+
public void Run ()
{
-
- Application.Run ();
-
+
+ NSApplication.Main (new string [0]);
+
}
-
+
}
-}
\ No newline at end of file
+}
diff --git a/SparkleShare/Mac/SparkleShare/SparkleWindow.cs b/SparkleShare/Mac/SparkleShare/SparkleWindow.cs
new file mode 100644
index 00000000..053687f5
--- /dev/null
+++ b/SparkleShare/Mac/SparkleShare/SparkleWindow.cs
@@ -0,0 +1,69 @@
+// SparkleShare, an instant update workflow to Git.
+// Copyright (C) 2010 Hylke Bons
+//
+// 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
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+
+using System;
+using System.Drawing;
+using MonoMac.Foundation;
+using MonoMac.AppKit;
+using MonoMac.ObjCRuntime;
+using MonoMac.WebKit;
+
+namespace SparkleShare {
+
+ public class SparkleWindow : NSWindow {
+
+ public readonly string LocalPath;
+
+ private NSImage SideSplash;
+
+ public SparkleWindow () : base ()
+ {
+
+ SetFrame (new RectangleF (0, 0, 640, 480), true);
+
+ Center ();
+
+ StyleMask = (NSWindowStyle.Closable |
+ NSWindowStyle.Miniaturizable |
+ NSWindowStyle.Titled);
+
+ MaxSize = new SizeF (640, 480);
+ MinSize = new SizeF (640, 480);
+ HasShadow = true;
+ BackingType = NSBackingStore.Buffered;
+
+ SideSplash = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/side-splash.png");
+ SideSplash.Size = new SizeF (150, 480);
+
+
+ NSText tv = new NSText (new RectangleF (200, 200, 200, 200)) {
+ Value = "TEST"
+ };
+
+ ContentView.AddSubview (new NSImageView (new RectangleF (0, 0, 150, 480)) { Image = SideSplash});
+ ContentView.AddSubview (new NSTextField (new RectangleF (200, 100, 128, 31)) { BezelStyle = NSTextFieldBezelStyle.Rounded});
+
+
+
+ NSApplication.SharedApplication.ActivateIgnoringOtherApps (true);
+ MakeKeyAndOrderFront (this);
+
+ }
+
+ }
+
+}
diff --git a/SparkleShare/Mac/SparkleShare/sparkleshare.icns b/SparkleShare/Mac/SparkleShare/sparkleshare.icns
new file mode 100644
index 00000000..c5501667
Binary files /dev/null and b/SparkleShare/Mac/SparkleShare/sparkleshare.icns differ
diff --git a/SparkleShare/SparkleController.cs b/SparkleShare/SparkleController.cs
index eb6d00f4..25f5b16e 100644
--- a/SparkleShare/SparkleController.cs
+++ b/SparkleShare/SparkleController.cs
@@ -14,6 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+
using Mono.Unix;
using SparkleLib;
using System;
@@ -25,6 +26,10 @@ using System.Threading;
using System.Text.RegularExpressions;
using System.Xml;
+using System.Net;
+using System.Security.Cryptography;
+using System.Text;
+
namespace SparkleShare {
public abstract class SparkleController {
@@ -106,8 +111,7 @@ namespace SparkleShare {
// Remove the repository when a delete event occurs
watcher.Deleted += delegate (object o, FileSystemEventArgs args) {
- if (Directory.Exists (args.FullPath))
- RemoveRepository (args.FullPath);
+ RemoveRepository (args.FullPath);
};
@@ -204,20 +208,21 @@ namespace SparkleShare {
}
- public List GetLog (string path)
+ public List GetLog (string name)
{
+ string path = Path.Combine (SparklePaths.SparklePath, name);
int log_size = 30;
- List list = new List ();
+ List list = new List ();
foreach (SparkleRepo repo in Repositories) {
if (repo.LocalPath.Equals (path)) {
foreach (SparkleCommit commit in repo.GetCommits (log_size))
- list.Add ((ChangeSet) commit);
-
+ list.Add (commit);
+
return list;
}
@@ -229,6 +234,179 @@ namespace SparkleShare {
}
+ public string GetHTMLLog (string name)
+ {
+
+ List commits = GetLog (name);
+
+ List activity_days = new List ();
+
+ foreach (SparkleCommit commit in commits) {
+
+ GetAvatar (commit.UserEmail, 32);
+
+ bool commit_inserted = false;
+ foreach (ActivityDay stored_activity_day in activity_days) {
+
+ if (stored_activity_day.DateTime.Year == commit.DateTime.Year &&
+ stored_activity_day.DateTime.Month == commit.DateTime.Month &&
+ stored_activity_day.DateTime.Day == commit.DateTime.Day) {
+
+ stored_activity_day.Add (commit);
+ commit_inserted = true;
+ break;
+
+ }
+
+ }
+
+ if (!commit_inserted) {
+
+ ActivityDay activity_day = new ActivityDay (commit.DateTime);
+ activity_day.Add (commit);
+ activity_days.Add (activity_day);
+
+ }
+
+ }
+
+
+
+
+ StreamReader reader;
+
+ reader = new StreamReader (Defines.PREFIX + "/share/sparkleshare/html/event-log.html");
+ string event_log_html = reader.ReadToEnd ();
+ reader.Close ();
+
+ reader = new StreamReader (Defines.PREFIX + "/share/sparkleshare/html/day-entry.html");
+ string day_entry_html = reader.ReadToEnd ();
+ reader.Close ();
+
+ reader = new StreamReader (Defines.PREFIX + "/share/sparkleshare/html/event-entry.html");
+ string event_entry_html = reader.ReadToEnd ();
+ reader.Close ();
+
+
+
+
+ string event_log = "";
+
+ foreach (ActivityDay activity_day in activity_days) {
+
+ string event_entries = "";
+
+ foreach (SparkleCommit change_set in activity_day) {
+
+ string event_entry = "";
+
+ if (change_set.Edited.Count > 0) {
+
+ event_entry += "- Edited
";
+
+ foreach (string file_path in change_set.Edited) {
+
+ if (File.Exists (SparkleHelpers.CombineMore (SparklePaths.SparklePath ,name , file_path))) {
+
+ event_entry += "- " + file_path + "
";
+
+ } else {
+
+ event_entry += "- " + SparkleHelpers.CombineMore (SparklePaths.SparklePath, name, file_path) + "
";
+
+ }
+
+ }
+
+ }
+
+
+ if (change_set.Added.Count > 0) {
+
+ event_entry += "- Added
";
+
+ foreach (string file_path in change_set.Added) {
+
+ if (File.Exists (SparkleHelpers.CombineMore (SparklePaths.SparklePath ,name , file_path))) {
+
+ event_entry += "- " + file_path + "
";
+
+ } else {
+
+ event_entry += "- " + SparkleHelpers.CombineMore (SparklePaths.SparklePath ,name , file_path) + "
";
+
+ }
+
+ }
+
+ }
+
+ if (change_set.Deleted.Count > 0) {
+
+ event_entry += "- Deleted
";
+
+ foreach (string file_path in change_set.Deleted) {
+
+ if (File.Exists (SparkleHelpers.CombineMore (SparklePaths.SparklePath ,name , file_path))) {
+
+ event_entry += "- " + file_path + "
";
+
+ } else {
+
+ event_entry += "- " + SparkleHelpers.CombineMore (SparklePaths.SparklePath ,name , file_path) + "
";
+
+ }
+
+ }
+
+ }
+Console.WriteLine(GetAvatar (change_set.UserEmail, 32));
+ event_entry += "
";
+ event_entries += event_entry_html.Replace ("", event_entry)
+ .Replace ("", change_set.UserName)
+ .Replace ("", "file://" +GetAvatar (change_set.UserEmail, 32) )
+ .Replace ("", change_set.DateTime.ToString ("H:mm"));
+
+ }
+
+
+
+ string day_entry = "";
+
+ DateTime today = DateTime.Now;
+ DateTime yesterday = DateTime.Now.AddDays (-1);
+
+ if (today.Day == activity_day.DateTime.Day &&
+ today.Month == activity_day.DateTime.Month &&
+ today.Year == activity_day.DateTime.Year) {
+
+ day_entry = day_entry_html.Replace ("", "Today");
+
+ } else if (yesterday.Day == activity_day.DateTime.Day &&
+ yesterday.Month == activity_day.DateTime.Month &&
+ yesterday.Year == activity_day.DateTime.Year) {
+
+ day_entry = day_entry_html.Replace ("", "Yesterday");
+
+ } else {
+
+ day_entry = day_entry_html.Replace ("",
+ "" + activity_day.DateTime.ToString ("ddd MMM d, yyyy") + "");
+
+ }
+
+ event_log += day_entry.Replace ("", event_entries);
+
+
+ }
+
+ string html = event_log_html.Replace ("", event_log);
+
+ return html;
+
+ }
+
+
// Creates a folder in the user's home folder to store configuration
private void CreateConfigurationFolders ()
{
@@ -820,6 +998,76 @@ namespace SparkleShare {
}
+
+
+ // Gets the avatar for a specific email address and size
+ public static string GetAvatar (string email, int size)
+ {
+
+ string avatar_path = SparkleHelpers.CombineMore (SparklePaths.SparkleLocalIconPath,
+ size + "x" + size, "status");
+
+ if (!Directory.Exists (avatar_path)) {
+
+ Directory.CreateDirectory (avatar_path);
+ SparkleHelpers.DebugInfo ("Config", "Created '" + avatar_path + "'");
+
+ }
+
+ string avatar_file_path = SparkleHelpers.CombineMore (avatar_path, "avatar-" + email);
+
+ if (File.Exists (avatar_file_path)) {
+
+ return avatar_file_path;
+
+ } else {
+
+ // Let's try to get the person's gravatar for next time
+ WebClient web_client = new WebClient ();
+ Uri uri = new Uri ("http://www.gravatar.com/avatar/" + GetMD5 (email) +
+ ".jpg?s=" + size + "&d=404");
+
+ string tmp_file_path = SparkleHelpers.CombineMore (SparklePaths.SparkleTmpPath, email + size);
+
+ if (!File.Exists (tmp_file_path)) {
+
+ web_client.DownloadFileAsync (uri, tmp_file_path);
+
+ web_client.DownloadFileCompleted += delegate {
+
+ if (File.Exists (avatar_file_path))
+ File.Delete (avatar_file_path);
+
+ FileInfo tmp_file_info = new FileInfo (tmp_file_path);
+
+ if (tmp_file_info.Length > 255)
+ File.Move (tmp_file_path, avatar_file_path);
+
+ };
+
+ }
+
+ // Fall back to a generic icon if there is no gravatar
+ if (File.Exists (avatar_file_path))
+ return avatar_file_path;
+ else
+ return null;
+
+ }
+
+ }
+
+
+ // Creates an MD5 hash of input
+ public static string GetMD5 (string s)
+ {
+ MD5 md5 = new MD5CryptoServiceProvider ();
+ Byte[] bytes = ASCIIEncoding.Default.GetBytes (s);
+ Byte[] encodedBytes = md5.ComputeHash (bytes);
+ return BitConverter.ToString (encodedBytes).ToLower ().Replace ("-", "");
+ }
+
+
}
@@ -827,4 +1075,21 @@ namespace SparkleShare {
}
+
+ // All commits that happened on a day
+ public class ActivityDay : List
+ {
+
+ public DateTime DateTime;
+
+ public ActivityDay (DateTime date_time)
+ {
+
+ DateTime = date_time;
+ DateTime = new DateTime (DateTime.Year, DateTime.Month, DateTime.Day);
+
+ }
+
+ }
+
}
\ No newline at end of file
diff --git a/SparkleShare/SparkleDialog.cs b/SparkleShare/SparkleDialog.cs
index 6189788e..ba2eb681 100644
--- a/SparkleShare/SparkleDialog.cs
+++ b/SparkleShare/SparkleDialog.cs
@@ -194,9 +194,9 @@ GNU Lesser General Public License for more details."; */
vbox.PackStart (new HSeparator (), false, false, 0);
vbox.PackStart (button_bar, false, false, 0);
- string image_path = SparkleHelpers.CombineMore (Defines.PREFIX, "share", "pixmaps",
- "sparkleshare-about.png");
-
+ string image_path = SparkleHelpers.CombineMore (Defines.DATAROOTDIR, "sparkleshare",
+ "pixmaps", "sparkleshare-about.png");
+ System.Console.WriteLine(image_path);
wrapper.PackStart (new Image (image_path), false, false, 0);
wrapper.PackStart (vbox, true, true, 0);
diff --git a/SparkleShare/SparkleLinController.cs b/SparkleShare/SparkleLinController.cs
index ba26ecae..228278a4 100644
--- a/SparkleShare/SparkleLinController.cs
+++ b/SparkleShare/SparkleLinController.cs
@@ -146,7 +146,7 @@ namespace SparkleShare {
Directory.CreateDirectory (SparklePaths.SparklePath);
SparkleHelpers.DebugInfo ("Controller", "Created '" + SparklePaths.SparklePath + "'");
- string icon_file_path = SparkleHelpers.CombineMore (Defines.PREFIX, "share", "icons", "hicolor",
+ string icon_file_path = SparkleHelpers.CombineMore (Defines.DATAROOTDIR, "icons", "hicolor",
"48x48", "apps", "folder-sparkleshare.png");
string gvfs_command_path = SparkleHelpers.CombineMore (Path.VolumeSeparatorChar.ToString (),
@@ -196,4 +196,4 @@ namespace SparkleShare {
}
-}
\ No newline at end of file
+}
diff --git a/SparkleShare/SparkleShare.cs b/SparkleShare/SparkleShare.cs
index e2579056..5e707832 100644
--- a/SparkleShare/SparkleShare.cs
+++ b/SparkleShare/SparkleShare.cs
@@ -25,6 +25,7 @@ using SparkleLib;
using SparkleLib.Options;
using System.Text;
+
namespace SparkleShare {
// This is SparkleShare!
@@ -83,8 +84,8 @@ namespace SparkleShare {
if (show_help)
ShowHelp (p);
-
- switch (Environment.OSVersion.Platform) {
+
+ switch (SparkleShare.Platform) {
case PlatformID.Unix:
SetProcessName ("sparkleshare");
@@ -148,6 +149,11 @@ namespace SparkleShare {
}
+
+ // Strange magic needed by SetProcessName ()
+ [DllImport ("libc")]
+ private static extern int prctl (int option, byte [] arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5);
+
// Sets the Unix process name to 'sparkleshare' instead of 'mono'
private static void SetProcessName (string name)
@@ -169,12 +175,43 @@ namespace SparkleShare {
}
}
-
-
- // Strange magic needed by SetProcessName
- [DllImport ("libc")]
- private static extern int prctl (int option, byte [] arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5);
+
+ // Strange magic needed by Platform ()
+ [DllImport ("libc")]
+ static extern int uname (IntPtr buf);
+
+
+ // This fixes the PlatformID enumeration for MacOSX in Environment.OSVersion.Platform,
+ // which is intentionally broken in Mono for hystorical reasons
+ static PlatformID Platform {
+
+ get {
+
+ IntPtr buf = IntPtr.Zero;
+
+ try {
+
+ buf = Marshal.AllocHGlobal (8192);
+
+ if (uname (buf) == 0 && Marshal.PtrToStringAnsi (buf) == "Darwin")
+ return PlatformID.MacOSX;
+
+ } catch {
+
+ } finally {
+
+ if (buf != IntPtr.Zero)
+ Marshal.FreeHGlobal (buf);
+
+ }
+
+ return Environment.OSVersion.Platform;
+
+ }
+
+ }
+
}
}
diff --git a/SparkleShare/SparkleWindow.cs b/SparkleShare/SparkleWindow.cs
index 4860f88a..5183f480 100644
--- a/SparkleShare/SparkleWindow.cs
+++ b/SparkleShare/SparkleWindow.cs
@@ -48,7 +48,7 @@ namespace SparkleShare {
HBox = new HBox (false, 6);
- string image_path = SparkleHelpers.CombineMore (Defines.PREFIX, "share", "sparkleshare",
+ string image_path = SparkleHelpers.CombineMore (Defines.DATAROOTDIR, "sparkleshare",
"pixmaps", "side-splash.png");
Image side_splash = new Image (image_path);
diff --git a/data/sparkleshare-gnome.svg b/data/sparkleshare-gnome.svg
index 820af8c3..a7d050e3 100644
--- a/data/sparkleshare-gnome.svg
+++ b/data/sparkleshare-gnome.svg
@@ -16,7 +16,7 @@
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:version="0.47 r22583"
+ inkscape:version="0.48.0 r9654"
sodipodi:docname="sparkleshare-gnome.svg"
sodipodi:version="0.32"
style="display:inline;enable-background:new"
@@ -30,9 +30,9 @@
guidetolerance="10000"
height="300px"
id="base"
- inkscape:current-layer="layer18"
- inkscape:cx="452.99246"
- inkscape:cy="152.00765"
+ inkscape:current-layer="layer20"
+ inkscape:cx="363.28616"
+ inkscape:cy="119.67008"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:pageopacity="0.0"
@@ -40,9 +40,9 @@
inkscape:showpageshadow="false"
inkscape:snap-bbox="true"
inkscape:snap-nodes="false"
- inkscape:window-height="805"
- inkscape:window-width="1332"
- inkscape:window-x="412"
+ inkscape:window-height="778"
+ inkscape:window-width="1280"
+ inkscape:window-x="0"
inkscape:window-y="0"
inkscape:zoom="1"
objecttolerance="10000"
@@ -2561,6 +2561,46 @@
inkscape:label="small sizes"
id="layer20"
inkscape:groupmode="layer">
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+