/*
* Copyright 2011 JBoss Inc
*
* 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 org.jbpm.formapi.shared.api.items;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jbpm.formapi.shared.api.FormItemRepresentation;
import org.jbpm.formapi.shared.form.FormEncodingException;
import org.jbpm.formapi.shared.form.FormEncodingFactory;
import com.gwtent.reflection.client.Reflectable;
@Reflectable
public class TabbedPanelRepresentation extends FormItemRepresentation {
public class IndexedString {
private final int index;
private final String string;
public IndexedString(int index, String string) {
super();
this.index = index;
this.string = string;
}
public int getIndex() {
return index;
}
public String getString() {
return string;
}
@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (obj == null) return false;
if (!(obj instanceof IndexedString)) return false;
IndexedString other = (IndexedString) obj;
boolean equals = this.index == other.index;
if (!equals) return equals;
equals = (this.string == null && other.string == null) || (this.string != null && this.string.equals(other.string));
return equals;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 37 * result + this.index;
int aux = this.string == null ? 0 : this.string.hashCode();
result = 37 * result + aux;
return result;
}
}
private List<IndexedString> tabTitles = new ArrayList<IndexedString>();
private Map<IndexedString, FormItemRepresentation> tabContents = new HashMap<IndexedString, FormItemRepresentation>();
private String cssClassName;
private String id;
private String tabWidth;
public TabbedPanelRepresentation() {
super("tabbedPanel");
}
public void putTab(int index, String tabTitle, FormItemRepresentation tabContent) {
if (index >= tabTitles.size()) {
tabTitles.add(new IndexedString(index, tabTitle));
} else {
IndexedString myTitle = new IndexedString(index, tabTitle);
IndexedString prevTitle = tabTitles.get(index);
if (prevTitle == null) {
tabTitles.set(index, myTitle);
} else {
List<IndexedString> nextValues = tabTitles.subList(index, tabTitles.size());
tabTitles.removeAll(nextValues);
tabTitles.add(myTitle);
tabTitles.addAll(nextValues);
}
}
tabContents.put(new IndexedString(index, tabTitle), tabContent);
}
public List<IndexedString> getTabTitles() {
return tabTitles;
}
public void setTabTitles(List<IndexedString> tabTitles) {
this.tabTitles = tabTitles;
}
public Map<IndexedString, FormItemRepresentation> getTabContents() {
return tabContents;
}
public void setTabContents(Map<IndexedString, FormItemRepresentation> tabContents) {
this.tabContents = tabContents;
}
public String getCssClassName() {
return cssClassName;
}
public void setCssClassName(String cssClassName) {
this.cssClassName = cssClassName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTabWidth() {
return tabWidth;
}
public void setTabWidth(String tabWidth) {
this.tabWidth = tabWidth;
}
@Override
@SuppressWarnings("unchecked")
public void setDataMap(Map<String, Object> data) throws FormEncodingException {
super.setDataMap(data);
this.cssClassName = (String) data.get("cssClassName");
this.id = (String) data.get("id");
this.tabWidth = (String) data.get("tabWidth");
this.tabTitles.clear();
List<Object> tabTitles = (List<Object>) data.get("tabTitles");
List<Object> tabContents = (List<Object>) data.get("tabContents");
for (Object tTitle : tabTitles) {
Map<String, Object> subData = (Map<String, Object>) tTitle;
Integer index = Integer.valueOf(String.valueOf(subData.get("index")));
String string = (String) subData.get("string");
this.tabTitles.add(new IndexedString(index, string));
}
this.tabContents.clear();
for (Object tContent : tabContents) {
Map<String, Object> subData = (Map<String, Object>) tContent;
Integer index = Integer.valueOf(String.valueOf(subData.get("tabPanelIndex")));
String string = (String) subData.get("tabPanelTitle");
FormItemRepresentation subRep = (FormItemRepresentation) FormEncodingFactory.getDecoder().decode(subData);
this.tabContents.put(new IndexedString(index, string), subRep);
}
}
@Override
public Map<String, Object> getDataMap() {
Map<String, Object> data = super.getDataMap();
data.put("cssClassName", this.cssClassName);
data.put("id", this.id);
data.put("tabWidth", this.tabWidth);
List<Object> tabTitlesMap = new ArrayList<Object>();
for (IndexedString inStr : this.tabTitles) {
Map<String, Object> inStrMap = new HashMap<String, Object>();
inStrMap.put("index", inStr.getIndex());
inStrMap.put("string", inStr.getString());
tabTitlesMap.add(inStrMap);
}
data.put("tabTitles", tabTitlesMap);
List<Object> tabContentsMap = new ArrayList<Object>();
for (Map.Entry<IndexedString, FormItemRepresentation> entry : this.tabContents.entrySet()) {
Map<String, Object> subData = entry.getValue() == null ? new HashMap<String, Object>() : entry.getValue().getDataMap();
subData.put("tabPanelIndex", entry.getKey().getIndex());
subData.put("tabPanelTitle", entry.getKey().getString());
tabContentsMap.add(subData);
}
data.put("tabContents", tabContentsMap);
return data;
}
@Override
public boolean equals(Object obj) {
if (!super.equals(obj)) return false;
if (!(obj instanceof TabbedPanelRepresentation)) return false;
TabbedPanelRepresentation other = (TabbedPanelRepresentation) obj;
boolean equals = (this.cssClassName == null && other.cssClassName == null) ||
(this.cssClassName != null && this.cssClassName.equals(other.cssClassName));
if (!equals) return equals;
equals = (this.id == null && other.id == null) || (this.id != null && this.id.equals(other.id));
if (!equals) return equals;
equals = (this.tabWidth == null && other.tabWidth == null) || (this.tabWidth != null && this.tabWidth.equals(other.tabWidth));
if (!equals) return equals;
equals = (this.tabTitles == null && other.tabTitles == null) || (this.tabTitles != null && this.tabTitles.equals(other.tabTitles));
if (!equals) return equals;
equals = (this.tabContents == null && other.tabContents == null) ||
(this.tabContents != null && this.tabContents.entrySet().equals(other.tabContents.entrySet()));
return equals;
}
@Override
public int hashCode() {
int result = super.hashCode();
int aux = this.cssClassName == null ? 0 : this.cssClassName.hashCode();
result = 37 * result + aux;
aux = this.id == null ? 0 : this.id.hashCode();
result = 37 * result + aux;
aux = this.tabTitles == null ? 0 : this.tabTitles.hashCode();
result = 37 * result + aux;
aux = this.tabContents == null ? 0 : this.tabContents.hashCode();
result = 37 * result + aux;
return result;
}
}