001 /* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2011 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * Sonar is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020 package org.sonar.plugins.design.ui.page.client; 021 022 import com.google.gwt.event.dom.client.ClickEvent; 023 import com.google.gwt.event.dom.client.ClickHandler; 024 import com.google.gwt.i18n.client.Dictionary; 025 import com.google.gwt.user.client.Window; 026 import com.google.gwt.user.client.ui.*; 027 import org.sonar.gwt.Configuration; 028 import org.sonar.gwt.Links; 029 import org.sonar.gwt.ui.Icons; 030 import org.sonar.gwt.ui.Loading; 031 import org.sonar.wsclient.gwt.AbstractCallback; 032 import org.sonar.wsclient.gwt.AbstractListCallback; 033 import org.sonar.wsclient.gwt.Sonar; 034 import org.sonar.wsclient.services.Dependency; 035 import org.sonar.wsclient.services.DependencyQuery; 036 import org.sonar.wsclient.services.Resource; 037 038 import java.util.List; 039 040 public final class DependencyInfo extends Composite { 041 042 private static DependencyInfo INSTANCE = new DependencyInfo(); 043 044 private VerticalPanel panel; 045 private Loading loading = new Loading(); 046 private String currentDependencyId = null; 047 private boolean popupMode = false; 048 049 private DependencyInfo() { 050 panel = new VerticalPanel(); 051 initWidget(panel); 052 } 053 054 public static DependencyInfo getInstance() { 055 return INSTANCE; 056 } 057 058 059 public void showOrPopup(String dependencyId) { 060 if (popupMode) { 061 Window.open(Links.urlForResourcePage(Configuration.getResourceId(), DesignPage.GWT_ID, "layout=false&depId=" + dependencyId), 062 "dependency", Links.DEFAULT_POPUP_HTML_FEATURES); 063 064 } else { 065 INSTANCE.show(dependencyId); 066 } 067 } 068 069 public void show(String dependencyId) { 070 panel.clear(); 071 currentDependencyId = dependencyId; 072 if (dependencyId != null) { 073 panel.add(loading); 074 loadDependency(dependencyId); 075 } 076 } 077 078 public DependencyInfo setPopupMode(boolean b) { 079 this.popupMode = b; 080 return this; 081 } 082 083 public void popup() { 084 popupMode = true; 085 panel.clear(); 086 showOrPopup(currentDependencyId); 087 } 088 089 private void setLoaded() { 090 loading.removeFromParent(); 091 } 092 093 private void loadDependency(String dependencyId) { 094 DependencyQuery query = DependencyQuery.createForId(dependencyId); 095 Sonar.getInstance().find(query, new AbstractCallback<Dependency>() { 096 @Override 097 protected void doOnResponse(Dependency dependency) { 098 if (dependency == null) { 099 setLoaded(); 100 panel.add(new Label(Dictionary.getDictionary("l10n").get("noData"))); 101 } else { 102 loadSubDependencies(dependency); 103 } 104 } 105 106 @Override 107 protected void doOnError(int errorCode, String errorMessage) { 108 super.doOnError(errorCode, errorMessage); 109 } 110 }); 111 } 112 113 private void loadSubDependencies(final Dependency dependency) { 114 DependencyQuery query = DependencyQuery.createForSubDependencies(dependency.getId()); 115 Sonar.getInstance().findAll(query, new AbstractListCallback<Dependency>() { 116 117 @Override 118 protected void doOnResponse(final List<Dependency> subDependencies) { 119 Grid table = new Grid(subDependencies.size() + 1, 5); 120 table.setStyleName("depInfo"); 121 createHeader(dependency, table); 122 123 for (int row = 0; row < subDependencies.size(); row++) { 124 Dependency dep = subDependencies.get(row); 125 table.setWidget(row + 1, 0, new HTML(Icons.forQualifier(dep.getFromQualifier()).getHTML())); 126 if (Resource.QUALIFIER_FILE.equals(dep.getFromQualifier()) || Resource.QUALIFIER_CLASS.equals(dep.getFromQualifier())) { 127 table.setWidget(row + 1, 1, createLink(dep.getFromId(), dep.getFromName())); 128 } else { 129 table.setText(row + 1, 1, dep.getFromName()); 130 } 131 table.setText(row + 1, 2, " " + dep.getUsage() + " "); 132 table.setWidget(row + 1, 3, new HTML(Icons.forQualifier(dep.getToQualifier()).getHTML())); 133 if (Resource.QUALIFIER_FILE.equals(dep.getToQualifier()) || Resource.QUALIFIER_CLASS.equals(dep.getToQualifier())) { 134 table.setWidget(row + 1, 4, createLink(dep.getToId(), dep.getToName())); 135 } else { 136 table.setText(row + 1, 4, dep.getToName()); 137 } 138 } 139 140 141 panel.clear(); 142 if (!popupMode) { 143 panel.add(createNewWindowLink()); 144 } 145 panel.add(table); 146 } 147 }); 148 } 149 150 private Label createLink(final long resourceId, final String resourceName) { 151 Label link = new Label(resourceName); 152 link.setStyleName("link"); 153 link.addClickHandler(new ClickHandler() { 154 155 public void onClick(ClickEvent event) { 156 Links.openResourcePopup(String.valueOf(resourceId)); 157 } 158 }); 159 return link; 160 } 161 162 private void createHeader(final Dependency dependency, final Grid grid) { 163 grid.getRowFormatter().setStyleName(0, "depInfoHeader"); 164 165 grid.setWidget(0, 0, Icons.forQualifier(dependency.getFromQualifier()).createImage()); 166 grid.setText(0, 1, dependency.getFromName()); 167 168 grid.setWidget(0, 3, Icons.forQualifier(dependency.getToQualifier()).createImage()); 169 grid.setText(0, 4, dependency.getToName()); 170 } 171 172 private Widget createNewWindowLink() { 173 Label popup = new Label(Dictionary.getDictionary("l10n").get("newWindow")); 174 popup.setStyleName("newwindow"); 175 popup.addClickHandler(new ClickHandler() { 176 public void onClick(ClickEvent event) { 177 popup(); 178 } 179 }); 180 return popup; 181 } 182 }