James Moger
2014-05-05 8f0f665b9ee4e2cd21e9e0d5d7cfc69b1d19b86f
src/main/java/com/gitblit/wicket/pages/RootPage.java
@@ -41,24 +41,35 @@
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.WebResponse;
import com.gitblit.Constants;
import com.gitblit.Keys;
import com.gitblit.extensions.NavLinkExtension;
import com.gitblit.extensions.UserMenuExtension;
import com.gitblit.models.Menu.ExternalLinkMenuItem;
import com.gitblit.models.Menu.MenuDivider;
import com.gitblit.models.Menu.MenuItem;
import com.gitblit.models.Menu.PageLinkMenuItem;
import com.gitblit.models.Menu.ParameterMenuItem;
import com.gitblit.models.Menu.ToggleMenuItem;
import com.gitblit.models.NavLink;
import com.gitblit.models.NavLink.PageNavLink;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ModelUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.PageRegistration;
import com.gitblit.wicket.PageRegistration.DropDownMenuItem;
import com.gitblit.wicket.PageRegistration.DropDownToggleItem;
import com.gitblit.wicket.SessionlessForm;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.GravatarImage;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.NavigationPanel;
/**
@@ -164,36 +175,38 @@
         add(new Label("userPanel").setVisible(false));
      }
      boolean showRegistrations = app().federation().canFederate()
            && app().settings().getBoolean(Keys.web.showFederationRegistrations, false);
      // navigation links
      List<PageRegistration> pages = new ArrayList<PageRegistration>();
      List<NavLink> navLinks = new ArrayList<NavLink>();
      if (!authenticateView || (authenticateView && isLoggedIn)) {
         pages.add(new PageRegistration(isLoggedIn ? "gb.myDashboard" : "gb.dashboard", MyDashboardPage.class,
         navLinks.add(new PageNavLink(isLoggedIn ? "gb.myDashboard" : "gb.dashboard", MyDashboardPage.class,
               getRootPageParameters()));
         if (isLoggedIn && app().tickets().isReady()) {
            pages.add(new PageRegistration("gb.myTickets", MyTicketsPage.class));
            navLinks.add(new PageNavLink("gb.myTickets", MyTicketsPage.class));
         }
         pages.add(new PageRegistration("gb.repositories", RepositoriesPage.class,
         navLinks.add(new PageNavLink("gb.repositories", RepositoriesPage.class,
               getRootPageParameters()));
         pages.add(new PageRegistration("gb.activity", ActivityPage.class, getRootPageParameters()));
         navLinks.add(new PageNavLink("gb.activity", ActivityPage.class, getRootPageParameters()));
         if (allowLucene) {
            pages.add(new PageRegistration("gb.search", LuceneSearchPage.class));
         }
         if (showAdmin) {
            pages.add(new PageRegistration("gb.users", UsersPage.class));
         }
         if (showAdmin || showRegistrations) {
            pages.add(new PageRegistration("gb.federation", FederationPage.class));
            navLinks.add(new PageNavLink("gb.search", LuceneSearchPage.class));
         }
         if (!authenticateView || (authenticateView && isLoggedIn)) {
            addDropDownMenus(pages);
            addDropDownMenus(navLinks);
         }
         UserModel user = UserModel.ANONYMOUS;
         if (isLoggedIn) {
            user = GitBlitWebSession.get().getUser();
         }
         // add nav link extensions
         List<NavLinkExtension> extensions = app().plugins().getExtensions(NavLinkExtension.class);
         for (NavLinkExtension ext : extensions) {
            navLinks.addAll(ext.getNavLinks(user));
         }
      }
      NavigationPanel navPanel = new NavigationPanel("navPanel", getRootNavPageClass(), pages);
      NavigationPanel navPanel = new NavigationPanel("navPanel", getRootNavPageClass(), navLinks);
      add(navPanel);
      // display an error message cached from a redirect
@@ -285,13 +298,13 @@
      return repositoryModels;
   }
   protected void addDropDownMenus(List<PageRegistration> pages) {
   protected void addDropDownMenus(List<NavLink> navLinks) {
   }
   protected List<DropDownMenuItem> getRepositoryFilterItems(PageParameters params) {
   protected List<com.gitblit.models.Menu.MenuItem> getRepositoryFilterItems(PageParameters params) {
      final UserModel user = GitBlitWebSession.get().getUser();
      Set<DropDownMenuItem> filters = new LinkedHashSet<DropDownMenuItem>();
      Set<MenuItem> filters = new LinkedHashSet<MenuItem>();
      List<RepositoryModel> repositories = getRepositoryModels();
      // accessible repositories by federation set
@@ -310,11 +323,11 @@
         List<String> sets = new ArrayList<String>(setMap.keySet());
         Collections.sort(sets);
         for (String set : sets) {
            filters.add(new DropDownToggleItem(MessageFormat.format("{0} ({1})", set,
            filters.add(new ToggleMenuItem(MessageFormat.format("{0} ({1})", set,
                  setMap.get(set).get()), "set", set, params));
         }
         // divider
         filters.add(new DropDownMenuItem());
         filters.add(new MenuDivider());
      }
      // user's team memberships
@@ -322,11 +335,11 @@
         List<TeamModel> teams = new ArrayList<TeamModel>(user.teams);
         Collections.sort(teams);
         for (TeamModel team : teams) {
            filters.add(new DropDownToggleItem(MessageFormat.format("{0} ({1})", team.name,
            filters.add(new ToggleMenuItem(MessageFormat.format("{0} ({1})", team.name,
                  team.repositories.size()), "team", team.name, params));
         }
         // divider
         filters.add(new DropDownMenuItem());
         filters.add(new MenuDivider());
      }
      // custom filters
@@ -337,18 +350,18 @@
         for (String expression : expressions) {
            if (!StringUtils.isEmpty(expression)) {
               addedExpression = true;
               filters.add(new DropDownToggleItem(null, "x", expression, params));
               filters.add(new ToggleMenuItem(null, "x", expression, params));
            }
         }
         // if we added any custom expressions, add a divider
         if (addedExpression) {
            filters.add(new DropDownMenuItem());
            filters.add(new MenuDivider());
         }
      }
      return new ArrayList<DropDownMenuItem>(filters);
      return new ArrayList<MenuItem>(filters);
   }
   protected List<DropDownMenuItem> getTimeFilterItems(PageParameters params) {
   protected List<MenuItem> getTimeFilterItems(PageParameters params) {
      // days back choices - additive parameters
      int daysBack = app().settings().getInteger(Keys.web.activityDuration, 7);
      int maxDaysBack = app().settings().getInteger(Keys.web.activityDurationMaximum, 30);
@@ -369,7 +382,7 @@
         clonedParams.put("db",  daysBack);
      }
      List<DropDownMenuItem> items = new ArrayList<DropDownMenuItem>();
      List<MenuItem> items = new ArrayList<MenuItem>();
      Set<Integer> choicesSet = new TreeSet<Integer>(app().settings().getIntegers(Keys.web.activityDurationChoices));
      if (choicesSet.isEmpty()) {
          choicesSet.addAll(Arrays.asList(1, 3, 7, 14, 21, 28));
@@ -379,13 +392,13 @@
      String lastDaysPattern = getString("gb.lastNDays");
      for (Integer db : choices) {
         if (db == 1) {
            items.add(new DropDownMenuItem(getString("gb.time.today"), "db", db.toString(), clonedParams));
            items.add(new ParameterMenuItem(getString("gb.time.today"), "db", db.toString(), clonedParams));
         } else {
            String txt = MessageFormat.format(lastDaysPattern, db);
            items.add(new DropDownMenuItem(txt, "db", db.toString(), clonedParams));
            items.add(new ParameterMenuItem(txt, "db", db.toString(), clonedParams));
         }
      }
      items.add(new DropDownMenuItem());
      items.add(new MenuDivider());
      return items;
   }
@@ -574,6 +587,11 @@
      public UserMenu(String id, String markupId, MarkupContainer markupProvider) {
         super(id, markupId, markupProvider);
         setRenderBodyOnly(true);
      }
      @Override
      protected void onInitialize() {
         super.onInitialize();
         GitBlitWebSession session = GitBlitWebSession.get();
         UserModel user = session.getUser();
@@ -586,19 +604,105 @@
            add(new Label("username", user.getDisplayName()));
         }
         add(new Label("displayName", user.getDisplayName()));
         List<MenuItem> standardItems = new ArrayList<MenuItem>();
         standardItems.add(new MenuDivider());
         if (user.canAdmin() || user.canCreate()) {
            standardItems.add(new PageLinkMenuItem("gb.newRepository", EditRepositoryPage.class));
         }
         standardItems.add(new PageLinkMenuItem("gb.myProfile", UserPage.class,
               WicketUtils.newUsernameParameter(user.username)));
         if (editCredentials) {
            standardItems.add(new PageLinkMenuItem("gb.changePassword", ChangePasswordPage.class));
         }
         standardItems.add(new MenuDivider());
         add(newSubmenu("standardMenu", user.getDisplayName(), standardItems));
         add(new BookmarkablePageLink<Void>("newRepository",
               EditRepositoryPage.class).setVisible(user.canAdmin() || user.canCreate()));
         if (showAdmin) {
            // admin menu
            List<MenuItem> adminItems = new ArrayList<MenuItem>();
            adminItems.add(new MenuDivider());
            adminItems.add(new PageLinkMenuItem("gb.users", UsersPage.class));
            adminItems.add(new PageLinkMenuItem("gb.teams", TeamsPage.class));
         add(new BookmarkablePageLink<Void>("myProfile",
               UserPage.class, WicketUtils.newUsernameParameter(user.username)));
            boolean showRegistrations = app().federation().canFederate()
                  && app().settings().getBoolean(Keys.web.showFederationRegistrations, false);
            if (showRegistrations) {
               adminItems.add(new PageLinkMenuItem("gb.federation", FederationPage.class));
            }
            adminItems.add(new MenuDivider());
         add(new BookmarkablePageLink<Void>("changePassword",
               ChangePasswordPage.class).setVisible(editCredentials));
            add(newSubmenu("adminMenu", getString("gb.administration"), adminItems));
         } else {
            add(new Label("adminMenu").setVisible(false));
         }
         // plugin extension items
         List<MenuItem> extensionItems = new ArrayList<MenuItem>();
         List<UserMenuExtension> extensions = app().plugins().getExtensions(UserMenuExtension.class);
         for (UserMenuExtension ext : extensions) {
            List<MenuItem> items = ext.getMenuItems(user);
            extensionItems.addAll(items);
         }
         if (extensionItems.isEmpty()) {
            // no extension items
            add(new Label("extensionsMenu").setVisible(false));
         } else {
            // found extension items
            extensionItems.add(0, new MenuDivider());
            add(newSubmenu("extensionsMenu", getString("gb.extensions"), extensionItems));
            extensionItems.add(new MenuDivider());
         }
         add(new BookmarkablePageLink<Void>("logout",
               LogoutPage.class).setVisible(standardLogin));
      }
      /**
       * Creates a submenu.  This is not actually submenu because we're using
       * an older Twitter Bootstrap which is pre-submenu.
       *
       * @param wicketId
       * @param submenuTitle
       * @param menuItems
       * @return a submenu fragment
       */
      private Fragment newSubmenu(String wicketId, String submenuTitle, List<MenuItem> menuItems) {
         Fragment submenu = new Fragment(wicketId, "submenuFragment", this);
         submenu.add(new Label("submenuTitle", submenuTitle).setRenderBodyOnly(true));
         ListDataProvider<MenuItem> menuItemsDp = new ListDataProvider<MenuItem>(menuItems);
         DataView<MenuItem> submenuItems = new DataView<MenuItem>("submenuItem", menuItemsDp) {
            private static final long serialVersionUID = 1L;
            @Override
            public void populateItem(final Item<MenuItem> menuItem) {
               final MenuItem item = menuItem.getModelObject();
               String name = item.toString();
               try {
                  // try to lookup translation
                  name = getString(name);
               } catch (Exception e) {
               }
               if (item instanceof PageLinkMenuItem) {
                  // link to another Wicket page
                  PageLinkMenuItem pageLink = (PageLinkMenuItem) item;
                  menuItem.add(new LinkPanel("submenuLink", null, null, name, pageLink.getPageClass(),
                        pageLink.getPageParameters(), false).setRenderBodyOnly(true));
               } else if (item instanceof ExternalLinkMenuItem) {
                  // link to a specified href
                  ExternalLinkMenuItem extLink = (ExternalLinkMenuItem) item;
                  menuItem.add(new LinkPanel("submenuLink", null, name, extLink.getHref(),
                        extLink.openInNewWindow()).setRenderBodyOnly(true));
               } else if (item instanceof MenuDivider) {
                  // divider
                  menuItem.add(new Label("submenuLink").setRenderBodyOnly(true));
                  WicketUtils.setCssClass(menuItem, "divider");
               }
            }
         };
         submenu.add(submenuItems);
         submenu.setRenderBodyOnly(true);
         return submenu;
      }
   }
}