Add example pop down button to change screen Change-Id: I38cf9617498af41153285046aa0e3ea157c378f6 Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/cookbook/HelloForm.gwt.xml b/src/main/java/com/googlesource/gerrit/plugins/cookbook/HelloForm.gwt.xml index 880520c..d056c5d 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/cookbook/HelloForm.gwt.xml +++ b/src/main/java/com/googlesource/gerrit/plugins/cookbook/HelloForm.gwt.xml
@@ -23,6 +23,7 @@ <inherits name="com.google.gwt.http.HTTP"/> <inherits name="com.google.gwt.json.JSON"/> <inherits name='com.google.gwtexpui.clippy.Clippy'/> + <inherits name='com.google.gwtexpui.globalkey.GlobalKey'/> <!-- Using GWT built-in themes adds a number of static --> <!-- resources to the plugin. No theme inherits lines were --> <!-- added in order to make this plugin as simple as possible -->
diff --git a/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/BuildsDropDownPanel.java b/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/BuildsDropDownPanel.java new file mode 100644 index 0000000..86b7034 --- /dev/null +++ b/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/BuildsDropDownPanel.java
@@ -0,0 +1,74 @@ +// Copyright (C) 2015 The Android Open Source Project +// +// 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.googlesource.gerrit.plugins.cookbook.client; + +import com.google.gerrit.plugin.client.extension.Panel; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.InlineHyperlink; +import com.google.gwt.user.client.ui.InlineLabel; + +/** + * Extension for change screen that displays a status in the header bar. + */ +public class BuildsDropDownPanel extends FlowPanel { + static class Factory implements Panel.EntryPoint { + @Override + public void onLoad(Panel panel) { + panel.setWidget(new BuildsDropDownPanel()); + } + } + + BuildsDropDownPanel() { + Grid g = new Grid(3, 4); + g.addStyleName("infoBlock"); + CellFormatter fmt = g.getCellFormatter(); + + g.setText(0, 0, "State"); + fmt.addStyleName(0, 0, "header"); + g.setText(0, 1, "PS"); + fmt.addStyleName(0, 1, "header"); + g.setText(0, 2, "Date"); + fmt.addStyleName(0, 2, "header"); + g.setText(0, 3, "Log"); + fmt.addStyleName(0, 3, "header"); + + HorizontalPanel p = new HorizontalPanel(); + p.add(new Image(CookBookPlugin.RESOURCES.greenCheck())); + p.add(new InlineLabel("OK")); + g.setWidget(1, 0, p); + g.setWidget(1, 1, new InlineLabel("2")); + g.setWidget(1, 2, new InlineLabel("2015-07-09 11:06:13")); + g.setWidget(1, 3, new InlineHyperlink("Build Log", "TODO")); + + p = new HorizontalPanel(); + p.add(new Image(CookBookPlugin.RESOURCES.redNot())); + p.add(new InlineLabel("FAILED")); + g.setWidget(2, 0, p); + g.setWidget(2, 1, new InlineLabel("1")); + g.setWidget(2, 2, new InlineLabel("2015-07-09 09:17:28")); + g.setWidget(2, 3, new InlineHyperlink("Build Log", "TODO")); + + fmt.addStyleName(0, 0, "topmost"); + fmt.addStyleName(0, 1, "topmost"); + fmt.addStyleName(0, 2, "topmost"); + fmt.addStyleName(0, 3, "topmost"); + + add(new PopDownButton("Builds", g)); + } +}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/CookBookPlugin.java b/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/CookBookPlugin.java index 4a83b64..5a15e56 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/CookBookPlugin.java +++ b/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/CookBookPlugin.java
@@ -35,5 +35,8 @@ new CookBookChangeScreenExtension.Factory()); Plugin.get().panel(GerritUiExtensionPoint.CHANGE_SCREEN_HEADER, new ChangeScreenStatusExtension.Factory()); + Plugin.get().panel( + GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_POP_DOWNS, + new BuildsDropDownPanel.Factory()); } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/PopDownButton.java b/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/PopDownButton.java new file mode 100644 index 0000000..3cbe5d6 --- /dev/null +++ b/src/main/java/com/googlesource/gerrit/plugins/cookbook/client/PopDownButton.java
@@ -0,0 +1,101 @@ +// Copyright (C) 2015 The Android Open Source Project +// +// 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.googlesource.gerrit.plugins.cookbook.client; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Style; +import com.google.gwt.dom.client.Style.FontWeight; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.logical.shared.CloseEvent; +import com.google.gwt.event.logical.shared.CloseHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.PopupPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwtexpui.globalkey.client.GlobalKey; +import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; + +/** + * Pop down button for header line in change screen. + * + * This class implements a button that on click opens a pop down panel with the + * provided widget, similar to the "Patch Sets", "Download" or "Included In" pop + * down panels on the change screen. + * + * This class can *only* be used within a panel that extends the header line of + * the change screen, but will not work standalone. + */ +public class PopDownButton extends Button { + private final Widget widget; + private PopupPanel popup; + + public PopDownButton(String text, Widget widget) { + // Create Button with inner div. This is required to get proper styling + // in the context of the change screen. + super((new SafeHtmlBuilder()).openDiv().append(text).closeDiv()); + getElement().removeClassName("gwt-Button"); + addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + show(); + } + }); + this.widget = widget; + } + + private void show() { + if (popup != null) { + getElement().getStyle().clearFontWeight(); + popup.hide(); + return; + } + + final Widget relativeTo = getParent(); + final PopupPanel p = new PopupPanel(true) { + @Override + public void setPopupPosition(int left, int top) { + top -= Document.get().getBodyOffsetTop(); + + int w = Window.getScrollLeft() + Window.getClientWidth(); + int r = relativeTo.getAbsoluteLeft() + relativeTo.getOffsetWidth(); + int right = w - r; + Style style = getElement().getStyle(); + style.clearProperty("left"); + style.setPropertyPx("right", right); + style.setPropertyPx("top", top); + } + }; + Style popupStyle = p.getElement().getStyle(); + popupStyle.setBorderWidth(0, Unit.PX); + popupStyle.setBackgroundColor("#EEEEEE"); + p.addAutoHidePartner(getElement()); + p.addCloseHandler(new CloseHandler<PopupPanel>() { + @Override + public void onClose(CloseEvent<PopupPanel> event) { + if (popup == p) { + getElement().getStyle().clearFontWeight(); + popup = null; + } + } + }); + p.add(widget); + p.showRelativeTo(relativeTo); + GlobalKey.dialog(p); + getElement().getStyle().setFontWeight(FontWeight.BOLD); + popup = p; + } +}