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); }
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); }
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) }