/**
* 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 java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.UIManager;
import net.sourceforge.kolmafia.AdventureResult;
import net.sourceforge.kolmafia.FamiliarData;
import net.sourceforge.kolmafia.KoLCharacter;
import net.sourceforge.kolmafia.KoLConstants;
import net.sourceforge.kolmafia.KoLConstants.CraftingType;
import net.sourceforge.kolmafia.KoLGUIConstants;
import net.sourceforge.kolmafia.Modifiers;
import net.sourceforge.kolmafia.objectpool.Concoction;
import net.sourceforge.kolmafia.objectpool.ItemPool;
import net.sourceforge.kolmafia.persistence.ConcoctionDatabase.QueuedConcoction;
import net.sourceforge.kolmafia.persistence.ConsumablesDatabase;
import net.sourceforge.kolmafia.persistence.EquipmentDatabase;
import net.sourceforge.kolmafia.persistence.ItemDatabase;
import net.sourceforge.kolmafia.preferences.Preferences;
import net.sourceforge.kolmafia.request.CafeRequest;
import net.sourceforge.kolmafia.request.CreateItemRequest;
import net.sourceforge.kolmafia.request.EquipmentRequest;
import net.sourceforge.kolmafia.request.PurchaseRequest;
import net.sourceforge.kolmafia.session.EncounterManager.RegisteredEncounter;
import net.sourceforge.kolmafia.session.EquipmentManager;
import net.sourceforge.kolmafia.swingui.GearChangeFrame;
public class ListCellRendererFactory
{
public static final DefaultListCellRenderer getDefaultRenderer()
{
return new DefaultRenderer();
}
private static class DefaultRenderer
extends DefaultListCellRenderer
{
public DefaultRenderer()
{
this.setOpaque( true );
}
public boolean allowHighlight()
{
return false;
}
@Override
public final Component getListCellRendererComponent( final JList list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus )
{
Component defaultComponent =
super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
if ( value == null )
{
return defaultComponent;
}
if ( isSelected )
{
GearChangeFrame.showModifiers( value, false );
}
if ( value instanceof AdventureResult )
{
return this.getRenderer( defaultComponent, (AdventureResult) value, isSelected );
}
if ( value instanceof PurchaseRequest )
{
return this.getRenderer( defaultComponent, (PurchaseRequest) value, isSelected );
}
if ( value instanceof CreateItemRequest )
{
return this.getRenderer( defaultComponent, (CreateItemRequest) value, isSelected );
}
if ( value instanceof Concoction )
{
return this.getRenderer( defaultComponent, (Concoction) value,
list.getWidth(), isSelected );
}
if ( value instanceof QueuedConcoction )
{
return this.getRenderer( defaultComponent, (QueuedConcoction) value,
list.getWidth(), isSelected );
}
if ( value instanceof RegisteredEncounter )
{
StringBuilder buffer = new StringBuilder();
buffer.append( "<html><nobr>" );
buffer.append( value.toString() );
buffer.append( "</nobr></html>" );
( (JLabel) defaultComponent ).setText( buffer.toString() );
return defaultComponent;
}
return defaultComponent;
}
private Component getRenderer( Component defaultComponent, PurchaseRequest value, boolean isSelected )
{
StringBuilder buffer = new StringBuilder();
String color = null;
if ( isSelected )
{
setForeground( UIManager.getColor( "List.selectionForeground" ) );
}
else
{
color = value.color();
}
buffer.append( "<html><nobr>" );
if ( color != null )
{
buffer.append( "<font color=\"" );
buffer.append( color );
buffer.append( "\">" );
}
buffer.append( value.getItem() );
buffer.append( " (" );
if ( value.getQuantity() == PurchaseRequest.MAX_QUANTITY )
{
buffer.append( "unlimited" );
}
else if ( value.getQuantity() < 0 )
{
buffer.append( "unknown" );
}
else
{
buffer.append( KoLConstants.COMMA_FORMAT.format( value.getQuantity() ) );
if ( value.getLimit() < value.getQuantity() )
{
buffer.append( " limit " );
buffer.append( KoLConstants.COMMA_FORMAT.format( value.getLimit() ) );
}
}
buffer.append( " @ " );
buffer.append( value.getPriceString() );
buffer.append( "): " );
buffer.append( value.getShopName() );
if ( color != null )
{
buffer.append( "</font>" );
}
buffer.append( "</nobr></html>" );
( (JLabel) defaultComponent ).setText( buffer.toString() );
return defaultComponent;
}
public Component getRenderer( final Component defaultComponent, final AdventureResult ar, final boolean isSelected )
{
StringBuilder stringForm = new StringBuilder();
if ( !ar.isItem() )
{
// HTMLify it so that character entities get displayed nicely
stringForm.append( "<html><nobr>" );
stringForm.append( ar.toString() );
stringForm.append( "</nobr></html>" );
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
stringForm.append( "<html><nobr>" );
String name = ar.getName();
String color = null;
if ( isSelected )
{
setForeground( UIManager.getColor( "List.selectionForeground" ) );
}
else
{
color = ColorFactory.getItemColor( ar );
}
if ( color != null )
{
stringForm.append( "<font color=" );
stringForm.append( color );
stringForm.append( ">" );
}
stringForm.append( name );
if ( color != null )
{
stringForm.append( "</font>" );
}
int itemId = ar.getItemId();
if ( itemId > 0 )
{
int value = ItemDatabase.getPriceById( itemId );
if ( value <= 0 )
{
stringForm.append( " (no-sell)" );
}
else
{
stringForm.append( " (" );
stringForm.append( value );
stringForm.append( " meat)" );
}
}
stringForm.append( " (" );
stringForm.append( KoLConstants.COMMA_FORMAT.format( ar.getCount() ) );
stringForm.append( ")" );
stringForm.append( "</nobr></html>" );
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
public Component getRenderer( final Component defaultComponent, final CreateItemRequest icr, final boolean isSelected )
{
StringBuilder stringForm = new StringBuilder();
boolean isHTML = false;
String name = icr.getName();
String color = null;
if ( isSelected )
{
setForeground( UIManager.getColor( "List.selectionForeground" ) );
}
else
{
color = ColorFactory.getCreationColor( icr );
}
if ( color != null )
{
stringForm.append( "<font color=" );
stringForm.append( color );
stringForm.append( ">" );
isHTML = true;
}
stringForm.append( name );
if ( color != null )
{
stringForm.append( "</font>" );
}
int itemId = icr.getItemId();
if ( itemId > 0 )
{
int value = ItemDatabase.getPriceById( itemId );
if ( value <= 0 )
{
stringForm.append( " (no-sell)" );
}
else
{
stringForm.append( " (" );
stringForm.append( value );
stringForm.append( " meat)" );
}
}
int costForOne = icr.concoction.getAdventuresNeeded( 1, true );
int maxPossible = icr.getQuantityPossible();
int costForMax = icr.concoction.getAdventuresNeeded( maxPossible, true );
boolean futureCreationMoreExpensive = costForMax > costForOne * maxPossible;
if ( costForOne > 0 )
{
stringForm.append( " (" );
stringForm.append( costForOne );
if ( futureCreationMoreExpensive )
{
stringForm.append( "+" );
}
stringForm.append( " adv)" );
}
stringForm.append( " (" );
stringForm.append( KoLConstants.COMMA_FORMAT.format( icr.getQuantityPossible() ) );
if ( icr.getQuantityPullable() > 0 )
{
stringForm.append( ", " );
stringForm.append( KoLConstants.COMMA_FORMAT.format(
icr.getQuantityPullable() ) );
stringForm.append( " pullable" );
}
stringForm.append( ")" );
if ( icr.getQuantityPossible() == 0 && icr.getQuantityPullable() > 0 )
{
stringForm.insert( 0, "<i>" );
stringForm.append( "</i>" );
isHTML = true;
}
if ( isHTML )
{
stringForm.insert( 0, "<html>" );
stringForm.append( "</html>" );
}
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
public Component getRenderer( final Component defaultComponent, final QueuedConcoction item,
final int listWidth, final boolean isSelected )
{
return this.getRenderer( defaultComponent, item.getConcoction(), listWidth, isSelected, item.getCount() );
}
public Component getRenderer( final Component defaultComponent, final Concoction item,
final int listWidth, final boolean isSelected )
{
return this.getRenderer( defaultComponent, item, listWidth, isSelected, -1 );
}
private Component getRenderer( final Component defaultComponent, final Concoction item,
final int listWidth, final boolean isSelected, int count )
{
StringBuffer stringForm = new StringBuffer();
String name = item.getName();
stringForm.append( "<html><nobr>" );
String color = null;
if ( isSelected )
{
setForeground( UIManager.getColor( "List.selectionForeground" ) );
}
else
{
color = ColorFactory.getConcoctionColor( item );
}
if ( color != null )
{
stringForm.append( "<font color=" );
stringForm.append( color );
stringForm.append( ">" );
}
stringForm.append( "<b>" );
stringForm.append( item.toString() );
boolean pulling;
stringForm.append( " (" );
if ( count > 0 )
{
stringForm.append( count );
pulling = item.queuedPulls != 0;
}
else
{
pulling = this.appendAmount( stringForm, item );
}
stringForm.append( ")" );
stringForm.append( "</b></nobr><br><nobr> " );
switch ( item.getItemId() )
{
case ItemPool.MUNCHIES_PILL:
stringForm.append( "+1-3 adv from next food" );
break;
case ItemPool.SUSHI_DOILY:
stringForm.append( "+3 adv from next sushi (automatically used from inventory)" );
break;
case ItemPool.GRAINS_OF_SALT:
stringForm.append( "+3 adv from next food (automatically used from inventory)" );
break;
case ItemPool.SCRATCHS_FORK:
stringForm.append( "+30% adv/mus/mys/mox from next food, +50% from salad" );
break;
case ItemPool.DIVINE_FLUTE:
stringForm.append( "+(7*adv)+(0-15) MP from next drink" );
break;
case ItemPool.FROSTYS_MUG:
stringForm.append( "+30% adv/mus/mys/mox from next drink, +50% from beer" );
break;
case ItemPool.CRIMBCO_MUG:
stringForm.append( "does something to next drink" );
break;
case ItemPool.BGE_SHOTGLASS:
stringForm.append( "+3 adv from next drink" );
break;
case ItemPool.FUDGE_SPORK:
stringForm.append( "+3 adv from next food, 10 sugar rush" );
break;
case ItemPool.JAR_OF_SWAMP_HONEY:
stringForm.append( "+10-15 mus/mys/mox from next food (automatically used from inventory)" );
break;
case ItemPool.MAYONEX:
stringForm.append( "adv from next food converted to BMC" );
break;
case ItemPool.MAYODIOL:
stringForm.append( "1 full from next food converted to drunk" );
break;
case ItemPool.MAYOSTAT:
stringForm.append( "return some of next food" );
break;
case ItemPool.MAYOZAPINE:
stringForm.append( "x2 stat gain from next food" );
break;
case ItemPool.MAYOFLEX:
stringForm.append( "+1 adv from next food" );
break;
default:
Integer fullness = ConsumablesDatabase.getRawFullness( name );
Integer inebriety = ConsumablesDatabase.getRawInebriety( name );
Integer spleenhit = ConsumablesDatabase.getRawSpleenHit( name );
String spacer = "";
if ( fullness != null )
{
stringForm.append( spacer );
spacer = " ";
stringForm.append( fullness );
stringForm.append( " full" );
}
if ( inebriety != null )
{
stringForm.append( spacer );
spacer = " ";
stringForm.append( inebriety );
stringForm.append( " drunk" );
}
if ( spleenhit != null )
{
stringForm.append( spacer );
spacer = " ";
stringForm.append( spleenhit );
stringForm.append( " spleen" );
}
this.appendRange( stringForm, ConsumablesDatabase.getAdventureRange( name ), "adv" );
if ( Preferences.getBoolean( "showGainsPerUnit" ) )
{
if ( fullness != null && fullness.intValue() > 0 )
{
stringForm.append( " / full" );
}
else if ( inebriety != null && inebriety.intValue() > 0 )
{
stringForm.append( " / drunk" );
}
else if ( spleenhit != null && spleenhit.intValue() > 0 )
{
stringForm.append( " / spleen" );
}
}
this.appendRange( stringForm, ConsumablesDatabase.getMuscleRange( name ), "mus" );
this.appendRange( stringForm, ConsumablesDatabase.getMysticalityRange( name ), "mys" );
this.appendRange( stringForm, ConsumablesDatabase.getMoxieRange( name ), "mox" );
String notes = ConsumablesDatabase.getNotes( name );
if ( notes != null && notes.length() > 0 )
{
stringForm.append( ", " );
stringForm.append( notes );
}
}
if ( color != null )
{
stringForm.append( "</font>" );
}
if ( pulling )
{
stringForm.insert( 6, "<i>" );
stringForm.append( "</i>" );
}
stringForm.append( "</nobr></html>" );
defaultComponent.setFont( KoLGUIConstants.DEFAULT_FONT );
String text = stringForm.toString();
( (JLabel) defaultComponent ).setText( text );
if ( defaultComponent.getPreferredSize().width > listWidth )
{
((JComponent) defaultComponent).setToolTipText( text );
}
else
{
((JComponent) defaultComponent).setToolTipText( null );
}
return defaultComponent;
}
public boolean appendAmount( final StringBuffer stringForm, final Concoction item )
{
if ( item.getItem() != null )
{
boolean turnFreeOnly = Preferences.getBoolean( "showTurnFreeOnly" );
int modified = ( turnFreeOnly ? item.getTurnFreeAvailable() : item.getAvailable() );
int initial = item.getItem().getCount( KoLConstants.inventory );
// hack for clip art summons: if "no-summon" is checked, only show on-hand items
if ( item.getMixingMethod() == CraftingType.CLIPART && Preferences.getBoolean( "showNoSummonOnly" ) )
{
modified = initial;
}
if ( item.price > 0 )
{
stringForm.append( item.price );
stringForm.append( " meat, " );
stringForm.append( initial );
stringForm.append( " current" );
return false;
}
PurchaseRequest purchaseRequest = item.getPurchaseRequest();
if ( purchaseRequest != null )
{
AdventureResult cost = purchaseRequest.getCost();
int count = cost.getCount();
String currency = purchaseRequest.getCurrency( count );
stringForm.append( count );
stringForm.append( " " );
stringForm.append( currency );
stringForm.append( ", " );
stringForm.append( modified );
stringForm.append( " possible, " );
stringForm.append( initial );
stringForm.append( " current" );
return false;
}
stringForm.append( modified );
stringForm.append( " possible, " );
stringForm.append( initial );
stringForm.append( " current" );
int costForOne = item.getAdventuresNeeded( 1, true );
int maxPossible = modified;
int costForMax = item.getAdventuresNeeded( maxPossible, true );
boolean futureCreationMoreExpensive = costForMax > costForOne * maxPossible;
if ( costForOne > 0 )
{
stringForm.append( ", " );
stringForm.append( costForOne );
if ( futureCreationMoreExpensive )
{
stringForm.append( "+" );
}
stringForm.append( " adv" );
}
}
else if ( item.getPrice() > 0 )
{
// The speakeasy doesn't give you a discount.
int price = item.speakeasy ? item.getPrice() : CafeRequest.discountedPrice( item.getPrice() );
stringForm.append( price );
stringForm.append( " meat" );
return false;
}
else if ( item.special )
{
stringForm.append( item.initial );
return false;
}
return item.initial + item.creatable <= 0;
}
protected void appendRange( final StringBuffer stringForm, final double range, final String suffix )
{
String val = ( range == 0.0f ) ? "+0.00" : KoLConstants.ROUNDED_MODIFIER_FORMAT.format( range );
this.appendRange( stringForm, val, suffix );
}
protected void appendRange( final StringBuffer stringForm, final String range, final String suffix )
{
if ( range.equals( "+0.0" ) && !suffix.equals( "adv" ) )
{
return;
}
stringForm.append( ", " );
stringForm.append( range );
stringForm.append( " " );
stringForm.append( suffix );
}
}
public static final DefaultListCellRenderer getEquipmentPowerRenderer()
{
return new EquipmentPowerRenderer();
}
private static class EquipmentPowerRenderer
extends DefaultRenderer
{
public EquipmentPowerRenderer()
{
this.setOpaque( true );
}
@Override
public boolean allowHighlight()
{
return true;
}
@Override
public Component getRenderer( final Component defaultComponent, final AdventureResult ar, final boolean isSelected )
{
if ( !ar.isItem() )
{
return defaultComponent;
}
StringBuilder stringForm = new StringBuilder();
stringForm.append( "<html><nobr>" );
String color = null;
if ( isSelected )
{
setForeground( UIManager.getColor( "List.selectionForeground" ) );
}
else
{
color = ColorFactory.getItemColor( ar );
}
if ( color != null )
{
stringForm.append( "<font color=" );
stringForm.append( color );
stringForm.append( ">" );
}
stringForm.append( ar.getName() );
if ( color != null )
{
stringForm.append( "</font>" );
}
int power = EquipmentDatabase.getPower( ar.getItemId() );
if ( power > 0 )
{
stringForm.append( " (+" );
stringForm.append( power );
stringForm.append( ")" );
}
stringForm.append( " (" );
stringForm.append( KoLConstants.COMMA_FORMAT.format( ar.getCount() ) );
stringForm.append( ")" );
stringForm.append( "</nobr></html>" );
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
@Override
public Component getRenderer( final Component defaultComponent, final CreateItemRequest icr, final boolean isSelected )
{
StringBuilder stringForm = new StringBuilder();
boolean isHTML = false;
stringForm.append( icr.getName() );
int power = EquipmentDatabase.getPower( icr.getItemId() );
if ( power > 0 )
{
stringForm.append( " (+" );
stringForm.append( power );
stringForm.append( ")" );
}
stringForm.append( " (" );
stringForm.append( KoLConstants.COMMA_FORMAT.format( icr.getQuantityPossible() ) );
if ( icr.getQuantityPullable() > 0 )
{
stringForm.append( ", " );
stringForm.append( KoLConstants.COMMA_FORMAT.format(
icr.getQuantityPullable() ) );
stringForm.append( " pullable" );
}
stringForm.append( ")" );
if ( icr.getQuantityPossible() == 0 && icr.getQuantityPullable() > 0 )
{
stringForm.insert( 0, "<i>" );
stringForm.append( "</i>" );
isHTML = true;
}
String color = null;
if ( isSelected )
{
setForeground( UIManager.getColor( "List.selectionForeground" ) );
}
else
{
color = ColorFactory.getCreationColor( icr, true );
}
if ( color != null )
{
stringForm.insert( 0, "<font color=" + color + ">" );
stringForm.append( "</font>" );
isHTML = true;
}
if ( isHTML )
{
stringForm.insert( 0, "<html>" );
stringForm.append( "</html>" );
}
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
}
public static final DefaultListCellRenderer getCreationQueueRenderer()
{
return new CreationQueueRenderer();
}
private static class CreationQueueRenderer
extends DefaultRenderer
{
public CreationQueueRenderer()
{
this.setOpaque( true );
}
@Override
public boolean allowHighlight()
{
return false;
}
}
public static final DefaultListCellRenderer getNameOnlyRenderer()
{
return new NameOnlyRenderer();
}
private static class NameOnlyRenderer
extends DefaultListCellRenderer
{
@Override
public Component getListCellRendererComponent( final JList list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus )
{
return super.getListCellRendererComponent(
list, value instanceof AdventureResult ? ( (AdventureResult) value ).getName() : value, index,
isSelected, cellHasFocus );
}
}
public static final DefaultListCellRenderer getUsableEquipmentRenderer()
{
return new UsableEquipmentRenderer();
}
private static class UsableEquipmentRenderer
extends DefaultListCellRenderer
{
public UsableEquipmentRenderer()
{
this.setOpaque( true );
}
@Override
public Component getListCellRendererComponent( final JList list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus )
{
if ( value == null || !( value instanceof AdventureResult ) )
{
return super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
}
if ( isSelected )
{
GearChangeFrame.showModifiers( value, false );
}
AdventureResult ar = (AdventureResult) value;
int equipmentType = ItemDatabase.getConsumptionType( ar.getItemId() );
int power = EquipmentDatabase.getPower( ar.getItemId() );
String stringForm = null;
if ( equipmentType == KoLConstants.EQUIP_FAMILIAR || ar.equals( EquipmentRequest.UNEQUIP ) )
{
if ( ar.equals( EquipmentRequest.UNEQUIP ) )
{
stringForm = ar.getName();
}
else if ( KoLCharacter.getFamiliar() != null && KoLCharacter.getFamiliar().canEquip( ar ) )
{
stringForm = ar.getName();
}
else
{
stringForm = "<html><font color=gray>" + ar.getName() + "</font></html>";
}
}
else
{
if ( equipmentType == KoLConstants.EQUIP_ACCESSORY )
{
int count;
Modifiers mods = Modifiers.getItemModifiers( ar.getItemId() );
if ( mods != null && mods.getBoolean( Modifiers.SINGLE ) )
{
count = 1;
}
else
{
count = ar.getCount( KoLConstants.inventory );
if ( ar.equals( EquipmentManager.getEquipment( EquipmentManager.ACCESSORY1 ) ) )
{
++count;
}
if ( ar.equals( EquipmentManager.getEquipment( EquipmentManager.ACCESSORY2 ) ) )
{
++count;
}
if ( ar.equals( EquipmentManager.getEquipment( EquipmentManager.ACCESSORY3 ) ) )
{
++count;
}
}
stringForm = ar.getName() + " (" + count + " max)";
}
else if ( power > 0 )
{
stringForm = ar.getName() + " (+" + KoLConstants.COMMA_FORMAT.format( power ) + ")";
}
else
{
stringForm = ar.getName();
}
// Gray out any equipment that the player cannot currently equip
// inside of an equipment filter.
if ( !EquipmentManager.canEquip( ar.getName() ) )
{
stringForm = "<html><font color=gray>" + stringForm + "</font></html>";
}
}
JLabel defaultComponent =
(JLabel) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
defaultComponent.setText( stringForm );
return defaultComponent;
}
}
public static final DefaultListCellRenderer getFamiliarEquipmentRenderer()
{
return new FamiliarEquipmentRenderer();
}
private static class FamiliarEquipmentRenderer
extends UsableEquipmentRenderer
{
@Override
public Component getListCellRendererComponent( final JList list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus )
{
if ( value == null || !( value instanceof AdventureResult ) )
{
return super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
}
if ( isSelected )
{
GearChangeFrame.showModifiers( value, true );
}
AdventureResult ar = (AdventureResult) value;
String effect = Modifiers.getFamiliarEffect( ar.getName() );
if ( effect == null )
{
return super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
}
String stringForm = ar.getName() + " (" + effect + ")";
if ( KoLCharacter.getFamiliar() == null ||
!KoLCharacter.getFamiliar().canEquip( ar ) )
{
stringForm = "<html><font color=gray>" + stringForm + "</font></html>";
}
JLabel defaultComponent =
(JLabel) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
defaultComponent.setText( stringForm );
return defaultComponent;
}
}
public static final DefaultListCellRenderer getFamiliarRenderer()
{
return new FamiliarRenderer();
}
private static class FamiliarRenderer
extends DefaultListCellRenderer
{
public FamiliarRenderer()
{
this.setOpaque( true );
}
@Override
public Component getListCellRendererComponent( final JList list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus )
{
if ( value == null || !( value instanceof FamiliarData ) )
{
return super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
}
if ( isSelected )
{
GearChangeFrame.showModifiers( value, false );
}
return super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
}
}
public static final DefaultListCellRenderer getStorageRenderer()
{
return new StorageRenderer();
}
private static class StorageRenderer
extends DefaultRenderer
{
public StorageRenderer()
{
this.setOpaque( true );
}
@Override
public boolean allowHighlight()
{
return true;
}
@Override
public Component getRenderer( final Component defaultComponent, final AdventureResult ar, final boolean isSelected )
{
if ( !ar.isItem() )
{
return defaultComponent;
}
StringBuffer stringForm = new StringBuffer();
stringForm.append( "<html><nobr>" );
String color = null;
if ( isSelected )
{
setForeground( UIManager.getColor( "List.selectionForeground" ) );
}
else
{
color = ColorFactory.getStorageColor( ar );
}
if ( color != null )
{
stringForm.append( "<font color=" );
stringForm.append( color );
stringForm.append( ">" );
}
String name = ar.getName();
stringForm.append( name );
if ( color != null )
{
stringForm.append( "</font>" );
}
int power = EquipmentDatabase.getPower( ar.getItemId() );
if ( power > 0 )
{
stringForm.append( " (+" );
stringForm.append( power );
stringForm.append( ")" );
}
else
{
Integer fullness = ConsumablesDatabase.getRawFullness( ar.getName() );
Integer inebriety = ConsumablesDatabase.getRawInebriety( ar.getName() );
if ( fullness != null || inebriety != null )
{
stringForm.append( " (" );
if ( fullness != null )
{
stringForm.append( fullness );
}
else //if ( inebriety != null )
{
stringForm.append( inebriety );
}
this.appendRange( stringForm,
ConsumablesDatabase.getAdventureRange( ar.getName() ), "adv" );
if ( Preferences.getBoolean( "showGainsPerUnit" ) )
{
if ( fullness != null && fullness.intValue() > 0 )
{
stringForm.append( "/full" );
}
else if ( inebriety != null && inebriety.intValue() > 0 )
{
stringForm.append( "/drunk" );
}
}
stringForm.append( ")" );
}
}
stringForm.append( " (" );
stringForm.append( KoLConstants.COMMA_FORMAT.format( ar.getCount() ) );
stringForm.append( ")" );
stringForm.append( "</nobr></html>" );
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
}
public static final DefaultListCellRenderer getFreePullsRenderer()
{
return new FreePullsRenderer();
}
private static class FreePullsRenderer
extends DefaultRenderer
{
public FreePullsRenderer()
{
this.setOpaque( true );
}
@Override
public boolean allowHighlight()
{
return true;
}
@Override
public Component getRenderer( final Component defaultComponent, final AdventureResult ar, final boolean isSelected )
{
if ( !ar.isItem() )
{
return defaultComponent;
}
StringBuilder stringForm = new StringBuilder();
stringForm.append( ar.getName() );
stringForm.append( " (" );
stringForm.append( KoLConstants.COMMA_FORMAT.format( ar.getCount() ) );
stringForm.append( ")" );
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
}
public static final DefaultListCellRenderer getPulverizationRenderer()
{
return new PulverizationRenderer();
}
private static class PulverizationRenderer
extends DefaultRenderer
{
public PulverizationRenderer()
{
this.setOpaque( true );
}
@Override
public boolean allowHighlight()
{
return true;
}
@Override
public Component getRenderer( final Component defaultComponent, final AdventureResult ar, final boolean isSelected )
{
if ( !ar.isItem() )
{
return defaultComponent;
}
StringBuilder stringForm = new StringBuilder();
stringForm.append( ar.getName() );
int pulver = EquipmentDatabase.getPulverization( ar.getItemId() );
boolean HTML = false;
if ( pulver > 0 )
{
stringForm.append( " => " );
stringForm.append( ItemDatabase.getItemName( pulver ) );
}
else if ( pulver < -1 )
{
stringForm.append( " => " );
if ( (pulver & EquipmentDatabase.ELEM_TWINKLY) != 0 )
{
stringForm.append( "Tw" );
}
if ( (pulver & EquipmentDatabase.ELEM_HOT) != 0 )
{
stringForm.append( "<font color=red>Ho</font>" );
HTML = true;
}
if ( (pulver & EquipmentDatabase.ELEM_COLD) != 0 )
{
stringForm.append( "<font color=blue>Co</font>" );
HTML = true;
}
if ( (pulver & EquipmentDatabase.ELEM_STENCH) != 0 )
{
stringForm.append( "<font color=green>St</font>" );
HTML = true;
}
if ( (pulver & EquipmentDatabase.ELEM_SPOOKY) != 0 )
{
stringForm.append( "<font color=gray>Sp</font>" );
HTML = true;
}
if ( (pulver & EquipmentDatabase.ELEM_SLEAZE) != 0 )
{
stringForm.append( "<font color=purple>Sl</font>" );
HTML = true;
}
if ( (pulver & EquipmentDatabase.YIELD_1C) != 0 )
{
stringForm.append( "C" );
}
if ( (pulver & EquipmentDatabase.MALUS_UPGRADE ) != 0 )
{
stringForm.append( " upgrade" );
}
else if ( (pulver & EquipmentDatabase.YIELD_3W) != 0 )
{
stringForm.append( " 3W" );
}
else if ( (pulver & EquipmentDatabase.YIELD_1W3N_2W) != 0 )
{
stringForm.append( " 1W+3N or 2W" );
}
else if ( (pulver & EquipmentDatabase.YIELD_4N_1W) != 0 )
{
stringForm.append( " 4N or 1W" );
}
else if ( (pulver & EquipmentDatabase.YIELD_3N) != 0 )
{
stringForm.append( " 3N" );
}
else if ( (pulver & EquipmentDatabase.YIELD_1N3P_2N) != 0 )
{
stringForm.append( " 1N+3P or 2N" );
}
else if ( (pulver & EquipmentDatabase.YIELD_4P_1N) != 0 )
{
stringForm.append( " 4P or 1N" );
}
else if ( (pulver & EquipmentDatabase.YIELD_3P) != 0 )
{
stringForm.append( " 3P" );
}
else if ( (pulver & EquipmentDatabase.YIELD_2P) != 0 )
{
stringForm.append( " 2P" );
}
else if ( (pulver & EquipmentDatabase.YIELD_1P) != 0 )
{
stringForm.append( " 1P" );
}
if ( (pulver & EquipmentDatabase.YIELD_UNCERTAIN) != 0 )
{
stringForm.append( "?" );
}
}
else
{ // this should have been filtered out of the list
stringForm.append( " [NOT PULVERIZABLE]" );
}
stringForm.append( " (" );
stringForm.append( KoLConstants.COMMA_FORMAT.format( ar.getCount() ) );
stringForm.append( ")" );
int index = KoLConstants.pulverizeQueue.indexOf( ar );
if ( index != -1 )
{
stringForm.append( ", " );
stringForm.append(
((AdventureResult)KoLConstants.pulverizeQueue.get( index )).getCount() );
stringForm.append( " queued" );
}
if ( HTML )
{
stringForm.insert( 0, "<html>" );
stringForm.append( "</html>" );
}
( (JLabel) defaultComponent ).setText( stringForm.toString() );
return defaultComponent;
}
}
}