*** empty log message ***
This commit is contained in:
parent
592d1d6870
commit
a15161fc07
5 changed files with 923 additions and 0 deletions
425
source/org/thdl/tib/input/DictionaryFrame.java
Normal file
425
source/org/thdl/tib/input/DictionaryFrame.java
Normal file
|
@ -0,0 +1,425 @@
|
|||
package org.thdl.tib.input ;
|
||||
|
||||
import javax.swing.* ;
|
||||
import javax.swing.text.* ;
|
||||
import javax.swing.text.StyleConstants.FontConstants ;
|
||||
import java.awt.GridBagLayout ;
|
||||
import java.awt.GridBagConstraints ;
|
||||
import java.awt.Insets ;
|
||||
import java.awt.Rectangle ;
|
||||
import java.awt.Font ;
|
||||
import java.awt.Color ;
|
||||
import java.awt.Component ;
|
||||
import java.awt.event.KeyEvent ;
|
||||
import java.awt.event.KeyAdapter ;
|
||||
import java.awt.event.ActionListener ;
|
||||
import java.awt.event.ActionEvent ;
|
||||
import javax.swing.event.ListSelectionListener ;
|
||||
import javax.swing.event.ListSelectionEvent ;
|
||||
import java.util.concurrent.locks.ReentrantLock ;
|
||||
|
||||
class DictionaryFrame extends JFrame implements ListSelectionListener
|
||||
{
|
||||
//
|
||||
// the fields to display ..
|
||||
//
|
||||
protected JTextPane original ; // .. the original text - romanized and tibetan
|
||||
protected JTextArea pronounciation ; // .. the pronounciation
|
||||
protected DefaultListModel listModel ; //
|
||||
protected JList entryList ; // .. list of dictionary keywords
|
||||
protected JTextPane description ; // .. sequence of dictionary entries
|
||||
protected JScrollPane descriptionPane ; //
|
||||
protected JButton closeButton ;
|
||||
|
||||
protected Font fontSerif ;
|
||||
protected Font fontSansSerif ;
|
||||
|
||||
protected ReentrantLock listLock ;
|
||||
|
||||
//
|
||||
// entryList contains MyListElement-s instead of just String-s
|
||||
// (we want a number to be associated with each element to store the position within description)
|
||||
//
|
||||
class MyListElement
|
||||
{
|
||||
MyListElement ( String theStr, int theData )
|
||||
{
|
||||
str = theStr ;
|
||||
data = theData ;
|
||||
}
|
||||
|
||||
public void setIntData ( int theData )
|
||||
{
|
||||
data = theData ;
|
||||
}
|
||||
|
||||
public int getIntData ()
|
||||
{
|
||||
return data ;
|
||||
}
|
||||
|
||||
public String toString ()
|
||||
{
|
||||
return str ;
|
||||
}
|
||||
|
||||
protected String str ;
|
||||
protected int data ;
|
||||
};
|
||||
|
||||
DictionaryFrame ()
|
||||
{
|
||||
super ( "Dictionary" ) ;
|
||||
init ( null ) ;
|
||||
}
|
||||
|
||||
DictionaryFrame ( Component parent )
|
||||
{
|
||||
super ( "Dictionary" ) ;
|
||||
init ( parent ) ;
|
||||
}
|
||||
|
||||
void init ( Component parent )
|
||||
{
|
||||
listLock = new ReentrantLock () ;
|
||||
|
||||
fontSerif = new Font ( "serif", Font.PLAIN, 12 ) ;
|
||||
fontSansSerif = new Font ( "sansserif", Font.PLAIN, 12 ) ;
|
||||
|
||||
//
|
||||
// layout
|
||||
//
|
||||
GridBagLayout gridbag = new GridBagLayout () ;
|
||||
GridBagConstraints c = new GridBagConstraints () ;
|
||||
|
||||
getContentPane ().setLayout ( gridbag ) ;
|
||||
|
||||
//
|
||||
// children
|
||||
//
|
||||
original = new JTextPane () ;
|
||||
pronounciation = new JTextArea ( "" ) ;
|
||||
|
||||
listModel = new DefaultListModel () ;
|
||||
|
||||
entryList = new JList ( listModel ) ;
|
||||
entryList.addListSelectionListener ( this ) ;
|
||||
|
||||
description = new JTextPane () ;
|
||||
descriptionPane = new JScrollPane ( description,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
|
||||
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ) ;
|
||||
|
||||
closeButton = new JButton ( "Close" ) ;
|
||||
closeButton.setMnemonic ( 'c' ) ;
|
||||
closeButton.addActionListener ( new ActionListener () { public void actionPerformed ( ActionEvent e ) { closeWindow () ; } } ) ;
|
||||
|
||||
original.setEditable ( false ) ;
|
||||
pronounciation.setEditable ( false ) ;
|
||||
description.setEditable ( false ) ;
|
||||
|
||||
//
|
||||
// add them
|
||||
//
|
||||
c.insets = new Insets ( 1, 1, 1, 1 ) ;
|
||||
c.anchor = GridBagConstraints.NORTHWEST ;
|
||||
c.weightx = 1.0 ;
|
||||
c.weighty = 0.0 ;
|
||||
c.gridheight = 1 ;
|
||||
c.gridwidth = GridBagConstraints.REMAINDER ;
|
||||
c.fill = GridBagConstraints.HORIZONTAL ;
|
||||
|
||||
gridbag.setConstraints ( original, c ) ;
|
||||
getContentPane ().add ( original ) ;
|
||||
|
||||
c.anchor = GridBagConstraints.NORTHWEST ;
|
||||
c.weightx = 1.0 ;
|
||||
c.weighty = 0.0 ;
|
||||
c.gridheight = 1 ;
|
||||
c.gridwidth = GridBagConstraints.REMAINDER ;
|
||||
c.fill = GridBagConstraints.HORIZONTAL ;
|
||||
|
||||
gridbag.setConstraints ( pronounciation, c ) ;
|
||||
getContentPane ().add ( pronounciation ) ;
|
||||
|
||||
c.weighty = 1.0 ;
|
||||
c.fill = GridBagConstraints.BOTH ;
|
||||
c.gridheight = 4 ;
|
||||
c.weightx = 0.0 ;
|
||||
c.gridwidth = 1 ;
|
||||
|
||||
gridbag.setConstraints ( entryList, c ) ;
|
||||
getContentPane ().add ( entryList ) ;
|
||||
|
||||
c.fill = GridBagConstraints.BOTH ;
|
||||
c.gridheight = 4 ;
|
||||
c.gridwidth = GridBagConstraints.REMAINDER ;
|
||||
c.weightx = 3.0 ;
|
||||
|
||||
gridbag.setConstraints ( descriptionPane, c ) ;
|
||||
getContentPane ().add ( descriptionPane ) ;
|
||||
|
||||
c.anchor = GridBagConstraints.CENTER ;
|
||||
c.weightx = 1.0 ;
|
||||
c.weighty = 0.0 ;
|
||||
c.gridx = GridBagConstraints.RELATIVE ;
|
||||
c.gridy = GridBagConstraints.RELATIVE ;
|
||||
c.gridheight = 1 ;
|
||||
c.gridwidth = GridBagConstraints.RELATIVE ;
|
||||
c.fill = GridBagConstraints.HORIZONTAL ;
|
||||
|
||||
gridbag.setConstraints ( closeButton, c ) ;
|
||||
getContentPane ().add ( closeButton ) ;
|
||||
|
||||
//
|
||||
// set fonts
|
||||
//
|
||||
original.setFont ( fontSansSerif ) ;
|
||||
pronounciation.setFont ( fontSansSerif ) ;
|
||||
entryList.setFont ( fontSansSerif ) ;
|
||||
description.setFont ( fontSansSerif ) ;
|
||||
|
||||
//
|
||||
// we need F12 to toggle the visible state of the dictionary window
|
||||
//
|
||||
KeyAdapter keyAdapter = new KeyAdapter ()
|
||||
{
|
||||
public void keyPressed ( KeyEvent ev )
|
||||
{
|
||||
if ( KeyEvent.VK_F12 == ev.getKeyCode () ||
|
||||
KeyEvent.VK_ESCAPE == ev.getKeyCode () )
|
||||
toggleVisible () ;
|
||||
}
|
||||
};
|
||||
original.addKeyListener ( keyAdapter ) ;
|
||||
pronounciation.addKeyListener ( keyAdapter ) ;
|
||||
entryList.addKeyListener ( keyAdapter ) ;
|
||||
description.addKeyListener ( keyAdapter ) ;
|
||||
|
||||
//
|
||||
// finish
|
||||
//
|
||||
pack () ;
|
||||
|
||||
//
|
||||
// place the window on top of the parent frame, moving it slightly
|
||||
//
|
||||
if ( parent != null )
|
||||
setLocation ( parent.getLocation ().x, parent.getLocation ().y ) ;
|
||||
|
||||
setSize ( 500, 500 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* toggle the visibility of this window
|
||||
*/
|
||||
void toggleVisible ()
|
||||
{
|
||||
setVisible ( !isVisible () ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void closeWindow ()
|
||||
{
|
||||
setVisible ( false ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* clear all fields
|
||||
*/
|
||||
public void reset ()
|
||||
{
|
||||
//
|
||||
// clear all fields
|
||||
//
|
||||
listLock.lock () ;
|
||||
try
|
||||
{
|
||||
original.setText ( "" ) ;
|
||||
pronounciation.setText ( "" ) ;
|
||||
|
||||
description.setText ( "" ) ;
|
||||
listModel.clear () ;
|
||||
}
|
||||
finally
|
||||
{
|
||||
listLock.unlock () ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* isEmpty
|
||||
*/
|
||||
public boolean isEmpty ()
|
||||
{
|
||||
return ( original.getText ().length () > 0 ? false : true ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* set the original
|
||||
*
|
||||
* text - has the Wylie roman text
|
||||
* realDoc - ref to the actual document being edited
|
||||
* startPos, endPos - location of the text in the actual document being edited
|
||||
*/
|
||||
public void setOriginal ( String text, DefaultStyledDocument realDoc, int startPos, int endPos )
|
||||
{
|
||||
AbstractDocument doc = (AbstractDocument)original.getDocument () ;
|
||||
|
||||
SimpleAttributeSet as = new SimpleAttributeSet () ;
|
||||
as.addAttribute ( FontConstants.Family, "serif" ) ;
|
||||
try
|
||||
{
|
||||
doc.insertString ( doc.getLength (), text + " ", as ) ;
|
||||
}
|
||||
catch ( BadLocationException e )
|
||||
{
|
||||
// this should never happen
|
||||
}
|
||||
|
||||
SimpleAttributeSet as1 = new SimpleAttributeSet () ;
|
||||
|
||||
for ( int pos = startPos; pos <= endPos; pos++ )
|
||||
{
|
||||
Element el = realDoc.getCharacterElement ( pos ) ;
|
||||
|
||||
try
|
||||
{
|
||||
doc.insertString ( doc.getLength (), realDoc.getText ( pos, 1 ), el.getAttributes () ) ;
|
||||
}
|
||||
catch ( BadLocationException e )
|
||||
{
|
||||
// this should never happen
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* set the pronounciation field
|
||||
*/
|
||||
public void setPronounciation ( String text )
|
||||
{
|
||||
//
|
||||
// set the pronounciation field
|
||||
//
|
||||
pronounciation.setText ( text ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* add a dictionary entry
|
||||
*/
|
||||
public void addDescription ( String text )
|
||||
{
|
||||
//
|
||||
// add the keyword to entryList. we assume the keyword is anything in the
|
||||
// dictionary entry that precedes the first dash
|
||||
//
|
||||
|
||||
listLock.lock () ;
|
||||
|
||||
try
|
||||
{
|
||||
Document doc = description.getDocument () ;
|
||||
|
||||
try
|
||||
{
|
||||
int len = doc.getLength() ;
|
||||
if ( len > 0 )
|
||||
{
|
||||
doc.insertString ( len, "\n\n", null ) ;
|
||||
len = doc.getLength () ;
|
||||
}
|
||||
|
||||
int dashIndex = text.indexOf ( "-" ) ;
|
||||
String keyword = text.substring ( 0, dashIndex - 1 ) ;
|
||||
String entry = text.substring ( dashIndex + 1 ) ;
|
||||
|
||||
//
|
||||
// add keyword to the list box
|
||||
//
|
||||
listModel.addElement ( new MyListElement ( keyword, len ) ) ;
|
||||
|
||||
SimpleAttributeSet attrSet = new SimpleAttributeSet () ;
|
||||
StyleConstants.setBold ( attrSet, true ) ;
|
||||
StyleConstants.setUnderline ( attrSet, true ) ;
|
||||
|
||||
//
|
||||
// add entry to the list box
|
||||
//
|
||||
doc.insertString ( len, keyword, attrSet ) ;
|
||||
len = doc.getLength () ;
|
||||
|
||||
StyleConstants.setBold ( attrSet, true ) ;
|
||||
StyleConstants.setUnderline ( attrSet, false ) ;
|
||||
doc.insertString ( len, entry, null ) ;
|
||||
}
|
||||
catch ( Exception e )
|
||||
{
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
listLock.unlock () ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* called when entryList selection changes
|
||||
*/
|
||||
public void valueChanged ( ListSelectionEvent e )
|
||||
{
|
||||
//
|
||||
// get the position of the dictionary entry identified
|
||||
// by the selected entryList item.
|
||||
//
|
||||
|
||||
listLock.lock () ;
|
||||
|
||||
try
|
||||
{
|
||||
MyListElement elem = ((MyListElement)entryList.getSelectedValue ()) ;
|
||||
if ( null != elem )
|
||||
{
|
||||
int pos = elem.getIntData () ;
|
||||
|
||||
try
|
||||
{
|
||||
//
|
||||
// make sure the part of description associated with the item
|
||||
// is visible; TODO this doesn't work quite well
|
||||
//
|
||||
Rectangle rect = description.modelToView ( pos ) ;
|
||||
rect.setSize ( (int)rect.getWidth (), descriptionPane.getHeight () - 10 ) ;
|
||||
description.scrollRectToVisible ( rect ) ;
|
||||
}
|
||||
catch ( BadLocationException ble )
|
||||
{
|
||||
//
|
||||
// this should never happen
|
||||
//
|
||||
System.err.println ( "DictionaryFrame.valueChanged .. Incorrect argument passed to modelToView." ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
listLock.unlock () ;
|
||||
}
|
||||
}
|
||||
|
||||
public void gotoList ()
|
||||
{
|
||||
entryList.requestFocusInWindow () ;
|
||||
entryList.setSelectedIndex ( 0 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* unit test
|
||||
*/
|
||||
public static void main ( String [] args )
|
||||
{
|
||||
new DictionaryFrame () ;
|
||||
}
|
||||
}
|
12
source/org/thdl/tib/input/DictionaryLoadState.java
Normal file
12
source/org/thdl/tib/input/DictionaryLoadState.java
Normal file
|
@ -0,0 +1,12 @@
|
|||
package org.thdl.tib.input ;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class DictionaryLoadState
|
||||
{
|
||||
public static final int UNDEFINED = 0 ;
|
||||
public static final int READY = 1 ;
|
||||
public static final int ERROR = -1 ;
|
||||
}
|
||||
|
411
source/org/thdl/tib/input/GlobalResourceHolder.java
Normal file
411
source/org/thdl/tib/input/GlobalResourceHolder.java
Normal file
|
@ -0,0 +1,411 @@
|
|||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input ;
|
||||
|
||||
import org.thdl.tib.scanner.TibetanScanner ;
|
||||
import org.thdl.tib.scanner.LocalTibetanScanner ;
|
||||
import org.thdl.tib.scanner.RemoteTibetanScanner ;
|
||||
import org.thdl.tib.scanner.Word ;
|
||||
|
||||
import org.thdl.tib.input.SettingsChangeListener ;
|
||||
import org.thdl.tib.input.SettingsServiceProvider ;
|
||||
import org.thdl.tib.input.DictionaryLoadState ;
|
||||
|
||||
import java.awt.GraphicsEnvironment ;
|
||||
import java.awt.Font ;
|
||||
import java.net.URL ;
|
||||
import java.net.URLConnection ;
|
||||
import java.io.InputStream ;
|
||||
import java.util.HashMap ;
|
||||
import java.util.Observer ;
|
||||
import java.util.Observable ;
|
||||
|
||||
public class GlobalResourceHolder
|
||||
{
|
||||
protected static final int NUM_FONTS = 10 ;
|
||||
protected static final String FONT_NAME_PREFIX = "TibetanMachineWeb" ;
|
||||
|
||||
private static boolean flagIsUsingLocalFonts = false ;
|
||||
private static Font baseTMWFont [] = null ;
|
||||
private static Font derivedTMWFont [] = null ;
|
||||
private static HashMap nameToNumber = null ;
|
||||
private static TibetanScanner tibetanScanner = null ;
|
||||
private static SettingsServiceProvider settingsServiceProvider ;
|
||||
|
||||
private static boolean dictionaryValid = false ;
|
||||
private static boolean dictionaryEnabled = false ;
|
||||
private static boolean dictionaryLocal = false ;
|
||||
private static String dictionaryPath = "" ;
|
||||
|
||||
private static int dictionaryLoadState = DictionaryLoadState.UNDEFINED ;
|
||||
private static Object dictionaryLoadLock = null ;
|
||||
|
||||
//static class Listener implements SettingsChangeListener
|
||||
static class Listener implements Observer
|
||||
{
|
||||
/**
|
||||
* update
|
||||
*
|
||||
*/
|
||||
public void update ( Observable o, Object arg )
|
||||
{
|
||||
onSettingsChange ( ((Integer)arg).intValue () ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* onSettingsChange
|
||||
*
|
||||
*/
|
||||
public void onSettingsChange ( int setting )
|
||||
{
|
||||
if ( null == GlobalResourceHolder.settingsServiceProvider )
|
||||
return ;
|
||||
|
||||
if ( SettingsChangeListener.DICTIONARY_SETTINGS == setting )
|
||||
{
|
||||
//
|
||||
// compare with the current settings
|
||||
//
|
||||
boolean newDictionaryEnabled = GlobalResourceHolder.
|
||||
settingsServiceProvider.getDictionarySettingsEnabled () ;
|
||||
boolean newDictionaryLocal = GlobalResourceHolder.
|
||||
settingsServiceProvider.getDictionarySettingsLocal () ;
|
||||
String newDictionaryPath = GlobalResourceHolder.
|
||||
settingsServiceProvider.getDictionarySettingsPath () ;
|
||||
|
||||
|
||||
if ( newDictionaryEnabled != GlobalResourceHolder.dictionaryEnabled ||
|
||||
newDictionaryLocal != GlobalResourceHolder.dictionaryLocal ||
|
||||
! newDictionaryPath.equals ( GlobalResourceHolder.dictionaryPath ) )
|
||||
{
|
||||
GlobalResourceHolder.dictionaryEnabled = newDictionaryEnabled ;
|
||||
GlobalResourceHolder.dictionaryLocal = newDictionaryLocal ;
|
||||
GlobalResourceHolder.dictionaryPath = newDictionaryPath ;
|
||||
|
||||
|
||||
GlobalResourceHolder.tibetanScanner = GlobalResourceHolder.loadDictionaryScanner () ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Listener listenerObj = null ;
|
||||
|
||||
static
|
||||
{
|
||||
listenerObj = new Listener () ;
|
||||
|
||||
//
|
||||
// we have no service provider until the client class is born
|
||||
//
|
||||
settingsServiceProvider = null ;
|
||||
|
||||
//
|
||||
// init the font array
|
||||
//
|
||||
//
|
||||
baseTMWFont = new Font [ NUM_FONTS ] ;
|
||||
derivedTMWFont = new Font [ NUM_FONTS ] ;
|
||||
|
||||
//
|
||||
// if TibetanMachineWeb fonts are not installed
|
||||
// load the fonts from the .jar file and set
|
||||
// the flag
|
||||
//
|
||||
if ( ! isTMWInstalled () )
|
||||
setLocalFonts () ;
|
||||
|
||||
//
|
||||
// initialize the dictionary stuff
|
||||
//
|
||||
tibetanScanner = null ;
|
||||
|
||||
dictionaryValid = false ;
|
||||
dictionaryEnabled = false ;
|
||||
dictionaryLocal = false ;
|
||||
dictionaryPath = "" ;
|
||||
|
||||
dictionaryLoadLock = new Object () ;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public static Listener getListener ()
|
||||
{
|
||||
return listenerObj ;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static int getDictionaryLoadState ()
|
||||
{
|
||||
int state ;
|
||||
synchronized ( dictionaryLoadLock )
|
||||
{
|
||||
state = dictionaryLoadState ;
|
||||
}
|
||||
|
||||
return state ;
|
||||
}
|
||||
|
||||
public static void waitForDictionary ()
|
||||
{
|
||||
synchronized ( dictionaryLoadLock )
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* loadDictionaryScanner
|
||||
*
|
||||
*/
|
||||
protected static TibetanScanner loadDictionaryScanner ()
|
||||
{
|
||||
//return new LocalTibetanScanner ( "F:/tmp/free/free" ) ;
|
||||
TibetanScanner ts = null ;
|
||||
|
||||
if ( ! dictionaryEnabled )
|
||||
return null ;
|
||||
|
||||
dictionaryValid = false ;
|
||||
|
||||
synchronized ( dictionaryLoadLock )
|
||||
{
|
||||
dictionaryLoadState = DictionaryLoadState.UNDEFINED ;
|
||||
|
||||
try
|
||||
{
|
||||
if ( dictionaryLocal )
|
||||
{
|
||||
ts = new LocalTibetanScanner ( dictionaryPath ) ;
|
||||
dictionaryValid = true ;
|
||||
}
|
||||
else
|
||||
{
|
||||
ts = new RemoteTibetanScanner ( dictionaryPath ) ;
|
||||
dictionaryValid = true ;
|
||||
}
|
||||
|
||||
dictionaryLoadState = DictionaryLoadState.READY ;
|
||||
}
|
||||
catch ( Exception e )
|
||||
{
|
||||
System.err.println ( "TibetanScanner.loadDictionaryScanner () --> " + e.toString () ) ;
|
||||
dictionaryLoadState = DictionaryLoadState.ERROR ;
|
||||
}
|
||||
}
|
||||
|
||||
return ts ;
|
||||
}
|
||||
|
||||
/*
|
||||
* isTMWInstalled ()
|
||||
*
|
||||
* returns true if TibetanMachineWeb fonts are
|
||||
* installed on the system.
|
||||
*/
|
||||
protected static boolean isTMWInstalled ()
|
||||
{
|
||||
String [] familyNames =
|
||||
GraphicsEnvironment.getLocalGraphicsEnvironment ().getAvailableFontFamilyNames () ;
|
||||
|
||||
int mask = 0 ;
|
||||
|
||||
for ( int i = 0; i < familyNames.length; i++ )
|
||||
{
|
||||
String family = familyNames [i] ;
|
||||
|
||||
if ( family.startsWith ( FONT_NAME_PREFIX ) )
|
||||
{
|
||||
int fontNum = 0 ;
|
||||
|
||||
if ( family == FONT_NAME_PREFIX )
|
||||
{
|
||||
fontNum = 1 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
fontNum = Character.digit ( family.charAt ( family.length () - 1 ), 10 ) ;
|
||||
|
||||
if ( fontNum < 0 || fontNum > NUM_FONTS )
|
||||
{
|
||||
fontNum = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
if ( fontNum > 0 )
|
||||
{
|
||||
mask |= ( 1 << (fontNum-1) ) ;
|
||||
if ( ( ( 1 << NUM_FONTS ) - 1 ) == mask )
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false ;
|
||||
}
|
||||
|
||||
/*
|
||||
* setLocalFonts ()
|
||||
*
|
||||
* loads the fonts from Fonts directory in
|
||||
* the .jar file, if the dir exists
|
||||
*
|
||||
*/
|
||||
protected static void setLocalFonts ()
|
||||
{
|
||||
nameToNumber = new HashMap () ;
|
||||
|
||||
for ( int i = 0; i < NUM_FONTS; i++ )
|
||||
{
|
||||
String suffix = ((i>0)?String.valueOf (i):"") ;
|
||||
URL url =
|
||||
GlobalResourceHolder.class.getResource ( "/Fonts/TibetanMachineWeb/timwn" + suffix + ".ttf" ) ;
|
||||
|
||||
if ( null != url )
|
||||
{
|
||||
try
|
||||
{
|
||||
URLConnection conn = url.openConnection () ;
|
||||
InputStream is = conn.getInputStream () ;
|
||||
baseTMWFont [i] = Font.createFont ( Font.TRUETYPE_FONT, is ) ;
|
||||
is.close () ;
|
||||
}
|
||||
catch ( Exception e )
|
||||
{
|
||||
System.err.println ( "Failed to load fonts from JAR !" ) ;
|
||||
flagIsUsingLocalFonts = false ;
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// we use a hash map to translate font names into their numbers (indices)
|
||||
//
|
||||
nameToNumber.put ( FONT_NAME_PREFIX + ( ( 0 == i ) ? "" : String.valueOf (i) ), new Integer ( i ) ) ;
|
||||
}
|
||||
|
||||
flagIsUsingLocalFonts = true ;
|
||||
}
|
||||
|
||||
/*
|
||||
* setFontSize
|
||||
*
|
||||
* notifies the GlobalResource about the most probably used font size
|
||||
*
|
||||
*/
|
||||
protected static void setFontSize ( int fontSize )
|
||||
{
|
||||
if ( !flagIsUsingLocalFonts )
|
||||
return ;
|
||||
|
||||
if ( null == derivedTMWFont [0] || fontSize != derivedTMWFont [0].getSize () )
|
||||
{
|
||||
for ( int i = 0; i < NUM_FONTS; i++ )
|
||||
{
|
||||
derivedTMWFont [i] = baseTMWFont [i].deriveFont ( Font.PLAIN, fontSize ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* getFont ( fontName, size )
|
||||
*
|
||||
*/
|
||||
public static Font getFont ( String fontName, int fontSize )
|
||||
{
|
||||
Integer intObj = (Integer)nameToNumber.get ( fontName ) ;
|
||||
|
||||
if ( intObj != null )
|
||||
{
|
||||
int fontNum = intObj.intValue () ;
|
||||
return getFont ( fontNum, fontSize ) ;
|
||||
}
|
||||
|
||||
return null ;
|
||||
}
|
||||
|
||||
/*
|
||||
* getFont ( fontNum, size )
|
||||
*
|
||||
*/
|
||||
public static Font getFont ( int fontNum, int fontSize )
|
||||
{
|
||||
Font font = null ;
|
||||
|
||||
if ( flagIsUsingLocalFonts )
|
||||
{
|
||||
if ( null == derivedTMWFont [fontNum] || fontSize != derivedTMWFont [fontNum].getSize () )
|
||||
{
|
||||
font = derivedTMWFont [fontNum] = baseTMWFont [fontNum].deriveFont ( Font.PLAIN, fontSize ) ;
|
||||
}
|
||||
}
|
||||
|
||||
return font ;
|
||||
}
|
||||
|
||||
/*
|
||||
* isUsingLocalFonts ()
|
||||
*
|
||||
* returns true if the app should use the fonts from the package .jar file
|
||||
* (==> fonts are not installed on the system)
|
||||
*
|
||||
*/
|
||||
public static boolean isUsingLocalFonts ()
|
||||
{
|
||||
return flagIsUsingLocalFonts ;
|
||||
}
|
||||
|
||||
/*
|
||||
* getTibetanScanner ()
|
||||
*
|
||||
* returns the dictionary scanner object or null
|
||||
*/
|
||||
public static TibetanScanner getTibetanScanner ()
|
||||
{
|
||||
return tibetanScanner ;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void setSettingsServiceProvider ( SettingsServiceProvider theSettingsServiceProvider )
|
||||
{
|
||||
settingsServiceProvider = theSettingsServiceProvider ;
|
||||
theSettingsServiceProvider.getObservable ().addObserver ( listenerObj ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void removeSettingsServiceProvider
|
||||
( SettingsServiceProvider theSettingsServiceProvider )
|
||||
{
|
||||
settingsServiceProvider = null ;
|
||||
theSettingsServiceProvider.getObservable ().deleteObserver ( listenerObj ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static boolean isDictionaryValid ()
|
||||
{
|
||||
return dictionaryValid ;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static boolean isDictionaryEnabled ()
|
||||
{
|
||||
return dictionaryEnabled ;
|
||||
}
|
||||
|
||||
};
|
41
source/org/thdl/tib/input/SettingsChangeListener.java
Normal file
41
source/org/thdl/tib/input/SettingsChangeListener.java
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* @author Michal Podhorecki */
|
||||
|
||||
public interface SettingsChangeListener
|
||||
{
|
||||
public static final int DICTIONARY_SETTINGS = 1 ;
|
||||
|
||||
void onSettingsChange ( int setting ) ;
|
||||
|
||||
} // interface SettingsChangeListener
|
||||
|
34
source/org/thdl/tib/input/SettingsServiceProvider.java
Normal file
34
source/org/thdl/tib/input/SettingsServiceProvider.java
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
import java.util.Observable ;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library */
|
||||
public interface SettingsServiceProvider
|
||||
{
|
||||
boolean getDictionarySettingsEnabled () ;
|
||||
boolean getDictionarySettingsLocal () ;
|
||||
String getDictionarySettingsPath () ;
|
||||
|
||||
Observable getObservable () ;
|
||||
} // interface SettingsServiceProvider
|
Loading…
Reference in a new issue