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 File _sourceFile = null;
35 private boolean _cancelled = false;
40 * @param inApp App object
41 * @param inLinkArray array of links
42 * @param inTrack Track object for connecting points
43 * @param inSourceFile file from which data was loaded, if any
45 public AsyncMediaLoader(App inApp, File inZipFile, String[] inLinkArray, Track inTrack, File inSourceFile)
49 _linkArray = inLinkArray;
51 _sourceFile = inSourceFile;
60 if (_linkArray != null)
61 new Thread(this).start();
65 public void cancel() {
70 * @return the name key
72 public String getNameKey() {
73 return "function.asyncmediaload";
77 * Execute the load in a separate thread
81 // Count links first so that progress bar can be shown
83 for (int i=0; i<_linkArray.length; i++) {
84 if (_linkArray[i] != null) {
88 if (numLinks <= 0) return;
89 // Make progress dialog
90 MediaLoadProgressDialog progressDialog = new MediaLoadProgressDialog(_app.getFrame(), this);
92 // Make array to store results
93 MediaObject[] media = new MediaObject[numLinks];
95 for (int i=0; i<_linkArray.length && !_cancelled; i++)
97 if (_linkArray[i] != null)
99 MediaObject mf = MediaHelper.createMediaObject(_zipFile, _linkArray[i], _sourceFile);
102 // attach media to point and set status
103 _track.getPoint(i).attachMedia(mf);
104 mf.setOriginalStatus(MediaObject.Status.TAGGED);
105 mf.setCurrentStatus(MediaObject.Status.TAGGED);
106 media[currLink] = mf;
108 if (!_app.isBusyLoading())
109 progressDialog.showProgress(currLink, numLinks);
112 try {Thread.sleep(100);} catch (InterruptedException ie) {}
115 progressDialog.close();
117 // Wait until App is ready to receive media (may have to ask about append/replace etc)
120 // Go through the loaded media and check if the points are still in the track
121 int numPhotos = 0, numAudios = 0;
122 for (currLink=0; currLink<numLinks; currLink++)
124 MediaObject mo = media[currLink];
125 if (mo != null && _track.containsPoint(mo.getDataPoint()))
127 if (mo instanceof Photo)
129 _app.getTrackInfo().getPhotoList().addPhoto((Photo) mo);
132 else if (mo instanceof AudioClip)
134 _app.getTrackInfo().getAudioList().addAudio((AudioClip) mo);
139 // Confirm and update
141 _app.completeFunction(new UndoLoadPhotos(numPhotos, 0), "" + numPhotos + " " +
142 I18nManager.getText(numPhotos == 1?"confirm.jpegload.single":"confirm.jpegload.multi"));
145 _app.completeFunction(new UndoLoadAudios(numAudios), I18nManager.getText("confirm.audioload"));
147 UpdateMessageBroker.informSubscribers(DataSubscriber.DATA_ADDED_OR_REMOVED);
152 * Wait until the App is ready
154 private void waitUntilAppReady()
156 long waitInterval = 500; // milliseconds
157 while (_app.isBusyLoading())
159 try {Thread.sleep(waitInterval);} catch (InterruptedException ie) {}