/*
* Copyright (c) 2011 PonySDK
* Owners:
* Luciano Broussal <luciano.broussal AT gmail.com>
* Mathieu Barbier <mathieu.barbier AT gmail.com>
* Nicolas Ciaravola <nicolas.ciaravola.pro AT gmail.com>
*
* WebSite:
* http://code.google.com/p/pony-sdk/
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.ponysdk.core.terminal.ui;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.OptGroupElement;
import com.google.gwt.dom.client.OptionElement;
import com.google.gwt.dom.client.SelectElement;
import com.google.gwt.user.client.ui.ListBox;
import com.ponysdk.core.model.ClientToServerModel;
import com.ponysdk.core.model.ServerToClientModel;
import com.ponysdk.core.terminal.UIBuilder;
import com.ponysdk.core.terminal.instruction.PTInstruction;
import com.ponysdk.core.terminal.model.BinaryModel;
import com.ponysdk.core.terminal.model.ReaderBuffer;
public class PTListBox extends PTFocusWidget<ListBox> {
@Override
protected ListBox createUIObject() {
return new ListBox();
}
@Override
public void create(final ReaderBuffer buffer, final int objectId, final UIBuilder uiService) {
super.create(buffer, objectId, uiService);
addHandler(uiService);
}
private void addHandler(final UIBuilder uiService) {
uiObject.addChangeHandler(event -> {
final int selectedIndex = uiObject.getSelectedIndex();
if (selectedIndex == -1) {
final PTInstruction eventInstruction = new PTInstruction(getObjectID());
eventInstruction.put(ClientToServerModel.HANDLER_CHANGE, "-1");
uiService.sendDataToServer(uiObject, eventInstruction);
} else {
String selectedIndexes = selectedIndex + "";
for (int i = 0; i < uiObject.getItemCount(); i++) {
if (uiObject.isItemSelected(i)) {
if (i != selectedIndex) {
selectedIndexes += "," + i;
}
}
}
final PTInstruction eventInstruction = new PTInstruction(getObjectID());
eventInstruction.put(ClientToServerModel.HANDLER_CHANGE, selectedIndexes);
uiService.sendDataToServer(uiObject, eventInstruction);
}
});
}
@Override
public boolean update(final ReaderBuffer buffer, final BinaryModel binaryModel) {
final int modelOrdinal = binaryModel.getModel().ordinal();
if (ServerToClientModel.CLEAR.ordinal() == modelOrdinal) {
uiObject.clear();
return true;
} else if (ServerToClientModel.ITEM_INSERTED.ordinal() == modelOrdinal) {
final String item = binaryModel.getStringValue() != null ? binaryModel.getStringValue() : "";
final BinaryModel indexModel = buffer.readBinaryModel();
if (ServerToClientModel.INDEX.equals(indexModel.getModel())) {
uiObject.insertItem(item, indexModel.getIntValue());
} else {
buffer.rewind(indexModel);
uiObject.addItem(item);
}
return true;
} else if (ServerToClientModel.ITEM_ADD.ordinal() == modelOrdinal) {
final String items = binaryModel.getStringValue();
// ServerToClientModel.ITEM_GROUP
final String groupName = buffer.readBinaryModel().getStringValue();
final SelectElement select = uiObject.getElement().cast();
final OptGroupElement groupElement = Document.get().createOptGroupElement();
groupElement.setLabel(groupName);
final String[] tokens = items.split(";");
for (final String token : tokens) {
final OptionElement optElement = Document.get().createOptionElement();
optElement.setInnerText(token);
groupElement.appendChild(optElement);
}
select.appendChild(groupElement);
return true;
} else if (ServerToClientModel.ITEM_UPDATED.ordinal() == modelOrdinal) {
final String item = binaryModel.getStringValue() != null ? binaryModel.getStringValue() : "";
// ServerToClientModel.INDEX
final int index = buffer.readBinaryModel().getIntValue();
uiObject.setItemText(index, item);
return true;
} else if (ServerToClientModel.ITEM_REMOVED.ordinal() == modelOrdinal) {
uiObject.removeItem(binaryModel.getIntValue());
return true;
} else if (ServerToClientModel.SELECTED.ordinal() == modelOrdinal) {
final boolean selected = binaryModel.getBooleanValue();
// ServerToClientModel.INDEX
final int index = buffer.readBinaryModel().getIntValue();
if (index == -1) uiObject.setSelectedIndex(index);
else uiObject.setItemSelected(index, selected);
return true;
} else if (ServerToClientModel.VISIBLE_ITEM_COUNT.ordinal() == modelOrdinal) {
uiObject.setVisibleItemCount(binaryModel.getIntValue());
return true;
} else if (ServerToClientModel.MULTISELECT.ordinal() == modelOrdinal) {
uiObject.setMultipleSelect(binaryModel.getBooleanValue());
return true;
} else {
return super.update(buffer, binaryModel);
}
}
}