/* * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.xdebugger.impl.frame; import com.intellij.xdebugger.frame.XValue; import com.intellij.xdebugger.frame.XValueMarkerProvider; import com.intellij.xdebugger.impl.ui.tree.ValueMarkup; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * @author nik */ public class XValueMarkers<V extends XValue, M> { private final XValueMarkerProvider<V, M> myProvider; private final Map<M, ValueMarkup> myMarkers; private XValueMarkers(@NotNull XValueMarkerProvider<V, M> provider) { myProvider = provider; myMarkers = new HashMap<>(); } public static <V extends XValue, M> XValueMarkers<V, M> createValueMarkers(@NotNull XValueMarkerProvider<V, M> provider) { return new XValueMarkers<>(provider); } @Nullable public ValueMarkup getMarkup(@NotNull XValue value) { Class<V> valueClass = myProvider.getValueClass(); if (!valueClass.isInstance(value)) return null; V v = valueClass.cast(value); if (!myProvider.canMark(v)) return null; M m = myProvider.getMarker(v); if (m == null) return null; return myMarkers.get(m); } public boolean canMarkValue(@NotNull XValue value) { Class<V> valueClass = myProvider.getValueClass(); if (!valueClass.isInstance(value)) return false; return myProvider.canMark(valueClass.cast(value)); } public void markValue(@NotNull XValue value, @NotNull ValueMarkup markup) { //noinspection unchecked M m = myProvider.markValue((V)value); myMarkers.put(m, markup); } public void unmarkValue(@NotNull XValue value) { //noinspection unchecked final V v = (V)value; M m = myProvider.getMarker(v); if (m != null) { myProvider.unmarkValue(v, m); myMarkers.remove(m); } } public Map<M, ValueMarkup> getAllMarkers() { return Collections.unmodifiableMap(myMarkers); } public void clear() { myMarkers.clear(); } }