/* Copyright 2014 InterCommIT b.v.
*
* This file is part of the "Weaves" project hosted on https://github.com/intercommit/Weaves
*
* Weaves 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
* any later version.
*
* Weaves 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 Weaves. If not, see <http://www.gnu.org/licenses/>.
*
*/
package nl.intercommit.weaves.components;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import nl.intercommit.weaves.menu.MenuItem;
import org.apache.tapestry5.Asset2;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.annotations.BeginRender;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Path;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SetupRender;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
/**
* @tapestrydoc
*/
public class DropDownMenu {
// linkedhashmaps to preserve ordering!
@Parameter(required=true,allowNull=false)
private LinkedHashMap<MenuItem,LinkedHashMap<MenuItem, List<MenuItem>>> menu;
@Inject
private JavaScriptSupport js;
@Inject @Path("dropdown/DropDownMenu.js")
private Asset2 dropDownJS;
@Inject @Path("dropdown/DropDownMenu-T5.css")
private Asset2 dropDownCSST5;
@Inject @Path("dropdown/DropDownMenu-BS.css")
private Asset2 dropDownCSSBS;
@Inject
private ComponentResources cr;
@Inject
@Symbol(nl.intercommit.weaves.SymbolConstants.BOOTSTRAP_ENABLED)
private boolean bootstrap;
@Property
private MenuItem level1;
@Property
private MenuItem level2;
@Property
private MenuItem level3;
private MenuItem selectedLevel;
@SetupRender
private void initJavaScript() {
if (!bootstrap) {
js.importJavaScriptLibrary(dropDownJS);
js.importStylesheet(dropDownCSST5);
js.addScript("initMenu();", "");
} else {
js.importStylesheet(dropDownCSSBS);
}
}
public List<MenuItem> getMenuBar() {
if (getHasLevel1()) {
return Arrays.asList((MenuItem[])menu.keySet().toArray(new MenuItem[0]));
} else {
return new ArrayList<MenuItem>();
}
}
public List<MenuItem> getMenuItems() {
if (getHasLevel2()) {
return Arrays.asList((MenuItem[])menu.get(level1).keySet().toArray(new MenuItem[0]));
} else {
return new ArrayList<MenuItem>();
}
}
public List<MenuItem> getSubMenus() {
if (getHasLevel3()) {
return Arrays.asList((MenuItem[])menu.get(level1).get(level2).toArray(new MenuItem[0]));
} else {
return new ArrayList<MenuItem>();
}
}
public boolean getHasLevel1() {
return menu.keySet() != null;
}
public boolean getHasLevel2() {
if (getHasLevel1()) {
return menu.get(level1) != null;
}
return false;
}
public boolean getHasLevel3() {
if (getHasLevel2()) {
return menu.get(level1).get(level2) != null ;
}
return false;
}
@BeginRender
public void determineSelectedLevel() {
if (menu.keySet().size() > 0) {
String reqPath = cr.getPage().getComponentResources().getPageName();
if (reqPath.endsWith("/Index")) {
// special case, default page reached (dont know where this is configured..) so it could break.
reqPath = reqPath.substring(0,reqPath.indexOf("/Index"));
}
selectedLevel = (MenuItem) menu.keySet().toArray()[0]; // select 1st menu
for (MenuItem rootLevel:menu.keySet()) {
List<MenuItem> allItems = new LinkedList<MenuItem>();
allItems.add(rootLevel); // me
if (menu.get(rootLevel) != null) {
allItems.addAll(menu.get(rootLevel).keySet()); // all level2's
for (MenuItem level3: menu.get(rootLevel).keySet()) {
final List<MenuItem> subs = menu.get(rootLevel).get(level3);
if (subs != null) {
allItems.addAll(subs);
}
}
}
for (MenuItem item: allItems) {
final String basePath = item.getUrl().getBasePath().substring(1);
if (basePath.length() > 0) {
if (basePath.contains(reqPath.toLowerCase())) {
selectedLevel = rootLevel;
break;
}
}
}
}
}
}
public String getSelectedclass() {
if (level1.equals(selectedLevel)) {
if (!bootstrap) {
return "toplevelselected";
} else {
return "active";
}
}
return "none";
}
public Block getMenuBlock() {
if (bootstrap) {
return cr.getBlock("bootstrap");
} else {
return cr.getBlock("classic");
}
}
}