blob: b0ee915338b163ad327eecb8149160f823c7f558 [file] [log] [blame]
// Copyright (C) 2008 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.gerrit.client.ui;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.projects.ThemeInfo;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtexpui.user.client.View;
/**
* A Screen layout with a header and a body.
*
* <p>The header is mainly a text title, but it can be decorated in the West, the East, and the
* FarEast by any Widget. The West and East decorations will surround the text on the left and right
* respectively, and the FarEast will be right justified to the right edge of the screen. The East
* decoration will expand to take up any extra space.
*/
public abstract class Screen extends View {
private Grid header;
private InlineLabel headerText;
private FlowPanel body;
private String token;
private boolean requiresSignIn;
private String windowTitle;
private Widget titleWidget;
private ThemeInfo theme;
private boolean setTheme;
protected Screen() {
initWidget(new FlowPanel());
setStyleName(Gerrit.RESOURCES.css().screen());
body = new FlowPanel();
}
@Override
protected void onLoad() {
super.onLoad();
if (header == null) {
onInitUI();
}
}
@Override
protected void onUnload() {
super.onUnload();
if (setTheme) {
Gerrit.THEMER.clear();
}
}
public void registerKeys() {}
private enum Cols {
West,
Title,
East,
FarEast
}
protected void onInitUI() {
final FlowPanel me = (FlowPanel) getWidget();
me.add(header = new Grid(1, Cols.values().length));
me.add(body);
headerText = new InlineLabel();
if (titleWidget == null) {
titleWidget = headerText;
}
FlowPanel title = new FlowPanel();
title.add(titleWidget);
title.setStyleName(Gerrit.RESOURCES.css().screenHeader());
header.setWidget(0, Cols.Title.ordinal(), title);
header.setStyleName(Gerrit.RESOURCES.css().screenHeader());
header
.getCellFormatter()
.setHorizontalAlignment(0, Cols.FarEast.ordinal(), HasHorizontalAlignment.ALIGN_RIGHT);
// force FarEast all the way to the right
header.getCellFormatter().setWidth(0, Cols.FarEast.ordinal(), "100%");
}
protected void setWindowTitle(final String text) {
windowTitle = text;
Gerrit.setWindowTitle(this, text);
}
protected void setPageTitle(final String text) {
final String old = headerText.getText();
if (text.isEmpty()) {
header.setVisible(false);
} else {
headerText.setText(text);
header.setVisible(true);
}
if (windowTitle == null || windowTitle.equals(old)) {
setWindowTitle(text);
}
}
protected void setHeaderVisible(boolean value) {
header.setVisible(value);
}
public void setTitle(final Widget w) {
titleWidget = w;
}
protected void setTitleEast(final Widget w) {
header.setWidget(0, Cols.East.ordinal(), w);
}
protected void setTitleFarEast(final Widget w) {
header.setWidget(0, Cols.FarEast.ordinal(), w);
}
protected void setTitleWest(final Widget w) {
header.setWidget(0, Cols.West.ordinal(), w);
}
protected void add(final Widget w) {
body.add(w);
}
protected FlowPanel getBody() {
return body;
}
protected void setTheme(final ThemeInfo t) {
theme = t;
}
/** Get the history token for this screen. */
public String getToken() {
return token;
}
/** Set the history token for this screen. */
public void setToken(final String t) {
assert t != null && !t.isEmpty();
token = t;
if (isCurrentView()) {
Gerrit.updateImpl(token);
}
}
/**
* If this view can display the given token, update it.
*
* @param newToken token the UI wants to show.
* @return true if this view can show the token immediately, false if not.
*/
public boolean displayToken(String newToken) {
return false;
}
/** Set whether or not {@link Gerrit#isSignedIn()} must be true. */
public final void setRequiresSignIn(final boolean b) {
requiresSignIn = b;
}
/** Does {@link Gerrit#isSignedIn()} have to be true to be on this screen? */
public final boolean isRequiresSignIn() {
return requiresSignIn;
}
public void onShowView() {
if (windowTitle != null) {
Gerrit.setWindowTitle(this, windowTitle);
}
Gerrit.EVENT_BUS.fireEvent(new ScreenLoadEvent(this));
Gerrit.setQueryString(null);
registerKeys();
if (theme != null) {
Gerrit.THEMER.set(theme);
setTheme = true;
} else {
Gerrit.THEMER.clear();
}
}
}