/**
*
*/
package de.urszeidler.shr5.ecp.printer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.emf.common.util.EList;
import org.eclipse.nebula.paperclips.core.BreakPrint;
import org.eclipse.nebula.paperclips.core.EmptyPrint;
import org.eclipse.nebula.paperclips.core.ImagePrint;
import org.eclipse.nebula.paperclips.core.LinePrint;
import org.eclipse.nebula.paperclips.core.NoBreakPrint;
import org.eclipse.nebula.paperclips.core.Print;
import org.eclipse.nebula.paperclips.core.grid.DefaultGridLook;
import org.eclipse.nebula.paperclips.core.grid.GridPrint;
import org.eclipse.nebula.paperclips.core.text.TextPrint;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import de.urszeidler.eclipse.shr5.AbstraktPersona;
import de.urszeidler.eclipse.shr5.Beschreibbar;
import de.urszeidler.eclipse.shr5.KoerperPersona;
import de.urszeidler.eclipse.shr5.runtime.GruntTeam;
import de.urszeidler.eclipse.shr5.runtime.RuntimeCharacter;
import de.urszeidler.eclipse.shr5.runtime.Team;
import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil;
import de.urszeidler.eclipse.shr5Management.ManagedCharacter;
import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools;
import de.urszeidler.shr5.scripting.Placement;
import de.urszeidler.shr5.scripting.Script;
import de.urszeidler.shr5.scripting.ScriptingPackage;
import de.urszeidler.shr5.scripting.Section;
/**
* @author urs
*/
public class ScriptPrinter extends PersonaPrinter {
private static ScriptPrinter instance;
/**
* The singleton instance access.
*
* @return
*/
public static ScriptPrinter getInstance() {
if (instance == null)
instance = new ScriptPrinter();
return instance;
}
public ScriptPrinter() {
super();
initalizePrinter();
}
/**
* Returns the factory to create a new print of the character.
*
* @param c
* @return
*/
public PrintFactory createPrintFactory(final Script c) {
return new PrintFactory() {
private Script script = c;
@Override
public Print createPrinter() {
return createPagePrint(printScriptSheet(script));
}
@Override
public String getPrintTitel() {
return Messages.PersonaPrinter_Character_sheet + c.getName();
}
};
}
protected Print printScriptSheet(Script script) {
DefaultGridLook look = new DefaultGridLook(0, 0);
look.setHeaderGap(0);
GridPrint grid = new GridPrint("d:g", look);//$NON-NLS-1$
grid.add(printDescription(script));
grid.add(new EmptyPrint(5, 20));
for (Placement placement : script.getPlacements()) {
grid.add(new TextPrint(toSimpleName(placement)));
}
grid.add(new BreakPrint(), GridPrint.REMAINDER);
for (Placement placement : script.getPlacements()) {
grid.add(new NoBreakPrint(printPlacement(placement)));
}
grid.add(new BreakPrint(), GridPrint.REMAINDER);
grid.add(new TextPrint("Appendix enemy groups:", headFontData));
for (Team team : script.getAllTeams()) {
grid.add(new TextPrint(toSimpleName(team), attributeFont));
if (team instanceof GruntTeam) {
GruntTeam gt = (GruntTeam)team;
grid.add(printGruntGroupSheet(gt.getGruntGroup()));
} else
grid.add(printTeamDetail(team));
}
return grid;
}
private Print printPlacement(Placement placement) {
DefaultGridLook look = new DefaultGridLook(0, 0);
look.setHeaderGap(0);
GridPrint grid = new GridPrint("d:g", look);//$NON-NLS-1$
grid.add(printDescription(placement));
grid.add(new EmptyPrint(5, 20));
grid.add(createBandPrint(new TextPrint("Time"), new TextPrint(formatDate(placement.getStartDate())),
new TextPrint(formatDate(placement.getStartDate()))));
if (placement.getInTheirFace()!=null &&!placement.getInTheirFace().isEmpty()) {
grid.add(new TextPrint(ShadowrunEditingTools.toFeatureName(placement, ScriptingPackage.Literals.PLACEMENT__IN_THEIR_FACE), headFontData));
grid.add(new TextPrint(printString(placement.getInTheirFace())));
grid.add(new EmptyPrint(5, 25));
}
if (placement.getBackground()!=null && !placement.getBackground().isEmpty()) {
grid.add(new TextPrint(ShadowrunEditingTools.toFeatureName(placement, ScriptingPackage.Literals.PLACEMENT__BACKGROUND), headFontData));
grid.add(new TextPrint(printString(placement.getBackground())));
grid.add(new EmptyPrint(5, 25));
}
if (placement.getDebugging()!=null &&!placement.getDebugging().isEmpty()) {
grid.add(new TextPrint(ShadowrunEditingTools.toFeatureName(placement, ScriptingPackage.Literals.PLACEMENT__DEBUGGING), headFontData));
grid.add(new TextPrint(printString(placement.getDebugging())));
grid.add(new EmptyPrint(5, 25));
}
for (Section sec : placement.getSections()) {
grid.add(new TextPrint(sec.getTitel(), headFontData));
grid.add(new TextPrint(printString(sec.getText())));
grid.add(new EmptyPrint(5, 25));
}
EList<Placement> nextPlacements = placement.getNextPlacements();
if (!nextPlacements.isEmpty()) {
grid.add(new TextPrint(ShadowrunEditingTools.toFeatureName(placement, ScriptingPackage.Literals.PLACEMENT__NEXT_PLACEMENTS),
tableHeaderFontData));
for (Placement placement2 : nextPlacements) {
grid.add(new TextPrint(toSimpleName(placement2), attributeFont));
}
grid.add(new EmptyPrint(5, 5));
}
EList<Team> teams = placement.getTeams();
if (!teams.isEmpty()) {
grid.add(new TextPrint(ShadowrunEditingTools.toFeatureName(placement, ScriptingPackage.Literals.PLACEMENT__TEAMS), tableHeaderFontData));
for (Team team : teams) {
grid.add(new TextPrint(toSimpleName(team), attributeFont));
}
}
grid.add(new EmptyPrint(5, 30));
return grid;
}
private String formatDate(Date date) {
if(date==null)
return "";
return SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.LONG).format(date);
}
private Print printTeamDetail(Team team) {
DefaultGridLook look = new DefaultGridLook(0, 0);
look.setHeaderGap(0);
GridPrint grid = new GridPrint("d,d:g", look);//$NON-NLS-1$
EList<RuntimeCharacter> members = team.getMembers();
HashMap<ManagedCharacter, AtomicInteger> list = new HashMap<ManagedCharacter, AtomicInteger>();
for (RuntimeCharacter runtimeCharacter : members) {
ManagedCharacter character = runtimeCharacter.getCharacter();
if (list.get(character) == null) {
list.put(character, new AtomicInteger());
}
list.get(character).incrementAndGet();
}
for (ManagedCharacter managedCharacter : list.keySet()) {
grid.add(printNpcSheet(managedCharacter, list.get(managedCharacter).intValue()));
}
return grid;
}
private Print printNpcSheet(ManagedCharacter managedCharacter, int intValue) {
DefaultGridLook look = new DefaultGridLook(10, 0);
look.setHeaderGap(0);
GridPrint grid = new GridPrint("d,d:g,d,d,d:g", look);//$NON-NLS-1$
int zustandKoerperlichMax = 8;
AbstraktPersona persona = managedCharacter.getPersona();
if (persona instanceof KoerperPersona) {
KoerperPersona kp = (KoerperPersona)persona;
zustandKoerperlichMax = kp.getZustandKoerperlichMax();
}
grid.add(printPersonaAttributes(persona), 2);
for (int i = 0; i < intValue; i++) {
grid.add(SWT.LEFT, SWT.TOP, printConditionMonitor(persona.getName() + ONE_SPACE + (i + 1), zustandKoerperlichMax));
}
grid.add(new EmptyPrint(), GridPrint.REMAINDER);
grid.add(printPersonaWeaponsDetailList(managedCharacter), 5);
grid.add(new LinePrint(SWT.HORIZONTAL), GridPrint.REMAINDER);
DefaultGridLook look1 = new DefaultGridLook(5, 5);
look.setHeaderGap(0);
GridPrint grid1 = new GridPrint("d,d,d", look1);//$NON-NLS-1$
grid1.add(printPersonaCombatAttributes(persona));
grid1.add(printPersonaSkills(persona));
grid1.add(printGegenstandList(managedCharacter.getInventar(), Messages.Printer_Items));
grid.add(grid1, GridPrint.REMAINDER);
return grid;
}
/**
* @param script
* @return
*/
private Print printDescription(Beschreibbar script) {
DefaultGridLook look = new DefaultGridLook(5, 5);
look.setHeaderGap(5);
GridPrint grid = new GridPrint("d:g,d", look);//$NON-NLS-1$
GridPrint innerGrid = new GridPrint("d:g", look);//$NON-NLS-1$
grid.add(innerGrid);
Image imageScaledBy = AdapterFactoryUtil.getInstance().getImageScaledBy(BIG_SCALE, script.getImage());
if (imageScaledBy != null) {
grid.add(SWT.RIGHT, SWT.TOP, new ImagePrint(imageScaledBy.getImageData()));
}
// grid.add(new LinePrint(), GridPrint.REMAINDER);
innerGrid.add(new TextPrint(toSimpleName(script), head1));
innerGrid.add(new TextPrint(printString(script.getBeschreibung())), GridPrint.REMAINDER);
return grid;
}
}