/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.window;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Attribute;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.RichTextArea;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.declarative.Design;
import com.vaadin.ui.declarative.DesignContext;
@SuppressWarnings("serial")
public class WindowCloseShortcuts extends AbstractTestUI {
private Window window;
private Label designLabel;
private VerticalLayout buttonLayout;
@Override
protected void setup(VaadinRequest request) {
getLayout().setSpacing(true);
window = new Window("Test window");
window.setVisible(true);
window.setModal(true);
window.setContent(new RichTextArea());
Panel buttonPanel = new Panel();
buttonLayout = new VerticalLayout();
buttonLayout.setSizeFull();
buttonPanel.setCaption("Demo controls");
addButton(new Button("Open window", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
UI.getCurrent().addWindow(window);
window.center();
updateDesign();
}
}));
addButton(new Button("Add ENTER close shortcut", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
window.addCloseShortcut(KeyCode.ENTER);
updateDesign();
}
}));
addButton(new Button("Add TAB close shortcut", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
window.addCloseShortcut(KeyCode.TAB);
updateDesign();
}
}));
addButton(new Button("Remove ESC close shortcut", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
window.removeCloseShortcut(KeyCode.ESCAPE);
updateDesign();
}
}));
addButton(new Button("Clear all close shortcuts", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
window.removeAllCloseShortcuts();
updateDesign();
}
}));
addButton(new Button("Reset to default state", new ClickListener() {
@Override
@SuppressWarnings("deprecation")
public void buttonClick(ClickEvent event) {
window.removeCloseShortcut();
updateDesign();
}
}));
buttonPanel.setContent(buttonLayout);
buttonPanel.setSizeUndefined();
addComponent(buttonPanel);
buttonPanel.setWidth("400px");
Panel designPanel = new Panel();
designPanel.setCaption("Window design");
designLabel = new Label("");
VerticalLayout designLayout = new VerticalLayout();
designLayout.addComponent(designLabel);
designPanel.setContent(designLayout);
addComponent(designPanel);
updateDesign();
}
private void addButton(Button b) {
b.setWidth("100%");
buttonLayout.addComponent(b);
}
//
// The following code is adapted from DeclarativeTestBaseBase.java
// (that's not a typo)
//
private void updateDesign() {
String design = "";
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DesignContext dc = new DesignContext();
dc.setRootComponent(window);
Design.write(dc, outputStream);
design = outputStream.toString("UTF-8");
} catch (Exception e) {
return;
}
Element producedElem = Jsoup.parse(design).body().child(0);
design = elementToHtml(producedElem);
designLabel.setCaption(design);
}
//
// The following code is copied directly from DeclarativeTestBaseBase.java
// (that's not a typo, either)
//
private String elementToHtml(Element producedElem) {
StringBuilder stringBuilder = new StringBuilder();
elementToHtml(producedElem, stringBuilder);
return stringBuilder.toString();
}
private String elementToHtml(Element producedElem, StringBuilder sb) {
ArrayList<String> names = new ArrayList<>();
for (Attribute a : producedElem.attributes().asList()) {
names.add(a.getKey());
}
Collections.sort(names);
sb.append("<" + producedElem.tagName() + "");
for (String attrName : names) {
sb.append(" ").append(attrName).append("=").append("\'")
.append(producedElem.attr(attrName)).append("\'");
}
sb.append(">");
for (Node child : producedElem.childNodes()) {
if (child instanceof Element) {
elementToHtml((Element) child, sb);
} else if (child instanceof TextNode) {
String text = ((TextNode) child).text();
sb.append(text.trim());
}
}
sb.append("</").append(producedElem.tagName()).append(">");
return sb.toString();
}
@Override
protected Integer getTicketNumber() {
return 17383;
}
}