2016-01-14 19:38:06 -08:00

191 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>12. Folding Builder / IntelliJ Platform SDK DevGuide</title>
<link rel="stylesheet" href="/intellij/sdk/docs/app/css/styles.min.css">
<!-- non-retina iPad pre iOS 7 -->
<link rel="apple-touch-icon" href="/intellij/sdk/docs/apple-touch-icon-72x72.png" sizes="72x72">
<!-- retina iPhone pre iOS 7 -->
<link rel="apple-touch-icon" href="/intellij/sdk/docs/apple-touch-icon-114x114.png" sizes="114x114">
<!-- retina iPad pre iOS 7 -->
<link rel="apple-touch-icon" href="/intellij/sdk/docs/apple-touch-icon-144x144.png" sizes="144x144">
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/intellij/sdk/docs/apple-touch-icon-precomposed.png">
<!-- normal favicon -->
<link rel="shortcut icon" type="image/x-icon" href="/intellij/sdk/docs/favicon.ico">
<link rel="icon" type="image/png" href="/intellij/sdk/docs/favicon.png">
<link rel="stylesheet" href="/intellij/sdk/docs/styles/styles.css"></head>
<body data-id="tutorials/custom_language_support/folding_builder">
<div class="wrapper">
<section class="panel _nav">
<header class="panel__header">
<div class="container">
<form class="search-box">
<label for="search-box__input" class="search-box__label">
<input type="text" class="search-box__input" id="search-box__input" placeholder="Search IntelliJ Platform SDK DevGuide">
</label>
<div class="search-box__clear" title="Clear"></div>
</form>
</div>
</header>
<nav class="panel__content">
<div class="container _nav">
<menu class="nav-tree"></menu>
</div>
<div class="container _footer panel__footer">
<p><a href="https://youtrack.jetbrains.com/issues/IJSDK">Send feedback</a></p>
<p>&copy; 2000&ndash;2016 <a href="//www.jetbrains.com">JetBrains</a> s.r.o.<br>
All rights reserved.</p>
</div>
</nav>
</section>
<main class="panel _main" role="main">
<header class="panel__header">
<div class="container">
<h3>IntelliJ Platform SDK DevGuide</h3>
<div class="shortcuts-switcher"><label for="switch-shortcuts">Keymap:</label><select id="switch-shortcuts" class="select _shortcuts" height="1">
<option data-group="primary" value="default" selected>Default</option>
<option data-group="primary" value="default_for_gnome">GNOME</option>
<option data-group="primary" value="default_for_kde">KDE</option>
<option data-group="primary" value="default_for_xwin">XWindow</option>
<option data-group="primary" value="emacs">Emacs</option>
<option data-group="primary" value="jbuilder">JBuilder</option>
<option data-group="primary" value="visual_studio">Visual Studio</option>
<option data-group="primary" value="netbeans_6.5">NetBeans 6.5</option>
<option data-group="primary" value="eclipse">Eclipse</option>
<option data-group="secondary" value="mac_os_x_10.5_">OS X 10.5+</option>
<option data-group="secondary" value="mac_os_x">OS X</option>
<option data-group="secondary" value="eclipse_mac_os_x">OS X Eclipse</option></select>
</div>
<div class="panel-trigger"></div>
</div>
</header>
<section class="panel__content">
<div class="container">
<article class="article" data-shortcut-switcher="false">
<h1>12. Folding Builder</h1>
<p>A folding builder helps you to fold the code regions and replace it with specific text.</p>
<a name="define-a-folding-builder" class="elem-anchor"></a>
<h3>12.1. Define a folding builder<a href="#define-a-folding-builder" class="anchor-link"><span></span></a></h3>
<p>Lets replace usages of properties with its values by default.</p>
<pre><code class="code-block__wrapper code-block _highlighted lang_java"><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">simpleplugin</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.lang.ASTNode</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.lang.folding.FoldingBuilderEx</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.lang.folding.FoldingDescriptor</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.openapi.editor.Document</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.openapi.editor.FoldingGroup</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.openapi.project.Project</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.openapi.util.TextRange</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.psi.PsiElement</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.psi.PsiLiteralExpression</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.intellij.psi.util.PsiTreeUtil</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.simpleplugin.psi.SimpleProperty</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jetbrains.annotations.NotNull</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jetbrains.annotations.Nullable</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.Collection</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SimpleFoldingBuilder</span> <span class="kd">extends</span> <span class="n">FoldingBuilderEx</span> <span class="o">{</span>
<span class="nd">@NotNull</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="n">FoldingDescriptor</span><span class="o">[]</span> <span class="nf">buildFoldRegions</span><span class="o">(</span><span class="nd">@NotNull</span> <span class="n">PsiElement</span> <span class="n">root</span><span class="o">,</span> <span class="nd">@NotNull</span> <span class="n">Document</span> <span class="n">document</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">quick</span><span class="o">)</span> <span class="o">{</span>
<span class="n">FoldingGroup</span> <span class="n">group</span> <span class="o">=</span> <span class="n">FoldingGroup</span><span class="o">.</span><span class="na">newGroup</span><span class="o">(</span><span class="s">"simple"</span><span class="o">);</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">FoldingDescriptor</span><span class="o">&gt;</span> <span class="n">descriptors</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">FoldingDescriptor</span><span class="o">&gt;();</span>
<span class="n">Collection</span><span class="o">&lt;</span><span class="n">PsiLiteralExpression</span><span class="o">&gt;</span> <span class="n">literalExpressions</span> <span class="o">=</span> <span class="n">PsiTreeUtil</span><span class="o">.</span><span class="na">findChildrenOfType</span><span class="o">(</span><span class="n">root</span><span class="o">,</span> <span class="n">PsiLiteralExpression</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="k">for</span> <span class="o">(</span><span class="kd">final</span> <span class="n">PsiLiteralExpression</span> <span class="n">literalExpression</span> <span class="o">:</span> <span class="n">literalExpressions</span><span class="o">)</span> <span class="o">{</span>
<span class="n">String</span> <span class="n">value</span> <span class="o">=</span> <span class="n">literalExpression</span><span class="o">.</span><span class="na">getValue</span><span class="o">()</span> <span class="k">instanceof</span> <span class="n">String</span> <span class="o">?</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span><span class="n">literalExpression</span><span class="o">.</span><span class="na">getValue</span><span class="o">()</span> <span class="o">:</span> <span class="kc">null</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">value</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="n">value</span><span class="o">.</span><span class="na">startsWith</span><span class="o">(</span><span class="s">"simple:"</span><span class="o">))</span> <span class="o">{</span>
<span class="n">Project</span> <span class="n">project</span> <span class="o">=</span> <span class="n">literalExpression</span><span class="o">.</span><span class="na">getProject</span><span class="o">();</span>
<span class="n">String</span> <span class="n">key</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="na">substring</span><span class="o">(</span><span class="mi">7</span><span class="o">);</span>
<span class="kd">final</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">SimpleProperty</span><span class="o">&gt;</span> <span class="n">properties</span> <span class="o">=</span> <span class="n">SimpleUtil</span><span class="o">.</span><span class="na">findProperties</span><span class="o">(</span><span class="n">project</span><span class="o">,</span> <span class="n">key</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">properties</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="mi">1</span><span class="o">)</span> <span class="o">{</span>
<span class="n">descriptors</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">FoldingDescriptor</span><span class="o">(</span><span class="n">literalExpression</span><span class="o">.</span><span class="na">getNode</span><span class="o">(),</span>
<span class="k">new</span> <span class="nf">TextRange</span><span class="o">(</span><span class="n">literalExpression</span><span class="o">.</span><span class="na">getTextRange</span><span class="o">().</span><span class="na">getStartOffset</span><span class="o">()</span> <span class="o">+</span> <span class="mi">1</span><span class="o">,</span>
<span class="n">literalExpression</span><span class="o">.</span><span class="na">getTextRange</span><span class="o">().</span><span class="na">getEndOffset</span><span class="o">()</span> <span class="o">-</span> <span class="mi">1</span><span class="o">),</span> <span class="n">group</span><span class="o">)</span> <span class="o">{</span>
<span class="nd">@Nullable</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getPlaceholderText</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">// IMPORTANT: keys can come with no values, so a test for null is needed</span>
<span class="c1">// IMPORTANT: Convert embedded \n to backslash n, so that the string will look like it has LF embedded in it and embedded " to escaped "</span>
<span class="n">String</span> <span class="n">valueOf</span> <span class="o">=</span> <span class="n">properties</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">).</span><span class="na">getValue</span><span class="o">();</span>
<span class="k">return</span> <span class="n">valueOf</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="s">""</span> <span class="o">:</span> <span class="n">valueOf</span><span class="o">.</span><span class="na">replaceAll</span><span class="o">(</span><span class="s">"\n"</span><span class="o">,</span><span class="s">"\\n"</span><span class="o">).</span><span class="na">replaceAll</span><span class="o">(</span><span class="s">"\""</span><span class="o">,</span><span class="s">"\\\\\""</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">});</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">descriptors</span><span class="o">.</span><span class="na">toArray</span><span class="o">(</span><span class="k">new</span> <span class="n">FoldingDescriptor</span><span class="o">[</span><span class="n">descriptors</span><span class="o">.</span><span class="na">size</span><span class="o">()]);</span>
<span class="o">}</span>
<span class="nd">@Nullable</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getPlaceholderText</span><span class="o">(</span><span class="nd">@NotNull</span> <span class="n">ASTNode</span> <span class="n">node</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">"..."</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isCollapsedByDefault</span><span class="o">(</span><span class="nd">@NotNull</span> <span class="n">ASTNode</span> <span class="n">node</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<a name="register-the-folding-builder" class="elem-anchor"></a>
<h3>12.2. Register the folding builder<a href="#register-the-folding-builder" class="anchor-link"><span></span></a></h3>
<pre><code class="code-block__wrapper code-block _highlighted lang_xml"><span class="nt">&lt;lang.foldingBuilder</span> <span class="na">language=</span><span class="s">"JAVA"</span> <span class="na">implementationClass=</span><span class="s">"com.simpleplugin.SimpleFoldingBuilder"</span><span class="nt">/&gt;</span>
</code></pre>
<a name="run-the-project" class="elem-anchor"></a>
<h3>12.3. Run the project<a href="#run-the-project" class="anchor-link"><span></span></a></h3>
<p>Now when we open a Java file, it shows the propertys value instead of the key.</p>
<p><img src="img/folding.png" alt="Folding" /></p>
<p><a href="find_usages_provider.html"><span>Previous</span></a>
<a href="/intellij/sdk/docs/tutorials/custom_language_support_tutorial.html"><span>Top</span></a>
<a href="go_to_symbol_contributor.html"><span>Next</span></a></p>
<div class="last-modified">
Last modified: 28 December 2015
</div>
</article>
<section class="disqus">
<div id="disqus_thread"></div>
</section>
</div>
</section>
</main>
</div>
<script data-main="/intellij/sdk/docs/app/js/main.build" data-baseurl="/intellij/sdk/docs/" src="/intellij/sdk/docs/app/js/vendor/requirejs/require.js"></script>
</body>
</html>