<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Troy,<br>
I have made use of the new classes that I added and I added a flip
option so that it can test the "backside" of the FlashCards.<br>
I took a look at the Hebrew spreadsheets. It looks like a fully
decomposed transliteration. If you look at the font, it is
copyrighted.by BibleWorks LLC. You have the start of an ability to load
a font and use it. If you get their permission to use the font then it
may be just a straight forward transformation of the spreadsheet. I
think it would be better if the spreadsheet could be converted into
Unicode. Anyway, I don't think I have the time to work on that.<br>
May God bless your studies!<br>
<br>
Anthony,<br>
I am going to see if I can load both your Greek and Hebrew lists.
Thanks.<br>
<br>
anthony kerr wrote:<br>
<blockquote cite="mid200409151901.48480.anton_kylie@pacific.net.au"
type="cite">
<pre wrap="">If it helps I have Mounce's words occurring 10 times and up on my website, and
a Hebrew vocab list with 800 items. Both are in unicode txt files.
in Christ
anthony
<a class="moz-txt-link-freetext" href="http://www.jesuscentral.net/jc_resources.html">http://www.jesuscentral.net/jc_resources.html</a>
On Wed, 15 Sep 2004 02:31 pm, Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Hey DM,
Thanks so much for your work. You're not a good example for me. I
find the more I procrastinate, the more work gets done! The web
installer has been a great benefit!
Just started third semester Greek, and first semester Hebrew. The
flashcards app is really a blessing to me. I have a bunch of vocab
words for Hebrew that I need to try to convert for use with flashcards.
They are in some strange font (maybe BHebrew encoding), that I need to
try to convert.
If anyone is up for an attempt, the files are at:
<a class="moz-txt-link-freetext" href="http://crosswire.org/~scribe/hebvocab.tar.gz">http://crosswire.org/~scribe/hebvocab.tar.gz</a>
Any other flash lessons, like Mounce's Greek textbook would also be
very useful for other students, I'm sure!
You guys all rock! Thank you for contributing your time to the Kingdom!
-Troy.
DM Smith wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Troy, I added 4 new classes that may prove useful:
FlashCard.java - The individual test.
Lesson.java - A named set of FlashCards
LessonSet.java - A named set of Lessons.
LessonManager.java - a manager of LessonSets.
These are not hooked into anything.
They are thrown together fairly quickly, and may have bugs, but I have
done some of testing.
How it works:
Create a LessonMgr and then call load() to get all the lessons into
core. Call store() and it will write all modified lessons to a home
account.
Thebasic idea is to create a LessonMgr in Quiz.java and in Editor.java
and pass it to MainFrame.java and to EditorFrame.java. When
MainFrame.java creates an EditorFrame, it will pass its LessonMgr to it.
I have also added a copyright notice to the top of every file. I used
the copyright from JSword and changed JSword to FlashCards. If this is
not correct, it can be changed.
DM Smith wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Sorry for the delay in answering. Just got back from a weekend holiday.
Troy, I am going to be fairly complete. Probably much of this you have
figured out by now or already knew. My goal in doing this is that
FlashCards is your baby and I want you to have full knowledge of what
I have done. So that you will feel fairly comfortable with the changes.
The CWClassLoader finds resources using a fairly sophisticated lookup
mechanism so that you will not have to create your own.
Here is the basic history, design and implementation of CWClassLoader
and ResourceUtil: (This should help to answer your question)
Java's basis mechanism for lookup is either explicit (i.e. I know
where the file is so I construct a path name from what is known.) or
implicit (i.e. use the class path to look for the file.) The latter
mechanism was that if you called classObj.getResource(xyz), it had one
of two behaviors. If the name began with a '/' the resource would be
sought for along the classpath. If it did not it was looked for in the
same directory as the definition of the class object.
Since the program could be installed anywhere, we initially supplied a
shell script (bat file) that would start up the program. Relative to
that directory, we had a resource directory where all resources were
kept. The path of the resource directory was passed into the program
and it was put on the classpath. With this we could either use
explicit lookup or call getResource using '/'.
For JSword, the resources were initially being kept in files that had
dotted names like files in packages:
E.g. org.crosswire.jsword.book.BibleInfo.properties
The purpose of this was to allow a developer to easily change the
properties. It was also the place where the program maintained
persistent performance data that was used for the progress meters.
When we went to WebStart, a couple of things happened. First, we could
not write to the resource directory. So we had to have a different
location. Second, since webstart requires all resources to be held in
signed jars, the developer could not modify the resources. Third, we
had no idea where WebStart would store the program, so we could not
pass in the installation location. Fourth, we no longer had control
over the classpath that was created and could not add an arbitrary
directory location.
We had worked out a way that we could use getResource to find a
resource, but now needed to also explicitly look for it in the file
system as well. So we wrote code that first looked in ~/.jsword and
then in the jars. This was all well and good, but when we went to
internationalize the program, we had to treat the property files as
ResourceBundles. And ResourceBundles always use a class loader to find
resources. So we had to migrate the lookup to a ClassLoader and use it.
So, in a nutshell here is how it works. Lets say that you have a
resource called lessonA.flash that is used by
org.crosswire.flashcards.Reader. If CWClassLoader is used to find
lessons/black/lessonA.flash via ResourceUtil.getResource(). It will
look for the file in the following places with the following names:
First look for it relative to the package:
1) org.crosswire.flashcards.lessons.black.lessonA.flash in ~/.flashcards
2) org.crosswire.flashcards.lessons.black.lessonA.flash in a jar
Then look for it relative to the root of the classpath:
3) lessons.black.lessonA.flash in ~/.flashcards
4) lessons.black.lessonsA.flash in the a jar
Finally look for it as a file:
5) lessons/black/lessonA.flash in ~/.flashcards
6) lessons/black/lessonA.flash in the jar
That is, it manages the lookup for you.
To have it look in ~/.flashcards the program needs to do the
following: (Assume DIR_PROJECT is .flashcards)
String path = System.getProperty("user.home") +
File.separator + DIR_PROJECT; //$NON-NLS-1$
URL home = new URL(FILE_PROTOCOL, null, path);
CWClassLoader.setHome(home);
If two different programs (Quiz and Editor) work on the same location,
then both programs need to have these three lines.
The twist that FlashCards has that is not present in JSword, it that
JSword merely looks up a known resource, but FlashCards discovers what
resources it has available. FlashCards then has the additional step of
creating a map of discovered resources. When it discovers the resource
it does not remember whether it was found in the filesystem or in the
jar. It lets the ResourceUtil.getResource figure that out at that time.
So in looking at the code you will find that it looks for lessons thusly
It first digs into the jar to get lessons with getJarLessons. Since
these are not located in org.crosswire.flashcards, a '/' is prefixed.
Then it looks in the file system with getHomeLessons.
As it gets the lessons, they are stored by their path. Then by their
URL with the widget.
Now if one of these lessons is loaded into the Editor, it may have
come from the jar or it may have come from the filesystem. It really
does not matter. ResourceUtil.getResource will sort it out. When the
file is written out, it will need to be saved in the filesystem. Any
URLs that are remembered for the resource will have to be updated.
(Right now each checkbox remembers the URL. If this were to change to
being the path, then no place would need to be adjusted.)
So here are the changes I see that the program needs to have done to
make it work with what it has:
1) Add CWClassLoader.setHome to EditorFrame so it will work in stand
alone mode.
2) change the JFileChoosers to look in CWClassLoader.getHome() (i.e.
line 213 in MainFrame, 45 and 62 in EditorFrame)
3) Store the path on the widget (i.e. a String and not an URL) and do
the lookup for the URL when the lesson is loaded.
At this time, the program assumes that the lessons are in a
subdirectory of a "lessons" directory. So some thought may want to be
put into whether this is a good restriction or not. If so, the user
really does not need to open a JFileChooser, they could either pick an
existing lesson to edit or create one from scratch by naming the
lesson set (e.g. black) and the lesson (e.g. lesson01vocab). The
program would be responsible for converting this to a path and writing
it to the file system.
If the user can write to any location then CWClassLoader would need to
change setHome to setHomePath and each location would need to be
stored in a persistent location so it could be remembered the next run.
I would also suggest a change to the setup screen, where the name of
the lesson set is pickable (JComboBox or JList would do). When it is
picked, then a list of lessons is populated. I suggest having a
scrollable JList of the checkboxes.
The trick would be to have the JComboBox listen for the creation of
new lesson sets and the lesson listing to update when they are added,
deleted or renamed or reordered. I suggest the Observer pattern using
a LessonEditEvent and a LessonEditEventListener.
As I "broke" the editing function, I would be willing to help in
whatever way you wish.
Hope this helps,
DM
Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Hey DM,
Been working on re-adding support for editing files into
flashcards and am trying to understand how things work. Help me
learn about the need for the classloader extension.
Here is what I think the path might be for loading the lesson
groups.
1. look on the resource path (basically, the flashcards.jar file)
for "lessons/<lesson_group>/*.flash
2. CWD "<a class="moz-txt-link-freetext" href="file:lessons/">file:lessons/</a><lesson_group>/*.flash
3. CWD "<a class="moz-txt-link-freetext" href="jar:file:lessons/*.jar!/lessons/">jar:file:lessons/*.jar!/lessons/</a><lesson_group>/*.flash
4. HOME "<a class="moz-txt-link-freetext" href="file:${user.home">file:${user.home</a>}/.flashcards/lessons/
<lesson_group>/*.flash
5. HOME "jar:<a class="moz-txt-link-freetext" href="file:${user.home">file:${user.home</a>}/.flashcards/lessons/
*.jar!/lessons/<lesson_group>/*.flash
I was going to attempt to write this today with 2 functions which
could be called from the quizzer and the editor could use at least
the first when the path is chosen:
// called for each <lesson_group> found
public static void addLessonGroup(Map lessonGroups, URL url);
// called 5 times with above logic
public static Vector discoverLessonGroups(URL lessonsPath);
...but thought it best to ask you for direction, as I still don't
understand the function of the class loader.
Thanks for your efforts and in advance for your guidance!
-Troy.
DM Smith wrote:
</pre>
<blockquote type="cite">
<pre wrap="">For those that were following this thread. Troy, John and I took it
the conversation offline to figure out the problem.
We have fixed the problem (which was that the jar did not have the
image files needed for the editor).
The program is available via webstart at <a class="moz-txt-link-abbreviated" href="http://www.crosswire.org/flashcards">www.crosswire.org/flashcards</a>.
John's addition to the program is the ability to run the editor from
inside of the quizzer.
Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">OK John,
Here's my latest discoveries.
If I build on the server with ant and jdk 1.5.0, I have the
null editor window, running on XP jdk 1.4.1.
If I build on the server with ant and jdk 1.4.2, I have the
null editor window, running on XP jdk 1.4.1.
If I build on the server with your build script and jdk 1.5.0,
I get 1.5.0 compile errors which have been fixed and committed, and
then I get:
Exception in thread "main" java.lang.UnsupportedClassVersionError:
org/crosswire /flashcards/Quiz (Unsupported major.minor version 49.0)
which is probably expected from XP and jdk 1.4.1
If I build on the server with your build script and jdk 1.4.2
everything works on XP jdk 1.4.1.
Hope we can track this down.
-Troy.
get On Thu, 9 Sep 2004, John Jacques wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Troy,
I don't get anything when I try to run the editor from the MainMenu
using webstart (Quiz does work). All works well when I run from the
command line (on Linux):
$ java -jar flashcards.jar
The Editor is the correct size etc.
I almost have my local web server set up to allow me to use
webstart. The last remaining obsticle is signing the jar file! I am
trying as recommended
(<a class="moz-txt-link-freetext" href="http://java.sun.com/j2se/1.4.2/docs/guide/jws/developersguide/devel">http://java.sun.com/j2se/1.4.2/docs/guide/jws/developersguide/devel</a>
opment.html#signing) but haven't been able to obtain 'unrestricted
access'...
On Thu, 2004-09-09 at 12:20, Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">John,
We could try setting a size. It's not necessarily a webstart
issue. I got that error I reported to you by running the
produced jar
file on an XP box. If you click on the webstart link from this
page:
<a class="moz-txt-link-freetext" href="http://crosswire.org/flashcards/">http://crosswire.org/flashcards/</a>
does the edit choice work for you?
I can grab the corner of the very small editor window and resize it
larger, but there is nothing on the client area.
If you'd really like the breathing marks to be entered before the
letters,
the IM mechanism supports multiple keystroke for character
entry. This is
used in the Michigan Claremont Hebrew keymap, if you'd like to
see how it
works. Actually, just reviewed HebrewMCIM.java and it looks really
convoluted. Sorry about that.
Thanks for your work!
-Troy.
On Wed, 8 Sep 2004, John Jacques wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Troy,
The main difference I see is that MainFrame.java doesn't use
java.awt.Toolkit to determine the screen size as in
Editor.java. It
might be worth setting a screen size there...
I'm glad my other changes didn't break anything!
I'll try to set up webstart on a local webserver. Looks like I
would
just have to edit Flashcards.jnlp. Is it that simple?
On Wed, 2004-09-08 at 16:49, Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">John,
Thank you for your recent submissions. I have updated the
webstart installer to the latest code and the editor doesn't
seem to
launch for me. I get an error:
ERROR :
org.crosswire.flashcards.EditorFrame[frame0,0,0,0x0,invalid,hidde
n,layo
ut=java.awt.BorderLayout,title=,resizable,normal,defaultCloseOper
ation=HIDE_ON_C
LOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax
.swing.JRootPan
e$RootLayout,alignmentX=null,alignmentY=null,border=,flags=385,ma
ximumSize=,mini
mumSize=,preferredSize=],rootPaneCheckingEnabled=true] :
Thread[main,5,main]
null
and a very small windows (actually just the titlebar).
Let me know if you have an idea what it might be. Thank you.
-Troy.
On Wed, 18 Aug 2004, John Jacques wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Troy,
I'm going to check in my changes to flashcards. So far there
are no
major changes, just minor fixes.
If I want to make larger changes, should we branch? Does the
revision
(4 in this case) match up with other CrossWire software such
as modedit
(which I believe is used elsewhere)?
One last question, is there a mailing list, or any other
forum, where
new ideas should be discussed before they are implemented?
On Sun, 2004-08-15 at 03:23, Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">John,
We've recently changed servers and it has been keeping me
busy for the
past few weeks. We just put a new live SVN repository online
at:
<a class="moz-txt-link-freetext" href="https://crosswire.org/svn/flashcards/">https://crosswire.org/svn/flashcards/</a>
The repository permission is currently WORLD READ/WRITE. If
you would
like to commit your changes to the repository, you are
welcome to do so.
Not sure if you've had subversion experience. If now, you
can find
info and software at:
<a class="moz-txt-link-freetext" href="http://subversion.tigris.org">http://subversion.tigris.org</a>
Thanks again for your willingness to help.
-Troy.
John Jacques wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Troy,
I made the following changes. Let me know if you keep any
of them!
There are files named "Changes.eruditelite" in any directory
I made
changes in that describe each change and the modified
files. I have
also included the change files in this messages (see below).
Are you using a revision control system?
Also, what do you think of the following proposals:
1) Add a Quiz mode in which the user is presented with the
vocabulary word only (not multiple choice) and then the
answer (either time delayed or by pressing a
button). The
user then indicates whether they knew the word or
not. The
current mode (multiple choice) would still be
available.
2) Cleanup ".flash" files when saving (eliminate unused
entries, renumber etc.)
========== In the top directory:
1) Added GNUmakefile to speedup working from emacs/command
line.
2) Updated to the latest (on the website 22 July 2004)
modedit. This
allowed me to enter text (classical greek) in Mandrake
10.0. 3) Added MounceBasicsChapter04.flash (Vocabulary from
Chapter 4 of
Mounce's Basics of Biblical Greek).
========== In src/flash:
1) Changed tool tip for "Save" from "Help" to "Save"
(EditorFrame.java:102)
2) Stopped displaying exception on startup when
"NewLesson.flash"
didn't exist. (EidtorFrame.java:247)
On Sat, 2004-07-17 at 16:37, Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">John,
Thanks for the offer. We'd love any help you'd be
willing to
volunteer. That's how our open projects improve! You'll
find the source
in the same directory pointed to by the download link. I
don't think we
have an actual link to it yet.
We do have some c++/linux/handheld apps:
<a class="moz-txt-link-freetext" href="http://crosswire.org/qpsword/">http://crosswire.org/qpsword/</a>
And we'd love to see flashcards run on the Zaurus! :)
Or at least
a client that reads the same lesson formats.
Thanks you again for your persistence to get our app to
work and
willingness to help!
-Troy A. Griffitts
On Sat, 17 Jul 2004, John Jacques wrote:
</pre>
<blockquote type="cite">
<pre wrap="">Troy,
Thanks for the response! The final sigma is " (double
quote) and my
confusion about saving a new list was the pop-up hint for
the save
button (which says "Help"). It all works now...
If you are interested in programming help, let me know. I
am a
programmer (embedded Linux/Real Time) so most of my
experience is OS
porting and device drivers but I have written a fair
amount of Java
(~7,000 lines) including a Swing GUI.
On Sat, 2004-07-17 at 07:02, Troy A. Griffitts wrote:
</pre>
<blockquote type="cite">
<pre wrap="">John, I believe that final sigma is the ' key. Did you
type a filename
in the filename box before you hit save? I realize this
isn't an
orthodox method for saving a new file, but it's a first
rev of the
software. Please let me know if this information hasn't
helped get you
going.
-Troy A. Griffitts.
John Jacques wrote:
</pre>
<blockquote type="cite">
<pre wrap="">First of all, thank you for a wonderful program!
However, I can't seem
to get FlashEditor.jar to save any of the changes I make
or let me enter
a sigma (the end of word sigma that is)...
_______________________________________________
sword-support mailing list
<a class="moz-txt-link-abbreviated" href="mailto:sword-support@crosswire.org">sword-support@crosswire.org</a>
</pre>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<pre wrap="">_______________________________________________
jsword-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:jsword-devel@crosswire.org">jsword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://www.crosswire.org/mailman/listinfo/jsword-devel">http://www.crosswire.org/mailman/listinfo/jsword-devel</a>
</pre>
</blockquote>
<pre wrap="">_______________________________________________
jsword-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:jsword-devel@crosswire.org">jsword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://www.crosswire.org/mailman/listinfo/jsword-devel">http://www.crosswire.org/mailman/listinfo/jsword-devel</a>
</pre>
</blockquote>
<pre wrap="">_______________________________________________
jsword-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:jsword-devel@crosswire.org">jsword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://www.crosswire.org/mailman/listinfo/jsword-devel">http://www.crosswire.org/mailman/listinfo/jsword-devel</a>
</pre>
</blockquote>
<pre wrap="">_______________________________________________
jsword-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:jsword-devel@crosswire.org">jsword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://www.crosswire.org/mailman/listinfo/jsword-devel">http://www.crosswire.org/mailman/listinfo/jsword-devel</a>
</pre>
</blockquote>
<pre wrap="">_______________________________________________
jsword-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:jsword-devel@crosswire.org">jsword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://www.crosswire.org/mailman/listinfo/jsword-devel">http://www.crosswire.org/mailman/listinfo/jsword-devel</a>
</pre>
</blockquote>
<pre wrap="">_______________________________________________
sword-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:sword-devel@crosswire.org">sword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://www.crosswire.org/mailman/listinfo/sword-devel">http://www.crosswire.org/mailman/listinfo/sword-devel</a>
</pre>
</blockquote>
<pre wrap=""><!---->_______________________________________________
sword-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:sword-devel@crosswire.org">sword-devel@crosswire.org</a>
<a class="moz-txt-link-freetext" href="http://www.crosswire.org/mailman/listinfo/sword-devel">http://www.crosswire.org/mailman/listinfo/sword-devel</a>
</pre>
</blockquote>
</body>
</html>