private void SortLines() { ThreadHelper.ThrowIfNotOnUIThread(); TextDocumentHandler handler = new(this.dte); if (handler.HasNonEmptySelection) { Sort.Options options = MainPackage.SortOptions; bool execute = true; if (!options.OnlyShowSortLinesDialogWhenShiftIsPressed || Utilities.IsShiftPressed) { SortLinesDialog dialog = new(); execute = dialog.Execute(options); } if (execute) { if (options.LineOptions.HasFlag(LineOptions.WholeLines)) { handler.SelectWholeLines(); } // Now sort the lines and put them back as the selection string text = handler.SelectedText; TextLines lines = new(text); lines.Sort(options.LineOptions); string sortedText = lines.ToString(); handler.SetSelectedTextIfUnchanged(sortedText, "Sort Lines"); } } }
/// <summary> /// Initialization of the package; this method is called right after the package is sited, so this is the place /// where you can put all the initialization code that rely on services provided by VisualStudio. /// </summary> protected override async System.Threading.Tasks.Task InitializeAsync(CancellationToken cancellationToken, IProgress <ServiceProgressData> progress) { LogMessage(string.Format("Entering {0}.Initialize()", this.ToString())); try { await base.InitializeAsync(cancellationToken, progress).ConfigureAwait(true); LogMessage(string.Format("After {0}'s base.Initialize()", this.ToString())); // Set the ApplicationInfo's main assembly so IsDebugBuild will work correctly. ApplicationInfo.Initialize(Title, this.GetType().Assembly); await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); ScanInfo.GetUserRegistryRoot = () => this.UserRegistryRoot; // Ryan Molden from Microsoft says that GetDialogPage caches the result, so we're going to cache it too. // I've also verified GetDialogPage's caching implementation in VS11 by looking at it with Reflector. // http://social.msdn.microsoft.com/Forums/eu/vsx/thread/303fce01-dfc0-43b3-a578-8b3258c0b83f // From http://msdn.microsoft.com/en-us/library/bb165039.aspx baseConverterOptions = this.GetDialogPage(typeof(BaseConverter.Options)) as BaseConverter.Options; generalOptions = this.GetDialogPage(typeof(Options)) as Options; highlightOptions = this.GetDialogPage(typeof(HighlightOptions)) as HighlightOptions; projectOptions = this.GetDialogPage(typeof(Projects.Options)) as Projects.Options; regionOptions = this.GetDialogPage(typeof(Regions.Options)) as Regions.Options; sortOptions = this.GetDialogPage(typeof(Sort.Options)) as Sort.Options; taskOptions = this.GetDialogPage(typeof(Tasks.Options)) as Tasks.Options; this.processor = new CommandProcessor(this); // Add our command handlers. Commands must exist in the .vsct file. if (await this.GetServiceAsync(typeof(IMenuCommandService)).ConfigureAwait(true) is OleMenuCommandService mcs) { foreach (Command id in Enum.GetValues(typeof(Command))) { CommandID commandId = new(Guids.MeneesVsToolsCommandSet, (int)id); // OleMenuCommand extends the base MenuCommand to add BeforeQueryStatus. // http://msdn.microsoft.com/en-us/library/bb165468.aspx OleMenuCommand menuItem = new(this.Command_Execute, commandId); menuItem.BeforeQueryStatus += this.Command_QueryStatus; mcs.AddCommand(menuItem); } } // To make our font and color formats customizable in non-TextEditor windows, // (e.g., Output) we have to hook some old-school TextManager COM events. this.formatManager = new ClassificationFormatManager(this.ServiceProvider); this.formatManager.UpdateFormats(); // This option requires a restart if changed because the CommentTaskProvider and various // XxxMonitor classes attach to too many events and register too many things to easily // detach/unregister and clean them all up if this is toggled interactively. if (TaskOptions.EnableCommentScans) { this.commentTaskProvider = new CommentTaskProvider(this); } this.buildTimer = new BuildTimer(this); } catch (Exception ex) { LogMessage(string.Format("An unhandled exception occurred in {0}.Initialize().", this.ToString()), ex); throw; } LogMessage(string.Format("Exiting {0}.Initialize()", this.ToString())); }