<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
  <title>Dmitry Jemerov&apos;s Weblog</title>
  <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/" />
  <modified>2006-07-04T09:29:30Z</modified>
  <tagline>IntelliJ IDEA Developer, JetBrains</tagline>
  <id>tag:blogs.jetbrains.com,2007:/yole//1</id>
  <generator url="http://www.movabletype.org/" version="3.2">Movable Type</generator>
  <copyright>Copyright (c) 2006, Dmitry Jemerov</copyright>
  <author>
    <name>Dmitry Jemerov</name>
    <url>http://www.yole.ru</url>
    <email>yole@jetbrains.com</email>
  </author>
  <entry>
    <title>JavaOne multimedia presentations now available</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000127.html" />
    <modified>2006-07-04T09:29:30Z</modified>
    <issued>2006-07-04T12:29:26+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.127</id>
    <created>2006-07-04T09:29:26Z</created>
    <summary type="text/plain"><![CDATA[Sun has just made available the technical presentations from JavaOne, including my presentation on Team Server. You can view the slides, listen to the multimedia presentation, or read the transcript. To listen to the audio, you&rsquo;ll need a Sun Developer...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>Sun has just made available the technical presentations from JavaOne, including <a href="http://developers.sun.com/learning/javaoneonline/2006/tools/TS-5033.html">my presentation</a> on Team Server. You can view the slides, listen to the multimedia presentation, or read the transcript. To listen to the audio, you&rsquo;ll need a Sun Developer Network login &ndash; you can register for free if you don&rsquo;t have one.</p>
<p>Unfortunately the presentations do not include video for the demos, so you won&rsquo;t be able to see the Remote Run and Delayed Commit functionality in action.</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>Pythonid plugin released</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000125.html" />
    <modified>2006-06-08T10:19:59Z</modified>
    <issued>2006-06-08T13:19:55+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.125</id>
    <created>2006-06-08T10:19:55Z</created>
    <summary type="text/plain"><![CDATA[Pythonid, the plugin providing support of the Python language in IntelliJ IDEA,&nbsp;has finally been released. You can download it from the IntelliJ IDEA Plugin Manager (Settings | Plugins), or from the plugin repository. The plugin is currently compatible only with...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>Pythonid, the plugin providing support of the Python language in IntelliJ IDEA,&nbsp;has finally been released. You can download it from the IntelliJ IDEA Plugin Manager (Settings | Plugins), or from the <a href="http://plugins.intellij.net/plugin/?id=631">plugin repository</a>.</p>
<p>The plugin is currently compatible only with IDEA 5.1.x. Demetra compatibility will be provided in the next build of Demetra.</p>
<p>Pythonid&nbsp;was developed by me and Keith Lea. This is not an official JetBrains product; I work on the plugin only in my spare time. The plugin is open-source, and the source code is available at <a href="http://pythonid.dev.java.net">http://pythonid.dev.java.net</a>. People willing to contribute to the plugin development are very much welcome; if you're interested, please contact me to discuss the details.</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>Team Server / IntelliJ IDEA presentation on Google Video</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000124.html" />
    <modified>2006-05-24T14:01:34Z</modified>
    <issued>2006-05-24T17:01:32+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.124</id>
    <created>2006-05-24T14:01:32Z</created>
    <summary type="text/plain"><![CDATA[Yesterday I&rsquo;ve returned from California, where I was at JavaOne conference. This was quite a &ldquo;deep dive&rdquo; for me&nbsp;- despite the fact that it was&nbsp;my first time at an international conference, I came there to give a talk, and my...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>Yesterday I&rsquo;ve returned from California, where I was at JavaOne conference. This was quite a &ldquo;deep dive&rdquo; for me&nbsp;- despite the fact that it was&nbsp;my first time at an international conference, I came there to give a talk, and my talk was scheduled on the first day of the conference. The talk went&nbsp;well, though, and I also enjoyed the remaining part of the conference quite a lot.</p>
<p>Before JavaOne, we gave presentations on our products at the Google office. I&nbsp;spoke about Team Server, and Mike Aizatsky demonstrated the HTML, CSS and JavaScript features of IntelliJ IDEA. Our talk was recorded, and the recording is currently available on <a href="http://video.google.com/videoplay?docid=-5548138713037707664">Google Video</a>.</p>
<p>Enjoy watching, and if you have any comments, feel free to leave them here.</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>So what is &quot;Support for JGoodies Forms&quot;?</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000119.html" />
    <modified>2006-04-05T17:38:22Z</modified>
    <issued>2006-04-05T20:38:02+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.119</id>
    <created>2006-04-05T17:38:02Z</created>
    <summary type="text/plain"><![CDATA[One more&nbsp;very common request for the UI Designer is the request to support JGoodies Forms. This request shares a common trait with many other requests to support something that we receive for other areas of IntelliJ IDEA: it lacks any...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>One more&nbsp;very common request for the UI Designer is the request to support <a href="http://jgoodies.com/freeware/forms/index.html">JGoodies Forms</a>. This request shares a common trait with many other requests to support something that we receive for other areas of IntelliJ IDEA: it lacks any details. For example, what does <a href="http://www.jetbrains.net/confluence/display/IDEADEV/Demetra+Roadmap?focusedCommentId=17578#comment-17578">&ldquo;Spring support&rdquo;</a> mean? Is the Spring-specific resolve and completion available since version 5.0.2 sufficient, or does the requester need something more, and if so, what exactly?</p>
<p>As for JGoodies Forms, there is one kind of support that we can provide with very little effort. We can make it possible to generate source code and bytecode which uses the JGoodies Forms layout manager without making any additions to the design-time experience. (We already support GridBagLayout in&nbsp;a similar way &ndash; if you&rsquo;re curious, look at GridBagLayoutCodeGenerator and GridBagConverter classes in redist\src\src_javac2.zip.) The only issue is that I don&rsquo;t quite understand what problem it would solve.</p>
<p>Now, of course, JGoodies Forms has a number of features which are not supported by our designer (for example, row/column groups).&nbsp;And if what you really need are these additional features, it will probably make the most sense to support them in our own layout manager, in addition to providing JGoodies Forms support.</p>
<p>So, my request is: if you&rsquo;re interested in JGoodies Forms support, could you please leave a comment here and describe what exactly you need from such a support?</p>
<p>And in the meantime, here&rsquo;s a small preview of a different new feature that I&rsquo;ve been working on today:</p>
<p><img alt="ClientPropertiesPreview" src="http://blogs.jetbrains.com/yole/images/ClientPropertiesPreview.png" border="0" /></p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 6.0 &quot;Demetra&quot; UI Designer: Custom component creation</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000118.html" />
    <modified>2006-04-04T17:20:16Z</modified>
    <issued>2006-04-04T20:20:08+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.118</id>
    <created>2006-04-04T17:20:08Z</created>
    <summary type="text/plain">One of the problems which made it impossible for people to use previous versions of the IntelliJ IDEA UI Designer in their projects was the lack of support for custom component creation code. The designer could only work with components...</summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>One of the problems which made it impossible for people to use previous versions of the IntelliJ IDEA UI Designer in their projects was the lack of support for custom component creation code. The designer could only work with components which had no-argument public constructors, and could not handle components created by constructors with arguments, component factories and so on.</p>
<p>We continued to receive feedback on this issue during our work on the version 6.0, and finally we&rsquo;ve come to a solution for this issue that doesn&rsquo;t break any of our design principles. The solution works equally well for source code generation and bytecode instrumentation, and does not involve storing source code in the form files.</p>
<p>The solution is in fact very simple. Every component now has a property called &ldquo;Custom Create&rdquo;:</p>
<p><img alt="CustomCreate" src="http://blogs.jetbrains.com/yole/images/CustomCreate.png" border="0" /></p>
<p>If the property is set for a component, the UI Designer does not generate the constructor call for this component. Instead, if at least one component has the &ldquo;Custom Create&rdquo; flag set, IntelliJ IDEA creates a special method called <code>createUIComponents()</code>, and inserts&nbsp;a call&nbsp;to this method in the beginning of the generated UI initialization method. The code of createUIComponents() is written by the user, and the user needs to assign values to fields bound to all custom-created components. (A component with the &ldquo;Custom Create&rdquo; flag must be bound to a field.)</p>
<p><img alt="CreateUIComponents" src="http://blogs.jetbrains.com/yole/images/CreateUIComponents.png" border="0" /></p>
<p>In design time, components which do not have a public default constructor are represented by instances of superclasses which do have such a constructor, or by JPanel instances if there is no such superclass. The property list shown in the inspector is still taken from the exact class of the component, so you&rsquo;ll be able to set the values for all properties (although the values of properties that don&rsquo;t exist in the superclass will not affect the design-time appearance of the component).</p>
<p>A related change that also makes the UI Designer more flexible is a small modification to the source code generation algorithm. Now, if any of the user-written constructors of a class bound to a form calls the UI initialization method explicitly, IntelliJ IDEA no longer generate a class initializer block with a call to the UI initialization method. This allows to initialize the UI at a somewhat later time (for example, after values of the parameters&nbsp;passed to the bound class constructor have been processed).</p>
<p>This solution will become available in the next EAP build of Demetra. In the meantime, feel free to leave feedback here, particularly if the solution does not cover some of the scenarios found in your projects.</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 6.0 &quot;Demetra&quot;: Designing the UI Designer, part 3</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000115.html" />
    <modified>2006-03-20T18:18:54Z</modified>
    <issued>2006-03-20T21:18:38+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.115</id>
    <created>2006-03-20T18:18:38Z</created>
    <summary type="text/plain"><![CDATA[Following the first and second parts, this post continues the discussion of key design decisions in the IntelliJ IDEA 6.0 UI Designer. Form and Code Separation. This decision hasn&rsquo;t changed since the initial version of the UI Designer. The principle...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>Following the <a href="http://blogs.jetbrains.com/yole/archives/000112.html">first</a> and <a href="http://blogs.jetbrains.com/yole/archives/000114.html">second</a> parts, this post continues the discussion of key design decisions in the IntelliJ IDEA 6.0 UI Designer.</p>
<p><strong>Form and Code Separation</strong>. This decision hasn&rsquo;t changed since the initial version of the UI Designer. The principle is simple: Java code is never stored in .form files and never edited in the UI Designer. The Java editor&nbsp; in IntelliJ IDEA is a much better environment for editing Java code than anything which could be embedded in the UI Designer dialogs, and having all the code in one place (the Java class file) makes it easier to understand and causes much less surprises.</p>
<p>All of this doesn&rsquo;t preclude the possibility to navigate between code and form files. The possibility to jump from a field declaration to the corresponding UI component in the form and back has been present since the initial version of the UI Designer. Version 6.0 adds another navigation feature: &ldquo;Navigate to Listener&rdquo;, allowing to navigate from a component in the form to the event listener classes attached to the component. Here&rsquo;s a screenshot showing how this works:</p>
<p><img alt="NavigateToListener" src="http://blogs.jetbrains.com/yole/images/NavigateToListener.png" border="0" /></p>
<p><strong>One-Step Layout</strong>. This&nbsp;is probably the biggest change to the UI Designer made in version 6.0 &ndash; or, at least, the most controversial one. </p>
<p>In previous versions of the UI Designer, building the form layout was a two-step process. First, the user placed components on a form with no layout, with arbitrary positions and sizes. Then, the user selected all or some of the components and invoked one of the layout actions (&ldquo;Lay Out Horizonally&rdquo;, &ldquo;Lay Out Vertically&rdquo;, &ldquo;Lay Out in a Grid&rdquo;). The UI Designer tried to guess the grid structure needed to lay out the components similarly to how the user placed them, and created the grid.</p>
<p>We feel that this approach has a number of problems. First of all, it is confusing for new users: almost no other UI design tools&nbsp;(except for Qt Designer, on which this design was based) have such a two-step process, and there was very little instruction telling the users what they were supposed to do. Second, this procedure inherently lacks feedback. The grid structure is always more limited than the free-form layout, so the layout created by the user is not reproduced exactly. Also, the algorithm is not always predictable, so the user often has to undo the layout process, try to tweak the placement&nbsp;of the components and retry the layout, hoping that the second time will produce better results.</p>
<p>Thus, we have dropped the layout actions in the new version. Now, a grid structure is always created around components placed on a form, and the actions for adding components have been modified so that they can insert grid rows and columns if required. Layout modifications can also be done by dragging components within the grid, and do not require breaking and rebuilding the layout, as was often the case in previous versions.</p>
<p>In fact, the current layout editing experience is considered to be work in progress, and we expect to continue tweaking and improving it in the future EAP builds, to ensure that the behavior always matches user expectations and all necessary operations are easy to accomplish.</p>
<p><strong>UI Inspections</strong>. Inspections are heavily used in many areas of IntelliJ IDEA, and we decided to make use of them in the UI Designer as well. Designing forms involves a number of routine operations (assigning mnemonics, placing components in JScrollPanes, grouping radio buttons, linking labels to controls and so on). Of course, we found it desirable to automate the operations. However, rather than doing things fully automatically or popping up modal dialogs asking the user for confirmation, we linked them to the well-used lightbulb and Alt-Enter keyboard shortcut.</p>
<p>For example, here&rsquo;s how the inspection for assigning mnemonics works:</p>
<p><img alt="AssignMnemonicInspection" src="http://blogs.jetbrains.com/yole/images/AssignMnemonicInspection.png" border="0" /></p>
<p>The designer automatically suggests choices for the text with mnemonics, ensuring that the suggested variants do not overlap with mnemonics of other controls in the form:</p>
<p><img alt="AssignMnemonicQuickfix" src="http://blogs.jetbrains.com/yole/images/AssignMnemonicQuickfix.png" border="0" /></p>
<p>Well, looks like I&rsquo;ve got the major decisions covered, so the following posts will focus on specific new features implemented in the IntelliJ IDEA 6.0 UI Designer. As usual, don&rsquo;t hesitate to send your feedback &ndash; and thanks to everyone who has left comments on previous posts in this blog. :-)</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 6.0 &quot;Demetra&quot;, Designing the UI Designer, part 2</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000114.html" />
    <modified>2006-03-17T10:59:23Z</modified>
    <issued>2006-03-17T13:59:05+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.114</id>
    <created>2006-03-17T10:59:05Z</created>
    <summary type="text/plain"><![CDATA[Yesterday I described the main goals with which we approached the UI Designer in IntelliJ IDEA 6.0. Now I&rsquo;ll describe some of the key decisions we&rsquo;ve made &ndash; part of them are new for version 6.0, and others haven&rsquo;t changed...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p><a href="http://blogs.jetbrains.com/yole/archives/000112.html">Yesterday</a> I described the main goals with which we approached the UI Designer in IntelliJ IDEA 6.0. Now I&rsquo;ll describe some of the key decisions we&rsquo;ve made &ndash; part of them are new for version 6.0, and others haven&rsquo;t changed since the previous versions of UI Designer available in IntelliJ IDEA 4.x and 5.x. As usual, any feedback on the decisions is very much welcome.</p>
<p><strong>Runtime Requirement</strong>. In previous versions of IntelliJ IDEA, the code generated by the UI Designer always required the use of a runtime library (forms_rt.jar), which contains a custom layout manager and a number of additional utility functions. This became a major obstacle for many users who didn&rsquo;t want to introduce extra dependencies in their applications &ndash; some of them&nbsp;rejected the UI Designer completely when they learned of the runtime requirement. The problem was made worse by the fact that, until version 5.0, the license for the source code of forms_rt.jar was not clearly defined, which made it hard to use in&nbsp;open-source projects.&nbsp;Now it&rsquo;s clearly licensed under the Apache license, but other problems with the runtime remained.</p>
<p>In the new version, we&rsquo;ve made it possible to generate code which uses only the standard Swing layout managers and does not require any additional runtime. We&rsquo;ve kept the runtime for those who need full compatibility with forms created in earlier versions of IntelliJ IDEA, and we even added a few new features to our layout manager,&nbsp;but you can easily opt out of its use if you don&rsquo;t need that.</p>
<p><strong>Bytecode Instrumentation</strong>. A related issue is the way code is generated by the UI Designer. We decided to keep both of the options available in version 5.0: source code generation and bytecode instrumentation. We consider bytecode instrumentation the best option for projects which are&nbsp;developed using only IntelliJ IDEA, as it&rsquo;s&nbsp;cleaner (the generated code is never visible to users) and provides&nbsp;better build performance. For other projects, where multiple IDEs are used or when the entire source code of the application needs to be provided to the customer, source code generation can be used. </p>
<p>In version 6.0, we&rsquo;ve rewritten the bytecode generator to use <a href="http://asm.objectweb.org/">ASM</a> instead of <a href="http://jakarta.apache.org/bcel/">BCEL</a>, as it provides better performance and&nbsp;better support for new versions of the .class file format. Also, we plan to improve the source code generator so that it produces cleaner and more readable code.</p>
<p><strong>Form Migration</strong>. Using forms created in IDEA with other IDEs is one side of the problem &ndash; another is importing into IDEA forms created in other IDEs. Before version 6.0, we didn&rsquo;t provide any solution to this problem &ndash; you always had to draw forms from scratch.</p>
<p>There are a number of possibilities to solving this. It&rsquo;s possible to import the XML form definition files created by specific designers (for example, JFormDesigner .jfd or NetBeans .form). Another option is to reverse-engineer the Java source code used to create the form (either generated or hand-written) and to extract the information about the component layout and properties (this is the approach used by Eclipse Visual Editor).</p>
<p>However, we decided that importing only specific XML form file formats would be too restricted, and creating a general reverse engineering&nbsp;engine that works in a sufficiently broad number of cases (including hand-written code) is too risky and resource-consuming. Instead, we have implemented the possibility to import form files from the most simple and universal structure of the form data: the run-time tree of Swing components. We inject our component, called Swing Inspector, in the Java virtual machine where the user application runs. When the user presses a button or a keyboard shortcut, a window showing the entire hierarchy of Swing components is displayed. The user can choose any part of that tree (the contents of an entire frame or dialog, a panel containing some of the components, and so on), and that part is saved as a .form file. The entire component layout structure and most of the component properties are saved. Later, the user can open the .form file in UI Designer and modify it as required.</p>
<p>The initial version of the Swing Inspector will be included in the next EAP build of IntelliJ IDEA. Here&rsquo;s a screenshot showing how it works:</p>
<p><img alt="SwingInspector" src="http://blogs.jetbrains.com/yole/images/SwingInspector.png" border="0" /></p>
<p>Well, that&rsquo;s enough for today &ndash; stay&nbsp;tuned for more design decisions next week. And don&rsquo;t forget to send feedback! :-)</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 6.0 &quot;Demetra&quot;: Designing the UI Designer</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000112.html" />
    <modified>2006-03-16T10:39:37Z</modified>
    <issued>2006-03-16T13:39:35+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.112</id>
    <created>2006-03-16T10:39:35Z</created>
    <summary type="text/plain"><![CDATA[As simple requests for feedback do not seem to bring too much response, looks like I need to do something more to get the conversation on the UI Designer going. :-) I&rsquo;ve decided to do a series of posts highlighting...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>As <a href="http://intellij.net/forums/thread.jsp?forum=32&amp;thread=204183&amp;tstart=0&amp;trange=15">simple requests for feedback</a> do not seem to bring too much response, looks like I need to do something more to get the conversation on the UI Designer going. :-) I&rsquo;ve decided to do a series of posts highlighting the important features of the new UI Designer, and for a start, I&rsquo;ll describe the main design goals and key decisions that went into our work.</p>
<p>I&rsquo;m very eager to receive any kind of feedback, positive or negative,&nbsp;on our work and its underlying decisions. Don&rsquo;t hesitate to leave comments here or come to the <a href="http://intellij.net/forums/forum.jsp?forum=32">forum</a> or <a href="news://news.jetbrains.com/jetbrains.intellij.eap.uidesigner">newsgroup</a>. It&rsquo;s still not too late for us to make major and significant changes in the product. And of course, the version of the UI Designer available in <a href="http://intellij.net/eap/">recent EAP builds</a> is not final, and we have a lot of work remaining in our plans, and some cool feature ideas&nbsp;too. And if the current EAP version falls short of accomplishing some of the goals, rest assured that the situation will improve a lot in the final release.</p>
<p>So, first of all, let me&nbsp;state our goal: <em>To create the most productive environment for designing and maintaining Swing interfaces of any complexity</em>.</p>
<p>There are a number of key points in it. The first is <em>the most productive</em>. Of course, we would like our UI Designer to be the best in existence (who wouldn&rsquo;t?), but there are too many ways to decide which one is the best, so we had to focus on one aspect of <em>best</em>. Our choice &ndash;&nbsp;productivity &ndash; shouldn&rsquo;t come as a surprise for those familiar with our products.</p>
<p>Productivity, in my view, comes from a number of factors. The actions not&nbsp;essential for accomplishing the most common tasks should be removed from the workflow for those tasks. Every time the IDE can do part of the user&rsquo;s work by itself, it should do so, or offer the user to do so. Every bit of information that the IDE can use to do its work better should be used. All common errors made by the user should be detected as soon as possible, and the IDE should offer to fix those of them that can be fixed automatically. The interface should always provide adequate feedback on the result of the user&rsquo;s actions so that the user does not make these errors in the first place.</p>
<p>Later I&rsquo;ll show how these factors come into play in specific features of the UI Designer.</p>
<p>The second key point is <em>designing and maintaining</em>. A piece of code written in a few hours or days usually gets maintained for many months or even years, so the ease of maintaining (expanding or modifying) existing UI forms is just as important for us as the ease of creating new forms. An interface that allows to build a form from a clean slate very quickly but provides unexpected results when the user starts dropping components into the middle of an existing form would not be acceptable for us. Also, it should be very easy to understand the structure of&nbsp;an existing&nbsp;form and its connections&nbsp;to other code. (Forms are in general much easier to figure out than Java code, but still the UI Designer should help as much as possible.)</p>
<p>The <em>Swing interfaces</em>&nbsp;point represents a limitation of our focus&nbsp;for this release (we&rsquo;re not touching SWT or midlet form design, for example). It also means that we&rsquo;re going to significantly expand the coverage of&nbsp;different&nbsp;Swing features in the designer. We&rsquo;ve already done much work&nbsp;in that area (support for more property types,&nbsp;standard Swing layout managers, button groups and so on), and there&rsquo;s&nbsp;also much work remaining to do&nbsp;before the final release.</p>
<p>Finally,&nbsp;<em>of&nbsp;any complexity</em> means that the designer should be equally suited for both simple and complex forms. For simple forms, we need to provide very easy ways to accomplish the most common tasks. For complex forms, we&nbsp;need to&nbsp;support building forms from multiple parts, easy possibility to combine hand-written UI components with UI Designer forms, easy ways to modify the form structure, and so on.</p>
<p>In the next post, I&rsquo;m going to cover the key decisions on which the current UI Designer is based, some of which are new for Demetra and others have remained unchanged since previous versions of IDEA.</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>JetBrains Team Server &quot;Albus&quot;: now in the EAP!</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000110.html" />
    <modified>2006-03-14T11:20:23Z</modified>
    <issued>2006-03-14T14:20:21+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.110</id>
    <created>2006-03-14T11:20:21Z</created>
    <summary type="text/plain"><![CDATA[Looks like my blog has turned to announce-only mode &ndash; not good. However, today&rsquo;s news is important enough to post regardless of the status of the blog.&nbsp;:-) Today we have started the EAP for our new product &ndash; JetBrains&nbsp;Team Server,...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>Looks like my blog has turned to announce-only mode &ndash; not good. However, today&rsquo;s news is important enough to post regardless of the status of the blog.&nbsp;:-) </p>
<p>Today we have started the EAP for our new product &ndash; JetBrains&nbsp;Team Server, codename &ldquo;Albus&rdquo;. Its features were announced some time ago in the &ldquo;Team Support&rdquo; section of the&nbsp;<a href="http://www.jetbrains.net/confluence/display/IDEADEV/Demetra+Roadmap">Demetra roadmap</a>,&nbsp;however, we decided to make it a separate product independent from IntelliJ IDEA. In fact, the product is not tied to Java either &ndash; support for building .NET applications will be provided as well.</p>
<p>OK, enough explaining for now &ndash; head over to the <a href="http://www.jetbrains.net/confluence/display/TW/Download+and+Installation">Download and Installation</a> page to grab the bits, read the <a href="http://www.jetbrains.net/confluence/display/TW/Team+Server+FAQ">FAQ</a>, and send your feedback in the <a href="http://www.intellij.net/forums/forum.jsp?forum=68">forums</a> and <a href="http://jetbrains.net/jira/browse/TW">bug tracker</a>. And I wish you many successful builds. :-)</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 6.0 &quot;Demetra&quot;: The EAP has begun!</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000091.html" />
    <modified>2006-03-07T16:59:15Z</modified>
    <issued>2006-02-06T22:05:11+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.91</id>
    <created>2006-02-06T19:05:11Z</created>
    <summary type="text/plain"><![CDATA[When we announced that the EAP for Demetra, the next version of IntelliJ IDEA, would start as soon as the version 5.1 is released, I don&rsquo;t think people thought &ldquo;as soon as&rdquo; meant &ldquo;a&nbsp;few hours after&rdquo;. But it did, and...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>When we announced that the EAP for Demetra, the next version of IntelliJ IDEA, would start as soon as the version 5.1 is released, I don&rsquo;t think people thought &ldquo;as soon as&rdquo; meant &ldquo;a&nbsp;few hours after&rdquo;. But it did, and the <a href="http://www.intellij.net/eap/">first EAP build of Demetra</a> is now available, along with a <a href="http://www.jetbrains.net/confluence/display/IDEADEV/What%27s+New+In+Demetra">list of new features</a>.</p>
<p>I&rsquo;m so tired of writing announcements that I won&rsquo;t go into more detail right now, but I&rsquo;ll definitely do so later&hellip; stay tuned to this blog. :-)</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 5.1: What&apos;s new in OpenAPI</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000089.html" />
    <modified>2006-03-07T16:59:15Z</modified>
    <issued>2006-02-06T18:47:22+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.89</id>
    <created>2006-02-06T15:47:22Z</created>
    <summary type="text/plain">Now that the version 5.1 has been released, I decided to summarize the changes in OpenAPI for this version. None of them are major, but I hope that some of them enable new integration scenarios. An important point is that...</summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>Now that the version 5.1 has been released, I decided to summarize the changes in OpenAPI for this version. None of them are major, but I hope that some of them enable new integration scenarios. An important point is that almost all of the changes are backward-compatible: if a plugin developed for the version 5.0 does not use any APIs which are not part of our OpenAPI, the plugin will work just as fine with version 5.1. All of the reports of actual plugin breakage that we have received during the 5.1&nbsp;EAP cycle are related to usages of non-open APIs.</p>
<p>The major areas where new APIs have been added are:</p>
<p><strong>PSI and Repository</strong></p>
<ul>
<li>Package-level annotations support: PsiPackage.getAnnotationList(). Version 5.1 has improved support for processing and validating package-level annotations, and the new method provides access to the annotation list.</li>
<li>Hierarchical method signatures: PsiClass.getVisibleSignatures(). The main motivation for this API is performance: it allows to calculate the information about the super methods of a method only once and not repeat any calculations for every superclass.</li>
<li>Indexing occurrences of specified regex patterns in comments: IndexPatternProvider and IndexPatternSearch. This is effectively a generalization of the TODO API: TODO has been decoupled from the word index system, and it&rsquo;s now possible to extend the word indexing. Possible uses for this API are, for example, finding occurrences of bug tracker request IDs in the comments. The query framework on which the IndexPatternSearch API is based (QueryFactory, QueryExecutor and related classes) has been backported from Demetra, and will be used much more extensively in the new version.</li>
<li>Possibility to delegate getChildAttributes() processing to a child block of the current block: ChildAttributes.DELEGATE_TO_PREV_CHILD and ChildAttributes.DELEGATE_TO_NEXT_CHILD. In additional to these API additions, there have been a number of fixes in the formatter core (in particular, the fixes are required for correct operation of the Python formatter).</li></ul>
<p><strong>Version Control Integration</strong></p>
<ul>
<li>Checkin handlers: CheckinHandlerFactory, CheckinHandler. This API allows any plugin to add actions which are executed before and/or after files are checked in to VCS. The new feature of version 5.1 &ldquo;Before check-in / Perform code analysis on affected files&rdquo; is based on this API, and in fact the entire source code of that feature is supplied in the CodeAnalysisBeforeCheckinHandler class.</li>
<li>Code analysis API: AbstractVcsHelper.findCodeSmells(), CodeSmellInfo. These APIs are used&nbsp;by the &ldquo;Perform code analysis on affected files&rdquo; feature, but can also be useful for some other cases.</li>
<li>Custom actions in the &ldquo;Commit Project&rdquo; dialog: Vcs.MessageActionGroup standard action group. There are no new APIs here besides the action group ID: all actions added to this group are shown as buttons in the Commit Project dialog. The standard &ldquo;History&rdquo; button is now provided by such an action, and its source code is&nbsp;supplied as ShowMessageHistoryAction class.</li>
<li>External access to the &ldquo;Browse Changes&rdquo; functionality of VCS plugins: AbstractVcs.getVersionsProvider(). An extrernal plugin can now query that interface from a particular VCS and use it to load the history of changes for a file, directory or an entire project.</li></ul>
<p><strong>IDE and User Interface</strong></p>
<ul>
<li>Querying the complete list of registered actions: ActionManager.getActionIds(), ActionManager.isGroup(). The APIs are used in the &ldquo;New Action&hellip;&rdquo; dialog of the DevKit plugin.</li>
<li>API for creating classes from templates: CreateElementActionBase and PsiDirectory.createClass(name, templateName). Sample usages of this API are CreateClassAction in the OpenAPI and GeneratePluginClassAction in the DevKit&nbsp;plugin. The IdeView interface and DataConstants.IDE_VIEW have been moved to the OpenAPI because they are used by this code.</li>
<li>Clickable annotations in the editor gutter: EditorGutterAction. Sample can be found in the implementation of the &ldquo;Annotate&rdquo; action of the Perforce plugin (PerforceFileAnnotation.PerforceRevisionAnnotationAspect).</li>
<li>Automatic mnemonic registration: MnemonicHelper class. Used everywhere in IDEA, and particularly in the DialogWrapper class.</li></ul>
<p>There are also a number of smaller changes and additions (for example, some new methods in the utility classes).</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 5.1 Released</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000088.html" />
    <modified>2006-03-07T16:59:15Z</modified>
    <issued>2006-02-06T18:18:21+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.88</id>
    <created>2006-02-06T15:18:21Z</created>
    <summary type="text/plain"><![CDATA[Download, New Features I&rsquo;m very happy to announce this release because it&rsquo;s the first major release of IntelliJ IDEA in which I was significantly involved. I joined the IDEA team at the end of 5.0 release cycle, and my contributions...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p><a href="http://www.jetbrains.com/idea/download/">Download</a>, <a href="http://www.jetbrains.com/idea/features/newfeatures.html">New Features</a></p>
<p>I&rsquo;m very happy to announce this release because it&rsquo;s the first major release of IntelliJ IDEA in which I was significantly involved. I joined the IDEA team at the end of 5.0 release cycle, and my contributions to the 5.0 release were mostly limited to documentation and occasional bugfixes. In this release, I was involved&nbsp;to some degree in three of the four main new features: <a href="http://blogs.jetbrains.com/yole/archives/000042.html">i18n support</a>, <a href="http://blogs.jetbrains.com/yole/archives/000048.html">JavaScript support</a>&nbsp;(originally developed for&nbsp;6.0 and then mostly back-ported to 5.1)&nbsp;and <a href="http://blogs.jetbrains.com/yole/archives/000059.html">plug-in development support</a>. However, what I personally consider the most important for this release is the&nbsp;very large&nbsp;amount of work that the entire team has spent on bugfixing and performance improvements. It&rsquo;s our users who will make the final judgement on the quality of version 5.1, but the perception of our team is that the quality is noticeably better than the last release, version 5.0.2.</p>
<p>Develop with Pleasure!</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA: OpenAPI documentation contributions</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000084.html" />
    <modified>2006-03-07T16:59:15Z</modified>
    <issued>2006-01-29T22:00:18+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.84</id>
    <created>2006-01-29T19:00:18Z</created>
    <summary type="text/plain"><![CDATA[Arik Kfir asks whether we accept contributions to our OpenAPI documentations. In fact, the best way to contribute to the documentation is to write an overview article covering an area of the OpenAPI that you&rsquo;re familiar with. The article does...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>Arik Kfir <a href="http://blogs.jetbrains.com/mt/mt-comments.cgi?entry_id=79">asks</a> whether we accept contributions to our OpenAPI documentations. In fact, the best way to contribute to the documentation is to write an overview article covering an area of the OpenAPI that you&rsquo;re familiar with. The article does not need to be overly long and detailed&nbsp;&ndash; simply describe how to use a component, and how to accomplish the most common tasks using its API. We will be happy to review the articles, publish them on <a href="http://www.jetbrains.com/idea/plugins/plugin_developers.html">jetbrains.com</a> (if you agree to this), and possibly include them in the Plugin Development Package.</p>
<p>JavaDoc contributions are also welcome. However, we can produce JavaDocs pretty fast internally, so it may be sufficient to file a <a href="http://jetbrains.net/jira/browse/IDEA">JIRA request</a> specifying the classes that you would like to see documented.</p>
<p>If you would like to write an article covering some part of the OpenAPI, please contact me (<a href="mailto:yole@jetbrains.com">yole@jetbrains.com</a>) in advance and let me know about the topics you&rsquo;re going to cover, so that we can avoid work duplication. Also, a&nbsp;new introductory plugin development tutorial will be published with the 5.1 release, so articles covering the very basics of plugin development are not in the highest demand now. <img src="http://blogs.jetbrains.com/yole/smile1.gif" /></p>
<p>And thanks for your offer to contribute, Arik!</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA 6.0 &quot;Demetra&quot;: Per-project and per-scope inspection profiles</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000083.html" />
    <modified>2006-03-07T16:59:15Z</modified>
    <issued>2006-01-27T18:59:45+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.83</id>
    <created>2006-01-27T15:59:45Z</created>
    <summary type="text/plain"><![CDATA[This feature is in fact something I promised to blog about quite a long time ago, but after the initial implementation was nearly complete, we decided that we don&rsquo;t really like the way it turned out, and ended up redoing...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>This feature is in fact something I promised to blog about quite a long time ago, but after the initial implementation was nearly complete, we decided that we don&rsquo;t really like the way it turned out, and ended up redoing the feature completely. This post describes the second, reworked implementation &ndash;&nbsp;and who knows what changes we will need to do with it based on feedback from users?..</p>
<p>In previous versions of IntelliJ IDEA, the inspection profile was a user&rsquo;s personal setting; it was possible to export and import inspection profiles, but having a single inspection profile shared between all developers working on the project was quite cumbersome. There was no simple way to propagate the inspection profile changes to all users if the profile was changed after initial configuration. Also, the only way to have different inspection settings in different files of the project was to disable inspections on per-file basis using an icon in the status bar. (In fact, the name for the icon &ndash; &ldquo;Hector the Inspector&rdquo; &ndash; was initially suggested by one of our EAP members, but we liked it so much that we started using it even in the names of classes related to implementing its functionality.)</p>
<p>IntelliJ IDEA 6.0 makes this much more flexible: it is now possible to store inspection profiles in the project file, and the custom scopes mechanism can be used to associate different inspection profiles with different parts of the project.</p>
<p><img alt="ProfileInspectionAssignments" src="http://blogs.jetbrains.com/yole/images/ProfileInspectionAssignments.png" border="0" /></p>
<p>As you can see, we have a separate inspection profile for test sources (where the error strictness is much less important), another for the OpenAPI (where JavaDoc errors are highlighted), and yet another for runtime classes which need to be compatible with JDK 1.3 (so all Java 5 features and API methods are forbidden). The scope definition language is very flexible: for example, the OpenAPI profile is defined as &ldquo;all modules which have openapi as part of the name&rdquo;.</p>
<p><img alt="ProfileEditScopes" src="http://blogs.jetbrains.com/yole/images/ProfileEditScopes.png" border="0" /></p>
<p>We have also made a number of extensions to the scope definition language. For example, it can now apply to files of any type and not only to Java classes, and it supports module groups (so you can define a scope as &ldquo;all modules in this module group&rdquo;).</p>
<p>When a new inspection profile is created, you can choose whether it should be saved as your personal profile (IDE profile), or as a shared profile in the .ipr file.</p>
<p><img alt="ProfileCreateNew" src="http://blogs.jetbrains.com/yole/images/ProfileCreateNew.png" border="0" /></p>
<p>The status bar now shows the profile which is used to inspect the file currently open in the editor, and provides a quick way to access the profile settings. Note that we have dropped the old possibility to disable inspections on per-file basis: the scopes functionality is much more powerful, and if single-file suppressions are indeed what you need, you can create single-file scopes and associate empty inspection profiles with them.</p>
<p><img alt="ProfileHectorDemetra" src="http://blogs.jetbrains.com/yole/images/ProfileHectorDemetra.png" border="0" /></p>]]>
      
    </content>
  </entry>
  <entry>
    <title>IntelliJ IDEA Python plugin available in CVS</title>
    <link rel="alternate" type="text/html" href="http://blogs.jetbrains.com/yole/archives/000082.html" />
    <modified>2006-03-07T16:59:15Z</modified>
    <issued>2006-01-24T18:52:18+03:00</issued>
    <id>tag:blogs.jetbrains.com,2006:/yole//1.82</id>
    <created>2006-01-24T15:52:18Z</created>
    <summary type="text/plain"><![CDATA[I&rsquo;m happy to announce that Pythonid, the Python language plugin for IntelliJ IDEA, is now available as an incubator project at java.net. There are no public releases yet, but the entire source code is available in CVS and licensed under...]]></summary>
    <author>
      <name>Dmitry Jemerov</name>
      <url>http://www.yole.ru</url>
      <email>yole@jetbrains.com</email>
    </author>
    
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://blogs.jetbrains.com/yole/">
      <![CDATA[<p>I&rsquo;m happy to announce that Pythonid, the Python language plugin for IntelliJ IDEA, is now available as an <a href="https://pythonid.dev.java.net/">incubator project</a> at java.net. There are no public releases yet, but the entire source code is available in CVS and licensed under the Apache 2 license.</p>
<p>I started working on Pythonid as a spare time project before I joined the IDEA team, while I was still working on Omea. After I started working on IDEA, I no longer had much spare time &ndash; and, frankly speaking, had enough IDEA-related coding in the daytime. Because of that, the development of the plugin pretty much stalled. However, I did send the plugin sources to several developers who expressed interest in the plugin newsgroup, and one of them &ndash; Keith Lea &ndash;&nbsp;was sufficiently interested to pick up the project and adapt it for use in the company where he&rsquo;s working. Keith was also the one who arranged the release of the plugin at java.net.</p>
<p>The main problem currently preventing the release of the plugin is lack of a formatter. Otherwise, the plugin has roughly achieved feature parity with the JavaScript plugin as of IntelliJ IDEA 5.0. The formatter implementation has been problematic because of the issues with the formatter core &ndash; the Python indentation and whitespace handling is quite different from that of Java, so the core sometimes needs to be extended in order to support Python well.</p>
<p>I expect to make&nbsp;a &ldquo;real&rdquo; release of the plugin (and upload it to the Plugin Manager) as soon as either the formatter reaches somewhat working state, or it becomes clear that it will not be possible to achieve a sufficiently working formatter with IntelliJ IDEA 5.1. In the latter case, the plugin will be released with the formatter disabled.</p>
<p>There is still lots and lots of work to do on the plugin, so if you&rsquo;re interested in contributing, feel free to contact me.</p>
<p><strong>Update:</strong> Chris Miller&nbsp;has kindly provided <a href="http://intellij.net/forums/thread.jsp?forum=23&amp;thread=159946&amp;tstart=0&amp;trange=15#5025621">instructions</a> for checking out and building the plugin.</p>]]>
      
    </content>
  </entry>

</feed>