/* * Copyright 2009 Fred Sauer * * 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 edu.purdue.pivot.skwiki.client.dnd; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.allen_sauer.gwt.dnd.client.util.Location; import com.allen_sauer.gwt.dnd.client.util.WidgetLocation; import edu.purdue.pivot.skwiki.client.sketch.AttachedPanel; import edu.purdue.pivot.skwiki.client.sketch.TouchPad; import gwt.g2d.client.graphics.Surface; final public class WindowPanel extends FocusPanel { // public String panelID = ""; public AttachedPanel editPanel; /** * WindowPanel direction constant, used in * {@link ResizeDragController#makeDraggable(Widget, DirectionConstant)}. */ public static class DirectionConstant { public final int directionBits; public final String directionLetters; private DirectionConstant(int directionBits, String directionLetters) { this.directionBits = directionBits; this.directionLetters = directionLetters; } } /** * Specifies that resizing occur at the east edge. */ public static final int DIRECTION_EAST = 0x0001; /** * Specifies that resizing occur at the both edge. */ public static final int DIRECTION_NORTH = 0x0002; /** * Specifies that resizing occur at the south edge. */ public static final int DIRECTION_SOUTH = 0x0004; /** * Specifies that resizing occur at the west edge. */ public static final int DIRECTION_WEST = 0x0008; /** * Specifies that resizing occur at the east edge. */ public static final DirectionConstant EAST = new DirectionConstant( DIRECTION_EAST, "e"); /** * Specifies that resizing occur at the both edge. */ public static final DirectionConstant NORTH = new DirectionConstant( DIRECTION_NORTH, "n"); /** * Specifies that resizing occur at the north-east edge. */ public static final DirectionConstant NORTH_EAST = new DirectionConstant( DIRECTION_NORTH | DIRECTION_EAST, "ne"); /** * Specifies that resizing occur at the north-west edge. */ public static final DirectionConstant NORTH_WEST = new DirectionConstant( DIRECTION_NORTH | DIRECTION_WEST, "nw"); /** * Specifies that resizing occur at the south edge. */ public static final DirectionConstant SOUTH = new DirectionConstant( DIRECTION_SOUTH, "s"); /** * Specifies that resizing occur at the south-east edge. */ public static final DirectionConstant SOUTH_EAST = new DirectionConstant( DIRECTION_SOUTH | DIRECTION_EAST, "se"); /** * Specifies that resizing occur at the south-west edge. */ public static final DirectionConstant SOUTH_WEST = new DirectionConstant( DIRECTION_SOUTH | DIRECTION_WEST, "sw"); /** * Specifies that resizing occur at the west edge. */ public static final DirectionConstant WEST = new DirectionConstant( DIRECTION_WEST, "w"); private static final int BORDER_THICKNESS = 10; private static final int BORDER_THICKNESS2 = 25; private static final String CSS_DEMO_RESIZE_EDGE = "demo-resize-edge"; private static final String CSS_DEMO_RESIZE_PANEL = "demo-WindowPanel"; private static final String CSS_DEMO_RESIZE_PANEL_HEADER = "demo-WindowPanel-header"; private int contentHeight; private Widget contentOrScrollPanelWidget; private int contentWidth; private Widget eastWidget; private Grid grid = new Grid(3, 3); private final FocusPanel headerContainer; private final Widget headerWidget; private boolean initialLoad = false; private Widget northWidget; private Widget southWidget; private Widget westWidget; private final WindowController windowController; public Widget contentPanel; public WindowPanel panel = this; public WindowPanel(final WindowController windowController, Widget headerWidget, Widget contentWidget, boolean wrapContentInScrollPanel) { this.windowController = windowController; this.headerWidget = headerWidget; this.contentPanel = contentWidget; addStyleName(CSS_DEMO_RESIZE_PANEL); contentOrScrollPanelWidget = wrapContentInScrollPanel ? new ScrollPanel( contentWidget) : contentWidget; headerContainer = new FocusPanel(); headerContainer.addStyleName(CSS_DEMO_RESIZE_PANEL_HEADER); headerContainer.add(headerWidget); windowController.getPickupDragController().makeDraggable(this, headerContainer); addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { AbsolutePanel boundaryPanel = windowController .getBoundaryPanel(); if (boundaryPanel.getWidgetIndex(WindowPanel.this) < boundaryPanel .getWidgetCount() - 1) { // force our panel to the top of our z-index context WidgetLocation location = new WidgetLocation( WindowPanel.this, boundaryPanel); boundaryPanel.add(WindowPanel.this, location.getLeft(), location.getTop()); } } }); VerticalPanel verticalPanel = new VerticalPanel(); verticalPanel.add(headerContainer); verticalPanel.add(contentOrScrollPanelWidget); grid.setCellSpacing(0); grid.setCellPadding(0); add(grid); setupCell(0, 0, NORTH_WEST); northWidget = setupCell(0, 1, NORTH); setupCell(0, 2, NORTH_EAST); westWidget = setupCell(1, 0, WEST); grid.setWidget(1, 1, verticalPanel); eastWidget = setupCell(1, 2, EAST); setupCell(2, 0, SOUTH_WEST); southWidget = setupCell(2, 1, SOUTH); setupCell(2, 2, SOUTH_EAST); } public int getContentHeight() { return contentHeight; } public int getContentWidth() { return contentWidth; } public void moveBy(int right, int down) { AbsolutePanel parent = (AbsolutePanel) getParent(); Location location = new WidgetLocation(this, parent); int left = location.getLeft() + right; int top = location.getTop() + down; parent.setWidgetPosition(this, left, top); } public void moveTo(int left, int top) { AbsolutePanel parent = (AbsolutePanel) getParent(); parent.setWidgetPosition(this, left, top); } public Location getLocation() { AbsolutePanel parent = (AbsolutePanel) getParent(); Location location = new WidgetLocation(this, parent); return location; } public void setContentSize(int width, int height) { if (width != contentWidth) { contentWidth = width; headerContainer.setPixelSize(contentWidth, headerWidget.getOffsetHeight()); northWidget.setPixelSize(contentWidth, BORDER_THICKNESS); southWidget.setPixelSize(contentWidth, BORDER_THICKNESS); } if (height != contentHeight) { contentHeight = height; int headerHeight = headerContainer.getOffsetHeight(); westWidget.setPixelSize(BORDER_THICKNESS, contentHeight + headerHeight); eastWidget.setPixelSize(BORDER_THICKNESS, contentHeight + headerHeight); } //contentOrScrollPanelWidget.setPixelSize(contentWidth, contentHeight); if (contentPanel instanceof Surface) { ((TouchPad)contentPanel).clear(); ((TouchPad)contentPanel).setSize(width, height); ((TouchPad)contentPanel).redraw(); } else { contentPanel.setHeight(height+"px"); contentPanel.setWidth(width+"px"); } } private Widget setupCell(int row, int col, DirectionConstant direction) { final FocusPanel widget = new FocusPanel(); widget.getElement().setAttribute("background-color", "#E7E8F0"); widget.setPixelSize(BORDER_THICKNESS2, BORDER_THICKNESS2); grid.setWidget(row, col, widget); windowController.getResizeDragController().makeDraggable(widget, direction); grid.getCellFormatter().addStyleName( row, col, CSS_DEMO_RESIZE_EDGE + " demo-resize-" + direction.directionLetters); return widget; } @Override protected void onLoad() { super.onLoad(); if (!initialLoad && contentOrScrollPanelWidget.getOffsetHeight() != 0) { initialLoad = true; headerWidget.setPixelSize(headerWidget.getOffsetWidth(), headerWidget.getOffsetHeight()); setContentSize(contentOrScrollPanelWidget.getOffsetWidth(), contentOrScrollPanelWidget.getOffsetHeight()); } } }