package org.activityinfo.ui.client.page.common.toolbar;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* 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/gpl-3.0.html>.
* #L%
*/
import com.extjs.gxt.ui.client.event.*;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.button.SplitButton;
import com.extjs.gxt.ui.client.widget.button.ToggleButton;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import com.extjs.gxt.ui.client.widget.menu.MenuItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.shared.Log;
import org.activityinfo.ui.client.style.legacy.icon.IconImageBundle;
/**
* Convenience subclass for the GXT toolbar that directs all tool actions
* through a common choke point implementing
* {@link org.activityinfo.ui.client.page.common.toolbar.ActionListener}
* <p/>
* Also centralizes look&feel of common buttons like New, Edit, Refresh, Save,
* etc.
*/
public class ActionToolBar extends ToolBar implements Listener<ButtonEvent> {
private ActionListener listener;
private SplitButton saveButton;
private Button addButton;
private Button removeButton;
private Button editButton;
private Button uploadButton;
private Button printButton;
public ActionToolBar() {
}
public ActionToolBar(ActionListener listener) {
this.listener = listener;
setEnabled(listener != null);
}
/**
* @param actionId The id to be provided to the
* {@link org.activityinfo.ui.client.page.common.toolbar.ActionListener}
* if the button is selected
* @param text Text of the button
* @param icon Icon of the button. See
* {@link org.activityinfo.ui.client.style.legacy.icon.IconImageBundle}
*/
public Button addButton(String actionId, String text, AbstractImagePrototype icon) {
Button button = new Button(text, icon);
button.setItemId(actionId);
button.addListener(Events.Select, this);
add(button);
return button;
}
public void add(Iterable<? extends Component> buttons) {
for (Component component : buttons) {
add(component);
}
}
public ToggleButton addToggleButton(String actionId, String text, AbstractImagePrototype icon) {
ToggleButton button = new ToggleButton(text, icon);
button.setItemId(actionId);
button.addListener(Events.Select, this);
add(button);
return button;
}
public ToggleButtonBuilder addToggleButton() {
return new ToggleButtonBuilder();
}
public void addCreateButton() {
this.addButton = addButton(UIActions.ADD, I18N.CONSTANTS.addItem(), IconImageBundle.ICONS.add());
}
public void addPrintButton() {
addButton(UIActions.PRINT, I18N.CONSTANTS.printForm(), IconImageBundle.ICONS.printer());
}
public void addUploadButton() {
addButton(UIActions.UPLOAD, I18N.CONSTANTS.upload(), IconImageBundle.ICONS.up());
}
public void addEditButton() {
addEditButton(IconImageBundle.ICONS.editPage());
}
public void addEditButton(AbstractImagePrototype icon) {
this.editButton = addButton(UIActions.EDIT, I18N.CONSTANTS.edit(), icon);
}
public void addDeleteButton() {
this.removeButton = addButton(UIActions.DELETE, I18N.CONSTANTS.delete(), IconImageBundle.ICONS.delete());
}
public void addDeleteButton(String text) {
this.removeButton = addButton(UIActions.DELETE, text, IconImageBundle.ICONS.delete());
}
public void addExcelExportButton() {
addButton(UIActions.EXPORT, I18N.CONSTANTS.export(), IconImageBundle.ICONS.excel());
}
public void addRefreshButton() {
addButton(UIActions.REFRESH, I18N.CONSTANTS.refreshPreview(), IconImageBundle.ICONS.refresh());
}
public void addSaveSplitButton() {
saveButton = new SplitButton(I18N.CONSTANTS.save());
saveButton.setIcon(IconImageBundle.ICONS.save());
saveButton.setItemId(UIActions.SAVE);
saveButton.addListener(Events.Select, this);
Menu menu = new Menu();
MenuItem saveItem = new MenuItem(I18N.CONSTANTS.save(),
IconImageBundle.ICONS.save(),
new SelectionListener<MenuEvent>() {
@Override
public void componentSelected(MenuEvent ce) {
if (listener != null) {
listener.onUIAction(UIActions.SAVE);
}
}
});
menu.add(saveItem);
MenuItem discardItem = new MenuItem(I18N.CONSTANTS.discardChanges(),
IconImageBundle.ICONS.cancel(),
new SelectionListener<MenuEvent>() {
@Override
public void componentSelected(MenuEvent ce) {
listener.onUIAction(UIActions.DISCARD_CHANGES);
}
});
menu.add(discardItem);
saveButton.setMenu(menu);
add(saveButton);
}
public void setDirty(boolean dirty) {
if (saveButton != null) {
saveButton.setEnabled(dirty);
if (dirty) {
saveButton.setText(I18N.CONSTANTS.save());
saveButton.setIcon(IconImageBundle.ICONS.save());
} else {
saveButton.setText(I18N.CONSTANTS.saved());
}
}
}
@Override
public void handleEvent(ButtonEvent be) {
if (listener != null) {
listener.onUIAction(be.getButton().getItemId());
}
}
public void setPrintEnabled(boolean enabled) {
if (printButton != null) {
printButton.setEnabled(enabled);
}
}
public void setUploadEnabled(boolean enabled) {
if (uploadButton != null) {
uploadButton.setEnabled(enabled);
}
}
public void setActionEnabled(String actionId, boolean enabled) {
Component c = getItemByItemId(actionId);
if (c != null) {
c.setEnabled(enabled);
} else {
Log.warn("ActionToolBar: setActionEnabled(" + actionId + ") was called, but button is not present");
}
}
public void setDeleteEnabled(boolean enabled) {
if (removeButton != null) {
removeButton.setEnabled(enabled);
}
}
public void setAddEnabled(boolean enabled) {
if (addButton != null) {
addButton.setEnabled(enabled);
}
}
public void setUpdateEnabled(boolean enabled) {
if (editButton != null) {
editButton.setEnabled(enabled);
}
}
public void setListener(ActionListener listener) {
this.listener = listener;
setEnabled(listener != null);
}
public void addLockedPeriodsButton() {
addButton(UIActions.SHOW_LOCKED_PERIODS, I18N.CONSTANTS.timeLocks(), IconImageBundle.ICONS.lockedPeriod());
}
public class ToggleButtonBuilder {
private ToggleButton button;
public ToggleButtonBuilder() {
button = new ToggleButton();
add(button);
}
public ToggleButtonBuilder withText(String text) {
button.setText(text);
return this;
}
public ToggleButtonBuilder withIcon(AbstractImagePrototype icon) {
button.setIcon(icon);
return this;
}
public ToggleButtonBuilder withListener(SelectionListener<ButtonEvent> listener) {
button.addSelectionListener(listener);
return this;
}
public ToggleButtonBuilder inGroup(String group) {
button.setToggleGroup(group);
return this;
}
}
public void addImportButton() {
addButton(UIActions.IMPORT, I18N.CONSTANTS.importText(), IconImageBundle.ICONS.importIcon());
}
}