James Moger
2012-10-22 eba89539a29deba954035056437279088c3e047b
src/com/gitblit/wicket/panels/RefsPanel.java
@@ -17,10 +17,12 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
@@ -33,6 +35,7 @@
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.pages.CommitPage;
import com.gitblit.wicket.pages.LogPage;
import com.gitblit.wicket.pages.RepositoryPage;
import com.gitblit.wicket.pages.TagPage;
public class RefsPanel extends Panel {
@@ -49,47 +52,97 @@
      if (refs == null) {
         refs = new ArrayList<RefModel>();
      }
      Collections.sort(refs);
      // refNames.remove(Constants.HEAD);
      Collections.sort(refs, new Comparator<RefModel>() {
         @Override
         public int compare(RefModel o1, RefModel o2) {
            // sort remote heads last, otherwise sort by name
            // this is so we can insert a break on the refs panel
            // [head][branch][branch][tag][tag]
            // [remote][remote][remote]
            boolean remote1 = o1.displayName.startsWith(Constants.R_REMOTES);
            boolean remote2 = o2.displayName.startsWith(Constants.R_REMOTES);
            if (remote1 && remote2) {
               // both are remote heads, sort by name
               return o1.displayName.compareTo(o2.displayName);
            }
            if (remote1) {
               // o1 is remote, o2 comes first
               return 1;
            }
            if (remote2) {
               // remote is o2, o1 comes first
               return -1;
            }
            // standard sort
            return o1.displayName.compareTo(o2.displayName);
         }
      });
      // count remote and determine if we should insert a break
      int remoteCount = 0;
      for (RefModel ref : refs) {
         if (ref.displayName.startsWith(Constants.R_REMOTES)) {
            remoteCount++;
         }
      }
      final boolean shouldBreak = remoteCount < refs.size();
      ListDataProvider<RefModel> refsDp = new ListDataProvider<RefModel>(refs);
      DataView<RefModel> refsView = new DataView<RefModel>("ref", refsDp) {
         private static final long serialVersionUID = 1L;
         private boolean alreadyInsertedBreak = !shouldBreak;
         public void populateItem(final Item<RefModel> item) {
            RefModel entry = item.getModelObject();
            String name = entry.displayName;
            String objectid = entry.getReferencedObjectId().getName();
            Component c = null;
            boolean breakLine = false;
            Class<? extends RepositoryPage> linkClass = CommitPage.class;
            String cssClass = "";
            if (name.startsWith(Constants.R_HEADS)) {
               // local head
               c = new LinkPanel("refName", null, name.substring(Constants.R_HEADS.length()),
                     LogPage.class, WicketUtils.newObjectParameter(repositoryName, objectid));
               WicketUtils.setCssClass(c, "headRef");
               // local branch
               linkClass = LogPage.class;
               name = name.substring(Constants.R_HEADS.length());
               cssClass = "localBranch";
            } else if (name.equals(Constants.HEAD)) {
               // local head
               c = new LinkPanel("refName", null, name, LogPage.class,
                     WicketUtils.newObjectParameter(repositoryName, objectid));
               WicketUtils.setCssClass(c, "headRef");
               linkClass = LogPage.class;
               cssClass = "headRef";
            } else if (name.startsWith(Constants.R_REMOTES)) {
               // remote head
               c = new LinkPanel("refName", null,
                     name.substring(Constants.R_REMOTES.length()), LogPage.class,
                     WicketUtils.newObjectParameter(repositoryName, objectid));
               WicketUtils.setCssClass(c, "remoteRef");
               // remote branch
               linkClass = LogPage.class;
               name = name.substring(Constants.R_REMOTES.length());
               cssClass = "remoteBranch";
               if (!alreadyInsertedBreak) {
                  breakLine = true;
                  alreadyInsertedBreak = true;
               }
            } else if (name.startsWith(Constants.R_TAGS)) {
               // tag
               c = new LinkPanel("refName", null, name.substring(Constants.R_TAGS.length()),
                     TagPage.class, WicketUtils.newObjectParameter(repositoryName, objectid));
               WicketUtils.setCssClass(c, "tagRef");
            } else {
               // other
               c = new LinkPanel("refName", null, name, CommitPage.class,
                     WicketUtils.newObjectParameter(repositoryName, objectid));
               WicketUtils.setCssClass(c, "otherRef");
               if (entry.isAnnotatedTag()) {
                  linkClass = TagPage.class;
                  objectid = entry.getObjectId().getName();
               } else {
                  linkClass = CommitPage.class;
                  objectid = entry.getReferencedObjectId().getName();
               }
               name = name.substring(Constants.R_TAGS.length());
               cssClass = "tagRef";
            } else if (name.startsWith(Constants.R_NOTES)) {
               linkClass = CommitPage.class;
               cssClass = "otherRef";
            }
            Component c = new LinkPanel("refName", null, name, linkClass,
                  WicketUtils.newObjectParameter(repositoryName, objectid));
            WicketUtils.setCssClass(c, cssClass);
            WicketUtils.setHtmlTooltip(c, name);
            item.add(c);
            Label lb = new Label("lineBreak", "<br/>");
            lb.setVisible(breakLine);
            lb.setRenderBodyOnly(true);
            item.add(lb.setEscapeModelStrings(false));
            item.setRenderBodyOnly(true);
         }
      };
      add(refsView);