Skip to content

Commit 11b0c80

Browse files
committed
Refactor for app-layout-addon-1.1.0
1 parent bfaa715 commit 11b0c80

File tree

13 files changed

+366
-89
lines changed

13 files changed

+366
-89
lines changed

src/main/java/com/flowingcode/addons/applayout/AppDrawer.java

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@
2424
import java.util.ArrayList;
2525
import java.util.Collections;
2626
import java.util.List;
27+
import java.util.Optional;
2728

2829
import com.flowingcode.addons.applayout.menu.MenuItem;
2930
import com.vaadin.flow.component.Component;
3031
import com.vaadin.flow.component.HasComponents;
3132
import com.vaadin.flow.component.Tag;
3233
import com.vaadin.flow.component.dependency.HtmlImport;
3334
import com.vaadin.flow.component.html.H4;
35+
import com.vaadin.flow.server.Command;
3436
import com.vaadin.flow.shared.Registration;
3537

3638
/**
@@ -52,7 +54,7 @@ public AppDrawer(String title) {
5254
this(new H4(title));
5355
header.getElement().setAttribute("style", "text-align:center");
5456
}
55-
57+
5658
public AppDrawer(Component headerComponent) {
5759
this.header = headerComponent;
5860
getElement().setAttribute("id", "drawer");
@@ -66,8 +68,9 @@ public AppDrawer(Component headerComponent) {
6668
getUI().ifPresent(ui->ui.getPage().executeJavaScript("$1.style.height='calc(100% - '+($0.scrollHeight+16)+'px)'", header, pm));
6769
r[0].remove();
6870
});
71+
6972
}
70-
73+
7174
public void setSwipeOpen(boolean swipeOpen) {
7275
getElement().setAttribute("swipe-open", swipeOpen);
7376
}
@@ -81,40 +84,41 @@ public void setMenuItems(List<MenuItem> menuItems) {
8184
private Component[] createComponents(List<MenuItem> menuItems) {
8285
List<Component> components = new ArrayList<>();
8386
for (MenuItem menuItem : menuItems) {
84-
if (menuItem.isSubMenuFolder()) {
85-
components.add(collectMenus(menuItem));
87+
MenuItemComponent mi;
88+
if (!menuItem.getSubMenuItems().isEmpty()) {
89+
List<MenuItem> submenuItems = menuItem.getSubMenuItems();
90+
Component[] children = createComponents(submenuItems);
91+
mi = new SubMenuComponent(menuItem);
92+
((SubMenuComponent)mi).add(children);
8693
} else {
87-
if (menuItem.getIcon()==null && menuItem.getImageURL()==null) {
88-
PaperItem pi = new PaperItem(menuItem.getLabel(),menuItem.getCommand(), this);
89-
pi.setEnabled(menuItem.isEnabled());
90-
components.add(pi);
91-
menuItem.setRefreshCallback(()->pi.setText(menuItem.getLabel()));
92-
} else {
93-
PaperIconItem pi;
94-
if (menuItem.getImageURL()!=null) {
95-
pi = new PaperIconItem(menuItem.getLabel(), menuItem.getImageURL() ,menuItem.getCommand(), this);
96-
} else {
97-
pi = new PaperIconItem(menuItem.getLabel(), menuItem.getIcon() ,menuItem.getCommand(), this);
94+
mi = new MenuItemComponent(menuItem);
95+
mi.addMouseClickEvent(ev->{
96+
switch (ev.getButton()) {
97+
case LEFT:
98+
Optional.ofNullable(menuItem.getCommand()).ifPresent(Command::execute);
99+
close();
100+
break;
101+
case MIDDLE:
102+
Optional.ofNullable(menuItem.getMiddleButtonCommand()).ifPresent(Command::execute);
103+
close();
104+
break;
105+
case RIGHT:
106+
Optional.ofNullable(menuItem.getRightButtonCommand()).ifPresent(Command::execute);
107+
break;
98108
}
99-
100-
components.add(pi);
101-
pi.setEnabled(menuItem.isEnabled());
102-
menuItem.setRefreshCallback(()->{
103-
pi.setTitle(menuItem.getLabel());
104-
pi.setIcon(menuItem.getIcon());
105-
});
106-
}
107-
}
109+
});
110+
}
111+
112+
components.add(mi);
113+
menuItem.setRefreshCallback(()->mi.configure(menuItem));
108114
}
115+
109116
return components.toArray(new Component[] {});
110117
}
111-
112-
private CollapseButton collectMenus(MenuItem topMenuItem) {
113-
List<MenuItem> menuItems = topMenuItem.getSubMenuItems();
114-
Component[] components = createComponents(menuItems);
115-
CollapseButton collapseButton = new CollapseButton(topMenuItem.getLabel(), topMenuItem.getIcon(), topMenuItem.getImageURL(), components);
116-
collapseButton.setEnabled(topMenuItem.isEnabled());
117-
return collapseButton;
118+
119+
/**Close the app-drawer.*/
120+
public void close() {
121+
getUI().ifPresent(ui->ui.getPage().executeJavaScript("$0.close()", this));
118122
}
119-
123+
120124
}

src/main/java/com/flowingcode/addons/applayout/AppLayout.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222

2323
import java.util.ArrayList;
24-
25-
2624
import java.util.Arrays;
2725

2826
import com.flowingcode.addons.applayout.menu.MenuItem;
@@ -47,8 +45,8 @@
4745
@HtmlImport("frontend://styles/applayout-styles.html")
4846
public class AppLayout extends Div implements PageConfigurator {
4947

50-
AppDrawer drawer;
51-
AppHeader header;
48+
private AppDrawer drawer;
49+
private AppHeader header;
5250

5351
public AppLayout(String title) {
5452
drawer = new AppDrawer(title);
@@ -124,4 +122,5 @@ public void setReveals(boolean reveals) {
124122
public void setSwipeOpen(boolean swipeOpen) {
125123
drawer.setSwipeOpen(swipeOpen);
126124
}
125+
127126
}

src/main/java/com/flowingcode/addons/applayout/AppToolbar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public void setToolbarIconButtons(MenuItem[] menuItems) {
8181
private static List<PaperIconButton> createToolbarIconButtons(MenuItem[] menuItems) {
8282
List<PaperIconButton> result = new ArrayList<>();
8383
for (MenuItem menuItem : menuItems) {
84-
PaperIconButton paperIconButton = new PaperIconButton(menuItem.getIcon(),menuItem.getCommand());
84+
PaperIconButton paperIconButton = new PaperIconButton(menuItem.getIcon(), menuItem.getCommand());
8585
paperIconButton.setEnabled(menuItem.isEnabled());
8686
menuItem.setRefreshCallback(() -> paperIconButton.setIcon(menuItem.getIcon()));
8787
result.add(paperIconButton);
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.flowingcode.addons.applayout;
2+
3+
import java.net.URL;
4+
import java.util.Optional;
5+
6+
import com.flowingcode.addons.applayout.MouseClickEvent.MouseButton;
7+
import com.flowingcode.addons.applayout.menu.MenuItem;
8+
import com.vaadin.flow.component.Component;
9+
import com.vaadin.flow.component.HasEnabled;
10+
import com.vaadin.flow.component.Tag;
11+
import com.vaadin.flow.component.dependency.HtmlImport;
12+
import com.vaadin.flow.shared.Registration;
13+
14+
@Tag("fc-menuitem")
15+
@HtmlImport("bower_components/fc-applayout/fc-menuitem.html")
16+
@SuppressWarnings("serial")
17+
public class MenuItemComponent extends Component implements HasEnabled {
18+
19+
20+
public MenuItemComponent() { }
21+
22+
public MenuItemComponent(MenuItem menuItem) {
23+
configure(menuItem);
24+
}
25+
26+
public void configure(MenuItem menuItem) {
27+
setLabel(menuItem.getLabel());
28+
setIcon(menuItem.getIcon());
29+
setImage(menuItem.getImageURL());
30+
setEnabled(menuItem.isEnabled());
31+
}
32+
33+
public String getLabel() {
34+
return getElement().getAttribute("label");
35+
}
36+
37+
public void setLabel(String label) {
38+
getElement().setAttribute("label", label);
39+
}
40+
41+
public String getIcon() {
42+
return getElement().getAttribute("icon");
43+
}
44+
45+
public void setIcon(String icon) {
46+
if (icon!=null) {
47+
getElement().setAttribute("icon", icon);
48+
getElement().removeAttribute("image");
49+
} else {
50+
getElement().removeAttribute("icon");
51+
}
52+
}
53+
54+
public String getImage() {
55+
return getElement().getAttribute("image");
56+
}
57+
58+
public void setImage(String image) {
59+
if (image!=null) {
60+
getElement().setAttribute("image", image);
61+
getElement().removeAttribute("icon");
62+
} else {
63+
getElement().removeAttribute("image");
64+
}
65+
}
66+
67+
public void setImage(URL imageURL) {
68+
setImage(Optional.ofNullable(imageURL).map(URL::toString).orElse(null));
69+
}
70+
71+
public Registration addMouseClickEvent(MouseClickListener<MenuItemComponent> listener) {
72+
return getElement().addEventListener("item-click", ev->{
73+
int btnIndex = (int) ev.getEventData().getNumber("event.detail");
74+
MouseButton button = MouseButton.values()[btnIndex];
75+
listener.onComponentEvent(new MouseClickEvent<MenuItemComponent>(this, button, true));
76+
}).addEventData("event.detail");
77+
}
78+
79+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.flowingcode.addons.applayout;
2+
3+
import com.vaadin.flow.component.Component;
4+
import com.vaadin.flow.component.ComponentEvent;
5+
6+
public class MouseClickEvent<T extends Component> extends ComponentEvent<T> {
7+
8+
private static final long serialVersionUID = 1L;
9+
10+
public enum MouseButton {
11+
LEFT, MIDDLE, RIGHT;
12+
}
13+
14+
private MouseButton button;
15+
16+
public MouseClickEvent(T source, MouseButton button, boolean fromClient) {
17+
super(source, fromClient);
18+
this.button = button;
19+
}
20+
21+
public MouseButton getButton() {
22+
return button;
23+
}
24+
25+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.flowingcode.addons.applayout;
2+
3+
import com.vaadin.flow.component.Component;
4+
import com.vaadin.flow.component.ComponentEventListener;
5+
6+
@FunctionalInterface
7+
public interface MouseClickListener<T extends Component> extends ComponentEventListener<MouseClickEvent<T>> {
8+
9+
}

src/main/java/com/flowingcode/addons/applayout/PaperListbox.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import java.util.List;
2525

2626
import com.vaadin.flow.component.Component;
27-
import com.vaadin.flow.component.HasComponents;
27+
import com.vaadin.flow.component.HasOrderedComponents;
2828
import com.vaadin.flow.component.Tag;
2929
import com.vaadin.flow.component.dependency.HtmlImport;
3030

@@ -37,7 +37,7 @@
3737
@SuppressWarnings("serial")
3838
@HtmlImport("bower_components/paper-listbox/paper-listbox.html")
3939
@Tag("paper-listbox")
40-
public class PaperListbox extends Component implements HasComponents {
40+
public class PaperListbox extends Component implements HasOrderedComponents<PaperListbox> {
4141

4242
public PaperListbox(List<Component> components) {
4343
components.stream().forEach(this::add);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.flowingcode.addons.applayout;
2+
3+
import com.flowingcode.addons.applayout.menu.MenuItem;
4+
import com.vaadin.flow.component.HasOrderedComponents;
5+
import com.vaadin.flow.component.Tag;
6+
import com.vaadin.flow.component.dependency.HtmlImport;
7+
8+
@Tag("fc-submenu")
9+
@HtmlImport("bower_components/fc-applayout/fc-submenu.html")
10+
@SuppressWarnings("serial")
11+
public class SubMenuComponent extends MenuItemComponent implements HasOrderedComponents<SubMenuComponent> {
12+
13+
public SubMenuComponent(MenuItem menuItem) {
14+
super(menuItem);
15+
}
16+
17+
}

0 commit comments

Comments
 (0)