/**
* Copyright (c) 2005-2017, KoLmafia development team
* http://kolmafia.sourceforge.net/
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* [1] Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* [2] Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* [3] Neither the name "KoLmafia" nor the names of its contributors may
* be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package net.sourceforge.kolmafia.swingui.widget;
import javax.swing.JButton;
import net.java.dev.spellcast.utilities.LockableListModel;
import net.sourceforge.kolmafia.AdventureResult;
import net.sourceforge.kolmafia.KoLCharacter;
import net.sourceforge.kolmafia.KoLConstants;
import net.sourceforge.kolmafia.Modifiers;
import net.sourceforge.kolmafia.objectpool.IntegerPool;
import net.sourceforge.kolmafia.persistence.ConcoctionDatabase;
import net.sourceforge.kolmafia.persistence.ConsumablesDatabase;
import net.sourceforge.kolmafia.persistence.EquipmentDatabase;
import net.sourceforge.kolmafia.persistence.ItemDatabase;
import net.sourceforge.kolmafia.persistence.MallPriceDatabase;
import net.sourceforge.kolmafia.persistence.RestoresDatabase;
import net.sourceforge.kolmafia.persistence.Script;
import net.sourceforge.kolmafia.persistence.ScriptManager;
import net.sourceforge.kolmafia.preferences.Preferences;
import net.sourceforge.kolmafia.request.CreateItemRequest;
import net.sourceforge.kolmafia.swingui.DatabaseFrame;
import net.sourceforge.kolmafia.utilities.LowerCaseEntry;
import net.sourceforge.kolmafia.utilities.StringUtilities;
public class TableCellFactory
{
public static Object get( int columnIndex, LockableListModel model, Object result, boolean[] flags,
boolean isSelected )
{
return get( columnIndex, model, result, flags, isSelected, false );
}
public static Object get( int columnIndex, LockableListModel model, Object result, boolean[] flags,
boolean isSelected, boolean raw )
{
if ( result instanceof AdventureResult )
{
AdventureResult advresult = (AdventureResult) result;
if ( flags[ 0 ] ) // Equipment panel
{
return getEquipmentCell( columnIndex, isSelected, advresult, raw );
}
if ( flags[ 1 ] ) // Restores panel
{
return getRestoresCell( columnIndex, isSelected, advresult, raw );
}
if ( model == KoLConstants.storage )
{
return getStorageCell( columnIndex, isSelected, advresult, raw );
}
return getGeneralCell( columnIndex, isSelected, advresult, raw );
}
if ( result instanceof CreateItemRequest )
{
return getCreationCell( columnIndex, result, isSelected, raw );
}
if ( result instanceof LowerCaseEntry )
{
if ( model == DatabaseFrame.allItems )
{
return getAllItemsCell( columnIndex, isSelected, (LowerCaseEntry) result, raw );
}
return getGeneralDatabaseCell( columnIndex, isSelected, (LowerCaseEntry) result, raw );
}
if ( result instanceof String || result instanceof Integer || result instanceof JButton )
{
return result;
}
if ( result instanceof Script )
{
return getScriptCell( columnIndex, isSelected, (Script) result );
}
return null;
}
private static Object getScriptCell( int columnIndex, boolean isSelected, Script result )
{
switch ( columnIndex )
{
case 0:
return result.getScriptName();
case 1:
return result.getAuthors();
case 2:
return result.getShortDesc();
case 3:
return result.getCategory();
case 4:
return result.getRepo();
}
return null;
}
private static Object getGeneralDatabaseCell( int columnIndex, boolean isSelected, LowerCaseEntry result,
boolean raw )
{
switch ( columnIndex )
{
case 0:
return result.getValue().toString();
case 1:
return IntegerPool.get( (Integer) result.getKey() );
}
return null;
}
private static Object getAllItemsCell( int columnIndex, boolean isSelected, LowerCaseEntry result, boolean raw )
{
switch ( columnIndex )
{
case 0:
return ItemDatabase.getDisplayName( (Integer) result.getKey() );
case 1:
return IntegerPool.get( (Integer) result.getKey() );
case 2:
return IntegerPool.get( ItemDatabase.getPriceById( (Integer) result.getKey() ) );
case 3:
return IntegerPool.get( MallPriceDatabase.getPrice( (Integer) result.getKey() ) );
case 4:
return ConsumablesDatabase.getFullness( (String) result.getValue() ) + ConsumablesDatabase.getInebriety( (String) result.getValue() ) + ConsumablesDatabase.getSpleenHit( (String) result.getValue() );
case 5:
return ConsumablesDatabase.getAdvRangeByName( ItemDatabase.getCanonicalName( (Integer) result.getKey() ) );
case 6:
return ConsumablesDatabase.getLevelReqByName( (String) result.getValue() );
}
return null;
}
private static Object getGeneralCell( int columnIndex, boolean isSelected, AdventureResult advresult, boolean raw )
{
Integer fill;
switch ( columnIndex )
{
case 0:
if ( raw )
{
return advresult.getName();
}
return "<html>" + addTag( ColorFactory.getItemColor( advresult ), isSelected )
+ advresult.getName();
case 1:
return getAutosellString( advresult.getItemId(), raw );
case 2:
return IntegerPool.get( advresult.getCount() );
case 3:
Integer price = IntegerPool.get( MallPriceDatabase.getPrice( advresult.getItemId() ) );
return ( price > 0 ) ? price : null;
case 4:
int power = EquipmentDatabase.getPower( advresult.getItemId() );
return ( power > 0 ) ? IntegerPool.get( power ) : null;
case 5:
fill =
IntegerPool.get( ConsumablesDatabase.getFullness( advresult.getName() ) + ConsumablesDatabase.getInebriety( advresult.getName() ) + ConsumablesDatabase.getSpleenHit( advresult.getName() ) );
return fill > 0 ? fill : null;
case 6:
double advRange = ConsumablesDatabase.getAdventureRange( advresult.getName() );
fill =
IntegerPool.get( ConsumablesDatabase.getFullness( advresult.getName() ) + ConsumablesDatabase.getInebriety( advresult.getName() ) + ConsumablesDatabase.getSpleenHit( advresult.getName() ) );
if ( !Preferences.getBoolean( "showGainsPerUnit" ) )
{
advRange = advRange / fill;
}
return advRange > 0 ? KoLConstants.ROUNDED_MODIFIER_FORMAT.format( advRange ) : null;
default:
return null;
}
}
private static Object getStorageCell( int columnIndex, boolean isSelected, AdventureResult advresult, boolean raw )
{
Integer fill;
switch ( columnIndex )
{
case 0:
if ( raw )
{
return advresult.getName();
}
return "<html>" + addTag( ColorFactory.getStorageColor( advresult ), isSelected )
+ advresult.getName();
case 1:
return getAutosellString( advresult.getItemId(), raw );
case 2:
return IntegerPool.get( advresult.getCount() );
case 3:
Integer price = IntegerPool.get( MallPriceDatabase.getPrice( advresult.getItemId() ) );
return ( price > 0 ) ? price : null;
case 4:
int power = EquipmentDatabase.getPower( advresult.getItemId() );
return ( power > 0 ) ? IntegerPool.get( power ) : null;
case 5:
fill =
IntegerPool.get( ConsumablesDatabase.getFullness( advresult.getName() ) + ConsumablesDatabase.getInebriety( advresult.getName() ) + ConsumablesDatabase.getSpleenHit( advresult.getName() ) );
return fill > 0 ? fill : null;
case 6:
double advRange = ConsumablesDatabase.getAdventureRange( advresult.getName() );
fill =
IntegerPool.get( ConsumablesDatabase.getFullness( advresult.getName() ) + ConsumablesDatabase.getInebriety( advresult.getName() ) + ConsumablesDatabase.getSpleenHit( advresult.getName() ) );
if ( !Preferences.getBoolean( "showGainsPerUnit" ) )
{
advRange = advRange / fill;
}
return advRange > 0 ? KoLConstants.ROUNDED_MODIFIER_FORMAT.format( advRange ) : null;
default:
return null;
}
}
private static Object getCreationCell( int columnIndex, Object result, boolean isSelected, boolean raw )
{
CreateItemRequest CIRresult = (CreateItemRequest) result;
Integer fill;
switch ( columnIndex )
{
case 0:
if ( raw )
{
return CIRresult.getName();
}
return "<html>" + addTag( ColorFactory.getCreationColor( CIRresult ), isSelected )
+ CIRresult.getName();
case 1:
return getAutosellString( CIRresult.getItemId(), raw );
case 2:
return IntegerPool.get( CIRresult.getQuantityPossible() );
case 3:
Integer price = IntegerPool.get( MallPriceDatabase.getPrice( CIRresult.getItemId() ) );
return ( price > 0 ) ? price : null;
case 4:
fill =
IntegerPool.get( ConsumablesDatabase.getFullness( CIRresult.getName() ) + ConsumablesDatabase.getInebriety( CIRresult.getName() ) + ConsumablesDatabase.getSpleenHit( CIRresult.getName() ) );
return fill > 0 ? fill : null;
case 5:
double advRange = ConsumablesDatabase.getAdventureRange( CIRresult.getName() );
fill =
IntegerPool.get( ConsumablesDatabase.getFullness( CIRresult.getName() ) + ConsumablesDatabase.getInebriety( CIRresult.getName() ) + ConsumablesDatabase.getSpleenHit( CIRresult.getName() ) );
if ( !Preferences.getBoolean( "showGainsPerUnit" ) )
{
advRange = advRange / fill;
}
return advRange > 0 ? KoLConstants.ROUNDED_MODIFIER_FORMAT.format( advRange ) : null;
case 6:
Integer lev = ConsumablesDatabase.getLevelReqByName( CIRresult.getName() );
return lev != null ? IntegerPool.get( lev ) : null;
default:
return null;
}
}
private static Object getEquipmentCell( int columnIndex, boolean isSelected, AdventureResult advresult, boolean raw )
{
switch ( columnIndex )
{
case 0:
if ( raw )
{
return advresult.getName();
}
return "<html>" + addTag( ColorFactory.getItemColor( advresult ), isSelected )
+ advresult.getName();
case 1:
return EquipmentDatabase.getPower( advresult.getItemId() );
case 2:
return IntegerPool.get( advresult.getCount() );
case 3:
Integer price = IntegerPool.get( MallPriceDatabase.getPrice( advresult.getItemId() ) );
return ( price > 0 ) ? price : null;
case 4:
return getAutosellString( advresult.getItemId(), raw );
default:
return null;
}
}
private static Object getRestoresCell( int columnIndex, boolean isSelected, AdventureResult advresult, boolean raw )
{
switch ( columnIndex )
{
case 0:
if ( raw )
{
return advresult.getName();
}
return "<html>" + addTag( ColorFactory.getItemColor( advresult ), isSelected )
+ advresult.getName();
case 1:
return getAutosellString( advresult.getItemId(), raw );
case 2:
return IntegerPool.get( advresult.getCount() );
case 3:
Integer price = IntegerPool.get( MallPriceDatabase.getPrice( advresult.getItemId() ) );
return ( price > 0 ) ? price : null;
case 4:
double hpRestore = RestoresDatabase.getHPAverage( advresult.getName() );
if ( hpRestore <= 0 )
{
return null;
}
int maxHP = KoLCharacter.getMaximumHP();
if ( hpRestore > maxHP )
{
return maxHP;
}
return IntegerPool.get( (int) hpRestore );
case 5:
double mpRestore = RestoresDatabase.getMPAverage( advresult.getName() );
if ( mpRestore <= 0 )
{
return null;
}
int maxMP = KoLCharacter.getMaximumMP();
if ( mpRestore > maxMP )
{
return maxMP;
}
return IntegerPool.get( (int) mpRestore );
default:
return null;
}
}
private static String addTag( String itemColor, boolean isSelected )
{
if ( itemColor == null || isSelected )
{
return "";
}
return "<font color=" + itemColor + ">";
}
private static Object getAutosellString( int itemId, boolean raw )
{
int price = 0;
if ( ItemDatabase.isDiscardable( itemId ) )
{
price = ItemDatabase.getPriceById( itemId );
}
if ( raw )
{
//if ( price < 0 ) price = 0;
return IntegerPool.get( price );
}
if ( price <= 0 )
{
return "no-sell";
}
return price + " meat";
}
public static String[] getColumnNames( LockableListModel originalModel, boolean[] flags )
{
if ( flags[ 0 ] ) // Equipment panel
{
return new String[]
{
"item name", "power", "quantity", "mallprice", "autosell"
};
}
else if ( flags[ 1 ] ) // Restores panel
{
return new String[]
{
"item name", "autosell", "quantity", "mallprice", "HP restore", "MP restore"
};
}
else if ( originalModel == KoLConstants.inventory ||
originalModel == KoLConstants.tally ||
originalModel == KoLConstants.freepulls ||
originalModel == KoLConstants.storage ||
originalModel == KoLConstants.closet ||
originalModel == KoLConstants.nopulls ||
originalModel == KoLConstants.unlimited )
{
return new String[]
{
"item name", "autosell", "quantity", "mallprice", "power", "fill", "adv/fill"
};
}
else if ( originalModel == ConcoctionDatabase.getCreatables()
|| originalModel == ConcoctionDatabase.getUsables() )
{
return new String[]
{
"item name", "autosell", "quantity", "mallprice", "fill", "adv/fill", "level req"
};
}
else if ( originalModel == DatabaseFrame.allItems )
{
return new String[]
{
"item name", "item ID", "autosell", "mallprice", "fill", "adv range", "level req"
};
}
else if ( originalModel == DatabaseFrame.allFamiliars )
{
return new String[]
{
"familiar name", "familiar ID",
};
}
else if ( originalModel == DatabaseFrame.allEffects )
{
return new String[]
{
"effect name", "effect ID",
};
}
else if ( originalModel == DatabaseFrame.allSkills )
{
return new String[]
{
"skill name", "skill ID",
};
}
else if ( originalModel == DatabaseFrame.allOutfits )
{
return new String[]
{
"outfit name", "outfit ID",
};
}
else if ( originalModel == DatabaseFrame.allMonsters )
{
return new String[]
{
"monster name", "monster ID",
};
}
else if ( originalModel == ScriptManager.getInstalledScripts() ||
originalModel == ScriptManager.getRepoScripts() )
{
return new String[]
{
"Script Name", "Authors", "Description", "Category", "Repo"
};
}
return new String[]
{
"not implemented"
};
}
public static String getTooltipText( Object value, boolean[] flags )
{
if ( value instanceof AdventureResult || value instanceof CreateItemRequest )
{
return getModifiers( value );
}
return null;
}
private static String getModifiers( Object value )
{
// Code almost entirely lifted from GearChangeFrame.
int modifiersWidth = 100;
int itemId = -1;
if ( value instanceof AdventureResult )
{
itemId = ( (AdventureResult) value ).getItemId();
}
else if ( value instanceof CreateItemRequest )
{
itemId = ( (CreateItemRequest) value ).getItemId();
}
if ( itemId == -1 || !ItemDatabase.isEquipment( itemId ) )
{
return null;
}
Modifiers mods = Modifiers.getItemModifiers( itemId );
if ( mods == null )
{
return null;
}
String name = mods.getString( Modifiers.INTRINSIC_EFFECT );
if ( name.length() > 0 )
{
Modifiers newMods = new Modifiers();
newMods.add( mods );
newMods.add( Modifiers.getModifiers( "Effect", name ) );
mods = newMods;
}
StringBuilder buff = new StringBuilder();
buff.append( "<html><table><tr><td width=" );
buff.append( modifiersWidth );
buff.append( ">" );
for ( int i = 0; i < Modifiers.DOUBLE_MODIFIERS; ++i )
{
double val = mods.get( i );
if ( val == 0.0 ) continue;
name = Modifiers.getModifierName( i );
name = StringUtilities.singleStringReplace( name, "Familiar", "Fam" );
name = StringUtilities.singleStringReplace( name, "Experience", "Exp" );
name = StringUtilities.singleStringReplace( name, "Damage", "Dmg" );
name = StringUtilities.singleStringReplace( name, "Resistance", "Res" );
name = StringUtilities.singleStringReplace( name, "Percent", "%" );
buff.append( name );
buff.append( ":<div align=right>" );
buff.append( KoLConstants.ROUNDED_MODIFIER_FORMAT.format( val ) );
buff.append( "</div>" );
}
boolean anyBool = false;
for ( int i = 1; i < Modifiers.BITMAP_MODIFIERS; ++i )
{
if ( mods.getRawBitmap( i ) == 0 ) continue;
if ( anyBool )
{
buff.append( ", " );
}
anyBool = true;
buff.append( Modifiers.getBitmapModifierName( i ) );
}
for ( int i = 1; i < Modifiers.BOOLEAN_MODIFIERS; ++i )
{
if ( !mods.getBoolean( i ) ) continue;
if ( anyBool )
{
buff.append( ", " );
}
anyBool = true;
buff.append( Modifiers.getBooleanModifierName( i ) );
}
buff.append( "</td></tr></table></html>" );
return buff.toString();
}
}