/*
* Copyright (C) 2010 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.incad.kramerius.editor.client.view;
import cz.incad.kramerius.editor.client.EditorConstants;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Jan Pokorsky
*/
public final class SaveViewImpl<T> implements SaveView<T> {
interface Binder extends UiBinder<Widget, SaveViewImpl> {}
interface StyleAccess extends CssResource {
String listItem();
String listItemEven();
String listItemOdd();
}
private static final EditorConstants I18N = GWT.create(EditorConstants.class);
private static Binder uiBinder = GWT.create(Binder.class);
private SaveView.Callback callback;
private Renderer<String, T> renderer;
private List<T> saveables;
private Widget saveViewWidget;
private DialogBox dialogBox;
@UiField Button okButton;
@UiField Button discardButton;
@UiField FlowPanel saveablePanel;
@UiField ScrollPanel scrollPanel;
@UiField StyleAccess style;
public SaveViewImpl() {
this.saveViewWidget = (Widget) uiBinder.createAndBindUi(this);
}
@Override
public void setSaveables(List<T> saveables) {
this.saveablePanel.clear();
int saveablesSize = saveables.size();
if (saveablesSize == 0) {
this.saveablePanel.add(new Label(I18N.nothingToSaveLabel()));
this.okButton.setEnabled(false);
// for (int i = 0; i < 10; i++) {
// CheckBox checkBox = new CheckBox("Very long CheckBox Very long CheckBox");
// checkBox.setValue(Boolean.valueOf(true));
// checkBox.addStyleName(style.listItem());
// String styleName = saveablePanel.getWidgetCount() % 2 == 0
// ? style.listItemOdd(): style.listItemEven();
// checkBox.addStyleName(styleName);
// this.saveablePanel.add(checkBox);
// }
} else {
this.okButton.setEnabled(true);
}
for (T saveable : saveables) {
Widget saveableWidget = saveablesSize == 1
? createSaveableLabel(saveable)
: createSaveableCheckBox(saveable);
saveableWidget.addStyleName(style.listItem());
String styleName = saveablePanel.getWidgetCount() % 2 == 0
? style.listItemOdd(): style.listItemEven();
saveableWidget.addStyleName(styleName);
this.saveablePanel.add(saveableWidget);
}
this.saveables = saveables;
}
private Widget createSaveableLabel(T saveable) {
Label widget = new Label(this.renderer.render(saveable));
widget.setTitle(this.renderer.renderTitle(saveable));
return widget;
}
private Widget createSaveableCheckBox(T saveable) {
CheckBox widget = new CheckBox(this.renderer.render(saveable));
widget.setTitle(this.renderer.renderTitle(saveable));
widget.setValue(true);
return widget;
}
@Override
public List<T> getSelected() {
List selected = new ArrayList(this.saveablePanel.getWidgetCount());
int index = 0;
for (Widget w : this.saveablePanel) {
if (isSelected(w)) {
selected.add(this.saveables.get(index));
}
index++;
}
return selected;
}
private boolean isSelected(Widget w) {
if (w instanceof CheckBox) {
CheckBox checkBox = (CheckBox) w;
return checkBox.getValue();
} else if (w instanceof Label && !this.saveables.isEmpty()) {
return true;
}
return false;
}
@Override
public void setCallback(Callback callback) {
this.callback = callback;
}
@Override
public void setRenderer(Renderer<String, T> renderer) {
this.renderer = renderer;
}
@Override
public void setDiscardable(boolean discard) {
this.discardButton.setVisible(discard);
}
@Override
public void show() {
if (this.dialogBox == null) {
this.dialogBox = new DialogBox();
this.dialogBox.setText(I18N.saveViewTitle());
this.dialogBox.setAnimationEnabled(true);
this.dialogBox.setGlassEnabled(true);
this.dialogBox.setWidget(asWidget());
}
this.dialogBox.center();
this.okButton.setFocus(true);
}
@Override
public void hide() {
this.dialogBox.hide();
}
@Override
public Widget asWidget() {
return this.saveViewWidget;
}
@UiHandler({"okButton", "discardButton"})
void onOkClick(ClickEvent event) {
boolean discard = discardButton == event.getSource();
this.callback.onSaveViewCommit(discard);
}
@UiHandler("cancelButton")
void onCancelClick(ClickEvent event) {
hide();
}
}