summaryrefslogtreecommitdiffstats
path: root/src/com/vaadin/ui/Window.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/vaadin/ui/Window.java')
-rw-r--r--src/com/vaadin/ui/Window.java853
1 files changed, 0 insertions, 853 deletions
diff --git a/src/com/vaadin/ui/Window.java b/src/com/vaadin/ui/Window.java
deleted file mode 100644
index e413d35e6d..0000000000
--- a/src/com/vaadin/ui/Window.java
+++ /dev/null
@@ -1,853 +0,0 @@
-/*
-@VaadinApache2LicenseForJavaFiles@
- */
-
-package com.vaadin.ui;
-
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.util.Map;
-
-import com.vaadin.event.FieldEvents.BlurEvent;
-import com.vaadin.event.FieldEvents.BlurListener;
-import com.vaadin.event.FieldEvents.BlurNotifier;
-import com.vaadin.event.FieldEvents.FocusEvent;
-import com.vaadin.event.FieldEvents.FocusListener;
-import com.vaadin.event.FieldEvents.FocusNotifier;
-import com.vaadin.event.MouseEvents.ClickEvent;
-import com.vaadin.event.ShortcutAction;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.event.ShortcutAction.ModifierKey;
-import com.vaadin.event.ShortcutListener;
-import com.vaadin.shared.MouseEventDetails;
-import com.vaadin.shared.ui.window.WindowServerRpc;
-import com.vaadin.shared.ui.window.WindowState;
-import com.vaadin.terminal.PaintException;
-import com.vaadin.terminal.PaintTarget;
-import com.vaadin.terminal.Vaadin6Component;
-import com.vaadin.terminal.gwt.client.ui.root.VRoot;
-
-/**
- * A component that represents a floating popup window that can be added to a
- * {@link Root}. A window is added to a {@code Root} using
- * {@link Root#addWindow(Window)}. </p>
- * <p>
- * The contents of a window is set using {@link #setContent(ComponentContainer)}
- * or by using the {@link #Window(String, ComponentContainer)} constructor. The
- * contents can in turn contain other components. By default, a
- * {@link VerticalLayout} is used as content.
- * </p>
- * <p>
- * A window can be positioned on the screen using absolute coordinates (pixels)
- * or set to be centered using {@link #center()}
- * </p>
- * <p>
- * The caption is displayed in the window header.
- * </p>
- * <p>
- * In Vaadin versions prior to 7.0.0, Window was also used as application level
- * windows. This function is now covered by the {@link Root} class.
- * </p>
- *
- * @author Vaadin Ltd.
- * @version
- * @VERSION@
- * @since 3.0
- */
-@SuppressWarnings("serial")
-public class Window extends Panel implements FocusNotifier, BlurNotifier,
- Vaadin6Component {
-
- private WindowServerRpc rpc = new WindowServerRpc() {
-
- @Override
- public void click(MouseEventDetails mouseDetails) {
- fireEvent(new ClickEvent(Window.this, mouseDetails));
- }
- };
-
- private int browserWindowWidth = -1;
-
- private int browserWindowHeight = -1;
-
- /**
- * Creates a new unnamed window with a default layout.
- */
- public Window() {
- this("", null);
- }
-
- /**
- * Creates a new unnamed window with a default layout and given title.
- *
- * @param caption
- * the title of the window.
- */
- public Window(String caption) {
- this(caption, null);
- }
-
- /**
- * Creates a new unnamed window with the given content and title.
- *
- * @param caption
- * the title of the window.
- * @param content
- * the contents of the window
- */
- public Window(String caption, ComponentContainer content) {
- super(caption, content);
- registerRpc(rpc);
- setSizeUndefined();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.ui.Panel#addComponent(com.vaadin.ui.Component)
- */
-
- @Override
- public void addComponent(Component c) {
- if (c instanceof Window) {
- throw new IllegalArgumentException(
- "Window cannot be added to another via addComponent. "
- + "Use addWindow(Window) instead.");
- }
- super.addComponent(c);
- }
-
- /* ********************************************************************* */
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.ui.Panel#paintContent(com.vaadin.terminal.PaintTarget)
- */
-
- @Override
- public synchronized void paintContent(PaintTarget target)
- throws PaintException {
- if (bringToFront != null) {
- target.addAttribute("bringToFront", bringToFront.intValue());
- bringToFront = null;
- }
-
- // Contents of the window panel is painted
- super.paintContent(target);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.ui.Panel#changeVariables(java.lang.Object, java.util.Map)
- */
-
- @Override
- public void changeVariables(Object source, Map<String, Object> variables) {
-
- // TODO Are these for top level windows or sub windows?
- boolean sizeHasChanged = false;
- // size is handled in super class, but resize events only in windows ->
- // so detect if size change occurs before super.changeVariables()
- if (variables.containsKey("height")
- && (getHeightUnits() != Unit.PIXELS || (Integer) variables
- .get("height") != getHeight())) {
- sizeHasChanged = true;
- }
- if (variables.containsKey("width")
- && (getWidthUnits() != Unit.PIXELS || (Integer) variables
- .get("width") != getWidth())) {
- sizeHasChanged = true;
- }
- Integer browserHeightVar = (Integer) variables
- .get(VRoot.BROWSER_HEIGHT_VAR);
- if (browserHeightVar != null
- && browserHeightVar.intValue() != browserWindowHeight) {
- browserWindowHeight = browserHeightVar.intValue();
- sizeHasChanged = true;
- }
- Integer browserWidthVar = (Integer) variables
- .get(VRoot.BROWSER_WIDTH_VAR);
- if (browserWidthVar != null
- && browserWidthVar.intValue() != browserWindowWidth) {
- browserWindowWidth = browserWidthVar.intValue();
- sizeHasChanged = true;
- }
-
- super.changeVariables(source, variables);
-
- // Positioning
- final Integer positionx = (Integer) variables.get("positionx");
- if (positionx != null) {
- final int x = positionx.intValue();
- // This is information from the client so it is already using the
- // position. No need to repaint.
- setPositionX(x < 0 ? -1 : x, false);
- }
- final Integer positiony = (Integer) variables.get("positiony");
- if (positiony != null) {
- final int y = positiony.intValue();
- // This is information from the client so it is already using the
- // position. No need to repaint.
- setPositionY(y < 0 ? -1 : y, false);
- }
-
- if (isClosable()) {
- // Closing
- final Boolean close = (Boolean) variables.get("close");
- if (close != null && close.booleanValue()) {
- close();
- }
- }
-
- // fire event if size has really changed
- if (sizeHasChanged) {
- fireResize();
- }
-
- if (variables.containsKey(FocusEvent.EVENT_ID)) {
- fireEvent(new FocusEvent(this));
- } else if (variables.containsKey(BlurEvent.EVENT_ID)) {
- fireEvent(new BlurEvent(this));
- }
-
- }
-
- /**
- * Method that handles window closing (from UI).
- *
- * <p>
- * By default, sub-windows are removed from their respective parent windows
- * and thus visually closed on browser-side. Browser-level windows also
- * closed on the client-side, but they are not implicitly removed from the
- * application.
- * </p>
- *
- * <p>
- * To explicitly close a sub-window, use {@link #removeWindow(Window)}. To
- * react to a window being closed (after it is closed), register a
- * {@link CloseListener}.
- * </p>
- */
- public void close() {
- Root root = getRoot();
-
- // Don't do anything if not attached to a root
- if (root != null) {
- // focus is restored to the parent window
- root.focus();
- // subwindow is removed from the root
- root.removeWindow(this);
- }
- }
-
- /**
- * Gets the distance of Window left border in pixels from left border of the
- * containing (main window).
- *
- * @return the Distance of Window left border in pixels from left border of
- * the containing (main window). or -1 if unspecified.
- * @since 4.0.0
- */
- public int getPositionX() {
- return getState().getPositionX();
- }
-
- /**
- * Sets the distance of Window left border in pixels from left border of the
- * containing (main window).
- *
- * @param positionX
- * the Distance of Window left border in pixels from left border
- * of the containing (main window). or -1 if unspecified.
- * @since 4.0.0
- */
- public void setPositionX(int positionX) {
- setPositionX(positionX, true);
- }
-
- /**
- * Sets the distance of Window left border in pixels from left border of the
- * containing (main window).
- *
- * @param positionX
- * the Distance of Window left border in pixels from left border
- * of the containing (main window). or -1 if unspecified.
- * @param repaintRequired
- * true if the window needs to be repainted, false otherwise
- * @since 6.3.4
- */
- private void setPositionX(int positionX, boolean repaintRequired) {
- getState().setPositionX(positionX);
- getState().setCentered(false);
- if (repaintRequired) {
- requestRepaint();
- }
- }
-
- /**
- * Gets the distance of Window top border in pixels from top border of the
- * containing (main window).
- *
- * @return Distance of Window top border in pixels from top border of the
- * containing (main window). or -1 if unspecified .
- *
- * @since 4.0.0
- */
- public int getPositionY() {
- return getState().getPositionY();
- }
-
- /**
- * Sets the distance of Window top border in pixels from top border of the
- * containing (main window).
- *
- * @param positionY
- * the Distance of Window top border in pixels from top border of
- * the containing (main window). or -1 if unspecified
- *
- * @since 4.0.0
- */
- public void setPositionY(int positionY) {
- setPositionY(positionY, true);
- }
-
- /**
- * Sets the distance of Window top border in pixels from top border of the
- * containing (main window).
- *
- * @param positionY
- * the Distance of Window top border in pixels from top border of
- * the containing (main window). or -1 if unspecified
- * @param repaintRequired
- * true if the window needs to be repainted, false otherwise
- *
- * @since 6.3.4
- */
- private void setPositionY(int positionY, boolean repaintRequired) {
- getState().setPositionY(positionY);
- getState().setCentered(false);
- if (repaintRequired) {
- requestRepaint();
- }
- }
-
- private static final Method WINDOW_CLOSE_METHOD;
- static {
- try {
- WINDOW_CLOSE_METHOD = CloseListener.class.getDeclaredMethod(
- "windowClose", new Class[] { CloseEvent.class });
- } catch (final java.lang.NoSuchMethodException e) {
- // This should never happen
- throw new java.lang.RuntimeException(
- "Internal error, window close method not found");
- }
- }
-
- public class CloseEvent extends Component.Event {
-
- /**
- *
- * @param source
- */
- public CloseEvent(Component source) {
- super(source);
- }
-
- /**
- * Gets the Window.
- *
- * @return the window.
- */
- public Window getWindow() {
- return (Window) getSource();
- }
- }
-
- /**
- * An interface used for listening to Window close events. Add the
- * CloseListener to a browser level window or a sub window and
- * {@link CloseListener#windowClose(CloseEvent)} will be called whenever the
- * user closes the window.
- *
- * <p>
- * Since Vaadin 6.5, removing a window using {@link #removeWindow(Window)}
- * fires the CloseListener.
- * </p>
- */
- public interface CloseListener extends Serializable {
- /**
- * Called when the user closes a window. Use
- * {@link CloseEvent#getWindow()} to get a reference to the
- * {@link Window} that was closed.
- *
- * @param e
- * Event containing
- */
- public void windowClose(CloseEvent e);
- }
-
- /**
- * Adds a CloseListener to the window.
- *
- * For a sub window the CloseListener is fired when the user closes it
- * (clicks on the close button).
- *
- * For a browser level window the CloseListener is fired when the browser
- * level window is closed. Note that closing a browser level window does not
- * mean it will be destroyed. Also note that Opera does not send events like
- * all other browsers and therefore the close listener might not be called
- * if Opera is used.
- *
- * <p>
- * Since Vaadin 6.5, removing windows using {@link #removeWindow(Window)}
- * does fire the CloseListener.
- * </p>
- *
- * @param listener
- * the CloseListener to add.
- */
- public void addListener(CloseListener listener) {
- addListener(CloseEvent.class, listener, WINDOW_CLOSE_METHOD);
- }
-
- /**
- * Removes the CloseListener from the window.
- *
- * <p>
- * For more information on CloseListeners see {@link CloseListener}.
- * </p>
- *
- * @param listener
- * the CloseListener to remove.
- */
- public void removeListener(CloseListener listener) {
- removeListener(CloseEvent.class, listener, WINDOW_CLOSE_METHOD);
- }
-
- protected void fireClose() {
- fireEvent(new Window.CloseEvent(this));
- }
-
- /**
- * Method for the resize event.
- */
- private static final Method WINDOW_RESIZE_METHOD;
- static {
- try {
- WINDOW_RESIZE_METHOD = ResizeListener.class.getDeclaredMethod(
- "windowResized", new Class[] { ResizeEvent.class });
- } catch (final java.lang.NoSuchMethodException e) {
- // This should never happen
- throw new java.lang.RuntimeException(
- "Internal error, window resized method not found");
- }
- }
-
- /**
- * Resize events are fired whenever the client-side fires a resize-event
- * (e.g. the browser window is resized). The frequency may vary across
- * browsers.
- */
- public class ResizeEvent extends Component.Event {
-
- /**
- *
- * @param source
- */
- public ResizeEvent(Component source) {
- super(source);
- }
-
- /**
- * Get the window form which this event originated
- *
- * @return the window
- */
- public Window getWindow() {
- return (Window) getSource();
- }
- }
-
- /**
- * Listener for window resize events.
- *
- * @see com.vaadin.ui.Window.ResizeEvent
- */
- public interface ResizeListener extends Serializable {
- public void windowResized(ResizeEvent e);
- }
-
- /**
- * Add a resize listener.
- *
- * @param listener
- */
- public void addListener(ResizeListener listener) {
- addListener(ResizeEvent.class, listener, WINDOW_RESIZE_METHOD);
- }
-
- /**
- * Remove a resize listener.
- *
- * @param listener
- */
- public void removeListener(ResizeListener listener) {
- removeListener(ResizeEvent.class, listener);
- }
-
- /**
- * Fire the resize event.
- */
- protected void fireResize() {
- fireEvent(new ResizeEvent(this));
- }
-
- /**
- * Used to keep the right order of windows if multiple windows are brought
- * to front in a single changeset. If this is not used, the order is quite
- * random (depends on the order getting to dirty list. e.g. which window got
- * variable changes).
- */
- private Integer bringToFront = null;
-
- /**
- * If there are currently several windows visible, calling this method makes
- * this window topmost.
- * <p>
- * This method can only be called if this window connected a root. Else an
- * illegal state exception is thrown. Also if there are modal windows and
- * this window is not modal, and illegal state exception is thrown.
- * <p>
- */
- public void bringToFront() {
- Root root = getRoot();
- if (root == null) {
- throw new IllegalStateException(
- "Window must be attached to parent before calling bringToFront method.");
- }
- int maxBringToFront = -1;
- for (Window w : root.getWindows()) {
- if (!isModal() && w.isModal()) {
- throw new IllegalStateException(
- "The root contains modal windows, non-modal window cannot be brought to front.");
- }
- if (w.bringToFront != null) {
- maxBringToFront = Math.max(maxBringToFront,
- w.bringToFront.intValue());
- }
- }
- bringToFront = Integer.valueOf(maxBringToFront + 1);
- requestRepaint();
- }
-
- /**
- * Sets sub-window modal, so that widgets behind it cannot be accessed.
- * <b>Note:</b> affects sub-windows only.
- *
- * @param modal
- * true if modality is to be turned on
- */
- public void setModal(boolean modal) {
- getState().setModal(modal);
- center();
- requestRepaint();
- }
-
- /**
- * @return true if this window is modal.
- */
- public boolean isModal() {
- return getState().isModal();
- }
-
- /**
- * Sets sub-window resizable. <b>Note:</b> affects sub-windows only.
- *
- * @param resizable
- * true if resizability is to be turned on
- */
- public void setResizable(boolean resizable) {
- getState().setResizable(resizable);
- requestRepaint();
- }
-
- /**
- *
- * @return true if window is resizable by the end-user, otherwise false.
- */
- public boolean isResizable() {
- return getState().isResizable();
- }
-
- /**
- *
- * @return true if a delay is used before recalculating sizes, false if
- * sizes are recalculated immediately.
- */
- public boolean isResizeLazy() {
- return getState().isResizeLazy();
- }
-
- /**
- * Should resize operations be lazy, i.e. should there be a delay before
- * layout sizes are recalculated. Speeds up resize operations in slow UIs
- * with the penalty of slightly decreased usability.
- *
- * Note, some browser send false resize events for the browser window and
- * are therefore always lazy.
- *
- * @param resizeLazy
- * true to use a delay before recalculating sizes, false to
- * calculate immediately.
- */
- public void setResizeLazy(boolean resizeLazy) {
- getState().setResizeLazy(resizeLazy);
- requestRepaint();
- }
-
- /**
- * Sets this window to be centered relative to its parent window. Affects
- * sub-windows only. If the window is resized as a result of the size of its
- * content changing, it will keep itself centered as long as its position is
- * not explicitly changed programmatically or by the user.
- * <p>
- * <b>NOTE:</b> This method has several issues as currently implemented.
- * Please refer to http://dev.vaadin.com/ticket/8971 for details.
- */
- public void center() {
- getState().setCentered(true);
- requestRepaint();
- }
-
- /**
- * Returns the closable status of the sub window. If a sub window is
- * closable it typically shows an X in the upper right corner. Clicking on
- * the X sends a close event to the server. Setting closable to false will
- * remove the X from the sub window and prevent the user from closing the
- * window.
- *
- * Note! For historical reasons readonly controls the closability of the sub
- * window and therefore readonly and closable affect each other. Setting
- * readonly to true will set closable to false and vice versa.
- * <p/>
- * Closable only applies to sub windows, not to browser level windows.
- *
- * @return true if the sub window can be closed by the user.
- */
- public boolean isClosable() {
- return !isReadOnly();
- }
-
- /**
- * Sets the closable status for the sub window. If a sub window is closable
- * it typically shows an X in the upper right corner. Clicking on the X
- * sends a close event to the server. Setting closable to false will remove
- * the X from the sub window and prevent the user from closing the window.
- *
- * Note! For historical reasons readonly controls the closability of the sub
- * window and therefore readonly and closable affect each other. Setting
- * readonly to true will set closable to false and vice versa.
- * <p/>
- * Closable only applies to sub windows, not to browser level windows.
- *
- * @param closable
- * determines if the sub window can be closed by the user.
- */
- public void setClosable(boolean closable) {
- setReadOnly(!closable);
- }
-
- /**
- * Indicates whether a sub window can be dragged or not. By default a sub
- * window is draggable.
- * <p/>
- * Draggable only applies to sub windows, not to browser level windows.
- *
- * @param draggable
- * true if the sub window can be dragged by the user
- */
- public boolean isDraggable() {
- return getState().isDraggable();
- }
-
- /**
- * Enables or disables that a sub window can be dragged (moved) by the user.
- * By default a sub window is draggable.
- * <p/>
- * Draggable only applies to sub windows, not to browser level windows.
- *
- * @param draggable
- * true if the sub window can be dragged by the user
- */
- public void setDraggable(boolean draggable) {
- getState().setDraggable(draggable);
- requestRepaint();
- }
-
- /*
- * Actions
- */
- protected CloseShortcut closeShortcut;
-
- /**
- * Makes is possible to close the window by pressing the given
- * {@link KeyCode} and (optional) {@link ModifierKey}s.<br/>
- * Note that this shortcut only reacts while the window has focus, closing
- * itself - if you want to close a subwindow from a parent window, use
- * {@link #addAction(com.vaadin.event.Action)} of the parent window instead.
- *
- * @param keyCode
- * the keycode for invoking the shortcut
- * @param modifiers
- * the (optional) modifiers for invoking the shortcut, null for
- * none
- */
- public void setCloseShortcut(int keyCode, int... modifiers) {
- if (closeShortcut != null) {
- removeAction(closeShortcut);
- }
- closeShortcut = new CloseShortcut(this, keyCode, modifiers);
- addAction(closeShortcut);
- }
-
- /**
- * Removes the keyboard shortcut previously set with
- * {@link #setCloseShortcut(int, int...)}.
- */
- public void removeCloseShortcut() {
- if (closeShortcut != null) {
- removeAction(closeShortcut);
- closeShortcut = null;
- }
- }
-
- /**
- * A {@link ShortcutListener} specifically made to define a keyboard
- * shortcut that closes the window.
- *
- * <pre>
- * <code>
- * // within the window using helper
- * subWindow.setCloseShortcut(KeyCode.ESCAPE, null);
- *
- * // or globally
- * getWindow().addAction(new Window.CloseShortcut(subWindow, KeyCode.ESCAPE));
- * </code>
- * </pre>
- *
- */
- public static class CloseShortcut extends ShortcutListener {
- protected Window window;
-
- /**
- * Creates a keyboard shortcut for closing the given window using the
- * shorthand notation defined in {@link ShortcutAction}.
- *
- * @param window
- * to be closed when the shortcut is invoked
- * @param shorthandCaption
- * the caption with shortcut keycode and modifiers indicated
- */
- public CloseShortcut(Window window, String shorthandCaption) {
- super(shorthandCaption);
- this.window = window;
- }
-
- /**
- * Creates a keyboard shortcut for closing the given window using the
- * given {@link KeyCode} and {@link ModifierKey}s.
- *
- * @param window
- * to be closed when the shortcut is invoked
- * @param keyCode
- * KeyCode to react to
- * @param modifiers
- * optional modifiers for shortcut
- */
- public CloseShortcut(Window window, int keyCode, int... modifiers) {
- super(null, keyCode, modifiers);
- this.window = window;
- }
-
- /**
- * Creates a keyboard shortcut for closing the given window using the
- * given {@link KeyCode}.
- *
- * @param window
- * to be closed when the shortcut is invoked
- * @param keyCode
- * KeyCode to react to
- */
- public CloseShortcut(Window window, int keyCode) {
- this(window, keyCode, null);
- }
-
- @Override
- public void handleAction(Object sender, Object target) {
- window.close();
- }
- }
-
- /**
- * Note, that focus/blur listeners in Window class are only supported by sub
- * windows. Also note that Window is not considered focused if its contained
- * component currently has focus.
- *
- * @see com.vaadin.event.FieldEvents.FocusNotifier#addListener(com.vaadin.event.FieldEvents.FocusListener)
- */
-
- @Override
- public void addListener(FocusListener listener) {
- addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener,
- FocusListener.focusMethod);
- }
-
- @Override
- public void removeListener(FocusListener listener) {
- removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener);
- }
-
- /**
- * Note, that focus/blur listeners in Window class are only supported by sub
- * windows. Also note that Window is not considered focused if its contained
- * component currently has focus.
- *
- * @see com.vaadin.event.FieldEvents.BlurNotifier#addListener(com.vaadin.event.FieldEvents.BlurListener)
- */
-
- @Override
- public void addListener(BlurListener listener) {
- addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener,
- BlurListener.blurMethod);
- }
-
- @Override
- public void removeListener(BlurListener listener) {
- removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener);
- }
-
- /**
- * {@inheritDoc}
- *
- * If the window is a sub-window focusing will cause the sub-window to be
- * brought on top of other sub-windows on gain keyboard focus.
- */
-
- @Override
- public void focus() {
- /*
- * When focusing a sub-window it basically means it should be brought to
- * the front. Instead of just moving the keyboard focus we focus the
- * window and bring it top-most.
- */
- super.focus();
- bringToFront();
- }
-
- @Override
- public WindowState getState() {
- return (WindowState) super.getState();
- }
-}