// Copyright 2010 Google Inc. All Rights Reseved.
//
// 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.testing.testify.risk.frontend.client.view.widgets;
import com.google.common.base.Function;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.testing.testify.risk.frontend.client.presenter.TaPagePresenter;
/**
* Navigation link widget. This control is a wrapper on top of a GWT Hyperlink widget,
* except that it enables you to disable the control as well as associate the link's target history
* token with a given project.
* <p>
* The widget has three CSS properties:
* tty-NavigationLink, which covers the entire widget.
* tty-NavigationLinkText, which covers just the link text (even the disabled text).
* tty-NavigationLinkTextDisabled, which covers the text when disabled.
*
* @author jimr@google.com (Jim Reardon)
*/
public class NavigationLink extends Composite implements HasText {
private final DeckPanel panel;
// The hyper link is displayed when the control is enabled; otherwise the fake link will be.
private final Label fakeLink;
private final Hyperlink realLink;
private long projectId;
private String targetHistoryToken;
private TaPagePresenter presenter;
private Function<Void, TaPagePresenter> createPresenterFunction;
private static final int WIDGET_ID_ENABLED = 0;
private static final int WIDGET_ID_DISABLED = 1;
private static final String NAV_STYLE_UNSELECTED = "tty-LeftNavItem";
private static final String NAV_STYLE_SELECTED = "tty-LeftNavItemSelected";
private static final String NAV_STYLE_DISABLED = "tty-LeftNavItemDisabled";
public NavigationLink() {
this("", -1, "", null);
}
public NavigationLink(String text, long projectId, String targetHistoryToken,
Function<Void, TaPagePresenter> createPresenterFunction) {
this.targetHistoryToken = targetHistoryToken;
this.projectId = projectId;
this.createPresenterFunction = createPresenterFunction;
panel = new DeckPanel();
SimplePanel fakeLinkPanel = new SimplePanel();
fakeLink = new Label(text);
fakeLinkPanel.add(fakeLink);
realLink = new Hyperlink(text, getHyperlinkTarget());
panel.add(realLink);
panel.add(fakeLinkPanel);
enable();
super.initWidget(panel);
}
public void setCreatePresenterFunction(Function<Void, TaPagePresenter> function) {
this.createPresenterFunction = function;
}
public TaPagePresenter getPresenter() {
if (presenter == null) {
presenter = createPresenterFunction.apply(null);
}
return presenter;
}
@Override
public void setText(String text) {
fakeLink.setText(text);
realLink.setText(text);
}
@Override
public String getText() {
return realLink.getText();
}
public void setProjectId(long projectId) {
this.projectId = projectId;
realLink.setTargetHistoryToken(getHyperlinkTarget());
}
public void setTargetHistoryToken(String token) {
this.targetHistoryToken = token;
realLink.setTargetHistoryToken(getHyperlinkTarget());
}
public String getHistoryTokenName() {
return targetHistoryToken;
}
/** Updates the hyperlink's target to encode project name and history token. */
private String getHyperlinkTarget() {
return "/" + projectId + "/" + targetHistoryToken;
}
public Hyperlink getHyperlink() {
return realLink;
}
public void enable() {
panel.setStyleName(NAV_STYLE_UNSELECTED);
panel.showWidget(WIDGET_ID_ENABLED);
}
public void select() {
panel.setStyleName(NAV_STYLE_SELECTED);
panel.showWidget(WIDGET_ID_ENABLED);
}
public void unSelect() {
enable();
}
public void disable() {
panel.setStyleName(NAV_STYLE_DISABLED);
panel.showWidget(WIDGET_ID_DISABLED);
}
}