/*
* Copyright 2013 State University of New York at Oswego
*
* 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 edu.oswego.csc480_hci521_2013.client.place;
import java.util.logging.Logger;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;
public class DoublePanelPlace extends Place {
static final Logger logger = Logger.getLogger(DoublePanelPlace.class.getName());
public enum Location {
EAST {
public String toString() {
return "east";
}
},
WEST {
public String toString() {
return "west";
}
};
public static Location fromString(String s) {
for (Location loc : Location.values()) {
if (s.equalsIgnoreCase(loc.toString())) {
return loc;
}
}
return null;
}
};
public enum PanelType {
DATA {
public String toString() {
return "data";
}
},
VIS {
public String toString() {
return "vis";
}
};
public static PanelType fromString(String s) {
for (PanelType type : PanelType.values()) {
if (s.equalsIgnoreCase(type.toString())) {
return type;
}
}
return null;
}
};
private static final PanelType defaultEast = PanelType.VIS;
private static final PanelType defaultWest = PanelType.DATA;
private PanelType east;
private PanelType west;
private String[] dataKeys;
public DoublePanelPlace() {
east = defaultEast;
west = defaultWest;
dataKeys = new String[0];
}
public DoublePanelPlace(PanelType east, PanelType west) {
this.east = east;
this.west = west;
dataKeys = new String[0];
}
public PanelType getEast() {
return east;
}
public PanelType getWest() {
return west;
}
public String[] getDataKeys() {
return dataKeys;
}
public void setDataKeys(String... dataKeys) {
this.dataKeys = dataKeys;
}
public void addDataKey(String dataKey) {
String[] newKeys = new String[dataKeys.length + 1];
System.arraycopy(dataKeys, 0, newKeys, 0, dataKeys.length);
newKeys[newKeys.length - 1] = dataKey;
dataKeys = newKeys;
}
public void removeDataKey(int index) {
String[] newDataKeys = new String[dataKeys.length - 1];
int i = 0;
for (int j = 0; j < newDataKeys.length; j++) {
if (i == index) {
j--;
} else {
newDataKeys[j] = dataKeys[i];
}
i++;
}
dataKeys = newDataKeys;
}
public void setEast(PanelType east) {
this.east = east;
}
public void setWest(PanelType west) {
this.west = west;
}
public DoublePanelPlace clone() {
DoublePanelPlace place = new DoublePanelPlace(east, west);
place.setDataKeys(dataKeys);
return place;
}
// Tokenizer
@Prefix("Main")
public static class Tokenizer implements PlaceTokenizer<DoublePanelPlace> {
static final Logger logger = Logger.getLogger(Tokenizer.class.getName());
@Override
public String getToken(DoublePanelPlace place) {
TokenParser tp = new TokenParser();
tp.addArgument("east", place.getEast().toString());
tp.addArgument("west", place.getWest().toString());
if (place.getDataKeys().length > 0) {
tp.addArgument("datakey", place.getDataKeys());
}
String token = tp.serialize();
logger.info("Generating token: " + token);
return token;
}
@Override
public DoublePanelPlace getPlace(String token) {
logger.info("Parsing token: " + token);
TokenParser tp = new TokenParser(token);
String east = tp.getValue(Location.EAST.toString());
String west = tp.getValue(Location.WEST.toString());
String[] keys = tp.getAllValues("datakey");
DoublePanelPlace place = new DoublePanelPlace(
PanelType.fromString(east), PanelType.fromString(west));
place.setDataKeys(keys);
return place;
}
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof DoublePanelPlace)) {
return false;
}
DoublePanelPlace place = (DoublePanelPlace) obj;
if (place.getEast() != getEast() || place.getWest() != getWest()) {
return false;
}
if (place.getDataKeys().length != getDataKeys().length) {
return false;
}
for (int i = 0; i < getDataKeys().length; i++) {
if (!place.getDataKeys()[i].equals(getDataKeys()[i])) {
return false;
}
}
return true;
}
}