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), "dependency", Links.DEFAULT_POPUP_HTML_FEATURES);
062    
063        } else {
064          INSTANCE.show(dependencyId);
065        }
066      }
067    
068      public void show(String dependencyId) {
069        panel.clear();
070        currentDependencyId = dependencyId;
071        if (dependencyId !=null) {
072          panel.add(loading);
073          loadDependency(dependencyId);
074        }
075      }
076    
077      public DependencyInfo setPopupMode(boolean b) {
078        this.popupMode = b;
079        return this;
080      }
081    
082      public void popup() {
083        popupMode = true;
084        panel.clear();
085        showOrPopup(currentDependencyId);
086      }
087    
088      private void setLoaded() {
089        loading.removeFromParent();
090      }
091    
092      private void loadDependency(String dependencyId) {
093        DependencyQuery query = DependencyQuery.createForId(dependencyId);
094        Sonar.getInstance().find(query, new AbstractCallback<Dependency>() {
095          @Override
096          protected void doOnResponse(Dependency dependency) {
097            if (dependency == null) {
098              setLoaded();
099              panel.add(new Label(Dictionary.getDictionary("l10n").get("noData")));
100            } else {
101              loadSubDependencies(dependency);
102            }
103          }
104    
105          @Override
106          protected void doOnError(int errorCode, String errorMessage) {
107            super.doOnError(errorCode, errorMessage);
108          }
109        });
110      }
111    
112      private void loadSubDependencies(final Dependency dependency) {
113        DependencyQuery query = DependencyQuery.createForSubDependencies(dependency.getId());
114        Sonar.getInstance().findAll(query, new AbstractListCallback<Dependency>() {
115    
116          @Override
117          protected void doOnResponse(final List<Dependency> subDependencies) {
118            Grid table = new Grid(subDependencies.size() + 1, 5);
119            table.setStyleName("depInfo");
120            createHeader(dependency, table);
121    
122            for (int row = 0; row < subDependencies.size(); row++) {
123              Dependency dep = subDependencies.get(row);
124              table.setWidget(row + 1, 0, new HTML(Icons.forQualifier(dep.getFromQualifier()).getHTML()));
125              if (Resource.QUALIFIER_FILE.equals(dep.getFromQualifier()) || Resource.QUALIFIER_CLASS.equals(dep.getFromQualifier())) {
126                table.setWidget(row + 1, 1, createLink(dep.getFromId(), dep.getFromName()));
127              } else {
128                table.setText(row + 1, 1, dep.getFromName());
129              }
130              table.setText(row + 1, 2, "  " + dep.getUsage() + "  ");
131              table.setWidget(row + 1, 3, new HTML(Icons.forQualifier(dep.getToQualifier()).getHTML()));
132              if (Resource.QUALIFIER_FILE.equals(dep.getToQualifier()) || Resource.QUALIFIER_CLASS.equals(dep.getToQualifier())) {
133                table.setWidget(row + 1, 4, createLink(dep.getToId(), dep.getToName()));
134              } else {
135                table.setText(row + 1, 4, dep.getToName());
136              }
137            }
138    
139    
140            panel.clear();
141            if (!popupMode) {
142              panel.add(createNewWindowLink());
143            }
144            panel.add(table);
145          }
146        });
147      }
148    
149      private Label createLink(final long resourceId, final String resourceName) {
150        Label link = new Label(resourceName);
151        link.setStyleName("link");
152        link.addClickHandler(new ClickHandler() {
153    
154          public void onClick(ClickEvent event) {
155            Links.openResourcePopup(String.valueOf(resourceId));
156          }
157        });
158        return link;
159      }
160    
161      private void createHeader(final Dependency dependency, final Grid grid) {
162        grid.getRowFormatter().setStyleName(0, "depInfoHeader");
163    
164        grid.setWidget(0, 0, Icons.forQualifier(dependency.getFromQualifier()).createImage());
165        grid.setText(0, 1, dependency.getFromName());
166    
167        grid.setWidget(0, 3, Icons.forQualifier(dependency.getToQualifier()).createImage());
168        grid.setText(0, 4, dependency.getToName());
169      }
170    
171      private Widget createNewWindowLink() {
172        Label popup = new Label(Dictionary.getDictionary("l10n").get("newWindow"));
173        popup.setStyleName("newwindow");
174        popup.addClickHandler(new ClickHandler() {
175          public void onClick(ClickEvent event) {
176            popup();
177          }
178        });
179        return popup;
180      }
181    }