1 package tim.prune.function;
6 import tim.prune.DataSubscriber;
7 import tim.prune.GenericFunction;
8 import tim.prune.I18nManager;
9 import tim.prune.UpdateMessageBroker;
10 import tim.prune.data.AudioClip;
11 import tim.prune.data.MediaObject;
12 import tim.prune.data.Photo;
13 import tim.prune.data.Track;
14 import tim.prune.load.MediaHelper;
15 import tim.prune.load.MediaLoadProgressDialog;
16 import tim.prune.undo.UndoLoadAudios;
17 import tim.prune.undo.UndoLoadPhotos;
20 * Function to load media asynchronously,
21 * either from inside a zip/kmz file or remotely
23 public class AsyncMediaLoader extends GenericFunction
24 implements Runnable, Cancellable
26 /** Archive from which points were loaded */
27 private File _zipFile = null;
29 private String[] _linkArray = null;
30 /** Track to use for connecting */
31 private Track _track = null;
33 private boolean _cancelled = false;
38 * @param inApp App object
39 * @param inLinkArray array of links
40 * @param inTrack Track object for connecting points
42 public AsyncMediaLoader(App inApp, File inZipFile, String[] inLinkArray, Track inTrack)
46 _linkArray = inLinkArray;
56 if (_linkArray != null)
57 new Thread(this).start();
61 public void cancel() {
66 * @return the name key
68 public String getNameKey() {
69 return "function.asyncmediaload";
73 * Execute the load in a separate thread
77 // Count links first so that progress bar can be shown
79 for (int i=0; i<_linkArray.length; i++) {
80 if (_linkArray[i] != null) {
84 if (numLinks <= 0) return;
85 // Make progress dialog
86 MediaLoadProgressDialog progressDialog = new MediaLoadProgressDialog(_app.getFrame(), this);
87 // Make array to store results
88 MediaObject[] media = new MediaObject[numLinks];
90 for (int i=0; i<_linkArray.length && !_cancelled; i++)
92 if (_linkArray[i] != null)
94 MediaObject mf = MediaHelper.createMediaObject(_zipFile, _linkArray[i]);
97 // attach media to point and set status
98 _track.getPoint(i).attachMedia(mf);
99 mf.setOriginalStatus(MediaObject.Status.TAGGED);
100 mf.setCurrentStatus(MediaObject.Status.TAGGED);
101 media[currLink] = mf;
103 if (!_app.isBusyLoading())
104 progressDialog.showProgress(currLink, numLinks);
107 try {Thread.sleep(100);} catch (InterruptedException ie) {}
110 progressDialog.close();
112 // Wait until App is ready to receive media (may have to ask about append/replace etc)
115 // Go through the loaded media and check if the points are still in the track
116 int numPhotos = 0, numAudios = 0;
117 for (currLink=0; currLink<numLinks; currLink++)
119 MediaObject mo = media[currLink];
120 if (mo != null && _track.containsPoint(mo.getDataPoint()))
122 if (mo instanceof Photo)
124 _app.getTrackInfo().getPhotoList().addPhoto((Photo) mo);
127 else if (mo instanceof AudioClip)
129 _app.getTrackInfo().getAudioList().addAudio((AudioClip) mo);
134 // Confirm and update
136 _app.completeFunction(new UndoLoadPhotos(numPhotos, 0), "" + numPhotos + " " +
137 I18nManager.getText(numPhotos == 1?"confirm.jpegload.single":"confirm.jpegload.multi"));
140 _app.completeFunction(new UndoLoadAudios(numAudios), I18nManager.getText("confirm.audioload"));
142 UpdateMessageBroker.informSubscribers(DataSubscriber.DATA_ADDED_OR_REMOVED);
147 * Wait until the App is ready
149 private void waitUntilAppReady()
151 long waitInterval = 500; // milliseconds
152 while (_app.isBusyLoading())
154 try {Thread.sleep(waitInterval);} catch (InterruptedException ie) {}