public void CreateRepl(string replPath, string projectPath)
        {
            var interactiveText = ReplUserInterfaceFactory.CreateInteractiveText();
            var closeButton = ReplUserInterfaceFactory.CreateCloseButton();
            var name = ReplUserInterfaceFactory.CreateTabLabel();
            var grid = ReplUserInterfaceFactory.CreateTextBoxGrid(interactiveText);
            var headerPanel = ReplUserInterfaceFactory.CreateHeaderPanel(name, closeButton);
            var tabItem = ReplUserInterfaceFactory.CreateTabItem(headerPanel, grid);
            var replProcess = CreateReplProcess(replPath, projectPath);
            var replEntity = new Entity<ReplState> {CurrentState = new ReplState()};
            var repl = new Repl(replProcess, new TextBoxWriter(interactiveText, replEntity));

            WireUpTheTextBoxInputToTheReplProcess(repl, interactiveText, replEntity);
            WireUpTheOutputOfTheReplProcessToTheTextBox(interactiveText, replProcess, replEntity);
            WireUpTheReplEditorCommandsToTheEditor(repl, tabItem);

            closeButton.Click +=
                (o, e) =>
                {
                    replProcess.Kill();
                    _replManager.Items.Remove(tabItem);
                };

            _replManager.Items.Add(tabItem);
            _replManager.SelectedItem = tabItem;
        }
 public InputKeyHandler(KeyboardExaminer keyboardExaminer, Entity<ReplState> replEntity, TextBox interactiveTextBox, Repl repl)
 {
     _keyboardExaminer = keyboardExaminer;
     _replEntity = replEntity;
     _repl = repl;
     _interactiveTextBox = interactiveTextBox;
 }
        private void WireUpTheReplEditorCommandsToTheEditor(Repl repl, TabItem tabItem)
        {
            var dte = (DTE2)_serviceProvider.GetService(typeof(DTE));

            var menuCommandListWirer = new MenuCommandListWirer(
                (OleMenuCommandService)_serviceProvider.GetService(typeof(IMenuCommandService)),
                CreateMenuCommands(repl),
                () => dte.ActiveDocument != null && dte.ActiveDocument.FullName.ToLower().EndsWith(".clj") && _replManager.SelectedItem == tabItem);

            dte.Events.WindowEvents.WindowActivated += (o, e) => menuCommandListWirer.TryToShowMenuCommands();
            _replManager.SelectionChanged += (sender, eventData) => menuCommandListWirer.TryToShowMenuCommands();
        }
        private List<MenuCommand> CreateMenuCommands(Repl repl)
        {
            var dte = (DTE2) _serviceProvider.GetService(typeof (DTE));
            repl.OnInvisibleWrite += () => _replToolWindow.ShowNoActivate();

            Action loadSelectedFilesIntoRepl =
                () => dte.ToolWindows.SolutionExplorer.GetSelectedFiles().LoadFilesInto(repl);

            Action loadSelectedProjectIntoRepl =
                () => dte.ToolWindows.SolutionExplorer.GetSelectedProject().GetAllFiles().LoadFilesInto(repl);

            Action loadActiveFileIntoRepl =
                () => dte.ActiveDocument.FullName.SingletonAsList().LoadFilesInto(repl);

            var componentModel = (IComponentModel) _serviceProvider.GetService(typeof (SComponentModel));
            var namespaceParser = new NamespaceParser(NamespaceParser.NamespaceSymbols);

            var activeTextBufferStateProvider =
                new ActiveTextBufferStateProvider(
                    componentModel.GetService<IVsEditorAdaptersFactoryService>(),
                    (IVsTextManager) _serviceProvider.GetService(typeof (SVsTextManager)));

            var menuCommands = new List<MenuCommand>();
            menuCommands.Add(new MenuCommand((sender, args) => loadSelectedProjectIntoRepl(), new CommandID(Guids.GuidClojureExtensionCmdSet, 11)));
            menuCommands.Add(new MenuCommand((sender, args) => loadSelectedFilesIntoRepl(), new CommandID(Guids.GuidClojureExtensionCmdSet, 12)));
            menuCommands.Add(new MenuCommand((sender, args) => loadActiveFileIntoRepl(), new CommandID(Guids.GuidClojureExtensionCmdSet, 13)));
            menuCommands.Add(new MenuCommand((sender, args) => repl.ChangeNamespace(namespaceParser.Execute(activeTextBufferStateProvider.Get())), new CommandID(Guids.GuidClojureExtensionCmdSet, 14)));
            menuCommands.Add(new MenuCommand((sender, args) => repl.WriteInvisibly((string)dte.ActiveDocument.Selection), new CommandID(Guids.GuidClojureExtensionCmdSet, 15)));
            return menuCommands;
        }
        private static void WireUpTheTextBoxInputToTheReplProcess(Repl repl, TextBox replTextBox, Entity<ReplState> replEntity)
        {
            var inputKeyHandler = new InputKeyHandler(new KeyboardExaminer(), replEntity, replTextBox, repl);
            var history = new History(new KeyboardExaminer(), replEntity, replTextBox);

            replTextBox.PreviewKeyDown += history.PreviewKeyDown;
            replTextBox.PreviewTextInput += inputKeyHandler.PreviewTextInput;
            replTextBox.PreviewKeyDown += inputKeyHandler.PreviewKeyDown;
        }
 public static void WriteInvisiblyTo(this string expresion, Repl repl)
 {
     repl.WriteInvisibly(expresion);
 }
 public static void LoadFilesInto(this List<string> fileList, Repl repl)
 {
     repl.LoadFiles(fileList);
 }