package com.iambookmaster.client.paragraph;
import java.util.HashMap;
import java.util.Iterator;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.iambookmaster.client.Images;
import com.iambookmaster.client.StatusPanel;
import com.iambookmaster.client.beans.Paragraph;
import com.iambookmaster.client.common.ScrollContainer;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.model.Model;
import com.iambookmaster.client.model.ParagraphListener;
import com.iambookmaster.client.model.SettingsListener;
public class ParagraphsListView extends ScrollContainer {
public static final String STYLE_DRAFT = "loc_status_draft";
public static final String STYLE_FINAL = "loc_status_final";
public static final String STYLE_PROPOSAL = "loc_status_prop";
private static final String STYLE_SELECTED = "location_list_item_selected";
private VerticalPanel mainPanel;
private Model model;
private ParagraphListener locationListener;
private ParagraphWidget selected;
private boolean activationNeed=true;
private boolean showNumbers;
private boolean reloadOnActivation;
private boolean active;
private HashMap<Paragraph, ParagraphWidget> items;
public void deactivate() {
active=false;
}
public void activate() {
active=true;
if (activationNeed) {
activationNeed = false;
resetHeight();
}
if (reloadOnActivation) {
reloadOnActivation = false;
reloadTree();
}
}
public void activateLater() {
activationNeed = true;
}
public ParagraphsListView(Model mod) {
mainPanel = new VerticalPanel();
mainPanel.setSize("100%", "100%");
mainPanel.setSpacing(3);
addStyleName("location_list");
setScrollWidget(mainPanel);
this.model = mod;
locationListener = new ParagraphListener() {
public void addNewParagraph(Paragraph location) {
ParagraphWidget widget = new ParagraphWidget(location);
int pos = getWidgetCount();
mainPanel.insert(widget,pos-1);
items.put(widget.paragraph, widget);
mainPanel.setCellHeight(widget,"1%");
}
public void edit(Paragraph location) {
}
public void refreshAll() {
if (active) {
reloadTree();
} else {
reloadOnActivation=true;
}
}
public void select(Paragraph location) {
ParagraphWidget widget = items.get(location);
if (widget != null) {
widget.select();
}
}
public void unselect(Paragraph location) {
ParagraphWidget widget = items.get(location);
if (widget != null) {
widget.unselect();
}
}
public void update(Paragraph location) {
ParagraphWidget widget = items.get(location);
if (widget != null) {
widget.apply(location);
}
}
public void remove(Paragraph location) {
int l = mainPanel.getWidgetCount();
for (int i = 0; i < l; i++) {
Widget widget = mainPanel.getWidget(i);
if (widget instanceof ParagraphWidget) {
ParagraphWidget locationWidget = (ParagraphWidget) widget;
if (locationWidget.paragraph==location) {
mainPanel.remove(i);
break;
}
}
}
}
};
model.addParagraphListener(locationListener);
showNumbers = model.getSettings().isShowParagraphNumbers();
model.addSettingsListener(new SettingsListener(){
public void settingsWereUpated() {
if (showNumbers != model.getSettings().isShowParagraphNumbers()) {
showNumbers = model.getSettings().isShowParagraphNumbers();
for (int i = 0; i < mainPanel.getWidgetCount(); i++) {
Widget widget = mainPanel.getWidget(i);
if (widget instanceof ParagraphWidget) {
ParagraphWidget locationWidget = (ParagraphWidget) widget;
locationWidget.apply(locationWidget.paragraph);
}
}
}
}
});
reloadTree();
}
private void removeLocation(Paragraph location, ParagraphWidget widget) {
if (Window.confirm(AppLocale.getAppConstants().confirmRemove())) {
model.removeParagraph(location);
}
}
private void reloadTree() {
if (items==null) {
items = new HashMap<Paragraph, ParagraphWidget>();
} else {
items.clear();
}
mainPanel.clear();
new Timer() {
private Iterator<Paragraph> iterator = model.getParagraphs().iterator();
@Override
public void run() {
int count=50;
while (iterator.hasNext()) {
ParagraphWidget widget = new ParagraphWidget(iterator.next());
mainPanel.add(widget);
items.put(widget.paragraph, widget);
mainPanel.setCellHeight(widget,"1%");
if (count--<0) {
return;
}
}
cancel();
HTML html = new HTML(" ");
html.setStyleName("location_list_filler");
mainPanel.add(html);
mainPanel.setCellHeight(html,"99%");
StatusPanel.addMessage("reloadTree-end");
}
}.scheduleRepeating(100);
}
public Paragraph getSelected() {
return selected==null ? null : selected.paragraph;
}
public class ParagraphWidget extends HorizontalPanel{
private Image icon;
private Label name;
private Image commercial;
private Image remove;
private Paragraph paragraph;
public ParagraphWidget(Paragraph location) {
setSize("100%", "100%");
setSpacing(3);
ClickHandler clickHandler = new ClickHandler() {
public void onClick(ClickEvent event) {
if (event.getSource()==remove) {
removeLocation(paragraph,ParagraphWidget.this);
} else {
select();
}
}
};
icon = new Image();
icon.addClickHandler(clickHandler);
add(icon);
setCellWidth(icon, "1%");
name = new Label();
name.setWordWrap(false);
name.addClickHandler(clickHandler);
add(name);
setCellWidth(name, "1%");
commercial = new Image(Images.COMMERCIAL);
add(commercial);
setCellWidth(commercial, "1%");
remove = new Image(Images.REMOVE);
remove.addClickHandler(clickHandler);
remove.setTitle(AppLocale.getAppConstants().titleRemove());
add(remove);
setCellWidth(remove, "99%");
apply(location);
}
private void apply(Paragraph location) {
this.paragraph = location;
icon.setUrl(ParagraphsMapEditor.getParagraphTypeURL(location));
if (showNumbers) {
name.setText(location.getNumber()+" "+location.getName());
} else {
name.setText(location.getName());
}
commercial.setVisible(location.isCommercial());
highlight(false);
}
private void highlight(boolean highlight) {
if (highlight) {
setStyleName(STYLE_SELECTED);
} else {
switch (paragraph.getStatus()) {
case Model.STATUS_DRAFT:
setStyleName(STYLE_DRAFT);
break;
case Model.STATUS_FINAL:
setStyleName(STYLE_FINAL);
break;
default:
setStyleName(STYLE_PROPOSAL);
}
}
}
private void select() {
if (selected != this) {
if (selected != null) {
selected.unselect();
}
selected = this;
highlight(true);
model.selectParagraph(paragraph, locationListener);
}
}
private void unselect() {
if (selected==this) {
selected = null;
}
highlight(false);
model.unselectParagraph(paragraph, locationListener);
}
}
}