blob: 7de10ec865021935431f2ce1df87fe1db74fce81 [file] [log] [blame]
/*
* Copyright 2008 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.sample.showcase.client.content.panels;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.i18n.client.Constants;
import com.google.gwt.sample.showcase.client.ContentWidget;
import com.google.gwt.sample.showcase.client.Showcase;
import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseData;
import com.google.gwt.sample.showcase.client.ShowcaseAnnotations.ShowcaseSource;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Example file.
*/
public class CwAbsolutePanel extends ContentWidget {
/**
* The constants used in this Content Widget.
*/
@ShowcaseSource
public static interface CwConstants extends Constants {
String cwAbsolutePanelClickMe();
String cwAbsolutePanelDescription();
String cwAbsolutePanelHelloWorld();
String cwAbsolutePanelItemsToMove();
String cwAbsolutePanelLeft();
String cwAbsolutePanelName();
String cwAbsolutePanelTop();
String[] cwAbsolutePanelWidgetNames();
}
/**
* The absolute panel used in the example.
*/
private AbsolutePanel absolutePanel = null;
/**
* An instance of the constants.
*/
@ShowcaseData
private final CwConstants constants;
/**
* The input field used to set the left position of a {@link Widget}.
*/
@ShowcaseData
private TextBox leftPosBox = null;
/**
* The list box of items that can be repositioned.
*/
@ShowcaseData
private ListBox listBox = new ListBox();
/**
* The input field used to set the top position of a {@link Widget}.
*/
@ShowcaseData
private TextBox topPosBox = null;
/**
* A mapping between the name of a {@link Widget} and the widget in the
* {@link AbsolutePanel}.
*/
@ShowcaseData
private Map<String, Widget> widgetMap = null;
/**
* Constructor.
*
* @param constants the constants
*/
public CwAbsolutePanel(CwConstants constants) {
super(constants.cwAbsolutePanelName(),
constants.cwAbsolutePanelDescription(), false);
this.constants = constants;
}
/**
* Initialize this example.
*/
@ShowcaseSource
@Override
public Widget onInitialize() {
// Create a new panel
widgetMap = new LinkedHashMap<String, Widget>();
absolutePanel = new AbsolutePanel();
absolutePanel.setSize("250px", "250px");
absolutePanel.ensureDebugId("cwAbsolutePanel");
// Add an HTML widget to the panel
String[] widgetNames = constants.cwAbsolutePanelWidgetNames();
HTML text = new HTML(constants.cwAbsolutePanelHelloWorld());
absolutePanel.add(text, 10, 20);
widgetMap.put(widgetNames[0], text);
// Add a Button to the panel
Button button = new Button(constants.cwAbsolutePanelClickMe());
absolutePanel.add(button, 80, 45);
widgetMap.put(widgetNames[1], button);
// Add a Button to the panel
Grid grid = new Grid(2, 3);
grid.setBorderWidth(1);
for (int i = 0; i < 3; i++) {
grid.setHTML(0, i, i + "");
grid.setWidget(1, i, new Image(Showcase.images.gwtLogoThumb()));
}
absolutePanel.add(grid, 60, 100);
widgetMap.put(widgetNames[2], grid);
// Wrap the absolute panel in a DecoratorPanel
DecoratorPanel absolutePanelWrapper = new DecoratorPanel();
absolutePanelWrapper.setWidget(absolutePanel);
// Create the options bar
DecoratorPanel optionsWrapper = new DecoratorPanel();
optionsWrapper.setWidget(createOptionsBar());
// Add the components to a panel and return it
HorizontalPanel mainLayout = new HorizontalPanel();
mainLayout.setSpacing(10);
mainLayout.add(optionsWrapper);
mainLayout.add(absolutePanelWrapper);
return mainLayout;
}
/**
* Initialize the options panel after the {@link AbsolutePanel} has been
* attached to the page.
*/
@ShowcaseSource
@Override
public void onInitializeComplete() {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
updateSelectedItem();
}
});
}
@Override
protected void asyncOnInitialize(final AsyncCallback<Widget> callback) {
GWT.runAsync(CwAbsolutePanel.class, new RunAsyncCallback() {
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
public void onSuccess() {
callback.onSuccess(onInitialize());
}
});
}
/**
* Create an options panel that allows users to select a widget and reposition
* it.
*
* @return the new options panel
*/
@ShowcaseSource
private Widget createOptionsBar() {
// Create a panel to move components around
FlexTable optionsBar = new FlexTable();
topPosBox = new TextBox();
topPosBox.setWidth("3em");
topPosBox.setText("100");
leftPosBox = new TextBox();
leftPosBox.setWidth("3em");
leftPosBox.setText("60");
listBox = new ListBox();
optionsBar.setHTML(0, 0, constants.cwAbsolutePanelItemsToMove());
optionsBar.setWidget(0, 1, listBox);
optionsBar.setHTML(1, 0, constants.cwAbsolutePanelTop());
optionsBar.setWidget(1, 1, topPosBox);
optionsBar.setHTML(2, 0, constants.cwAbsolutePanelLeft());
optionsBar.setWidget(2, 1, leftPosBox);
// Add the widgets to the list box
for (String name : widgetMap.keySet()) {
listBox.addItem(name);
}
// Set the current item position when the user selects an item
listBox.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
updateSelectedItem();
}
});
// Move the item as the user changes the value in the left and top boxes
KeyUpHandler repositionHandler = new KeyUpHandler() {
public void onKeyUp(KeyUpEvent event) {
repositionItem();
}
};
topPosBox.addKeyUpHandler(repositionHandler);
leftPosBox.addKeyUpHandler(repositionHandler);
// Return the options bar
return optionsBar;
}
/**
* Reposition an item when the user changes the value in the top or left
* position text boxes.
*/
@ShowcaseSource
private void repositionItem() {
// Get the selected item to move
String name = listBox.getValue(listBox.getSelectedIndex());
Widget item = widgetMap.get(name);
// Reposition the item
try {
int top = Integer.parseInt(topPosBox.getText());
int left = Integer.parseInt(leftPosBox.getText());
absolutePanel.setWidgetPosition(item, left, top);
} catch (NumberFormatException e) {
// Ignore invalid user input
return;
}
}
/**
* Update the top and left position text fields when the user selects a new
* item to move.
*/
@ShowcaseSource
private void updateSelectedItem() {
String name = listBox.getValue(listBox.getSelectedIndex());
Widget item = widgetMap.get(name);
topPosBox.setText(absolutePanel.getWidgetTop(item) + "");
leftPosBox.setText(absolutePanel.getWidgetLeft(item) + "");
}
}