implement progress bar for swing application

git-svn-id: https://osmand.googlecode.com/svn/trunk@49 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-05-08 22:42:56 +00:00
parent 2a94d0beb1
commit acd99e37e6
9 changed files with 376 additions and 58 deletions

View file

@ -11,6 +11,8 @@ import java.util.List;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tools.bzip2.CBZip2InputStream; import org.apache.tools.bzip2.CBZip2InputStream;
import org.apache.tools.bzip2.CBZip2OutputStream; import org.apache.tools.bzip2.CBZip2OutputStream;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
@ -68,6 +70,7 @@ import com.osmand.swing.OsmExtractionUI;
* *
*/ */
public class DataExtraction { public class DataExtraction {
private static final Log log = LogFactory.getLog(DataExtraction.class);
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XMLStreamException { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XMLStreamException {
new DataExtraction().testReadingOsmFile(); new DataExtraction().testReadingOsmFile();
@ -95,7 +98,7 @@ public class DataExtraction {
Region country; Region country;
if(parseOSM){ if(parseOSM){
country = readCountry(f); country = readCountry(f, new ConsoleProgressImplementation());
} else { } else {
country = new Region(null); country = new Region(null);
country.setStorage(new OsmBaseStorage()); country.setStorage(new OsmBaseStorage());
@ -129,8 +132,9 @@ public class DataExtraction {
} }
public Region readCountry(String path) throws IOException, SAXException{ public Region readCountry(String path, IProgress progress) throws IOException, SAXException{
InputStream stream = new FileInputStream(path); InputStream stream = new FileInputStream(path);
InputStream streamFile = stream;
long st = System.currentTimeMillis(); long st = System.currentTimeMillis();
if(path.endsWith(".bz2")){ if(path.endsWith(".bz2")){
if (stream.read() != 'B' || stream.read() != 'Z') if (stream.read() != 'B' || stream.read() != 'Z')
@ -140,6 +144,9 @@ public class DataExtraction {
stream = new CBZip2InputStream(stream); stream = new CBZip2InputStream(stream);
} }
if(progress != null){
progress.startTask("Loading file " + path, -1);
}
// preloaded data // preloaded data
places = new ArrayList<Node>(); places = new ArrayList<Node>();
@ -188,8 +195,10 @@ public class DataExtraction {
}; };
storage.parseOSM(stream, new ConsoleProgressImplementation()); storage.parseOSM(stream, progress, streamFile);
System.out.println("File parsed : " +(System.currentTimeMillis() - st)); if (log.isDebugEnabled()) {
log.debug("File parsed : " + (System.currentTimeMillis() - st));
}
// 1. found towns ! // 1. found towns !
Region country = new Region(null); Region country = new Region(null);

View file

@ -13,7 +13,9 @@ public abstract class DefaultLauncherConstants {
public static String pathToOsmFile = pathToTestDataDir + "minsk.osm"; public static String pathToOsmFile = pathToTestDataDir + "minsk.osm";
public static String pathToOsmBz2File = pathToTestDataDir + "belarus_2010_04_01.osm.bz2"; public static String pathToOsmBz2File = pathToTestDataDir + "belarus_2010_04_01.osm.bz2";
public static String pathToDirWithTiles = pathToTestDataDir +"MinskTiles";
public static String pathToWorkingDir = pathToTestDataDir +"osmand\\";
public static String pathToDirWithTiles = pathToWorkingDir +"tiles";
public static String writeTestOsmFile = "C:\\1_tmp.osm"; // could be null - wo writing public static String writeTestOsmFile = "C:\\1_tmp.osm"; // could be null - wo writing

View file

@ -31,8 +31,16 @@ public class ToDoConstants {
// 4. Revise UI icons/layout // 4. Revise UI icons/layout
// 5. Fix Java Spring to prepare your data!!! (add progress, import/export data) // 5. Fix Java Spring to prepare your data!!! (add progress, import/export data)
// 6. Enable city/streets/buildings index // 6. Enable city/streets/buildings index
// 7. Search for city/streets/buildings! // 7. Search for city/streets/buildings!
// 8. Enable change POI directly on map
// ------------------- // -------------------
/// SWING version :
// TODO :
// 1. save preferences ? where?
// 2. specify area to download tiles ()
// 3. implement mouse wheel to zoom (add zoom buttons)
// 4. download tiles without using dir tiles
} }

View file

@ -59,6 +59,7 @@ public class Amenity {
prebuiltMap.put("dentist", AmenityType.HEALTHCARE); prebuiltMap.put("dentist", AmenityType.HEALTHCARE);
prebuiltMap.put("doctors", AmenityType.HEALTHCARE); prebuiltMap.put("doctors", AmenityType.HEALTHCARE);
prebuiltMap.put("veterinary", AmenityType.HEALTHCARE); prebuiltMap.put("veterinary", AmenityType.HEALTHCARE);
prebuiltMap.put("first_aid", AmenityType.HEALTHCARE);
prebuiltMap.put("architect_office", AmenityType.ENTERTAINMENT); prebuiltMap.put("architect_office", AmenityType.ENTERTAINMENT);
prebuiltMap.put("arts_centre", AmenityType.ENTERTAINMENT); prebuiltMap.put("arts_centre", AmenityType.ENTERTAINMENT);

View file

@ -52,22 +52,22 @@ public class OsmBaseStorage extends DefaultHandler {
// this is used to show feedback to user // this is used to show feedback to user
private IProgress progress; private IProgress progress;
private InputStream inputStream; private InputStream inputStream;
private InputStream streamForProgress;
/** public synchronized void parseOSM(InputStream stream, IProgress progress, InputStream streamForProgress) throws IOException, SAXException {
* @param stream
* @throws IOException
* @throws SAXException - could be
*/
public synchronized void parseOSM(InputStream stream, IProgress progress) throws IOException, SAXException {
this.inputStream = stream; this.inputStream = stream;
this.progress = progress; this.progress = progress;
this.streamForProgress = streamForProgress;
if(streamForProgress == null){
streamForProgress = inputStream;
}
SAXParser parser = initSaxParser(); SAXParser parser = initSaxParser();
parseStarted = false; parseStarted = false;
entities.clear(); entities.clear();
if(progress != null){ if(progress != null){
progress.startWork(stream.available()); progress.startWork(streamForProgress.available());
} }
parser.parse(stream, this); parser.parse(stream, this);
@ -77,6 +77,16 @@ public class OsmBaseStorage extends DefaultHandler {
completeReading(); completeReading();
} }
/**
* @param stream
* @throws IOException
* @throws SAXException - could be
*/
public synchronized void parseOSM(InputStream stream, IProgress progress) throws IOException, SAXException {
parseOSM(stream, progress, null);
}
private SAXParser saxParser; private SAXParser saxParser;
public SAXParser initSaxParser(){ public SAXParser initSaxParser(){
if(saxParser != null){ if(saxParser != null){
@ -130,10 +140,10 @@ public class OsmBaseStorage extends DefaultHandler {
} }
parseStarted = true; parseStarted = true;
} }
if (currentParsedEntity == null) { if (currentParsedEntity == null && streamForProgress != null) {
if(progress != null && !progress.isIndeterminate()){ if(progress != null && !progress.isIndeterminate()){
try { try {
progress.remaining(inputStream.available()); progress.remaining(streamForProgress.available());
} catch (IOException e) { } catch (IOException e) {
progress.startWork(-1); progress.startWork(-1);
} }

View file

@ -0,0 +1,19 @@
package com.osmand.swing;
public class DataExtractionSettings {
private static DataExtractionSettings settings = null;
public static DataExtractionSettings getSettings(){
if(settings == null){
settings = new DataExtractionSettings();
}
return settings;
}
public void saveSettings(){
}
}

View file

@ -12,6 +12,7 @@ import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -67,17 +68,17 @@ public class OsmExtractionUI implements IMapLocationListener {
private DefaultMutableTreeNode amenitiesTree; private DefaultMutableTreeNode amenitiesTree;
private JTree treePlaces; private JTree treePlaces;
private JList searchList; private JList searchList;
private Region region;
private JFrame frame; private JFrame frame;
private JTextField searchTextField;
private JTextField searchTextField;
private Region region;
private File workingDir;
public OsmExtractionUI(final Region r){ public OsmExtractionUI(final Region r){
this.region = r; this.region = r;
createUI(); createUI();
setRegion(r); setRegion(r);
workingDir = new File(DefaultLauncherConstants.pathToWorkingDir);
} }
public static void main(String[] args) { public static void main(String[] args) {
@ -86,7 +87,7 @@ public class OsmExtractionUI implements IMapLocationListener {
} }
public void setRegion(Region region){ public void setRegion(Region region){
if(this.region == region){ if (this.region == region) {
return; return;
} }
this.region = region; this.region = region;
@ -94,29 +95,33 @@ public class OsmExtractionUI implements IMapLocationListener {
amenitiesTree = new DataExtractionTreeNode("Amenities", region); amenitiesTree = new DataExtractionTreeNode("Amenities", region);
amenitiesTree.add(new DataExtractionTreeNode("closest", region)); amenitiesTree.add(new DataExtractionTreeNode("closest", region));
root.add(amenitiesTree); root.add(amenitiesTree);
for(CityType t : CityType.values()){ if (region != null) {
DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t); for (CityType t : CityType.values()) {
root.add(cityTree); DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t);
for(City ct : region.getCitiesByType(t)){ root.add(cityTree);
DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct); for (City ct : region.getCitiesByType(t)) {
cityTree.add(cityNodeTree); DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct);
cityTree.add(cityNodeTree);
for(Street str : ct.getStreets()){
DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str); for (Street str : ct.getStreets()) {
cityNodeTree.add(strTree); DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str);
for(Entity e : str.getBuildings()){ cityNodeTree.add(strTree);
DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e); for (Entity e : str.getBuildings()) {
strTree.add(building); DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e);
strTree.add(building);
}
} }
} }
} }
} }
DataTileManager<LatLon> amenitiesManager = new DataTileManager<LatLon>(); DataTileManager<LatLon> amenitiesManager = new DataTileManager<LatLon>();
for(Amenity a : region.getAmenityManager().getAllObjects()){ if (region != null) {
amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon()); for (Amenity a : region.getAmenityManager().getAllObjects()) {
} amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon());
}
}
mapPanel.setPoints(amenitiesManager); mapPanel.setPoints(amenitiesManager);
updateListCities(region, searchTextField.getText(), searchList); updateListCities(region, searchTextField.getText(), searchList);
mapPanel.updateUI(); mapPanel.updateUI();
@ -269,8 +274,29 @@ public class OsmExtractionUI implements IMapLocationListener {
bar.add(menu); bar.add(menu);
MenuItem loadFile = new MenuItem("Load file..."); MenuItem loadFile = new MenuItem("Load file...");
menu.add(loadFile); menu.add(loadFile);
MenuItem specifyWorkingDir = new MenuItem("Specify working directory...");
menu.add(specifyWorkingDir);
bar.add(MapPanel.getMenuToChooseSource(mapPanel)); bar.add(MapPanel.getMenuToChooseSource(mapPanel));
specifyWorkingDir.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("Choose working directory");
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if(workingDir != null){
fc.setCurrentDirectory(workingDir);
}
if(fc.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null &&
fc.getSelectedFile().isDirectory()){
workingDir = fc.getSelectedFile();
}
}
});
loadFile.addActionListener(new ActionListener(){ loadFile.addActionListener(new ActionListener(){
@Override @Override
@ -279,7 +305,7 @@ public class OsmExtractionUI implements IMapLocationListener {
fc.setDialogTitle("Choose osm file"); fc.setDialogTitle("Choose osm file");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY); fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.setAcceptAllFileFilterUsed(true); fc.setAcceptAllFileFilterUsed(true);
fc.setCurrentDirectory(new File(DefaultLauncherConstants.pathToDirWithTiles)); fc.setCurrentDirectory(new File(DefaultLauncherConstants.pathToTestDataDir));
//System.out.println("opening fc for extension " + extension); //System.out.println("opening fc for extension " + extension);
fc.setFileFilter(new FileFilter(){ fc.setFileFilter(new FileFilter(){
@ -296,22 +322,40 @@ public class OsmExtractionUI implements IMapLocationListener {
int answer = fc.showOpenDialog(frame) ; int answer = fc.showOpenDialog(frame) ;
if (answer == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null){ if (answer == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null){
try { loadCountry(fc.getSelectedFile());
Region region = new DataExtraction().readCountry(fc.getSelectedFile().getAbsolutePath());
setRegion(region);
} catch (IOException e1) {
// TODO
e1.printStackTrace();
} catch (SAXException e1) {
// TODO
e1.printStackTrace();
}
} }
} }
}); });
}
public void loadCountry(final File f){
try {
final ProgressDialog dlg = new ProgressDialog(frame);
dlg.setRunnable(new Runnable(){
@Override
public void run() {
Region res;
try {
res = new DataExtraction().readCountry(f.getAbsolutePath(), dlg);
} catch (IOException e) {
throw new IllegalArgumentException(e);
} catch (SAXException e) {
throw new IllegalStateException(e);
}
dlg.setResult(res);
}
});
Region region = (Region) dlg.run();
setRegion(region);
} catch (InterruptedException e1) {
// TODO
e1.printStackTrace();
} catch (InvocationTargetException e1) {
// TODO
e1.printStackTrace();
}
} }
@Override @Override
@ -376,17 +420,16 @@ public class OsmExtractionUI implements IMapLocationListener {
} }
} }
public void updateListCities(Region r, String text, JList jList){ public void updateListCities(Region r, String text, JList jList) {
Collection<City> city; Collection<City> city;
if(r == null){ if (r == null) {
city = Collections.emptyList(); city = Collections.emptyList();
} else { } else {
city = r.getSuggestedCities(text, 100); city = r.getSuggestedCities(text, 100);
} }
City[] names = new City[city.size()]; City[] names = new City[city.size()];
int i=0; int i = 0;
for(City c : city){ for (City c : city) {
names[i++] = c; names[i++] = c;
} }
jList.setListData(names); jList.setListData(names);

View file

@ -0,0 +1,183 @@
package com.osmand.swing;
import java.awt.BorderLayout;
import java.awt.Component;
import java.lang.reflect.InvocationTargetException;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import com.osmand.IProgress;
public class ProgressDialog extends JDialog implements IProgress {
private static final long serialVersionUID = -3915486672514402269L;
private JProgressBar progressBar;
private JLabel label;
private Runnable run;
private InvocationTargetException exception = null;
private Object result;
private boolean finished;
// Progress variables
private static final float deltaToChange = 0.01f;
private String taskName;
private int deltaWork;
public ProgressDialog(Component parent, Runnable run){
this(parent);
this.run = run;
}
public ProgressDialog(Component parent){
super(JOptionPane.getFrameForComponent(parent), true);
initDialog();
}
public Object run() throws InvocationTargetException, InterruptedException {
finished = false;
result = null;
new WorkerThread().start();
synchronized (this) {
if(!finished){
setVisible(true);
}
}
if(exception != null){
throw exception;
}
return result;
}
private class WorkerThread extends Thread {
@Override
public void run() {
try {
if(run != null){
run.run();
}
} catch(RuntimeException e){
exception = new InvocationTargetException(e);
} finally {
synchronized (this) {
finished = true;
setVisible(false);
}
}
}
}
private void initDialog() {
JPanel pane = new JPanel(new BorderLayout());
pane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
progressBar = new JProgressBar();
pane.add(progressBar, BorderLayout.SOUTH);
label = new JLabel();
pane.add(label, BorderLayout.CENTER);
add(pane);
label.setText("Please waiting...");
progressBar.setIndeterminate(true);
setSize(550, 100);
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
public void setRunnable(Runnable run) {
this.run = run;
}
@Override
public void progress(int deltaWork) {
this.deltaWork += deltaWork;
if(change(progressBar.getValue() + deltaWork)){
progressBar.setValue(progressBar.getValue() + deltaWork);
updateMessage();
}
}
private void updateMessage() {
if(!progressBar.isIndeterminate()){
label.setText(taskName + String.format("\t%.1f %%", progressBar.getValue() * 100f / ((float) progressBar.getMaximum())));
}
}
public boolean change(int newProgress) {
if (newProgress < progressBar.getValue()) {
return false;
}
if ((newProgress - progressBar.getValue()) / ((float) progressBar.getMaximum()) < deltaToChange) {
return false;
}
return true;
}
@Override
public void remaining(int remainingWork) {
if(change(progressBar.getMaximum() - remainingWork)){
progressBar.setValue(progressBar.getMaximum() - remainingWork);
updateMessage();
}
deltaWork = progressBar.getMaximum() - remainingWork - this.progressBar.getValue();
}
public boolean isIndeterminate(){
return progressBar.isIndeterminate();
}
@Override
public void startTask(String taskName, int work) {
if(taskName == null){
taskName = "";
}
label.setText(taskName);
this.taskName = taskName;
startWork(work);
}
@Override
public void finishTask() {
if (taskName != null) {
label.setText(taskName);
}
progressBar.setIndeterminate(true);
}
@Override
public void startWork(int work) {
if(work == 0){
work = 1;
}
if(work != -1){
progressBar.setMinimum(0);
progressBar.setMaximum(work);
progressBar.setValue(0);
progressBar.setIndeterminate(false);
} else {
progressBar.setIndeterminate(true);
}
deltaWork = 0;
}
}

View file

@ -0,0 +1,43 @@
package com.osmand.swing;
import com.osmand.IProgress;
public class SwingProgressImplementation implements IProgress {
@Override
public void finishTask() {
// TODO Auto-generated method stub
}
@Override
public boolean isIndeterminate() {
// TODO Auto-generated method stub
return false;
}
@Override
public void progress(int deltaWork) {
// TODO Auto-generated method stub
}
@Override
public void remaining(int remainingWork) {
// TODO Auto-generated method stub
}
@Override
public void startTask(String taskName, int work) {
// TODO Auto-generated method stub
}
@Override
public void startWork(int work) {
// TODO Auto-generated method stub
}
}