/*
* Copyright 2010 kk-electronic a/s.
*
* This file is part of KKPortal.
*
* KKPortal is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KKPortal 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with KKPortal. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kk_electronic.kkportal.core.ui;
import java.util.List;
import com.google.gwt.dom.client.Style.Cursor;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.Range;
import com.google.gwt.view.client.RangeChangeEvent;
import com.google.gwt.view.client.RowCountChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.RangeChangeEvent.Handler;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.kk_electronic.kkportal.core.tabs.TabInfo;
import com.kk_electronic.kkportal.core.tabs.TabsModel;
import com.kk_electronic.kkportal.res.Resources;
public class TabDisplay implements HasData<TabInfo> {
@UiField
LayoutPanel panel;
private SelectionModel<? super TabInfo> selectionModel;
private final EventBus eventBus;
private Range range;
private int rowCount;
private boolean isRowCountExact;
private final TabsModel tabInfoProvider;
private final Provider<Tab> tabProvider;
private Widget widget;
private Image newTabButton;
private final Resources resources;
public static interface UIBinder extends UiBinder<Widget, TabDisplay> { }
@Inject
public TabDisplay(TabsModel tabInfoProvider, EventBus eventBus,
Resources resources, Provider<Tab> tabProvider, UIBinder binder) {
this.tabInfoProvider = tabInfoProvider;
this.eventBus = eventBus;
this.resources = resources;
this.tabProvider = tabProvider;
this.widget = binder.createAndBindUi(this);
selectionModel = tabInfoProvider.getSelectionModel();
tabInfoProvider.addDataDisplay(this);
newTabButton = new Image(resources.addtab());
newTabButton.getElement().getStyle().setCursor(Cursor.POINTER);
newTabButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
makeNewTabBottom();
}
});
}
public Widget asWidget() {
return widget;
}
@Override
public SelectionModel<? super TabInfo> getSelectionModel() {
return selectionModel;
}
@Override
public void setRowData(int start, List<? extends TabInfo> values) {
assert start == 0 : "TabDisplay does not support partial viewing";
panel.clear();
int margin = 10;
int totalWidth = 2*margin;
int tabWidth = tabInfoProvider.getMaxWidth();
int i = values.size();
for (TabInfo info : values) {
final Tab t = tabProvider.get();
t.setInfo(info);
t.setHandler(this);
panel.add(t);
t.getElement().getStyle().setZIndex(i--);
if (selectionModel != null && selectionModel.isSelected(info)) {
t.setSelected();
t.getElement().getStyle().setZIndex(values.size());
}
panel.setWidgetBottomHeight(t, 0, Unit.EM, 1, Unit.EM);
panel.setWidgetLeftWidth(t, totalWidth, Unit.PX, tabWidth, Unit.PX);
totalWidth += tabWidth - margin;
}
panel.add(newTabButton);
panel.setWidgetLeftWidth(newTabButton, totalWidth+5, Unit.PX, margin*2, Unit.PX);
panel.setWidgetTopBottom(newTabButton, 3, Unit.PX, 0, Unit.PX);
/*
* now this is a really stupid hack to fix the fact that LayoutPanel clears the height and width
* of the element.
*/
newTabButton.setPixelSize(resources.addtab().getWidth(), resources.addtab().getHeight());
}
@Override
public void setSelectionModel(SelectionModel<? super TabInfo> selectionModel) {
this.selectionModel = selectionModel;
}
@Override
public void setVisibleRangeAndClearData(Range range,
boolean forceRangeChangeEvent) {
Range oldrange = this.range;
this.range = range;
if (forceRangeChangeEvent || (!range.equals(oldrange))) {
RangeChangeEvent.fire(this, range);
}
}
@Override
public HandlerRegistration addRangeChangeHandler(Handler handler) {
return eventBus.addHandlerToSource(RangeChangeEvent.getType(), this,
handler);
}
@Override
public HandlerRegistration addRowCountChangeHandler(
com.google.gwt.view.client.RowCountChangeEvent.Handler handler) {
return eventBus.addHandlerToSource(RowCountChangeEvent.getType(), this,
handler);
}
@Override
public int getRowCount() {
return rowCount;
}
@Override
public Range getVisibleRange() {
return range;
}
@Override
public boolean isRowCountExact() {
return isRowCountExact;
}
@Override
public void setRowCount(int count) {
setRowCount(count, true);
}
@Override
public void setRowCount(int count, boolean isExact) {
this.rowCount = count;
this.isRowCountExact = isExact;
}
@Override
public void setVisibleRange(Range range) {
this.range = range;
}
@Override
public void setVisibleRange(int start, int length) {
this.range = new Range(start, length);
}
@Override
public void fireEvent(GwtEvent<?> event) {
eventBus.fireEventFromSource(event, this);
}
@Override
public TabInfo getVisibleItem(int indexOnPage) {
return null;
}
@Override
public int getVisibleItemCount() {
return 0;
}
@Override
public Iterable<TabInfo> getVisibleItems() {
return null;
}
@Override
public HandlerRegistration addCellPreviewHandler(
com.google.gwt.view.client.CellPreviewEvent.Handler<TabInfo> handler) {
return null;
}
private void makeNewTabBottom() {
// create tabinfo
// insert tabinfo into local (this class) store
final Tab to = findTab(tabInfoProvider.createEmptyLocalTab());
to.setEdit(true);
}
public void onEditTabNameClick(final Tab tab,String newname) {
tab.getInfo().setName(newname);
tabInfoProvider.updateTab(tab.getInfo());
}
private Tab findTab(TabInfo tabInfo) {
for (Widget widget : panel) {
if (widget instanceof Tab) {
Tab tab = (Tab) widget;
if (tab.getInfo().getId().equals(tabInfo.getId())) {
return tab;
}
}
}
return null;
}
/**
* @param tab
*/
public void deletetab(Tab tab) {
tabInfoProvider.deleteTab(tab.getInfo());
}
}