/** * PlaceChooser.java * Created On 2006, Mar 11, 2006 3:35:00 PM * @author E. Rajasekar */ package app.astrosoft.ui.comp; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Arrays; import java.util.List; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SpringLayout; import app.astrosoft.beans.Place; import app.astrosoft.beans.Place.Direction; import app.astrosoft.beans.Place.Location; import app.astrosoft.ui.AstroSoft; import app.astrosoft.ui.util.SpringUtilities; import app.astrosoft.ui.util.UIConsts; import app.astrosoft.ui.util.UIUtil; import app.astrosoft.util.AstrosoftTimeZone; import app.astrosoft.util.PlaceFinder; import app.astrosoft.util.Timer; public class PlaceChooser extends JPanel { private JLabel l_timezone = new JLabel("Time Zone"); private JLabel l_place = new JLabel("Place"); private JLabel l_latitude = new JLabel("Latitude"); private JLabel l_longitude = new JLabel("Longitude"); private JButton searchButton = new JButton(); private JTextField latitude_deg = new JTextField(4); private JTextField latitude_min = new JTextField(4); private JTextField longitude_deg = new JTextField(4); private JTextField longitude_min = new JTextField(4); private JComboBox placeCombo; private final JComboBox timeZoneCombo; private JComboBox dir_ns; private JComboBox dir_ew; private String city; private String state; private String country; private boolean showTitle; private Dimension size; Timer t; public PlaceChooser(Dimension size, boolean showTitle) { this.showTitle = showTitle; timeZoneCombo = new JComboBox(AstrosoftTimeZone.availableTimeZones()); initComponents(); addComponents(); this.size = size; setPreferredSize(size); } private void addComponents() { JPanel placeComp = new JPanel(new SpringLayout()); searchButton.setPreferredSize(UIConsts.BUTTON_ICON_SIZE); placeComp.add(placeCombo); placeComp.add(searchButton); //SpringUtilities.makeCompactGrid(placeComp,1,2, 20,20,10,10); JPanel latitudeComp = new JPanel(new SpringLayout()); latitudeComp.add(latitude_deg); latitudeComp.add(latitude_min); latitudeComp.add(dir_ns); JPanel longitudeComp = new JPanel(new SpringLayout()); longitudeComp.add(longitude_deg); longitudeComp.add(longitude_min); longitudeComp.add(dir_ew); SpringUtilities.makeCompactGrid(placeComp, 1, 2, 5,5,5,5); SpringUtilities.makeCompactGrid(latitudeComp, 1, 3, 5,5,10,10); SpringUtilities.makeCompactGrid(longitudeComp, 1, 3, 5,5,10,10); add(l_place); add(placeComp); add(l_latitude); add(latitudeComp); add(l_longitude); add(longitudeComp); add(l_timezone); add(timeZoneCombo); SpringUtilities.makeCompactGrid(this, 4, 2, 5,5,10,10); } public PlaceChooser() { this(new Dimension(350, 200), true); } private void initComponents() { placeCombo = new JComboBox(); //placeCombo.setSize(new Dimension(60,10)); //placeCombo.setPreferredSize(new Dimension(100,10)); placeCombo.setEditable(true); //t = new Timer(); //t.print("AT 1"); //t.print("AT 2"); dir_ew = new JComboBox(Direction.EW().toArray()); dir_ns = new JComboBox(Direction.NS().toArray()); if (showTitle) { setBorder(UIConsts.getTitleBorder("Place")); } setLayout(new SpringLayout()); //t.print("AT 2.1"); Place defPlace = AstroSoft.getPreferences().getPlace(); //t.print("AT 2.2"); addPlaces(new Place[]{defPlace}); //placeCombo.addItem("New City"); //t.print("AT 3"); searchButton.setEnabled(false); ActionListener searchListener = new ActionListener(){ public void actionPerformed(ActionEvent e) { searchClicked(); } }; searchButton.addActionListener(searchListener); Icon searchIcon = UIUtil.createImageIcon("Loc_Search"); searchButton.setIcon(searchIcon); //t.print("AT 4"); placeCombo.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e) { Object item = e.getItem(); if (item instanceof Place){ setSelectedPlace((Place)item); } } }); placeCombo.getEditor().getEditorComponent().addKeyListener(new KeyAdapter(){ @Override public void keyReleased(KeyEvent e) { String text = ((JTextField)placeCombo.getEditor().getEditorComponent()).getText(); if (text.length() > 0){ searchButton.setEnabled(true); }else{ searchButton.setEnabled(false); } } @Override public void keyTyped(KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_ENTER){ searchClicked(); } } }); //t.print("AT 5"); } public Place getSelectedPlace(){ Location latitude = new Location(latitude_deg.getText(), latitude_min.getText(), (Direction)dir_ns.getSelectedItem()); Location longitude = new Location(longitude_deg.getText(), longitude_min.getText(), (Direction)dir_ew.getSelectedItem()); String timeZoneId = ((AstrosoftTimeZone)timeZoneCombo.getSelectedItem()).id(); Place p; String[] placeText = placeCombo.getSelectedItem().toString().split(","); String st = null; String coun = null; if (placeText.length > 1){ st = placeText[1]; if (placeText.length > 2){ coun = placeText[2]; } } p = new Place(placeText[0], st, coun, latitude,longitude,timeZoneId); return p; } public void setSelectedPlace(final Place p){ //t.print("AT 2.2.3.1"); placeCombo.setSelectedItem(p); //t.print("AT 2.2.3.2"); city = p.city(); state = p.state(); country = p.country(); //t.print("AT 2.2.3.3"); Location latitude = p.latitudeLocation(); Location longitude = p.longitudeLocation(); //t.print("AT 2.2.3.4"); latitude_deg.setText(String.valueOf(latitude.deg())); latitude_min.setText(String.valueOf(latitude.min())); dir_ns.setSelectedItem(latitude.dir()); //t.print("AT 2.2.3.5"); longitude_deg.setText(String.valueOf(longitude.deg())); longitude_min.setText(String.valueOf(longitude.min())); dir_ew.setSelectedItem(longitude.dir()); //t.print("AT 2.2.3.6"); new Thread(new Runnable(){ public void run() { timeZoneCombo.setSelectedItem(p.astrosoftTimeZone()); System.out.println("done"); } }).start(); //t.print("AT 2.2.3.7"); } private void addPlaces(Place[] places) { //t.print("AT 2.2.1"); addPlaces(Arrays.asList(places)); //t.print("AT 2.3"); } public void addPlaces(List<Place> places){ placeCombo.removeAllItems(); //t.print("AT 2.2.2"); for(Place place : places){ placeCombo.addItem(place); } //t.print("AT 2.2.3"); if (places.size() > 0){ setSelectedPlace(places.get(0)); } //t.print("AT 2.2.4"); } private void searchClicked() { Object query = placeCombo.getSelectedItem(); //System.out.println("query->" + query); if (query != null) { List<Place> result = PlaceFinder.findPlace(query.toString()); addPlaces(result); placeCombo.showPopup(); } } }