/** * Ephemeris.java * * Created on February 21, 2003, 4:20 PM * @author E. Rajasekar. */ package app.astrosoft.core; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.EnumMap; import java.util.GregorianCalendar; import java.util.List; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; import app.astrosoft.beans.Place; import app.astrosoft.consts.AshtavargaName; import app.astrosoft.consts.AstroConsts; import app.astrosoft.consts.AstrosoftTableColumn; import app.astrosoft.consts.Ayanamsa; import app.astrosoft.consts.DisplayFormat; import app.astrosoft.consts.DisplayStrings; import app.astrosoft.consts.Planet; import app.astrosoft.consts.Month; import app.astrosoft.consts.Rasi; import app.astrosoft.pref.AstrosoftPref; import app.astrosoft.ui.AstroSoft; import app.astrosoft.ui.table.ColumnMetaData; import app.astrosoft.ui.table.DefaultColumnMetaData; import app.astrosoft.ui.table.MapTableRow; import app.astrosoft.ui.table.MapTableRowHelper; import app.astrosoft.ui.table.Table; import app.astrosoft.ui.table.TableData; import app.astrosoft.ui.table.TableDataFactory; import app.astrosoft.ui.table.TableRowData; import app.astrosoft.util.AstroUtil; import app.astrosoft.util.SwissHelper; import app.astrosoft.util.Timer; import swisseph.*; public class Ephemeris implements PreferenceChangeListener { public static enum Mode { Daily(Calendar.MONTH, Calendar.DATE), Monthly(Calendar.YEAR, Calendar.MONTH); private Mode(int parentCalField, int incCalField) { this.parentCalField = parentCalField; this.incCalField = incCalField; } private int incCalField; private int parentCalField; public int incCalField() { return incCalField; } public int parentCalField() { return parentCalField; } public boolean isDaily(){ return this == Daily; } public boolean isMonthly(){ return this == Monthly; } }; private static AstrosoftPref preferences = AstroSoft.getPreferences(); private Calendar cal; private List<EnumMap<Planet, EphData>> ephemeris; private Mode mode; private SwissHelper swissHelper; /** Month is zero-based */ public Ephemeris(int month, int year, Mode mode) { this(new GregorianCalendar(year, month, 1), mode); } public Ephemeris(int month, int year) { this(year, month, Mode.Daily); } public Ephemeris(Calendar cal, Mode mode){ this.cal = cal; this.mode = mode; cal.set(Calendar.DATE, 1); if (mode.isMonthly()){ cal.set(Calendar.MONTH, Calendar.JANUARY); } calcEphemeris(); //preferences.addPreferenceChangeListener(this); } public void setAyanamsa( Ayanamsa ayanamsa ) { swissHelper.setAyanamsa(ayanamsa); calcEphemeris( ); } private void calcEphemeris( ) { ephemeris = new ArrayList<EnumMap<Planet, EphData>>(); double timeZone = preferences.getPlace().timeZone(); double ephTime = preferences.getEphCalcTime() - timeZone; swissHelper = new SwissHelper(); Calendar ephCal = AstroUtil.getCalendar(); ephCal.setTime(cal.getTime()); //System.out.println("cal " + cal.getTime()); //System.out.println("eph cal " + ephCal.getTime()); //TODO: Initial calculation time is slow, see if we run it in thread while(ephCal.get(mode.parentCalField) == cal.get(mode.parentCalField)) { SweDate sweDate = new SweDate( ephCal.get(Calendar.YEAR), ephCal.get(Calendar.MONTH) + 1, ephCal.get(Calendar.DAY_OF_MONTH), ephTime ); swissHelper.setSweDate(sweDate); ephemeris.add(swissHelper.getEphData()); ephCal.add(mode.incCalField, 1); } } public Mode getMode() { return mode; } public Calendar getDate(){ return cal; } public Table getEphemerisTable(){ List<AstrosoftTableColumn> cols = Planet.toTableColumn(Planet.allPlanets()); if (mode.isDaily()){ cols.add(0, AstrosoftTableColumn.Date); }else{ cols.add(0, AstrosoftTableColumn.Month); } final DefaultColumnMetaData colMetaData = new DefaultColumnMetaData(cols){ @Override public Class getColumnClass(AstrosoftTableColumn col) { if (col == AstrosoftTableColumn.Date){ return Integer.class; }else if (col == AstrosoftTableColumn.Month){ return String.class; } return EphData.class; } }; colMetaData.localizeColumns(); Table ephTable = new Table(){ public TableData<TableRowData> getTableData() { return new TableData<TableRowData>(){ EnumMap<Planet, EphData> row; public TableRowData getRow(final int index) { row = ephemeris.get(index); return new TableRowData(){ public Object getColumnData(AstrosoftTableColumn col) { if (col == AstrosoftTableColumn.Date){ return index + 1; }else if (col == AstrosoftTableColumn.Month){ return Month.ofIndex(index).toString(DisplayFormat.FULL_NAME); } return row.get(Planet.valueOf(col.name())); } }; } public int getRowCount() { return ephemeris.size(); } }; } public ColumnMetaData getColumnMetaData() { return colMetaData; } }; return ephTable; } public void preferenceChange(PreferenceChangeEvent evt) { if(evt.getKey().equals(AstrosoftPref.Preference.Ayanamsa.name())){ setAyanamsa(Enum.valueOf(Ayanamsa.class, evt.getNewValue())); }else if (evt.getKey().equals(AstrosoftPref.Preference.EphCalcTime.name())){ calcEphemeris(); }else if (evt.getKey().equals(AstrosoftPref.Preference.Place.name())){ calcEphemeris(); } } public static class EphData { private double position; private Rasi house; private boolean isReverse; public EphData(double position, Boolean isReverse){ this.position = position % 30; this.house = Rasi.ofDeg(position); this.isReverse = (isReverse != null) ? isReverse.booleanValue():false; } public double getPosition() { return position; } public Rasi getHouse() { return house; } public boolean isReverse() { return isReverse; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(AstroUtil.todegmin(position, " " + house.toString(DisplayFormat.SYMBOL) + " ")); if (isReverse){ sb.append(DisplayStrings.RETRO_SYM); } return sb.toString(); } } @Override public String toString() { StringBuilder sb = new StringBuilder(); /*for (Planet p : Planet.planetsAsc()) { sb.append(p + "\t"); } sb.append("\n");*/ for(EnumMap<Planet, EphData> planetEphData : ephemeris){ for(Planet p : planetEphData.keySet()){ sb.append(planetEphData.get(p) + "\t"); } sb.append("\n"); } return sb.toString(); } public static void main( String[] args ) { Ephemeris eph = new Ephemeris( 01, 2003, Mode.Monthly); System.out.println(eph); } }