package jetbrains.mps.debugger.java.runtime.evaluation; /*Generated by MPS */ import jetbrains.mps.debug.api.evaluation.IEvaluationProvider; import jetbrains.mps.debugger.java.runtime.state.DebugSession; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.module.SModuleReference; import java.util.List; import jetbrains.mps.debugger.java.runtime.evaluation.container.IEvaluationContainer; import java.util.ArrayList; import org.jetbrains.annotations.NotNull; import jetbrains.mps.debug.api.DebugSessionManagerComponent; import jetbrains.mps.debug.api.AbstractDebugSession; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.debugger.java.runtime.evaluation.container.EvaluationModule; import jetbrains.mps.extapi.module.SRepositoryExt; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.project.Project; import jetbrains.mps.internal.collections.runtime.ListSequence; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.debugger.java.api.state.JavaUiState; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import jetbrains.mps.debugger.java.runtime.evaluation.container.Properties; import com.intellij.openapi.application.ApplicationManager; import jetbrains.mps.debugger.java.runtime.ui.evaluation.EvaluationDialog; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.debugger.java.runtime.ui.evaluation.EditWatchDialog; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JComponent; import jetbrains.mps.debugger.java.runtime.ui.evaluation.WatchesPanel; import jetbrains.mps.debugger.java.runtime.evaluation.model.EvaluationWithContextContainer; public class EvaluationProvider implements IEvaluationProvider { private final DebugSession myDebugSession; @Nullable private SModuleReference myContainerModuleRef; private final List<IEvaluationContainer> myWatches = new ArrayList<IEvaluationContainer>(); private final List<EvaluationProvider.IWatchListener> myWatchListeners = new ArrayList<EvaluationProvider.IWatchListener>(); public EvaluationProvider(@NotNull DebugSession debugSession) { myDebugSession = debugSession; DebugSessionManagerComponent.getInstance(myDebugSession.getIdeaProject()).addDebugSessionListener(new DebugSessionManagerComponent.DebugSessionAdapter() { @Override public void registered(AbstractDebugSession session) { if (myDebugSession.equals(session)) { init(); } } @Override public void detached(AbstractDebugSession session) { if (myDebugSession.equals(session)) { dispose(); DebugSessionManagerComponent.getInstance(myDebugSession.getIdeaProject()).removeDebugSessionListener(this); } } }); } private synchronized void init() { final SRepository repository = myDebugSession.getProject().getRepository(); repository.getModelAccess().runWriteAction(new Runnable() { public void run() { EvaluationModule module = new EvaluationModule(); ((SRepositoryExt) repository).registerModule(module, myDebugSession.getProject()); myContainerModuleRef = module.getModuleReference(); } }); } private synchronized void dispose() { final SRepository repository = myDebugSession.getProject().getRepository(); assert myContainerModuleRef != null; repository.getModelAccess().runWriteAction(new Runnable() { public void run() { SModule resolved = myContainerModuleRef.resolve(repository); if (resolved != null) { ((SRepositoryExt) repository).unregisterModule(resolved, myDebugSession.getProject()); } myContainerModuleRef = null; } }); } @Override public boolean canEvaluate() { return myDebugSession.isStepEnabled(); } @Override public void showEvaluationDialog(Project mpsProject) { showEvaluationDialog(mpsProject, ListSequence.fromList(new ArrayList<SNodeReference>())); } @Override public void showEvaluationDialog(final Project mpsProject, final List<SNodeReference> selectedNodes) { final JavaUiState state = myDebugSession.getUiState(); myDebugSession.getEventsProcessor().scheduleEvaluation(new _FunctionTypes._void_P0_E0() { public void invoke() { if (state.isPausedOnBreakpoint()) { createEvaluationContainer(Properties.IS_DEVELOPER_MODE, selectedNodes, new _FunctionTypes._void_P1_E0<IEvaluationContainer>() { public void invoke(IEvaluationContainer container) { ApplicationManager.getApplication().assertIsDispatchThread(); EvaluationDialog evaluationDialog = new EvaluationDialog(ProjectHelper.toIdeaProject(mpsProject), EvaluationProvider.this, container); evaluationDialog.show(); } }); } } }, state.getThread().getThread()); } public void showEditWatchDialog(@NotNull com.intellij.openapi.project.Project ideaProject, final IEvaluationContainer model) { ApplicationManager.getApplication().assertIsDispatchThread(); final EditWatchDialog editWatchDialog = new EditWatchDialog(ideaProject, this, model); editWatchDialog.getWindow().addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { fireWatchUpdated(model); } }); editWatchDialog.show(); } @Override public JComponent createWatchesPanel() { return new WatchesPanel(this); } public void addWatch(final IEvaluationContainer evaluationModel) { myDebugSession.getEventsProcessor().schedule(new _FunctionTypes._void_P0_E0() { public void invoke() { evaluationModel.copy(true, new _FunctionTypes._void_P1_E0<IEvaluationContainer>() { public void invoke(IEvaluationContainer container) { synchronized (myWatches) { myWatches.add(container); } fireWatchAdded(container); } }); } }); } public void createWatch() { myDebugSession.getEventsProcessor().schedule(new _FunctionTypes._void_P0_E0() { public void invoke() { createEvaluationContainer(true, new _FunctionTypes._void_P1_E0<IEvaluationContainer>() { public void invoke(final IEvaluationContainer container) { ApplicationManager.getApplication().assertIsDispatchThread(); EditWatchDialog editWatchDialog = new EditWatchDialog(myDebugSession.getIdeaProject(), EvaluationProvider.this, container, new _FunctionTypes._void_P0_E0() { public void invoke() { addWatch(container); } }); editWatchDialog.show(); } }); } }); } public void removeWatch(IEvaluationContainer model) { synchronized (myWatches) { myWatches.remove(model); } fireWatchRemoved(model); } public DebugSession getDebugSession() { return myDebugSession; } @Nullable private synchronized IEvaluationContainer createEvaluationContainer(boolean isWatch, _FunctionTypes._void_P1_E0<? super IEvaluationContainer> onNodeSetUp) { if (myContainerModuleRef == null) { return null; } return new EvaluationWithContextContainer(myDebugSession.getProject(), myDebugSession, myContainerModuleRef, ListSequence.fromList(new ArrayList<SNodeReference>()), isWatch, onNodeSetUp); } @Nullable private synchronized IEvaluationContainer createEvaluationContainer(boolean isWatch, List<SNodeReference> selectedNodes, _FunctionTypes._void_P1_E0<? super IEvaluationContainer> onNodeSetUp) { if (myContainerModuleRef == null) { return null; } return new EvaluationWithContextContainer(myDebugSession.getProject(), myDebugSession, myContainerModuleRef, selectedNodes, isWatch, onNodeSetUp); } public List<IEvaluationContainer> getWatches() { List<IEvaluationContainer> watchesCopy = new ArrayList<IEvaluationContainer>(); synchronized (myWatches) { watchesCopy.addAll(myWatches); } return watchesCopy; } private List<EvaluationProvider.IWatchListener> getListeners() { List<EvaluationProvider.IWatchListener> listeners = new ArrayList<EvaluationProvider.IWatchListener>(); synchronized (myWatchListeners) { listeners.addAll(myWatchListeners); } return listeners; } private void fireWatchAdded(IEvaluationContainer model) { for (EvaluationProvider.IWatchListener listener : getListeners()) { listener.watchAdded(model); } } private void fireWatchUpdated(IEvaluationContainer model) { for (EvaluationProvider.IWatchListener listener : getListeners()) { listener.watchUpdated(model); } } private void fireWatchRemoved(IEvaluationContainer model) { for (EvaluationProvider.IWatchListener listener : getListeners()) { listener.watchRemoved(model); } } public void addWatchListener(@NotNull EvaluationProvider.IWatchListener listener) { synchronized (myWatchListeners) { myWatchListeners.add(listener); } } public void removeWatchListener(@NotNull EvaluationProvider.IWatchListener listener) { synchronized (myWatchListeners) { myWatchListeners.remove(listener); } } public interface IWatchListener { void watchAdded(IEvaluationContainer model); void watchUpdated(IEvaluationContainer model); void watchRemoved(IEvaluationContainer model); } public static class WatchAdapter implements EvaluationProvider.IWatchListener { public WatchAdapter() { } @Override public void watchAdded(IEvaluationContainer model) { } @Override public void watchUpdated(IEvaluationContainer model) { } @Override public void watchRemoved(IEvaluationContainer model) { } } }