diff options
Diffstat (limited to 'gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java')
-rw-r--r-- | gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java new file mode 100644 index 0000000000..30b8408ff8 --- /dev/null +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java @@ -0,0 +1,87 @@ +// Copyright (C) 2009 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.google.gwtexpui.user.client; + +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.SimplePanel; + +/** + * Hosts a single {@link View}. + * <p> + * View instances are attached inside of an invisible DOM node, permitting their + * <code>onLoad()</code> method to be invoked and to update the DOM prior to the + * elements being made visible in the UI. + * <p> + * Complaint View instances must invoke {@link View#display()} once the DOM is + * ready for presentation. + */ +public class ViewSite<V extends View> extends Composite { + private final FlowPanel main; + private SimplePanel current; + private SimplePanel next; + + public ViewSite() { + main = new FlowPanel(); + initWidget(main); + } + + /** Get the current view; null if there is no view being displayed. */ + @SuppressWarnings("unchecked") + public V getView() { + return current != null ? (V) current.getWidget() : null; + } + + /** + * Set the next view to display. + * <p> + * The view will be attached to the DOM tree within a hidden container, + * permitting its <code>onLoad()</code> method to execute and update the DOM + * without the user seeing the result. + * + * @param view the next view to display. + */ + public void setView(final V view) { + if (next != null) { + main.remove(next); + } + view.site = this; + next = new SimplePanel(); + next.setVisible(false); + main.add(next); + next.add(view); + } + + /** + * Invoked after the view becomes the current view and has been made visible. + * + * @param view the view being displayed. + */ + protected void onShowView(final V view) { + } + + @SuppressWarnings("unchecked") + final void swap(final View v) { + if (next != null && next.getWidget() == v) { + if (current != null) { + main.remove(current); + } + current = next; + next = null; + current.setVisible(true); + onShowView((V) v); + } + } +} |