package advancedsystemsmanager.flow.menus;
import advancedsystemsmanager.flow.elements.*;
import advancedsystemsmanager.client.gui.GuiManager;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.reference.Null;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import advancedsystemsmanager.util.SystemCoord;
import java.util.ArrayList;
import java.util.List;
public class ContainerFilter
{
public static final int CHECK_BOX_X = 5;
public static final int CHECK_BOX_FILTER_Y = 5;
public static final int CHECK_BOX_FILTER_SPACING = 12;
public static final int CHECK_BOX_FILTER_INVERT_Y = 55;
public static final int TEXT_BOX_Y_OFFSET = -2;
public static final int RADIO_BUTTON_SPACING = 15;
public static final int CHECK_BOX_POSITION_Y = 5;
public static final int CHECK_BOX_POSITION_SPACING = 20;
public static final int TEXT_BOX_POSITION_X_1 = 25;
public static final int TEXT_BOX_POSITION_X_2 = 50;
public static final int CHECK_BOX_POSITION_INVERT_X = 80;
public static final int CHECK_BOX_DISTANCE_Y = 5;
public static final int CHECK_BOX_DISTANCE_SPACING = 30;
public static final int DISTANCE_SECOND_LINE = 14;
public static final int TEXT_BOX_DISTANCE_X_1 = 15;
public static final int TEXT_BOX_DISTANCE_X_2 = 40;
public static final int CHECK_BOX_DISTANCE_INVERT_X = 65;
public static final int RADIO_BUTTON_X = 5;
public static final int RADIO_BUTTON_Y = 5;
public static final int CHECK_BOX_SELECTION_Y = 40;
public static final int RADIO_BUTTON_SPACING_X = 60;
public static final int RADIO_BUTTON_Y_VARIABLE = 2;
public static final int CHECK_BOX_INVERT_VARIABLE_Y = 12;
public CheckBoxList checkBoxes;
public TextBoxNumberList textBoxes;
public RadioButtonList radioButtonsSelection;
public ScrollController<Variable> scrollControllerVariable;
public List<Long> filterVariableSelection;
public RadioButtonList radioButtonVariable;
public CheckBox invertFilterMatch;
public CheckBox[] useSubFilter;
public CheckBox[] useRange;
public TextBoxPage[] lowerRange;
public TextBoxPage[] higherRange;
public CheckBox[] invertRange;
public CheckBox variableInvert;
public MenuContainer currentMenu;
public ContainerFilter()
{
checkBoxes = new CheckBoxList();
filterVariableSelection = new ArrayList<Long>();
MenuContainer.Page[] subFilterPages = {MenuContainer.Page.POSITION, MenuContainer.Page.DISTANCE, MenuContainer.Page.SELECTION, MenuContainer.Page.VARIABLE};
String[] subFilterLabels = {Names.FILTER_POSITION_LABEL, Names.FILTER_DISTANCE_LABEL, Names.FILTER_SELECTION_LABEL, Names.FILTER_VARIABLE_LABEL};
useSubFilter = new CheckBox[subFilterLabels.length];
for (int i = 0; i < subFilterPages.length; i++)
{
checkBoxes.addCheckBox(useSubFilter[i] = new CheckBoxPage(subFilterLabels[i], MenuContainer.Page.FILTER, CHECK_BOX_X, CHECK_BOX_FILTER_Y + CHECK_BOX_FILTER_SPACING * i));
}
checkBoxes.addCheckBox(invertFilterMatch = new CheckBoxPage(Names.INVERT, MenuContainer.Page.FILTER, CHECK_BOX_X, CHECK_BOX_FILTER_INVERT_Y));
useRange = new CheckBox[5];
lowerRange = new TextBoxPage[useRange.length];
higherRange = new TextBoxPage[useRange.length];
invertRange = new CheckBox[useRange.length];
textBoxes = new TextBoxNumberList();
String[] xyz = {Names.X, Names.Y, Names.Z};
for (int i = 0; i < xyz.length; i++)
{
int y = CHECK_BOX_POSITION_Y + CHECK_BOX_POSITION_SPACING * i;
checkBoxes.addCheckBox(useRange[i] = new CheckBoxPage(xyz[i], MenuContainer.Page.POSITION, CHECK_BOX_X, y));
textBoxes.addTextBox(lowerRange[i] = new TextBoxPage(MenuContainer.Page.POSITION, TEXT_BOX_POSITION_X_1, y + TEXT_BOX_Y_OFFSET, true, -128));
textBoxes.addTextBox(higherRange[i] = new TextBoxPage(MenuContainer.Page.POSITION, TEXT_BOX_POSITION_X_2, y + TEXT_BOX_Y_OFFSET, true, 128));
checkBoxes.addCheckBox(invertRange[i] = new CheckBoxPage(Names.INVERT, MenuContainer.Page.POSITION, CHECK_BOX_POSITION_INVERT_X, y));
}
String[] distance = {Names.CABLE_DISTANCE, Names.DISTANCE};
for (int i = 0; i < distance.length; i++)
{
int y = CHECK_BOX_DISTANCE_Y + CHECK_BOX_DISTANCE_SPACING * i;
checkBoxes.addCheckBox(useRange[i + 3] = new CheckBoxPage(distance[i], MenuContainer.Page.DISTANCE, CHECK_BOX_X, y));
y += DISTANCE_SECOND_LINE;
textBoxes.addTextBox(lowerRange[i + 3] = new TextBoxPage(MenuContainer.Page.DISTANCE, TEXT_BOX_DISTANCE_X_1, y + TEXT_BOX_Y_OFFSET, false, 0));
textBoxes.addTextBox(higherRange[i + 3] = new TextBoxPage(MenuContainer.Page.DISTANCE, TEXT_BOX_DISTANCE_X_2, y + TEXT_BOX_Y_OFFSET, false, 128));
checkBoxes.addCheckBox(invertRange[i + 3] = new CheckBoxPage(Names.INVERT, MenuContainer.Page.DISTANCE, CHECK_BOX_DISTANCE_INVERT_X, y));
}
radioButtonsSelection = new RadioButtonList(Null.NULL_PACKET);
String[] selection = {Names.ONLY_SELECTED, Names.HIDE_SELECTED};
for (int i = 0; i < selection.length; i++)
{
radioButtonsSelection.add(new RadioButton(RADIO_BUTTON_X, RADIO_BUTTON_Y + RADIO_BUTTON_SPACING * i, selection[i]));
}
//checkBoxes.addCheckBox(new CheckBoxPage(Localization.RELOAD_ON_CHANGE, ComponentMenuContainer.Page.SELECTION, CHECK_BOX_X, CHECK_BOX_SELECTION_Y));
scrollControllerVariable = new ScrollController<Variable>(Null.NULL_PACKET, false)
{
@Override
public List<Variable> updateSearch(String search, boolean all)
{
if (currentMenu == null)
{
return new ArrayList<Variable>();
}
return new ArrayList<Variable>(currentMenu.getFilterVariables());
}
@Override
public void onClick(Variable variable, int mX, int mY, int button)
{
if (filterVariableSelection.contains(variable.getId()))
{
filterVariableSelection.remove(variable.getId());
} else
{
filterVariableSelection.add(variable.getId());
}
}
@Override
public void draw(GuiManager gui, Variable variable, int x, int y, boolean hover)
{
currentMenu.drawContainer(gui, variable, filterVariableSelection, x, y, hover);
}
@Override
public void drawMouseOver(GuiManager gui, Variable variable, int mX, int mY)
{
gui.drawMouseOver(currentMenu.getMouseOverForContainer(variable, filterVariableSelection), mX, mY);
}
};
radioButtonVariable = new RadioButtonList(Null.NULL_PACKET);
String[] varOptions = {Names.USE_UNUSED, Names.USE_FILTER};
for (int i = 0; i < varOptions.length; i++)
{
radioButtonVariable.add(new RadioButton(RADIO_BUTTON_X + RADIO_BUTTON_SPACING_X * i, RADIO_BUTTON_Y_VARIABLE, varOptions[i]));
}
checkBoxes.addCheckBox(variableInvert = new CheckBoxPage(Names.INVERT, MenuContainer.Page.VARIABLE, CHECK_BOX_X, CHECK_BOX_INVERT_VARIABLE_Y)
{
@Override
public boolean isVisible()
{
return super.isVisible() && isVariableListVisible();
}
});
}
public boolean isVariableListVisible()
{
return radioButtonVariable.getSelectedOption() == 1;
}
public boolean matches(TileEntityManager manager, List<Long> selectedInventories, SystemCoord block)
{
boolean filterMatch = true;
for (int i = 0; i < useSubFilter.length; i++)
{
if (filterMatch && useSubFilter[i].getValue())
{
int rangeStart = 0, rangeEnd = 2;
switch (i)
{
case 1:
rangeStart = 3;
rangeEnd = 4;
//fall through (i.e. no break)
case 0:
for (int j = rangeStart; j <= rangeEnd; j++)
{
if (useRange[j].getValue())
{
int value = 0;
switch (j)
{
case 0:
value = block.getTileEntity().xCoord - manager.xCoord;
break;
case 1:
value = block.getTileEntity().yCoord - manager.yCoord;
break;
case 2:
value = block.getTileEntity().zCoord - manager.zCoord;
break;
case 3:
value = block.getDepth();
break;
case 4:
value = block.getDistance(manager);
}
boolean isRangeValid = lowerRange[j].getNumber() <= value && value <= higherRange[j].getNumber();
//sub filter isn't matching
if (isRangeValid == invertRange[j].getValue())
{
filterMatch = false;
break;
}
}
}
break;
case 2:
boolean onlySelected = radioButtonsSelection.getSelectedOption() == 0;
boolean selected = selectedInventories.contains(block.getId());
//sub filter isn't matching
if (selected != onlySelected)
{
filterMatch = false;
}
break;
case 3:
if (radioButtonVariable.getSelectedOption() == 0)
{
for (Variable variable : manager.getVariables())
{
if (block.isPartOfVariable(variable))
{
//sub filter isn't matching
filterMatch = false;
break;
}
}
} else
{
boolean variableMatch = false;
for (Variable variable : manager.getVariables())
{
if (filterVariableSelection.contains(variable.getId()) && block.isPartOfVariable(variable))
{
//sub filter isn't matching
variableMatch = true;
break;
}
}
if (variableMatch == variableInvert.getValue())
{
//sub filter isn't matching
filterMatch = false;
}
}
break;
}
}
}
//filter matches
return filterMatch != invertFilterMatch.getValue();
}
public void clear()
{
for (CheckBox checkBox : useSubFilter)
{
checkBox.setValue(false);
}
invertFilterMatch.setValue(false);
for (CheckBox checkBox : useRange)
{
checkBox.setValue(false);
}
for (CheckBox checkBox : invertRange)
{
checkBox.setValue(false);
}
for (TextBoxPage textBoxPage : lowerRange)
{
textBoxPage.resetDefault();
}
for (TextBoxPage textBoxPage : higherRange)
{
textBoxPage.resetDefault();
}
radioButtonsSelection.setSelectedOption(0);
radioButtonVariable.setSelectedOption(0);
filterVariableSelection.clear();
variableInvert.setValue(false);
}
public class CheckBoxPage extends CheckBox
{
public MenuContainer.Page page;
public CheckBoxPage(String name, MenuContainer.Page page, int x, int y)
{
super(Null.NULL_PACKET, name, x, y);
this.page = page;
}
@Override
public void setValue(boolean val)
{
this.checked = val;
}
@Override
public boolean isVisible()
{
return currentMenu.getCurrentPage() == page;
}
@Override
public void onUpdate()
{
}
}
public class TextBoxPage extends TextBoxNumber
{
public MenuContainer.Page page;
public boolean negative;
public int defaultNumber;
public TextBoxPage(MenuContainer.Page page, int x, int y, boolean negative, int defaultNumber)
{
super(Null.NULL_PACKET, x, y, 3, false);
this.page = page;
this.negative = negative;
this.defaultNumber = defaultNumber;
resetDefault();
}
public void resetDefault()
{
setNumber(defaultNumber);
}
@Override
public int getMaxNumber()
{
return 128;
}
@Override
public int getMinNumber()
{
return negative ? -128 : super.getMinNumber();
}
@Override
public boolean isVisible()
{
return page == currentMenu.getCurrentPage();
}
@Override
public float getTextSize()
{
return negative ? 0.7F : super.getTextSize();
}
@Override
public int getTextY()
{
return negative ? 4 : super.getTextY();
}
@Override
public void onUpdate()
{
}
}
}