public BreadcrumbEntryElement (PathEntry path) { InternalPadding = 5; Path = path; Build (); Opacity = 0.5; }
public override void Initialize () { CurrentPath = new PathEntry[] { new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = null } }; isPathSet = false; UpdatePath (null, null); Document.Editor.Caret.PositionChanged += UpdatePath; var ext = Document.GetContent<CSharpCompletionTextEditorExtension> (); ext.TypeSegmentTreeUpdated += (o, s) => UpdatePath (null, null); }
public override void Initialize () { CurrentPath = new PathEntry[] { new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = null } }; isPathSet = false; UpdateOwnerProjects (); UpdatePath (null, null); caret = Document.Editor.Caret; caret.PositionChanged += UpdatePath; ext = Document.GetContent<CSharpCompletionTextEditorExtension> (); ext.TypeSegmentTreeUpdated += HandleTypeSegmentTreeUpdated; IdeApp.Workspace.FileAddedToProject += HandleProjectChanged; IdeApp.Workspace.FileRemovedFromProject += HandleProjectChanged; }
public override void Initialize () { CurrentPath = new PathEntry[] { new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = null } }; isPathSet = false; // Delay the execution of UpdateOwnerProjects since it may end calling Document.AttachToProject, // which shouldn't be called while the extension chain is being initialized. Gtk.Application.Invoke (delegate { UpdateOwnerProjects (); UpdatePath (null, null); }); caret = Document.Editor.Caret; caret.PositionChanged += UpdatePath; ext = Document.GetContent<CSharpCompletionTextEditorExtension> (); ext.TypeSegmentTreeUpdated += HandleTypeSegmentTreeUpdated; IdeApp.Workspace.FileAddedToProject += HandleProjectChanged; IdeApp.Workspace.FileRemovedFromProject += HandleProjectChanged; IdeApp.Workspace.WorkspaceItemUnloaded += HandleWorkspaceItemUnloaded; IdeApp.Workspace.WorkspaceItemLoaded += HandleWorkspaceItemLoaded;; }
protected void OnPathChanged (PathEntry[] oldPath) { if (PathChanged != null) PathChanged (this, new DocumentPathChangedEventArgs (oldPath)); }
static PathEntry GetRegionEntry (ParsedDocument unit, Mono.TextEditor.DocumentLocation loc) { PathEntry entry; if (!unit.UserRegions.Any ()) return null; var reg = unit.UserRegions.Where (r => r.Region.IsInside (loc)).LastOrDefault (); if (reg == null) { entry = new PathEntry (GettextCatalog.GetString ("No region")); } else { entry = new PathEntry (CompilationUnitDataProvider.Pixbuf, GLib.Markup.EscapeText (reg.Name)); } entry.Position = EntryPosition.Right; return entry; }
void CreateWidthArray (int[] result, int index, PathEntry[] path) { // Assume that there will be icons of at least 16 pixels. This avoids // annoying path bar height changes when switching between empty and full paths int maxIconHeight = 16; for (int i = 0; i < path.Length; i++) { layout.Attributes = (i == activeIndex)? boldAtts : null; layout.SetMarkup (GetFirstLineFromMarkup (path[i].Markup)); layout.Width = -1; int w, h; layout.GetPixelSize (out w, out h); textHeight = Math.Max (h, textHeight); if (path[i].DarkIcon != null) { maxIconHeight = Math.Max ((int)path[i].DarkIcon.Height, maxIconHeight); w += (int)path[i].DarkIcon.Width + iconSpacing; } result[i + index] = w; } height = Math.Max (height, maxIconHeight); height = Math.Max (height, textHeight); }
void UpdatePath (object sender, Mono.TextEditor.DocumentLocationEventArgs e) { var unit = Document.CompilationUnit; if (unit == null) return; var loc = textEditorData.Caret.Location; IType type = unit.GetTypeAt (loc.Line, loc.Column); IMember member = type != null && type.ClassType != ClassType.Delegate ? type.GetMemberAt (loc.Line, loc.Column) : null; List<PathEntry> result = new List<PathEntry> (); var amb = GetAmbience (); INode node = member ?? type ?? (INode)unit; while (node != null) { PathEntry entry; if (node is ICompilationUnit) { if (!Document.ParsedDocument.UserRegions.Any ()) break; FoldingRegion reg = Document.ParsedDocument.UserRegions.Where (r => r.Region.Contains (loc.Line, loc.Column)).LastOrDefault (); if (reg == null) { entry = new PathEntry (GettextCatalog.GetString ("No region")); } else { entry = new PathEntry (CompilationUnitDataProvider.Pixbuf, reg.Name); } entry.Position = EntryPosition.Right; } else { entry = new PathEntry (ImageService.GetPixbuf (((IMember)node).StockIcon, IconSize.Menu), amb.GetString ((IMember)node, OutputFlags.IncludeGenerics | OutputFlags.IncludeParameters | OutputFlags.ReformatDelegates)); } entry.Tag = node; result.Insert (0, entry); node = node.Parent; } PathEntry noSelection = null; if (type == null) { noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = new CustomNode (Document.CompilationUnit) }; } else if (member == null && type.ClassType != ClassType.Delegate) noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = new CustomNode (type) }; if (noSelection != null) { /* if (result.Count > 0 && result[result.Count - 1].Tag is ICompilationUnit) { result.Insert (result.Count - 1, noSelection); } else {*/ result.Add (noSelection); // } } var prev = CurrentPath; CurrentPath = result.ToArray (); OnPathChanged (new DocumentPathChangedEventArgs (prev)); }
bool ArrSame (PathEntry[] a, PathEntry[] b) { if ((a == null || b == null) && a != b) return false; if (a.Length != b.Length) return false; for (int i = 0; i < a.Length; i++) if (!a[i].Equals(b[i])) return false; return true; }
public int IndexOf (PathEntry entry) { return Path.TakeWhile (p => p != entry).Count (); }
int[] CreateWidthArray (PathEntry[] path) { var result = new int[path.Length]; for (int i = 0; i < path.Length; i++) { layout.Attributes = (i == activeIndex)? boldAtts : null; layout.SetText (path[i].Text); int w, h; layout.GetPixelSize (out w, out h); height = Math.Max (h, height); result[i] = w + (path[i].Icon != null ? path[i].Icon.Width + padding : 0); } return result; }
public void SetPath (PathEntry[] path) { if (ArrSame (this.leftPath, path)) return; HideMenu (); this.Path = path ?? new PathEntry[0]; this.leftPath = Path.Where (p => p.Position == EntryPosition.Left).ToArray (); this.rightPath = Path.Where (p => p.Position == EntryPosition.Right).ToArray (); activeIndex = -1; widths = null; EnsureWidths (); QueueResize (); }
void UpdatePath (object sender, Mono.TextEditor.DocumentLocationEventArgs e) { var parsedDocument = Document.ParsedDocument; if (parsedDocument == null || parsedDocument.ParsedFile == null) return; amb = new AstAmbience (document.GetFormattingOptions ()); var unit = parsedDocument.GetAst<SyntaxTree> (); if (unit == null) return; var loc = Document.Editor.Caret.Location; var compExt = Document.GetContent<CSharpCompletionTextEditorExtension> (); var caretOffset = Document.Editor.Caret.Offset; var segType = compExt.GetTypeAt (caretOffset); if (segType != null) loc = segType.Region.Begin; var curType = (EntityDeclaration)unit.GetNodeAt (loc, n => n is TypeDeclaration || n is DelegateDeclaration); var curProject = ownerProjects.Count > 1 ? Document.Project : null; var segMember = compExt.GetMemberAt (caretOffset); if (segMember != null) { loc = segMember.Region.Begin; } else { loc = Document.Editor.Caret.Location; } var curMember = unit.GetNodeAt<EntityDeclaration> (loc); if (curType == curMember || curType is DelegateDeclaration) curMember = null; if (isPathSet && curType == lastType && curMember == lastMember && curProject == lastProject) return; var curTypeMakeup = GetEntityMarkup (curType); var curMemberMarkup = GetEntityMarkup (curMember); if (isPathSet && curType != null && lastType != null && curType.StartLocation == lastType.StartLocation && curTypeMakeup == lastTypeMarkup && curMember != null && lastMember != null && curMember.StartLocation == lastMember.StartLocation && curMemberMarkup == lastMemberMarkup && curProject == lastProject) return; lastType = curType; lastTypeMarkup = curTypeMakeup; lastMember = curMember; lastMemberMarkup = curMemberMarkup; lastProject = curProject; var result = new List<PathEntry> (); if (ownerProjects.Count > 1) { // Current project if there is more than one result.Add (new PathEntry (ImageService.GetIcon (Document.Project.StockIcon), GLib.Markup.EscapeText (Document.Project.Name)) { Tag = Document.Project }); } if (curType == null) { if (CurrentPath != null && CurrentPath.Length == 1 && CurrentPath [0].Tag is IUnresolvedFile) return; if (CurrentPath != null && CurrentPath.Length == 2 && CurrentPath [1].Tag is IUnresolvedFile) return; var prevPath = CurrentPath; result.Add (new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit }); CurrentPath = result.ToArray (); OnPathChanged (new DocumentPathChangedEventArgs (prevPath)); return; } if (curType != null) { var type = curType; var pos = result.Count; while (type != null) { var declaringType = type.Parent as TypeDeclaration; result.Insert (pos, new PathEntry (ImageService.GetIcon (type.GetStockIcon (), Gtk.IconSize.Menu), GetEntityMarkup (type)) { Tag = (AstNode)declaringType ?? unit }); type = declaringType; } } if (curMember != null) { result.Add (new PathEntry (ImageService.GetIcon (curMember.GetStockIcon (), Gtk.IconSize.Menu), curMemberMarkup) { Tag = curMember }); if (curMember is Accessor) { var parent = curMember.Parent as EntityDeclaration; if (parent != null) result.Insert (result.Count - 1, new PathEntry (ImageService.GetIcon (parent.GetStockIcon (), Gtk.IconSize.Menu), GetEntityMarkup (parent)) { Tag = parent }); } } var entry = GetRegionEntry (parsedDocument, loc); if (entry != null) result.Add (entry); PathEntry noSelection = null; if (curType == null) { noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit }; } else if (curMember == null && !(curType is DelegateDeclaration)) { noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = curType }; } if (noSelection != null) result.Add (noSelection); var prev = CurrentPath; if (prev != null && prev.Length == result.Count) { bool equals = true; for (int i = 0; i < prev.Length; i++) { if (prev [i].Markup != result [i].Markup) { equals = false; break; } } if (equals) return; } // Gtk.Application.Invoke (delegate { CurrentPath = result.ToArray (); OnPathChanged (new DocumentPathChangedEventArgs (prev)); // }); // }); }
void UpdatePath (object sender, Mono.TextEditor.DocumentLocationEventArgs e) { var parsedDocument = Document.ParsedDocument; if (parsedDocument == null || parsedDocument.ParsedFile == null) return; amb = new AstAmbience (document.GetFormattingOptions ()); var unit = parsedDocument.GetAst<SyntaxTree> (); if (unit == null) return; var loc = Document.Editor.Caret.Location; var curType = (EntityDeclaration)unit.GetNodeAt (loc, n => n is TypeDeclaration || n is DelegateDeclaration); var curMember = unit.GetNodeAt<EntityDeclaration> (loc); if (curType == curMember) curMember = null; if (isPathSet && curType == lastType && lastMember == curMember) return; var curTypeMakeup = GetEntityMarkup (curType); var curMemberMarkup = GetEntityMarkup (curMember); if (isPathSet && curType != null && lastType != null && curType.StartLocation == lastType.StartLocation && curTypeMakeup == lastTypeMarkup && curMember != null && lastMember != null && curMember.StartLocation == lastMember.StartLocation && curMemberMarkup == lastMemberMarkup) return; lastType = curType; lastTypeMarkup = curTypeMakeup; lastMember = curMember; lastMemberMarkup = curMemberMarkup; if (curType == null) { if (CurrentPath != null && CurrentPath.Length == 1 && CurrentPath [0].Tag is IUnresolvedFile) return; var prevPath = CurrentPath; CurrentPath = new PathEntry[] { new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit } }; OnPathChanged (new DocumentPathChangedEventArgs (prevPath)); return; } // ThreadPool.QueueUserWorkItem (delegate { var result = new List<PathEntry> (); if (curType != null) { var type = curType; while (type != null) { var declaringType = type.Parent as TypeDeclaration; result.Insert (0, new PathEntry (ImageService.GetPixbuf (type.GetStockIcon (false), Gtk.IconSize.Menu), GetEntityMarkup (type)) { Tag = (AstNode)declaringType ?? unit }); type = declaringType; } } if (curMember != null) { result.Add (new PathEntry (ImageService.GetPixbuf (curMember.GetStockIcon (true), Gtk.IconSize.Menu), curMemberMarkup) { Tag = curMember }); if (curMember is Accessor) { var parent = curMember.Parent as EntityDeclaration; if (parent != null) result.Insert (result.Count - 1, new PathEntry (ImageService.GetPixbuf (parent.GetStockIcon (true), Gtk.IconSize.Menu), GetEntityMarkup (parent)) { Tag = parent }); } } var entry = GetRegionEntry (parsedDocument, loc); if (entry != null) result.Add (entry); PathEntry noSelection = null; if (curType == null) { noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit }; } else if (curMember == null && !(curType is DelegateDeclaration)) { noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = curType }; } if (noSelection != null) result.Add (noSelection); var prev = CurrentPath; if (prev != null && prev.Length == result.Count) { bool equals = true; for (int i = 0; i < prev.Length; i++) { if (prev [i].Markup != result [i].Markup) { equals = false; break; } } if (equals) return; } // Gtk.Application.Invoke (delegate { CurrentPath = result.ToArray (); OnPathChanged (new DocumentPathChangedEventArgs (prev)); // }); // }); }
public DocumentPathChangedEventArgs (PathEntry[] previousPath) { this.PreviousPath = previousPath; }
protected override void Initialize () { CurrentPath = new PathEntry[] { new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = null } }; isPathSet = false; // Delay the execution of UpdateOwnerProjects since it may end calling DocumentContext.AttachToProject, // which shouldn't be called while the extension chain is being initialized. Gtk.Application.Invoke (delegate { UpdateOwnerProjects (); Editor_CaretPositionChanged (null, null); }); Editor.TextChanging += Editor_TextChanging; DocumentContext.DocumentParsed += DocumentContext_DocumentParsed; ext = DocumentContext.GetContent<CSharpCompletionTextEditorExtension> (); ext.TypeSegmentTreeUpdated += HandleTypeSegmentTreeUpdated; IdeApp.Workspace.FileAddedToProject += HandleProjectChanged; IdeApp.Workspace.FileRemovedFromProject += HandleProjectChanged; IdeApp.Workspace.WorkspaceItemUnloaded += HandleWorkspaceItemUnloaded; IdeApp.Workspace.WorkspaceItemLoaded += HandleWorkspaceItemLoaded; IdeApp.Workspace.ItemAddedToSolution += HandleProjectChanged; IdeApp.Workspace.ActiveConfigurationChanged += HandleActiveConfigurationChanged; SubscribeCaretPositionChange (); }
void Update() { if (DocumentContext == null) return; var parsedDocument = DocumentContext.ParsedDocument; if (parsedDocument == null) return; var caretOffset = Editor.CaretOffset; var model = parsedDocument.GetAst<SemanticModel>(); if (model == null) return; CancelUpdatePath (); var cancellationToken = src.Token; amb = new AstAmbience(TypeSystemService.Workspace.Options); var loc = Editor.CaretLocation; Task.Run(async delegate { var unit = model.SyntaxTree; SyntaxNode root; SyntaxNode node; try { root = await unit.GetRootAsync(cancellationToken).ConfigureAwait(false); if (root.FullSpan.Length <= caretOffset) { return; } node = root.FindNode(TextSpan.FromBounds(caretOffset, caretOffset)); if (node.SpanStart != caretOffset) node = root.SyntaxTree.FindTokenOnLeftOfPosition(caretOffset, cancellationToken).Parent; } catch (Exception ex ) { Console.WriteLine (ex); return; } var curMember = node != null ? node.AncestorsAndSelf ().FirstOrDefault (m => m is VariableDeclaratorSyntax && m.Parent != null && !(m.Parent.Parent is LocalDeclarationStatementSyntax) || (m is MemberDeclarationSyntax && !(m is NamespaceDeclarationSyntax))) : null; var curType = node != null ? node.AncestorsAndSelf ().FirstOrDefault (IsType) : null; var curProject = ownerProjects != null && ownerProjects.Count > 1 ? DocumentContext.Project : null; if (curType == curMember || curType is DelegateDeclarationSyntax) curMember = null; if (isPathSet && curType == lastType && curMember == lastMember && curProject == lastProject) { return; } var curTypeMakeup = GetEntityMarkup(curType); var curMemberMarkup = GetEntityMarkup(curMember); if (isPathSet && curType != null && lastType != null && curTypeMakeup == lastTypeMarkup && curMember != null && lastMember != null && curMemberMarkup == lastMemberMarkup && curProject == lastProject) { return; } var result = new List<PathEntry>(); if (ownerProjects != null && ownerProjects.Count > 1) { // Current project if there is more than one result.Add (new PathEntry (ImageService.GetIcon (DocumentContext.Project.StockIcon, Gtk.IconSize.Menu), GLib.Markup.EscapeText (DocumentContext.Project.Name)) { Tag = DocumentContext.Project }); } if (curType == null) { if (CurrentPath != null && CurrentPath.Length == 1 && CurrentPath [0].Tag is CSharpSyntaxTree) return; if (CurrentPath != null && CurrentPath.Length == 2 && CurrentPath [1].Tag is CSharpSyntaxTree) return; var prevPath = CurrentPath; result.Add (new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit }); Gtk.Application.Invoke (delegate { if (cancellationToken.IsCancellationRequested) return; CurrentPath = result.ToArray (); lastType = curType; lastTypeMarkup = curTypeMakeup; lastMember = curMember; lastMemberMarkup = curMemberMarkup; lastProject = curProject; OnPathChanged (new DocumentPathChangedEventArgs (prevPath)); }); return; } var regionEntry = await GetRegionEntry (DocumentContext.ParsedDocument, loc).ConfigureAwait (false); Gtk.Application.Invoke(delegate { if (curType != null) { var type = curType; var pos = result.Count; while (type != null) { if (!(type is BaseTypeDeclarationSyntax)) break; var tag = (object)type.Ancestors ().FirstOrDefault (IsType) ?? unit; result.Insert (pos, new PathEntry (ImageService.GetIcon (type.GetStockIcon (), Gtk.IconSize.Menu), GetEntityMarkup (type)) { Tag = tag }); type = type.Parent; } } if (curMember != null) { result.Add (new PathEntry (ImageService.GetIcon (curMember.GetStockIcon (), Gtk.IconSize.Menu), curMemberMarkup) { Tag = curMember }); if (curMember.Kind () == SyntaxKind.GetAccessorDeclaration || curMember.Kind () == SyntaxKind.SetAccessorDeclaration || curMember.Kind () == SyntaxKind.AddAccessorDeclaration || curMember.Kind () == SyntaxKind.RemoveAccessorDeclaration) { var parent = curMember.Parent; if (parent != null) result.Insert (result.Count - 1, new PathEntry (ImageService.GetIcon (parent.GetStockIcon (), Gtk.IconSize.Menu), GetEntityMarkup (parent)) { Tag = parent }); } } if (regionEntry != null) result.Add(regionEntry); PathEntry noSelection = null; if (curType == null) { noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = unit }; } else if (curMember == null && !(curType is DelegateDeclarationSyntax)) { noSelection = new PathEntry (GettextCatalog.GetString ("No selection")) { Tag = curType }; } if (noSelection != null) result.Add(noSelection); var prev = CurrentPath; if (prev != null && prev.Length == result.Count) { bool equals = true; for (int i = 0; i < prev.Length; i++) { if (prev [i].Markup != result [i].Markup) { equals = false; break; } } if (equals) return; } if (cancellationToken.IsCancellationRequested) return; CurrentPath = result.ToArray(); lastType = curType; lastTypeMarkup = curTypeMakeup; lastMember = curMember; lastMemberMarkup = curMemberMarkup; lastProject = curProject; OnPathChanged (new DocumentPathChangedEventArgs(prev)); }); }); }
async static Task<PathEntry> GetRegionEntry (ParsedDocument unit, DocumentLocation loc) { PathEntry entry; FoldingRegion reg; try { var regions = await unit.GetUserRegionsAsync ().ConfigureAwait (false); if (unit == null || !regions.Any ()) return null; reg = regions.LastOrDefault (r => r.Region.Contains (loc)); } catch (AggregateException) { return null; } catch (OperationCanceledException) { return null; } if (reg == null) { entry = new PathEntry (GettextCatalog.GetString ("No region")); } else { entry = new PathEntry (CompilationUnitDataProvider.Pixbuf, GLib.Markup.EscapeText (reg.Name)); } entry.Position = EntryPosition.Right; return entry; }
public int IndexOf(PathEntry entry) { return(Path.TakeWhile(p => p != entry).Count()); }
void UpdatePath () { List<XObject> l = GetCurrentPath (); if (l == null) return; //build the list PathEntry[] path = new PathEntry[l.Count]; for (int i = 0; i < l.Count; i++) { if (l[i].FriendlyPathRepresentation == null) System.Console.WriteLine(l[i].GetType ()); path[i] = new PathEntry (GLib.Markup.EscapeText (l[i].FriendlyPathRepresentation ?? "<>")); } PathEntry[] oldPath = currentPath; currentPath = path; OnPathChanged (oldPath); }
private void UpdatePath(object sender, Mono.TextEditor.DocumentLocationEventArgs e) { var ast = Document.ParsedDocument as ParsedDModule; if (ast == null) return; var SyntaxTree = ast.DDom; if (SyntaxTree == null) return; // Resolve the hovered piece of code var loc = new CodeLocation(Document.Editor.Caret.Location.Column, Document.Editor.Caret.Location.Line); IStatement stmt = null; var currentblock = DResolver.SearchBlockAt(SyntaxTree, loc, out stmt) as IBlockNode; //could be an enum value, which is not IBlockNode if (currentblock is DEnum) { foreach (INode nd in (currentblock as DEnum).Children) { if ((nd is DEnumValue) && ((nd.Location <= loc) && (nd.EndLocation >= loc))) { currentblock = nd as IBlockNode; break; } } } List<PathEntry> result = new List<PathEntry>(); INode node = currentblock; while ((node != null) && ((node is IBlockNode) || (node is DEnumValue))) { PathEntry entry; var icon = DCompletionData.GetNodeIcon(node as DNode); entry = new PathEntry(icon.IsNull?null: ImageService.GetPixbuf(icon.Name, IconSize.Menu), node.Name + DParameterDataProvider.GetNodeParamString(node)); entry.Position = EntryPosition.Left; entry.Tag = node; //do not include the module in the path bar if ((node.Parent != null) && !((node is DNode) && (node as DNode).IsAnonymous)) result.Insert(0, entry); node = node.Parent; } if (!((currentblock is DMethod) || (currentblock is DEnumValue))) { PathEntry noSelection = new PathEntry(GettextCatalog.GetString("No Selection")) { Tag = new NoSelectionCustomNode(currentblock) }; result.Add(noSelection); } var prev = CurrentPath; CurrentPath = result.ToArray(); OnPathChanged(new DocumentPathChangedEventArgs(prev)); }