package org.jbpm.formbuilder.client.effect.view;
import java.util.List;
import org.jbpm.formapi.client.CommonGlobals;
import org.jbpm.formapi.client.FormBuilderException;
import org.jbpm.formapi.client.bus.ui.NotificationEvent;
import org.jbpm.formapi.client.bus.ui.NotificationEvent.Level;
import org.jbpm.formapi.common.panels.ConfirmDialog;
import org.jbpm.formbuilder.client.FormBuilderGlobals;
import org.jbpm.formbuilder.client.FormBuilderService;
import org.jbpm.formbuilder.client.messages.I18NConstants;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.HTMLTable.RowFormatter;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
public class FilesDataPanel extends ScrollPanel {
private final EventBus bus = CommonGlobals.getInstance().getEventBus();
private final I18NConstants i18n = FormBuilderGlobals.getInstance().getI18n();
private final FormBuilderService server = FormBuilderGlobals.getInstance().getService();
private boolean isEmpty = true;
FlexTable table = new FlexTable();
public FilesDataPanel() {
setHeight("200px");
setWidget(table);
}
public void setFiles(List<String> urls) {
table.clear();
if (urls != null && !urls.isEmpty()) {
isEmpty = false;
for (int row = 0; row < urls.size(); row++) {
final String url = urls.get(row);
final FocusPanel labelPanel = createLabelPanel(url);
table.setWidget(row, 0, labelPanel);
Element rowElem = table.getRowFormatter().getElement(row);
table.setWidget(row, 1, createDeleteButton(rowElem, url));
}
} else {
table.setWidget(0, 0, new Label(i18n.NoFilesFound()));
}
}
private FocusPanel createLabelPanel(final String url) {
final FocusPanel panel = new FocusPanel();
panel.setStyleName("fbFilesDataPanel");
panel.addFocusHandler(new FocusHandler() {
@Override
public void onFocus(FocusEvent event) {
if (panel.getStyleName().equals("fbFilesDataPanelSelected")) {
panel.setStyleName("fbFilesDataPanel");
setSelection(null);
} else {
deselectAllLabels();
panel.setStyleName("fbFilesDataPanelSelected");
setSelection(url);
}
}
});
panel.setWidget(new Label(toFileName(url)));
return panel;
}
private void deselectAllLabels() {
for (int row = 0; row < table.getRowCount(); row++) {
Widget widget = table.getWidget(row, 0);
if (widget != null && widget.getStyleName().equals("fbFilesDataPanelSelected")) {
widget.setStyleName("fbFilesDataPanel");
}
}
}
private Button createDeleteButton(final Element rowElem, final String url) {
return new Button(i18n.RemoveButton(), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
ConfirmDialog dialog = new ConfirmDialog(i18n.WarningDeleteFile());
dialog.addOkButtonHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
try {
server.deleteFile(toFileName(url));
RowFormatter formatter = table.getRowFormatter();
int rowNumber = 0;
for (; rowNumber < table.getRowCount(); rowNumber++) {
if (formatter.getElement(rowNumber).equals(rowElem)) {
break;
}
}
table.removeRow(rowNumber);
} catch (FormBuilderException e) {
bus.fireEvent(new NotificationEvent(Level.ERROR, i18n.Error(e.getMessage()), e));
}
}
});
dialog.show();
}
});
}
private String selection = null;
public String getSelection() {
return selection;
}
public void setSelection(String selection) {
this.selection = selection;
}
public String toFileName(String url) {
return url.substring(url.lastIndexOf('/'));
}
public void addNewFile(String url) {
if (!contains(url)) {
final FocusPanel labelPanel = createLabelPanel(url);
if (isEmpty) {
table.clear();
}
int row = table.getRowCount();
table.setWidget(row, 0, labelPanel);
Element rowElem = table.getRowFormatter().getElement(row);
table.setWidget(row, 1, createDeleteButton(rowElem, url));
labelPanel.setFocus(true);
setSelection(url);
}
}
private boolean contains(String url) {
String fileName = toFileName(url);
for (int row = 0; row < table.getRowCount(); row++) {
FocusPanel labelPanel = (FocusPanel) table.getWidget(row, 0);
if (labelPanel != null && labelPanel.getWidget() != null) {
Label label = (Label) labelPanel.getWidget();
if (label.getText().equals(fileName)) {
return true;
}
}
}
return false;
}
}