예제 #1
0
 public RingWindowViewModel(SolutionStateMachine slnFsm,
                            WorkspaceStateMachine wsFsm,
                            SolutionViewModel slnVm,
                            WorkspaceViewModel wsViewModel
                            )
 {
     _workspaceMachine = wsFsm;
     _solutionMachine  = slnFsm;
     Workspace         = wsViewModel;
     Solution          = slnVm;
     _workspaceMachine.Activate();
     _solutionMachine.Activate();
 }
        public RingWindowControl()
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            var workspaceMachine = new WorkspaceStateMachine();
            var solutionMachine  = new SolutionStateMachine();
            var commandQueue     = new Queue <IRingCommand>();

            var ringClient = new RingClient(new Uri(_ringServerUri), commandQueue, OutputWriteLine);
            var solution   = new SolutionViewModel(solutionMachine, workspaceMachine, OutputWriteLine, commandQueue);

            _workspace   = new WorkspaceViewModel(solutionMachine, workspaceMachine, OutputWriteLine, commandQueue);
            _ringManager = new RingManager(ringClient, OutputWriteLine);
            DataContext  = new RingWindowViewModel(solutionMachine, workspaceMachine, solution, _workspace);
            InitializeComponent();
        }
 public WorkspaceViewModel(SolutionStateMachine solutionMachine,
                           WorkspaceStateMachine workspaceMachine,
                           Action <string> writeLog,
                           ISender <IRingCommand> commandSender)
 {
     _writeLog        = writeLog;
     _commandSender   = commandSender;
     _runnables       = new RunnablesViewModel(writeLog);
     _solutionMachine = solutionMachine;
     _workspaceFsm    = workspaceMachine;
     _root            = new SubWorkspaceVm(commandSender, writeLog, new WorkspaceInfo("", new RunnableInfo[0], ServerState.IDLE, WorkspaceState.IDLE));
     Status           = new WorkspaceStatusVm();
     Status.None();
     IsSyncButtonEnabled = true;
     IsOpenButtonEnabled = false;
     FilePathVisibility  = Visibility.Collapsed;
     Configure(_workspaceFsm);
 }
예제 #4
0
        private void Configure(SolutionStateMachine m)
        {
            m.OnTransitioned(t => _writeLog($"s: {t.Source} -> ({t.Trigger}) -> {t.Destination}"));
            m.OnUnhandledTrigger((s, t) => _writeLog($"s: Cannot trigger {t} in state {s}"));

            m.Configure(S.NotLoaded)
            .OnEntryFrom(T.Unload, OnUnload)
            .OnActivate(SolutionAlreadyLoadedCheck)
            .Permit(T.Load, S.Idle)
            .Ignore(T.WorkspaceFaulted)
            .Ignore(T.WorkspaceLoaded)
            .Ignore(T.WorkspaceUnloaded);

            m.Configure(S.Idle)
            .OnEntryFrom(T.Load, OnLoad)
            .OnEntryFrom(T.BuildStop, OnBuildStop)
            .OnEntryFrom(T.DebugStop, OnDebugStop)
            .OnEntryFrom(T.WorkspaceFaulted, OnWorkspaceFaulted)
            .InternalTransition(T.WorkspaceLoaded.With <RunnablesViewModel>(), (a, _) => OnWorkspaceLoaded(a))
            .InternalTransition(T.WorkspaceUnloaded, _ => OnWorkspaceUnloaded())
            .Permit(T.Unload, S.NotLoaded)
            .Permit(T.BuildStart, S.Building)
            .Permit(T.DebugStart, S.Debugging)
            .Permit(T.DebugAdd, S.Debugging);

            m.Configure(S.Building)
            .OnEntryFrom(T.BuildStart, OnBuildStart)
            .Permit(T.WorkspaceFaulted, S.Idle)
            .Permit(T.BuildStop, S.Idle);

            m.Configure(S.Debugging)
            .OnEntryFrom(T.DebugStart, OnDebugStart)
            .OnEntryFromAsync(T.DebugAdd.With <DebugAddData>(), OnDebugAddAsync)
            .OnEntryFromAsync(T.DebugRemove.With <DebugRemoveData>(), OnDebugRemoveAsync)
            .Permit(T.DebugStop, S.Idle)
            .Permit(T.WorkspaceFaulted, S.Idle)
            .PermitReentry(T.DebugAdd)
            .PermitReentry(T.DebugRemove);
        }
예제 #5
0
        public SolutionViewModel(SolutionStateMachine slnMachine,
                                 WorkspaceStateMachine wsMachine,
                                 Action <string> writeLog,
                                 ISender <IRingCommand> commandQueue)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            _writeLog     = writeLog;
            _commandQueue = commandQueue;
            _wsMachine    = wsMachine;
            _slnMachine   = slnMachine;
            Configure(_slnMachine);
            var debugStartCmd = Dte.Commands.Item("Debug.Start");

            _solutionEventsHandler                   = new SolutionsEventsHandler(Sln);
            _debuggerEventsHandler                   = new DebuggerEventsHandler(Debugger);
            _projStartDebugEvent                     = Dte.Events.CommandEvents["{" + VSConstants.VSStd2K + "}", (int)VSConstants.VSStd2KCmdID.PROJSTARTDEBUG];
            _projStepIntoEvent                       = Dte.Events.CommandEvents["{" + VSConstants.VSStd2K + "}", (int)VSConstants.VSStd2KCmdID.PROJSTEPINTO];
            _debugStartEvent                         = Dte.Events.CommandEvents[debugStartCmd.Guid, debugStartCmd.ID];
            _debuggerEvents                          = Dte.Events.DebuggerEvents;
            _buildEvents                             = Dte.Events.BuildEvents;
            _buildEvents.OnBuildBegin               += BuildBegin;
            _buildEvents.OnBuildDone                += BuildDone;
            _buildEvents.OnBuildProjConfigBegin     += ProjectBuildBegin;
            _buildEvents.OnBuildProjConfigDone      += ProjectBuildDone;
            _projStepIntoEvent.BeforeExecute        += DebugProjectsAdd;
            _projStartDebugEvent.BeforeExecute      += DebugProjectsAdd;
            _debugStartEvent.BeforeExecute          += DebugStart;
            _debuggerEvents.OnEnterDesignMode       += DebugStop;
            _solutionEventsHandler.OnAfterOpen      += Load;
            _solutionEventsHandler.OnAfterClose     += Unload;
            _debuggerEventsHandler.OnProcessCreated += DebugProcessAdd;
            _debuggerEventsHandler.OnProcessRemoved += DebugRemove;
            _projectProcesses                        = new ProjectsProcesses(writeLog);

            //TODO: handle debug detach (probably kill detached the process - figure out how to get it - potentially get PID on creation)
            //TODO: handle clean up - what should happen if a project or whole solution is cleaned up? Should ring run in a degraded state (With "big exclamation marks" in the window)
        }