/**
* VimDasa.java
* Created On 2006, Mar 22, 2006 6:20:58 PM
* @author E. Rajasekar
*/
package app.astrosoft.core;
import java.util.Collections;
import java.util.Date;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import app.astrosoft.consts.AstrosoftTableColumn;
import app.astrosoft.consts.DisplayFormat;
import app.astrosoft.consts.DisplayStrings;
import app.astrosoft.consts.Planet;
import app.astrosoft.ui.AstroSoft;
import app.astrosoft.ui.table.TableRowData;
import app.astrosoft.util.AstroUtil;
public class VimDasa extends AbstractDasa {
private Planet lord;
private EnumMap<Planet, Dasa> subDasas;
public VimDasa() {
super();
}
public VimDasa(Planet lord, Dasa parent, double start, int level) {
super(parent, start, level);
this.lord = lord;
this.end = start + getPeriod();
isRunning = (today > start && today < end);
}
public Map<Planet, Dasa> getSubDasas() {
generateSubDasas();
return subDasas;
}
public String getStartDate() {
return Vimshottari.dateFormat.format(AstroUtil.decimalYearToDate(start));
}
public String getEndDate() {
return Vimshottari.dateFormat.format(AstroUtil.decimalYearToDate(end));
}
public Dasa getCurrent(){
Dasa current = null;
if(isLeaf()){
current = this;
}else{
for(Dasa d : subDasas()){
if(d.isRunning()){
current = d.getCurrent();
}
}
}
return current;
}
@Override
public String toString() {
if(lord == null){
return DisplayStrings.DASA_STR.toString();
}
return lord.toString();
}
public String dasaPeriod(){
StringBuilder sb = new StringBuilder(fullDasa());
sb.append(getStartDate() + "\n");
if(isRunning){
sb.insert(0, "*");
}
return sb.toString();
}
public String fullDasa(){
StringBuilder sb = new StringBuilder(lord.toString(DisplayFormat.SYMBOL));
VimDasa major = (VimDasa)parent;
while(major != null){
sb.insert(0, major.getDasa().toString(DisplayFormat.SYMBOL) + "/");
major = (VimDasa) major.getParent();
}
return sb.toString();
}
public String printTree(){
StringBuilder sb = new StringBuilder();
if(subDasas == null){
sb.append(dasaPeriod());
}else{
for(Dasa d : subDasas()){
sb.append(d.printTree());
}
}
return sb.toString();
}
public DefaultMutableTreeNode createTreeNode(){
DefaultMutableTreeNode node = new DefaultMutableTreeNode(this);
if(subDasas == null){
return node;
}else{
for(Dasa d : subDasas()){
node.add(d.createTreeNode());
}
return node;
}
}
public Planet getDasa() {
return lord;
}
public double getPeriod(){
if(parent == null){
return lord.dasaPeriod();
}else{
return ((parent.getPeriod() * lord.dasaPeriod()) / 120.00);
}
}
public void generateSubDasas() {
if (subDasas == null && !isLeaf()){
subDasas = generateSubDasas(lord, this, start, level);
}
}
public static EnumMap<Planet, Dasa> generateSubDasas(Planet lord, Dasa parent, double start, int level) {
EnumMap<Planet, Dasa>subDasas = new EnumMap<Planet, Dasa>(Planet.class);
for(Planet subLord : Planet.dasaLords(lord)){
Dasa dasa = new VimDasa(subLord, parent, start, level + 1);
start = dasa.getEnd();
subDasas.put(subLord, dasa);
}
return subDasas;
}
public boolean isLeaf(){
return (level > Vimshottari.MAX_LEVEL - 1 );
}
public Iterable<Dasa> subDasas(){
generateSubDasas();
return new DasaIterable(lord, subDasas);
}
public static class DasaIterable implements Iterable<Dasa>{
Planet startWith;
EnumMap<Planet, Dasa> dasas;
public DasaIterable(Planet startWith, EnumMap<Planet, Dasa> dasas) {
this.startWith = startWith;
this.dasas = dasas;
}
public Iterator<Dasa> iterator() {
return new DasaIterator(startWith, dasas);
}
}
public static class DasaIterator implements Iterator<Dasa>{
Iterator dasaIterator;
EnumMap<Planet, Dasa> subDasas;
public DasaIterator(Planet startWith, EnumMap<Planet, Dasa> subDasas) {
dasaIterator = Planet.dasaIterator(startWith);
this.subDasas = subDasas;
if(subDasas == null){
dasaIterator = Collections.EMPTY_LIST.iterator();
}
}
public boolean hasNext() {
return dasaIterator.hasNext();
}
public Dasa next() {
return subDasas.get(dasaIterator.next());
}
public void remove() {
throw new UnsupportedOperationException("remove is not supported");
}
}
public Object getColumnData(AstrosoftTableColumn col) {
switch(col){
case Dasa: return fullDasa();
case Start: return getStartDate();
case End: return getEndDate();
default : return null;
}
}
}