1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.devacfr.maven.skins.reflow.model;
17
18 import static java.util.Objects.requireNonNull;
19
20 import com.google.common.base.Strings;
21 import com.google.common.collect.Lists;
22 import java.util.ArrayList;
23 import java.util.Collections;
24 import java.util.List;
25 import javax.annotation.Nonnull;
26 import javax.annotation.Nullable;
27 import org.apache.commons.lang3.builder.ToStringBuilder;
28 import org.codehaus.plexus.util.xml.Xpp3Dom;
29 import org.devacfr.maven.skins.reflow.ISkinConfig;
30 import org.devacfr.maven.skins.reflow.SkinConfigTool;
31 import org.devacfr.maven.skins.reflow.Xpp3Utils;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public class NavSideMenu extends BsComponent {
64
65
66 private static final String COMPONENT = "navside-menu";
67
68
69 private static final String MENU_COMPONENT = "menu";
70
71
72 private String name;
73
74
75 private List<SideNavMenuItem> items;
76
77
78 private boolean selectFirstOnExpand = false;
79
80
81
82
83
84
85
86
87
88 @Nonnull
89 public static List<SideNavMenuItem> findAllSideNavMenuItems(@Nonnull final ISkinConfig config) {
90 requireNonNull(config);
91 final Xpp3Dom pagesNode = Xpp3Utils.getFirstChild(config.getGlobalProperties(), "pages", config.getNamespace());
92 if (pagesNode == null) {
93 return Collections.emptyList();
94 }
95 final Xpp3Dom[] pages = pagesNode.getChildren();
96 final List<SideNavMenuItem> includePages = new ArrayList<>();
97 for (final Xpp3Dom page : pages) {
98 final String type = page.getAttribute("type");
99 if ("doc".equals(type)) {
100
101
102 final String projectId = page.getAttribute("project");
103 if (!Strings.isNullOrEmpty(projectId) && !projectId.equals(config.getProjectId())) {
104 continue;
105 }
106 final Xpp3Dom menu = page.getChild(MENU_COMPONENT);
107 if (menu == null) {
108 continue;
109 }
110 final String pageName = page.getName();
111
112 addMenuItemRecursively(includePages, config, menu, pageName, true);
113 }
114 }
115 return includePages;
116 }
117
118
119
120
121
122
123
124 public NavSideMenu(@Nonnull final ISkinConfig config) {
125 super(config, "navside");
126 requireNonNull(config);
127 final Xpp3Dom pageNode = config.getPageProperties();
128 final Xpp3Dom menu = pageNode.getChild(MENU_COMPONENT);
129 final List<SideNavMenuItem> items = Lists.newArrayList();
130 if (menu != null) {
131 final String pageName = pageNode.getName();
132 addMenuItemRecursively(items, config, menu, pageName, false);
133
134 this.withName(menu.getAttribute("name"))
135 .withItems(items)
136 .withSelectFirstOnSelect(
137 config.getAttributeValue(MENU_COMPONENT, "selectFirstOnExpand", Boolean.class, true));
138 this.setTheme(config.getAttributeValue(COMPONENT, "theme", String.class, "light"));
139 this.setBackground(config.getAttributeValue(COMPONENT, "background", String.class, "light"));
140 this.setCssClass(config.getAttributeValue(COMPONENT, "cssClass", String.class, null));
141 }
142 this.addCssOptions("sidenav-enabled");
143 if (isSelectFirstOnExpand()) {
144 this.addCssOptions("sidenav-select-first-on-select");
145 }
146 }
147
148
149
150
151
152
153 @Nullable public String getName() {
154 return name;
155 }
156
157
158
159
160
161
162
163
164 protected NavSideMenu withName(final String name) {
165 this.name = name;
166 return this;
167 }
168
169
170
171
172
173
174 public boolean isHasItems() {
175 return items != null && !items.isEmpty();
176 }
177
178
179
180
181 @Nonnull
182 public List<SideNavMenuItem> getItems() {
183 return items;
184 }
185
186
187
188
189
190
191
192
193 protected NavSideMenu withItems(final List<SideNavMenuItem> items) {
194 this.items = items;
195 return this;
196 }
197
198
199
200
201
202
203
204
205 public boolean isSelectFirstOnExpand() {
206 return selectFirstOnExpand;
207 }
208
209
210
211
212
213
214
215
216
217 protected NavSideMenu withSelectFirstOnSelect(final boolean selectFirstOnExpand) {
218 this.selectFirstOnExpand = selectFirstOnExpand;
219 return this;
220 }
221
222
223
224
225 @Override
226 public String toString() {
227 return ToStringBuilder.reflectionToString(this);
228 }
229
230
231
232
233
234
235
236 private static void addMenuItemRecursively(@Nonnull final List<SideNavMenuItem> menuItems,
237 @Nonnull final ISkinConfig config,
238 @Nonnull final Xpp3Dom parentNode,
239 @Nonnull final String pageName,
240 final boolean flatten) {
241 for (final Xpp3Dom item : Xpp3Utils.getChildrenNodes(parentNode, "item")) {
242 final String href = item.getAttribute("href");
243 final SideNavMenuItem menuItem = new SideNavMenuItem().withName(item.getAttribute("name"))
244 .withParent(pageName)
245 .withHref(config.relativeLink(href))
246 .withSlugName(SkinConfigTool.slugFilename(href))
247 .withIcon(item.getAttribute("icon"));
248 menuItems.add(menuItem);
249 if (flatten) {
250 addMenuItemRecursively(menuItems, config, item, pageName, true);
251 } else {
252 final List<SideNavMenuItem> list = new ArrayList<>();
253 menuItem.withItems(list);
254 addMenuItemRecursively(list, config, item, pageName, false);
255 }
256 }
257 }
258 }