[ANN] MetricsReloaded 0.2 released


Announcing the release of MetricsReloaded 0.2, available via the PluginManager.

Changes from 0.1
-


Total and average rows on tables with more than one entry.
Sort arrows on column headers.
Column ordering, sorting, and column widths now persistent to profiles.
Selected profile now persistent to project.
"Explain" action available on metrics display, opening a dialog containing the description of the selected metric.
IDEA progress panel is now used instead of stock Swing progress panel.
"Calculate metrics" action moved to new "Analyze" menu.
Many small UI improvements.
Many small bug fixes.
Source code included in distribution.

New Metrics
-


Num exceptions thrown (method)
Num exceptions caught (method)
Couplng between objects (class, interface)
Number of interfaces implemented (class)
% Classes javadoced (package, module, project)
% Fields javadoced (class, interface package, module, project)
% Methods javadoced (class,interface, package, module, project)
Total cyclomatic complexity (package, module, project)
Average cyclomatic complexity (package, module, project)
True comment ratio (all levels)
Source lines of code (all levels)
Number of expressions (method)
Number of commands (class, interface)
Number of queries (class, interface)
Number of typecast/instanceof expressions (method)
Extended cyclomatic complexity (method)
Essential cyclomatic complexity (method)

Notes:

Contrary to expectations, 0.2 is even more dependent on Pallada than 0.1 is, due to the progress panel and analyze menu changes. Given that, and the speed with which Pallada seems to be nearing completion, I have scrapped any plans for an Aurora release of MetricsReloaded. I've included the source in the distribution for any optimists who want to take a crack at it.

Metrics profiles and snapshots created under 0.1 will not work with 0.2 or later releases. I've gone to a JDOM based persistence layer, instead of stock Java serialization for consistency with the rest of IDEA, so there should be no breaks in the future, but the 0.1 data is no longer readable. You were warned.

25 comments
Comment actions Permalink

Hi Dave,

Don't know why, but in my Calculate metrics dialog all checkboxes in the
left tree are grayed. Is this a bug or by-design?

Tom

0
Comment actions Permalink

I need to correct me, only the project checkboxes are grayed, not the
package checkboxes.

Tom

0
Comment actions Permalink

The only reason the plugin should grey out checkboxes is if they are inappropriate to the context. For instance, if you run metrics on an individual file, the project, module and package metrics are greyed out. The class, interface and method metrics should never be greyed out. If this is not the case, it's very much a bug.

--Dave Griffith

0
Comment actions Permalink

Ah, I see. Why not hide the inappropriate metrics at all? Grayed but
selectable items look very strange to users.

Tom

0
Comment actions Permalink

You must have selected "Calculate metrics" on a directory in the Project or Package view. To get full project metrics, you need to select "Analyze/Calculate metrics" from the main menu.

--Dave Griffith

0
Comment actions Permalink

Great stuff, exploring the possibilities this plugin is going to cost me
days!
Is there a way to pin a result tab?

Bas

Also I got this exception clicking to the right of the column headers in
the result:
java.lang.IllegalArgumentException: Column index out of range
at javax.swing.JTable.boundColumn(JTable.java:1274)
at javax.swing.JTable.setColumnSelectionInterval(JTable.java:1304)
at
com.siyeh.metrics.ui.table.MetricTableHeaderMouseListener.mouseClicked(MetricTableHeaderMouseListener.java:36)
at
java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:212)
at java.awt.Component.processMouseEvent(Component.java:5103)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:3207)
at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at com.intellij.ide.r.b(r.java:43)
at com.intellij.ide.r.a(r.java:86)
at com.intellij.ide.r.dispatchEvent(r.java:99)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)


And here an exception clicking on the double green arrow button (reload)

java.lang.ArrayIndexOutOfBoundsException: -1
at
com.siyeh.metrics.ui.table.MetricTableModel.getMetricForColumn(Metric
TableModel.java:371)
at
com.siyeh.metrics.ui.MetricsDisplay.setRenderers(MetricsDisplay.java:
274)
at
com.siyeh.metrics.ui.MetricsDisplay.reloadTable(MetricsDisplay.java:1
62)
at
com.siyeh.metrics.ui.MetricsDisplay.reloadMetricsResults(MetricsDispl
ay.java:76)
at
com.siyeh.metrics.MetricsPluginImpl.reloadToolWindow(MetricsPluginImp
l.java:122)
at
com.siyeh.metrics.ReloadAction.actionPerformed(ReloadAction.java:32)
at com.intellij.openapi.f.a.j.a(j.java:69)
at com.intellij.openapi.f.a.j.processMouseEvent(j.java:115)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483
)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at com.intellij.ide.r.b(r.java:43)
at com.intellij.ide.r.a(r.java:86)
at com.intellij.ide.r.dispatchEvent(r.java:99)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

0
Comment actions Permalink

I got this when starting the calculation before showing the results. The results does not contain the module-metrics.

0
Comment actions Permalink

Ran into this exception when trying to calculate metrics on a class:

java.lang.NullPointerException

at com.siyeh.metrics.utils.LineUtil.containsLineBreak(LineUtil.java:106)

at com.siyeh.metrics.utils.LineUtil.countCommentOnlyLines(LineUtil.java:73)

at
com.siyeh.metrics.classMetrics.SourceLinesOfCodeClassMetric$Listener.beforeComment(SourceLinesOfCodeClassMetric.java:90)

at com.siyeh.metrics.Traversal.visitComment(Traversal.java:49)

at
com.intellij.psi.JavaElementVisitor.visitDocComment(JavaElementVisitor.java:82)

at com.siyeh.metrics.Traversal.visitDocComment(Traversal.java:60)

at com.intellij.psi.impl.source.d.c.accept(c.java:48)

at com.intellij.psi.impl.source.l.acceptChildren(l.java:20)

at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:7)

at
com.intellij.psi.JavaElementVisitor.visitClass(JavaElementVisitor.java:50)

at com.siyeh.metrics.Traversal.visitClass(Traversal.java:272)

at com.intellij.psi.impl.source.n.accept(n.java:37)

at com.intellij.psi.impl.source.l.acceptChildren(l.java:20)

at
com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:7)

at
com.intellij.psi.JavaElementVisitor.visitFile(JavaElementVisitor.java:126)

at
com.intellij.psi.JavaElementVisitor.visitJavaFile(JavaElementVisitor.java:312)

at com.siyeh.metrics.Traversal.visitJavaFile(Traversal.java:184)

at com.intellij.psi.impl.source.x.accept(x.java:89)

at com.siyeh.metrics.MetricsManagerImpl$1.run(MetricsManagerImpl.java:84)

at com.intellij.openapi.progress.a.a.runProcess(a.java:55)

at com.intellij.openapi.l.a.c$1a_.run(c$1a_.java:3)

0
Comment actions Permalink

java.lang.NullPointerException
at com.siyeh.metrics.utils.LineUtil.containsLineBreak(LineUtil.java:106)
at com.siyeh.metrics.utils.LineUtil.countCommentOnlyLines(LineUtil.java:73)
at
com.siyeh.metrics.moduleMetrics.SourceLinesOfCodeModuleMetric$Listener.beforeComment(SourceLinesOfCodeModuleMetric.java:86)
at com.siyeh.metrics.Traversal.visitComment(Traversal.java:49)
at com.intellij.psi.JavaElementVisitor.visitDocComment(JavaElementVisitor.java:82)
at com.siyeh.metrics.Traversal.visitDocComment(Traversal.java:60)
at com.intellij.psi.impl.source.javadoc.PsiDocCommentImpl.accept(PsiDocCommentImpl.java:253)
at com.intellij.psi.impl.source.TreeWrapperPsiElement.acceptChildren(TreeWrapperPsiElement.java:69)
at com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:7)
at com.intellij.psi.JavaElementVisitor.visitClass(JavaElementVisitor.java:50)
at com.siyeh.metrics.Traversal.visitClass(Traversal.java:272)
at com.intellij.psi.impl.source.PsiClassImpl.accept(PsiClassImpl.java:563)
at com.intellij.psi.impl.source.TreeWrapperPsiElement.acceptChildren(TreeWrapperPsiElement.java:69)
at com.intellij.psi.PsiRecursiveElementVisitor.visitElement(PsiRecursiveElementVisitor.java:7)
at com.intellij.psi.JavaElementVisitor.visitFile(JavaElementVisitor.java:126)
at com.intellij.psi.JavaElementVisitor.visitJavaFile(JavaElementVisitor.java:312)
at com.siyeh.metrics.Traversal.visitJavaFile(Traversal.java:184)
at com.intellij.psi.impl.source.PsiJavaFileBaseImpl.accept(PsiJavaFileBaseImpl.java:408)
at com.siyeh.metrics.MetricsManagerImpl$1.run(MetricsManagerImpl.java:84)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:134)
at com.intellij.openapi.application.impl.ApplicationImpl$1MyThread.run(ApplicationImpl.java:407)

0
Comment actions Permalink


I just uploaded 0.2.1, which should fix the problem. Let me know if there is still an issue.

--Dave Griffith

0
Comment actions Permalink


What would pinning a result tab do? There's no way to close tabs, indeed which tabs are open depends entirely on what metrics you selected (if you didn't select any method metrics, the method metrics tab won't be shown) and what files you are calculating metrics for (if you don't have any interfaces, the interface metrics tab won't be shown). I'm not sure what you're trying to suggest.

0.2.1 fixes the exception you posted.

--Dave

0
Comment actions Permalink

0.2.1 should fix this. I've just uploaded it to the plugin manager.

--Dave Griffith

0
Comment actions Permalink

0.2.1 should fix this. I've just uploaded it to the plugin manager.

--Dave Griffith

0
Comment actions Permalink

Yes, it did fix it. Thanks, Jon

Dave Griffith wrote:

0.2.1 should fix this. I've just uploaded it to the plugin manager.

--Dave Griffith

0
Comment actions Permalink

There is no way to turn on metrics by pressing Space.
I must use mouse which is inconvenient, when turning
on many metrics.


0
Comment actions Permalink


This issue is on the list, but don't count on a fix anytime soon. My poor Swing skills barely allowed for having checkboxes in trees at all. Getting them working as smoothly as the rest of the trees in IDEA is gonna take some serious learning on my part.

--Dave Griffith

0
Comment actions Permalink

This issue is on the list, but don't count on a fix anytime soon. My poor

Swing skills barely allowed for having checkboxes in trees at all. Getting
them working as smoothly as the rest of the trees in IDEA is gonna take some
serious learning on my part.
>

Oh, Dave, come on.
We count on you :)
I bet there many expert Swing programmers that
would love to help you with Swing issues (not me,
I am pure server-side guy).


0
Comment actions Permalink


This issue is on the list, but don't count on a fix
anytime soon. My poor Swing skills barely allowed
for having checkboxes in trees at all. Getting them
working as smoothly as the rest of the trees in IDEA
is gonna take some serious learning on my part.

--Dave Griffith


Funny to hear this from someone who wrote some of the best plugins for IDEA :)

I am just wondering what cool plugin interfaces you will come up with when you'll become a Swing guru :)

0
Comment actions Permalink

On 28-04-2004 19:06, Dave Griffith wrote:

What would pinning a result tab do? There's no way to close tabs,

indeed which tabs are open depends entirely on what metrics you selected
(if you didn't select any method metrics, the method metrics tab won't
be shown) and what files you are calculating metrics for (if you don't
have any interfaces, the interface metrics tab won't be shown). I'm not
sure what you're trying to suggest.

I'm sorry I wasn't clear. What I would like is to be able to keep the
metric results when I let MetricsReloaded calculate some new metrics.
After the new calculation is finished I want to be able to view both the
new and old results.
Maybe make it more like the Run tool window. Each new calculation opens
in a new tab. If you calculate exactly the same metrics as a previous
one, the result are replaced, except if I pin the tab.


0.2.1 fixes the exception you posted.


Yes it does, thanks.
However, I have found two more:
java.lang.ArrayIndexOutOfBoundsException: -1
at
com.siyeh.metrics.ui.table.MetricTableModel.getMetricForColumn(MetricTableModel.java:371)
at
com.siyeh.metrics.ui.MetricsDisplay.setRenderers(MetricsDisplay.java:274)
at
com.siyeh.metrics.ui.MetricsDisplay.reloadTable(MetricsDisplay.java:162)
at
com.siyeh.metrics.ui.MetricsDisplay.reloadMetricsResults(MetricsDispl
ay.java:76)
at
com.siyeh.metrics.MetricsPluginImpl.reloadToolWindow(MetricsPluginImp
l.java:122)
at
com.siyeh.metrics.ReloadAction.actionPerformed(ReloadAction.java:32)
at com.intellij.openapi.f.a.j.a(j.java:69)
at com.intellij.openapi.f.a.j.processMouseEvent(j.java:115)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at com.intellij.ide.r.b(r.java:43)
at com.intellij.ide.r.a(r.java:86)
at com.intellij.ide.r.dispatchEvent(r.java:99)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

java.lang.ArrayIndexOutOfBoundsException: 7
at
com.siyeh.metrics.ui.table.MetricTableModel.sort(MetricTableModel.jav
a:307)
at
com.siyeh.metrics.ui.table.MetricTableModel.]]>(MetricTableModel.j
ava:110)
at
com.siyeh.metrics.ui.MetricsDisplay.loadTable(MetricsDisplay.java:126
)
at
com.siyeh.metrics.ui.MetricsDisplay.setMetricsResults(MetricsDisplay.
java:64)
at
com.siyeh.metrics.MetricsPluginImpl.showToolWindow(MetricsPluginImpl.
java:112)
at
com.siyeh.metrics.ui.MetricsConfigurationPanel$6.actionPerformed(Metr
icsConfigurationPanel.java:345)
at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:17
86)
at
javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Abstra
ctButton.java:1839)
at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
at
javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
at
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483
)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at com.intellij.ide.r.b(r.java:43)
at com.intellij.ide.r.a(r.java:86)
at com.intellij.ide.r.dispatchEvent(r.java:99)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:141)
at java.awt.Dialog$1.run(Dialog.java:540)
at java.awt.Dialog.show(Dialog.java:561)
at com.intellij.openapi.a.b.a$d_.show(a$d_.java:2)
at com.intellij.openapi.a.b.a.show(a.java:90)
at
com.intellij.openapi.ui.DialogWrapper.show(DialogWrapper.java:669)
at
com.siyeh.metrics.ui.MetricsConfigurationPanel.run(MetricsConfigurati
onPanel.java:215)
at
com.siyeh.metrics.MetricsPluginImpl.runReport(MetricsPluginImpl.java:
160)
at
com.siyeh.metrics.ProjectMetricsAction.runFromProjectView(ProjectMetr
icsAction.java:75)
at
com.siyeh.metrics.ProjectMetricsAction.actionPerformed(ProjectMetrics
Action.java:30)
at com.intellij.openapi.f.a.m$b_.actionPerformed(m$b_.java:3)
at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:17
86)
at com.intellij.openapi.f.a.m.fireActionPerformed(m.java:55)
at com.intellij.ui.a.a.h.doClick(h.java:29)
at com.intellij.ui.a.a.h.access$300(h.java:81)
at com.intellij.ui.a.a.h$a_.mouseReleased(h$a_.java:2)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483
)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at com.intellij.ide.r.b(r.java:43)
at com.intellij.ide.r.a(r.java:86)
at com.intellij.ide.r.dispatchEvent(r.java:99)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

0
Comment actions Permalink


Got it. I'll put multiple tabs on the list. It'll require lots of refactoring I've been putting off, and stretch my Swing skills even farther, so don't expect it for a release or two. Even with multiple tabs, I'm not sure pinning is the right way to go about it. How about a "rerun and show differences" button, which would keep the currently displayed results, rerun the metrics, and show a difference report between the two runs? If the only value to pinning is having two different runs on the same profile and file set taken at different times, I can't help but think that a difference report would be more valuable than flipping tabs.

--Dave Griffith

--Dave

0
Comment actions Permalink

On 29-04-2004 16:00, Dave Griffith wrote:

Got it. I'll put multiple tabs on the list.


Excellent! Thanks for considering it.

It'll require lots of
refactoring I've been putting off, and stretch my Swing skills even
farther, so don't expect it for a release or two. Even with multiple
tabs, I'm not sure pinning is the right way to go about it. How
about a "rerun and show differences" button, which would keep the
currently displayed results, rerun the metrics, and show a difference
report between the two runs? If the only value to pinning is having
two different runs on the same profile and file set taken at
different times, I can't help but think that a difference report
would be more valuable than flipping tabs.


That sound great. That's two feature requests then:
1. multiple tabs
2. rerun and show differences

Thanks much,
Bas

0
Comment actions Permalink

I'm currently experiencing this error when analyzing my code set:

0
Comment actions Permalink

I'm starting to play with the new Metrics.. Very nice!

More minor suggestions for you:
o the tooltip that I get when hovering over column names,
it would be nice to also have it when hovering over the
columns themselves (no need to go back to the top on a
long table)

o I like explain!

o How about "auto-explain": the explain dialog gets "docked"
into the result pane itself (say, on the far right) and everytime
you select a colum the docked-dialog auto-update itself. Or
maybe it could just track the hovering over the column and
update itself after n milliseconds. That way, I can be see the
explanation without ever having to click :)

o "Explain" should be renamed "Describe" to be consistent with
the metrics selection dialog which has a "description" area, not
an "explanation" area.

o Concerning metrics explanations (or descriptions :) ), I might risk
saying the same thing as what goes for javadocs: starting all of them
with "This metric reports..." seems superfluous. For example
"Total number of packages in the project" looks like a more
straightforward description than "This metric reports the total number
of packages in the project" without the added clutter.
(Now I can't remember, was it you that didn't like malformed sentences
or was it the other Dave?)

o "Analyze -> Calculate Metrics" shouldn't be enabled when no
project is opened (trying to use it will throw exceptions).


Great work.

Vince.


0
Comment actions Permalink

I keep getting these exceptions:

(MetricTableModel.java:110 ) at com.siyeh.metrics.ui.MetricsDisplay.loadTable(MetricsDisplay.java:126) at com.siyeh.metrics.ui.MetricsDisplay.setMetricsResults(MetricsDisplay.java:70 ) at com.siyeh.metrics.MetricsPluginImpl.showToolWindow(MetricsPluginImpl.java:11 2) at com.siyeh.metrics.ui.MetricsConfigurationPanel$6.actionPerformed(MetricsConf igurationPanel.java:345) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786) at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButto n.java:1839) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:4 20) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener .java:245) at java.awt.Component.processMouseEvent(Component.java:5100) at java.awt.Component.processEvent(Component.java:4897) at java.awt.Container.processEvent(Container.java:1569) at java.awt.Component.dispatchEventImpl(Component.java:3615) at java.awt.Container.dispatchEventImpl(Container.java:1627) at java.awt.Component.dispatchEvent(Component.java:3477) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128) at java.awt.Container.dispatchEventImpl(Container.java:1613) at java.awt.Window.dispatchEventImpl(Window.java:1606) at java.awt.Component.dispatchEvent(Component.java:3477) at java.awt.EventQueue.dispatchEvent(EventQueue.java:456) at com.intellij.ide.r.b(r.java:43) at com.intellij.ide.r.a(r.java:86) at com.intellij.ide.r.dispatchEvent(r.java:99) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.ja va:201) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java :151) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java :141) at java.awt.Dialog$1.run(Dialog.java:540) at java.awt.Dialog.show(Dialog.java:561) at com.intellij.openapi.a.b.a$d_.show(a$d_.java:2) at com.intellij.openapi.a.b.a.show(a.java:90) at com.intellij.openapi.ui.DialogWrapper.show(DialogWrapper.java:669) at com.siyeh.metrics.ui.MetricsConfigurationPanel.run(MetricsConfigurationPanel .java:215) at com.siyeh.metrics.MetricsPluginImpl.runReport(MetricsPluginImpl.java:160) at com.siyeh.metrics.ProjectMetricsAction.runFromMainMenu(ProjectMetricsAction. java:62) at com.siyeh.metrics.ProjectMetricsAction.actionPerformed(ProjectMetricsAction. java:22) at com.intellij.openapi.f.a.m$b_.actionPerformed(m$b_.java:3) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786) at com.intellij.openapi.f.a.m.fireActionPerformed(m.java:55) at com.intellij.ui.a.a.h.doClick(h.java:29) at com.intellij.ui.a.a.h.access$300(h.java:81) at com.intellij.ui.a.a.h$a_.mouseReleased(h$a_.java:2) at java.awt.Component.processMouseEvent(Component.java:5100) at java.awt.Component.processEvent(Component.java:4897) at java.awt.Container.processEvent(Container.java:1569) at java.awt.Component.dispatchEventImpl(Component.java:3615) at java.awt.Container.dispatchEventImpl(Container.java:1627) at java.awt.Component.dispatchEvent(Component.java:3477) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128) at java.awt.Container.dispatchEventImpl(Container.java:1613) at java.awt.Window.dispatchEventImpl(Window.java:1606) at java.awt.Component.dispatchEvent(Component.java:3477) at java.awt.EventQueue.dispatchEvent(EventQueue.java:456) at com.intellij.ide.r.b(r.java:43) at com.intellij.ide.r.a(r.java:86) at com.intellij.ide.r.dispatchEvent(r.java:99) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.ja va:201) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java :151) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137) at java.awt.EventDispatchThread.run(EventDispatchThread.java:100) ]]>

Vince.



0

Please sign in to leave a comment.