package org.nlamah.QLS.Model.StylesheetBlock;
import java.util.ArrayList;
import java.util.List;
import org.nlamah.QBase.Constants.QBaseQuestionType;
import org.nlamah.QLS.Interfaces.QLSNodeVisitor;
import org.nlamah.QLS.Model.Abstract.QLSNode;
import org.nlamah.QLS.Model.Abstract.SectionItem;
import org.nlamah.QLS.Model.Abstract.StyleDeclaration;
import org.nlamah.QLS.Model.Declaration.ColorDeclaration;
import org.nlamah.QLS.Model.Declaration.FontDeclaration;
import org.nlamah.QLS.Model.Declaration.FontSizeDeclaration;
import org.nlamah.QLS.Model.Declaration.WidgetDeclaration;
import org.nlamah.QLS.Model.Declaration.WidthDeclaration;
public class DefaultBlock extends SectionItem
{
private QBaseQuestionType questionType;
private ColorDeclaration colorDeclaration;
private FontDeclaration fontDeclaration;
private FontSizeDeclaration fontSizeDeclaration;
private WidgetDeclaration widgetDeclaration;
private WidthDeclaration widthDeclaration;
public DefaultBlock(QBaseQuestionType questionType, List<StyleDeclaration> styleDeclarations)
{
assignStyleDeclarations(styleDeclarations);
this.questionType = questionType;
for (StyleDeclaration styleDeclaration : styleDeclarations)
{
styleDeclaration.setParentNode(this);
}
}
private void assignStyleDeclarations(List<StyleDeclaration> styleDeclarations)
{
for (StyleDeclaration styleDeclaration : styleDeclarations)
{
if (styleDeclaration instanceof ColorDeclaration)
{
colorDeclaration = (ColorDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof FontDeclaration)
{
fontDeclaration = (FontDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof FontSizeDeclaration)
{
fontSizeDeclaration = (FontSizeDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof WidgetDeclaration)
{
widgetDeclaration = (WidgetDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof WidthDeclaration)
{
widthDeclaration = (WidthDeclaration) styleDeclaration;
}
else
{
assert(false);
}
}
}
public QBaseQuestionType questionType()
{
return questionType;
}
public List<StyleDeclaration> styleDeclarations()
{
List<StyleDeclaration> styleDeclarationsToReturn = new ArrayList<StyleDeclaration>();
if (colorDeclaration != null)
{
styleDeclarationsToReturn.add(colorDeclaration);
}
if (fontDeclaration != null)
{
styleDeclarationsToReturn.add(fontDeclaration);
}
if (fontSizeDeclaration != null)
{
styleDeclarationsToReturn.add(fontSizeDeclaration);
}
if (widgetDeclaration != null)
{
styleDeclarationsToReturn.add(widgetDeclaration);
}
if (widthDeclaration != null)
{
styleDeclarationsToReturn.add(widthDeclaration);
}
return styleDeclarationsToReturn;
}
public void overWriteStyleDeclaration(StyleDeclaration styleDeclaration)
{
if (styleDeclaration instanceof ColorDeclaration)
{
colorDeclaration = (ColorDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof FontDeclaration)
{
fontDeclaration = (FontDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof FontSizeDeclaration)
{
fontSizeDeclaration = (FontSizeDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof WidgetDeclaration)
{
widgetDeclaration = (WidgetDeclaration) styleDeclaration;
}
else if (styleDeclaration instanceof WidthDeclaration)
{
widthDeclaration = (WidthDeclaration) styleDeclaration;
}
else
{
assert(false);
}
}
public ColorDeclaration colorDeclaration()
{
return colorDeclaration;
}
public FontDeclaration fontDeclaration()
{
return fontDeclaration;
}
public FontSizeDeclaration fontSizeDeclaration()
{
return fontSizeDeclaration;
}
public WidgetDeclaration widgetDeclaration()
{
return widgetDeclaration;
}
public WidthDeclaration widthDeclaration()
{
return widthDeclaration;
}
@Override
public QLSNode accept(QLSNodeVisitor visitor)
{
return visitor.visit(this);
}
@Override
public boolean equals(Object object)
{
if (!(object instanceof DefaultBlock))
{
return false;
}
DefaultBlock value = (DefaultBlock) object;
if (this.questionType != value.questionType)
{
return false;
}
if (!this.styleDeclarations().equals(value.styleDeclarations()))
{
return false;
}
return true;
}
@Override
public int hashCode()
{
return questionType.toString().hashCode();
}
static public List<DefaultBlock> getListWithDuplicatedDefaultBlocksForQuestionType(List<DefaultBlock> defaultBlocks)
{
List<DefaultBlock> referenceList = new ArrayList<DefaultBlock>();
List<DefaultBlock> listToReturn = new ArrayList<DefaultBlock>();
for (DefaultBlock node : defaultBlocks)
{
if (doesListAlreadyContainDefaultBlockWithQuestionType(referenceList, node))
{
listToReturn.add(node);
}
else
{
referenceList.add(node);
}
}
return listToReturn;
}
static private boolean doesListAlreadyContainDefaultBlockWithQuestionType(List<DefaultBlock> defaultBlocks, DefaultBlock defaultBlock)
{
for (DefaultBlock loopedDefaultBlock : defaultBlocks)
{
if (loopedDefaultBlock.questionType == defaultBlock.questionType)
{
return true;
}
}
return false;
}
}