// -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- // vim:ts=2:sw=2:tw=80:et /* * Copyright (c) 2002-2004, Andrew Carra and Robert Hagemann * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the WiGLE.net nor Mimezine nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package org.mimezine.jigle; import java.awt.*; import java.awt.event.*; import java.awt.Toolkit; import java.util.*; import java.lang.*; import java.awt.image.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.plaf.basic.*; import java.net.*; import java.io.*; import org.mimezine.geo.*; import java.util.logging.Level; import java.util.logging.Logger; /** * A container class for a JiGLEMap * with navigation and interaction controls. */ public class JiGLEPane extends JPanel implements MouseListener, KeyListener, ItemListener, WiGLEEventListener, PreferencesListener { public static final String VERSION_ID = "$Id: JiGLEPane.java,v 1.64 2004/05/04 02:09:56 uhtu Exp $"; /** the logger for this class. */ private static final Logger log = Logger.getLogger( JiGLEPane.class.getName() ); private JiGLEFrame frame; private static final int BORDER_W = 25; private JiGLEMapper jigleMapper; private GPSPoint nw, se; private JPanel pan; private JPanel nPan; private JPanel ePan; private JPanel sPan; private JComboBox mappacks; private JSlider qosSlider; private JSlider dateSlider; private JButton nudgeW, nudgeE, nudgeN, nudgeS; private JButton zin, zout, selStn, selGps/*,drawLabel, drawArea, drawSightings*/; private int prevTab; private int curTab; private boolean isBusy; private JPanel buttonPanel; private String currentMapPackName; private String currentMapPackLongName; private JiGLEMapPack currentMapPack; private int zoomFactor; // short-name => JiGLEMapPack private HashMap mapHash; // short-name => JiGLEMapPack // long-name => JiGLEMapPack // ordered by name private SortedMap mapMap; private String queryURLStringStart; private String queryLocURLStringStart; private static final String LATHEADER = "trilat"; private static final String LONHEADER = "trilong"; private static final String STNNAMEHEADER = "ssid"; private static final String BSSIDHEADER = "netid"; private static final String FINDERHEADER = "discoverer"; private static final String CHANNELHEADER = "channel"; private static final String STNTYPEHEADER = "type"; private static final String DISCOVEREDHEADER = "firsttime"; private static final String WEPHEADER = "wep"; private static final String COMMENTHEADER = "comment"; private static final String QOSHEADER = "qos"; // Button images private ImageIcon map, zii, zio, zoi, zoo, ssi, sso, sgi, sgo, labeli, labelo, areai, areao, /*sightingsi, sightingso,*/ freei, freeo; private Image[] maps; // font: since this + text dictates button size, determining it's important // to control this private Font f; private WiGLE wigle; private SquigleAPI squigle; /** * Do not allow default constructor */ private JiGLEPane() { } /** * overloaded constructor. */ public JiGLEPane( int zoomFactor, HashMap mapHash, String mapPackName, String queryURLStringStart, String queryLocURLStringStart, JiGLEFrame frame, WiGLE wigle, SquigleAPI squigle ) { this.zoomFactor = zoomFactor; this.mapHash = mapHash; this.currentMapPackName = mapPackName; this.queryURLStringStart = queryURLStringStart; this.queryLocURLStringStart = queryLocURLStringStart; this.frame = frame; this.wigle = wigle; this.squigle = squigle; init(); Preferences.addListener( this ); } public void refreshValues( boolean loadStumble, boolean loadCache, boolean doCache ) { currentMapPack = (JiGLEMapPack) mapMap.get( currentMapPackName ); if ( ! "empty".equals( currentMapPack.getShortName() ) ) { wigle.loadData( currentMapPack, loadStumble, loadCache, doCache ); jigleMapper.setBusy( true ); jigleMapper.destroyImages(); } } public void handleWiGLEEvent( WiGLEEvent event ) { if ( event.getType() == WiGLEEvent.DATA_LOADED ) { JiGLEDataSet data = (JiGLEDataSet) event.getData(); if ( data == null ) { JiGLE.getStatusMessage().setText( "Error loading data" ); log.warning( "Server dataset not initialized," + " continuing anyway, no points will be shown." + "Make sure your internet connection is live," + " and that WiGLE.net is accessible."); } updateDateSlider(data); setDataSet( data ); this.requestFocus(); GPSPoint nw = currentMapPack.getNW(); GPSPoint se = currentMapPack.getSE(); jigleMapper.updateImage( nw, se, currentMapPack, zoomFactor ); jigleMapper.setBusy( false ); /* // Get the size of the default screen Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // make sure we don't expand off the screen int prefX = (int) screenSize.getWidth() - frame.getLocationOnScreen().x; int prefY = (int) screenSize.getHeight() - frame.getLocationOnScreen().y; if ( frame.getPreferredSize().getWidth() < prefX ) { prefX = (int) frame.getPreferredSize().getWidth(); } if ( frame.getPreferredSize().getHeight() < prefY ) { prefY = (int) frame.getPreferredSize().getHeight(); } // make some sane lower bounds if ( prefX < 100 ) { prefX = 100; } if ( prefY < 100 ) { prefY = 100; } frame.setSize( prefX, prefY ); frame.validate(); */ jigleMapper.repaint(); JiGLE.getStatusMessage().setText( currentMapPack.getLongName() + " MapPack Loaded" ); } } public void init() { wigle.addListener( this ); this.setLayout( new BorderLayout(0,0) ); this.setBorder( BorderFactory.createEmptyBorder() ); currentMapPack = (JiGLEMapPack) mapHash.get( currentMapPackName ); GPSPoint nw = currentMapPack.getNW(); GPSPoint se = currentMapPack.getSE(); currentMapPackLongName = currentMapPack.getLongName(); // secrit evil voodoo magic to make the JButton's pressed color correct UIManager.put( "Button.select", SystemColor.control ); try { zio = new ImageIcon( "JiGLEMap/images/zino-x.gif"); zii = new ImageIcon( "JiGLEMap/images/zini-x.gif"); zoo = new ImageIcon( "JiGLEMap/images/zouto-x.gif"); zoi = new ImageIcon( "JiGLEMap/images/zouti-x.gif"); ssi = new ImageIcon( "JiGLEMap/images/selstni-x.gif"); sso = new ImageIcon( "JiGLEMap/images/selstno-x.gif"); labeli = new ImageIcon( "JiGLEMap/images/seltxti-x.gif"); labelo = new ImageIcon( "JiGLEMap/images/seltxto-x.gif"); areai = new ImageIcon( "JiGLEMap/images/areai-x.gif"); areao = new ImageIcon( "JiGLEMap/images/areao-x.gif"); sgi = new ImageIcon( "JiGLEMap/images/selgpsi-x.gif"); sgo = new ImageIcon( "JiGLEMap/images/selgpso-x.gif"); /* sightingsi = new ImageIcon( "JiGLEMap/images/sightingsi-x.gif"); sightingso = new ImageIcon( "JiGLEMap/images/sightingso-x.gif"); */ } catch ( Exception ex ) { log.log( Level.WARNING, "JiGLEMap Image Loading Failed: (as application)", ex ); } //the main panel pan = new JPanel( new BorderLayout() ); pan.setBorder( BorderFactory.createEmptyBorder() ); // 10pt. is a nice size for the tabbutton images f = new Font( "SansSerif", Font.PLAIN, 10 ); this.setForeground( Color.black ); this.setFont( f ); // make combo box for mappacks mappacks = new JComboBox(); mappacks.setBackground( SystemColor.control ); mappacks.setForeground( SystemColor.windowText ); mappacks.setFont( f ); mappacks.setSize(mappacks.getSize().width, BORDER_W ); // make alphabetical mappack list mapMap = new TreeMap(); Iterator it = mapHash.values().iterator(); while ( it.hasNext() ) { JiGLEMapPack tmpMapPack = (JiGLEMapPack) it.next(); mapMap.put( tmpMapPack.getLongName(), tmpMapPack ); } // add mappacks to choice it = mapMap.keySet().iterator(); while ( it.hasNext() ) { String mapName = (String) it.next(); mappacks.addItem( mapName ); } // set our current mappack mappacks.setSelectedItem( currentMapPack.getLongName() ); // get a full set of // short name => MapPack // long name => MapPack in one place mapMap.putAll( mapHash ); //create mappack dropdown // create the nudge buttons nudgeW = buildNudgeButton( "", "Nudge Map East", true ); nudgeS = buildNudgeButton( "South v", "Nudge Map South", false ); nudgeN = buildNudgeButton( "North ^", "Nudge Map North", false ); // create the tool palette BasicOptionPaneUI.ButtonAreaLayout buttonLayout = new BasicOptionPaneUI.ButtonAreaLayout( false, 0 ); buttonPanel = new JPanel( buttonLayout ); buttonPanel.setForeground( SystemColor.controlText ); buttonPanel.setBackground( SystemColor.control ); buttonPanel.setBorder( BorderFactory.createEmptyBorder() ); zin = buildButton( zio, zii, true, "", "Zoom In" ); zout = buildButton( zoo, zoi, true, "", "Zoom Out" ); selStn = buildButton( sso, ssi, false, "", "Select Station" ); selGps = buildButton( sgo, sgi, true, "", "Show GPS pos" ); /* drawLabel = buildButton( labelo, labeli, ! Preferences.getBoolean( Preferences.DRAW_LABELS_KEY ), "", "Show Labels" ); drawArea = buildButton( areao, areai, ! Preferences.getBoolean( Preferences.DRAW_AREA_KEY ), "", "Show Area Polygon" ); drawSightings = buildButton( sightingso, sightingsi, ! Preferences.getBoolean( Preferences.DRAW_SIGHTINGS_KEY ), "", "Show Observations" ); */ buttonPanel.add( zin ); buttonPanel.add( zout ); buttonPanel.add( selStn ); buttonPanel.add( selGps ); // buttonPanel.add( drawLabel ); // buttonPanel.add( drawArea ); // buttonPanel.add( drawSightings ); // create the central JiGLEMapper log.finest( "buidling jiglemapper with "+nw+","+se+","+currentMapPack+","+zoomFactor+","+wigle+","+squigle); jigleMapper = new JiGLEMapper( nw, se, currentMapPack, zoomFactor, wigle, squigle ); jigleMapper.setBusy( false ); //north-side panel nPan = new JPanel( new BorderLayout() ); nPan.setBorder( BorderFactory.createEmptyBorder() ); nPan.setForeground( Color.black ); nPan.setBackground( SystemColor.control ); nPan.setSize(nPan.getSize().width, nPan.getSize().height+15); nPan.add( "West", mappacks ); nPan.add( "Center", nudgeN ); nPan.add( "East", buttonPanel ); qosSlider = new JSlider(JSlider.VERTICAL, JiGLEMapper.MIN_QOS, JiGLEMapper.MAX_QOS, JiGLEMapper.MIN_QOS ); qosSlider.setForeground( SystemColor.windowText ); qosSlider.setBackground( SystemColor.control ); qosSlider.addChangeListener(new qosSliderListener()); qosSlider.setMajorTickSpacing(1); qosSlider.setPaintTicks(true); qosSlider.setSnapToTicks(true); qosSlider.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); qosSlider.setPreferredSize( new Dimension( (int) qosSlider.getPreferredSize().getWidth(), 100 ) ); qosSlider.setValue( Preferences.getInteger( Preferences.QOS_KEY, JiGLEMapper.MIN_QOS ) ); JPanel slidePan = new JPanel( new BorderLayout() ); slidePan.setBorder( BorderFactory.createEmptyBorder() ); JLabel qosLabel = new JLabel( "QoS" ); slidePan.add( qosLabel, BorderLayout.NORTH ); slidePan.add( qosSlider, BorderLayout.CENTER ); // east-sieed panel ePan = new JPanel( new BorderLayout() ); ePan.setBorder( BorderFactory.createEmptyBorder() ); ePan.setForeground( Color.black ); ePan.setBackground( SystemColor.control ); ePan.add( nudgeE, BorderLayout.CENTER ); ePan.add( slidePan, BorderLayout.SOUTH ); // south-sieed panel dateSlider = new JSlider(JSlider.HORIZONTAL, 0, 1, 1 ); //Will be updated when map loads dateSlider.setForeground( SystemColor.windowText ); dateSlider.setBackground( SystemColor.control ); dateSlider.addChangeListener(new dateSliderListener()); dateSlider.setPaintTicks(false); dateSlider.setSnapToTicks(false); dateSlider.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); dateSlider.setPreferredSize( new Dimension( (int) dateSlider.getPreferredSize().getWidth(), 50 ) ); dateSlider.setValue( 0 ); JPanel dateSlidePan = new JPanel( new BorderLayout() ); dateSlidePan.setBorder( BorderFactory.createEmptyBorder() ); JLabel dateLabel = new JLabel( "Date", SwingConstants.CENTER ); dateSlidePan.add( dateLabel, BorderLayout.NORTH ); dateSlidePan.add( dateSlider, BorderLayout.CENTER ); sPan = new JPanel( new BorderLayout() ); sPan.setBorder( BorderFactory.createEmptyBorder() ); sPan.setForeground( Color.black ); sPan.setBackground( SystemColor.control ); sPan.add( nudgeS, BorderLayout.CENTER ); sPan.add( dateSlidePan, BorderLayout.SOUTH ); // ...then add everything to the main panel pan.add( "North", nPan ); pan.add( "East", ePan ); pan.add( "West", nudgeW ); pan.add( "Center", jigleMapper ); pan.add( "South", sPan ); // handle events from the buttons and palette mappacks.addItemListener( this ); this.addKeyListener( this ); jigleMapper.addKeyListener( this ); // set these to the default values (no mode) prevTab = 3; curTab = 3; jigleMapper.setMouseToSelectStation(); isBusy = false; add( "Center", pan ); int border = 3; add( "North", Box.createVerticalStrut( border ) ); add( "South", Box.createVerticalStrut( border ) ); add( "East", Box.createHorizontalStrut( border ) ); add( "West", Box.createHorizontalStrut( border ) ); setVisible( true ); selStn.repaint(); } /** * factor out some common button creation code. * adds this as Key and Mouse Listener. * * @param out the unselected image * @param in the selected image * @param raised does this button default to raised? * @param text the text for the button * @param tip the text for the tool tip * @return a new JButton with the specified characteristics */ private JButton buildButton( ImageIcon out, ImageIcon in, boolean raised, String text, String tip ) { Font smallFont = new Font( "SansSerif", Font.PLAIN, 10 ); JButton b = new JButton( out ); b.setSelectedIcon( in ); b.setForeground( SystemColor.controlText ); if ( raised ) { b.setBackground( SystemColor.control ); b.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED ) ); } else { b.setBackground( SystemColor.controlShadow ); b.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED ) ); } b.setBorderPainted( true ); b.setFocusPainted( false ); b.setMargin( new Insets( 0, 0, 0, 0 ) ); b.setHorizontalAlignment( SwingConstants.CENTER ); b.setHorizontalTextPosition( SwingConstants.CENTER ); b.setVerticalAlignment( SwingConstants.CENTER ); b.setVerticalTextPosition( SwingConstants.TOP ); b.setPreferredSize( new Dimension ( 25, 25 ) ); b.setFont( smallFont ); b.setText( text ); b.setToolTipText( tip ); b.addMouseListener( this ); b.addKeyListener( this ); return b; } /** * factor out some common nudge button creation code. * adds this as Key and Mouse Listener. * * @param label the button label * @param tip the tool tip text * @param ew is this an east/west button? */ private JButton buildNudgeButton( String label, String tip, boolean ew ) { JButton b = new JButton( label ); b.setForeground( SystemColor.controlText ); b.setBackground( SystemColor.control ); b.setFont( f ); b.setToolTipText( tip ); b.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED ) ); b.setFocusPainted( false ); Dimension d; if ( ew ) { d = new Dimension( BORDER_W, b.getPreferredSize().height ); } else { d = new Dimension( b.getPreferredSize().width, BORDER_W ); } b.setPreferredSize( d ); b.addMouseListener( this ); b.addKeyListener( this ); return b; } /** * sets the displayed dataset of the underlying JiGLEMapper * @param ds JiGLEDataSet to be displayed */ public void setDataSet( JiGLEDataSet ds ) { jigleMapper.setDataSet( ds ); } /** * Returns the current viewport. * @returns JiGLEViewPort describing the range being displayed on JiGLEMapper */ public JiGLEViewPort getDisplayedRange() { return jigleMapper.getDisplayedRange(); } public void keyReleased( java.awt.event.KeyEvent ev ) { } public void keyPressed( java.awt.event.KeyEvent ev ) { //if key is an arrow, do the corresponsing button-pressed if ( isBusy ) { return; } int key = ev.getKeyCode(); switch ( key ) { case KeyEvent.VK_UP: case KeyEvent.VK_KP_UP: jigleMapper.nudgeNorth(); break; case KeyEvent.VK_DOWN: case KeyEvent.VK_KP_DOWN: jigleMapper.nudgeSouth(); break; case KeyEvent.VK_LEFT: case KeyEvent.VK_KP_LEFT: jigleMapper.nudgeWest(); break; case KeyEvent.VK_RIGHT: case KeyEvent.VK_KP_RIGHT: jigleMapper.nudgeEast(); break; case KeyEvent.VK_ENTER: if ( ev.isAltDown() ) { jigleMapper.zoomOut( jigleMapper.getSize().width / 2, jigleMapper.getSize().height / 2 ); } else { jigleMapper.zoomIn( jigleMapper.getSize().width / 2, jigleMapper.getSize().height / 2 ); } break; case KeyEvent.VK_F: if ( ev.isControlDown() ) { jigleMapper.find(); } break; case KeyEvent.VK_G: if ( ev.isControlDown() ) { jigleMapper.findNext(); } break; case KeyEvent.VK_PLUS: case KeyEvent.VK_EQUALS: if ( ev.isControlDown() ) { jigleMapper.qosUp(); } break; case KeyEvent.VK_MINUS: if ( ev.isControlDown() ) { jigleMapper.qosDown(); } break; default: // do nothing } } public void keyTyped( java.awt.event.KeyEvent ev ) { } public void mouseClicked( java.awt.event.MouseEvent ev ) { } public void mouseEntered( java.awt.event.MouseEvent ev ) { } public void mouseExited( java.awt.event.MouseEvent ev ) { } public void mousePressed( java.awt.event.MouseEvent ev ) { if ( isBusy ) { return; } Object src = ev.getSource(); // XXX: .equals vs == if ( src == nudgeE ) { nudgeE.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED ) ); } else if ( src == nudgeW ) { nudgeW.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED ) ); } else if ( src == nudgeS ) { nudgeS.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED ) ); } else if ( src == nudgeN ) { nudgeN.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED ) ); } } // mouseListener for this panel's control buttons/palette // make sure we do things on release so that the buttons pop back up public void mouseReleased( java.awt.event.MouseEvent ev ) { if ( isBusy ) { return; } Object src = ev.getSource(); prevTab = curTab; // XXX: .equals vs == if ( src == nudgeE ) { nudgeE.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED ) ); jigleMapper.nudgeEast(); } else if ( src == nudgeW ) { nudgeW.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED ) ); jigleMapper.nudgeWest(); } else if ( src == nudgeS ) { nudgeS.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED ) ); jigleMapper.nudgeSouth(); } else if ( src == nudgeN ) { nudgeN.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED ) ); jigleMapper.nudgeNorth(); } // handle palette mode switches else if ( src == zin ) { curTab = 1; } else if ( src == zout ) { curTab = 2; } else if ( src == selStn ) { curTab = 3; } else if ( src == selGps ) { curTab = 4; } if ( prevTab != curTab ) { // replace the new 'in' image with the 'out' switch( prevTab ) { case 1: raiseJButton( zin ); break; case 2: raiseJButton( zout ); break; case 3: raiseJButton( selStn ); break; case 4: raiseJButton( selGps ); break; default: break; } // replace 'out image' with in switch(curTab) { case 1: lowerJButton( zin ); jigleMapper.setMouseToZoomIn(); break; case 2: lowerJButton( zout ); jigleMapper.setMouseToZoomOut(); break; case 3: lowerJButton( selStn ); jigleMapper.setMouseToSelectStation(); break; case 4: lowerJButton( selGps ); jigleMapper.setMouseToShowGpsPos(); break; default: break; } } // handle the three special draw tojigleMapperle buttons.. /* if ( src == drawLabel ) { if ( Preferences.getBoolean( Preferences.DRAW_LABELS_KEY ) ) { Preferences.setProperty( Preferences.DRAW_LABELS_KEY, false ); } else { Preferences.setProperty( Preferences.DRAW_LABELS_KEY, true ); } } else if ( src == drawArea ) { if ( Preferences.getBoolean( Preferences.DRAW_AREA_KEY ) ) { Preferences.setProperty( Preferences.DRAW_AREA_KEY, false ); } else { Preferences.setProperty( Preferences.DRAW_AREA_KEY, true ); } } else if ( src == drawSightings ) { if ( Preferences.getBoolean( Preferences.DRAW_SIGHTINGS_KEY ) ) { Preferences.setProperty( Preferences.DRAW_SIGHTINGS_KEY, false ); } else { Preferences.setProperty( Preferences.DRAW_SIGHTINGS_KEY, true ); } }*/ } //MousePressed /** * mark a JButton as raised (unselected) * does not manage other non-graphical state for this button. * @param b the JButton to raise */ private static void raiseJButton( JButton b ) { b.setSelected( false ); b.setForeground( SystemColor.controlText ); b.setBackground( SystemColor.control ); b.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED ) ); b.repaint(); } /** * mark a JButton as lowered (selected) * does not manage other non-graphical state for this button. * @param b the JButton to lower */ private static void lowerJButton( JButton b ) { b.setSelected( true ); b.setForeground( SystemColor.controlText ); b.setBackground( SystemColor.controlShadow ); b.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED ) ); b.repaint(); } public void setVisible( boolean b ) { if ( b ) { super.setVisible( true ); this.repaint(); } } /** * currently only for choosing mappacks */ public void itemStateChanged( ItemEvent event ) { log.finest( "itemstate:" + event ); if ( event.getItemSelectable().equals( mappacks ) && (ItemEvent.SELECTED == event.getStateChange()) ) { String selected = (String) event.getItem(); if ( log.isLoggable ( Level.FINEST ) ) { log.finest( "old:" + currentMapPackLongName + " new:" + selected ); } if ( ! currentMapPackLongName.equals( selected ) ) { // search through our mappacks, find one with this longname log.info( "Changing to mappack '" + selected + "'" ); JiGLEMapPack tmpMapPack = (JiGLEMapPack) mapMap.get( selected ); if ( tmpMapPack != null ) { currentMapPackName = tmpMapPack.getShortName(); currentMapPackLongName = tmpMapPack.getLongName(); } refreshValues( true, false, false ); } } } /** * Lock panel and display a 'busy' warning (for when the map data is changed) * @param b boolean value true for busy, false for ready */ public void setBusy( boolean b ) { isBusy = b; nudgeN.setEnabled( !b ); nudgeE.setEnabled( !b ); nudgeW.setEnabled( !b ); nudgeS.setEnabled( !b ); jigleMapper.setBusy( b ); } public JiGLEMapper getJiGLEMapper() { return jigleMapper; } public void preferenceChanged( String key ) { /* if ( Preferences.DRAW_AREA_KEY.equals( key ) ) { if ( Preferences.getBoolean( key ) ) { lowerJButton( drawArea ); } else { raiseJButton( drawArea ); } } else if ( Preferences.DRAW_SIGHTINGS_KEY.equals( key ) ) { if ( Preferences.getBoolean( key ) ) { lowerJButton( drawSightings ); } else { raiseJButton( drawSightings ); } } else if ( Preferences.DRAW_LABELS_KEY.equals( key ) ) { if ( Preferences.getBoolean( key ) ) { lowerJButton( drawLabel ); } else { raiseJButton( drawLabel ); } } else*/ if ( Preferences.QOS_KEY.equals( key ) ) { qosSlider.setValue( Preferences.getInteger( key, JiGLEMapper.MIN_QOS ) ); } } private static final long MINUTEINMS = 60000L; private static final long HOURINMS = 3600000L; private static final long DAYINMS = 86400000L; private static final long WEEKINMS = 604800000L; private static final long MONTHINMS = 2419200000L; public void updateDateSlider( JiGLEDataSet data ) { long dateDif; Hashtable labelHash; if (Preferences.getBoolean( Preferences.DATE_FILTER_TYPE_KEY)) { dateDif = data.getLastFoundDate().getTime() - data.getFirstFoundDate().getTime(); dateSlider.setMinimum( 0 ); dateSlider.setMaximum((int)( dateDif / 1000 )); dateSlider.setValue( (int)( dateDif / 1000 )); Preferences.setProperty( Preferences.EARLIEST_DATE_KEY, data.getFirstFoundDate().getTime() / 1000); } else { dateDif = data.getLastLastUpdate().getTime() - data.getFirstLastUpdate().getTime(); dateSlider.setMinimum( 0 ); dateSlider.setMaximum((int)( dateDif / 1000 )); dateSlider.setValue( (int)( dateDif / 1000 )); Preferences.setProperty( Preferences.EARLIEST_DATE_KEY, data.getFirstLastUpdate().getTime() / 1000 ); } dateSlider.setPaintTicks(true); dateSlider.setPaintLabels(false); Hashtable sliderLabels = new Hashtable(); if (dateDif > 0) { if (dateDif < MINUTEINMS) // One minute { dateSlider.setMajorTickSpacing((int)MINUTEINMS / 1000 / 6); for (long i = 0; i < dateDif / 1000; i += MINUTEINMS / 1000 / 6) { sliderLabels.put(new Integer((int)i),new JLabel("One")); } dateSlider.setLabelTable(sliderLabels); //dateSlider.createStandardLabels((int)MINUTEINMS / 1000 / 6); } else if (dateDif < HOURINMS) // One Hour { dateSlider.setMajorTickSpacing((int)MINUTEINMS * 10 / 1000); dateSlider.createStandardLabels((int)MINUTEINMS * 10 / 1000); } else if (dateDif < DAYINMS) // One Day { dateSlider.setMajorTickSpacing((int)HOURINMS / 1000); dateSlider.createStandardLabels((int)HOURINMS / 1000); } else if (dateDif < WEEKINMS) // One Week { dateSlider.setMajorTickSpacing((int)DAYINMS / 1000); dateSlider.createStandardLabels((int)DAYINMS / 1000); } else if (dateDif < MONTHINMS) // One Month (Four Weeks) { dateSlider.setMajorTickSpacing((int)MONTHINMS / 8 / 1000); dateSlider.createStandardLabels((int)MONTHINMS / 8 / 1000); } else if (dateDif < MONTHINMS * 3) // One Quarter (Three Months) { dateSlider.setMajorTickSpacing((int)WEEKINMS / 1000); dateSlider.createStandardLabels((int)WEEKINMS / 1000); } else if (dateDif < MONTHINMS * 6) // One Half Year (Six Months) { dateSlider.setMajorTickSpacing((int)(MONTHINMS / 1000)); for (long i = 0; i < dateDif / 1000; i += MONTHINMS / 1000 ) { sliderLabels.put(new Integer((int)i),new JLabel("One")); } dateSlider.setLabelTable(sliderLabels); //dateSlider.createStandardLabels((int)(MONTHINMS / 1000)); } else if (dateDif < MONTHINMS * 12) // One Year (Twelve Months) { dateSlider.setMajorTickSpacing((int)(MONTHINMS / 1000)); for (long i = 0; i < (dateDif / 1000); i += (MONTHINMS / 1000) ) { sliderLabels.put(new Integer((int)i), new JLabel("One")); } dateSlider.setLabelTable(sliderLabels); //dateSlider.createStandardLabels((int)(MONTHINMS / 1000)); } else if (dateDif < MONTHINMS * 24) // Two Years { dateSlider.setMajorTickSpacing((int)MONTHINMS * 2 / 1000); dateSlider.createStandardLabels((int)MONTHINMS * 2 / 1000); } else if (dateDif < MONTHINMS * 36) // Three Years { dateSlider.setMajorTickSpacing((int)MONTHINMS * 3 / 1000); dateSlider.createStandardLabels((int)MONTHINMS * 3 / 1000); } else { } dateSlider.setPaintLabels(true); } } class qosSliderListener implements ChangeListener { public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if ( ! source.getValueIsAdjusting() ) { int qos = (int)source.getValue(); Preferences.setProperty( Preferences.QOS_KEY, qos ); } } } class dateSliderListener implements ChangeListener { public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if ( ! source.getValueIsAdjusting() ) { long date = (long)source.getValue(); Preferences.setProperty( Preferences.DATE_KEY, date ); } } } }