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 YES - - - About SparkleShare - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - Services @@ -179,1058 +140,6 @@ _NSAppleMenu - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Paste and Match Style - V - 1572864 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling and Grammar - : - 1048576 - 2147483647 - - - - - - Check Document Now - ; - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - Correct Spelling Automatically - - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Show Substitutions - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Dashes - - 2147483647 - - - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - Text Replacement - - 2147483647 - - - - - - - - - Transformations - - 2147483647 - - - submenuAction: - - Transformations - - YES - - - Make Upper Case - - 2147483647 - - - - - - Make Lower Case - - 2147483647 - - - - - - Capitalize - - 2147483647 - - - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - YES - - - Font - - 2147483647 - - - submenuAction: - - Font - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - YES - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - YES - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Writing Direction - - 2147483647 - - - submenuAction: - - Writing Direction - - YES - - - YES - Paragraph - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - YES - Selection - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - Window @@ -1340,142 +249,6 @@ 39 - - - print: - - - - 86 - - - - 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"> + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +