[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / settings / RendererConfiguration.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.debugger.settings;
3
4 import com.intellij.debugger.impl.DebuggerUtilsEx;
5 import com.intellij.debugger.ui.tree.render.NodeRenderer;
6 import com.intellij.openapi.diagnostic.Logger;
7 import com.intellij.openapi.util.JDOMExternalizable;
8 import com.intellij.openapi.util.WriteExternalException;
9 import com.intellij.openapi.util.text.StringUtil;
10 import com.intellij.util.containers.InternalIterator;
11 import org.jdom.Element;
12 import org.jetbrains.annotations.TestOnly;
13
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.List;
17 import java.util.concurrent.CopyOnWriteArrayList;
18
19 public class RendererConfiguration implements Cloneable, JDOMExternalizable {
20   private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.NodeRendererSettings");
21
22   private static final int VERSION = 8;
23
24   private List<NodeRenderer> myRepresentationNodes = new CopyOnWriteArrayList<>();
25   private final NodeRendererSettings myRendererSettings;
26
27   protected RendererConfiguration(NodeRendererSettings rendererSettings) {
28     myRendererSettings = rendererSettings;
29   }
30
31   @Override
32   public RendererConfiguration clone() {
33     RendererConfiguration result = null;
34     try {
35       result = (RendererConfiguration)super.clone();
36     }
37     catch (CloneNotSupportedException e) {
38       LOG.error(e);
39     }
40     result.myRepresentationNodes = new CopyOnWriteArrayList<>();
41
42     final ArrayList<NodeRenderer> cloned = new ArrayList<>();
43     for (NodeRenderer renderer : myRepresentationNodes) {
44       cloned.add((NodeRenderer)renderer.clone());
45     }
46     result.setRenderers(cloned);
47
48     return result;
49   }
50
51   public boolean equals(Object o) {
52     if(!(o instanceof RendererConfiguration)) return false;
53
54     return DebuggerUtilsEx.externalizableEqual(this, (RendererConfiguration)o);
55   }
56
57   @Override
58   public void writeExternal(final Element element) throws WriteExternalException {
59     for (NodeRenderer renderer : myRepresentationNodes) {
60       element.addContent(myRendererSettings.writeRenderer(renderer));
61     }
62     element.setAttribute("VERSION", String.valueOf(VERSION));
63   }
64
65   @Override
66   public void readExternal(final Element root) {
67     int configurationVersion = StringUtil.parseInt(root.getAttributeValue("VERSION"), -1);
68     if (configurationVersion != VERSION) {
69       return;
70     }
71
72     final List<Element> children = root.getChildren(NodeRendererSettings.RENDERER_TAG);
73     final List<NodeRenderer> renderers = new ArrayList<>(children.size());
74     for (Element nodeElement : children) {
75       try {
76         renderers.add((NodeRenderer)myRendererSettings.readRenderer(nodeElement));
77       }
78       catch (Exception e) {
79         LOG.debug(e);
80       }
81     }
82     setRenderers(renderers);
83   }
84
85   public void addRenderer(NodeRenderer renderer) {
86     myRepresentationNodes.add(0, renderer);
87   }
88
89   @TestOnly
90   public void removeRenderer(NodeRenderer renderer) {
91     myRepresentationNodes.remove(renderer);
92   }
93
94   public void setRenderers(Collection<NodeRenderer> renderers) {
95     myRepresentationNodes.clear();
96     myRepresentationNodes.addAll(renderers);
97   }
98
99   public void iterateRenderers(InternalIterator<NodeRenderer> iterator) {
100     for (final NodeRenderer renderer : myRepresentationNodes) {
101       final boolean shouldContinue = iterator.visit(renderer);
102       if (!shouldContinue) {
103         break;
104       }
105     }
106   }
107
108   public int getRendererCount() {
109     return myRepresentationNodes.size();
110   }
111
112   public boolean contains(NodeRenderer renderer) {
113     return myRepresentationNodes.contains(renderer);
114   }
115 }