public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row) { var item = owner.messagesDataSource.Items[(int)row]; if (tableColumn == owner.textColumn) { var lbl = new NSLinkLabel(); lbl.StringValue = item.Text; lbl.Links = item.Links.Select(l => new NSLinkLabel.Link(l.Item1, l.Item2, l.Item3)).ToList(); lbl.LinkClicked = async(sender, e) => { // await below is to "re-post" click handling to the end of UI messages queue. // Without this workaround currently handled mouse click // de-facto fails SelectLayoutTextRange() that is a part of this link's behavior. // The failure is that templateTextBox fails to become first responder // which in turn makes it impossible to change TextBox's SelectedRange. await Task.Yield(); (e.Link.Tag as Action)?.Invoke(); }; return(lbl); } else if (tableColumn == owner.iconColumn) { return(new NSImageView() { Image = owner.GetIcon(item.Icon), }); } return(null); }
public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row) { var item = owner.capturesDataSource.items[(int)row]; var lbl = NSLinkLabel.CreateLabel(item.Text); lbl.BackgroundColor = item.Color.ToNSColor(); return(lbl); }
public static void SetAttributedContents(this NSLinkLabel lbl, string value) { var parsed = Presenters.LinkLabelUtils.ParseLinkLabelString(value); lbl.StringValue = parsed.Text; lbl.Links = parsed.Links.Select( l => new NSLinkLabel.Link(l.Item1, l.Item2, l.Item3)).ToList(); }
public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row) { var lnk = NSLinkLabel.CreateLabel(owner.patternsDataSource.Items[(int)row]); lnk.LinkClicked = (sender, e) => { if (e.NativeEvent.ClickCount == 2) { owner.eventsHandler.OnSelectedAvailablePatternDoubleClicked(); } }; return(lnk); }
public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row) { var ret = NSLinkLabel.CreateLabel(); ret.StringValue = owner.dataSource.items[(int)row]; ret.LinkClicked = (sender, e) => { if (e.NativeEvent.ClickCount >= 2) { owner.eventsHandler.OnControlDblClicked(); } }; return(ret); }
public static NSLinkLabel CreateLabel(string text = "") { var view = new NSLinkLabel { BackgroundColor = NSColor.Clear, LinksColor = NSColor.ControlText, UnderlineLinks = false, Cursor = NSCursor.ArrowCursor, RespectInteriorBackgroundStyle = true, StringValue = text, }; return(view); }
public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row) { // todo: represent item.Data.IsEnabled var item = owner.dataSource.items[(int)row]; if (tableColumn == owner.timeDeltaColumn) { var view = (NSTextField )tableView.MakeView(timeDeltaCellId, this); if (view == null) { view = new NSTextField() { Identifier = timeDeltaCellId, BackgroundColor = NSColor.Clear, Bordered = false, Selectable = false, Editable = false, }; view.Cell.LineBreakMode = NSLineBreakMode.Clipping; } view.StringValue = item.Data.Delta; return(view); } else if (tableColumn == owner.currentPositionIndicatorColumn) { return(null); } else if (tableColumn == owner.textColumn) { var view = (NSLinkLabel)tableView.MakeView(textCellId, this); if (view == null) { view = new NSLinkLabel(); } view.StringValue = item.Data.Text; view.LinkClicked = (s, e) => owner.OnItemClicked(item, e.NativeEvent); if (owner.viewModel.Theme == Presenters.ColorThemeMode.Dark && item.Data.ContextColor.HasValue) { view.LinksColor = item.Data.ContextColor.Value.ToNSColor(); } return(view); } return(null); }
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) { var presentationItem = (item as Item)?.PresentationObject; var view = NSLinkLabel.CreateLabel(); view.LinkClicked = (sender, e) => { if (e.NativeEvent.ClickCount == 2) { owner.eventsHandler.OnEditClicked(); } }; view.StringValue = presentationItem?.Caption ?? ""; return(view); }
public static void SetAttributedContents(this NSLinkLabel lbl, string value) { var text = new StringBuilder(value ?? ""); var links = new List <NSLinkLabel.Link>(); for (; ;) { var m = linkRe.Match(text.ToString()); if (!m.Success) { break; } var g = m.Groups[2]; text.Remove(m.Index + m.Length - 1, 1); // remove trailing '*' text.Remove(m.Index, 2 + m.Groups[1].Length); // remove leading '*', action id and space following action id links.Add(new NSLinkLabel.Link(g.Index - 2 - m.Groups[1].Length, g.Length, m.Groups[1].Value)); } lbl.StringValue = text.ToString(); lbl.Links = links; }
NSView GetView(NSTableColumn tableColumn, IViewItem sourceItem) { if (tableColumn == sourceCheckedColumn) { if (sourceItem.Checked == null) { return(null); } var cellIdentifier = "checked_cell"; var view = (NSButton)outlineView.MakeView(cellIdentifier, this); if (view == null) { view = new NSButton(); view.Identifier = cellIdentifier; view.SetButtonType(NSButtonType.Switch); view.BezelStyle = 0; view.ImagePosition = NSCellImagePosition.ImageOnly; view.Action = new ObjCRuntime.Selector("ItemChecked:"); } view.Target = new CheckTarget { item = sourceItem, viewModel = viewModel }; view.State = sourceItem.Checked.GetValueOrDefault(false) ? NSCellStateValue.On : NSCellStateValue.Off; return(view); } else if (tableColumn == sourceDescriptionColumn) { var cellIdentifier = "description_cell"; var view = (NSLinkLabel)outlineView.MakeView(cellIdentifier, this); if (view == null) { view = NSLinkLabel.CreateLabel(); view.Identifier = cellIdentifier; view.LinkClicked = (sender, e) => { if (e.NativeEvent.ClickCount == 2) { viewModel.OnEnterKeyPressed(); } }; } view.BackgroundColor = sourceItem.Color.isFailureColor ? sourceItem.Color.value.ToNSColor() : NSColor.Clear; view.StringValue = sourceItem.ToString(); view.Menu = outlineView.Menu; return(view); } else if (tableColumn == currentSourceColumn) { var cellIdentifier = "current_source_mark_cell"; var view = (NSCustomizableView)outlineView.MakeView(cellIdentifier, this); if (view == null) { view = new NSCustomizableView(); view.Identifier = cellIdentifier; } view.OnPaint = (ditryRect) => { var focusedItem = viewModel.FocusedMessageItem; if (focusedItem == null) { return; } if (!(focusedItem == sourceItem || focusedItem.Parent == sourceItem)) { return; } using (var g = new LJD.Graphics()) { var s = currentSourceImage.GetSize(height: 9); var r = view.Bounds; r = new CoreGraphics.CGRect((r.Left + r.Right - s.Width) / 2, (r.Top + r.Bottom - s.Height) / 2, s.Width, s.Height); g.DrawImage(currentSourceImage, r.ToRectangleF()); } }; return(view); } return(null); }
public static IDialogView CreateDialog( NSWindow parentWindow, IChangeNotification changeNotification, IDialogViewModel viewModel, IEnumerable <string> tags, string initiallyFocusedTag ) { var dlg = new TagsSelectionSheetController(parentWindow, viewModel); dlg.Window.GetHashCode(); int focusedRow = -1; foreach (var t in tags) { var b = new NSButton() { Title = t, State = NSCellStateValue.Off }; b.SetButtonType(NSButtonType.Switch); if (initiallyFocusedTag == t) { focusedRow = dlg.views.Count; } b.Action = new ObjCRuntime.Selector("OnTagChecked:"); b.Target = dlg; dlg.views.Add(b); } dlg.table.Delegate = new Delegate() { owner = dlg }; dlg.table.DataSource = new DataSource() { owner = dlg }; if (focusedRow >= 0) { dlg.table.SelectRow(focusedRow, byExtendingSelection: false); dlg.table.ScrollRowToVisible(focusedRow); } dlg.linkLabel.StringValue = "select: all none"; dlg.linkLabel.Links = new [] { new NSLinkLabel.Link(8, 3, ""), new NSLinkLabel.Link(14, 4, null), }; dlg.formulaTextView.Delegate = new TextViewDelegate() { view = dlg.formulaTextView, viewModel = viewModel, changeNotification = changeNotification }; dlg.linkLabel.LinkClicked = (s, e) => { if (e.Link.Tag != null) { viewModel.OnUseAllClicked(); } else { viewModel.OnUnuseAllClicked(); } }; var updateCheckboxes = Updaters.Create( () => viewModel.SelectedTags, () => viewModel.IsEditingFormula, (selected, editing) => { dlg.views.ForEach(b => { b.State = selected.Contains(b.Title) ? NSCellStateValue.On : NSCellStateValue.Off; b.Enabled = !editing; }); } ); NSColor getLinkColor(MessageSeverity sev) => sev == MessageSeverity.Error ? NSColor.Red : sev == MessageSeverity.Warning ? NSColor.Orange : NSColor.Text; var updateFormula = Updaters.Create( () => viewModel.Formula, () => viewModel.IsEditingFormula, () => viewModel.FormulaStatus, (formula, editing, status) => { if (dlg.formulaTextView.Value != formula) { dlg.formulaTextView.Value = formula; } dlg.formulaTextView.Editable = editing; dlg.formulaTextView.BackgroundColor = editing ? NSColor.TextBackground : NSColor.ControlBackground; dlg.formulaTextView.TextColor = editing ? NSColor.Text : NSColor.PlaceholderTextColor; dlg.linkLabel.IsEnabled = !editing; dlg.okButton.Enabled = !editing; dlg.formulaEditLinkLabel.StringValue = editing ? "done" : "edit"; var(statusText, statusSeverity) = status; dlg.formulaLinkLabel.SetAttributedContents(statusText); dlg.formulaEditLinkLabel.IsEnabled = statusSeverity != MessageSeverity.Error; dlg.formulaLinkLabel.TextColor = getLinkColor(statusSeverity); } ); var formulaFocusSideEffect = Updaters.Create( () => viewModel.IsEditingFormula, editing => { if (editing) { dlg.Window.MakeFirstResponder(dlg.formulaTextView); } } ); var updateSuggestions = Updaters.Create( () => viewModel.FormulaSuggesions, value => { var(list, selectedItem) = value; dlg.suggestionsContainer.Hidden = list.IsEmpty; dlg.suggestionsLabel.Hidden = list.IsEmpty; dlg.suggestionsView.Subviews.ToList().ForEach(v => v.RemoveFromSuperview()); var itemHeight = 17; nfloat maxRight = 0; var views = list.Select((str, idx) => { var lbl = NSLinkLabel.CreateLabel(str); lbl.BackgroundColor = idx == selectedItem ? NSColor.SelectedTextBackground : NSColor.Clear; lbl.TextColor = idx == selectedItem ? NSColor.SelectedText : NSColor.Text; lbl.LinkClicked = (s, e) => viewModel.OnSuggestionClicked(idx); lbl.SetFrameOrigin(new CoreGraphics.CGPoint(5, idx * itemHeight)); lbl.SetFrameSize(lbl.IntrinsicContentSize); return(lbl); }).ToList(); foreach (var subView in views) { dlg.suggestionsView.AddSubview(subView); maxRight = (nfloat)Math.Max(maxRight, subView.Frame.Right); } dlg.suggestionsView.SetFrameSize(new CoreGraphics.CGSize(maxRight, list.Length * itemHeight)); if (selectedItem != null) { dlg.suggestionsView.ScrollRectToVisible(views[selectedItem.Value].Frame); } } ); var listStatusUpdater = Updaters.Create( () => viewModel.TagsListStatus, (status) => { var(statusText, statusSeverity) = status; dlg.tagsStatusLinkLabel.SetAttributedContents(statusText); dlg.tagsStatusLinkLabel.TextColor = getLinkColor(statusSeverity); } ); dlg.subscription = changeNotification.CreateSubscription(() => { updateCheckboxes(); updateFormula(); formulaFocusSideEffect(); updateSuggestions(); listStatusUpdater(); }, initiallyActive: false); dlg.formulaEditLinkLabel.LinkClicked = (sender, e) => { if (viewModel.IsEditingFormula) { viewModel.OnStopEditingFormulaClicked(); } else { viewModel.OnEditFormulaClicked(); } }; dlg.formulaLinkLabel.LinkClicked = (sender, e) => viewModel.OnFormulaLinkClicked(e.Link.Tag as string); dlg.tagsStatusLinkLabel.LinkClicked = (sender, e) => viewModel.OnTagsStatusLinkClicked(e.Link.Tag as string); return(dlg); }
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) { var sourceItem = item as Item; if (tableColumn == owner.displayNameColumn) { var cellIdentifier = "text_cell"; var view = (NSLinkLabel)outlineView.MakeView(cellIdentifier, this); if (view == null) { view = new NSLinkLabel(); view.Identifier = cellIdentifier; view.UnderlineLinks = false; } view.LinkClicked = (sender, e) => { e.SuppressDefault = true; owner.owner.viewModel.OnSuggestionClicked(sourceItem.Index); }; view.StringValue = sourceItem.PresenationItem.Text; if (sourceItem.PresenationItem.IsSelectable) { view.LinksColor = NSColor.ControlText; view.Cursor = NSCursor.PointingHandCursor; view.FontSize = NSFont.SystemFontSize; } else { view.LinksColor = NSColor.Gray; view.Cursor = NSCursor.ArrowCursor; view.FontSize = NSFont.SmallSystemFontSize; } return(view); } else if (tableColumn == owner.linkColumn) { if (sourceItem.PresenationItem.LinkText == null) { return(null); } var cellIdentifier = "link_cell"; var view = (NSLinkLabel)outlineView.MakeView(cellIdentifier, this); if (view == null) { view = new NSLinkLabel(); view.Identifier = cellIdentifier; } view.LinkClicked = (sender, e) => { e.SuppressDefault = true; owner.owner.viewModel.OnSuggestionLinkClicked(sourceItem.Index); }; view.StringValue = sourceItem.PresenationItem.LinkText; return(view); } return(null); }