| /* | |
| * Copyright 2010 Google Inc. | |
| * | |
| * 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.google.gwt.logging.client; | |
| import com.google.gwt.event.dom.client.ClickEvent; | |
| import com.google.gwt.event.dom.client.ClickHandler; | |
| import com.google.gwt.event.dom.client.HasAllMouseHandlers; | |
| import com.google.gwt.event.dom.client.MouseDownEvent; | |
| import com.google.gwt.event.dom.client.MouseDownHandler; | |
| import com.google.gwt.event.dom.client.MouseMoveEvent; | |
| import com.google.gwt.event.dom.client.MouseMoveHandler; | |
| import com.google.gwt.event.dom.client.MouseUpEvent; | |
| import com.google.gwt.event.dom.client.MouseUpHandler; | |
| import com.google.gwt.user.client.DOM; | |
| import com.google.gwt.user.client.ui.Button; | |
| import com.google.gwt.user.client.ui.HTML; | |
| import com.google.gwt.user.client.ui.HasHorizontalAlignment; | |
| import com.google.gwt.user.client.ui.HasVerticalAlignment; | |
| import com.google.gwt.user.client.ui.HorizontalPanel; | |
| import com.google.gwt.user.client.ui.PopupPanel; | |
| import com.google.gwt.user.client.ui.RootPanel; | |
| import com.google.gwt.user.client.ui.ScrollPanel; | |
| import com.google.gwt.user.client.ui.VerticalPanel; | |
| import com.google.gwt.user.client.ui.Widget; | |
| /** | |
| * A simple popup to show log messages, which can be resized, minimized, and | |
| * dragged to a different location. | |
| */ | |
| public class LoggingPopup extends PopupPanel { | |
| /** | |
| * Handles the logic to track click-drag movements with the mouse. | |
| */ | |
| private abstract class MouseDragHandler implements MouseMoveHandler, | |
| MouseUpHandler, MouseDownHandler { | |
| protected boolean dragging = false; | |
| protected Widget dragHandle; | |
| protected int dragStartX; | |
| protected int dragStartY; | |
| public MouseDragHandler(Widget dragHandle) { | |
| this.dragHandle = dragHandle; | |
| HasAllMouseHandlers hamh = (HasAllMouseHandlers) dragHandle; | |
| hamh.addMouseDownHandler(this); | |
| hamh.addMouseUpHandler(this); | |
| hamh.addMouseMoveHandler(this); | |
| } | |
| public abstract void handleDrag(int absX, int absY); | |
| public void onMouseDown(MouseDownEvent event) { | |
| dragging = true; | |
| DOM.setCapture(dragHandle.getElement()); | |
| dragStartX = event.getClientX(); | |
| dragStartY = event.getClientY(); | |
| DOM.eventPreventDefault(DOM.eventGetCurrentEvent()); | |
| } | |
| public void onMouseMove(MouseMoveEvent event) { | |
| if (dragging) { | |
| handleDrag(event.getClientX() - dragStartX, | |
| event.getClientY() - dragStartY); | |
| dragStartX = event.getClientX(); | |
| dragStartY = event.getClientY(); | |
| } | |
| } | |
| public void onMouseUp(MouseUpEvent event) { | |
| dragging = false; | |
| DOM.releaseCapture(dragHandle.getElement()); | |
| } | |
| } | |
| private static class ScrollPanelWithMinSize extends ScrollPanel { | |
| private int minScrollPanelHeight = 100; | |
| private int minScrollPanelWidth = 100; | |
| private int scrollPanelHeight; | |
| private int scrollPanelWidth; | |
| public void incrementPixelSize(int width, int height) { | |
| setPixelSize(scrollPanelWidth + width, scrollPanelHeight + height); | |
| } | |
| @Override | |
| public void setPixelSize(int width, int height) { | |
| super.setPixelSize(scrollPanelWidth = Math.max(width, minScrollPanelWidth), | |
| scrollPanelHeight = Math.max(height, minScrollPanelHeight)); | |
| } | |
| } | |
| private class WindowMoveHandler extends MouseDragHandler { | |
| public WindowMoveHandler(Widget dragHandle) { | |
| super(dragHandle); | |
| } | |
| @Override | |
| public void handleDrag(int absX, int absY) { | |
| Widget moveTarget = LoggingPopup.this; | |
| RootPanel.get().setWidgetPosition(moveTarget, | |
| moveTarget.getAbsoluteLeft() + absX, | |
| moveTarget.getAbsoluteTop() + absY); | |
| } | |
| } | |
| private class WindowResizeHandler extends MouseDragHandler { | |
| public WindowResizeHandler(Widget dragHandle) { | |
| super(dragHandle); | |
| } | |
| @Override | |
| public void handleDrag(int absX, int absY) { | |
| scrollPanel.incrementPixelSize(absX, absY); | |
| } | |
| } | |
| private final HTML resizeIcon; | |
| private final ScrollPanelWithMinSize scrollPanel; | |
| private VerticalPanel logArea; | |
| public LoggingPopup() { | |
| // Since we don't want to pull UiBinder, or style sheets into the core GWT | |
| // library, styling for this window is done pretty manually. | |
| super(false, false); | |
| VerticalPanel mainPanel = new VerticalPanel(); | |
| mainPanel.setBorderWidth(1); | |
| mainPanel.getElement().getStyle().setBackgroundColor("white"); | |
| final HTML titleBar = new HTML("<center><b>Logging</b></center>"); | |
| mainPanel.add(titleBar); | |
| new WindowMoveHandler(titleBar); | |
| scrollPanel = new ScrollPanelWithMinSize(); | |
| mainPanel.add(scrollPanel); | |
| logArea = new VerticalPanel(); | |
| scrollPanel.setWidget(logArea); | |
| scrollPanel.setPixelSize(300, 200); | |
| HorizontalPanel bottomBar = new HorizontalPanel(); | |
| mainPanel.add(bottomBar); | |
| bottomBar.setWidth("100%"); | |
| bottomBar.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); | |
| final Button maxmin = new Button("Minimize"); | |
| bottomBar.add(maxmin); | |
| maxmin.addClickHandler(new ClickHandler() { | |
| public void onClick(ClickEvent event) { | |
| if (maxmin.getText().equals("Minimize")) { | |
| maxmin.setText("Maximize"); | |
| scrollPanel.setVisible(false); | |
| resizeIcon.setVisible(false); | |
| } else { | |
| scrollPanel.setVisible(true); | |
| resizeIcon.setVisible(true); | |
| maxmin.setText("Minimize"); | |
| } | |
| } | |
| }); | |
| resizeIcon = | |
| new HTML("<div style='font-size:200%; line-height:75%'>\u21F2</div>"); | |
| resizeIcon.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); | |
| bottomBar.add(resizeIcon); | |
| new WindowResizeHandler(resizeIcon); | |
| super.setWidget(mainPanel); | |
| show(); | |
| } | |
| @Override | |
| public void add(Widget w) { | |
| logArea.add(w); | |
| scrollPanel.setScrollPosition(scrollPanel.getElement().getScrollHeight()); | |
| } | |
| @Override | |
| public void setWidget(Widget w) { | |
| logArea.clear(); | |
| add(w); | |
| } | |
| } |