*/\r
package org.sonar.plugins.core.widgets;\r
\r
-import org.sonar.api.web.AbstractRubyTemplate;\r
-import org.sonar.api.web.Description;\r
-import org.sonar.api.web.RubyRailsWidget;\r
+import org.sonar.api.web.*;\r
\r
+@WidgetLayout(WidgetLayoutType.NONE)\r
@Description("Display current alerts on the project.")\r
public class AlertsWidget extends AbstractRubyTemplate implements RubyRailsWidget {\r
public String getId() {\r
*/\r
package org.sonar.plugins.core.widgets;\r
\r
-import org.sonar.api.web.AbstractRubyTemplate;\r
-import org.sonar.api.web.Description;\r
-import org.sonar.api.web.RubyRailsWidget;\r
+import org.sonar.api.web.*;\r
\r
+@WidgetLayout(WidgetLayoutType.NONE)\r
@Description("Displays general project information taken from the pom.xml")\r
public class DescriptionWidget extends AbstractRubyTemplate implements RubyRailsWidget {\r
public String getId() {\r
if file_complexity || function_complexity || class_complexity || paragraph_complexity
complexity=measure('complexity')
%>
-<div class="widget">
<div class="dashbox" >
<h3>Complexity</h3>
<% if function_complexity %>
<% end %>
<div class="clear"></div>
-</div>
<% end %>
files=measure('files')
statements=measure('statements')
%>
-<div class="widget">
<table width="100%">
<tr>
<td valign="top" width="48%" nowrap>
</td>
</tr>
</table>
-</div>
<% end %>
\ No newline at end of file
code_coverage_measure=measure(Metric::COVERAGE)
tests_measure=measure(Metric::TESTS)
if code_coverage_measure || tests_measure %>
-<div class="widget">
<div class="yui-g">
<div class="yui-u first">
<div class="dashbox">
<% end %>
</div>
</div>
-</div>
<% end %>
<% if measure(Metric::LINES) || measure(Metric::NCLOC) %>
-<div class="widget">
<table width="100%">
<tr>
<td valign="top" width="48%" nowrap>
</td>
</tr>
</table>
-</div>
<% end %>
\ No newline at end of file
}
%>
<% if is_admin?(@snapshot) || measures.size>0 %>
- <div class="widget">
<script type="text/javascript">
function selectReviewMetric(){
$$('.review_description_update').each(function(element) {
</div>
<% end %>
<div class="clear"></div>
- </div>
<% end %>
<%= h @project.description %><br/>
<% end %>
- <%= @project.name %>
-
Key : <%= @project.key %><br/>
<% if @project.language %>
Language : <%= @project.language %><br/>
<% if @project.project? %>
-<div class="widget" id="widget_events"><div id="events_portlet"></div></div>
+<div id="widget_events"><div id="events_portlet"></div></div>
<script>
<%= remote_function(:update => "events_portlet", :url => { :controller => :project, :action => :events, :id => @snapshot.id }, :method => 'get') %>
</script>
<% if measure(Metric::LINES) %>
-<div class="widget" id="widget_rules">
+<div id="widget_rules">
<table width="100%">
<tr>
<td valign="top">
rfc_distribution=measure('rfc_distribution')
suspect_lcom4_density=measure('suspect_lcom4_density')
%>
-<div class="widget">
<table width="100%">
<tbody>
<tr>
</tr>
</tbody>
</table>
-</div>
<% end %>
file_cycles=measure('file_cycles')
file_feedback_edges=measure('file_feedback_edges')
%>
-<div class="widget">
<table width="100%">
<tbody>
<tr>
</tr>
</tbody>
</table>
-</div>
<%
end
%>
\ No newline at end of file
package_tangle_index=measure('package_tangle_index')
if package_tangle_index
%>
-<div class="widget">
<table width="100%">
<tbody>
<tr>
</tr>
</tbody>
</table>
-</div>
<%
end
%>
\ No newline at end of file
public abstract class AbstractDashboardWidget extends AbstractRubyTemplate implements RubyRailsWidget {
public String getId() {
- return getClass().toString();
+ return getClass().getSimpleName();
}
public String getTitle() {
- return getClass().toString();
+ return getClass().getSimpleName();
}
}
--- /dev/null
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2009 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * Sonar is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.api.web;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.4
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface WidgetLayout {
+ WidgetLayoutType value();
+}
--- /dev/null
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2009 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * Sonar is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.api.web;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.4
+ */
+public enum WidgetLayoutType {
+ DEFAULT, NONE
+}
\ No newline at end of file
private String[] resourceLanguages = {};
private String[] defaultForMetrics = {};
private String description = "";
- private WidgetProperty[] properties = {};
- private String[] categories = {};
+ private WidgetProperty[] widgetProperties = {};
+ private String[] widgetCategories = {};
+ private WidgetLayoutType widgetLayout = WidgetLayoutType.DEFAULT;
private boolean isDefaultTab = false;
private boolean isWidget = false;
description = descriptionAnnotation.value();
}
- WidgetProperties widgetProperties = AnnotationUtils.getClassAnnotation(view, WidgetProperties.class);
- if (widgetProperties != null) {
- properties = widgetProperties.value();
+ WidgetProperties propAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetProperties.class);
+ if (propAnnotation != null) {
+ this.widgetProperties = propAnnotation.value();
}
- WidgetCategory widgetCategory = AnnotationUtils.getClassAnnotation(view, WidgetCategory.class);
- if (widgetCategory != null) {
- categories = widgetCategory.value();
+ WidgetCategory categAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetCategory.class);
+ if (categAnnotation != null) {
+ widgetCategories = categAnnotation.value();
+ }
+
+ WidgetLayout layoutAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetLayout.class);
+ if (layoutAnnotation != null) {
+ widgetLayout = layoutAnnotation.value();
}
isWidget = (view instanceof Widget);
return description;
}
- public WidgetProperty[] getProperties() {
- return properties;
+ public WidgetProperty[] getWidgetProperties() {
+ return widgetProperties;
}
- public String[] getCategories() {
- return categories;
+ public String[] getWidgetCategories() {
+ return widgetCategories;
}
public String[] getSections() {
return view instanceof GwtPage;
}
+ public WidgetLayoutType getWidgetLayout() {
+ return widgetLayout;
+ }
+
public boolean isEditable() {
- return !ArrayUtils.isEmpty(properties);
+ return !ArrayUtils.isEmpty(widgetProperties);
}
public boolean hasRequiredProperties() {
boolean requires = false;
- for (WidgetProperty property : properties) {
+ for (WidgetProperty property : widgetProperties) {
if (!property.optional() && StringUtils.isEmpty(property.defaultValue())) {
requires = true;
}
#TODO check owner of dashboard
definition=java_facade.getWidget(widget.widget_key)
errors_by_property_key={}
- definition.getProperties().each do |property_def|
+ definition.getWidgetProperties().each do |property_def|
value=params[property_def.key()] || property_def.defaultValue()
value='false' if value.empty? && property_def.type.name()==WidgetProperty::TYPE_BOOLEAN
def load_widget_definitions(filter_on_category=nil)
@widget_definitions=java_facade.getWidgets()
@widget_categories=[]
- @widget_definitions.each {|definition| @widget_categories<<definition.getCategories()}
+ @widget_definitions.each {|definition| @widget_categories<<definition.getWidgetCategories()}
@widget_categories=@widget_categories.flatten.uniq.sort
unless filter_on_category.blank?
- @widget_definitions=@widget_definitions.select{|definition| definition.getCategories().to_a.include?(filter_on_category)}
+ @widget_definitions=@widget_definitions.select{|definition| definition.getWidgetCategories().to_a.include?(filter_on_category)}
end
end
<% form_remote_tag :url => {:action => 'save_widget', :wid => widget.id, :id => params[:id]}, :method => :post do -%>
<table class="form">
<tbody>
- <% definition.getProperties().each do |property_def|
+ <% definition.getWidgetProperties().each do |property_def|
value=widget.property_value(property_def.key(), property_def.defaultValue())
%>
<tr>
<![endif]-->
<div class="transparent"></div>
<% if widget_body.include? '<' %>
- <%= widget_body %>
+ <%
+ default_layout=(definition.getWidgetLayout().name()=='DEFAULT')
+ if default_layout
+ %>
+ <div class="widget">
+ <% end %>
+ <%= widget_body -%>
+ <% if default_layout %><div class="clear"> </div></div><% end %>
<% else %>
<div class="widget"><p>No data</p></div>
<% end %>
if widget_body.include?('<')
%>
- <%= widget_body %>
+ <%
+ default_layout=(definition.getWidgetLayout().name()=='DEFAULT')
+ if default_layout
+ %>
+ <div class="widget">
+ <% end %>
+ <%= widget_body -%>
+ <% if default_layout %><div class="clear"> </div></div><% end %>
<%
end
%>
<%\r
- properties_available=widget_view.getProperties() && widget_view.getProperties().size() != 0\r
+ properties_available=widget_view.getWidgetProperties() && widget_view.getWidgetProperties().size() != 0\r
\r
if !properties_available || (widget && widget.state==Widget::STATE_ACTIVE)\r
begin\r
:before => "$(this).down('.widgetid').value=$(this).up('.block').identify().split('_').pop();hide_block_info($(this).up('.block'))" do -%>\r
<table class="form" align="center" style="border-collapse:separate;border-spacing:5px;">\r
<tbody>\r
- <% widget_view.getProperties().each do |property|\r
+ <% widget_view.getWidgetProperties().each do |property|\r
db_property_value=widget.widget_property_value(property.key()) if widget\r
entered_value=params[property.key()]\r
entered_value=property.defaultValue() if !entered_value || entered_value.empty?\r
/*CONFIGURATION*/
#dashboard #widget_defs {
- height: 130px;
+ height: 150px;
overflow-y: auto;
background-color: #FFF6BF;
border: 2px solid #FFD324;
margin: 3px;
white-space: normal;
vertical-align: top;
+ height: 80px;
}
#dashboard ul.widget_categs li {
padding-right: 5px;
public void widgetShouldBeEditable() {
ViewProxy proxy = new ViewProxy<Widget>(new EditableWidget());
assertThat(proxy.isEditable(), is(true));
- assertThat(proxy.getProperties().length, is(2));
+ assertThat(proxy.getWidgetProperties().length, is(2));
}
@Test