Methods Summary |
---|
public static java.lang.String | formatBitCountToKiBEtcLocalImpl(long n, boolean rate, boolean bTruncateZeros, int precision, boolean useBits)NOTE: This method is a copy of formatByteCountToKiBEtc. Since the "use_units_rate_bits" member is
static it cannot be used in a local context. Thus this method. More refactoring of this area
should be done. Also need testing of the method to make sure units are accurate.
Takes a long value that is bytes/bits download and converts it into internationalized units.
double dbl = (rate && useBits) ? n * 8 : n;
int unitIndex = UNIT_B;
while (dbl >= 1024 && unitIndex < unitsStopAt){
dbl /= 1024L;
unitIndex++;
}
if (precision < 0) {
precision = UNITS_PRECISION[unitIndex];
}
return formatDecimal(dbl, precision, bTruncateZeros, rate)
+ units_bits[unitIndex] + (rate?per_sec:"");
|
public static java.lang.String | formatByteCountToBase10KBEtc(long n)
if (n < 1000){
return n + units_base10[UNIT_B];
}else if (n < 1000 * 1000){
return (n / 1000) + "." +
((n % 1000) / 100) +
units_base10[UNIT_KB];
}else if ( n < 1000L * 1000L * 1000L || not_use_GB_TB ){
return (n / (1000L * 1000L)) + "." +
((n % (1000L * 1000L)) / (1000L * 100L)) +
units_base10[UNIT_MB];
}else if (n < 1000L * 1000L * 1000L * 1000L){
return (n / (1000L * 1000L * 1000L)) + "." +
((n % (1000L * 1000L * 1000L)) / (1000L * 1000L * 100L))+
units_base10[UNIT_GB];
}else if (n < 1000L * 1000L * 1000L * 1000L* 1000L){
return (n / (1000L * 1000L * 1000L* 1000L)) + "." +
((n % (1000L * 1000L * 1000L* 1000L)) / (1000L * 1000L * 1000L* 100L))+
units_base10[UNIT_TB];
}else{
return Formats_units_alot;
}
|
public static java.lang.String | formatByteCountToBase10KBEtcPerSec(long n)
return( formatByteCountToBase10KBEtc(n) + per_sec );
|
public static java.lang.String | formatByteCountToBitsPerSec(long n)Print the BITS/second in an international format.
return formatBitCountToKiBEtcLocalImpl(n,true,true,-1,true);
|
public static java.lang.String | formatByteCountToKiBEtc(long n)
return( formatByteCountToKiBEtc( n, false, TRUNCZEROS_NO));
|
public static java.lang.String | formatByteCountToKiBEtc(long n, boolean bTruncateZeros)
return( formatByteCountToKiBEtc( n, false, bTruncateZeros ));
|
public static java.lang.String | formatByteCountToKiBEtc(long n, boolean rate, boolean bTruncateZeros)
return formatByteCountToKiBEtc(n, rate, bTruncateZeros, -1);
|
public static java.lang.String | formatByteCountToKiBEtc(long n, boolean rate, boolean bTruncateZeros, int precision)
double dbl = (rate && use_units_rate_bits) ? n * 8 : n;
int unitIndex = UNIT_B;
while (dbl >= 1024 && unitIndex < unitsStopAt){
dbl /= 1024L;
unitIndex++;
}
if (precision < 0) {
precision = UNITS_PRECISION[unitIndex];
}
// round for rating, because when the user enters something like 7.3kbps
// they don't want it truncated and displayed as 7.2
// (7.3*1024 = 7475.2; 7475/1024.0 = 7.2998; trunc(7.2998, 1 prec.) == 7.2
//
// Truncate for rest, otherwise we get complaints like:
// "I have a 1.0GB torrent and it says I've downloaded 1.0GB.. why isn't
// it complete? waaah"
return formatDecimal(dbl, precision, bTruncateZeros, rate)
+ (rate ? units_rate[unitIndex] : units[unitIndex]);
|
public static java.lang.String | formatByteCountToKiBEtc(int n)
return( formatByteCountToKiBEtc((long)n));
|
public static java.lang.String | formatByteCountToKiBEtcPerSec(long n)
return( formatByteCountToKiBEtc(n,true,TRUNCZEROS_NO));
|
public static java.lang.String | formatByteCountToKiBEtcPerSec(long n, boolean bTruncateZeros)
return( formatByteCountToKiBEtc(n,true, bTruncateZeros));
|
public static java.lang.String | formatDataProtByteCountToKiBEtc(long data, long prot)
if ( separate_prot_data_stats ){
if ( data == 0 && prot == 0 ){
return( formatByteCountToKiBEtc(0));
}else if ( data == 0 ){
return( "(" + formatByteCountToKiBEtc( prot) + ")");
}else if ( prot == 0 ){
return( formatByteCountToKiBEtc( data ));
}else{
return(formatByteCountToKiBEtc(data)+" ("+ formatByteCountToKiBEtc(prot)+")");
}
}else if ( data_stats_only ){
return( formatByteCountToKiBEtc( data ));
}else{
return( formatByteCountToKiBEtc( prot + data ));
}
|
public static java.lang.String | formatDataProtByteCountToKiBEtcPerSec(long data, long prot)
if ( separate_prot_data_stats ){
if ( data == 0 && prot == 0 ){
return(formatByteCountToKiBEtcPerSec(0));
}else if ( data == 0 ){
return( "(" + formatByteCountToKiBEtcPerSec( prot) + ")");
}else if ( prot == 0 ){
return( formatByteCountToKiBEtcPerSec( data ));
}else{
return(formatByteCountToKiBEtcPerSec(data)+" ("+ formatByteCountToKiBEtcPerSec(prot)+")");
}
}else if ( data_stats_only ){
return( formatByteCountToKiBEtcPerSec( data ));
}else{
return( formatByteCountToKiBEtcPerSec( prot + data ));
}
|
public static java.lang.String | formatDate(long date)
if ( date == 0 ){
return( "" );
}
SimpleDateFormat temp = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
return( temp.format(new Date(date)));
|
public static java.lang.String | formatDateNum(long date)
if ( date == 0 ){
return( "" );
}
SimpleDateFormat temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return( temp.format(new Date(date)));
|
public static java.lang.String | formatDateShort(long date)
if ( date == 0 ){
return( "" );
}
// 24 hour clock, no point in including AM/PM
SimpleDateFormat temp = new SimpleDateFormat("MMM dd, HH:mm");
return( temp.format(new Date(date)));
|
public static java.lang.String | formatDecimal(double value, int precision)Format a real number to the precision specified. Does not round the number
or truncate trailing zeros.
return formatDecimal(value, precision, TRUNCZEROS_NO, ROUND_NO);
|
public static java.lang.String | formatDecimal(double value, int precision, boolean bTruncateZeros, boolean bRound)Format a real number
if (Double.isNaN(value) || Double.isInfinite(value)) {
return Constants.INFINITY_STRING;
}
double tValue;
if (bRound) {
tValue = value;
} else {
// NumberFormat rounds, so truncate at precision
if (precision == 0) {
tValue = (long) value;
} else {
double shift = Math.pow(10, precision);
tValue = ((long) (value * shift)) / shift;
}
}
int cache_index = (precision << 2) + ((bTruncateZeros ? 1 : 0) << 1)
+ (bRound ? 1 : 0);
NumberFormat nf = null;
if (cache_index < cached_number_formats.length) {
nf = cached_number_formats[cache_index];
}
if (nf == null) {
nf = NumberFormat.getNumberInstance();
nf.setGroupingUsed(false); // no commas
if (!bTruncateZeros) {
nf.setMinimumFractionDigits(precision);
}
if (bRound) {
nf.setMaximumFractionDigits(precision);
}
if (cache_index < cached_number_formats.length) {
cached_number_formats[cache_index] = nf;
}
}
return nf.format(tValue);
|
public static java.lang.String | formatDownloadStatus(DownloadManager manager)
int state = manager.getState();
String tmp = "";
switch (state) {
case DownloadManager.STATE_QUEUED:
tmp = ManagerItem_queued;
break;
case DownloadManager.STATE_DOWNLOADING:
tmp = ManagerItem_downloading;
break;
case DownloadManager.STATE_SEEDING:
DiskManager diskManager = manager.getDiskManager();
if ((diskManager != null)
&& diskManager.getCompleteRecheckStatus() != -1) {
int done = diskManager.getCompleteRecheckStatus();
if (done == -1) {
done = 1000;
}
tmp = ManagerItem_seeding + " + " + ManagerItem_checking + ": "
+ formatPercentFromThousands(done);
} else if (manager.getPeerManager() != null
&& manager.getPeerManager().isSuperSeedMode()) {
tmp = ManagerItem_superseeding;
} else {
tmp = ManagerItem_seeding;
}
break;
case DownloadManager.STATE_STOPPED:
tmp = manager.isPaused() ? ManagerItem_paused : ManagerItem_stopped;
break;
case DownloadManager.STATE_ERROR:
tmp = ManagerItem_error + ": " + manager.getErrorDetails();
break;
case DownloadManager.STATE_WAITING:
tmp = ManagerItem_waiting;
break;
case DownloadManager.STATE_INITIALIZING:
tmp = ManagerItem_initializing;
break;
case DownloadManager.STATE_INITIALIZED:
tmp = ManagerItem_initializing;
break;
case DownloadManager.STATE_ALLOCATING:
tmp = ManagerItem_allocating;
break;
case DownloadManager.STATE_CHECKING:
tmp = ManagerItem_checking + ": "
+ formatPercentFromThousands(manager.getStats().getCompleted());
break;
case DownloadManager.STATE_FINISHING:
tmp = ManagerItem_finishing;
break;
case DownloadManager.STATE_READY:
tmp = ManagerItem_ready;
break;
case DownloadManager.STATE_STOPPING:
tmp = ManagerItem_stopping;
break;
default:
tmp = String.valueOf(state);
}
if (manager.isForceStart() &&
(state == DownloadManager.STATE_SEEDING ||
state == DownloadManager.STATE_DOWNLOADING))
tmp = ManagerItem_forced + " " + tmp;
return( tmp );
|
public static java.lang.String | formatDownloadStatusDefaultLocale(DownloadManager manager)
int state = manager.getState();
String tmp = "";
DiskManager dm = manager.getDiskManager();
switch (state) {
case DownloadManager.STATE_WAITING :
tmp = MessageText.getDefaultLocaleString("ManagerItem.waiting");
break;
case DownloadManager.STATE_INITIALIZING :
tmp = MessageText.getDefaultLocaleString("ManagerItem.initializing");
break;
case DownloadManager.STATE_INITIALIZED :
tmp = MessageText.getDefaultLocaleString("ManagerItem.initializing");
break;
case DownloadManager.STATE_ALLOCATING :
tmp = MessageText.getDefaultLocaleString("ManagerItem.allocating");
break;
case DownloadManager.STATE_CHECKING :
tmp = MessageText.getDefaultLocaleString("ManagerItem.checking");
break;
case DownloadManager.STATE_FINISHING :
tmp = MessageText.getDefaultLocaleString("ManagerItem.finishing");
break;
case DownloadManager.STATE_READY :
tmp = MessageText.getDefaultLocaleString("ManagerItem.ready");
break;
case DownloadManager.STATE_DOWNLOADING :
tmp = MessageText.getDefaultLocaleString("ManagerItem.downloading");
break;
case DownloadManager.STATE_SEEDING :
if (dm != null && dm.getCompleteRecheckStatus() != -1 ) {
int done = dm.getCompleteRecheckStatus();
if ( done == -1 ){
done = 1000;
}
tmp = MessageText.getDefaultLocaleString("ManagerItem.seeding") + " + " +
MessageText.getDefaultLocaleString("ManagerItem.checking") +
": " + formatPercentFromThousands( done );
}
else if(manager.getPeerManager()!= null && manager.getPeerManager().isSuperSeedMode()){
tmp = MessageText.getDefaultLocaleString("ManagerItem.superseeding");
}
else {
tmp = MessageText.getDefaultLocaleString("ManagerItem.seeding");
}
break;
case DownloadManager.STATE_STOPPING :
tmp = MessageText.getDefaultLocaleString("ManagerItem.stopping");
break;
case DownloadManager.STATE_STOPPED :
tmp = MessageText.getDefaultLocaleString(manager.isPaused()?"ManagerItem.paused":"ManagerItem.stopped");
break;
case DownloadManager.STATE_QUEUED :
tmp = MessageText.getDefaultLocaleString("ManagerItem.queued");
break;
case DownloadManager.STATE_ERROR :
tmp = MessageText.getDefaultLocaleString("ManagerItem.error").concat(": ").concat(manager.getErrorDetails()); //$NON-NLS-1$ //$NON-NLS-2$
break;
default :
tmp = String.valueOf(state);
}
return( tmp );
|
public static java.lang.String | formatDownloaded(DownloadManagerStats stats)
long total_discarded = stats.getDiscarded();
long total_received = stats.getTotalGoodDataBytesReceived();
if(total_discarded == 0){
return formatByteCountToKiBEtc(total_received);
}else{
return formatByteCountToKiBEtc(total_received) + " ( " +
DisplayFormatters.formatByteCountToKiBEtc(total_discarded) + " " +
discarded + " )";
}
|
public static java.lang.String | formatETA(long eta)
if (eta == 0) return PeerManager_status_finished;
if (eta == -1) return "";
if (eta > 0) return TimeFormatter.format(eta);
return PeerManager_status_finishedin + " " + TimeFormatter.format(eta * -1);
|
public static java.lang.String | formatHashFails(DownloadManager download_manager)
TOTorrent torrent = download_manager.getTorrent();
if ( torrent != null ){
long bad = download_manager.getStats().getHashFailBytes();
// size can exceed int so ensure longs used in multiplication
long count = bad / (long)torrent.getPieceLength();
String result = count + " ( " + formatByteCountToKiBEtc(bad) + " )";
return result;
}
return "";
|
public static java.lang.String | formatIntToTwoDigits(int n)
return n < 10 ? "0".concat(String.valueOf(n)) : String.valueOf(n);
|
public static java.lang.String | formatPercentFromThousands(int thousands)
return percentage_format.format(thousands / 1000.0);
|
public static java.lang.String | formatTime(long time)
return( TimeFormatter.formatColon( time / 1000 ));
|
public static java.lang.String | formatTimeStamp(long time)
StringBuffer sb = new StringBuffer();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time);
sb.append('[");
sb.append(formatIntToTwoDigits(calendar.get(Calendar.DAY_OF_MONTH)));
sb.append('.");
sb.append(formatIntToTwoDigits(calendar.get(Calendar.MONTH)+1)); // 0 based
sb.append('.");
sb.append(calendar.get(Calendar.YEAR));
sb.append(' ");
sb.append(formatIntToTwoDigits(calendar.get(Calendar.HOUR_OF_DAY)));
sb.append(':");
sb.append(formatIntToTwoDigits(calendar.get(Calendar.MINUTE)));
sb.append(':");
sb.append(formatIntToTwoDigits(calendar.get(Calendar.SECOND)));
sb.append(']");
return sb.toString();
|
public static java.lang.String | getRateUnit(int unit_size)
return( units_rate[unit_size].substring(1, units_rate[unit_size].length()) );
|
public static java.lang.String | getRateUnitBase10(int unit_size)
return units_base10[unit_size] + per_sec;
|
private static java.lang.String | getResourceString(java.lang.String key, java.lang.String def)
if ( message_text_state == 0 ){
// this fooling around is to permit the use of this class in the absence of the (large) overhead
// of resource bundles
try{
MessageText.class.getName();
message_text_state = 1;
}catch( Throwable e ){
message_text_state = 2;
}
}
if ( message_text_state == 1 ){
return( MessageText.getString( key ));
}else{
return( def );
}
|
private static java.lang.String | getUnit(java.lang.String key)
String res = " " + getResourceString( "Formats.units." + key, key );
return( res );
|
public static java.lang.String | getUnit(int unit_size)
return( units[unit_size].substring(1, units[unit_size].length()) );
|
public static java.lang.String | getUnitBase10(int unit_size)
return units_base10[unit_size];
|
public static boolean | isDataProtSeparate()
return( separate_prot_data_stats );
|
public static void | loadMessages()
PeerManager_status_finished = getResourceString( "PeerManager.status.finished", "Finished" );
PeerManager_status_finishedin = getResourceString( "PeerManager.status.finishedin", "Finished in" );
Formats_units_alot = getResourceString( "Formats.units.alot", "A lot" );
discarded = getResourceString( "discarded", "discarded" );
ManagerItem_waiting = getResourceString( "ManagerItem.waiting", "waiting" );
ManagerItem_initializing = getResourceString( "ManagerItem.initializing", "initializing" );
ManagerItem_allocating = getResourceString( "ManagerItem.allocating", "allocating" );
ManagerItem_checking = getResourceString( "ManagerItem.checking", "checking" );
ManagerItem_finishing = getResourceString( "ManagerItem.finishing", "finishing" );
ManagerItem_ready = getResourceString( "ManagerItem.ready", "ready" );
ManagerItem_downloading = getResourceString( "ManagerItem.downloading", "downloading" );
ManagerItem_seeding = getResourceString( "ManagerItem.seeding", "seeding" );
ManagerItem_superseeding = getResourceString( "ManagerItem.superseeding", "superseeding" );
ManagerItem_stopping = getResourceString( "ManagerItem.stopping", "stopping" );
ManagerItem_stopped = getResourceString( "ManagerItem.stopped", "stopped" );
ManagerItem_paused = getResourceString( "ManagerItem.paused", "paused" );
ManagerItem_queued = getResourceString( "ManagerItem.queued", "queued" );
ManagerItem_error = getResourceString( "ManagerItem.error", "error" );
ManagerItem_forced = getResourceString( "ManagerItem.forced", "forced" );
|
public static void | main(java.lang.String[] args)
// set decimal display to ","
//Locale.setDefault(Locale.GERMAN);
double d = 0.000003991630774821635;
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(6);
nf.setMinimumFractionDigits(6);
String s = nf.format(d);
System.out.println("Actual: " + d); // Displays 3.991630774821635E-6
System.out.println("NF/6: " + s); // Displays 0.000004
// should display 0.000003
System.out.println("DF: " + DisplayFormatters.formatDecimal(d , 6));
// should display 0
System.out.println("DF 0: " + DisplayFormatters.formatDecimal(d , 0));
// should display 0.000000
System.out.println("0.000000:" + DisplayFormatters.formatDecimal(0 , 6));
// should display 0.001
System.out.println("0.001:" + DisplayFormatters.formatDecimal(0.001, 6, TRUNCZEROS_YES, ROUND_NO));
// should display 0
System.out.println("0:" + DisplayFormatters.formatDecimal(0 , 0));
// should display 123456
System.out.println("123456:" + DisplayFormatters.formatDecimal(123456, 0));
// should display 123456
System.out.println("123456:" + DisplayFormatters.formatDecimal(123456.999, 0));
System.out.println(DisplayFormatters.formatDecimal(0.0/0, 3));
|
public static void | setUnits()
use_si_units = COConfigurationManager.getBooleanParameter("config.style.useSIUnits");
COConfigurationManager.addParameterListener( "config.style.useSIUnits",
new ParameterListener()
{
public void
parameterChanged(
String value )
{
use_si_units = COConfigurationManager.getBooleanParameter("config.style.useSIUnits");
setUnits();
}
});
use_units_rate_bits = COConfigurationManager.getBooleanParameter("config.style.useUnitsRateBits");
COConfigurationManager.addParameterListener( "config.style.useUnitsRateBits",
new ParameterListener()
{
public void
parameterChanged(
String value )
{
use_units_rate_bits = COConfigurationManager.getBooleanParameter("config.style.useUnitsRateBits");
setUnits();
}
});
not_use_GB_TB = COConfigurationManager.getBooleanParameter("config.style.doNotUseGB");
unitsStopAt = (not_use_GB_TB) ? UNIT_MB : UNIT_TB;
COConfigurationManager.addParameterListener( "config.style.doNotUseGB",
new ParameterListener()
{
public void
parameterChanged(
String value )
{
not_use_GB_TB = COConfigurationManager.getBooleanParameter("config.style.doNotUseGB");
unitsStopAt = (not_use_GB_TB) ? UNIT_MB : UNIT_TB;
setUnits();
}
});
COConfigurationManager.addListener(
new COConfigurationListener()
{
public void
configurationSaved()
{
setUnits();
loadMessages();
}
});
COConfigurationManager.addAndFireParameterListeners(
new String[]{ "config.style.dataStatsOnly", "config.style.separateProtDataStats" },
new ParameterListener()
{
public void
parameterChanged(
String x )
{
separate_prot_data_stats = COConfigurationManager.getBooleanParameter("config.style.separateProtDataStats");
data_stats_only = COConfigurationManager.getBooleanParameter("config.style.dataStatsOnly");
}
});
setUnits();
loadMessages();
// (1) http://physics.nist.gov/cuu/Units/binary.html
// (2) http://www.isi.edu/isd/LOOM/documentation/unit-definitions.text
units = new String[unitsStopAt + 1];
units_bits = new String[unitsStopAt + 1];
units_rate = new String[unitsStopAt + 1];
if ( use_si_units ){
// fall through intentional
switch (unitsStopAt) {
case UNIT_TB:
units[UNIT_TB] = getUnit("TiB");
units_bits[UNIT_TB] = getUnit("Tibit");
units_rate[UNIT_TB] = (use_units_rate_bits) ? getUnit("Tibit") : getUnit("TiB");
case UNIT_GB:
units[UNIT_GB]= getUnit("GiB");
units_bits[UNIT_GB]= getUnit("Gibit");
units_rate[UNIT_GB] = (use_units_rate_bits) ? getUnit("Gibit") : getUnit("GiB");
case UNIT_MB:
units[UNIT_MB] = getUnit("MiB");
units_bits[UNIT_MB] = getUnit("Mibit");
units_rate[UNIT_MB] = (use_units_rate_bits) ? getUnit("Mibit") : getUnit("MiB");
case UNIT_KB:
// can be upper or lower case k
units[UNIT_KB] = getUnit("KiB");
units_bits[UNIT_KB] = getUnit("Kibit");
// can be upper or lower case k, upper more consistent
units_rate[UNIT_KB] = (use_units_rate_bits) ? getUnit("Kibit") : getUnit("KiB");
case UNIT_B:
units[UNIT_B] = getUnit("B");
units_bits[UNIT_B] = getUnit("bit");
units_rate[UNIT_B] = (use_units_rate_bits) ? getUnit("bit") : getUnit("B");
}
}else{
switch (unitsStopAt) {
case UNIT_TB:
units[UNIT_TB] = getUnit("TB");
units_bits[UNIT_TB] = getUnit("Tbit");
units_rate[UNIT_TB] = (use_units_rate_bits) ? getUnit("Tbit") : getUnit("TB");
case UNIT_GB:
units[UNIT_GB]= getUnit("GB");
units_bits[UNIT_GB]= getUnit("Gbit");
units_rate[UNIT_GB] = (use_units_rate_bits) ? getUnit("Gbit") : getUnit("GB");
case UNIT_MB:
units[UNIT_MB] = getUnit("MB");
units_bits[UNIT_MB] = getUnit("Mbit");
units_rate[UNIT_MB] = (use_units_rate_bits) ? getUnit("Mbit") : getUnit("MB");
case UNIT_KB:
// yes, the k should be lower case
units[UNIT_KB] = getUnit("kB");
units_bits[UNIT_KB] = getUnit("kbit");
units_rate[UNIT_KB] = (use_units_rate_bits) ? getUnit("kbit") : getUnit("kB");
case UNIT_B:
units[UNIT_B] = getUnit("B");
units_bits[UNIT_B] = getUnit("bit");
units_rate[UNIT_B] = (use_units_rate_bits) ? getUnit("bit") : getUnit("B");
}
}
per_sec = getResourceString( "Formats.units.persec", "/s" );
units_base10 =
new String[]{ getUnit( "B"), getUnit("KB"), getUnit( "MB" ), getUnit( "GB"), getUnit( "TB" ) };
for (int i = 0; i <= unitsStopAt; i++) {
units[i] = units[i];
units_rate[i] = units_rate[i] + per_sec;
}
Arrays.fill( cached_number_formats, null );
percentage_format = NumberFormat.getPercentInstance();
percentage_format.setMinimumFractionDigits(1);
percentage_format.setMaximumFractionDigits(1);
|
public static java.lang.String | truncateString(java.lang.String str, int width)Attempts vaguely smart string truncation by searching for largest token and truncating that
int excess = str.length() - width;
if ( excess <= 0 ){
return( str );
}
excess += 3; // for ...
int token_start = -1;
int max_len = 0;
int max_start = 0;
for (int i=0;i<str.length();i++){
char c = str.charAt(i);
if ( Character.isLetterOrDigit( c ) || c == '-" || c == '~" ){
if ( token_start == -1 ){
token_start = i;
}else{
int len = i - token_start;
if ( len > max_len ){
max_len = len;
max_start = token_start;
}
}
}else{
token_start = -1;
}
}
if ( max_len >= excess ){
int trim_point = max_start + max_len;
return( str.substring( 0, trim_point - excess ) + "..." + str.substring( trim_point ));
}else{
return( str.substring( 0, width-3 ) + "..." );
}
|