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

View file

@ -31,8 +31,16 @@ public class ToDoConstants {
// 4. Revise UI icons/layout
// 5. Fix Java Spring to prepare your data!!! (add progress, import/export data)
// 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("doctors", AmenityType.HEALTHCARE);
prebuiltMap.put("veterinary", AmenityType.HEALTHCARE);
prebuiltMap.put("first_aid", AmenityType.HEALTHCARE);
prebuiltMap.put("architect_office", 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
private IProgress progress;
private InputStream inputStream;
private InputStream streamForProgress;
/**
* @param stream
* @throws IOException
* @throws SAXException - could be
*/
public synchronized void parseOSM(InputStream stream, IProgress progress) throws IOException, SAXException {
public synchronized void parseOSM(InputStream stream, IProgress progress, InputStream streamForProgress) throws IOException, SAXException {
this.inputStream = stream;
this.progress = progress;
this.streamForProgress = streamForProgress;
if(streamForProgress == null){
streamForProgress = inputStream;
}
SAXParser parser = initSaxParser();
parseStarted = false;
entities.clear();
if(progress != null){
progress.startWork(stream.available());
progress.startWork(streamForProgress.available());
}
parser.parse(stream, this);
@ -77,6 +77,16 @@ public class OsmBaseStorage extends DefaultHandler {
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;
public SAXParser initSaxParser(){
if(saxParser != null){
@ -130,10 +140,10 @@ public class OsmBaseStorage extends DefaultHandler {
}
parseStarted = true;
}
if (currentParsedEntity == null) {
if (currentParsedEntity == null && streamForProgress != null) {
if(progress != null && !progress.isIndeterminate()){
try {
progress.remaining(inputStream.available());
progress.remaining(streamForProgress.available());
} catch (IOException e) {
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.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@ -67,17 +68,17 @@ public class OsmExtractionUI implements IMapLocationListener {
private DefaultMutableTreeNode amenitiesTree;
private JTree treePlaces;
private JList searchList;
private Region region;
private JFrame frame;
private JTextField searchTextField;
private JTextField searchTextField;
private Region region;
private File workingDir;
public OsmExtractionUI(final Region r){
this.region = r;
createUI();
setRegion(r);
workingDir = new File(DefaultLauncherConstants.pathToWorkingDir);
}
public static void main(String[] args) {
@ -86,7 +87,7 @@ public class OsmExtractionUI implements IMapLocationListener {
}
public void setRegion(Region region){
if(this.region == region){
if (this.region == region) {
return;
}
this.region = region;
@ -94,29 +95,33 @@ public class OsmExtractionUI implements IMapLocationListener {
amenitiesTree = new DataExtractionTreeNode("Amenities", region);
amenitiesTree.add(new DataExtractionTreeNode("closest", region));
root.add(amenitiesTree);
for(CityType t : CityType.values()){
DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t);
root.add(cityTree);
for(City ct : region.getCitiesByType(t)){
DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct);
cityTree.add(cityNodeTree);
for(Street str : ct.getStreets()){
DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str);
cityNodeTree.add(strTree);
for(Entity e : str.getBuildings()){
DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e);
strTree.add(building);
if (region != null) {
for (CityType t : CityType.values()) {
DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t);
root.add(cityTree);
for (City ct : region.getCitiesByType(t)) {
DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct);
cityTree.add(cityNodeTree);
for (Street str : ct.getStreets()) {
DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str);
cityNodeTree.add(strTree);
for (Entity e : str.getBuildings()) {
DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e);
strTree.add(building);
}
}
}
}
}
DataTileManager<LatLon> amenitiesManager = new DataTileManager<LatLon>();
for(Amenity a : region.getAmenityManager().getAllObjects()){
amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon());
}
if (region != null) {
for (Amenity a : region.getAmenityManager().getAllObjects()) {
amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon());
}
}
mapPanel.setPoints(amenitiesManager);
updateListCities(region, searchTextField.getText(), searchList);
mapPanel.updateUI();
@ -269,8 +274,29 @@ public class OsmExtractionUI implements IMapLocationListener {
bar.add(menu);
MenuItem loadFile = new MenuItem("Load file...");
menu.add(loadFile);
MenuItem specifyWorkingDir = new MenuItem("Specify working directory...");
menu.add(specifyWorkingDir);
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(){
@Override
@ -279,7 +305,7 @@ public class OsmExtractionUI implements IMapLocationListener {
fc.setDialogTitle("Choose osm file");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.setAcceptAllFileFilterUsed(true);
fc.setCurrentDirectory(new File(DefaultLauncherConstants.pathToDirWithTiles));
fc.setCurrentDirectory(new File(DefaultLauncherConstants.pathToTestDataDir));
//System.out.println("opening fc for extension " + extension);
fc.setFileFilter(new FileFilter(){
@ -296,22 +322,40 @@ public class OsmExtractionUI implements IMapLocationListener {
int answer = fc.showOpenDialog(frame) ;
if (answer == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null){
try {
Region region = new DataExtraction().readCountry(fc.getSelectedFile().getAbsolutePath());
setRegion(region);
} catch (IOException e1) {
// TODO
e1.printStackTrace();
} catch (SAXException e1) {
// TODO
e1.printStackTrace();
}
loadCountry(fc.getSelectedFile());
}
}
});
}
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
@ -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;
if(r == null){
city = Collections.emptyList();
if (r == null) {
city = Collections.emptyList();
} else {
city = r.getSuggestedCities(text, 100);
}
City[] names = new City[city.size()];
int i=0;
for(City c : city){
int i = 0;
for (City c : city) {
names[i++] = c;
}
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
}
}